2 · Core pipeline — ตั้งตัวชี้วัด → ประเมินผล → อนุมัติ → ปรับเงินเดือน
pms-api มี flow ที่ยาวกว่า repo อื่นในกลุ่มมาก เพราะครอบคลุมทั้งวงจรการบริหารผลงานประจำปี บทนี้ประกอบภาพจากโครงสร้าง module, controller endpoint, และเอกสารที่ทีม dev เขียนไว้เอง (docs/PMS-Period-Notification-System.md) — ส่วนที่ไม่มีหลักฐาน citation ตรงจะระบุว่าเป็นการอนุมานจากชื่อ module/endpoint
ภาพรวม flow (อนุมานจากลำดับ module + endpoint ที่มี)
ต้นปีงบประมาณ — ฝ่าย HR ตั้งค่ารอบ (period)
│
▼
1) PeriodModule — กำหนดช่วงเวลา settingGoalStart/End, checkDataStart, updateResultStart,
evaluationStart/End, feedbackEnd ต่อ tbPeriod (fiscalYear, status='confirm')
│
├─ ConfigNotificationModule ผูกกับ period นี้ — ตั้งว่าจะแจ้งเตือนใครที่วันไหน (isEvaluatee/isEvaluator/isApprover/isOrgUnitAdmin)
│ └─ cron ทุกวัน 6 โมงเช้า ตรวจว่าวันนี้ตรงกับวันแจ้งเตือนของ notification type ใดหรือไม่ → ส่ง email
│
▼
2) IndicatorType / Indicator / IndicatorWeight / RatingScale / Grading / GradeLimit
│
└─ ฝ่าย HR ตั้งตัวชี้วัดกลาง + scale การให้คะแนน + สัดส่วนเกรด (forced distribution ต่อ gradeLimit)
│
▼
3) CreateFormModule (2,701 บรรทัด) — สร้างแบบประเมินจากตัวชี้วัดที่ตั้งไว้ ผูกกับ evaluateUserAmount (รายชื่อผู้ถูกประเมินต่อรอบ)
│
▼
4) EvaluateFormModule (2,996 บรรทัด — ใหญ่สุดในทั้ง repo) — พนักงาน/หัวหน้ากรอกแบบประเมินจริง
│
├─ getEvaluateFormList / getEvaluateFormSalaryList — ติดตามสถานะการประเมิน + สถานะที่เกี่ยวกับเงินเดือน
└─ exportPDFEvaluations / exportPDFEvaluationsMobile — puppeteer generate PDF ผลประเมินต่อคน
│
▼
5) ApproverModule (546 บรรทัด) — จัดการสายอนุมัติ + เปลี่ยนผู้อนุมัติ (delegate) ระหว่างทาง
│
▼
6) ConfirmEvaluationModule (1,240 บรรทัด) — ยืนยันผลประเมินระดับหน่วยงาน (org unit) ก่อนเข้าสู่กระบวนการปรับเงินเดือน
│
├─ orgUnit/update_no_quota — ปรับกรณีหน่วยงานไม่มีโควต้าเกรด
├─ orgUnit/update_reject — ปฏิเสธผลรวมของหน่วยงาน ส่งกลับไปแก้
└─ orgUnit/confirm_update_status — ยืนยันผลของหน่วยงาน
│
▼
7) BudgetModule — จัดสรรงบประมาณปรับเงินเดือนต่อหน่วยงาน (มี endpoint getEmployeeSalary ที่เป็น @Public() — ดู scorecard)
│
▼
8) SalaryRange → SalaryPercentage → SalaryAdjust → SalaryAdjustment (2,367 บรรทัด)
│
└─ คำนวณ % ปรับเงินเดือนตามเกรดผลประเมิน + budget ของหน่วยงาน แล้วบันทึกเป็น SalaryAdjustBu/SalaryAdjustHd/SalaryAdjustDt
│
▼
9) SalaryAdjustToHRMIModule (554 บรรทัด) — export ผลการปรับเงินเดือนเป็นไฟล์ Excel (`exceljs`) สำหรับนำเข้าระบบ HRMI
│ (ต่างจาก recruitment-api ที่ export ไป HRMI ผ่าน HTTP + email — ที่นี่ export เป็นไฟล์ Excel ให้ทีม HR นำเข้าด้วยมือ)
│
▼
10) ReportModule — สรุปผลประเมิน/การปรับเงินเดือนระดับองค์กรหลักฐาน — โครงสร้าง module: pms-api/src/app.module.ts (branch: uat):83-113, notification cron: pms-api/docs/PMS-Period-Notification-System.md (branch: uat):1-142 + pms-api/src/modules/configNotification/configNotification.controller.ts (branch: uat):27-41, evaluateForm endpoint: pms-api/src/modules/evaluateForm/evaluateForm.controller.ts (branch: uat):28-60, confirmEvaluation endpoint: pms-api/src/modules/confirmEvaluation/confirmEvaluation.controller.ts (branch: uat):24-50, salaryAdjustment endpoint: pms-api/src/modules/salaryAdjustment/salaryAdjustment.controller.ts (branch: uat):25-50, salaryAdjustToHRMI export: pms-api/src/modules/salaryAdjustToHRMI/salaryAdjustToHRMI.service.ts (branch: uat):1-18 (import exceljs)
หมายเหตุความเชื่อมั่นของ flow นี้ — ลำดับ 1-10 ข้างต้นอนุมานจากชื่อ module, endpoint, และความสัมพันธ์ entity เป็นหลัก ไม่ได้ trace โค้ดทีละบรรทัดแบบที่ทำกับ benefit-api/recruitment-api เนื่องจากขนาด service ที่ใหญ่กว่ามาก (service ใหญ่สุดของ repo นี้ยาวเป็น 2 เท่าของ repo อื่น) — ควรถือเป็น โครงกระดูก (skeleton) ที่ยืนยันได้ระดับ module ไม่ใช่ trace เต็มรูปแบบระดับ field-by-field เหมือนบทเดียวกันของ benefit-api
จุดที่ควรรู้
workforce sync ที่ทำงานคู่ขนานกับ flow หลัก
UsagePermissionService.handleCron (@Cron('*/1 * * * *')) ดึงข้อมูล employee trigger queue จาก workforce connection ทุก 1 นาที เพื่ออัปเดตข้อมูลองค์กร/ตำแหน่งให้ตรงกับระบบ workforce กลาง (pms-api/src/modules/usagePermission/usagePermission.service.ts (branch: uat):1698-1937) — ข้อมูลที่ evaluateForm/confirmEvaluation/salaryAdjustment ใช้ (org unit, position, salary range) ขึ้นอยู่กับความสด (freshness) ของ sync job นี้เป็นสำคัญ ถ้า cron หยุดทำงานเงียบ ๆ ข้อมูลองค์กรใน pms-api จะ drift จาก workforce โดยไม่มี alert ใดแจ้ง (ไม่พบ health-check/alert สำหรับ cron นี้)
Budget public endpoint คั่นกลาง flow
GET /budget/getEmployeeSalary เป็น @Public() (pms-api/src/modules/budget/budget.controller.ts (branch: uat):49-53) อยู่ตรงกลางของ flow ปรับเงินเดือน (step 7) — คืนเงินเดือนพนักงานตามหน่วยงานโดยไม่ต้อง login ดูรายละเอียดที่ 06 Scorecard (SEC-PMS-01)
เคล็ดลับตอนทำงานจริง
- ก่อนแก้ logic ในกลุ่ม salary (5 module) ให้ไล่ดู entity
salaryAdjustBu/salaryAdjustHd/salaryAdjustDtก่อนเสมอเพื่อแยกว่าข้อมูลอยู่ระดับหน่วยงาน (Bu) หรือระดับเอกสาร (Hd/Dt) - ถ้า sync จาก
workforceดูเหมือนขาดข้อมูล ให้ตรวจusagePermissioncron ก่อนอันดับแรก เพราะเป็นจุดเดียวที่ sync ข้อมูลองค์กรเข้าpms-apiแบบอัตโนมัติ
ไป บท 3 Persistence →