# Diagram Alur & Flowchart Lengkap Transaksi Follow-Up Sales Order

Dokumen ini berisi kumpulan diagram **Mermaid (Flowchart, Sequence Diagram, & State Diagram)** yang memetakan seluruh siklus hidup data, alur eksekusi, serta interaksi antar-objek pada sistem **Follow-Up Sales Order ERP (CI3)**.

---

## 1. Flowchart Alur Eksekusi Transaksi (15 Tahapan Detail)

```mermaid
flowchart TD
    Start([Mulai: HTTP Request /doFollowup]) --> C1[Controller: FollowUp.php]
    
    subgraph S1["Fase 1: Inisialisasi & Validasi Awal"]
        C1 --> Guard[1. validateFollowupGuards<br>- Cek Maintenance Cabang<br>- Cek State Transaksi Locker]
        Guard -->|State == 'hold'| ErrHold[Tolak: Transaksi Sedang Di-hold]
        Guard -->|Valid| Hydrate[2. hydrateFollowupReferenceData<br>- Load Data Dokumen Induk SPO<br>- Ambil Metadata Otorisasi/Next Step]
    end

    subgraph S2["Fase 2: Kalkulasi Finansial & Persiapan Parameter"]
        Hydrate --> AccTable[3. buildDynamicAccountTables<br>- Mapping Rekening Perkiraan GL]
        AccTable --> Pricing[4. applyDppPembulatan & calcPricing<br>- Hitung Subtotal, Diskon, DPP, PPN<br>- Pembulatan Standar Akuntansi]
        Pricing --> PreProc[5. executeFollowupPreProcessors<br>- Eksekusi Custom Pre-processor<br>- he_value_builder]
        PreProc --> Counters[6. generateFollowupCounters<br>- CustomCounter: Nomor Nota 5822so.1.16.2<br>- Global Counter: 5822so.20260817.1.16.2.22486]
        Counters --> Replacers[7. Master Replacers & Unpaid Calculation<br>- Terapkan array group masterReplacers & addValues<br>- Hitung tagihan, terbayar, sisa]
    end

    subgraph S3["Fase 3: Persistensi Basis Data (ACID Transaction)"]
        Replacers --> TransStart[DB Transaction: trans_start]
        TransStart --> WriteMaster[8. writeMainEntries<br>- INSERT INTO `transaksi`<br>- Menghasilkan ID: $insertID]
        WriteMaster --> WriteAux[9. persistFollowupMasterAndSign<br>- writeMainEntries_entryPoint<br>- INSERT `transaksi_sign`<br>- writeMainValues, writeMainFields, writeMainElements<br>- ids_his Blob History Tracking<br>- writeDueDate & indexing_main_values]
        WriteAux --> WriteDetail[10. persistFollowupDetailItems<br>- INSERT `transaksi_data`<br>- writeDetailValues ($insertID & $epID)<br>- Potong valid_qty pada item SPO induk<br>- INSERT `items_child` & `items_child_seri`<br>- Update indexing_details & indexing_detail_values]
    end

    subgraph S4["Fase 4: State Freeze Snapshot"]
        WriteDetail --> RegWrite[11. 49-Key Data Registries Snapshot<br>- Merekam 49-Key Utuh ke `transaksi_registries`<br>- Menyimpan snapshot keranjang, layout receipt, & config]
    end

    subgraph S5["Fase 5: Pipeline Finansial & Ledger"]
        RegWrite --> SubComp[12a. executeSubComponents<br>- Komponen GL level rincian item]
        SubComp --> MainComp[12b. executeMainComponents<br>- Posting Jurnal GL Buku Besar<br>- Double Entry Debit = Kredit]
        MainComp --> PaySrc[12c. processPaymentSources<br>- Alokasi payment_source multi-valas & pajak<br>- Alokasi payment_antiSource & uang_muka<br>- Perekaman MdlTransaksiLaporan]
        PaySrc --> PostProc[12d. executePostProcessors<br>- Post-processor detail<br>- Post-processor sub_detail misal: LockerStock<br>- Post-processor master]
    end

    subgraph S6["Fase 6: Sinkronisasi Eksternal & Commit"]
        PostProc --> ExtSync[13. syncFollowupExternalServices<br>- MdlLockerTransaksi::execLocker()<br>- Validasi CB_ID_PUSAT cabangValidator<br>- Replikasi Cabang connectTo]
        ExtSync --> TransCommit[14. DB Transaction: trans_complete]
        TransCommit --> CheckStatus{DB Trans Status?}
        CheckStatus -->|Berhasil| CommitOK([15. Selesai: Transaksi Sukses Tersimpan])
        CheckStatus -->|Gagal| RollbackFail[Otomatis Rollback Seluruh Perubahan]
    end

    classDef controller fill:#e1f5fe,stroke:#0288d1,stroke-width:2px;
    classDef calc fill:#fff3e0,stroke:#f57c00,stroke-width:2px;
    classDef db fill:#e8f5e9,stroke:#388e3c,stroke-width:2px;
    classDef finance fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px;
    classDef sync fill:#efebe9,stroke:#5d4037,stroke-width:2px;
    classDef err fill:#ffebee,stroke:#c62828,stroke-width:2px;

    class Start,C1 controller;
    class Guard,Hydrate,AccTable,Pricing,PreProc,Counters,Replacers calc;
    class TransStart,WriteMaster,WriteAux,WriteDetail,RegWrite db;
    class SubComp,MainComp,PaySrc,PostProc finance;
    class ExtSync,TransCommit,CheckStatus,CommitOK sync;
    class ErrHold,RollbackFail err;
```

