docs(sdlc): record real test results, open defects ISS-029–032, conditional acceptance
This commit is contained in:
@@ -4,6 +4,7 @@ import { P, CRS, CODE, PROJECT_TH, COMPANY_TH, ORGANIZER, ORGANIZER_PM, RECORDER
|
||||
import { TASKS, taskById, CORRECTIONS, CHANGE_CRITERIA, CHANGE_REVIEW, LESSONS, PERIODS, MEETINGS } from './history.mjs';
|
||||
import { bud, thLong, thShort, thRange, thRangeLong, table, bullets, daysBetween } from './lib.mjs';
|
||||
import { workProduct, head } from './format.mjs';
|
||||
import { TEST_CASES, resultCounts, crStatus } from './engineering.mjs';
|
||||
|
||||
const ids = (arr) => arr.map((i) => P[i].id).join(', ');
|
||||
const dir3 = '1-PM Process (10 Work Product)/3.Progress Status Record';
|
||||
@@ -20,7 +21,9 @@ export function progressStatusRecords() {
|
||||
// detail, owner and status.
|
||||
const issues = issueIds.map((iid, n) => {
|
||||
const c = CORRECTIONS.find((x) => x[0] === iid);
|
||||
return [n + 1, `${c[0]} : ${c[4]}`, `${c[5]} จึงดำเนินการ${c[6]} แล้วเสร็จ ${thShort(c[2])}`, P[c[7]].id, 'เสร็จสิ้น'];
|
||||
return c[2]
|
||||
? [n + 1, `${c[0]} : ${c[4]}`, `${c[5]} จึงดำเนินการ${c[6]} แล้วเสร็จ ${thShort(c[2])}`, P[c[7]].id, 'เสร็จสิ้น']
|
||||
: [n + 1, `${c[0]} : ${c[4]}`, `${c[5]} แนวทางแก้ไข: ${c[6]}`, P[c[7]].id, 'คงค้าง'];
|
||||
});
|
||||
if (changeIds.length) throw new Error(`Progress record ${date} lists change requests, but the project has none.`);
|
||||
const changes = [];
|
||||
@@ -60,7 +63,8 @@ export function progressStatusRecords() {
|
||||
/** 4. Correction Register — all issues found during the project. */
|
||||
export function correctionRegister() {
|
||||
const date = '2026-08-17';
|
||||
const rows = CORRECTIONS.map((c, i) => [i + 1, c[0], thShort(c[1]), c[4], c[5], c[6], P[c[7]].id, thShort(c[2]), 'เสร็จสิ้น']);
|
||||
const rows = CORRECTIONS.map((c, i) => [i + 1, c[0], thShort(c[1]), c[4], c[5], c[6], P[c[7]].id, c[2] ? thShort(c[2]) : '-', c[2] ? 'เสร็จสิ้น' : 'คงค้าง']);
|
||||
const open = CORRECTIONS.filter((c) => !c[2]);
|
||||
const bySev = (s) => CORRECTIONS.filter((c) => c[3] === s).length;
|
||||
return {
|
||||
dir: '1-PM Process (10 Work Product)/4.Correction Register',
|
||||
@@ -82,16 +86,16 @@ export function correctionRegister() {
|
||||
['ระดับความรุนแรงสูง', bySev('สูง')],
|
||||
['ระดับความรุนแรงกลาง', bySev('กลาง')],
|
||||
['ระดับความรุนแรงต่ำ', bySev('ต่ำ')],
|
||||
['แก้ไขแล้วเสร็จและตรวจสอบผลแล้ว', CORRECTIONS.length],
|
||||
['คงค้าง', 0],
|
||||
['แก้ไขแล้วเสร็จและตรวจสอบผลแล้ว', CORRECTIONS.length - open.length],
|
||||
['คงค้าง', open.length],
|
||||
], ['', 'r']),
|
||||
`ปัญหาทุกรายการได้รับการแก้ไขและตรวจสอบผลด้วย Test Case ที่เกี่ยวข้อง โดยผลการทดสอบผ่านทั้งหมดในรอบทดสอบระหว่าง ${thRangeLong(TEST_FROM, TEST_TO)} ไม่มีข้อบกพร่องระดับวิกฤตคงค้าง ณ วันตรวจรับ`,
|
||||
`ปัญหาที่พบระหว่างพัฒนา ${CORRECTIONS.length - open.length} รายการได้รับการแก้ไขและตรวจสอบผลแล้ว รอบทดสอบระหว่าง ${thRangeLong(TEST_FROM, TEST_TO)} พบข้อบกพร่องระดับสูงคงค้าง ${open.length} รายการ (${open.map((c) => c[0]).join(', ')}) ซึ่งต้องแจ้งผู้รับมอบและกำหนดการแก้ไขก่อนตรวจรับ`,
|
||||
'## บทเรียนและแนวทางป้องกันสำหรับโครงการถัดไป (Lessons Learned)',
|
||||
'เมื่อปิดโครงการ ทีมงานทบทวนปัญหาทั้งหมดในทะเบียนนี้ จัดกลุ่มตามสาเหตุ และกำหนดแนวทางป้องกันเพื่อไม่ให้ปัญหาลักษณะเดียวกันเกิดซ้ำในโครงการถัดไป',
|
||||
table(['ลำดับ', 'กลุ่มปัญหา', 'เลขที่ปัญหา', 'จำนวน', 'สิ่งที่เกิดขึ้น', 'แนวทางป้องกัน (Preventive Action)'],
|
||||
LESSONS.map(([theme, issueIds, what, action], i) => [i + 1, theme, issueIds.join(', '), issueIds.length, what, action]), ['c', '', '', 'r', '', '']),
|
||||
'## การเชื่อมโยงกับหลักฐานการทดสอบ',
|
||||
table(['เลขที่', 'การแก้ไขอ้างอิง (Commit)', 'Test Case ที่ใช้ตรวจสอบ', 'ผลการทดสอบ'], CORRECTIONS.map((c) => [c[0], `\`${c[8]}\``, c[9], 'Passed']), ['c', '', 'c', 'c']),
|
||||
table(['เลขที่', 'การแก้ไขอ้างอิง (Commit)', 'Test Case ที่ใช้ตรวจสอบ', 'ผลการทดสอบ'], CORRECTIONS.map((c) => [c[0], c[8] ? `\`${c[8]}\`` : '-', c[9], c[2] ? 'Passed' : 'Failed (คงค้าง)']), ['c', '', 'c', 'c']),
|
||||
].join('\n\n'),
|
||||
secretary: P.YaB, reviewer: P.ApS, approver: P.SeV,
|
||||
}),
|
||||
@@ -100,6 +104,10 @@ export function correctionRegister() {
|
||||
|
||||
/** 5. Acceptance Report — the sign-off record. */
|
||||
export function acceptanceReport() {
|
||||
const open = CORRECTIONS.filter((c) => !c[2]);
|
||||
const count = resultCounts();
|
||||
const failedCrs = CRS.filter(([id]) => crStatus(id, ACCEPT_DATE) === 'Failed');
|
||||
const untestedCrs = CRS.filter(([id]) => crStatus(id, ACCEPT_DATE) === 'Not tested');
|
||||
return {
|
||||
dir: '1-PM Process (10 Work Product)/5.Acceptance Report',
|
||||
name: `${CODE} Acceptance Report ${bud(ACCEPT_DATE)} V1.0 ApS`,
|
||||
@@ -115,26 +123,27 @@ export function acceptanceReport() {
|
||||
body: [
|
||||
'## รายการสิ่งส่งมอบ (Work Products)',
|
||||
table(['ลำดับ', 'รหัส', 'สิ่งส่งมอบ (Work Product)', 'รายละเอียด', 'ผลการตรวจรับ (Accepted / Not Accepted)'],
|
||||
WPS.map((w, i) => [i + 1, w[0], w[1], w[0] === 'WP 9.0' ? `${w[2]} (Git baseline \`${BASELINE_COMMIT}\`)` : w[2], 'Accepted']), ['c', 'c', '', '', 'c']),
|
||||
WPS.map((w, i) => [i + 1, w[0], w[1], w[0] === 'WP 9.0' ? `${w[2]} (Git baseline \`${BASELINE_COMMIT}\`)` : w[2], w[0] === 'WP 9.0' ? 'Accepted (มีเงื่อนไข)' : 'Accepted']), ['c', 'c', '', '', 'c']),
|
||||
'## ผลการตรวจสอบตามเกณฑ์การตรวจรับ',
|
||||
table(['ลำดับ', 'เกณฑ์การตรวจรับ', 'หลักฐานอ้างอิง', 'ผลการตรวจสอบ'], [
|
||||
[1, 'ฟังก์ชันในขอบเขตทำงานตรงตาม Customer Requirements ครบทุกรายการ', 'Traceability Record, Test Report', 'ผ่าน'],
|
||||
[2, 'ทดสอบระบบตาม Test Case ครบถ้วน', `Test Report 45 Test Case ผ่านทั้งหมด (${thRangeLong(TEST_FROM, TEST_TO)})`, 'ผ่าน'],
|
||||
[3, 'ทดสอบการยอมรับโดยผู้ใช้ (UAT)', `Validation Results ครบ 14 หมวดความต้องการ (${CRS.length} รายการ) ผ่านทั้งหมด`, 'ผ่าน'],
|
||||
[4, 'ไม่มีข้อบกพร่องระดับวิกฤตคงค้าง', `Correction Register ${CORRECTIONS.length} รายการ แก้ไขและตรวจสอบครบ`, 'ผ่าน'],
|
||||
[1, 'ฟังก์ชันในขอบเขตทำงานตรงตาม Customer Requirements ครบทุกรายการ', `Traceability Record Table, Validation Results: ไม่ผ่าน ${failedCrs.length} รายการ ยังไม่ได้ทดสอบ ${untestedCrs.length} รายการ`, 'ไม่ผ่าน (มีเงื่อนไข)'],
|
||||
[2, 'ทดสอบระบบตาม Test Case ครบถ้วน', `Test Report ผ่าน ${count.Passed} ไม่ผ่าน ${count.Failed} ยังไม่ได้ทดสอบ ${count['Not tested']} จาก ${TEST_CASES.length} Test Case (${thRangeLong(TEST_FROM, TEST_TO)})`, 'ไม่ผ่าน (มีเงื่อนไข)'],
|
||||
[3, 'ทดสอบการยอมรับโดยผู้ใช้ (UAT)', `Validation Results ทดสอบครบ ${CRS.length} รายการ ผลตามข้อ 1`, 'ไม่ผ่าน (มีเงื่อนไข)'],
|
||||
[4, 'ไม่มีข้อบกพร่องระดับวิกฤตคงค้าง', `Correction Register ข้อบกพร่องระดับสูงคงค้าง ${open.map((c) => c[0]).join(', ')}`, 'ไม่ผ่าน (มีเงื่อนไข)'],
|
||||
[5, 'เอกสารคู่มือผู้ใช้ ผู้ดูแลระบบ และการบำรุงรักษาครบถ้วน', 'Software User Document, Product Operation Guide, Maintenance Document', 'ผ่าน'],
|
||||
[6, 'Source Code และเอกสารจัดเก็บใน Repository พร้อมชุดสำรอง', 'Project Repository, Project Repository (Backup)', 'ผ่าน'],
|
||||
[7, 'ผลการตรวจสอบ Work Products (Verification)', 'Verification Results รอบที่ 4', 'ผ่าน'],
|
||||
[7, 'ผลการตรวจสอบ Work Products (Verification)', 'Verification Results รอบที่ 4: ไม่ผ่าน 2 รายการ (ผลการทดสอบ และชุดติดตั้ง Docker)', 'ไม่ผ่าน (มีเงื่อนไข)'],
|
||||
], ['c', '', '', 'c']),
|
||||
'## สรุปผลการตรวจรับ',
|
||||
table(['รายการ', 'ผลสรุป'], [
|
||||
['จำนวนสิ่งส่งมอบทั้งหมด', `${WPS.length} รายการ`],
|
||||
['ตรวจรับแล้ว (Accepted)', `${WPS.length} รายการ`],
|
||||
['ตรวจรับแล้ว (Accepted)', `${WPS.length - 1} รายการ`],
|
||||
['ตรวจรับแบบมีเงื่อนไข', '1 รายการ (WP 9.0 Software)'],
|
||||
['ไม่ผ่านการตรวจรับ (Not Accepted)', '0 รายการ'],
|
||||
['ข้อบกพร่องคงค้าง', 'ไม่มี'],
|
||||
['ผลการตรวจรับโดยรวม', '**Accepted** — ตรวจรับส่งมอบระบบครบถ้วน'],
|
||||
['ข้อบกพร่องคงค้าง', `${open.length} รายการ (${open.map((c) => c[0]).join(', ')})`],
|
||||
['ผลการตรวจรับโดยรวม', '**Accepted with conditions** — ตรวจรับพร้อมเงื่อนไขแก้ไขข้อบกพร่องคงค้าง'],
|
||||
]),
|
||||
`ผู้รับมอบได้ตรวจสอบสิ่งส่งมอบทั้งหมดตามเกณฑ์การตรวจรับที่กำหนดในเอกสาร Statement of Work และ Software Project Plan แล้วเห็นว่าครบถ้วนถูกต้อง จึงมีมติตรวจรับส่งมอบระบบเมื่อวันที่ ${thLong(ACCEPT_DATE)} โดยงานอบรมผู้ใช้งานและการปิดงานควบคุมปฏิบัติการจะดำเนินการให้แล้วเสร็จภายในวันที่ ${thLong(END)} ตามแผนปิดโครงการ`,
|
||||
`ผู้รับมอบได้ตรวจสอบสิ่งส่งมอบทั้งหมดตามเกณฑ์การตรวจรับในเอกสาร Statement of Work และ Software Project Plan แล้ว รับทราบว่ามีข้อบกพร่องระดับสูงคงค้าง ${open.length} รายการ และชุดติดตั้ง Docker ที่ยังไม่ได้ทดสอบ จึงมีมติตรวจรับส่งมอบระบบแบบมีเงื่อนไขเมื่อวันที่ ${thLong(ACCEPT_DATE)} โดยเงื่อนไขคือ (1) แก้ไข ${open.map((c) => c[0]).join(', ')} และทดสอบซ้ำภายใต้การบำรุงรักษาแบบแก้ไข (Corrective) ตาม Maintenance Document และ (2) ทดสอบ TC-UN13.002 และ TC-UN13.003 บน Baseline ก่อนใช้ชุดติดตั้ง Docker ในสภาพแวดล้อมใช้งานจริง`,
|
||||
].join('\n\n'),
|
||||
secretary: P.ApS, reviewer: P.YaB, approver: P.SeV,
|
||||
}),
|
||||
|
||||
Reference in New Issue
Block a user