Bengkel Pintar ERP
Dokumentasi flow diagram, PRD, dan skenario operasional sistem manajemen bengkel multi-cabang. Setiap modul dilengkapi diagram alur, mockup UI, dan panduan penggunaan. v1.1 โ dashboard widget system, corporate pricing, akuntansi profesional, real-time WebSocket.
๐ Dashboard Widget System
- 20+ widget self-contained: KPI cards, charts, lists, finance
- Layout per role disimpan di DB (
DashboardLayout) - Admin editor drag-drop di
/settings/dashboard - AR Aging widget + TrendChart dengan target line & forecast EOM
- Sensitive widget marker ($) untuk finance widgets
- Detail: Dashboard docs
๐ฅ Customer Type & Corporate Pricing
- 6 customer type: regular / istimewa / internal / corporate / vip / member
- 3 tabel custom pricing: Part / Jasa / Paket
- Corporate fields: NPWP, PIC, contractStart/End, paymentTermDays, creditLimit
- Tempo close untuk AR posting + dueDate
- Detail: CRM docs
๐ณ Kasir & Direct Sale
- DirectSale module โ penjualan langsung tanpa SPK + struk PDF
- closeAsTempo() untuk pembayaran kredit corporate
- Tanpa PPN checkbox per transaksi (WO/Quotation/PO)
- Thousand separator penuh untuk semua input nominal
- Detail: Kasir docs
๐ฆ Inventory: Saldo Awal & Opname
- Form Saldo Awal Stok dengan editable buyPrice
- Form Stock Opname rekonsiliasi fisik vs sistem
- Kolom "Nilai Stok" di tabel inventory
- Validasi non-negatif di keypress level
- Detail: Inventory docs
๐ฐ Akuntansi Profesional
- Saldo Awal akun (opening balance JournalEntry)
- Periode Fiskal: open / closed / locked
- Budget per akun ร bulan ร departemen ร cabang
- AR Aging buckets, postARInvoice, postARReceive
- Detail: Finance docs
๐ง WO Real-time & Field Baru
- WebSocket multi-role: KARU konfirmasi โ SA & mekanik update tanpa refresh
- Field
dueDate&noPpndi WO - Booking pre_wo wajib mekanik, regular tidak perlu
- Bay maintenance auto-filter dari stall picker
- Detail: WO docs ยท Operator docs
๐ RBAC Updates
- Resource baru:
settings.dashboard,inventory.opening,inventory.opname,settings.ai - Auto-link user ke custom role saat create
- LEGACY_ALLOWED diperbarui untuk manager (akses settings.dashboard)
- Detail: RBAC docs
๐จ UI Conventions
- Sticky filter bar + table header rule (universal)
- DataListShell pattern (Acumatica-style)
- Persisted sidebar collapsed state per role (localStorage)
- Kasir layout dapat brand label "Bengkel Pintar"
๐ข Multi Cabang
Setiap cabang beroperasi secara mandiri dengan data terpisah. Kantor pusat dapat memonitor seluruh cabang secara real-time.
๐ฅ Role-Based Access
6 role pengguna: Super Admin, Admin Cabang, Kasir, Mekanik, Kepala Mekanik, Gudang โ setiap role memiliki akses terbatas sesuai fungsinya.
๐ Approval Berjenjang
Transaksi di atas threshold tertentu memerlukan approval berjenjang. Flow approval dapat dikonfigurasi per cabang dan per tipe transaksi.
๐ฑ Responsive UI
Interface dibangun dengan Next.js + Tailwind CSS. Mendukung akses dari desktop maupun tablet untuk semua role operasional.
Frontend (Admin & Landing)
Next.js 15 + React 19, TypeScript strict, Tailwind CSS, native fetch + JWT, WebSocket native via ticket flow
Backend (API)
Hono on Bun (TypeScript), Prisma 7 (driverAdapters), pg, BullMQ workers, node-cron, pino logger, Argon2 password hashing
Storage
PostgreSQL 14+ (eksternal/managed), Redis 7 (shared state, pub/sub, queue broker), MinIO S3-compatible (object storage)
Infrastructure
Docker Compose multi-service, Caddy reverse proxy + active health-check, PgBouncer transaction pool, zero-downtime rolling deploy
Topology Production
API & Worker scalable (rolling deploy zero-downtime). Cron service replicas=1 (anti duplicate trigger). Shared state via Redis.
active health-check
:4100] --> A1[API #1
:4000] C --> A2[API #2
:4000] C --> A3[API #N] A1 --> R[(Redis
:6379
pub/sub + queue
+ ticket store)] A2 --> R A3 --> R A1 --> PB[PgBouncer
txn pool] A2 --> PB A3 --> PB PB --> PG[(PostgreSQL
eksternal)] CRON[Cron Service
replicas=1
node-cron + DB-driven] --> R CRON --> PB W1[Worker #1
BullMQ consumer] --> R W2[Worker #2
scalable] --> R W1 --> PB W1 --> M[(MinIO
S3 object storage)] A1 --> M A2 --> M style C fill:#dbeafe,stroke:#3b82f6 style R fill:#fee2e2,stroke:#dc2626 style PB fill:#fef3c7,stroke:#d97706 style CRON fill:#f0fdf4,stroke:#16a34a
Redis (Shared State)
- Rate-limit cross-instance (atomic INCR + EXPIRE)
- WebSocket ticket store (SETEX + GETDEL one-time)
- WS pub/sub channel
ws:eventsโ event sampai ke semua instance - BullMQ queue broker (pdf, excel, email, whatsapp)
- Cron reload signal channel
cron:reload
Cron Service Terpisah
- Replicas tepat 1 โ anti duplicate trigger saat API scale
- DB-driven schedule (tabel
CronJob,CronRun) - Hot-reload via Redis signal (perubahan UI admin langsung efektif)
- Configurable via Admin โ Settings โ Cron Jobs
- Default jobs auto-seed: stock-alert, booking-reminder, payroll-generate, dst
Worker Queue (BullMQ)
- Offload CPU-heavy: PDF render (PDFKit), Excel build (XLSX)
- Async background: email, WhatsApp, retry strategies
- Scalable, drain-safe rolling deploy
- At-least-once delivery, idempotent handler
Zero-Downtime Deploy
deploy.sh: build โ infra up โ migrate โ rolling api โ rolling worker โ recreate cron- Caddy auto-route via DNS re-resolve (no manual config)
- Healthcheck-driven: container baru harus healthy sebelum container lama dimatikan
- Worker drain in-flight job sebelum exit (BullMQ
worker.close())