# Changelog & Bug Fix ERP KeluargaMart **Tanggal: 9 September 2026** Hari ini saya fokus beresin beberapa masalah besar di KeluargaMart ERP, terutama yang berkaitan dengan accounting, RBAC, detail page, Sales Order, dan beberapa endpoint yang sebelumnya masih mock atau tidak sinkron antara frontend dan backend. Target utamanya bukan cuma bikin error hilang, tapi memastikan akses, data, API, dan alur antar modul benar-benar konsisten. ## Perbaikan yang saya kerjakan ### 1. Modul Accounting yang sebelumnya masih mock sekarang sudah benar-benar dibuat Sebelumnya menu Jurnal, Buku Besar, COA, dan Deposit Customer masih banyak yang menggunakan mock atau endpoint yang belum ada. Akibatnya beberapa halaman langsung mentok `404 Data tidak ditemukan`. Sekarang modul accounting sudah saya wiring ke backend dan database. Yang sudah saya buat/perbaiki: * COA sudah menggunakan struktur parent/child. * Setiap akun punya normal balance debit/kredit. * Ada penanda account yang masih bisa diposting atau hanya sebagai parent. * Sudah ada seed akun accounting yang diperlukan, termasuk: * Uang Muka Penjualan * Uang Muka Pembelian * Piutang B2B * Hutang Supplier * Sudah ada Accounting Department. * Jurnal sekarang bisa dibuat, diedit, dihapus selama masih draft. * Jurnal bisa diposting setelah debit dan kredit balance. * Jurnal yang sudah posted bisa di-void. * Jurnal juga bisa di-reverse dengan membuat jurnal pembalik. * Nomor jurnal sekarang dibuat otomatis. * Buku Besar sudah mengambil data dari backend dan bisa difilter berdasarkan tanggal, jenis jurnal, toko, dan akun. * Export Buku Besar sekarang benar-benar mengambil file CSV dari backend. * Deposit Customer sudah support penerimaan uang muka, alokasi ke invoice, dan refund. * Auto-journal untuk transaksi deposit juga sudah dibuat. * Trial Balance sudah tersedia. Endpoint dan query accounting juga sudah saya sinkronkan dengan sqlc, migration, seed, dan OpenAPI. ### 2. RBAC saya rapikan lagi karena sebelumnya banyak akses yang tidak sesuai Ini salah satu bagian yang paling banyak bermasalah. Sebelumnya ada beberapa kondisi seperti: * user bisa melihat menu tetapi saat memanggil API malah `403`; * role tertentu masih bisa membuka halaman yang seharusnya tidak boleh; * `system` bisa melakukan bypass seperti admin; * mapping accounting masih salah masuk ke finance; * beberapa route punya permission yang terlalu umum; * buyer bisa berpotensi masuk ke area ERP; * scope toko belum konsisten. Sekarang saya ubah supaya pengecekan frontend dan backend mengikuti model permission yang sama. Untuk application access: * `admin` dan `owner` bisa masuk ERP, POS, dan B2B. * role internal seperti GM, BM, SPV, Sales, Finance, Warehouse, HR, Store Manager, dan System masuk ERP. * `cashier` hanya masuk POS. * `buyer` hanya masuk B2B/ecommerce dan ditolak kalau mencoba masuk ERP. Role `system` juga sudah saya keluarkan dari mekanisme bypass admin. Bypass sekarang hanya untuk admin/owner. Di frontend, setiap route sekarang punya permission yang lebih spesifik. Contohnya: * `accounting.journals.view` * `accounting.ledger.view` * `accounting.coa.view` * `fakturisasi.invoices.view` * `inventory.transfers.view` Jadi tidak cukup hanya punya akses ke modul besarnya. Permission untuk halaman yang dibuka juga harus benar. Mapping module accounting yang sebelumnya salah saya pindahkan ke prefix `accounting`. Saya juga rapikan `PERM_GROUPS` supaya permission yang dipakai frontend tidak lagi campur-campur dengan nama lama. ### 3. Store scope diperketat Kepala toko hanya boleh melihat data tokonya sendiri. Sebelumnya ada beberapa endpoint yang masih berpotensi mengambil semua toko lalu difilter di frontend. Itu saya ubah supaya backend langsung melakukan filtering berdasarkan `store_users` dan `AllowedStoreIDs`. Yang saya perbaiki antara lain: * List Stores * Get Store * Update Store * List Store Users * Add Store User * Remove Store User * Members Dengan begitu frontend tidak perlu mengambil semua data untuk mencari satu toko. ### 4. Notifications dan route lama saya bereskan Ada endpoint notification yang sebelumnya berpotensi diakses dari aplikasi yang seharusnya tidak boleh. Sekarang `/notifications` dibatasi hanya untuk ERP dan POS. Route lama yang sudah tidak dipakai juga saya hapus, termasuk route seperti: * `/support` * `/admin` * beberapa endpoint notification lama Saya sekalian cek konsumennya supaya tidak ada frontend yang masih bergantung ke route tersebut. ### 5. Serializer invoice, payment, dan delivery order diperbaiki Ada beberapa halaman detail yang sebenarnya datanya sudah ada di database, tetapi frontend tidak mendapatkan field yang diperlukan. Di invoice detail sekarang item invoice sudah ikut dikirim. Receivables sekarang juga sudah mengembalikan: * nama sales * nomor Sales Order * payment terms * nomor HP customer Untuk payment, filtering berdasarkan invoice/payable sekarang dilakukan di backend. Jadi frontend tidak perlu lagi mengambil banyak data lalu menyaring sendiri. Delivery Order sekarang juga mengirim: * nama sales * nama penerima * tanggal pengiriman Field tetap disembunyikan kalau sumber datanya memang `null`. ### 6. Sales Order error `can't access lexical declaration 'q' before initialization` sudah diperbaiki Ini salah satu error frontend yang cukup mengganggu. Masalahnya ternyata `watch()` menggunakan variabel sebelum deklarasinya selesai. Saya pindahkan destructuring yang berkaitan dengan `useListPage` ke posisi yang benar sehingga `q/items` sudah tersedia ketika dipakai oleh watcher. Sekalian saya perbaiki beberapa masalah lain di Sales Order: * search sekarang benar-benar bekerja; * filter yang sebelumnya tidak melakukan apa-apa sudah dihubungkan ke `setFilter`; * `supervisor_id` sekarang ikut dikirim saat create Sales Order; * klik row sekarang langsung membuka detail Sales Order; * modal detail duplikat dihapus; * fallback data palsu `Minyak Goreng Sania` dihapus; * kalau API gagal, sekarang muncul toast/error state yang benar. Di Receivables juga saya hapus fallback data palsu `Doni Saputra`. ### 7. Placeholder/mock yang masih menutupi error saya bersihkan Ada beberapa bagian yang sebelumnya terlihat seperti berhasil padahal sebenarnya cuma menggunakan data dummy. Saya hapus atau perbaiki bagian seperti: * fallback produk palsu; * nama sales palsu; * data distribution palsu; * Sales Dashboard wrapper yang tidak lagi digunakan; * Sales Activity Map lama; * service lama seperti `crud.js`, `finance2.js`, dan `branch.js`; * export/fungsi lama seperti `posCheckout`, `salespersonPerformance`, dan `payPartial`; * mock yang sebelumnya melakukan create/update tetapi tidak benar-benar melakukan mutasi. Jadi sekarang kalau backend gagal, UI tidak lagi pura-pura menampilkan data sukses. ### 8. Mock auth saya samakan dengan behavior backend Sebelumnya mock auth masih punya perilaku sendiri sehingga hasil permission di frontend bisa berbeda dengan backend. Sekarang `application_access` pada mock diturunkan dengan logika yang sama seperti backend. `me()` juga sekarang mengembalikan `EffectivePermissions`. Admin/owner mendapatkan wildcard permission, sementara role lain mengikuti `rolePermissionGlobs`. Dengan ini pengujian menggunakan mock lebih dekat dengan perilaku aplikasi sebenarnya. ### 9. Detail pages saya rapikan Beberapa detail page juga ikut saya perbaiki. Purchase Order: * tombol Print sekarang menggunakan data detail yang benar, bukan `selected` yang kosong. Transfer dan Opname: * error yang sebelumnya silent sekarang menghasilkan toast. Branch Detail: * tidak lagi load semua toko lalu mencari satu toko dari frontend; * sekarang langsung request `/stores/{id}`. Advances: * halaman detail sekarang benar-benar mengambil data advance berdasarkan ID; * transaction history ikut ditampilkan. COA, Jurnal, dan Buku Besar: * sudah menangani field nominal dari backend yang dikirim sebagai string `NUMERIC`; * di frontend sekarang dikonversi dengan benar sebelum formatting. Export Ledger: * tidak lagi memakai `window.open`; * sekarang menggunakan response blob agar tidak terkena masalah auth/401. Finance Hub: * error yang sebelumnya ditelan oleh `catch` sekarang ditampilkan sebagai error state. ### 10. Tracking dan Distribution saya sambungkan ke data asli Tracking sebelumnya masih ada bagian yang terpotong dan beberapa halaman memakai data hardcoded. Sekarang tracking sudah mencakup: * kunjungan * lokasi * aktivitas * rute Tracking Map juga sudah saya hubungkan ke endpoint distribution dan tracking shipment yang sebenarnya. Untuk Distribution, fabrikasi `sales_name` juga sudah saya hapus. ### 11. Error handling frontend saya samakan Saya rapikan interceptor HTTP supaya error lebih konsisten. Sekarang beberapa error utama diterjemahkan menjadi pesan yang lebih jelas: * `401` → session tidak valid / diarahkan ke login * `403` → Anda tidak memiliki akses * `404` → Data tidak ditemukan * `409` → konflik data * `422` → data tidak valid * `429` → terlalu banyak request * `5xx` → terjadi masalah di server * network error * timeout `err.response` juga tetap dipertahankan supaya halaman yang memang membutuhkan detail response masih bisa membacanya. ### 12. Upload produk juga saya perbaiki URL upload sebelumnya salah karena masih bergantung pada path relatif yang tidak sesuai dengan konfigurasi API. Sekarang URL upload menggunakan alamat absolut dan prefix `/api/v1` tidak lagi terduplikasi. ### 13. Permission per-user sekarang ikut benar Selain permission berdasarkan role, override permission per user juga sudah tetap didukung. Jadi permission efektif berasal dari: * default di kode; * permission role; * override `users.permissions`. Untuk override per-user, perubahan tetap dicatat di activity log. Artinya pengaturan permission dari menu Users tetap bisa digunakan tanpa merusak permission default berdasarkan role. ## Verifikasi setelah perubahan Setelah semua perubahan saya jalankan dan cek ulang. Backend: * `go vet` berhasil. * `go test ./... -count=1` berhasil. * `go build ./...` berhasil. * `sqlc generate` idempoten. * `atlas migrate validate` berhasil. * test kecocokan mounted routes dengan OpenAPI berhasil. Frontend: * Vitest `39/39` berhasil. * Vite build berhasil. Saya juga melakukan smoke test melalui browser sebagai admin pada beberapa area utama seperti: * Sales Orders * Accounting * Finance * Purchasing * Inventory * Distribution * System * Tracking * Reports * HR Hasilnya route bisa dibuka, data muncul, dan tidak ditemukan `pageerror`. CI GitHub Actions juga sudah kembali hijau. ## Keputusan arsitektur Untuk sekarang ERP tetap menggunakan Vue 3 + Vite. Saya tidak pindahkan ERP ke Nuxt 4 karena ERP ini merupakan SPA internal dan tidak membutuhkan SEO atau SSR. Bagian B2B yang memang membutuhkan SEO sudah menggunakan Nuxt. ERP sendiri sudah memiliki 40+ halaman dan sudah menggunakan code splitting. Auth juga menggunakan Bearer token dan backend Go sudah menjadi sumber kebenaran utama, sehingga menambahkan Nitro BFF/Nuxt tidak memberikan keuntungan yang cukup dibanding biaya migrasinya. Jadi untuk sekarang tidak ada alasan teknis yang cukup kuat untuk melakukan migrasi besar-besaran hanya demi mengganti framework frontend. ## Catatan accounting Ada beberapa batasan yang memang sengaja belum saya ubah karena tidak ingin mengubah semantics accounting yang sudah ditentukan. Ledger dan Trial Balance hanya menghitung transaksi yang sudah posted dan reversed. Draft dan void tidak dihitung, sedangkan jurnal reverse akan saling meniadakan dengan jurnal asalnya. Invoice dan cashflow juga belum otomatis membuat seluruh jurnal double-entry. Saat ini yang otomatis baru alur deposit, sedangkan wiring accounting penuh untuk invoice/cashflow masih ditunda. ## Kesimpulan Fokus perbaikan kali ini adalah membuat ERP kembali konsisten antara frontend, backend, database, dan permission. Masalah `404` pada accounting, `403` karena RBAC yang tidak sinkron, error Sales Order, detail page yang kosong, data dummy, route mati, store scope, sampai mock auth yang berbeda dari backend sudah saya bereskan. Sekarang sebagian besar modul utama sudah menggunakan data dan permission yang sebenarnya, bukan lagi menutupi error dengan fallback atau mock.