# Laporan Checklist PyPOS (Poin 1-55)

Tanggal audit: 2026-04-21  
Scope: Static code review pada source `Python POS` dan backend target `existing_production_project_for_pypos`  
Catatan: Status `Parsial` berarti fitur inti sudah ada, namun validasi akhir tetap butuh UAT runtime.

---

## 1. Registrasi dan login dibeda PC bisa membedakan device ID
Status: `Terpenuhi`  
Analisis: Device ID diambil dari mesin lokal (`uuid.getnode`) dan dipakai pada proses cek/registrasi device.  
Bukti kode: `Python POS/pypos/core/utils/device_utils.py:390`, `Python POS/pypos/app.py:302`

## 2. Proteksi nilai bayar lebih kecil dari nilai penjualan
Status: `Terpenuhi`  
Analisis: Ada guard pembayaran kurang dari total, dengan opsi split payment atau blokir.  
Bukti kode: `Python POS/pypos/modules/penjualan/services/pembayaran_process_service.py:25`

## 3. Nilai struk beda dari nilai total penjualan (di-shoppingcart)
Status: `Parsial`  
Analisis: Jalur hitung total sudah memprioritaskan subtotal UI, tetapi konsistensi akhir sampai output struk perlu UAT end-to-end.  
Bukti kode: `Python POS/pypos/modules/penjualan/services/transaksi_payload_service.py:353`

## 4. Layout print yang belum oke dengan kertas uk 58mm dan 80mm
Status: `Parsial`  
Analisis: Konfigurasi ukuran 58mm/80mm tersedia, tetapi akurasi layout nyata tetap perlu uji printer fisik.  
Bukti kode: `Python POS/pypos/modules/printer/config/printer_config.py:1`, `Python POS/pypos/modules/printer/config/printer_config.py:5`

## 5. Struk belum auto print
Status: `Parsial`  
Analisis: Mode auto print tersedia, tetapi default masih preview.  
Bukti kode: `Python POS/pypos/modules/printer/config/print_profile_config.py:1`, `Python POS/pypos/modules/printer/config/print_profile_config.py:2`

## 6. Info PPN yang belum ikut setting company_profile di semua titik
Status: `Parsial`  
Analisis: Mekanisme sinkron setting PPN sudah ada, namun cakupan "semua titik" (UI, payload, history, print) perlu UAT final.  
Bukti kode: `Python POS/pypos/modules/penjualan/services/ppn_server_settings_service.py:277`, `Python POS/pypos/modules/penjualan/views/pembayaran_view.py:388`

## 7. Pastikan fungsi "reprint struk terakhir" tidak ngeprint produk di-shoppingcart yang belum dibayar
Status: `Terpenuhi`  
Analisis: Reprint mengambil transaksi dengan `jenis_label='invoice'`, bukan draft/F9.  
Bukti kode: `Python POS/pypos/modules/penjualan/models/transaksi_model.py:1707`

## 8. Konsistensi penggunaan form input di semua fitur, bedakan editable vs info text
Status: `Parsial`  
Analisis: Pola readonly/editable jelas di form pembayaran, tetapi belum tervalidasi menyeluruh untuk seluruh fitur.  
Bukti kode: `Python POS/pypos/modules/penjualan/views/pembayaran_view.py:339`, `Python POS/pypos/modules/penjualan/views/pembayaran_view.py:366`

## 9. Kelengkapan form fitur pembayaran (tunai, Credit Card, Debit Card)
Status: `Terpenuhi`  
Analisis: Ketiga mode tersedia dengan field penting (nominal, diskon, kartu, approval).  
Bukti kode: `Python POS/pypos/modules/penjualan/views/pembayaran_view.py:86`, `Python POS/pypos/modules/penjualan/views/pembayaran_view.py:130`, `Python POS/pypos/modules/penjualan/views/pembayaran_view.py:207`

## 10. Sinkron data dengan metode delta sync
Status: `Terpenuhi`  
Analisis: Client mengirim marker `dtime/lastID/partial/page_size`, backend membaca pola incremental tersebut.  
Bukti kode: `Python POS/pypos/modules/sinkronisasi/services/sync_api_service.py:334`, `existing_production_project_for_pypos/application/controllers/eusvc/DataSync.php:1318`

