# Flowchart Teknis Integrasi POS Lama, PyPOS, dan ERP

Dokumen ini memetakan alur teknis end-to-end agar titik macet bisa ditelusuri cepat.

## 1) Peta Besar Sistem

```mermaid
flowchart LR
    subgraph POSL[POS Lama - WEB_POS]
        L1[Settlement + create file .gz]
        L2[Upload ke ERP<br/>/eusvc/NonRest/setUploadStream]
        L3[Terima sync data<br/>doSync_autoV2 / doSync_auto]
        L1 --> L2
        L3 --> L1
    end

    subgraph PYPOS[POS Baru - PyPOS]
        P1[Export batch + hash + seq]
        P2[Upload ke ERP<br/>/eusvc/NonRest/setUploadStream]
        P3[Polling status compile<br/>/eusvc/NonRest/getUploadCompileStatus]
        P4[Sync master data<br/>/eusvc/DataSync/serverSync]
        P5[Update SQLite lokal]
        P1 --> P2 --> P3 --> P4 --> P5
    end

    subgraph ERP[ERP Backbone - Jalur Inti yang Sama]
        E1[Inbound upload API]
        E2[Raw upload storage]
        E3[Compile worker<br/>compileFilesV2 / compileFilesDataV2 / compileFilesDataRegistryV2]
        E4[(transaksi_*_consolidasi)]
        E5[(transaksi_point)]
        E6[CLI POIN<br/>CliTransaksi/run_cliSalesPointCustomer]
        E7[(__raw_rek_pembantu__4)]
        E8[Bridge worker<br/>DataSync/createBridgeV2_get]
        E9[(transaksi_data_sum_realtimepos_bridge + return)]
        E10[Validator<br/>validatorSettlementVsNotaV2]
        E11[Archive worker<br/>moveToArchives_get]
        E12[Endpoint sinkronisasi ERP]
        E1 --> E2 --> E3 --> E4 --> E5 --> E6 --> E7 --> E8 --> E9 --> E10 --> E11 --> E12
    end

    L2 --> E1
    P2 --> E1
    E3 -. update status compile .-> P3
    E12 --> L3
    E12 --> P4
```

## 2) Alur POS Lama (WEB_POS) -> ERP

```mermaid
flowchart TD
    L1[User settlement di WEB_POS] --> L2[ActivityReport panggil local URL<br/>/eusvc/NonRest/sendAllFileToServer]
    L2 --> L3[WEB_POS createTransaksiFile<br/>buat file .gz per tabel]
    L3 --> L4[(WEB_POS DB table<br/>transaksi_pos_create_file_log status=0)]
    L4 --> L5[WEB_POS kirim multipart ke ERP<br/>/eusvc/NonRest/setUploadStream]
    L5 --> L6[ERP validasi + simpan file upload]
    L6 --> L7[(ERP DB table<br/>transaksi_pos_create_file_log)]
    L7 --> L8[Worker compile baca file raw]
    L8 --> L9[(Insert ke tabel konsolidasi ERP)]
    L9 --> L10[File dipindah ke CDN archive]
```

Referensi kode:
- `WEB_POS/application/modules/penjualan/controllers/ActivityReport.php:13172`
- `WEB_POS/application/controllers/eusvc/NonRest.php:296`
- `WEB_POS/application/controllers/eusvc/NonRest.php:360`
- `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:384`
- `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:1318`
- `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:1696`
- `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:1900`

## 3) Alur PyPOS Baru -> ERP

```mermaid
flowchart TD
    P1[PyPOS export worker] --> P2[Generate file + file_hash + file_seq]
    P2 --> P3[POST ep_upload_stream<br/>default: /eusvc/NonRest/setUploadStream]
    P3 --> P4{Response ada idempotency_key?}
    P4 -->|Ya| P5[Polling /eusvc/NonRest/getUploadCompileStatus]
    P4 -->|Tidak| P6[Legacy mode: tunggu compile worker ERP]
    P5 --> P7[Status compile done/pending/failed]
    P6 --> P7
    P7 --> P8[Sync master via /eusvc/DataSync/serverSync]
    P8 --> P9[Update SQLite lokal PyPOS]
```

Referensi kode:
- `Python POS/config.json:11`
- `Python POS/config.json:13`
- `Python POS/config.json:14`
- `Python POS/pypos/modules/sinkronisasi/services/export_upload_service.py:187`
- `Python POS/pypos/modules/sinkronisasi/services/export_upload_service.py:447`
- `Python POS/pypos/modules/sinkronisasi/services/export_upload_api_service.py:45`
- `Python POS/pypos/modules/sinkronisasi/services/export_upload_api_service.py:250`
- `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:512`
- `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:813`
- `existing_production_project_for_pypos/application/controllers/eusvc/DataSync.php:480`

## 4) URL/CLI Jejak Eksekusi (Troubleshooting)

### Startpoint dan Endpoint utama
- WEB_POS startpoint settlement: local `.../eusvc/NonRest/sendAllFileToServer`
- WEB_POS upload target: ERP `.../eusvc/NonRest/setUploadStream`
- PyPOS upload target (config): ERP `.../eusvc/NonRest/setUploadStream` (bisa diarahkan ke `setUploadStream__GLG` jika diperlukan)
- PyPOS compile status: ERP `.../eusvc/NonRest/getUploadCompileStatus`
- Sync data (PyPOS): ERP `.../eusvc/DataSync/serverSync`
- Sync data (WEB_POS): ERP `.../eusvc/DataSync/doSync_autoV2` / `doSync_auto`

