Skip to main content

Training Management

Revision 1.1 (2026-01-01) - Bug fixes during testing

Feature Summary

Training Management (จัดการการอบรม) allows Safety Officers to manage training schedules, sessions, and approvals for workers. The feature supports schedule definition, session generation, and batch approval workflows.

Key Capabilities:

  • Define recurring training schedules (weekly, monthly, quarterly)
  • Generate training sessions from schedules
  • Manage session capacity and enrollment
  • Approve training results (individual, by session, or by contractor)
  • Sync training status with Worker Registry

Role Matrix

Revision 1.1 (2026-01-01) - Bug fixes during testing

ActionAdminPurchasingWork OwnerSafety OfficerWorkspace OwnerContractor
View schedules
Create schedule
Edit schedule
Delete schedule
Generate sessions
View sessionsAvailable slots only
Create session
Edit session
Cancel session
View pending approvals
Approve training

Legend:

  • ✅ = Full access
  • ❌ = No access
  • Available slots only = Can view open sessions for enrollment purposes

Backend Test Report

Location: backend/tests/http/training/training.http Tested: 2026-01-01

Bug Fixes Applied During Testing

BugRoot CauseFix
Create Schedule returns 400LINQ DefaultIfEmpty(0).MaxAsync() can't be translated to SQLChanged to nullable max pattern MaxAsync(x => (int?)x.MasterId) ?? 0
Search Sessions returns 403Policies() requires ALL roles (AND logic), not ANY (OR logic)Added composite policy training-sessions-search for OR logic

API Endpoints

MethodEndpointDescriptionTested
POST/api/training-schedules/searchSearch training schedules
GET/api/training-schedules/get/{id}Get schedule details
POST/api/training-schedules/createCreate new schedule
POST/api/training-schedules/saveUpdate schedule
POST/api/training-schedules/removeDelete schedule
POST/api/training-schedules/{id}/generate-sessionsGenerate sessions from schedule
POST/api/training-sessions/searchSearch training sessions
GET/api/training-sessions/get/{id}Get session details
GET/api/training-sessions/available-slotsGet available slots for enrollment
POST/api/training-sessions/createCreate new session
POST/api/training-sessions/saveUpdate session
POST/api/training-sessions/cancelCancel session
GET/api/training-approvals/session/{id}Get attendances by session
GET/api/training-approvals/contractor/{id}Get attendances by contractor
GET/api/training-approvals/pendingGet pending approvals
POST/api/training-approvals/approveApprove selected attendances
POST/api/training-approvals/approve-by-sessionApprove all in session
POST/api/training-approvals/approve-by-contractorApprove all for contractor

Test Results by Role

Test SectionAdminSafety OfficerContractor
Search Schedules (1.x)403403
Get Schedule (2.x)-403
Create Schedule (3.x)-403
Save Schedule (4.x)-403
Generate Sessions (5.x)-403
Search Sessions (6.x)-
Get Available Slots (7.x)403403
Get Session (8.x)-403
Create Session (9.x)-403
Save Session (10.x)-403
Cancel Session (11.x)-403
Get Session Attendances (12.x)-403
Get Contractor Attendances (13.x)-403
Get Pending Attendances (14.x)-403
Approve Attendances (15.x)403403
Approve By Session (16.x)-403
Approve By Contractor (17.x)-403
Remove Schedule (18.x)-403

Total: 55 test cases covering all endpoints and roles

Frontend Test Report

Location: frontend/e2e/training.spec.ts Tested: 2026-01-01

E2E Test Results

Test IDDescriptionResult
TC-TRN-1Safety Officer can access training management✅ Pass
TC-TRN-2Admin can view training settings⏭️ Skip
TC-TRN-3Contractor cannot access training management✅ Pass
TC-TRN-4Safety Officer can create training schedule✅ Pass
TC-TRN-5Safety Officer can generate sessions from schedule✅ Pass
TC-TRN-6Safety Officer can view session list✅ Pass
TC-TRN-7Safety Officer can view approval dashboard✅ Pass
TC-TRN-8Safety Officer can filter by session✅ Pass
TC-TRN-9Safety Officer can filter by contractor✅ Pass
TC-TRN-10Safety Officer can delete schedule✅ Pass

Summary: 9 passed, 1 skipped

Note: TC-TRN-2 skipped due to test environment issue (login form state persists between contexts). Admin access verified via backend HTTP tests (55/55 passed).

Components Tested

  • training-setting.component.ts - Main container with 3 tabs
  • training-schedule-list.component.ts - Schedule list table
  • training-schedule-list-toolbar.component.ts - Toolbar with search
  • training-schedule-form.component.ts - Schedule create/edit form
  • training-session-list.component.ts - Session list table
  • training-session-list-toolbar.component.ts - Session filters
  • training-session-form.component.ts - Session create/edit form
  • training-approval-dashboard.component.ts - Approval dashboard with bulk actions
  • dialog-generate-sessions.component.ts - Generate sessions dialog
  • dialog-approve-training.component.ts - Approve training dialog

