# Flowchart Teknis Advanced - Master Map

Dokumen ini adalah peta induk arsitektur alur:
- CRM (`san_ibb_master`) -> Subsidiary (`san_sarana_8apr`) -> Holding (`san_varian`)
- ditambah callback status, cancel orchestration, dan fault containment.

Viewer interaktif (HTML):
- [Advanced Flowchart Viewer](/w:/san_sarana_8apr/flowcharts/index.html)

## 1) L0 Architecture Flow (Advanced)

```mermaid
flowchart TB
    %% ========== CRM ==========
    subgraph LCRM["CRM Layer (san_ibb_master)"]
        C0["User change Estimate status=accepted"]
        C1["Estimates::_writeOrders()"]
        C2["Persist backup to order_bridge_items"]
        C3{"order_to_id"}
        C4["WebhookService::sendOrderSubsidiary()"]
        C5["WebhookService::sendOrderDirectHolding()"]
        C6["Push mgk status timeline"]
    end

    %% ========== SUBSIDIARY ==========
    subgraph LSUB["Subsidiary Layer (san_sarana_8apr)"]
        S0["/eusvc/webhook/receive_order"]
        S1["validate payload + transaction begin"]
        S2["customer resolve by dc_id / pre-customer fallback"]
        S3["upsert penjualan_transaksi_data_crm_bridge"]
        S4["TransaksiCrm::viewOrderCrm"]
        S5["Create::previewCrm (locker + validation)"]
        S6{"variant required?"}
        S7["previewCrmVariantPicker/savePreviewCrmVariant"]
        S8["FollowUp::doFollowup/save"]
        S9["PostProcessor TransaksiDataPenjualanBridging"]
        S10["write penjualan_transaksi_data_bridge + _master"]
        S11["CLI pembelian::autoPurchaseOrder"]
        S12["publish api_writeBridge to Holding"]
    end

    %% ========== HOLDING ==========
    subgraph LHOLD["Holding Layer (san_varian)"]
        H0["penjualan/API/ModulConnect::api_writeBridge_get"]
        H1["insert reseler_master_bridge"]
        H2["CliTransaksi::run_CliPenjualanReselerVersiDedicatedSubsidary"]
        H3["create SO holding + bridge detail"]
        H4["callback update to subsidiary api_update_bridge/masterBridge"]
    end

    %% ========== CALLBACK ==========
    subgraph LCALL["Callback / Orchestration"]
        B0["BridgeCallbackService::sendOrderStatus"]
        B1["penjualan/API/Webhook::orderStatus (subsidiary)"]
        B2["penjualan/API/Webhook::orderStatus (holding)"]
    end

    %% ========== DATA STORES ==========
    D1[("CRM DB\nestimates + order_bridge_items")]
    D2[("Subsidiary DB\npenjualan_transaksi_data_crm_bridge")]
    D3[("Subsidiary DB\npenjualan_transaksi_data_bridge_master")]
    D4[("Holding DB\nreseler_master_bridge")]

    %% flow
    C0 --> C1 --> C2 --> D1
    C1 --> C3
    C3 -- "1: subsidiary" --> C4 --> S0
    C3 -- "2: direct holding" --> C5 --> H0
    C1 --> C6

    S0 --> S1 --> S2 --> S3 --> D2
    D2 --> S4 --> S5 --> S6
    S6 -- "yes" --> S7 --> S5
    S6 -- "no" --> S8 --> S9 --> S10 --> D3 --> S11 --> S12 --> H0

    H0 --> H1 --> D4 --> H2 --> H3 --> H4
    H3 --> B0 --> B1
    S8 --> B0 --> B2

    %% guard/fault
    S5 -. "active session guard / debug halt" .-> E1["FAULT F1: preview blocked"]
    S10 -. "referensi_pengiriman=0" .-> E2["FAULT F2: bridge master tidak terbentuk"]
    H2 -. "wrong scheduler calls legacy CLI" .-> E3["FAULT F3: hard-stop in run_CliPenjualanReseler()"]
    S0 -. "referensi_id already exists" .-> E4["FAULT F4: payload revision ignored"]

    classDef proc fill:#eaf4ff,stroke:#2f6fab,color:#12395f;
    classDef db fill:#eefaf0,stroke:#2f9e44,color:#1f5130;
    classDef fault fill:#fdecec,stroke:#c92a2a,color:#7a1010;
    class C0,C1,C2,C3,C4,C5,C6,S0,S1,S2,S3,S4,S5,S6,S7,S8,S9,S10,S11,S12,H0,H1,H2,H3,H4,B0,B1,B2 proc;
    class D1,D2,D3,D4 db;
    class E1,E2,E3,E4 fault;
```

