3.4 KiB
3.4 KiB
You are a Senior Full Stack Engineer and Solution Architect.
Project: Training Management System (TMS)
Current task: Refactor Identity/User and Employee Master architecture.
Business decision: Separate user login accounts from employee master data.
Concept:
-
"พนักงาน" menu:
- Manage user login accounts
- Role
- Provider
- Keycloak mapping
- User access
-
"รายชื่อพนักงานทั้งหมด" menu:
- View employee master data
- Training hours
- K/S/A targets
- Training history
Important constraints:
- Do NOT break existing login.
- Do NOT remove existing users table.
- Do NOT remove existing training records.
- Use migration safely.
- Use Drizzle ORM.
- Keep Thai UI.
- Keep responsive/mobile behavior.
- Implement in small safe steps.
Architecture requirement:
- Users table should represent login identity only.
Users should store:
- id
- organizationId
- username
- employeeCode
- employeeId nullable
- provider
- providerUserId
- role
- status
- lastLoginAt
- createdAt
- updatedAt
- Employees table should represent HR employee master.
Employees should store:
- id
- organizationId
- employeeCode
- prefix
- firstNameTh
- lastNameTh
- firstNameEn
- lastNameEn
- displayName
- phone
- companyName or companyId
- departmentId
- positionId
- status
- hiredAt
- createdAt
- updatedAt
- Auto map user with employee.
Mapping logic:
- Keycloak sends attribute: empcode
- System maps: empcode -> employees.employeeCode
- If found: users.employeeId = employees.id users.employeeCode = employees.employeeCode
- If not found: login can be blocked or user can be created without employee link based on config. For MVP, create user but mark employeeId = null and show "ยังไม่เชื่อมโยงข้อมูลพนักงาน".
- Employee Import:
- Import employees into employees table.
- Do not create user login account automatically unless explicitly configured.
- If imported employeeCode matches existing users.employeeCode: auto-link users.employeeId.
- Training Records:
- Prefer employeeId as owner of training record.
- Keep userId only as submittedBy if existing.
- New records should save: employeeId submittedByUserId
- Employee-specific targets:
- Link to employeeId.
- Reports and Dashboard:
- Use employees as master source.
- Use training_records.employeeId for aggregation.
- Use user only for authentication/session.
- Sidebar: Under "ข้อมูลหลัก":
- พนักงาน Purpose: User Login Management
- รายชื่อพนักงานทั้งหมด Purpose: Employee Directory + Training Summary
- หลักสูตร
- นโยบาย
- ประกาศ
- Permissions: HRD/Admin:
- can view employee directory
- can manage user accounts if allowed
Employee:
- cannot view employee directory
- can view own dashboard/training history
- Output Review File: Create: docs/identity-employee-separation-review.md
Include:
- Summary
- Architecture Changes
- Database Changes
- Migration Strategy
- User Login Behavior
- Keycloak Mapping Behavior
- Employee Import Behavior
- Training Record Impact
- Dashboard Impact
- Reports Impact
- Permission Rules
- Manual Test Checklist
- Rollback Plan
- Known Limitations
Return:
- Complete code changes with file paths
- Migration commands
- Review file
- Remaining risks