build(sdlc): seed data, figures and rendered package for 23/09 feedback
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
// PM work products 3–10: Progress Status Record, Correction Register, Acceptance Report,
|
||||
// Change Report, Meeting Record, Software Configuration, Project Repository (+ Backup).
|
||||
import { P, CODE, PROJECT_TH, COMPANY_TH, ORGANIZER, ORGANIZER_PM, RECORDER, START, END, WPS, TEAM, ORIGIN, BACKUP, TAG, BASELINE_COMMIT, TEST_FROM, TEST_TO, ACCEPT_DATE, OPS_CLOSE_DATE } from './project.mjs';
|
||||
import { TASKS, taskById, CORRECTIONS, CHANGES, PERIODS, MEETINGS } from './history.mjs';
|
||||
import { P, CRS, CODE, PROJECT_TH, COMPANY_TH, ORGANIZER, ORGANIZER_PM, RECORDER, START, END, WPS, TEAM, ORIGIN, BACKUP, TAG, BASELINE_COMMIT, TEST_FROM, TEST_TO, ACCEPT_DATE, OPS_CLOSE_DATE } from './project.mjs';
|
||||
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';
|
||||
|
||||
@@ -22,10 +22,8 @@ export function progressStatusRecords() {
|
||||
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, 'เสร็จสิ้น'];
|
||||
});
|
||||
const changes = changeIds.map((cid) => {
|
||||
const c = CHANGES.find((x) => x.id === cid);
|
||||
return [c.id, c.titleTh, 'อนุมัติ', c.impact[0][1]];
|
||||
});
|
||||
if (changeIds.length) throw new Error(`Progress record ${date} lists change requests, but the project has none.`);
|
||||
const changes = [];
|
||||
return {
|
||||
dir: dir3,
|
||||
name: `${CODE} Progress Status Record ${bud(date)} V1.0 ApS`,
|
||||
@@ -88,6 +86,10 @@ export function correctionRegister() {
|
||||
['คงค้าง', 0],
|
||||
], ['', 'r']),
|
||||
`ปัญหาทุกรายการได้รับการแก้ไขและตรวจสอบผลด้วย Test Case ที่เกี่ยวข้อง โดยผลการทดสอบผ่านทั้งหมดในรอบทดสอบระหว่าง ${thRangeLong(TEST_FROM, TEST_TO)} ไม่มีข้อบกพร่องระดับวิกฤตคงค้าง ณ วันตรวจรับ`,
|
||||
'## บทเรียนและแนวทางป้องกันสำหรับโครงการถัดไป (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']),
|
||||
].join('\n\n'),
|
||||
@@ -118,7 +120,7 @@ export function acceptanceReport() {
|
||||
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 12 สถานการณ์ ผ่านทั้งหมด', 'ผ่าน'],
|
||||
[3, 'ทดสอบการยอมรับโดยผู้ใช้ (UAT)', `Validation Results ครบ 14 หมวดความต้องการ (${CRS.length} รายการ) ผ่านทั้งหมด`, 'ผ่าน'],
|
||||
[4, 'ไม่มีข้อบกพร่องระดับวิกฤตคงค้าง', `Correction Register ${CORRECTIONS.length} รายการ แก้ไขและตรวจสอบครบ`, 'ผ่าน'],
|
||||
[5, 'เอกสารคู่มือผู้ใช้ ผู้ดูแลระบบ และการบำรุงรักษาครบถ้วน', 'Software User Document, Product Operation Guide, Maintenance Document', 'ผ่าน'],
|
||||
[6, 'Source Code และเอกสารจัดเก็บใน Repository พร้อมชุดสำรอง', 'Project Repository, Project Repository (Backup)', 'ผ่าน'],
|
||||
@@ -139,65 +141,50 @@ export function acceptanceReport() {
|
||||
};
|
||||
}
|
||||
|
||||
/** 6. Change Report — one document per change request. */
|
||||
/** 6. Change Report — the change-control register. No adjustment in this project met the criteria. */
|
||||
export function changeReports() {
|
||||
return CHANGES.map((c) => ({
|
||||
const date = ACCEPT_DATE;
|
||||
return [{
|
||||
dir: '1-PM Process (10 Work Product)/6.Change Report',
|
||||
name: `${CODE} Change Report ${bud(c.date)} V1.0 ${c.requester.id}`,
|
||||
name: `${CODE} Change Report ${bud(date)} V1.0 ApS`,
|
||||
md: workProduct({
|
||||
type: 'Change Report', footer: 'CR',
|
||||
rows: head('Change Report', `${bud(c.date)} V1.0 ${c.requester.id}`, [
|
||||
['Change ID', c.id, 'วันที่ร้องขอ', thLong(c.date)],
|
||||
['ผู้ร้องขอ (Requester)', `${c.requester.th} (${c.requester.role})`],
|
||||
['หน่วยงาน/ฝ่าย', c.unit],
|
||||
['ประเภทการเปลี่ยนแปลง', `☒ ${c.type} ☒ ${c.typeChecked} ☐ Schedule ☐ Cost ☐ Resource ☐ Other`],
|
||||
['ความเร่งด่วน (Priority)', `☐ High ☒ ${c.priority} ☐ Low`],
|
||||
rows: head('Change Report', `${bud(date)} V1.0 ApS`, [
|
||||
['Title', 'ทะเบียนการควบคุมการเปลี่ยนแปลง (Change Control Register)'],
|
||||
['Project Period', thRangeLong(START, END)],
|
||||
['Organizer', ORGANIZER_PM],
|
||||
['Recorder', RECORDER],
|
||||
]),
|
||||
body: [
|
||||
'## ส่วนที่ 1 : ข้อมูลทั่วไป',
|
||||
table(['หัวข้อ', 'รายละเอียด'], [
|
||||
['ชื่อการเปลี่ยนแปลง', c.titleTh],
|
||||
['โครงการ', PROJECT_TH],
|
||||
['ระยะที่เกิดการเปลี่ยนแปลง', `ช่วงดำเนินโครงการ (${thLong(c.date)})`],
|
||||
['เอกสารที่เกี่ยวข้อง', 'Customer Requirements, Software Project Plan, Traceability Record'],
|
||||
]),
|
||||
'## ส่วนที่ 2 : รายละเอียดการเปลี่ยนแปลง',
|
||||
table(['ลำดับ', 'รายการ', 'รายละเอียด'], [
|
||||
[1, 'คำอธิบายการเปลี่ยนแปลงที่ต้องการ (Description)', c.description],
|
||||
[2, 'เหตุผลของการเปลี่ยนแปลง (Justification)', c.justification],
|
||||
], ['c']),
|
||||
'## ส่วนที่ 3 : การประเมินผลกระทบ (Impact Analysis)',
|
||||
table(['ลำดับ', 'รายการ', 'รายละเอียด'], c.impact.map((r, i) => [i + 1, r[0], r[1]]), ['c']),
|
||||
'## ส่วนที่ 4 : การพิจารณาอนุมัติ (Change Advisory Board Approval)',
|
||||
table(['ลำดับ', 'ชื่อผู้พิจารณา', 'ตำแหน่ง', 'ความคิดเห็น / ลงนาม'], [
|
||||
[1, P.ApS.th, 'Project Manager', 'เห็นควรอนุมัติ ผลกระทบอยู่ในวิสัยที่ควบคุมได้'],
|
||||
[2, P.NoC.th, 'System Analyst', 'สอดคล้องกับความต้องการและการออกแบบ'],
|
||||
[3, P.PaNg.th, 'QA / Tester', 'ต้องทดสอบซ้ำในส่วนที่ได้รับผลกระทบ'],
|
||||
[4, P.SeV.th, 'Project Sponsor', 'อนุมัติ'],
|
||||
], ['c']),
|
||||
'## ส่วนที่ 5 : สรุปผลการพิจารณา',
|
||||
table(['หัวข้อ', 'รายละเอียด'], [
|
||||
['สถานะ', '☒ อนุมัติ (Approved) ☐ ไม่อนุมัติ (Rejected)'],
|
||||
['การอ้างอิงการดำเนินการ', `Commit \`${c.commit}\``],
|
||||
['ผลการดำเนินการ', c.result],
|
||||
]),
|
||||
'## ภาคผนวก A : เกณฑ์การประเมินระดับความรุนแรงของการเปลี่ยนแปลง (Change Criteria)',
|
||||
'ตารางนี้ใช้เป็นแนวทางประเมินระดับความรุนแรง (Priority Level) ของการเปลี่ยนแปลง เพื่อให้คณะพิจารณา (Change Advisory Board – CAB) กำหนดระดับผลกระทบและความเร่งด่วนได้ชัดเจนตามมาตรฐาน ISO/IEC 29110',
|
||||
table(['ระดับ (Level)', 'คำจำกัดความ (Definition)', 'ตัวอย่างสถานการณ์ (Examples)', 'ผลกระทบ (Impact Scope)'], [
|
||||
['High', 'การเปลี่ยนแปลงที่มีผลกระทบอย่างมีนัยสำคัญต่อระบบหลัก งบประมาณ หรือแผนโครงการ ซึ่งต้องได้รับอนุมัติจาก Project Manager และ Project Sponsor', 'ปรับสถาปัตยกรรมหลักของระบบ / เพิ่มฟังก์ชันหลักใหม่ / ต้องปรับงบประมาณหรือระยะเวลาโครงการ', 'กระทบ Scope, Schedule และ Cost โดยตรง'],
|
||||
['Medium', 'การเปลี่ยนแปลงที่มีผลกระทบต่อส่วนติดต่อผู้ใช้งานหรือฟังก์ชันย่อยบางส่วน แต่ไม่กระทบโครงสร้างหลัก', 'ปรับปรุงหน้าจอ / ปรับข้อความหรือตรรกะบางส่วน / เพิ่มการตรวจสอบข้อมูล', 'กระทบ Quality หรือ Deliverables บางส่วน'],
|
||||
['Low', 'การเปลี่ยนแปลงขนาดเล็กที่ไม่ส่งผลต่อการทำงานหลักของระบบ', 'แก้ไขคำสะกดหรือข้อความแสดงผล / เปลี่ยนโลโก้หรือรูปภาพ / ปรับฟอนต์หรือสี', 'ผลกระทบเล็กน้อยต่อ Deliverables'],
|
||||
]),
|
||||
'**แนวทางการใช้งาน**',
|
||||
bullets([
|
||||
'ผู้ร้องขอ (Requester) ระบุระดับความรุนแรงตามตารางนี้ในส่วน "ความเร่งด่วน (Priority)"',
|
||||
'คณะพิจารณา (CAB) ใช้ตารางนี้ประกอบการพิจารณาในส่วน "การประเมินผลกระทบ (Impact Analysis)"',
|
||||
'หากมีข้อสงสัยในระดับผลกระทบ ให้ใช้ระดับที่สูงกว่าเพื่อความปลอดภัยของโครงการ',
|
||||
'## วัตถุประสงค์ (Objective)',
|
||||
'เอกสารนี้บันทึกการควบคุมการเปลี่ยนแปลงของโครงการ ตั้งแต่ตั้ง Baseline ความต้องการเมื่อ 18 กุมภาพันธ์ 2569 จนถึงการตรวจรับส่งมอบ โดยพิจารณาทุกรายการปรับปรุงที่มีการเสนอตามเกณฑ์ในส่วนที่ 1 รายการที่เข้าเกณฑ์ต้องจัดทำคำขอเปลี่ยนแปลง ประเมินผลกระทบ และขออนุมัติก่อนดำเนินการ ส่วนรายการที่ไม่เข้าเกณฑ์ดำเนินการเป็นมติที่ประชุมหรืองานในแผน',
|
||||
'## ส่วนที่ 1 : เกณฑ์การพิจารณาคำขอเปลี่ยนแปลง (Change Criteria)',
|
||||
'รายการใดจะถือเป็นคำขอเปลี่ยนแปลงเมื่อเข้าเกณฑ์ทั้ง 3 ข้อ หากตัดรายการนั้นออกแล้วยังส่งมอบงานได้ตามที่ตกลงไว้ จะไม่ถือเป็นคำขอเปลี่ยนแปลง',
|
||||
table(['ลำดับ', 'เกณฑ์', 'คำอธิบาย'], CHANGE_CRITERIA.map(([name, detail], i) => [i + 1, name, detail]), ['c']),
|
||||
'## ส่วนที่ 2 : ทะเบียนคำขอเปลี่ยนแปลง (Change Request Log)',
|
||||
table(['Change ID', 'หัวข้อ', 'ผู้ร้องขอ', 'ผลกระทบ', 'สถานะ'], [['-', 'ไม่มีคำขอเปลี่ยนแปลงที่เข้าเกณฑ์ตลอดโครงการ', '-', '-', '-']], ['c', '', 'c', '', 'c']),
|
||||
'## ส่วนที่ 3 : รายการปรับปรุงที่พิจารณาแล้วไม่เข้าเกณฑ์',
|
||||
table(['ลำดับ', 'วันที่พิจารณา', 'รายการ', 'ผู้เสนอ', 'ผลการพิจารณา', 'การดำเนินการ', 'อ้างอิง'],
|
||||
CHANGE_REVIEW.map(([when, topic, who, assessment, handled, ref], i) => [i + 1, thShort(when), topic, P[who].id, `ไม่เข้าเกณฑ์ — ${assessment}`, handled, ref]), ['c', 'c', '', 'c', '', '', '']),
|
||||
'## ส่วนที่ 4 : สรุปผลการควบคุมการเปลี่ยนแปลง',
|
||||
table(['รายการ', 'จำนวน'], [
|
||||
['รายการปรับปรุงที่เสนอและพิจารณา', CHANGE_REVIEW.length],
|
||||
['คำขอเปลี่ยนแปลงที่เข้าเกณฑ์', 0],
|
||||
['คำขอเปลี่ยนแปลงที่อนุมัติ', 0],
|
||||
['ผลกระทบต่อ Man-day กำหนดส่งมอบ และค่าใช้จ่าย', 'ไม่มี'],
|
||||
], ['', 'r']),
|
||||
'ขอบเขตงาน สิ่งส่งมอบ และ Customer Requirements ที่ตั้ง Baseline ไม่มีการเปลี่ยนแปลงตลอดโครงการ รายการปรับปรุงที่พิจารณาทั้งหมดดำเนินการภายในแผนงานเดิมโดยไม่กระทบ Man-day และกำหนดส่งมอบ',
|
||||
'## ภาคผนวก A : เกณฑ์การประเมินระดับความรุนแรงของการเปลี่ยนแปลง',
|
||||
'ใช้ประเมินระดับความรุนแรง (Priority Level) เมื่อมีคำขอเปลี่ยนแปลงที่เข้าเกณฑ์ในส่วนที่ 1',
|
||||
table(['ระดับ (Level)', 'คำจำกัดความ (Definition)', 'ตัวอย่างสถานการณ์ (Examples)'], [
|
||||
['High', 'กระทบระบบหลัก งบประมาณ หรือแผนงานอย่างมีนัยสำคัญ', 'เพิ่มโมดูลใหม่ เปลี่ยนโครงสร้างฐานข้อมูลหลัก'],
|
||||
['Medium', 'กระทบฟังก์ชันย่อยหรือส่วนติดต่อผู้ใช้งานบางส่วน และกระทบ Man-day', 'รองรับ 2 ภาษา เพิ่มรายงานใหม่'],
|
||||
['Low', 'กระทบเล็กน้อยต่อ Man-day ไม่เปลี่ยนการทำงานหลัก', 'เพิ่มฟิลด์ในเอกสาร'],
|
||||
]),
|
||||
].join('\n\n'),
|
||||
secretary: c.requester, reviewer: P.ApS, approver: P.SeV,
|
||||
secretary: P.ApS, reviewer: P.YaB, approver: P.SeV,
|
||||
}),
|
||||
}));
|
||||
}];
|
||||
}
|
||||
|
||||
/** 7. Meeting Record — Minutes of Meeting per checkpoint. */
|
||||
@@ -266,7 +253,7 @@ export function softwareConfiguration() {
|
||||
['**เอกสารส่งมอบครั้งที่ 2 (พัฒนาและทดสอบ)**', '', ''],
|
||||
['WP 3.0', `เอกสาร ${CODE} Software Requirements Specification`, '1.0'],
|
||||
['WP 4.0', `เอกสาร ${CODE} Software Design`, '1.0'],
|
||||
['WP 5.0', `เอกสาร ${CODE} Change Report (CH-001–CH-003)`, '1.0'],
|
||||
['WP 5.0', `เอกสาร ${CODE} Change Report`, '1.0'],
|
||||
['WP 6.0', `เอกสาร ${CODE} Test Case and Test Procedures`, '1.0'],
|
||||
['WP 7.0', `เอกสาร ${CODE} Validation Results`, '1.0'],
|
||||
['WP 8.0', `เอกสาร ${CODE} Software User Document`, '1.0'],
|
||||
@@ -296,7 +283,7 @@ export function softwareConfiguration() {
|
||||
['สิทธิ์การเข้าถึง', 'ยืนยันตัวตนด้วย SSH Key ตามบทบาทของสมาชิกโครงการ'],
|
||||
]),
|
||||
'## การเชื่อมโยงกับการเปลี่ยนแปลง',
|
||||
`การเปลี่ยนแปลง Configuration Item ต้องผ่าน Change Report (CH-001–CH-003) และการแก้ไขข้อบกพร่องต้องบันทึกใน Correction Register (${CORRECTIONS[0][0]}–${CORRECTIONS[CORRECTIONS.length - 1][0]}) โดยทุกรายการเชื่อมโยงกับ Commit ที่ตรวจสอบได้ใน Repository`,
|
||||
`การเปลี่ยนแปลง Configuration Item ต้องพิจารณาตามเกณฑ์ใน Change Report และการแก้ไขข้อบกพร่องต้องบันทึกใน Correction Register (${CORRECTIONS[0][0]}–${CORRECTIONS[CORRECTIONS.length - 1][0]}) โดยทุกรายการเชื่อมโยงกับ Commit ที่ตรวจสอบได้ใน Repository`,
|
||||
].join('\n\n'),
|
||||
secretary: P.ThS, reviewer: P.ApS, approver: P.SeV,
|
||||
}),
|
||||
|
||||
Reference in New Issue
Block a user