// PM work products 1–2: Statement of Work, Work Schedule, Software Project Plan, Customer Requirements. import { P, TEAM, CODE, PROJECT_TH, COMPANY_TH, ORGANIZER, ORGANIZER_PM, RECORDER, START, END, WPS, SCOPE, CR_GROUPS, CRS, DEV_START, TEST_FROM, TEST_TO } from './project.mjs'; import { TASKS } from './history.mjs'; import { bud, thLong, thRangeLong, thShort, table, bullets, numbered, daysBetween, doc } from './lib.mjs'; import { workProduct, head } from './format.mjs'; const DURATION = daysBetween(START, END); const resp = (ids) => ids.map((i) => P[i].id).join(', '); /** 1. Statement of Work — the meeting invitation that opened the project, as in the audited package. */ export function statementOfWork() { const date = '2026-01-05'; return { dir: '1-PM Process (10 Work Product)/1.Statement of Work', name: `${CODE} Statement of Work ${bud(date)} V1.0 ApS`, md: workProduct({ type: 'Statement of Work', footer: 'SoW', rows: head('Statement of Work', `${bud(date)} V1.0 ApS`, [ ['Title', 'ขอบเขตงานและหนังสือเชิญประชุมเปิดโครงการ'], ['Project Period', thRangeLong(START, END), 'Project Duration', `${DURATION} วัน`], ['Organizer', ORGANIZER_PM], ['Recorder', RECORDER], ]), body: [ `วันที่ ${thLong(date)}`, '**เรื่อง:** ขอบเขตงานโครงการพัฒนาระบบบริหารจัดการคลังสินค้า และนัดประชุมเปิดโครงการ', '**เรียน:** ผู้บริหาร หัวหน้าฝ่าย และผู้เกี่ยวข้องทุกฝ่าย', `ตามที่ ${COMPANY_TH} ได้ใช้การบันทึกข้อมูลคลังสินค้าด้วยกระบวนการที่กระจายอยู่หลายระบบและบางส่วนยังใช้เอกสารกระดาษ ซึ่งปัจจุบันพบว่ามีข้อจำกัดด้านความถูกต้องของยอดสินค้าคงคลัง ความรวดเร็วในการตรวจสอบ และการเชื่อมโยงกับงานขาย งานจัดซื้อ และงานบัญชี ผู้บริหารจึงเล็งเห็นความจำเป็นในการพัฒนาระบบบริหารจัดการคลังสินค้า (Warehouse Management System) ขึ้นใหม่ เพื่อให้การปฏิบัติงานมีความถูกต้อง ตรวจสอบย้อนกลับได้ และรองรับการเติบโตของธุรกิจ`, 'ดังนั้น จึงขอนัดประชุมเพื่อหารือร่วมกันระหว่างทุกฝ่ายที่เกี่ยวข้อง เพื่อ', bullets(['รับฟังข้อเสนอแนะจากฝ่ายคลังสินค้า ฝ่ายขาย ฝ่ายจัดซื้อ และฝ่ายบัญชี', 'กำหนดแนวทางและกรอบความต้องการของระบบ', 'วางแผนดำเนินการพัฒนาและกำหนดผู้รับผิดชอบ']), '## รายละเอียดการประชุม', bullets([`วัน เวลา: ${thLong('2026-01-05')} เวลา 09.00 – 11.00 น.`, `สถานที่: ห้องประชุม ${COMPANY_TH}`, 'ผู้เข้าร่วม: ผู้บริหาร / ผู้จัดการ / หัวหน้าฝ่ายที่เกี่ยวข้อง และทีมพัฒนาระบบ']), '## 1 วัตถุประสงค์ของโครงการ', bullets([ 'พัฒนาระบบบริหารจัดการคลังสินค้าแบบ Web-based รองรับหลายบริษัทและหลายคลังสินค้า', 'รองรับการรับเข้า จ่ายออก โอนย้าย ตรวจนับ พร้อมติดตาม Lot, Serial Number และวันหมดอายุ', 'ลดข้อผิดพลาดจากการทำงานด้วยมือ และเพิ่มความสามารถในการตรวจสอบย้อนกลับ', 'รองรับงานขาย งานจัดซื้อ งานการเงิน และการบันทึกบัญชีที่เกี่ยวข้อง', 'ควบคุมความปลอดภัย การแยกข้อมูลระหว่างบริษัท สิทธิ์การใช้งาน และการแจ้งเตือนแบบ Real-time', ]), '## 2 ขอบเขตงาน (Scope of Work)', table(['ลำดับ', 'ระบบ', 'ระบบย่อย'], SCOPE.map(([sys, subs], i) => [i + 1, sys, subs.join(' / ')]), ['c']), '## 3 สิ่งส่งมอบ (Work Products)', table(['รหัส', 'สิ่งส่งมอบ (Work Product)', 'รายละเอียด'], WPS), '## 4 ข้อยกเว้นและข้อสมมติ', bullets([ 'ไม่รวมการจัดหาเครื่องแม่ข่าย อุปกรณ์เครือข่าย เครื่องอ่านบาร์โค้ด หรือบริการภายนอก เว้นแต่ได้รับอนุมัติแยกต่างหาก', 'การย้ายข้อมูลจากระบบเดิม การเชื่อมต่อ ERP หรือบริการภายนอก ต้องผ่านกระบวนการ Change Request', 'ผู้มีส่วนได้ส่วนเสียต้องให้ข้อมูล ตรวจสอบเอกสาร และร่วมทดสอบตามกำหนดเวลา', ]), '## 5 แผนงานและหลักไมล์', table(['ช่วงงาน', 'ระยะเวลา'], [ ['เริ่มต้นและวางแผนโครงการ', thRangeLong(START, '2026-02-18')], ['พัฒนาและทดสอบภายใน', thRangeLong(DEV_START, '2026-05-29')], ['ตรวจสอบ ทดสอบ จัดทำเอกสาร และส่งมอบ', thRangeLong('2026-05-30', END)], ['วันสิ้นสุดโครงการอย่างเป็นทางการ', thLong(END)], ]), '## 6 เกณฑ์การตรวจรับ', bullets([ 'ฟังก์ชันในขอบเขตผ่าน Test Case และเชื่อมโยงกับความต้องการใน Traceability Record', 'ไม่มีข้อบกพร่องระดับวิกฤตที่ขัดขวางการใช้งานคงค้าง', 'มีคู่มือติดตั้ง คู่มือผู้ใช้ คู่มือผู้ดูแลระบบ และคู่มือบำรุงรักษาครบถ้วน', 'ผลการตรวจสอบ (Verification) การทดสอบการยอมรับ (Validation) และการตรวจรับได้รับการลงนามโดยผู้มีอำนาจ', ]), '## 7 การควบคุมการเปลี่ยนแปลง', 'การเปลี่ยนแปลงขอบเขต กำหนดเวลา หรือสิ่งส่งมอบ ต้องบันทึกใน Change Report ประเมินผลกระทบ และได้รับอนุมัติก่อนดำเนินการ ส่วนการแก้ไขข้อบกพร่องต้องบันทึกใน Correction Register และเชื่อมโยงกับหลักฐานการทดสอบที่เกี่ยวข้อง', 'จึงเรียนมาเพื่อโปรดพิจารณาและเข้าร่วมประชุมโดยพร้อมเพรียงกัน', ].join('\n\n'), secretary: P.ApS, reviewer: P.YaB, approver: P.SeV, }), }; } /** 2.1 Work Schedule — landscape task table with milestones. */ export function workSchedule() { const date = '2026-02-13'; return { dir: '1-PM Process (10 Work Product)/2.Project Plan/1-Work Schedule', name: `${CODE} Work Schedule ${bud(date)} V1.0 ApS`, md: workProduct({ type: 'Work Schedule', footer: 'WS', rows: head('Work Schedule', `${bud(date)} V1.0 ApS`, [ ['Title', 'แผนการดำเนินงานโครงการ (Work Schedule)'], ['Project Period', thRangeLong(START, END), 'Project Duration', `${DURATION} วัน`], ['Organizer', ORGANIZER_PM], ['Recorder', RECORDER], ]), body: [ '## แผนการดำเนินงาน (Work Schedule)', table(['No.', 'Phase', 'Task', 'รายละเอียด', 'ผู้รับผิดชอบ', 'Start', 'Finish', 'วัน', 'สิ่งส่งมอบ / หลักฐาน', 'Status', 'หมายเหตุ'], TASKS.map((t) => [t[0], t[1], t[2], t[3], resp(t[4]), thShort(t[5]), thShort(t[6]), daysBetween(t[5], t[6]), t[7], t[8], t[9]]), ['c', '', '', '', 'c', 'r', 'r', 'r', '', 'c', '']), '## หลักไมล์ของโครงการ (Milestones)', table(['หลักไมล์', 'วันที่', 'เกณฑ์การบรรลุ'], [ ['เปิดโครงการอย่างเป็นทางการ', thLong(START), 'ประชุม Kick-off และชี้แจงขอบเขตงาน'], ['อนุมัติกฎบัตรโครงการ', thLong('2026-01-23'), 'Project Sponsor อนุมัติ Project Charter'], ['ตั้ง Baseline ความต้องการและแผนงาน', thLong('2026-02-18'), 'อนุมัติ Customer Requirements และ Work Schedule'], ['เริ่มพัฒนาระบบ', thLong(DEV_START), 'เริ่ม Task 3.1 ตามแผน'], ['Baseline การพัฒนา', thLong('2026-05-29'), 'พัฒนาครบทุกโมดูล (Git a0677d6)'], ['ทดสอบระบบและ UAT', thRangeLong(TEST_FROM, TEST_TO), 'ทดสอบ 45 Test Case และ 12 สถานการณ์ UAT ผ่านทั้งหมด'], ['ตรวจรับส่งมอบระบบ', thLong('2026-08-17'), 'ผลการตรวจรับ Accepted'], ['อบรมผู้ใช้งาน', thLong('2026-08-22'), 'อบรมผู้ใช้งาน 6 คน'], ['ปิดโครงการ', thLong(END), 'ปิดโครงการอย่างเป็นทางการ'], ], ['', 'c', '']), '## หมายเหตุการติดตามแผนงาน', bullets([ 'สถานะงานได้รับการปรับปรุงทุกงวดรายงานตาม Progress Status Record', 'งานที่ไม่แล้วเสร็จตามกำหนดต้องดำเนินการตามแผนสำรองใน Software Project Plan หัวข้อ 10', 'การเปลี่ยนแปลงแผนงานที่กระทบกำหนดส่งมอบต้องผ่าน Change Report', ]), ].join('\n\n'), secretary: P.ApS, reviewer: P.YaB, approver: P.SeV, }), }; } /** 2.2 Software Project Plan — sections 1–11 in the reference order. */ export function softwareProjectPlan() { const date = '2026-02-13'; const sec = (n, title) => `## ${n} ${title}`; return { dir: '1-PM Process (10 Work Product)/2.Project Plan/2-Software Project Plan', name: `${CODE} Software Project Plan ${bud(date)} V1.0 ApS`, md: workProduct({ type: 'Software Project Plan', footer: 'PP', rows: head('Software Project Plan', `${bud(date)} V1.0 ApS`, [ ['Title', 'แผนการดำเนินโครงการ'], ['Project Period', thRangeLong(START, END), 'Project Duration', `${DURATION} วัน`], ['Organizer', ORGANIZER], ['Recorder', RECORDER], ]), body: [ sec(1, 'Manufacture'), `${COMPANY_TH} เป็นบริษัทผู้ประกอบธุรกิจด้านเทคโนโลยีสารสนเทศ ซึ่งมีประสบการณ์ในการส่งมอบผลิตภัณฑ์และบริการด้านเทคโนโลยีให้แก่หน่วยงานภาครัฐและเอกชนอย่างต่อเนื่อง บริษัทประกอบธุรกิจหลัก 3 ด้าน ได้แก่`, bullets([ 'พัฒนาซอฟต์แวร์ตามความต้องการของหน่วยงาน (Software Development)', 'จำหน่ายผลิตภัณฑ์ซอฟต์แวร์สำเร็จรูป (Software Package) เช่น ระบบบริหารจัดการสินทรัพย์', 'ให้บริการบำรุงรักษาระบบ (Service Maintenance: MA) ครอบคลุมโครงสร้างพื้นฐาน เครื่องแม่ข่าย และศูนย์ข้อมูล', ]), sec(2, 'Overview'), 'เพื่อยกระดับการบริหารจัดการคลังสินค้าของบริษัทให้มีความถูกต้อง รวดเร็ว และตรวจสอบย้อนกลับได้ บริษัทมีความประสงค์จะพัฒนา ระบบบริหารจัดการคลังสินค้า (BRN WMS) ขึ้นใหม่ โดยมีวัตถุประสงค์เพื่อ', bullets([ 'รวมศูนย์ข้อมูลคลังสินค้า สินค้าคงคลัง และความเคลื่อนไหวของสินค้าไว้ในระบบเดียว', 'เชื่อมโยงงานขาย งานจัดซื้อ งานการเงิน และการบันทึกบัญชีเข้ากับความเคลื่อนไหวของสินค้า', 'ควบคุมสิทธิ์การเข้าถึงและแยกข้อมูลระหว่างบริษัทและคลังสินค้าอย่างชัดเจน', 'ให้ผู้บริหารเห็นภาพรวมสถานะคลังสินค้าและสถานะทางการเงินได้ตามเวลาจริง', ]), sec(3, 'Goals and Scope'), '### 3.1 เป้าหมายของโครงการ', '**เป้าหมายด้านองค์กร**', bullets(['ลดข้อผิดพลาดของยอดสินค้าคงคลังที่เกิดจากการบันทึกด้วยมือ', 'เพิ่มความสามารถในการตรวจสอบย้อนกลับของสินค้าตาม Lot, Serial Number และวันหมดอายุ', 'ทำให้ข้อมูลคลังสินค้าและข้อมูลบัญชีสอดคล้องกันโดยไม่ต้องบันทึกซ้ำ']), '**เป้าหมายด้านผู้ใช้งาน**', bullets(['ให้พนักงานคลังสินค้าบันทึกรายการรับเข้า จ่ายออก และโอนย้ายได้สะดวกจากอุปกรณ์หน้าคลัง', 'ให้ฝ่ายขายและฝ่ายจัดซื้อจัดทำเอกสารและติดตามสถานะได้ในระบบเดียว', 'ให้ฝ่ายบัญชีได้ข้อมูลรายการที่ผ่านการตรวจสอบแล้วโดยอัตโนมัติ']), '### 3.2 ขอบเขตของโครงการ (SOW)', table(['ลำดับ', 'ระบบ', 'ระบบย่อย'], SCOPE.map(([sys, subs], i) => [i + 1, sys, subs.join(' / ')]), ['c']), '### 3.3 สิ่งส่งมอบ (Work Products)', table(['รหัส', 'สิ่งส่งมอบ (Work Product)', 'รายละเอียด'], WPS), '### 3.4 Delivery Instruction', 'ในการส่งมอบตามสิ่งส่งมอบ (Work Product) เมื่อแล้วเสร็จและถึงกำหนดเวลา (Due Date) ผู้จัดการโครงการต้องจัดเตรียมเครื่องมือและสถานที่เพื่อให้ลูกค้าทำการทดสอบการยอมรับผู้ใช้ (Validation Result หรือ User Acceptance Test – UAT) โดยทดสอบตามข้อกำหนดในเอกสารความต้องการผู้ใช้ (Customer Requirements) ทีละข้อ และลงนามยืนยันเมื่อผ่านการทดสอบ', bullets([ '**กรณีสิ่งส่งมอบไม่แล้วเสร็จตามกำหนด (Delay)** ผู้จัดการโครงการต้องนัดประชุมรายงานความคืบหน้าและอธิบายสาเหตุให้ลูกค้าทราบ พร้อมทั้งตกลงกำหนดวันส่งมอบใหม่อย่างเป็นทางการร่วมกัน', '**การปิดโครงการ (Project Closure)** เมื่อสิ่งส่งมอบทั้งหมดผ่านการตรวจรับและได้รับลายเซ็นอนุมัติจากลูกค้าครบทุกชุดแล้ว ผู้จัดการโครงการจัดประชุมปิดโครงการอย่างเป็นทางการ พร้อมจัดทำเอกสารสรุปผลการดำเนินงานเพื่อเก็บเป็นหลักฐาน', ]), '### 3.5 เกณฑ์คุณภาพ (Quality Criteria)', '**ด้านคุณภาพของระบบ**', table(['ลำดับ', 'หัวข้อ', 'เกณฑ์คุณภาพ', 'วิธีประเมิน'], [ ['1.1', 'ความถูกต้องของฟังก์ชัน', 'ฟังก์ชันทั้งหมดทำงานตรงตาม Customer Requirements ครบ 100%', 'ทดสอบตาม Test Case และ UAT'], ['1.2', 'ความถูกต้องของข้อมูลสต๊อกและบัญชี', 'ไม่พบยอดสต๊อกติดลบหรือรายการ GL ที่ไม่สมดุล', 'ทดสอบ Transaction และ Rollback (TC-UN08.002)'], ['1.3', 'ความปลอดภัยของระบบ', 'ไม่พบข้อบกพร่องระดับวิกฤตด้านสิทธิ์และการแยกข้อมูล', 'ทดสอบสิทธิ์เชิงลบ (TC-UN12.001, TC-UN12.002)'], ['1.4', 'ประสิทธิภาพการตอบสนอง', 'งานประจำวันตอบสนองภายในเวลาที่ใช้งานได้จริงบนสภาพแวดล้อมที่ตกลง', 'ทดสอบตามปริมาณข้อมูลตัวอย่าง (TC-UN09.001)'], ['1.5', 'ความสามารถในการเข้าถึง', 'ใช้งานได้บน Desktop, Tablet และ Mobile (Responsive)', 'ทดสอบข้ามอุปกรณ์'], ], ['c']), '**ด้านการดูแลหลังส่งมอบ**', table(['ลำดับ', 'หัวข้อ', 'เกณฑ์คุณภาพ', 'วิธีประเมิน'], [ ['2.1', 'การตอบสนองเหตุขัดข้อง', 'ตอบรับภายใน 4 ชั่วโมง และแก้ไขตามระดับความรุนแรงที่กำหนดใน SLA', 'บันทึกการให้บริการ'], ['2.2', 'การสำรองข้อมูล', 'มีระบบสำรองข้อมูลอัตโนมัติรายวันและทดสอบกู้คืนได้จริง', 'Backup & Restore Test (TC-UN13.004)'], ['2.3', 'การเฝ้าระวังระบบ', 'ตรวจสอบสถานะบริการทุก 5 นาที และแจ้งเตือนเมื่อล้มเหลว 2 ครั้งติดกัน', 'บันทึกการเฝ้าระวัง'], ], ['c']), sec(4, 'Software Development Life Cycle Methodology'), 'โครงการเลือกใช้แนวทาง Incremental / Evolutionary ภายใต้ขั้นตอนหลักของ Waterfall เนื่องจาก', bullets([ 'ขอบเขตและสิ่งส่งมอบกำหนดชัดเจนตั้งแต่ต้นโครงการ จึงวางแผนและตรวจรับเป็นงวดได้', 'ระบบมีหลายโมดูลที่ส่งมอบต่อเนื่องกัน จึงพัฒนาและทดสอบทีละส่วนเพื่อลดความเสี่ยง', 'เอกสารครบถ้วนตามมาตรฐาน ISO/IEC 29110 ที่เน้น Work Products และ Traceability', 'ตรวจสอบย้อนกลับ (Audit) และตรวจรับงานได้อย่างเป็นทางการ', ]), table(['ขั้นตอน', 'แนวทางที่ใช้จริงในโครงการ'], [ ['Requirements', 'เก็บความต้องการและตั้ง Baseline ก่อนเริ่มพัฒนา การเปลี่ยนแปลงภายหลังผ่าน Change Report (CH-001–CH-003)'], ['Design', 'ออกแบบสถาปัตยกรรม โครงสร้างฐานข้อมูล และ Software Unit ก่อนพัฒนาแต่ละโมดูล'], ['Implementation', 'พัฒนาเป็นโมดูลต่อเนื่องระหว่าง 19 ก.พ. – 29 พ.ค. 69 พร้อมทบทวนและแก้ไขระหว่างทาง'], ['Verification', 'ตรวจสอบ Work Products 4 รอบ ควบคู่กับการพัฒนา และรอบสุดท้ายก่อนส่งมอบ'], ['Validation', 'ทดสอบระบบและ UAT ระหว่าง 10–14 ส.ค. 69 บนสภาพแวดล้อมที่กำหนด'], ['Closure', 'ตรวจรับ อบรม ปิดงานควบคุมปฏิบัติการ และปิดโครงการภายใน 24 ส.ค. 69'], ]), sec(5, 'Organization'), '### 5.1 Role & Responsibility', table(['ลำดับ', 'บทบาท', 'ชื่อ-นามสกุล (ชื่อย่อ)', 'อีเมล', 'รายละเอียดหน้าที่'], [ [1, `Project Manager (${P.ApS.id})`, P.ApS.th, P.ApS.email, 'จัดทำ Project Charter และแผนโครงการ / วางแผน Timeline, Resource, Risk, Quality / จัดประชุมและติดตามความคืบหน้า / ควบคุมการเปลี่ยนแปลงและการปิดโครงการ'], [2, `System Analyst (${P.NoC.id})`, P.NoC.th, P.NoC.email, 'เก็บและวิเคราะห์ความต้องการ / จัดทำ SRS และเอกสารออกแบบระบบ / ออกแบบฐานข้อมูลและความสัมพันธ์ของโมดูล / ตรวจสอบความสอดคล้องของงานพัฒนากับความต้องการ'], [3, `Developer (${P.ThS.id})`, P.ThS.th, P.ThS.email, 'พัฒนาโมดูลและ API ตามการออกแบบ / จัดการฐานข้อมูลและประสิทธิภาพ / ดูแลความปลอดภัยและการติดตั้ง / แก้ไขข้อบกพร่องที่พบจากการทดสอบ'], [4, `QA / Tester (${P.PaNg.id})`, P.PaNg.th, P.PaNg.email, 'จัดทำ Test Case และ Test Procedures / ทดสอบระบบและบันทึกผล / ติดตามการแก้ไขข้อบกพร่องและทดสอบซ้ำ / สนับสนุนผู้ใช้งานช่วง UAT'], [5, `Document Control (${P.YaB.id})`, P.YaB.th, P.YaB.email, 'ควบคุมรหัสเอกสารและเวอร์ชัน / จัดเก็บและตรวจสอบความครบถ้วนของเอกสาร / ประสานการทบทวนและอนุมัติ / บันทึกประวัติการเปลี่ยนแปลงเอกสาร'], [6, `Project Sponsor (${P.SeV.id})`, P.SeV.th, P.SeV.email, 'อนุมัติขอบเขต งบประมาณ และการเปลี่ยนแปลง / ตัดสินใจเชิงกลยุทธ์ / ทดสอบการยอมรับและตรวจรับส่งมอบ / อนุมัติปิดโครงการ'], ], ['c']), sec(6, 'Project Estimate'), '### 6.1 Size of the Software Work Products', table(['ลำดับ', 'Work Product', 'ปริมาณ (ประมาณการ)'], [ [1, 'เอกสารบริหารโครงการ (PM Process)', '10 รายการ'], [2, 'เอกสารกระบวนการพัฒนา (SI Process)', '12 รายการ'], [3, 'ความต้องการลูกค้า (Customer Requirements)', `${CRS.length} รายการ (CR01–CR14)`], [4, 'ความต้องการซอฟต์แวร์ (SRS)', '49 รายการ (SR01–SR09)'], [5, 'Software Unit', '45 หน่วย (UN01–UN13)'], [6, 'Test Case', '45 รายการ'], [7, 'ตารางฐานข้อมูล', 'ประมาณ 50 ตาราง ใน 2 ฐานข้อมูล'], ], ['c']), '### 6.2 Effort Man-Day', table(['ลำดับ', 'ตำแหน่ง', 'หน้าที่หลัก', 'ระยะเวลา (Man-Day)'], [ [1, 'Project Manager', 'ควบคุมงาน ประสานงาน ติดตามแผน', 120], [2, 'System Analyst', 'วิเคราะห์ความต้องการ ออกแบบระบบ', 60], [3, 'Developer', 'พัฒนาระบบและแก้ไขข้อบกพร่อง', 100], [4, 'QA / Tester', 'วางแผนทดสอบ ทดสอบระบบ UAT', 40], [5, 'Document Control', 'ควบคุมเอกสารและหลักฐานโครงการ', 60], ], ['c', '', '', 'r']), sec(7, 'Project Resources'), '**Human Resource**', table(['ลำดับ', 'Team', 'จำนวน (คน)'], [[1, 'Project Management (PM, Document Control)', 2], [2, 'Software Implementation (SA, Developer, QA)', 3], [3, 'Project Sponsor / ตัวแทนลูกค้า', 1]], ['c', '', 'r']), '**Computer Resource**', table(['ลำดับ', 'รายการ', 'จำนวน'], [ [1, 'Notebook สำหรับทีมพัฒนาและทดสอบ', '5 เครื่อง'], [2, 'Git Server (Repository หลัก)', '1 ระบบ'], [3, 'Internal Testing Server (PHP 8, MariaDB, Node.js)', '1 เครื่อง'], [4, 'Production Server สำหรับใช้งานจริง', '1 เครื่อง'], [5, 'เครื่องอ่านบาร์โค้ดสำหรับทดสอบ', '1 เครื่อง'], ], ['c']), sec(8, 'Work Schedule'), `แผนการดำเนินงานของโครงการ รวม ${DURATION} วัน ตั้งแต่ ${thLong(START)} ถึง ${thLong(END)} รายละเอียดกิจกรรม ผู้รับผิดชอบ และสิ่งส่งมอบรายกิจกรรม อยู่ในเอกสาร ${CODE} Work Schedule ซึ่งเป็นส่วนหนึ่งของ Project Plan`, table(['Phase', 'ช่วงเวลา', 'ผลลัพธ์หลัก'], [ ['Project Initiation', thRangeLong(START, '2026-01-23'), 'Statement of Work, Stakeholder Register, Project Charter'], ['Project Planning', thRangeLong('2026-01-12', '2026-02-18'), 'Customer Requirements, Software Project Plan, Work Schedule'], ['Project Execution', thRangeLong(DEV_START, '2026-05-29'), 'SRS, Software Design, ระบบที่พัฒนาแล้ว, Software Components'], ['Verification & Validation', thRangeLong('2026-05-30', '2026-08-17'), 'Test Case, Test Report, Verification Results, Validation Results'], ['Project Close', thRangeLong('2026-08-10', END), 'Acceptance Report, Training Report, List of Evidence'], ]), sec(9, 'Risk Management Plan'), 'วัตถุประสงค์ของแผนบริหารความเสี่ยง คือระบุแนวทางจัดการความเสี่ยงของโครงการ เพื่อให้โครงการบรรลุเป้าหมายภายในเวลา งบประมาณ และคุณภาพที่กำหนด', table(['ลำดับ', 'หมวด', 'รายการ', 'รายละเอียด'], [ [1, 'ขอบเขต', 'ครอบคลุมทุกกิจกรรมของโครงการ', 'ตั้งแต่ Initiation, Planning, Execution จนถึง Close'], [2, 'บทบาทผู้รับผิดชอบ', 'Project Manager (Owner), ทีมพัฒนา, Project Sponsor', 'PM ติดตามและควบคุมความเสี่ยง ทีมพัฒนารายงานความเสี่ยงให้ PM'], [3, 'รอบการทบทวน', 'ทบทวนทุกงวดรายงานความก้าวหน้า', 'บันทึกความเสี่ยงใหม่และการเปลี่ยนแปลงระดับความเสี่ยงใน Progress Status Record'], ], ['c']), '**ตารางระบุความเสี่ยงหลักของโครงการ**', table(['ลำดับ', 'ความเสี่ยง (Risk)', 'ประเภท', 'โอกาสเกิด', 'ผลกระทบ', 'ระดับความเสี่ยง', 'แนวทางป้องกัน (Mitigation)', 'แผนรับมือ (Contingency Plan)', 'ผู้รับผิดชอบ'], [ ['R1', 'ความต้องการเปลี่ยนแปลงระหว่างพัฒนา', 'กระบวนการ', 'High', 'High', 'High', 'ตั้ง Baseline ความต้องการและทบทวนทุกงวด', 'จัดทำ Change Report และจัดลำดับความสำคัญใหม่', `${P.ApS.id} / ${P.NoC.id}`], ['R2', 'ทีมพัฒนาไม่เพียงพอหรือขาดทักษะเฉพาะทาง', 'บุคลากร', 'Middle', 'High', 'High', 'ถ่ายทอดความรู้ภายในทีมและจัดทำเอกสารประกอบ', 'ขออนุมัติจัดหาผู้เชี่ยวชาญเพิ่มเฉพาะงาน', P.ApS.id], ['R3', 'ยอดสินค้าคงคลังไม่ถูกต้อง', 'เทคโนโลยี', 'Middle', 'High', 'High', 'ใช้ Transaction, ตรวจสอบข้อมูลนำเข้า และล็อกรายการ', 'ตรวจสอบและปรับปรุงยอดพร้อมบันทึก Correction Register', `${P.ThS.id} / ${P.PaNg.id}`], ['R4', 'ข้อมูลรั่วไหลข้ามบริษัทหรือสิทธิ์ไม่รัดกุม', 'ความปลอดภัย', 'Middle', 'High', 'High', 'บังคับ Role Guard และขอบเขตบริษัทฝั่งเซิร์ฟเวอร์', 'ปิดช่องโหว่ทันทีและทดสอบสิทธิ์เชิงลบซ้ำ', `${P.ThS.id} / ${P.PaNg.id}`], ['R5', 'ค่าตั้งค่าหรือความลับรั่วไหล', 'ความปลอดภัย', 'Middle', 'High', 'High', 'ยกเว้นไฟล์ตั้งค่าจาก Git และสร้างความลับตอนติดตั้ง', 'เปลี่ยนค่าความลับและตรวจสอบประวัติการเข้าถึง', P.ThS.id], ['R6', 'ข้อมูลสูญหายระหว่างพัฒนาหรือใช้งาน', 'เทคโนโลยี', 'Middle', 'High', 'High', 'สำรอง Git 2 Remote และสำรองฐานข้อมูลรายวัน', 'กู้คืนจากชุดสำรองตามขั้นตอนในคู่มือ', P.ThS.id], ['R7', 'หลักฐานการทดสอบและตรวจรับไม่ครบถ้วน', 'กระบวนการ', 'Middle', 'High', 'High', 'รักษาการสอบกลับสองทิศทางและบันทึกผลทุกครั้ง', 'ทดสอบซ้ำและบันทึกหลักฐานก่อนตรวจรับ', `${P.PaNg.id} / ${P.YaB.id}`], ['R8', 'ผู้ใช้ไม่ยอมรับระบบ (UAT ไม่ผ่าน)', 'ผู้ใช้งาน', 'Middle', 'High', 'High', 'ให้ผู้ใช้ร่วมทบทวนความต้องการและสาธิตระบบระหว่างพัฒนา', 'ปรับปรุงตาม Feedback และทดสอบการยอมรับใหม่', `${P.ApS.id} / ${P.SeV.id}`], ], ['c', '', '', 'c', 'c', 'c', '', '', 'c']), sec(10, 'Contingency Actions for Non-Completed Tasks'), 'แผนรองรับสำหรับกรณีงานไม่แล้วเสร็จตามกำหนด (Non-Completed Task)', table(['ลำดับ', 'สถานการณ์', 'สาเหตุที่พบบ่อย', 'ผลกระทบที่อาจเกิด', 'แผนรองรับเมื่อเกิดเหตุ', 'ผู้รับผิดชอบ'], [ [1, 'งานไม่เสร็จภายในกำหนด (Due Date)', 'ประเมินเวลาผิดพลาด หรือทรัพยากรไม่เพียงพอ', 'กระทบ Timeline และกำหนดส่งมอบ', 'ประชุมด่วนเพื่อประเมินสถานะ จัดลำดับความสำคัญใหม่ ปรับแผน และแจ้งลูกค้าอย่างเป็นทางการ', P.ApS.id], [2, 'งานล่าช้าเพราะขาดบุคลากร', 'ลาป่วย ลาออก หรือไม่พร้อมปฏิบัติงาน', 'งานค้างสะสมและภาระงานกระจุกตัว', 'จัดทำเอกสารส่งมอบงาน ถ่ายทอดความรู้ให้ผู้ปฏิบัติแทน และขออนุมัติจัดหาผู้ช่วยเฉพาะงาน', `${P.ApS.id} / ฝ่ายบุคคล`], [3, 'งานค้างเพราะรอข้อมูลจากผู้ใช้', 'ผู้ให้ข้อมูลส่งความต้องการหรือข้อมูลตั้งต้นล่าช้า', 'ไม่สามารถพัฒนาหรือทดสอบต่อได้', 'แจ้งเตือนเป็นลายลักษณ์อักษร แยกงานที่ยังไม่พร้อมออก และนัดยืนยัน Timeline ใหม่', `${P.ApS.id} / ${P.SeV.id}`], [4, 'งานไม่เสร็จเพราะพบข้อบกพร่องซ้ำซ้อน', 'ความซับซ้อนสูงหรือขาดการทดสอบระยะแรก', 'เกิดความล่าช้าในการพัฒนาและทดสอบ', 'จัดลำดับข้อบกพร่องตามความรุนแรง แยกงานแก้ไขออกจากงานพัฒนาใหม่ และทดสอบซ้ำ', `${P.ThS.id} / ${P.PaNg.id}`], [5, 'งานล่าช้าเพราะต้องแก้ความต้องการ', 'ขอบเขตเปลี่ยนหลังเริ่มงาน', 'กระทบแผนงานและสิ่งส่งมอบ', 'จัดทำ Change Report อย่างเป็นทางการ ประเมินผลกระทบ และขออนุมัติก่อนดำเนินการต่อ', `${P.ApS.id} / ${P.SeV.id}`], ], ['c']), sec(11, 'Document and Repository'), '**รูปแบบไฟล์ (File Format)** การกำหนดชื่อไฟล์ให้ใช้รูปแบบดังนี้', '`[Project code] [Document name] [yyyymmdd] V[version] [editor name].[ext.]`', table(['หัวข้อ', 'รายละเอียด'], [ ['[Project code]', `รหัสโครงการตามส่วนงานบัญชี เช่น ${CODE}`], ['[Document name]', 'ชื่อเอกสาร เช่น Progress Status Record'], ['[yyyymmdd]', 'วันที่ของเอกสารตามปีพุทธศักราช เช่น 25690817'], ['[version]', 'เวอร์ชันของเอกสาร เช่น 1.0'], ['[editor name]', 'ตัวย่อของชื่อผู้จัดทำ เช่น ApS'], ['[ext.]', 'นามสกุลไฟล์ เช่น pdf'], ]), '**การประกาศเวอร์ชัน (Version Declaration)** เก็บเอกสารแต่ละเวอร์ชันแยกไฟล์เพื่อให้ตรวจสอบย้อนหลังได้ โดยใช้รูปแบบ Major.Minor', table(['เวอร์ชัน (Version)', 'รายละเอียด'], [ ['0.1 (Draft)', 'ร่างเอกสารฉบับแรก'], ['0.2 (Draft)', 'ปรับปรุงตามผลการทบทวน'], ['1.0 (Release)', 'อนุมัติใช้เป็นเอกสารทางการ'], ['1.1 (Revision)', 'ปรับปรุงเอกสารหลังอนุมัติ'], ]), '**Project Repository** ใช้ Git Server เป็นศูนย์กลางในการจัดเก็บและควบคุมเวอร์ชันของ Source Code และเอกสารทั้งหมดที่เกี่ยวข้องกับโครงการ', table(['ลำดับ', 'หัวข้อ', 'รายละเอียด'], [ [1, 'ที่เก็บข้อมูล (Repository Location)', 'ทีมงานเข้าถึง Repository ผ่าน Git Server โดย Repository ของโครงการนี้เก็บทั้ง Source Code และเอกสาร ISO'], [2, 'สิทธิ์การเข้าถึง (Access Control)', 'สมาชิกโครงการได้รับสิทธิ์ตามบทบาท โดย Project Manager และ System Analyst มีสิทธิ์อนุมัติการ Merge'], [3, 'การจัดเก็บไฟล์งาน (File Storage Rules)', 'ไฟล์ที่เกี่ยวข้องกับโครงการต้องจัดเก็บใน Repository และไฟล์ที่สร้างจากเครื่องส่วนบุคคลต้องนำขึ้น Repository ภายในเวลาที่กำหนด'], ], ['c']), '**Project Repository Backup** เพื่อป้องกันการสูญหายของข้อมูลใน Git Server', table(['ลำดับ', 'หัวข้อ', 'รายละเอียด'], [ [1, 'ผู้รับผิดชอบ (Responsibility)', 'มอบหมาย Developer ตรวจสอบความถูกต้องของข้อมูลสำรองอย่างสม่ำเสมอ'], [2, 'วิธีการสำรองข้อมูล (Backup Methods)', 'ซิงก์ Repository ไปยัง Backup Remote และสำรองฐานข้อมูลด้วยการ Export อัตโนมัติ'], [3, 'รอบการสำรองข้อมูล (Backup Frequency)', 'ฐานข้อมูลสำรองทุกวันเวลา 02:00 น. และ Repository ซิงก์ทุกครั้งที่มีการส่งมอบ'], ], ['c']), ].join('\n\n'), secretary: P.ApS, reviewer: P.YaB, approver: P.SeV, }), }; } /** 2.3 Customer Requirements — CR01–CR14 in the reference table layout. */ export function customerRequirements() { const date = '2026-02-06'; const rows = []; for (const [gid, gname, items] of CR_GROUPS) { rows.push([`${gid}: ${gname}`, '', '', '']); for (const [id, text, remark] of items) rows.push([id, text, 'A', remark]); } return { dir: '1-PM Process (10 Work Product)/2.Project Plan/3-Customer Requirement', name: `${CODE} Customer Requirements ${bud(date)} V1.0 NoC`, md: workProduct({ type: 'Customer Requirements', footer: 'CR', rows: head('Customer Requirements', `${bud(date)} V1.0 NoC`, [ ['Title', 'เอกสารบันทึกและสรุปความต้องการของลูกค้า (Customer Requirements)'], ['Project Period', thRangeLong(START, END)], ['Organizer', ORGANIZER], ['Recorder', RECORDER], ]), body: [ '## วัตถุประสงค์ (Objective)', `เอกสารฉบับนี้จัดทำขึ้นเพื่อบันทึกและสรุปความต้องการของลูกค้า (Customer Requirements) ตามกระบวนการ ISO/IEC 29110 สำหรับใช้เป็นพื้นฐานในการจัดทำ Software Requirements Specification, การออกแบบระบบ, การทดสอบ และการตรวจรับ ของ${PROJECT_TH}`, '## ผู้มีส่วนได้ส่วนเสีย (Stakeholders)', table(['ลำดับ', 'ชื่อ', 'ตำแหน่ง', 'บทบาท'], [ [1, P.SeV.th, 'ผู้บริหาร (CEO)', 'Project Sponsor อนุมัติและตัดสินใจเชิงกลยุทธ์'], [2, P.ApS.th, 'ผู้จัดการโครงการ', 'บริหารโครงการและควบคุมการเปลี่ยนแปลง'], [3, P.NoC.th, 'นักวิเคราะห์ระบบ', 'เก็บและวิเคราะห์ความต้องการ จัดทำเอกสาร'], [4, 'หัวหน้าฝ่ายคลังสินค้าและพนักงานคลัง', 'ผู้ใช้งานหลัก', 'ให้ข้อมูลกระบวนการรับเข้า จ่ายออก โอนย้าย และตรวจนับ'], [5, 'ฝ่ายขายและฝ่ายจัดซื้อ', 'ผู้ใช้งาน', 'ให้ข้อมูลกระบวนการเอกสารขายและจัดซื้อ'], [6, 'ฝ่ายบัญชีและการเงิน', 'ผู้ใช้งาน', 'ให้ข้อมูลการวางบิล รับชำระ จ่ายชำระ และการบันทึกบัญชี'], ], ['c']), '## ความต้องการเชิงหน้าที่และไม่ใช่หน้าที่ (Functional and Non-Functional Requirements)', table(['ID', 'Topic', 'Result*', 'Remark'], rows, ['', '', 'c', '']), '## Remark', bullets(['\\* Result : A = Accepted, U = Unaccepted, N/A = Not Applicable', 'เอกสารฉบับนี้รวมความต้องการที่ได้จากการทบทวนขอบเขตงานร่วมกับลูกค้า', 'การเปลี่ยนแปลงความต้องการหลังอนุมัติต้องดำเนินการผ่าน Change Report']), ].join('\n\n'), secretary: P.NoC, reviewer: P.YaB, approver: P.SeV, }), }; }