## 11. API check device terdaftar/tidak
Status: `Terpenuhi`  
Analisis: Endpoint check device tersedia di konfigurasi client dan controller backend.  
Bukti kode: `Python POS/config.json:9`, `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:5073`

## 12. API untuk proses registrasi
Status: `Terpenuhi`  
Analisis: Endpoint registrasi device tersedia dan dipakai di flow registrasi aplikasi.  
Bukti kode: `Python POS/config.json:8`, `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:5130`

## 13. API upload realtime setiap ada transaksi penjualan
Status: `Parsial`  
Analisis: Upload tersedia, tetapi mekanisme utama via export queue/cycle (near real-time), bukan hard direct per klik bayar.  
Bukti kode: `Python POS/config.json:13`, `Python POS/pypos/modules/sinkronisasi/services/export_upload_service.py:617`

## 14. API settlement
Status: `Terpenuhi`  
Analisis: Endpoint settlement aktif dengan proteksi idempotency dan response conflict/in-progress.  
Bukti kode: `Python POS/config.json:21`, `existing_production_project_for_pypos/application/modules/penjualan/controllers/ActivityReportApi.php:2609`

## 15. API penggunaan Free Produk (uji 1 nota untuk 2 jenis free)
Status: `Parsial`  
Analisis: Endpoint free produk tersedia, test dasar ada, tetapi skenario multi-jenis free dalam satu nota butuh UAT eksplisit.  
Bukti kode: `existing_production_project_for_pypos/application/controllers/eusvc/ProDiskon.php:600`, `Python POS/tests/test_free_produk_relation_flow.py:10`

## 16. API Preorder dari server dan dari lokal (simpan transaksi)
Status: `Terpenuhi`  
Analisis: Preorder server (`get_preorder`, `use_preorder`) dan draft lokal (F9) sudah terpisah dari flow bayar.  
Bukti kode: `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:5426`, `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:5525`, `Python POS/pypos/modules/penjualan/views/index.py:911`

## 17. Setting server utama/url tujuan bisa diganti di luar coding
Status: `Terpenuhi`  
Analisis: Dialog konfigurasi menyediakan input `API Base URL`.  
Bukti kode: `Python POS/pypos/modules/auth/views/config_dialog.py:65`

## 18. Popup setting berlaku untuk barcode mode dan nama produk
Status: `Parsial`  
Analisis: Mode submit barcode/nama barang dan popup qty sudah ada, namun UX akhir masih perlu UAT kasir.  
Bukti kode: `Python POS/pypos/modules/penjualan/views/index.py:1652`, `Python POS/pypos/modules/penjualan/views/index.py:1656`, `Python POS/pypos/modules/penjualan/views/index.py:617`

## 19. Delete baris produk di shoppingcart
Status: `Terpenuhi`  
Analisis: Tersedia tombol hapus per baris dan fungsi `removeRow`.  
Bukti kode: `Python POS/pypos/modules/penjualan/views/index.py:1936`, `Python POS/pypos/modules/penjualan/views/index.py:2059`

## 20. Informasi diskon apakah sudah sesuai dengan setting web
Status: `Parsial`  
Analisis: Panel info diskon tersedia, tetapi kesetaraan penuh terhadap rule web tetap perlu verifikasi bisnis/UAT.  
Bukti kode: `Python POS/pypos/modules/penjualan/views/index.py:2349`

## 21. Limit dan otorisasi "diskon tambahan" saat pembayaran
Status: `Parsial`  
Analisis: Otorisasi admin berjalan, tetapi ditemukan mismatch limit debit (`label max 30%` vs `setMaximum(100)`).  
Bukti kode: `Python POS/pypos/modules/penjualan/services/pembayaran_process_service.py:19`, `Python POS/pypos/modules/penjualan/views/pembayaran_view.py:199`, `Python POS/pypos/modules/penjualan/views/pembayaran_view.py:209`