Manual Test Cases

Prerequisites

  • Backend server running on http://localhost:5000
  • Frontend running on http://localhost:4200
  • Test accounts available (see Test Data section)
  • Modern browser (Chrome recommended)
  • Seed data includes sample schedules and sessions

Test Data

Test Users

RoleEmailPasswordAccess Level
Admintn@thaiscada.comTest1234*View only, no add/edit
Safety Officersafety-supervisor@outlook.comTest1234*Full CRUD access
Contractorsafety-contractor1-0@outlook.comTest1234*No access

Test Data for Creating Schedules

FieldValue
ชื่อตารางอบรม (Name)การอบรมความปลอดภัยทดสอบ
ความจุเริ่มต้น (Default Capacity)30
สถานที่ (Location)ห้องอบรมทดสอบ

Safety Officer: เครื่องมือ (Tools) → จัดการการอบรม (Training Management) URL: /tools/settings/training

Test Summary

CategoryTotal
1. Navigation & Access4
2. Schedule Management5
3. Session Management4
4. Approval Dashboard5
5. Bulk Operations3
Total21

1. Navigation & Access Tests

TC-TRN-M001: Safety Officer can access training management

Precondition: User is logged in as Safety Officer

StepActionExpected Result
1Click "เครื่องมือ" (Tools) menu in headerTools dropdown menu opens
2Locate "จัดการการอบรม" menu itemMenu item visible
3Click "จัดการการอบรม"Page loads
4Verify URLURL is /tools/settings/training
5Verify page title"จัดการการอบรม" header visible
6Verify all 3 tabs visibleตารางอบรม, รอบอบรม, อนุมัติผลอบรม

TC-TRN-M002: Admin can view training management (read-only)

Precondition: User is logged in as Admin

StepActionExpected Result
1Login as Admin: tn@thaiscada.comLogin successful
2Navigate to เครื่องมือ → จัดการการอบรมTraining management page loads
3Verify schedule list displayedTable with schedules visible
4Verify "เพิ่มตารางอบรม" button NOT visibleAdd button NOT present
5Verify tabs are accessibleCan switch between tabs

Admin can view training data but cannot create/edit/delete.


TC-TRN-M003: Contractor cannot access training management

Precondition: User is logged in as Contractor

StepActionExpected Result
1Login as Contractor: safety-contractor1-0@outlook.comLogin successful
2Try direct URL navigation to /tools/settings/trainingRedirected or access denied
3Verify no training menu visibleMenu item hidden for contractors

Contractors do NOT have access to training management.


TC-TRN-M004: Verify tab navigation

Precondition: Logged in as Safety Officer, on Training Management page

StepActionExpected Result
1Verify "ตารางอบรม" tab is activeFirst tab selected by default
2Click "รอบอบรม" tabSession list displayed
3Click "อนุมัติผลอบรม" tabApproval dashboard displayed
4Click "ตารางอบรม" tabSchedule list displayed

2. Schedule Management Tests

TC-TRN-M005: View schedule list

Precondition: Logged in as Safety Officer, on Training Management page

StepActionExpected Result
1Verify schedule table displayedTable visible with column headers
2Verify table columnsชื่อตารางอบรม, รูปแบบการเกิดซ้ำ, ความจุ, สถานที่, จำนวนรอบ, สถานะ
3Verify each row has actionsแก้ไข button and options menu (⌄)
4Click options menuDropdown shows: สร้างรอบอบรม, ลบ

TC-TRN-M006: Create new schedule

Precondition: Logged in as Safety Officer

StepActionExpected Result
1Click "เพิ่มตารางอบรม" buttonSchedule form opens
2Enter schedule nameField accepts Thai text
3Set recurrence typeDropdown with options: ไม่มี, รายสัปดาห์, รายเดือน, รายไตรมาส
4Set default capacityNumber field accepts value
5Enter default locationField accepts text
6Click "บันทึก"Save triggered
7Verify success snackbar"บันทึกสำเร็จ" message appears
8Verify schedule in listNew schedule visible in table

TC-TRN-M007: Edit existing schedule

Precondition: Schedule exists in list

StepActionExpected Result
1Click "แก้ไข" on schedule rowEdit form opens with data
2Modify schedule nameField updated
3Click "บันทึก"Save triggered
4Verify success snackbar"บันทึกสำเร็จ" message appears
5Verify updated name in listChange reflected in table

TC-TRN-M008: Generate sessions from schedule

Precondition: Schedule with recurrence exists

StepActionExpected Result
1Click options menu (⌄) on scheduleDropdown opens
2Click "สร้างรอบอบรม"Generate sessions dialog opens
3Select date rangeDate pickers functional
4Click confirm buttonSessions generated
5Switch to "รอบอบรม" tabGenerated sessions visible

TC-TRN-M009: Delete schedule

Precondition: Schedule with no linked sessions exists

StepActionExpected Result
1Click options menu (⌄) on scheduleDropdown opens
2Click "ลบ"Confirmation dialog appears
3Verify dialog text"ยืนยันการลบตารางอบรม" message
4Click "ตกลง"Delete triggered
5Verify success snackbar"ลบสำเร็จ" message appears
6Verify schedule removedSchedule no longer in list

