Files
alla-tms/plans/sprint-6-12-employee-ownership-final-migration.md
2026-07-16 09:53:14 +07:00

249 lines
5.3 KiB
Markdown

You are a Senior Full Stack Engineer and Solution Architect.
Project:
Training Management System (TMS)
Current status:
Sprint 6.11 Identity / Employee Cleanup completed.
Current task:
Implement Sprint 6.12 Employee Ownership Final Migration and Employee Directory Data Source Validation.
Goal:
Finish migration from user-owned training data to employee-owned training data for employee directory, dashboard, reports, and remaining aggregation paths.
Important constraints:
- Do NOT break existing credential login.
- Do NOT remove legacy columns yet.
- Do NOT remove users.employeeCode fallback yet unless fully safe.
- Do NOT change business features.
- Keep Auth.js working.
- Keep Drizzle ORM.
- Keep Thai UI.
- Minimal-impact changes only.
Part 0: Employee Directory Data Source Validation
Update:
- src/features/employee-directory/server/employee-directory-data.ts
- src/app/dashboard/employee-directory/page.tsx
- src/app/dashboard/employee-directory/[id]/page.tsx
- related employee directory components
Requirements:
1. Employee Directory list must use employees as the primary source.
The page:
- รายชื่อพนักงานทั้งหมด
Must read from:
- employees
Not from:
- users
2. Employee Directory table must show:
- รหัสพนักงาน from employees.employeeCode
- ชื่อพนักงาน from employees.displayName or firstNameTh + lastNameTh
- ฝ่าย/แผนก from employees.departmentId / department relation
- ตำแหน่ง from employees.positionId / position relation
3. Employee Directory detail must use employees as the primary source.
Detail page must show:
ข้อมูลทั่วไปพนักงาน:
- employeeCode
- displayName
- email
- companyName / company
- department
- position
- status
4. Training summary must use:
- training_records.employee_id = employees.id
Calculate:
- approved hours
- pending hours
- rejected hours
- total submitted hours
- K/S/A approved hours
5. Target resolution must use:
Priority:
1. employee_training_targets.employee_id
2. training_policy default
Do not use userId target resolution as primary.
6. Search must use employees fields:
Search by:
- employees.employeeCode
- employees.displayName
- employees.email
- department name
- position name
7. Filters must use employees fields:
- department
- position
- status
- company if available
8. Permission:
HRD/Admin:
- can access employee directory
Employee:
- cannot access employee directory by menu or direct URL
9. Do not require employee to have user account.
Important:
An employee imported into employees but without a linked user account must still appear in Employee Directory.
Part 1: Overview Dashboard Migration
Update:
- src/features/overview/server/overview-data.ts
Requirements:
1. Employee dashboard must resolve current employee through:
- user_employee_maps
- fallback users.employeeId if still exists
- fallback users.employeeCode only if needed
2. Employee dashboard must aggregate from:
- employees
- training_records.employee_id
3. HRD dashboard must use:
- employees as employee source
- training_records.employee_id as training ownership source
4. Pass/fail calculation must use:
- employee_training_targets.employee_id if exists
- fallback Training Policy
5. Avoid using users as the primary employee source.
Part 2: Reports Migration
Update:
- src/features/reports/server/report-data.ts
- src/app/api/reports/export/route.ts if needed
Requirements:
1. Employee Transcript:
- Employee users see only their mapped employee record.
- HRD/Admin can view organization employees.
- Data source must be employees + training_records.employee_id.
2. Training Matrix:
- Use employees + training_records.employee_id.
- Keep existing matrix behavior.
3. Department Summary:
- Count employees from employees table.
- Aggregate training hours from training_records.employee_id.
4. Annual Summary:
- Aggregate by employee-owned training records.
5. Export Excel/PDF must remain working.
Part 3: Employee Target Resolution
Update:
- src/features/training-policy/server/employee-training-target-data.ts
Requirements:
1. Resolve target by employeeId first.
2. Fallback to policy.
3. Avoid userId target resolution except legacy compatibility.
Part 4: Reduce Legacy Dependency
Search and review remaining usage of:
- users.employeeCode
- users.employeeId
- training_records.userId
Do not delete them yet.
Create a list of:
- still required
- can be migrated later
- safe to remove in future cleanup
Part 5: Regression
Validate:
- Employee login
- Employee dashboard
- HRD dashboard
- Employee Directory list
- Employee Directory detail
- Employee imported without user appears in Employee Directory
- Employee transcript
- Department summary
- Annual summary
- Training matrix
- Training record create
- HRD review
- Import employee
- Employee target import
Part 6: Output Review File
Create:
docs/sprint-6-12-employee-ownership-final-migration-review.md
Include:
1. Summary
2. Files Changed
3. Employee Directory Data Source Validation
4. Overview Migration
5. Reports Migration
6. Target Resolution Changes
7. Remaining Legacy Dependencies
8. Regression Checklist
9. Risks
10. Recommendation Before Sprint 7.2
Return:
- Complete code changes with file paths
- Review file
- Migration commands if required