## 2) Paket Flowchart Detail per Modul

1. CRM outbound dan route keputusan:
- [FC01_CRM_OUTBOUND_TO_SUBSIDIARY](/w:/san_sarana_8apr/application/flowcharts/FC01_CRM_OUTBOUND_TO_SUBSIDIARY.md)

2. Subsidiary intake, preview CRM, dan staging varian:
- [FC02_SUBSIDIARY_PREVIEW_FOLLOWUP_VARIAN](/w:/san_sarana_8apr/application/flowcharts/FC02_SUBSIDIARY_PREVIEW_FOLLOWUP_VARIAN.md)

3. Bridge sales subsidiary -> CLI pembelian -> holding:
- [FC03_BRIDGE_AND_CLI_SUBSIDIARY_TO_HOLDING](/w:/san_sarana_8apr/application/flowcharts/FC03_BRIDGE_AND_CLI_SUBSIDIARY_TO_HOLDING.md)

4. Callback status + cancel/reject orchestration:
- [FC04_CALLBACK_AND_CANCEL_ORCHESTRATION](/w:/san_sarana_8apr/application/flowcharts/FC04_CALLBACK_AND_CANCEL_ORCHESTRATION.md)

## 3) Critical Watchpoints (Global)

1. `Create::previewCrm` masih punya jalur stop pada guard active session jika debug path aktif.
2. Bridge master penjualan butuh `referensi_pengiriman > 0`; jika tidak, antrean CLI auto PO kosong.
3. Holding harus dijalankan dengan CLI dedicated subsidiary, bukan method legacy yang masih ada hard-stop debug.
4. `receive_order` di subsidiary perlu kebijakan update jika `referensi_id` sama tetapi item direvisi.
5. Callback `orderStatus` perlu konsistensi event dan side-effect (approved/rejected/cancelled/cancel_check) di kedua sisi.

## 4) Trace Token yang Wajib Konsisten

1. `estimate_id` (CRM)
2. `referensi_id` (bridge CRM dan bridge SO/PO)
3. `so_id` dan `so_nomer` (subsidiary sales)
4. `po_id` dan `po_nomer` (subsidiary auto PO)
5. `cli` status bridge (`0` -> `1`)
6. `domain` source/target callback
7. `variant_id` / `cart_key` untuk item varian

## 5) Peta 10 Alur Operasional (Navigasi Cepat)

1. Estimate accepted di CRM -> lihat FC01 (A01-A06).
2. Webhook route ke Subsidiary/Holding -> lihat FC01 (A11-A26).
3. Kasus injector/manual payload -> lihat FC01 (A31-A33).
4. Subsidiary buka preview dan validasi customer -> lihat FC02 (B03-B06).
5. Pilih SAN/LOCAL + cabang pengiriman -> lihat FC02 (B07-B09).
6. Staging/pemecahan varian item legacy -> lihat FC02 (B12-B18).
7. Build cart penjualan subsidiary -> lihat FC02 (B21-B23).
8. Auto bridge sales->PO dan CLI ke holding -> lihat FC03 (C04-C13).
9. Holding membentuk SO dan callback status -> lihat FC03 (C21-C27).
10. Cancel orchestration lintas sistem -> lihat FC04 (E01-E12).
