Lanjut ke konten
Samkarsa Logbook

Jualan v1.5.0-059: Smart Duplicate Detection, Multi-Type Transaction Integrity & Active Journal Status Verification

Resolusi deteksi duplikasi naif antara Penjualan vs Pembelian, implementasi verifikasi status jurnal aktif (POSTED), dan sinkronisasi database pool MCP Server.

2mnt baca

Pada sistem akuntansi dan smart note sebelumnya, deteksi duplikasi transaksi (is_duplicate) bekerja secara naif dengan hanya memeriksa kecocokan tenant_id, transaction_date, dan total_amount tanpa memfilter transaction_type.

Hal ini menimbulkan kekeliruan fatal (False Duplicate Collision):

  • Pengguna menginput Penjualan Kasir (SALES) sebesar Rp 325.500 pada tanggal 28 Agustus 2026.
  • Sistem mendeteksi adanya transaksi Pembelian (PURCHASE) dari supplier BERKAH TIGAN FARM pada tanggal yang sama dengan nominal identik Rp 325.500 (Ref #408).
  • Sistem memblokir dan mengeluarkan peringatan duplikasi palsu:

    “⚠️ DUPLIKASI AI TERDETEKSI: Transaksi dari ‘Supplier’ (Tanggal: 2026-08-28, Total: Rp 325,500) SUDAH PERNAH DICATAT sebelumnya (Ref #408).”

Selain itu, pada pemindaian OCR nota fisik, jika transaksi jurnal di buku besar sudah dihapus oleh pemilik toko, sistem lama terkadang masih mengunci struk sebagai duplikat karena tidak memverifikasi apakah status transaksi di database masih aktif (POSTED) atau sudah DELETED/VOID.


flowchart TD A[Input Smart Note / OCR Struk] --> B{Klasifikasi Tipe Transaksi} B -->|SALES / Pendapatan Kasir| C{Ada Nomor Struk / Ref Identik?} C -->|Ya, dan Status == POSTED| D[⚠️ Duplikasi Penjualan Terdeteksi] C -->|Tidak / Tanpa Ref Khusus| E[✅ Valid: Omset Ritel Boleh Berulang] B -->|PURCHASE / EXPENSE / Beban| F{Pencocokan Multi-Dimensi Database} F --> G[Cek: Status == POSTED & Type == PURCHASE & Tanggal & Total & Supplier Cocok] G --> H{Transaksi Aktif di Database?} H -->|Ya, Masih Aktif di Buku Besar| I[⚠️ Duplikasi Pembelian dari Supplier X] H -->|Tidak, Jurnal Sudah Dihapus| J[✅ Bebas Duplikat: Diizinkan Catat Ulang]

  • Penjualan Ritel Kasir (SALES): Toko ritel secara wajar menerima transaksi penjualan dengan nominal yang sama beberapa kali dalam satu hari. Pengecekan duplikasi pada SALES dinonaktifkan dari pencocokan nominal buta, dan hanya aktif jika nomor referensi struk (reference_no) yang sama persis diinput ulang.
  • Pembelian & Beban (PURCHASE / EXPENSE): Wajib memeriksa kesesuaian Transaction.transaction_type == target_tx_type, Transaction.status == TransactionStatus.POSTED, serta memverifikasi nama supplier (contact_name) atau nomor nota fisik (reference_no).

  • Saat pemindaian nota OCR dilakukan, sistem mengecek apakah transaksi riil dengan TransactionType.PURCHASE dan status POSTED masih ada di database.
  • Jika jurnal transaksi sudah dihapus: Sistem menetapkan is_duplicate: False, memungkinkan pemilik toko memindai ulang atau mengoreksi struk tanpa hambatan.

  • Memperbaiki konfigurasi DATABASE_URL pada mcp-backend-prod agar terhubung langsung ke blonjo_db (bukan mcp_hub_db), sehingga seluruh riwayat transaksi riil, tabel kontak supplier, dan pengaturan toko dapat diakses 100%.
  • Menambahkan casting eksplisit status::text ILIKE 'posted' dan account_type::text ILIKE 'asset' untuk kompatibilitas PostgreSQL Enum.

Terminal window
# Test 1: Input Pendapatan Kasir Rp 325.500 pada 28/08/2026
=== HASIL TEST 1 (SALES 325.500) ===
is_duplicate: None
duplicate_warning: None --> ✅ SUKSES (Bukan Duplikat)
# Test 2: Input Pembelian dari Berkah Tigan Farm Rp 325.500 pada 28/08/2026 (Ref #408 Aktif)
=== HASIL TEST 2 (PURCHASE BERKAH TIGAN FARM 325.500) ===
is_duplicate: True
duplicate_warning: ⚠️ DUPLIKASI PEMBELIAN TERDETEKSI: Pembelian dari 'Supplier Terkait' (Tanggal: 2026-08-28, Total: Rp 325,500) SUDAH PERNAH DICATAT pada Nota #PUR-2026-0232. --> ✅ SUKSES

Deteksi duplikasi kini bekerja secara cerdas dan kontekstual:

  1. Tidak ada lagi false duplicate antara transaksi penjualan dan pembelian.
  2. Penjualan ritel harian tidak lagi diblokir sembarangan.
  3. Transaksi yang jurnalnya sudah dihapus dapat dicatat/dipindai ulang secara bebas tanpa peringatan usang.