v1.0.0-003 : Perbaikan State OCR & Backend Diskon/Koreksi
Memperbaiki state halusinasi OCR dan menyimpan data diskon & koreksi manual pada backend.
Blonjo2mnt baca
- Pembersihan State Transaksi (Fix Halusinasi OCR): Transaksi yang berhasil disimpan kini akan menghapus seluruh state OCR dan Smart Note secara menyeluruh (termasuk Task ID dan source type). Pengguna tidak perlu memuat ulang (reload) halaman secara manual untuk memindai nota baru, memastikan OCR berikutnya tidak berhalusinasi dengan sisa data transaksi sebelumnya.
- Backend - Support Diskon & Koreksi Item: Database
sajen(tabelinventory_logs) kini memiliki kolomdiscount_value,is_percent, danis_manual_correctionsehingga item yang memiliki diskon atau merupakan hasil koreksi manual saat proses verifikasi OCR, data diskonnya tersimpan utuh di database (walau tidak dimunculkan secara terpisah di tabel rekap utama yang sudah mengandung harga net).
- Blonjo UI: Memodifikasi
Transactions.tsxdengan menambahkanhandleFullResetyang menjalankan reset komprehensif pada fungsionSuccessdari konfirmasi transaksi. Reset ini mencakupSmartNotedan status file upload diuseOcrUpload(membersihkanocrTaskIdyang tertinggal). - Sajen API:
- Update schema model
InventoryLogdiapp/models/inventory.py. - Update logika penyimpanan log di
app/services/accounting.pyagar meneruskan field diskon dan koreksi manual ke dalamInventoryLog.
- Update schema model
- Masalah 1 (Parsing NLP): Saat pengguna memberikan input teks bebas (tanpa format baku), ada dua masalah:
- Total Harga: Karena teks tidak menyebutkan “Total”, AI tidak mengisi field
total_amountdan juga salah dalam penjurnalan. App harus cukup pintar menghitung total secara mandiri. - Tempo: Kata-kata seperti “METODE PEMBAYARAN TEMPO DENGAN JATUH TEMPO PADA TANGGAL 03/08/2026” tidak dikenali sama sekali oleh AI, sehingga jatuh tempo dan metode pembayaran gagal di-ekstrak.
- Total Harga: Karena teks tidak menyebutkan “Total”, AI tidak mengisi field
- Masalah 2 (Migrasi Database): Terjadi rentetan error saat proses deploy VPS akibat riwayat migrasi Alembic yang tidak sinkron dengan kondisi real tabel (seperti
DuplicateTablepadajournal_mappingsdan sebagainya). - Analisis:
- Sisi AI (mcp-server): Prompt sistem saat ini belum secara eksplisit meminta AI untuk bertindak sebagai kalkulator (menjumlahkan qty * harga) apabila kata “Total” absen. LLM juga butuh pengenalan konteks natural language Indonesia secara lebih spesifik terkait kata “tempo”.
- Sisi DB (sajen-api): Migrasi lama ter-generate dalam kondisi tabel sudah ada di production, sehingga
upgrade()konvensional menyebabkan transaksi DB gagal (InFailedSqlTransaction) danDuplicateTable. Namun, penerapan inspeksi denganInspectortidak memadai dalam transaksi DDL PostgreSQL.
- Rencana Eksekusi (PLAN):
- [Selesai] Fix Migrasi DB: Menyempurnakan semua file migrasi bermasalah dengan membuat pembungkus (wrapper) custom bernama
safe_executeyang memanfaatkanSAVEPOINTPostgreSQL. Hal ini mencegah Alembic melakukan crash deploy jika entitas sudah ada di database live. - Perbaikan Prompt AI (
transactionParser.ts):- Menambahkan instruksi ketat: “Jika tidak ada nominal total di teks, KAMU WAJIB menghitung total sendiri (qty * price) dan mengisinya ke
total_amountsertajournal_entries.” - Menambahkan panduan pengenalan metode bayar: “Kenali frasa ‘PEMBAYARAN TEMPO’ dan petakan sebagai
payment_method: 'tempo', lalu cari tanggal jatuh temponya untuk fielddue_datedalam format ISO.”
- Menambahkan instruksi ketat: “Jika tidak ada nominal total di teks, KAMU WAJIB menghitung total sendiri (qty * price) dan mengisinya ke
- Pengujian Menyeluruh: Memastikan deploy lancar dan menguji coba ulang teks input yang persis seperti kendala pengguna.
- [Selesai] Fix Migrasi DB: Menyempurnakan semua file migrasi bermasalah dengan membuat pembungkus (wrapper) custom bernama
Karena migrasi Alembic menggunakan transaksi tunggal, error satu perintah DDL (seperti CREATE TABLE yang sudah ada) akan menggagalkan seluruh transaksi (masalah InFailedSqlTransaction).
Untuk mengatasinya, kami membuat pembungkus kode safe_execute di setiap file migrasi yang bermasalah.
sequenceDiagram
participant Alembic
participant SafeExecute as safe_execute(wrapper)
participant PostgreSQL as Database (Live)
Alembic->>SafeExecute: Minta buat tabel X (op.create_table)
SafeExecute->>PostgreSQL: SAVEPOINT sp1
SafeExecute->>PostgreSQL: CREATE TABLE X
alt Jika X belum ada (Berhasil)
PostgreSQL-->>SafeExecute: Success
SafeExecute->>PostgreSQL: RELEASE SAVEPOINT sp1
else Jika X sudah ada (DuplicateTable Error)
PostgreSQL-->>SafeExecute: Error (Relation exists)
SafeExecute->>PostgreSQL: ROLLBACK TO SAVEPOINT sp1
SafeExecute-->>Alembic: Error diabaikan (Tabel sudah aman)
end
Dengan mekanisme di atas, data dan struktur live dijamin aman tanpa modifikasi paksa, dan proses deploy tidak terputus karena kesalahan duplikasi objek.