Lanjut ke konten
Samkarsa Logbook

v1.0.0-020 : Dokumentasi Lengkap Aturan Prompt OCR & Parsing Transaksi (Beserta Perbaikan INDOMARCO Model 2)

Kompilasi seluruh 12 aturan utama OCR Engine, 16 aturan Smart Transaction Parser, serta dokumentasi penanganan spesifik Nota INDOMARCO Model 2.

Jualan,Sajen,MCP5mnt baca

Dokumen ini mendokumentasikan secara lengkap seluruh Aturan Statis OCR (STATIC_OCR_PROMPT) dan Aturan Smart Transaction Parser (parseTransactionSystemPrompt) yang berlaku di kodebase mcp-server, serta solusi khusus penanganan Nota PT. INDOMARCO ADI PRIMA (Model 1 & Model 2).


Berikut adalah 12 Aturan Ekstraksi & Validasi Otentik yang diterapkan pada ocrTool.ts:

  1. KEJUJURAN MUTLAK: Jika gambar BUKAN nota/faktur (misal: hanya teks sepotong, pemandangan), ATAU jika teks sangat buram, WAJIB mengisi readability_status dengan TIDAK_TERBACA dan mengosongkan seluruh field lainnya. DILARANG MENGARANG.
  2. BEBAS HALUSINASI & PEMBERSIHAN NAMA:
    • Tulis HANYA teks yang terlihat jelas.
    • Tulisan Tangan: Penambahan item tulisan tangan oleh sales/staff WAJIB dimasukkan jika terbaca jelas.
    • Kapitalisasi: Nama barang (product_name) WAJIB ditulis dalam HURUF KAPITAL SEMUA (UPPERCASE).
    • Pembersihan Kode Barang / SKU Prefix (PENTING): Jika nama barang diawali kode angka/SKU supplier (contoh: 143210 KID115C-SUSU UHT INDOMILK KIDS), BUANG kode angka/SKU di depan tanda strip -. Ambil HANYA deskripsi nama barang setelah tanda - (contoh: SUSU UHT INDOMILK KIDS).
  3. KLASIFIKASI TRANSAKSI: Jika nota diterbitkan oleh pihak eksternal (minimarket, grosir, supplier) kepada kita, maka transaction_type WAJIB diset purchase (pembelian/pengeluaran).
  4. FORMAT TANGGAL: Menggunakan standar ISO 8601 (YYYY-MM-DD). Gunakan tahun berjalan jika nota hanya mencantumkan Hari & Bulan.
  5. PEMBERSIHAN ANGKA: Nominal berupa integer/float. Pertahankan angka desimal pada Qty (contoh 2.00 atau 1.5). Hapus simbol Rp dan pemisah ribuan.
  6. NORMALISASI UOM: Petakan UOM nota (misal DUS) ke UOM database yang cocok (contoh box).
  7. LOGIKA HARGA SATUAN & SUBTOTAL: Jika unit_price kosong, hitung unit_price = subtotal / quantity. Pastikan subtotal = (quantity * unit_price) - discount_amount.
  8. LOGIKA DISKON & PAJAK (ANTI DOUBLE COUNTING):
    • Diskon per baris dimasukkan ke discount_amount item. Rumus: net_price = unit_price - (discount_amount / quantity).
    • Set summary.discount_total menjadi 0 jika semua diskon sudah dialokasikan ke item per baris.
    • HANYA isi summary.discount_total jika diskon diberikan di akhir nota secara global.
  9. NO INVOICE: invoice_number HANYA diisi jika ada penanda seperti “No. Faktur”, “Invoice”, “Nota”.
  10. FORMAT KOLOM QTY PECAH & HARGA SATUAN (KRITIS):
    • Kolom Qty Pecah: Jika kuantitas tercetak dalam dua angka sejajar (contoh 0 10 atau 0 3), angka tersebut adalah (Karton, Pcs). Jika angka kedua > 0, gunakan angka kedua sebagai Qty dengan UOM pcs.
    • Net Subtotal: Kolom TERAKHIR di kanan baris nota computer printout adalah NET SUBTOTAL per baris.
    • Formula Unit Price: WAJIB hitung unit_price = net_subtotal_kolom_terakhir / qty.
  11. FORMAT OUTPUT: Hanya keluarkan JSON mentah tanpa markdown formatter (tanpa ```json).

Berikut adalah 16 Aturan Ekstraksi Bahasa Natural pada transactionParser.ts:

  1. KLASIFIKASI RINGKASAN VS DETAIL:
    • Jika input bertipe rekapitulasi harian/omset global (misal: “total penjualan kemarin 2.500.000”), set items menjadi array kosong [].
    • Isi items HANYA jika pengguna menyebutkan nama barang retail, qty, dan harga secara eksplisit.
  2. JENIS TRANSAKSI: Set transaction_type ke salah satu pilihan valid: purchase, sales, income, operational, non_cash_out, non_cash_in, capital, manual, cash_count, purchase_return, sales_return.
  3. ATURAN RETUR:
    • Ke Supplier/Sales → purchase_return.
    • Dari Pelanggan → sales_return.
  4. CHAIN OF THOUGHT (_reasoning): Anda WAJIB memberikan langkah pemikiran pada properti _reasoning sebelum menghasilkan data JSON.
  5. EKSTRAKSI ITEMS & PEMBERSIHAN SKU:
    • Properti wajib per item: name, qty, unit, unit_price, discount, total.
    • Pembersihan Kode SKU: Jika nama barang diawali kode angka/SKU supplier dan tanda strip (seperti 143210 KID115C-SUSU UHT INDOMILK KIDS), BUANG kode angka/SKU di depan tanda -, ambil HANYA nama barang bersihnya (SUSU UHT INDOMILK KIDS).
  6. TOTAL AMOUNT: Jika nominal total tidak disebutkan, hitung total secara otomatis dari penjumlahan qty * unit_price seluruh item.
  7. CONTACT NAME: Tangkap nama pelanggan atau supplier jika disebutkan.
  8. METODE PEMBAYARAN: Peta frasa seperti “TEMPO” atau “JATUH TEMPO” menjadi payment_method: "tempo". Default jika tidak disebutkan adalah cash.
  9. JATUH TEMPO (due_date): Format ke YYYY-MM-DD atau tulis teks relatifnya seperti +14 days.
  10. SATUAN DAN HARGA (LOGIKA MATEMATIS):
    • 1 Dus (40 Pcs) @ 110.000qty = 1, unit = Dus, unit_price = 110000.
    • Tanda Sama Dengan (=): Angka setelah = adalah HARGA TOTAL. unit_price = total / qty.
    • Tanpa Simbol @ atau =: Jika Angka * Qty melampaui total belanja secara tak masuk akal, angka tersebut adalah HARGA TOTAL baris. WAJIB dibagi Qty untuk mendapat unit_price.
  11. KOREKSI NAMA (RAG INJECTION): Jika Katalog Database disertakan, gunakan nama persis dari katalog jika ada kemiripan typo.
  12. DILARANG MENGGABUNGKAN BARANG (NO AGGREGATION): Tulis semua item persis baris per baris. JANGAN menjumlahkan barang bermerek sama.
  13. TANGGAL TRANSAKSI: Format wajib YYYY-MM-DD. Dilarang menggunakan string literal “YYYY-MM-DD” atau mengarang tahun lampau.
  14. DEFAULT PEMBAYARAN & TEMPO LEWAT:
    • Default payment_method adalah "cash".
    • Jika tanggal jatuh tempo sudah lewat dibanding hari ini, PAKSA payment_method menjadi "cash" dan due_date: null.
  15. DUA POLA DISKON:
    • Diskon Inline (Per Item): unit_price diisi harga netto (unit_price - diskon).
    • Diskon Global (Total Nota): Biarkan unit_price utuh, sesuaikan total_amount di akhir.
  16. FORMAT OUTPUT: Hanya keluarkan JSON mentah tanpa markdown formatter.

Berdasarkan analisis visual nota WhatsApp Image 2026-07-28 at 12.17.50.jpeg:

  • Header: Computer printout tanpa garis tebal.
  • Qty Kolom Pecah: Angka 0 10 dibaca Qty = 10 pcs.
  • Kolom Terakhir: Adalah NET SUBTOTAL per baris.
  • Formulasi Harga Satuan: unit_price = net_subtotal_kolom_terakhir / qty.

Nama Produk di Nota Hasil Ekstraksi Nama (Bersih) Qty Net Subtotal (Kolom Terakhir) Diskon Rp Hasil unit_price
143210 KID115C-SUSU UHT INDOMILK KIDS SUSU UHT INDOMILK KIDS 10 pcs Rp 24.500 Rp 0 Rp 2.450 / pcs
129153 SCIC190-SUSU STERIL INDOMILK CH SUSU STERIL INDOMILK CH 6 pcs Rp 20.700 Rp 0 Rp 3.450 / pcs
439433 UHT180MT-Susu UHT Indomilk Matcha SUSU UHT INDOMILK MATCHA 3 pcs Rp 10.500 Rp 1.350 Rp 3.500 / pcs