v1.1.0

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.

20+
Modul
50+
Flow Diagram
22
Skenario
8
Role Pengguna
๐Ÿ“ Changelog v1.1 (Update terbaru)

๐Ÿ“Š 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 & noPpn di 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.

Tech Stack

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

Arsitektur Scaling (Multi-Instance Ready)

Topology Production

API & Worker scalable (rolling deploy zero-downtime). Cron service replicas=1 (anti duplicate trigger). Shared state via Redis.

flowchart TB C[Caddy Reverse Proxy
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())