Alur memo
Halaman memo dan inbox di frontend terhubung ke endpoint bisnis pada backend. Memo yang dikirim memiliki status on progress dan lock=true. Penerima aktif ditentukan oleh memo.to, yang dicocokkan dengan username pengguna yang login.
Buat memo → Tambah detail/lampiran → Inbox persetujuan
├─ Approve → Pembayaran bank → Selesai
├─ Revise → Perbaikan memo
└─ Reject → Ditolak
1. Pembuatan memo
Halaman apps/web/src/pages/MemosPage.tsx dan apps/web/src/pages/MemoDetailPage.tsx menampilkan daftar serta detail memo pada frontend React. Backend Go menyediakan POST /api/memo dan PUT /api/memo/:id. Detail, akun, dan pembayaran terkait diproses bersama perubahan memo pada repository inti. Backend menetapkan status awal on progress dan lock=true, termasuk ketika client lama mengirim Draft. Memo terkunci tidak dapat diedit. Setelah keputusan Revise, pengirim dapat mengedit dan mengirim ulang; pengiriman ulang kembali menjadi on progress dan terkunci.
2. Lampiran dan OCR
Lampiran diunggah ke POST /api/memo/attachment sebagai multipart dengan field file dan opsional memo_no. Backend menyimpan file, lalu membaca pengaturan is_ocr perusahaan pengguna. Jika OCR aktif dan client tersedia, backend mengirim job ke layanan OCR. Hasil job dapat dipoll melalui GET /api/ocr/jobs/:job_id.
Repository relasi job–lampiran sudah tersedia, tetapi handler unggah belum memanggilnya. Karena itu callback dan status OCR berdasarkan ID lampiran belum dapat diandalkan untuk alur penuh. Detail ada di status implementasi.
3. Inbox persetujuan
Tab Approval mengambil daftar melalui POST /api/memo/inbox dengan body {}. Backend memilih memo dengan memo.to sama dengan username dalam sesi; parameter to dari client tidak dapat mengganti pengguna inbox.
Pada web, halaman dipisahkan sebagai berikut:
| Halaman | Route | Fungsi |
|---|---|---|
| Buat | /memos/new | Membuat dan mengirim memo |
| Daftar approval | /memos/approval | Memo yang ditujukan kepada pengguna |
| Baca | /memos/:id | Detail, lampiran, biaya, rekening, dan riwayat tanpa form edit |
| Approval | /memos/approval/:id | Keputusan Approve, Revise, atau Reject |
| Edit revisi | /memos/:id/edit | Form untuk pengirim saat memo tidak terkunci |
PWA memiliki halaman baca /memos/:id dan halaman approval /approvals/:id.
Respons detail mempertahankan status dan to yang tersimpan. next_to, next_status, dan approve_list menjelaskan langkah berikutnya tanpa mengganti status memo saat ini.
Keputusan memakai POST /api/memo/inbox/approve dengan {id,to}, /revise dengan {id,notes}, atau /reject dengan {id}. Backend memverifikasi penerima aktif dan status di dalam transaksi dengan penguncian baris. Approve hanya menerima penerima dari jalur yang dihitung backend; status keputusan ditentukan backend. Revise mengosongkan penerima, menetapkan revise, dan membuka lock. Reject mengosongkan penerima, menetapkan reject, dan mempertahankan lock. Riwayat keputusan direkam sebagai log memo, dan daftar diperbarui setelah keputusan berhasil.
4. Pembayaran dan pelaporan
Memo yang telah mencapai status sesuai dapat masuk ke proses create-bank-payment dan approve-bank-payment. Jalur prepayment memiliki aturan tambahan untuk penyelesaian dan pengembalian dana. Endpoint laporan mengelompokkan memo menurut kategori, perusahaan, dan total.
Lokasi kode
| Area | Lokasi |
|---|---|
| Halaman daftar/detail | apps/web/src/pages/MemosPage.tsx, apps/web/src/pages/MemoDetailPage.tsx |
| API client dan hooks | apps/web/lib/api/memo.ts, apps/web/lib/api/memoInbox.ts, apps/web/lib/api/memoAttachments.ts |
| Route Go | apps/api/internal/server/server.go |
| Logika memo | apps/api/internal/server/memo_core.go |
| Lampiran | apps/api/internal/server/memo_attachment.go |
| Repository job OCR | apps/api/internal/server/ocr_attachment_jobs.go |
Untuk detail payload, respons, dan autentikasi, lihat referensi API dan Swagger yang disediakan server Go.