# Management Change Import Employee KSA Targets Review ## 1. Summary เพิ่มการนำเข้าชั่วโมงเป้าหมายรายบุคคล K/S/A ผ่านหน้า Import Employees โดยยังคงพฤติกรรมเดิมของการนำเข้าพนักงานไว้ครบถ้วน และเพิ่ม fallback จาก `Training Policy` เมื่อแถวใดไม่ระบุเป้าหมายรายบุคคล ลำดับการ resolve เป้าหมายที่ระบบใช้หลังการเปลี่ยนแปลง: 1. `employee_training_targets` 2. `training_policies` 3. ค่าเริ่มต้น 0 ชั่วโมง ## 2. Files Changed - `src/db/schema.ts` - `src/constants/thai-labels.ts` - `src/features/training-policy/server/employee-training-target-data.ts` - `src/features/import-employees/api/types.ts` - `src/app/api/import-employees/route.ts` - `src/app/api/import-employees/template/route.ts` - `src/features/import-employees/components/employee-import-page.tsx` - `src/features/audit-logs/server/audit-service.ts` - `src/features/audit-logs/server/audit-log-data.ts` - `src/features/overview/server/overview-data.ts` - `src/features/reports/api/types.ts` - `src/features/reports/server/report-data.ts` - `src/features/reports/components/reports-page-content.tsx` ## 3. Database Changes เพิ่มตาราง `employee_training_targets` - `id` - `organization_id` - `user_id` - `year` - `total_hours` - `k_hours` - `s_hours` - `a_hours` - `created_by` - `updated_by` - `created_at` - `updated_at` Unique constraint: - `organization_id + user_id + year` เหตุผลที่ใช้ `user_id`: - ระบบ runtime ปัจจุบันใช้ `users` เป็น source of truth - dashboard, reports, training records อ้างอิง `training_records.user_id` ## 4. Excel Template Changes เพิ่มคอลัมน์ท้าย template: - `ชั่วโมงรวม` - `ชั่วโมง K` - `ชั่วโมง S` - `ชั่วโมง A` Template download ตัวอย่างแถวข้อมูลถูกอัปเดตให้มีคอลัมน์ใหม่ครบ ## 5. Validation Rules กติกา validation ที่เพิ่ม: - ถ้าไม่กรอกคอลัมน์ target ทั้ง 4 ช่อง จะ import พนักงานตามปกติ - ถ้ากรอก target อย่างน้อย 1 ช่อง ต้องกรอกให้ครบทั้ง 4 ช่อง - ต้องเป็นตัวเลข - ต้องมากกว่าหรือเท่ากับ 0 - `ชั่วโมงรวม` ต้องมากกว่า 0 - `K + S + A` ต้องเท่ากับ `ชั่วโมงรวม` - ปีที่ใช้บันทึก target จะใช้ปีปัจจุบัน หรือปีที่ส่งมาจาก form ถ้ามี - ถ้าส่งปีแบบ พ.ศ. ระบบจะแปลงเป็น ค.ศ. ก่อนจัดเก็บ ข้อความ error หลักที่รองรับ: - `กรุณาระบุชั่วโมงรวม` - `กรุณาระบุชั่วโมง K` - `กรุณาระบุชั่วโมง S` - `กรุณาระบุชั่วโมง A` - `ชั่วโมงต้องเป็นตัวเลข` - `ชั่วโมงต้องเป็นตัวเลขที่มากกว่าหรือเท่ากับ 0` - `ชั่วโมงรวมต้องมากกว่า 0` - `ผลรวมของชั่วโมง K/S/A ต้องเท่ากับชั่วโมงรวม` ## 6. Import Behavior ต่อ 1 แถวที่ผ่าน validation: 1. upsert `users` และ `memberships` ตาม behavior เดิม 2. ถ้ามี target รายบุคคล จะ upsert `employee_training_targets` 3. ถ้าไม่มี target รายบุคคล ระบบจะถือว่าแถวนั้นใช้ fallback จาก `Training Policy` Import summary ที่เพิ่ม: - จำนวนเป้าหมาย K/S/A ที่นำเข้า - จำนวนรายการที่ใช้ `Training Policy` ## 7. Dashboard Impact Employee dashboard: - ใช้ target รายบุคคลก่อน - ถ้าไม่พบ target รายบุคคล จะ fallback ไป `Training Policy` - K/S/A progress และ completion cards จะอิง target ที่ resolve แล้ว HRD dashboard: - การคำนวณ `ผ่านเป้าหมาย` และ `ยังไม่ผ่านเป้าหมาย` เปลี่ยนเป็นใช้ target รายคน - ถ้าไม่พบ target รายคน จะ fallback ไป `Training Policy` ## 8. Reports Impact Training Matrix: - เพิ่มข้อมูล `approvedHours` - เพิ่มข้อมูล `targetHours` - เพิ่ม `targetSource` - เพิ่ม `targetStatus` รายงานหน้า UI จะแสดง: - ชั่วโมงอนุมัติ - เป้าหมายชั่วโมง - แหล่งที่มาของเป้าหมาย - สถานะผ่าน/ยังไม่ผ่านเป้าหมาย ## 9. Audit Events เพิ่ม audit actions: - `EMPLOYEE_TARGET_CREATE` - `EMPLOYEE_TARGET_UPDATE` ข้อมูลที่บันทึก: - `employeeCode` - `year` - ค่า target เดิม - ค่า target ใหม่ ## 10. Permission Rules - ใช้ `requireHRD()` เหมือนเดิม - เฉพาะ HRD/Admin ที่เข้าถึง import route ได้ - พนักงานไม่มี route สำหรับแก้ target รายบุคคลโดยตรง ## 11. Manual Test Checklist - [ ] Download template includes K/S/A target columns. - [ ] Import employee without K/S/A target works. - [ ] Import employee with valid target works. - [ ] Import creates employee-specific target. - [ ] Re-import updates existing employee target. - [ ] Import blocks missing partial target fields. - [ ] Import blocks non-numeric target fields. - [ ] Import blocks K+S+A not equal total. - [ ] Import summary shows target counts. - [ ] Employee dashboard uses employee target. - [ ] Employee dashboard falls back to Training Policy when no target exists. - [ ] HRD dashboard pass/fail uses employee target. - [ ] Training Matrix uses employee target. - [ ] Audit log records target create/update. - [ ] Employee cannot edit target directly. - [ ] Mobile import page remains responsive. ## 12. Known Limitations - Import UI ปัจจุบันยังไม่มี year picker แยก จึงใช้ปีปัจจุบันเป็นค่า default - Export header ของรายงานยังควรทดสอบกับข้อมูลจริงอีกครั้งหลัง migrate/seed - การ import ต่อแถวไม่ได้ห่อ transaction แยกทั้งแถว จึงเป็น partial success ได้ตาม behavior เดิมของระบบ