Skip to main content

รายชื่อผู้อบรม (Training Enrollment) - Workflow

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

Phase 4 Blocked

Reason dropdown feature causes infinite loop. Commands work without reasons but fail when dropdown is added. Investigation needed.

Overview

Training Enrollment workflow ช่วยให้ผู้รับเหมาสามารถส่งรายชื่อผู้ปฏิบัติงานเพื่อเข้ารับการอบรมความปลอดภัย โดย จป. จะเป็นผู้ตรวจสอบและอนุมัติรายชื่อ


Workflow Diagram


States

StateThai NameDescriptionExpected Role
Startedเริ่มต้นสถานะเริ่มต้น-
FillInTrainingListกรอกรายชื่อผู้อบรมผู้รับเหมาเลือกผู้ปฏิบัติงานที่ต้องการส่งเข้าอบรมผู้รับเหมา
ReviewBySafetyOfficerจป. ตรวจสอบจป. ตรวจสอบและอนุมัติรายชื่อจป.
Completedเสร็จสิ้นรายชื่อได้รับการอนุมัติแล้ว-
Rejectedปฏิเสธรายชื่อถูกปฏิเสธ-
Cancelledยกเลิกยกเลิกการส่งรายชื่อ-

Commands

CommandThai NameFrom StateTo StateAllowed Role
SubmitTrainingListส่งรายชื่อผู้อบรมFillInTrainingListReviewBySafetyOfficerผู้รับเหมา
CancelยกเลิกFillInTrainingListCancelledผู้รับเหมา
ApproveTrainingอนุมัติรายชื่อReviewBySafetyOfficerCompletedจป.
RequestChangeส่งกลับแก้ไขReviewBySafetyOfficerFillInTrainingListจป.
RejectTrainingปฏิเสธรายชื่อReviewBySafetyOfficerRejectedจป.
Planned: Command Reasons (Phase 4)

RequestChange and RejectTraining will require selecting a reason from a dropdown. Currently blocked by infinite loop issue.


Form Edit Permissions

StateEditable DocumentsEditable ByLock Reason
FillInTrainingListDoc 23 (รายชื่อผู้อบรม)ผู้รับเหมา-
ReviewBySafetyOfficer(all locked)-จป. กำลังตรวจสอบ
Completed(all locked)-อนุมัติแล้ว
Rejected(all locked)-ถูกปฏิเสธ
Cancelled(all locked)-ยกเลิกแล้ว

Document Forms

Doc IDDocumentThai NameDescription
23Training Enrollment Formรายชื่อผู้อบรมฟอร์มสำหรับเลือกผู้ปฏิบัติงานที่ต้องการส่งเข้าอบรม

Form Fields

Training Enrollment Form (Doc 23)

SectionFieldsDescription
ข้อมูลการอบรมบริษัท/Contractorชื่อผู้รับเหมา (อัตโนมัติจากระบบ)
วันที่อบรมวันที่กำหนดจัดอบรม
สถานที่อบรมสถานที่จัดอบรม
หมายเหตุหมายเหตุเพิ่มเติม (ถ้ามี)
รายชื่อผู้อบรมตารางรายชื่อผู้ปฏิบัติงานพร้อม checkbox เลือก

Worker Table Columns

ColumnThai NameDescription
Checkbox(เลือก)เลือกผู้ปฏิบัติงานที่ต้องการส่งอบรม
No.ลำดับลำดับที่
Nameชื่อ-นามสกุลชื่อเต็มผู้ปฏิบัติงาน
ID Numberเลขประจำตัวประชาชนเลขบัตรประชาชน 13 หลัก
Training Statusสถานะการอบรมสถานะปัจจุบัน (ผ่าน/ไม่ผ่าน/หมดอายุ/รอการอบรม)
Statusสถานะแสดงไอคอนเมื่อเลือก

Worker Validation

Before submitting, the system validates each selected worker and displays status icons:

Validation Checks

CheckIconDescription
ID Card Photo✅ / ⚠️Shows if worker has ID card document uploaded
Profile Photo✅ / ⚠️Shows if worker has profile photo uploaded
Blacklist Status🚫Warning if worker is on blacklist
Already Enrolled⚠️Warning if worker already enrolled in same session

Validation Summary Panel

When issues are found, a summary panel appears at the top showing:

  • Total workers with issues
  • Breakdown by issue type
  • "ดูเอกสารแนบ" (View Attachments) button to check worker documents

