Lanjut ke konten
Samkarsa Logbook

Jualan v1.5.0-081: Perbaikan Deteksi Duplikasi Nota OCR Berdasarkan Tanggal Transaksi & UI Non-Blocking

Perbaikan false positive deteksi duplikasi nota OCR camera dengan validasi tanggal transaksi, pembatasan jendela temporal, serta tombol non-blocking 'Bukan Duplikat' di UI.

1mnt baca

Pembaruan ini memperbaiki masalah false positive pada sistem deteksi duplikasi nota OCR (find_semantic_basket_duplicate) ketika pengguna mengunggah foto nota melalui kamera smartphone (nota_camera_*.jpg).

  • Tanggal Transaksi Tidak Terverifikasi: Sebelumnya, algoritma pencocokan semantik keranjang belanja hanya mencocokkan kemiripan total nominal (total_amount) dan item keranjang (basket_sim >= 0.40) terhadap 20 transaksi pembelian terakhir di database tanpa memfilter tanggal nota. Akibatnya, nota belanja rutin dengan item & nominal serupa pada hari berbeda terdeteksi sebagai duplikat 100%.
  • Field Warning Terpotong: Field duplicate_warning belum terdaftar pada schema response OCRTaskResponse, sehingga frontend menampilkan fallback teks generik.
  • Modal UI Bersifat Hard-Blocking: Modal peringatan duplikat hanya menyediakan tombol “Batal” yang melakukan reset form total tanpa memberi pilihan kepada pengguna untuk melanjutkan jika nota tersebut sah.

  • Validasi & Normalisasi Tanggal Transaksi (sajen/app/services/ocr_normalizer.py):
    • Menambahkan helper _parse_date_safe yang tangguh mengenali berbagai format tanggal Indonesia (YYYY-MM-DD, DD/MM/YYYY, DD-MM-YY, dsb).
    • Jika tanggal nota kandidat valid (cand_date_obj), query ke database kini memfilter secara presisi pada Transaction.transaction_date == cand_date_obj. Transaksi dengan tanggal berbeda diabaikan dan tidak dianggap duplikat.
    • Jika tanggal nota tidak terbaca, pencarian dibatasi pada jendela sempit 3 hari terakhir dengan ambang batas kesamaan keranjang yang diperketat (basket_sim >= 0.70).
  • Pydantic Schema Serialization (sajen/app/schemas/ocr.py & api/v1/ocr.py):
    • Menambahkan field duplicate_warning: Optional[str] = None ke OCRTaskResponse agar detail tanggal dan referensi transaksi duplikat tersampaikan utuh ke frontend.
  • Frontend UI Non-Blocking (blonjo/src/pages/transaction/components/DuplicateWarningDialog.tsx & Transactions.tsx):
    • Menambahkan tombol aksi hijau “Bukan Duplikat, Lanjutkan” (onProceed).
    • Saat diklik, status duplikasi dinonaktifkan (smartNote.updateParsed({ is_duplicate: false })) sehingga data hasil bacaan nota tetap dapat ditinjau dan disimpan ke jurnal akuntansi.
  • Fallback Hook (blonjo/src/pages/transaction/hooks/useOcrUpload.ts):
    • Memperbaiki pembacaan deskripsi warning dari task.extracted_data.duplicate_warning sebelum fallback ke pesan default.