5.0 KiB
5.0 KiB
Sprint 6.11 Identity / Employee Cleanup Review
Summary
This pass moves the system closer to the target architecture where:
usersis login identityemployeesis employee master- training ownership is based on
employeeId - user actions remain tracked separately
The work completed in this pass focuses on the highest-risk operational paths first:
- schema support for user-to-employee mapping
- stopping employee import from auto-creating users
- employee-owned training records
- employee-based employee directory
- employee-based training matrix compliance
Migration Changes
Migration file:
drizzle/0010_romantic_marauders.sql
Changes included:
- create
user_employee_maps - make
training_records.user_idnullable - make
employee_training_targets.user_idnullable - add
training_records.submitted_by_user_id - add
training_records.reviewed_by_user_id - add unique index
employee_training_targets_org_employee_year_idx - backfill
user_employee_mapsfrom existingusers.employee_id - backfill
submitted_by_user_idfromcreated_by - backfill
reviewed_by_user_idfromreviewed_by
Code Changes
Identity / Mapping
src/db/schema.tssrc/features/employees/server/employee-identity-linking.ts
Added:
user_employee_maps- helper to resolve employee ids for a user
- helper to maintain mapping during import or login linking
Employee Import
src/app/api/import-employees/route.ts
Changed behavior:
- import upserts into
employees - import upserts
employee_training_targetsbyemployeeId - import links existing users when employee code matches
- import no longer auto-creates login users
Employees API
src/app/api/employees/route.tssrc/features/employees/server/employee-data.ts
Changed behavior:
- employees API is active again
mode=optionsreturns active employee options for HRD workflows
Training Records
src/features/training-records/api/types.tssrc/features/training-records/api/service.tssrc/features/training-records/schemas/training-record.tssrc/features/training-records/components/training-record-form.tsxsrc/features/training-records/components/training-record-view-page.tsxsrc/features/training-records/server/training-record-data.tssrc/app/api/training-records/route.tssrc/app/api/training-records/[id]/route.tssrc/app/api/training-records/[id]/review/route.tssrc/app/dashboard/training-records/[trainingRecordId]/page.tsx
Changed behavior:
- training record create/update now uses
employeeIdas owner submittedByUserIdis written on createreviewedByUserIdis written on review- employee self-scope uses mapped employee ids
- HRD employee selector now reads from
employees
Employee Directory
src/features/employee-directory/server/employee-directory-data.tssrc/features/employee-directory/components/employee-directory-detail-page.tsx
Changed behavior:
- directory detail reads from
employees - training summary and transcript use
training_records.employee_id
Training Targets
src/features/training-policy/server/employee-training-target-data.ts
Changed behavior:
- added employee-based target resolution
- user-based target resolution now falls through employee mapping
Training Matrix
src/features/training-matrix/server/training-matrix-data.ts
Changed behavior:
- compliance calculation now uses
employees - approved-course ownership now uses
training_records.employee_id
Regression Checklist
- Run
npm run migrate - Sign in with an existing credentials user
- Import employee Excel with no pre-existing user account
- Verify employee rows are created/updated in
employees - Verify no new
usersrow is auto-created from import - Verify
employee_training_targetsrows are created usingemployee_id - Verify existing users with matching employee code are linked in
user_employee_maps - As employee user with a linked employee profile, create a training record
- Verify
training_records.employee_idis set - Verify
training_records.submitted_by_user_idis set - Review a pending record as HRD
- Verify
training_records.reviewed_by_user_idis set - Open employee directory detail and verify totals still load
- Open training matrix compliance and verify rows still load
Verification
Verified in this pass:
npx tsc --noEmit
Known Remaining Work
This pass does not fully migrate every aggregation path yet.
Still recommended for the next pass:
- move
overviewfully toemployees+training_records.employee_id - move
reportsfully toemployees+training_records.employee_id - reduce remaining dependency on
users.employeeCodeas compatibility fallback - add Keycloak runtime mapping using
user_employee_maps
Risk Notes
- some runtime paths still keep compatibility writes to legacy columns
users.employeeIdstill exists as fallback and compatibility support- notifications still depend on login users, so employees without user accounts will not receive login-bound notifications