## 22. Bug tombol bawah "simpan transaksi" membuat shoppingcart jadi pembayaran
Status: `Terpenuhi`  
Analisis: Shortcut dan tombol sudah dipisah antara bayar (F8) dan simpan draft (F9).  
Bukti kode: `Python POS/pypos/modules/penjualan/views/index.py:905`, `Python POS/pypos/modules/penjualan/views/index.py:911`

## 23. Informasi nilai transaksi di shoppingcart lengkap (total bayar, jml item, jml produk, jml free, point, totalDiskon Rp/%)
Status: `Belum`  
Analisis: Ringkasan sudah ada, tetapi belum memenuhi paket informasi persis seperti requirement ini.  
Bukti kode: `Python POS/pypos/modules/penjualan/common/transaksi_view_summary.py:45`

## 24. Pastikan return penjualan oke
Status: `Parsial`  
Analisis: Modul return tersedia dengan validasi qty dan flow proses; perlu UAT transaksi riil untuk finalisasi status "oke".  
Bukti kode: `Python POS/pypos/modules/penjualan/views/return_view.py:319`, `Python POS/pypos/modules/penjualan/views/return_view.py:452`

## 25. Proteksi jika ada penjualan kemarin atau ganti kasir yang belum settlement
Status: `Terpenuhi`  
Analisis: Guard settlement dan deteksi kasir lain tersedia.  
Bukti kode: `Python POS/pypos/modules/penjualan/services/transaksi_penjualan_hotspot_use_case_service.py:688`, `Python POS/pypos/modules/penjualan/services/transaksi_payment_state_service.py:35`

## 26. Error saat mau logout
Status: `Parsial`  
Analisis: Guard logout saat sinkronisasi berjalan sudah ada, namun stabilitas akhir tetap perlu UAT berbagai kondisi jaringan.  
Bukti kode: `Python POS/pypos/modules/dashboard/views/dashboard_window.py:1845`, `Python POS/pypos/modules/dashboard/views/dashboard_window.py:1871`

## 27. Style button sudah oke dan konsisten di semua titik
Status: `Parsial`  
Analisis: Styling sudah diterapkan di banyak titik, tetapi konsistensi seluruh aplikasi belum ter-audit visual penuh.  
Bukti kode: `Python POS/pypos/modules/dashboard/views/dashboard_window.py:673`, `Python POS/pypos/modules/penjualan/views/index.py:1943`

## 28. Setelah login dan sinkronisasi berhasil, auto masuk menu penjualan
Status: `Belum`  
Analisis: Landing default masih ke dashboard/beranda.  
Bukti kode: `Python POS/pypos/modules/dashboard/services/dashboard_layout_builder_service.py:108`

## 29. Error saat masuk menu settlement
Status: `Parsial`  
Analisis: Flow menu settlement ada dan refresh deferred, tetapi belum ada hardening `try/catch` eksplisit di pembuka menu settlement itu sendiri.  
Bukti kode: `Python POS/pypos/modules/dashboard/views/dashboard_window.py:1503`, `Python POS/pypos/modules/dashboard/views/dashboard_window.py:1511`

## 30. Error saat masuk menu pembatalan
Status: `Terpenuhi`  
Analisis: Ada `try/catch` plus fallback `show_error` saat init halaman pembatalan gagal.  
Bukti kode: `Python POS/pypos/modules/dashboard/views/dashboard_window.py:1377`, `Python POS/pypos/modules/dashboard/views/dashboard_window.py:1411`

## 31. Error saat close aplikasi dengan keterangan ada data yang belum disinkron
Status: `Parsial`  
Analisis: Close guard sudah memblokir ketika settlement direct masih pending/unsent, tetapi belum menjadi guard universal semua kategori pending sync.  
Bukti kode: `Python POS/pypos/app.py:803`, `Python POS/pypos/app.py:835`, `Python POS/pypos/app.py:1024`

## 32. Input diskon tambahan belum meminta otorisasi (berapa pun nilainya harus otorisasi)
Status: `Parsial`  
Analisis: Otorisasi dipanggil untuk diskon > 0, tetapi state verifikasi bisa reuse untuk nilai sama (tidak selalu prompt ulang setiap aksi).  
Bukti kode: `Python POS/pypos/modules/penjualan/services/pembayaran_process_service.py:20`, `Python POS/pypos/modules/penjualan/services/pembayaran_state_service.py:26`