Automatic Deselection

Workers with critical issues (blacklisted, already enrolled) are automatically deselected when the form loads. Contractor must manually re-select them if they believe the issue is resolved.


Testing Instructions

Getting Started

  1. เข้าสู่ระบบด้วย role Contractor
  2. ไปที่ "งานของฉัน" (My Tasks)
  3. คลิก "สร้างงาน" → เลือก "รายชื่อผู้อบรม"

Test Scenarios

Scenario 1: ส่งรายชื่อสำเร็จ

  1. Contractor: สร้างงานใหม่ประเภท "รายชื่อผู้อบรม"
  2. Contractor: กรอกวันที่อบรม และสถานที่อบรม
  3. Contractor: เลือกผู้ปฏิบัติงานที่ต้องการส่งอบรม (ติ๊ก checkbox)
  4. Contractor: คลิก "ส่งรายชื่อผู้อบรม"
  5. Safety Officer: ตรวจสอบรายชื่อ
  6. Safety Officer: คลิก "อนุมัติรายชื่อ"
  7. สถานะเปลี่ยนเป็น "เสร็จสิ้น"

Scenario 2: ส่งกลับแก้ไข

  1. ทำขั้นตอน 1-5 จาก Scenario 1
  2. Safety Officer: คลิก "ส่งกลับแก้ไข"
  3. Contractor: แก้ไขรายชื่อ
  4. Contractor: ส่งใหม่อีกครั้ง

Scenario 3: ยกเลิก

  1. ทำขั้นตอน 1-3 จาก Scenario 1
  2. Contractor: คลิก "ยกเลิก"
  3. สถานะเปลี่ยนเป็น "ยกเลิก"

สิ่งที่ต้องตรวจสอบ

  • สร้างงานใหม่ได้สำเร็จ
  • ปุ่มคำสั่งแสดงตามสถานะถูกต้อง
  • เลือก/ยกเลิกเลือกผู้ปฏิบัติงานได้
  • สถานะเปลี่ยนตามคำสั่งถูกต้อง
  • ฟอร์มล็อคเมื่ออยู่ในสถานะตรวจสอบ

Architecture Notes

Temporal.io Workflow

Training Enrollment ใช้ Temporal.io สำหรับ workflow orchestration:

  1. Task Creation: Task ถูกสร้างผ่าน TrainingEnrollmentWorkflowService.ExecuteAsync()
  2. Workflow: Temporal workflow ใน TrainingEnrollmentWorkflow.cs จัดการ state machine
  3. Commands: Query Temporal workflow ผ่าน GetCommandsAsync()
  4. State Transitions: Update Temporal workflow ผ่าน method เช่น SubmitTrainingListAsync(), ApproveTrainingAsync()

Key Backend Files

FilePurpose
SafetyApp.Workflows.TrainingEnrollment/TrainingEnrollmentWorkflow.csTemporal workflow (states, queries, updates)
SafetyApp.Workflows.TrainingEnrollment/TrainingEnrollmentActivities.csActivity methods
SafetyApp.Workflows.TrainingEnrollment/TrainingEnrollmentWorkflowService.csTemporal client wrapper
SafetyApp.Application/Contracts/ITrainingEnrollmentWorkflowService.csService interface
SafetyApp.Infrastructure/Services/TaskCommandService.csCommand execution routing

Key Frontend Files

FilePurpose
training-enrollment-form.component.tsForm component
training-enrollment-form.model.tsForm data model
training-enrollment-svg-mapping.config.tsSVG workflow diagram mapping

Source Code Reference

Workflow is implemented as a Temporal.io workflow:

Project: backend/SafetyApp.Workflows.TrainingEnrollment/

FileDescription
TrainingEnrollmentWorkflow.csState machine with [WorkflowQuery] and [WorkflowUpdate] methods
TrainingEnrollmentActivities.csActivity methods for task creation, state updates
DependencyInjection.csTemporal worker registration with task queue training-enrollment-task-queue

DocumentDescription
Feature OverviewImplementation roadmap and phase details
Test CasesTest scenarios and verification

Version History

DateVersionChanges
2025-12-291.0Initial prototype documentation
2026-01-031.1Added validation (Phase 3)
2026-01-041.2Added validation section, Phase 4 blocked note
2026-01-061.3Added "Allowed Role" column to Commands table for easier validation