3. Session Management Tests

TC-TRN-M010: View session list

Precondition: On "รอบอบรม" tab

StepActionExpected Result
1Click "รอบอบรม" tabSession list displayed
2Verify date filter controlsFrom date and To date fields present
3Verify status filterDropdown with: ทั้งหมด, Open, Full, Closed, Completed, Cancelled
4Verify table columnsวันที่, ประเภท, สถานที่, ความจุ, ลงทะเบียน, สถานะ

TC-TRN-M011: Filter sessions by date

Precondition: On "รอบอบรม" tab with sessions

StepActionExpected Result
1Set From date to specific dateDate picker functional
2Set To date to specific dateDate picker functional
3Click search/refreshSessions filtered by date range
4Verify only matching sessions shownResults match filter criteria

TC-TRN-M012: Filter sessions by status

Precondition: On "รอบอบรม" tab

StepActionExpected Result
1Select "Open" from status filterFilter applied
2Verify only Open sessions shownAll rows show Open status
3Select "Full" from status filterFilter changed
4Verify only Full sessions shownAll rows show Full status

TC-TRN-M013: Create manual session

Precondition: On "รอบอบรม" tab

StepActionExpected Result
1Click add session buttonSession form opens
2Select session dateDate picker functional
3Select session type (Morning/Afternoon/FullDay)Dropdown functional
4Enter capacityNumber accepted
5Enter locationText accepted
6Click "บันทึก"Session created
7Verify session in listNew session visible

4. Approval Dashboard Tests

TC-TRN-M014: View approval dashboard

Precondition: On "อนุมัติผลอบรม" tab

StepActionExpected Result
1Click "อนุมัติผลอบรม" tabDashboard displayed
2Verify approve buttons"อนุมัติผ่าน" and "ไม่ผ่าน" buttons visible
3Verify filter dropdownsSession filter and Contractor filter present
4Verify pending count chipShows count of pending attendances
5Verify table columnsวันที่อบรม, ผู้เข้าอบรม, บริษัท, สถานะ, รอคิว, ลงทะเบียนเมื่อ

TC-TRN-M015: Filter by session

Precondition: On approval dashboard with pending attendances

StepActionExpected Result
1Click session filter dropdownSessions listed
2Select specific sessionFilter applied
3Verify filtered resultsOnly attendances for selected session shown
4Select "ทั้งหมด"All attendances shown

TC-TRN-M016: Filter by contractor

Precondition: On approval dashboard

StepActionExpected Result
1Click contractor filter dropdownContractors listed
2Select specific contractorFilter applied
3Verify filtered resultsOnly attendances for selected contractor shown
4Verify pending count updatedCount reflects filtered results

TC-TRN-M017: Select attendances for approval

Precondition: On approval dashboard with pending attendances

StepActionExpected Result
1Click checkbox on attendance rowRow selected, checkbox checked
2Click header checkboxAll visible rows selected
3Verify approve buttons show count"อนุมัติผ่าน (N)" shows selected count
4Click header checkbox againAll rows deselected

TC-TRN-M018: Approve training (pass)

Precondition: One or more attendances selected

StepActionExpected Result
1Select attendance rowsRows selected
2Click "อนุมัติผ่าน" buttonApprove dialog opens
3Verify dialog shows count"อนุมัติ N คน" message
4Verify expiry date fieldDefault 1 year from now
5Click confirmApproval processed
6Verify success snackbarSuccess message appears
7Verify attendances removed from pendingApproved rows no longer shown

5. Bulk Operations Tests

TC-TRN-M019: Approve all in session

Precondition: Session with pending attendances exists

StepActionExpected Result
1Filter by specific sessionOnly session's attendances shown
2Click header checkbox to select allAll rows selected
3Click "อนุมัติผ่าน"Dialog opens
4Confirm approvalAll session attendances approved

TC-TRN-M020: Mark training as failed

Precondition: Attendances selected

StepActionExpected Result
1Select attendance rowsRows selected
2Click "ไม่ผ่าน" buttonFail dialog opens
3Confirm actionAttendances marked as failed
4Verify worker training statusWorker registry shows failed status

TC-TRN-M021: Refresh pending list

Precondition: On approval dashboard

StepActionExpected Result
1Click "รีเฟรช" buttonList reloads
2Verify selection clearedNo rows selected
3Verify data refreshedLatest pending attendances shown

Labels verified against:

  • training-setting.component.ts (page title, tab labels, toolbar buttons)
  • training-schedule-list.component.ts (table headers, menu actions)
  • training-schedule-form.component.ts (form field labels)
  • training-session-list.component.ts (session table headers)
  • training-session-list-toolbar.component.ts (filter labels)
  • training-approval-dashboard.component.ts (approval buttons, filter labels, table headers)
  • dialog-generate-sessions.component.ts (dialog text)
  • dialog-approve-training.component.ts (dialog text)