## 33. Pola file export dengan prefix nama file "pos_*"
Status: `Terpenuhi`  
Analisis: Penamaan file export sudah eksplisit menggunakan prefix `pos_`.  
Bukti kode: `Python POS/pypos/modules/sinkronisasi/services/transaction_export_service.py:3185`, `Python POS/pypos/modules/sinkronisasi/services/transaction_export_service.py:3199`

## 34. Tombol instant sinkron
Status: `Parsial`  
Analisis: Tombol `Sinkron Sekarang` tersedia dan memicu alur sinkron, tapi visibilitasnya kondisional berdasarkan status update.  
Bukti kode: `Python POS/pypos/modules/dashboard/views/dashboard_window.py:673`, `Python POS/pypos/modules/dashboard/views/dashboard_window.py:466`, `Python POS/pypos/modules/dashboard/views/dashboard_window.py:459`

## 35. Background sinkron 5 menit (perlu persetujuan kasir, tidak mengganggu operasional)
Status: `Belum`  
Analisis: Nilai konfigurasi 5 menit ada, namun mode aktif saat ini `notify_only` dengan prompt modal (`Update Sekarang`/`Nanti`), jadi belum sepenuhnya non-intrusive seperti requirement.  
Bukti kode: `Python POS/pypos/core/utils/config_utils.py:206`, `Python POS/pypos/modules/dashboard/controllers/dashboard_controller.py:303`, `Python POS/pypos/modules/dashboard/controllers/dashboard_controller.py:843`

---

## 36. Kontrak endpoint punya versi (`api_version`) dan kebijakan deprecate yang jelas
Status: `Parsial`  
Analisis: Versi payload/flow sudah ada (`V1/V2`, `PYPOS.V2`), tetapi belum ada standar `api_version` kontrak lintas endpoint plus kebijakan deprecate tertulis yang konsisten.  
Bukti kode: `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:938`, `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:947`, `existing_production_project_for_pypos/application/modules/penjualan/controllers/ActivityReportApi.php:449`

## 37. Bentuk response tetap backward-compatible untuk POS lama dan PyPOS
Status: `Parsial`  
Analisis: Sudah ada adapter/facade response legacy untuk endpoint inti, namun belum terbukti seragam untuk semua endpoint PyPOS + WEB_POS.  
Bukti kode: `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:37`, `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:79`, `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:947`

## 38. Semua endpoint punya timeout, retry policy, dan batas retry yang konsisten
Status: `Parsial`  
Analisis: Client PyPOS sudah punya policy timeout/retry/backoff terpusat, tetapi konsistensi menyeluruh per endpoint server belum terstandar tunggal.  
Bukti kode: `Python POS/pypos/core/utils/config_utils.py:37`, `Python POS/pypos/core/utils/config_utils.py:1098`, `Python POS/pypos/core/utils/http_retry.py:168`, `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:8932`

## 39. Idempotency benar-benar diproteksi unique index (bukan hanya cek di kode)
Status: `Terpenuhi`  
Analisis: Registry idempotency settlement dan upload sudah dibuat dengan unique key di level database.  
Bukti kode: `existing_production_project_for_pypos/application/modules/penjualan/controllers/ActivityReportApi.php:629`, `existing_production_project_for_pypos/application/modules/penjualan/controllers/ActivityReportApi.php:644`, `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:9444`, `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:9445`

## 40. Proteksi duplikasi nota lintas sumber (WEB_POS vs PyPOS) pada hari yang sama
Status: `Belum`  
Analisis: Mekanisme saat ini masih dominan berbasis `cek_run`/idempotency upload; belum terlihat guard unik lintas dua sumber pada layer nota bisnis akhir.  
Bukti kode: `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:4587`, `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:11188`, `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:9445`