### Processor pembaca file upload (ERP)
- HTTP/CLI endpoint utama:
- `/eusvc/NonRest/compileFilesV2`
- `/eusvc/NonRest/compileFilesDataV2`
- `/eusvc/NonRest/compileFilesDataRegistryV2`

Contoh panggilan CLI (umum CI3):
- `php index.php eusvc/NonRest/compileFilesV2`
- `php index.php eusvc/NonRest/compileFilesDataV2`
- `php index.php eusvc/NonRest/compileFilesDataRegistryV2`

### Processor lanjutan setelah compile (ERP)
- CLI POIN utama:
- `CliTransaksi/run_cliSalesPointCustomer`
- Bridge settlement:
- `/eusvc/DataSync/createBridgeV2_get`
- Validator settlement vs nota:
- `/eusvc/NonRest/validatorSettlementVsNotaV2`
- Archive bridge/konsolidasi:
- `/eusvc/DataSync/moveToArchives_get`
- Fix/rebuild bridge (jika mismatch):
- `/eusvc/DataSync/fixBridge_get`

Contoh panggilan CLI (umum CI3):
- `php index.php CliTransaksi/run_cliSalesPointCustomer`
- `php index.php eusvc/DataSync/createBridgeV2_get/2026-04-15`
- `php index.php eusvc/NonRest/validatorSettlementVsNotaV2/2026-04-15`
- `php index.php eusvc/DataSync/moveToArchives_get`

Catatan:
- Di project ada `cron.php` wrapper (`existing_production_project_for_pypos/cron.php`).
- Jejak periodik bisa dilihat dari file log fungsi di `application/controllers/eusvc/log/`.

## 5) Inventaris CLI Terdeteksi (Perlu Validasi Aktif)

CLI/endpoint yang sudah dipakai di flow utama:
- `eusvc/NonRest/compileFilesV2`
- `eusvc/NonRest/compileFilesDataV2`
- `eusvc/NonRest/compileFilesDataRegistryV2`
- `CliTransaksi/run_cliSalesPointCustomer`
- `eusvc/DataSync/createBridgeV2_get`
- `eusvc/NonRest/validatorSettlementVsNotaV2`
- `eusvc/DataSync/moveToArchives_get`
- `eusvc/DataSync/fixBridge_get`

Kandidat CLI tambahan yang terdeteksi di source `CliTransaksi.php`:
- `run_cliTransaksi`
- `run_cliTransaksi_core`
- `run_cliPointCustomerPatcher`
- `run_cliSalesPointCustomer_ori`
- `run_cliSalesPointCustomer_denganstokditunda`
- `run_cliSalesPointCustomer_non_ditunda`
- `run_cliSalesPointCustomer__`
- `run_cliPenjualan_versihitungitems_masih_salah`
- `run_cliPenjualan`
- `run_cliSalesPointCustomerCustom`

Catatan penting:
- Metode di atas "terdeteksi di source", belum berarti semuanya aktif di scheduler produksi.
- Penentuan yang benar-benar aktif harus divalidasi dari crontab server target (bukan hanya dari source code).

## 6) Titik Cek Saat Ada Hambatan

### Kasus A: POS lama bilang sukses, tapi data belum masuk ERP DB
1. Cek log kirim di WEB_POS lokal:
- `SELECT id,status,file_path,db_table,time_create,time_sent FROM transaksi_pos_create_file_log ORDER BY id DESC LIMIT 20;`
2. Jika `status=0`, trigger ulang local sender:
- `.../eusvc/NonRest/sendAllFileToServer`
3. Jika di ERP file sudah masuk tapi DB belum bertambah:
- cek log fungsi compile: `application/controllers/eusvc/log/compileFilesV2`
- jalankan compile endpoint manual (URL/CLI di atas)
4. Verifikasi tabel target ERP:
- `transaksi_consolidasi`
- `transaksi_data_consolidasi`
- `transaksi_data_registry_consolidasi`

### Kasus B: PyPOS upload berhasil tapi compile status tidak pernah selesai
1. Cek response upload apakah mengandung `idempotency_key`.
2. Cek endpoint compile status:
- `.../eusvc/NonRest/getUploadCompileStatus?idempotency_key=...&machine_id=...`
3. Cek tabel registry ERP:
- `upload_idempotency_registry` (`status`, `compiled_transaksi`, `compiled_data`, `compiled_registry`, `error_message`)
4. Jika endpoint masih legacy `setUploadStream`, compile-status berbasis idempotency bisa terbatas.

### Kasus C: Notif perubahan data produk muncul terus
1. Cek payload `serverSync/doSync_autoV2` apakah benar-benar ada row perubahan.
2. Cek tabel dengan `last_update` yang bergerak terus (trigger/background process).
3. Untuk WEB_POS, cek mismatch jumlah kolom saat sinkron (guard di `KonsolidasiData.php`).

## 7) Kenapa kadang log muncul IP 0.0.0.0

Fungsi logger memakai `ip_address()` dari request. Saat dieksekusi via CLI/cron (bukan request HTTP), IP akan tercatat `0.0.0.0`. Ini normal untuk job backend.

Referensi kode:
- `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:7431`
- `existing_production_project_for_pypos/application/controllers/eusvc/DataSync.php:5206`
