# Laporan Checklist PyPOS (Poin 1-35)

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`

---

## Rekap

Terpenuhi: 15  
Parsial: 17  
Belum: 3  
Skor praktis (T=1, P=0.5, B=0): 67.1%