## 41. Rekonsiliasi otomatis `transaksi_consolidasi(_v2)` vs `transaksi_point` vs `transaksi_payment_source`
Status: `Parsial`  
Analisis: Jalur rekonsiliasi proses sudah ada (generate point, bridge, validator settlement), namun orkestrasi final masih perlu disiplin job scheduler/UAT operasional.  
Bukti kode: `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:4535`, `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:11006`, `existing_production_project_for_pypos/application/controllers/eusvc/DataSync.php:5121`, `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:6331`

## 42. Tabel antrean gagal/retry (dead-letter) untuk data yang gagal diproses CLI
Status: `Parsial`  
Analisis: Status gagal/retry sudah ada pada registry/outbox, tetapi belum ada desain dead-letter queue terpadu lintas seluruh jalur CLI ERP.  
Bukti kode: `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:9431`, `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:1207`, `Python POS/pypos/modules/sinkronisasi/models/export_upload_model.py:191`, `Python POS/pypos/modules/sinkronisasi/services/event_outbox_service.py:354`

## 43. Monitoring health CLI (last run, durasi, sukses/gagal, alert macet)
Status: `Parsial`  
Analisis: Endpoint health compile worker sudah ada berikut metrik dasar, tetapi belum mencakup seluruh CLI ERP + mekanisme alert aktif.  
Bukti kode: `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:1156`, `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:1206`, `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:1282`

## 44. Validasi integritas file upload (checksum/ukuran/format) sebelum compile
Status: `Terpenuhi`  
Analisis: Upload stream memvalidasi checksum, ukuran file, format hash, dan codec payload sebelum diterima untuk proses lanjut.  
Bukti kode: `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:905`, `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:910`, `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:916`, `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:598`, `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:8407`

## 45. Standarisasi timezone/jam server vs jam POS agar delta sync tidak false-positive
Status: `Parsial`  
Analisis: Sudah ada bagian yang memakai timezone eksplisit/UTC, tetapi implementasi waktu masih campuran localtime vs UTC sehingga tetap berisiko drift marker.  
Bukti kode: `existing_production_project_for_pypos/application/config/heTransaksi_ui.php:10`, `Python POS/pypos/modules/sinkronisasi/services/event_outbox_service.py:28`, `Python POS/pypos/modules/sinkronisasi/models/export_upload_model.py:93`, `Python POS/pypos/modules/sinkronisasi/services/transaction_export_service.py:3372`

## 46. JWT lifecycle lengkap: expiry, refresh, revoke, bypass first-install terbatas endpoint
Status: `Parsial`  
Analisis: Expiry/refresh sudah ada dan endpoint bootstrap tanpa JWT sudah tersedia, namun mekanisme revoke/blacklist token belum terlihat eksplisit.  
Bukti kode: `existing_production_project_for_pypos/application/controllers/eusvc/JwtAuthHelper.php:97`, `existing_production_project_for_pypos/application/controllers/eusvc/JwtAuthHelper.php:108`, `existing_production_project_for_pypos/application/controllers/eusvc/JwtAuthHelper.php:184`, `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:7345`, `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:7418`, `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:5073`

## 47. Otorisasi role per endpoint (kasir/supervisor/admin), bukan hanya login
Status: `Belum`  
Analisis: Guard utama saat ini fokus validasi token/akses endpoint; kontrol role granular per endpoint belum terlihat menjadi policy default.  
Bukti kode: `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:131`, `existing_production_project_for_pypos/application/modules/penjualan/controllers/ActivityReportApi.php:152`, `existing_production_project_for_pypos/application/modules/penjualan/controllers/ActivityReportApi.php:2870`

## 48. Audit log IN/OUT endpoint lengkap dengan trace_id dan masking data sensitif
Status: `Terpenuhi`  
Analisis: Logging audit menangkap request/response, trace/audit id, runtime fatal, serta masking field sensitif (`token/password`).  
Bukti kode: `existing_production_project_for_pypos/application/helpers/pypos_endpoint_audit_helper.php:5`, `existing_production_project_for_pypos/application/helpers/pypos_endpoint_audit_helper.php:166`, `existing_production_project_for_pypos/application/helpers/pypos_endpoint_audit_helper.php:397`, `existing_production_project_for_pypos/application/helpers/pypos_endpoint_audit_helper.php:488`, `existing_production_project_for_pypos/application/controllers/eusvc/NonRest.php:22`