---

## 2. Sequence Diagram Interaksi Antar-Objek

```mermaid
sequenceDiagram
    autonumber
    actor User as User / Browser
    participant Ctrl as FollowUp.php
    participant Service as ComSalesOrderFollowupService
    participant MdlTr as MdlTransaksi
    participant Engine as ComTransactionPipelineEngine
    participant DB as Database CI3

    User->>Ctrl: GET /penjualan/FollowUp/doFollowup/{jenisTr}/{refId}/{stepTarget}/{stepCurr}
    Ctrl->>Service: processSalesOrderFollowup(orderHeader, orderItems, ...)
    
    Note over Service: 1. Validasi Guard & Hydration
    Service->>MdlTr: lookupJoined($refId)
    MdlTr-->>Service: $refData
    
    Note over Service: 2. Kalkulasi DPP, PPN, Pricing, Counters & Replacers
    
    Service->>DB: trans_start()
    
    Note over Service: 3. Penulisan Master Header & Auxiliaries
    Service->>MdlTr: writeMainEntries($tableIn_master)
    MdlTr->>DB: INSERT INTO `transaksi`
    MdlTr-->>Service: $insertID
    
    Service->>MdlTr: writeMainEntries_entryPoint($insertID, $masterID, ...)
    Service->>MdlTr: writeMainValues / writeMainFields / writeMainElements
    Service->>MdlTr: writeDueDate / ids_his blob tracking
    
    Note over Service: 4. Penulisan Detail & Valid Qty Update
    Service->>MdlTr: writeDetailEntries($orderItems)
    Service->>MdlTr: writeDetailChildEntries ($items_child)
    Service->>DB: UPDATE `transaksi_data` (Potong valid_qty induk)
    
    Note over Service: 5. State Snapshot Registries (49 Key)
    Service->>MdlTr: writeDataRegistries($insertID, $baseRegistries)
    MdlTr->>DB: INSERT INTO `transaksi_registries`
    
    Note over Service,Engine: 6. Finansial, Jurnal GL & Payment Sources
    Service->>Engine: executeSubComponents(...)
    Service->>Engine: executeMainComponents(...)
    Engine->>DB: Posting GL Jurnal (Debit = Kredit)
    Service->>Engine: processPaymentSources(...)
    Engine->>DB: INSERT INTO `payment_source`, `transaksi_uang_muka`, `transaksi_laporan`
    Service->>Engine: executePostProcessors(...)
    Engine->>DB: Eksekusi ComLockerStock (Detail/Sub-Detail/Master)
    
    Note over Service: 7. External Lockers & Sync
    Service->>DB: trans_complete()
    DB-->>Service: trans_status() = TRUE
    
    Service-->>Ctrl: Array Status [status: true, nomer: 5822so...]
    Ctrl-->>User: Render Preview / Redirection Sukses
```

