การอัพเดทสถานนะการนัดหมาย

flowchart TD
    %% --- กำหนด Style ---
    classDef status fill:#fff9c4,stroke:#fbc02d,stroke-width:2px,color:black;
    classDef process fill:#e1f5fe,stroke:#0277bd,stroke-width:2px,color:black;
    classDef decision fill:#ffccbc,stroke:#d84315,stroke-width:2px,color:black;
    classDef database fill:#e0e0e0,stroke:#616161,stroke-width:2px,stroke-dasharray: 5 5,color:black;
    classDef terminator fill:#ffcdd2,stroke:#c62828,stroke-width:2px,color:black;

    %% --- จุดเริ่มต้น ---
    Start((เริ่ม)) --> SearchPt[ค้นหาผู้ป่วย<br/>HN / CID / ชื่อ-สกุล]
    SearchPt --> SelectDate[เลือกแพทย์/คลินิก/วันเวลา]

    %% --- 1. กระบวนการลงทะเบียนนัด ---
    subgraph Booking_Process ["1. ลงทะเบียนนัดหมาย (TOR 1.2.6.3)"]
        SelectDate --> CheckCond{ตรวจสอบเงื่อนไข<br/>TOR 1.2.6.1}:::decision
        CheckCond -- "ติดวันหยุด/คิวเต็ม" --> Alert[แจ้งเตือนผู้ใช้งาน]
        Alert --> SelectDate

        CheckCond -- "ผ่าน" --> InputDetail["บันทึกข้อมูลนัด<br/>- สาเหตุการนัด (APDIAG)<br/>- ประเภทนัด (APTYPE)<br/>- สั่ง Lab/X-Ray ล่วงหน้า"]
        InputDetail --> SaveAppt[บันทึกข้อมูลลงฐานข้อมูล]
        SaveAppt --> DB_Appt[("แฟ้ม 28: APPOINTMENT")]:::database

        SaveAppt --> StateScheduled("สถานะ: Scheduled<br/>นัดหมายแล้ว"):::status
        StateScheduled --> PrintCard["พิมพ์ใบนัด / บัตรคิว<br/>(TOR 1.2.6.3 ข้อ 8)"]:::process
    end

    %% --- การแก้ไข/ยกเลิก ---
    subgraph Modification ["การจัดการ/แก้ไข (TOR 1.2.6.3)"]
        StateScheduled --> DecisionMod{ต้องการแก้ไข?}:::decision

        DecisionMod -- "ยกเลิกนัด" --> CancelAction[ระบุสาเหตุการยกเลิก]
        CancelAction --> StateCancelled("สถานะ: Cancelled<br/>ยกเลิกนัด"):::terminator

        DecisionMod -- "เลื่อนนัด" --> PostponeAction["ระบุสาเหตุการเลื่อน<br/>เก็บประวัติผู้แก้ไข"]
        PostponeAction --> StateRescheduled("สถานะ: Rescheduled<br/>เลื่อนนัด"):::status
        StateRescheduled --> SelectDate
    end

    %% --- 2. วันนัดหมาย ---
    subgraph Appointment_Day ["2. วันนัดหมาย & ตรวจสอบสิทธิ (TOR 1.2.6.2)"]
        DayArrive((วันนัดหมาย)) --> PatientArrive[ผู้ป่วยมาถึง รพ.]
        PatientArrive --> SearchApptDay["ค้นหารายการนัดวันนี้<br/>(TOR 1.2.6.2)"]
        SearchApptDay --> CheckInAction{ผู้ป่วย Check-in?}:::decision

        CheckInAction -- "ใช่ (มาตามนัด)" --> ConfirmArr[ยืนยันการมาถึง]:::process
        ConfirmArr --> StateArrived("สถานะ: Confirmed/Arrived<br/>มาถึงแล้ว"):::status

        StateArrived --> GenVisit["ระบบออก Visit อัตโนมัติ<br/>ส่งผู้ป่วยเข้าคิวตรวจ<br/>(TOR 1.2.6.4 ข้อ 1)"]:::process
        StateArrived --> GenOrder["ยืนยันคำสั่ง Lab/X-Ray ล่วงหน้า<br/>(TOR 1.2.6.4 ข้อ 2)"]:::process

        GenVisit --> ServiceProcess[เข้าสู่กระบวนการตรวจรักษา]
        ServiceProcess --> CloseVisit[แพทย์ปิดการตรวจ]
        CloseVisit --> StateCompleted("สถานะ: Completed<br/>เสร็จสิ้น"):::status
    end

    %% --- 3. จบวัน ---
    subgraph End_Day_Process ["3. ประมวลผลสิ้นวัน"]
        CheckInAction -- "ไม่มา (สิ้นสุดวัน)" --> AutoProcess[ระบบประมวลผลอัตโนมัติ]
        AutoProcess --> StateNoShow("สถานะ: No-Show<br/>ไม่มาตามนัด"):::terminator
        StateNoShow --> ReportNoShow["รายงานผู้ป่วยผิดนัด<br/>(TOR 1.2.6.3 ข้อ 11)"]:::database
    end