## 49. Log rotation, retention policy, dan batas ukuran file log
Status: `Belum`  
Analisis: Mekanisme tulis log saat ini append langsung ke file audit tanpa rotasi/retensi otomatis.  
Bukti kode: `existing_production_project_for_pypos/application/helpers/pypos_endpoint_audit_helper.php:169`, `existing_production_project_for_pypos/application/helpers/pypos_endpoint_audit_helper.php:170`, `existing_production_project_for_pypos/application/helpers/pypos_endpoint_audit_helper.php:180`

## 50. Uji restore backup database (bukan hanya backup)
Status: `Parsial`  
Analisis: Service backup dan restore drill (termasuk checksum + sqlite quick check) sudah tersedia di source, namun belum terlihat jadi rutin operasional default.  
Bukti kode: `Python POS/pypos/modules/platform_ops/services/dr_backup_policy_service.py:35`, `Python POS/pypos/modules/platform_ops/services/dr_restore_drill_service.py:56`, `Python POS/pypos/modules/platform_ops/services/dr_restore_drill_service.py:97`

## 51. Script migrasi DB punya rollback plan dan dry-run check
Status: `Parsial`  
Analisis: Rollback saat error sudah ada di migrator, tetapi belum ada mode dry-run formal untuk validasi pra-eksekusi migrasi.  
Bukti kode: `Python POS/pypos/core/database/schema_migrator.py:679`, `Python POS/pypos/core/database/schema_migrator.py:712`, `Python POS/pypos/core/database/schema_migrator.py:729`

## 52. Uji beban jam sibuk (multi-kasir paralel + settlement bersamaan)
Status: `Belum`  
Analisis: Artefak yang tersedia masih dominan smoke test/checkpoint; belum ada suite load test terstruktur untuk skenario jam sibuk.  
Bukti kode: `db_uat/08_smoke_test_webpos_legacy_10min.md:1`, `db_uat/08_smoke_test_webpos_legacy_10min.md:42`, `db_uat/09_hardening_phase2_rollout.md:4`

## 53. Uji mode offline/reconnect: antrean transaksi lokal, replay aman, tanpa duplikasi
Status: `Parsial`  
Analisis: Outbox dan retry-replay sudah ada (dedup key unik, lease, retry schedule), namun pembuktian end-to-end tanpa duplikasi lintas seluruh jalur tetap memerlukan UAT lapangan.  
Bukti kode: `Python POS/pypos/modules/sinkronisasi/services/event_outbox_service.py:56`, `Python POS/pypos/modules/sinkronisasi/services/event_outbox_service.py:78`, `Python POS/pypos/modules/sinkronisasi/services/event_outbox_service.py:222`, `Python POS/pypos/modules/sinkronisasi/services/event_outbox_service.py:354`, `Python POS/pypos/modules/sinkronisasi/models/export_upload_model.py:191`

## 54. Cek drift skema WEB_POS vs ERP secara berkala
Status: `Parsial`  
Analisis: Script compare/preflight schema drift sudah ada, tetapi eksekusi berkala otomatis belum terlihat dipaksa sebagai job rutin.  
Bukti kode: `db_uat/04_compare_webpos_vs_erp_sync_tables.sql:4`, `db_uat/04_compare_webpos_vs_erp_sync_tables.sql:78`, `db_uat/01_preflight_erp_integration.sql:195`

## 55. Gate rilis wajib: smoke test endpoint utama + settlement + free produk + preorder
Status: `Parsial`  
Analisis: Dokumen smoke/hardening dan matrix endpoint sudah ada, namun gate rilis otomatis/mandatory belum sepenuhnya diformalisasi sebagai quality gate tunggal.  
Bukti kode: `db_uat/08_smoke_test_webpos_legacy_10min.md:1`, `db_uat/09_hardening_phase2_rollout.md:4`, `db_uat/10_endpoint_matrix_pypos_vs_erp_target.md:1`

---

## Rekap

Terpenuhi: 18  
Parsial: 30  
Belum: 7  
Skor praktis (T=1, P=0.5, B=0): 60.0%