---

## 3. State Diagram Siklus Hidup Transaksi

```mermaid
stateDiagram-v2
    [*] --> SPO_Draft: 1. Input Transaksi Penjualan (Step 1)
    
    SPO_Draft --> SPO_Submitted: 2. Submit & Masuk Antrean Follow-Up
    
    state SPO_Submitted {
        [*] --> In_Review: Menunggu Otorisasi Supervisor
        In_Review --> Hold: Ditemukan Masalah Kredit/Stok (state='hold')
        Hold --> In_Review: Dibebaskan oleh Otorisator
    }
    
    SPO_Submitted --> Followup_Processing: 3. User Trigger /doFollowup
    
    state Followup_Processing {
        [*] --> Price_Reconciled: Rekonsiliasi DPP & PPN
        Price_Reconciled --> Counter_Generated: Generate Nomer Nota Baru (Step 2 SO)
        Counter_Generated --> Header_Detail_Saved: INSERT Transaksi & Potong Kuota valid_qty
        Header_Detail_Saved --> Registry_Frozen: 49-Key Snapshot Freeze
        Registry_Frozen --> GL_Posted: Jurnal GL & Alokasi Payment Source
        GL_Posted --> Stock_Locked: Mutasi & Kunci Stok (LockerStock)
    }
    
    Followup_Processing --> SO_Confirmed: 4. ACID Transaction Commit Berhasil
    Followup_Processing --> SPO_Submitted: 4b. Gagal / Rollback (State Kembali Semula)
    
    SO_Confirmed --> [*]: Transaksi Siap untuk Pengiriman / Penagihan
```

---

## 4. Diagram Relasi Entitas Persistence (ER-Flow)

```mermaid
erDiagram
    TRANSAKSI ||--o{ TRANSAKSI_DATA : "memiliki rincian barang"
    TRANSAKSI ||--o{ TRANSAKSI_SIGN : "memiliki log audit otorisasi"
    TRANSAKSI ||--o{ TRANSAKSI_REGISTRIES : "memiliki snapshot konfigurasi"
    TRANSAKSI ||--o{ PAYMENT_SOURCE : "memiliki alokasi tagihan/pajak"
    TRANSAKSI ||--o{ TRANSAKSI_LAPORAN : "terekam pada mutasi laporan"
    TRANSAKSI_DATA ||--o{ TRANSAKSI_DATA_VALUES : "memiliki nilai item (harga, subtotal)"
    TRANSAKSI_DATA ||--o{ TRANSAKSI_DATA_CHILD : "memiliki sub-item racikan/komposisi"
    TRANSAKSI_DATA ||--o{ TRANSAKSI_DATA_CHILD_SERI : "memiliki nomor seri"

    TRANSAKSI {
        bigint id PK
        bigint id_master FK
        bigint id_top FK
        string nomer
        string nomer2
        string transaksi_jenis
        decimal transaksi_nilai
        datetime dtime
        blob ids_his
        blob indexing_main_values
        blob indexing_details
        blob indexing_detail_values
    }

    TRANSAKSI_DATA {
        bigint id PK
        bigint transaksi_id FK
        bigint produk_id FK
        decimal valid_qty
        decimal produk_ord_jml
        decimal produk_ord_hrg
        string sub_step_code
    }

    TRANSAKSI_REGISTRIES {
        bigint id PK
        bigint transaksi_id FK
        blob registries_blob "49-Key Parameter Snapshot"
    }

    PAYMENT_SOURCE {
        bigint id PK
        bigint transaksi_id FK
        string jenis
        string target_jenis
        decimal tagihan
        decimal terbayar
        decimal sisa
        decimal dpp_ppn
        decimal ppn
    }
```
