Skip to main content

Training Enrollment - Implementation Overview

Last Updated: 2026-01-04 Status: Phase 3 Complete - Phase 4 Blocked


Feature Summary

Training Enrollment allows contractors to submit worker lists for safety training sessions. Safety Officers review and approve enrollments, creating training attendance records.

  • Worker Registry - Source of worker data for enrollment
  • Training Settings - Training schedules, sessions, and approvals dashboard

Key Capabilities

  • Select workers from contractor's Worker Registry
  • Choose available training sessions with capacity tracking
  • Safety Officer approval workflow
  • Automatic attendance record creation on approval

Implementation Roadmap


Phase Details

Phase 1: Seed Data Enhancement ✅

Status: Completed Objective: Provide test data for development

DeliverableDescription
Training SchedulesAdded "Generic Safety Training" schedule
Training Sessions8 sessions for Jan-Feb 2026
Waitlist Testing1 full session for waitlist scenario

Phase 2: Session & Worker Data Integration ✅

Status: Complete Objective: Connect form to real backend data

Sub-PhaseStatusDescription
2.1 Sessions EndpointEnhanced DTO with schedule details
2.2 Workers EndpointGET /api/workers/contractor/{id}/enrollment
2.3 Frontend Servicetraining-enrollment.service.ts
2.4 Form ComponentUI with session dropdown, worker table

Phase 3: Pre-Approval Validation ✅

Status: Complete Objective: Validate enrollment before SO approval

Validation RuleStatusDescription
Blacklist CheckNo blacklisted workers (shown with warning)
Document CheckID card + profile photo status visible
Duplicate CheckSystem prevents duplicate enrollments
Session CheckSession availability verified
Attachments ViewView all worker attachments from popup

Phase 4: Change Request & Rejection Reasons ⚠️

Status: Blocked - Infinite Loop Issue Objective: Structured reasons for workflow actions

Blocked

Adding reason dropdown causes infinite loop (1726 errors) due to Signal cascading with Zoneless Angular + Material Dialog. Commands work without reasons, but fail when dropdown is added.

ActionPreset Reasons (Planned)
Request ChangeDocuments incomplete, Blacklisted worker, Session full, Duplicate enrollment
RejectNot authorized, No project, Policy violations

Phase 5: Database Integration ❌

Status: Pending Objective: Proper database updates on approval


Phase 6: Document Generation (PDF) ❌

Status: Pending Objective: Generate approval document with QuestPDF

Document ElementDescription
HeaderLogo, reference number, date
Training InfoSchedule, date, time, location
Worker ListName, ID card for each selected worker
SignatureApprover signature block
QR CodeLink to task for verification

Phase 7: Testing & Documentation ❌

Status: Pending Objective: Comprehensive testing and documentation

Test TypeLocation
HTTP Testsbackend/tests/http/training-enrollment/
E2E Testsfrontend/e2e/features/training-enrollment.spec.ts
Feature DocsThis page + workflow documentation

Workflow Overview


DocumentDescription
Workflow DetailsStates, commands, form fields
Implementation Plan

Detailed technical plan is in .claude/plans/training-enrollment-implementation.md (codebase only)


Progress Summary

PhaseDescriptionStatus
1Seed Data Enhancement✅ Complete
2Session & Worker Data Integration✅ Complete
3Pre-Approval Validation✅ Complete
4Change Request & Rejection Reasons⚠️ Blocked
5Database Integration & Approval Processing❌ Pending
6Document Generation (PDF)❌ Pending
7Testing & Documentation❌ Pending

Overall Progress: 3 / 7 phases (~43%) - Phase 4 blocked by infinite loop issue