313 lines
7.0 KiB
Markdown
313 lines
7.0 KiB
Markdown
You are a Senior Full Stack Engineer.
|
|
|
|
Project:
|
|
Training Management System (TMS)
|
|
|
|
Current task:
|
|
Enhance Employee Import to support employee-specific K/S/A training hour targets.
|
|
|
|
Requirement:
|
|
When HRD imports employees, the Excel template must support importing individual training hour targets per employee.
|
|
|
|
Target fields:
|
|
|
|
- ชั่วโมงรวม
|
|
- ชั่วโมง K
|
|
- ชั่วโมง S
|
|
- ชั่วโมง A
|
|
|
|
Important constraints:
|
|
|
|
- Do NOT remove existing employee import functionality.
|
|
- Do NOT break existing employee import template.
|
|
- Do NOT change folder structure.
|
|
- Keep Thai UI.
|
|
- Keep responsive/mobile behavior.
|
|
- Minimal-impact changes only.
|
|
- Use Drizzle ORM.
|
|
- Use existing Auth.js authorization.
|
|
|
|
Business rule:
|
|
Training Policy remains the default organization-wide target.
|
|
Employee-specific target overrides Training Policy for that employee and year.
|
|
|
|
Priority:
|
|
|
|
1. Employee-specific target
|
|
2. Training Policy default
|
|
|
|
Example:
|
|
Training Policy 2569:
|
|
|
|
- Total = 30
|
|
- K = 12
|
|
- S = 12
|
|
- A = 6
|
|
|
|
Employee AC2026 imported with:
|
|
|
|
- Total = 60
|
|
- K = 24
|
|
- S = 24
|
|
- A = 12
|
|
|
|
Dashboard and reports for AC2026 must use:
|
|
|
|
- Total = 60
|
|
- K = 24
|
|
- S = 24
|
|
- A = 12
|
|
|
|
Part 1: Database
|
|
|
|
Add new table if not existing:
|
|
|
|
employee_training_targets
|
|
|
|
Fields:
|
|
|
|
- id
|
|
- organizationId
|
|
- employeeId or userId
|
|
- year
|
|
- totalHours
|
|
- kHours
|
|
- sHours
|
|
- aHours
|
|
- createdBy
|
|
- updatedBy
|
|
- createdAt
|
|
- updatedAt
|
|
|
|
Recommended unique constraint:
|
|
|
|
- organizationId + employeeId/userId + year
|
|
|
|
Important:
|
|
Use whichever identifier is currently stable in the system:
|
|
|
|
- employeeId if employee table is the source of truth
|
|
- userId if users table stores employeeCode and is used by dashboard/report
|
|
|
|
Do not duplicate targets for the same employee/year.
|
|
If importing again:
|
|
|
|
- update existing target
|
|
|
|
Part 2: Excel Template
|
|
|
|
Update employee import template headers.
|
|
|
|
Existing headers:
|
|
|
|
- รหัสพนักงาน
|
|
- ชื่อพนักงาน
|
|
- อีเมล
|
|
- บริษัท
|
|
- แผนก
|
|
- ตำแหน่ง
|
|
- สถานะ
|
|
|
|
Add:
|
|
|
|
- ชั่วโมงรวม
|
|
- ชั่วโมง K
|
|
- ชั่วโมง S
|
|
- ชั่วโมง A
|
|
|
|
Final headers:
|
|
|
|
- รหัสพนักงาน
|
|
- ชื่อพนักงาน
|
|
- อีเมล
|
|
- บริษัท
|
|
- แผนก
|
|
- ตำแหน่ง
|
|
- สถานะ
|
|
- ชั่วโมงรวม
|
|
- ชั่วโมง K
|
|
- ชั่วโมง S
|
|
- ชั่วโมง A
|
|
|
|
Part 3: Import Validation
|
|
|
|
Validation rules:
|
|
|
|
1. Existing employee fields remain unchanged.
|
|
|
|
2. K/S/A target fields are optional.
|
|
|
|
3. If all target fields are empty:
|
|
|
|
- import employee normally
|
|
- do not create employee-specific target
|
|
- dashboard/report fallback to Training Policy
|
|
|
|
4. If any target field is filled:
|
|
|
|
- all 4 fields are required:
|
|
- ชั่วโมงรวม
|
|
- ชั่วโมง K
|
|
- ชั่วโมง S
|
|
- ชั่วโมง A
|
|
|
|
5. Values must be numeric.
|
|
|
|
6. Values must be >= 0.
|
|
|
|
7. ชั่วโมงรวม must be > 0.
|
|
|
|
8. ชั่วโมง K + ชั่วโมง S + ชั่วโมง A must equal ชั่วโมงรวม.
|
|
|
|
9. Year:
|
|
|
|
- use current selected/import year if import UI has year filter
|
|
- otherwise use current year
|
|
- for Thai year 2569 store as Gregorian 2026 if existing app uses Gregorian year
|
|
|
|
Thai error messages:
|
|
|
|
- กรุณาระบุชั่วโมงรวม
|
|
- กรุณาระบุชั่วโมง K
|
|
- กรุณาระบุชั่วโมง S
|
|
- กรุณาระบุชั่วโมง A
|
|
- ชั่วโมงต้องเป็นตัวเลข
|
|
- ชั่วโมงรวมต้องมากกว่า 0
|
|
- ผลรวมของชั่วโมง K/S/A ต้องเท่ากับชั่วโมงรวม
|
|
|
|
Part 4: Import Behavior
|
|
|
|
For each valid row:
|
|
|
|
1. Upsert employee/user as existing behavior.
|
|
|
|
2. If K/S/A target fields are provided:
|
|
|
|
- upsert employee_training_targets by employee/year
|
|
- update target values if already exists
|
|
|
|
3. Import result summary must include:
|
|
|
|
- จำนวนพนักงานที่นำเข้า
|
|
- จำนวนเป้าหมาย K/S/A ที่นำเข้า
|
|
- จำนวนรายการที่ใช้ค่า Training Policy เริ่มต้น
|
|
- จำนวนรายการผิดพลาด
|
|
|
|
Part 5: Employee Import Page UI
|
|
|
|
Update right-side supported template card to show:
|
|
|
|
- รหัสพนักงาน
|
|
- ชื่อพนักงาน
|
|
- อีเมล
|
|
- บริษัท
|
|
- แผนก
|
|
- ตำแหน่ง
|
|
- สถานะ
|
|
- ชั่วโมงรวม
|
|
- ชั่วโมง K
|
|
- ชั่วโมง S
|
|
- ชั่วโมง A
|
|
|
|
Add helper text:
|
|
|
|
- หากไม่ระบุชั่วโมง K/S/A ระบบจะใช้ค่าเริ่มต้นจาก Training Policy
|
|
|
|
Part 6: Dashboard Impact
|
|
|
|
Update dashboard target resolution:
|
|
|
|
For employee dashboard:
|
|
|
|
1. Check employee_training_targets for employee/year.
|
|
2. If found, use employee-specific target.
|
|
3. If not found, use Training Policy.
|
|
|
|
For HRD dashboard:
|
|
|
|
- Passed / Not Passed calculation should use each employee's individual target when available.
|
|
- Otherwise fallback to Training Policy.
|
|
|
|
Part 7: Reports Impact
|
|
|
|
Update reports if target is shown or used:
|
|
|
|
- Training Matrix
|
|
- Employee Transcript
|
|
- Department Summary if it uses target pass/fail
|
|
- Annual Summary if it uses target pass/fail
|
|
|
|
Rule:
|
|
Use employee-specific target first, fallback to policy.
|
|
|
|
Part 8: Permissions
|
|
|
|
Only HRD/Admin can import targets.
|
|
|
|
Employee:
|
|
|
|
- cannot modify target
|
|
- can only see calculated progress based on assigned target
|
|
|
|
Part 9: Audit Log
|
|
|
|
Add audit event when target is created/updated during import.
|
|
|
|
Events:
|
|
|
|
- EMPLOYEE_TARGET_CREATE
|
|
- EMPLOYEE_TARGET_UPDATE
|
|
|
|
Include:
|
|
|
|
- employeeCode
|
|
- year
|
|
- old target
|
|
- new target
|
|
|
|
Part 10: Output Review File
|
|
|
|
Create:
|
|
|
|
docs/management-change-import-employee-ksa-targets-review.md
|
|
|
|
Include:
|
|
|
|
1. Summary
|
|
2. Files Changed
|
|
3. Database Changes
|
|
4. Excel Template Changes
|
|
5. Validation Rules
|
|
6. Import Behavior
|
|
7. Dashboard Impact
|
|
8. Reports Impact
|
|
9. Audit Events
|
|
10. Permission Rules
|
|
11. Manual Test Checklist
|
|
12. Known Limitations
|
|
|
|
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.
|
|
|
|
Return:
|
|
|
|
- Complete code changes with file paths.
|
|
- Migration command if required.
|
|
- Content of docs/management-change-import-employee-ksa-targets-review.md.
|