Drabok DMSDealership Management System
Self-host Get started
Open-source · Laravel API + React SPA · Double-entry accounting

Run your dealership on one clean system — sales, stock & accounts.

Drabok DMS unifies purchase & sales invoices, batch / serial inventory, and double-entry accounting with journals, ledger, trial balance, cost centers, cash & bank — plus roles, permissions and a live dashboard.

Deploy Drabok DMS → Explore modules
MIT-style skeleton · SQLite-ready · No license fees · Your data stays yours
14journal types (Sales, Purchase, Payment, Receipt, Contra…)
3-waystock tracking: item → batch → serial
20+modules: parties, warehouses, cash, bank, users, roles…
100%balanced books — debit must equal credit
What you get

Everything a dealership needs, without the Tally-era pain.

One login for the showroom, the warehouse and the accountant. Every invoice posts to the books, every stock move is traceable, every user action is permission-guarded.

🧾

Sales & Purchase Invoices

Create invoices with line items, parties, taxes and discounts. Posting generates balanced journal entries automatically.

  • Auto double-entry posting
  • Party-wise history
  • Draft → Posted lifecycle
⚖️

Real Double-Entry Accounting

Chart of accounts, groups, cost centers, and 14 journal types with debit = credit enforcement on every line.

  • Balance validation per line
  • Posted entries are immutable
  • Cash / cheque / bank metadata
📦

Inventory That Scales

Items, units, warehouses, batches and serials. Opening stocks, manual closing stocks and full movement ledger.

  • Batch + serial traceability
  • Multi-warehouse
  • Stock valuation friendly
🏦

Cash, Bank & Parties

Cash funds, bank accounts, customers and suppliers in one master-data hub with searchable comboboxes everywhere.

  • Instrument no. & date tracking
  • Receivables / payables ready
  • Fast lazy-loaded selects
📊

Reports & Dashboard

Live summary KPIs plus ledger drill-down and trial balance. P&L and balance-sheet formats follow proven Tally-style structure.

  • Ledger by account & date
  • Trial balance
  • Closing-stock aware P&L
🔐

Roles, Permissions & Audit

Spatie-powered RBAC with users, roles and granular permissions. Automated entries can't be edited behind your back.

  • Guarded API routes
  • Delete confirmations
  • Toast + error logging
Accounting core

Debits always equal credits. The system won't let you break it.

Each journal entry carries a header (date, type, status, SI no.) plus ≥2 lines. A line holds exactly one of debit / credit, an account, optional cost center, and payment metadata. Automated and posted entries are locked.

JournalPaymentReceiptContraSalesPurchaseCredit NoteDebit NoteStockAdjustmentRevaluationReversalOpeningClosing

Statuses: Draft Posted Cancelled  · SLO-safe pagination, debounced search, stale-request protection.

POST /api/journal-entries201 Created
{
  "type": "Sales",
  "date": "2026-09-05",
  "status": "Posted",
  "description": "Invoice INV-2081 / Party: Karim Motors",
  "lines": [
    { "account_id": 12, "debit": 85000.00, "credit": 0,
      "description": "Receivable — Karim Motors" },
    { "account_id": 41, "debit": 0, "credit": 85000.00,
      "description": "Sales account",
      "cost_center_id": 3 }
  ]
}

// server validates:
// • each line: debit XOR credit
// • Σ debit == Σ credit (4-decimal)
// • automated / posted entries immutable
Inventory core

From warehouse shelf to serial number.

Track quantities and cost with a stock-move ledger (in-cost / out-cost), so COGS and closing stock stay consistent — the same logic your accountant uses for the income statement: COGS = Opening + Purchases − Closing.

🏷️

Items & Units

SKU, units, purchase/sales ledgers per item. Clean selects across invoices & journals.

🗂️

Batches

Lot-wise quantity & expiry-friendly tracking for parts, tyres, batteries.

🔢

Serials

Chassis / engine / VIN-level traceability for vehicles and high-value parts.

🏬

Warehouses

Showroom, godown, service-center stocks separated — with opening & dated closing balances.

How it works

Invoice in. Ledger updated. Stock moved.

No re-typing between systems. The document flow does the accounting for you.

1 · Master data

Create account groups, ledgers, cost centers, parties, warehouses, cash/bank, stock items.

2 · Buy & sell

Raise purchase & sales invoices against parties; pick batches/serials and warehouse.

3 · Auto-posting

Each invoice emits balanced journal lines (receivable ↔ sales, stock ↔ payable, cash/bank legs).

4 · Close & report

Post journals, record closing stock, then read ledger, trial balance and P&L.

Reports

Answers your accountant will trust.

Ledger drill-down per account with opening / movement / closing. Trial balance with debit–credit equality check. Income statement nets sales, purchases, direct/indirect heads and closing-stock-derived COGS; the balance sheet carries capital, loans, current assets/liabilities and the period profit.

📒 Ledger report

Filter by account + date range. Every row links back to its journal entry.

⚖️ Trial balance

One-screen debit = credit proof before you close the month.

Built-in report formats

Documented in doc/ and followed by the report engine:

  • Profit & Loss — net sales, net purchases, direct expenses, opening/closing stock, gross & net profit
  • Balance Sheet — capital, loans, current liabilities/assets, stock-in-hand from stock tables
  • Manual closing-stock ladder — dated valuations carried forward (Tally-style)
  • Dashboard summary API — GET /api/dashboard/summary
Under the hood

Boring tech, in a good way.

Predictable Laravel conventions + a fast React SPA. Easy to self-host, easy for AI coding agents and juniors to extend — every new CRUD follows the same documented pattern (migration → model → controller → routes → service → 3 components).

Laravel 13 APIReact 19 SPAReact Router 7Tailwind CSS 4shadcn / Base UISpatie PermissionsSQLite / MySQLVitePest tests

🚀 Quick start

composer setup installs deps, copies .env, migrates & builds. Demo data via DemoDataSeeder.

🖥️ Self-host

Any PHP 8.3 host + SQLite works. Serve with php artisan serve and npm run dev / npm run build.

🧩 Extend

Copy the doc/crud.md + doc/journal.md checklist: index / list / show / store / update / destroy + transform().

FAQ

Common questions.

Is Drabok DMS a Tally replacement?

For dealership workflows — yes for daily books: sales/purchase, receipts/payments, stock with batches & serials, ledger and trial balance. It intentionally mirrors Tally-style closing-stock and P&L logic so accountants feel at home.

Can invoices edit the accounts directly?

No — and that's by design. Invoices create automated journal entries, which are immutable. Corrections go through reversals, credit/debit notes or new entries, keeping an audit trail.

Does it support multiple branches / cost centers?

Yes. Cost centers tag journal lines for branch/division reporting, and warehouses separate physical stock.

What do I need to run it?

PHP 8.3+, Composer, Node 20+, and SQLite (default) or MySQL. See doc/setup.md and doc/commands.md in the repo.

Where is the documentation?

Alongside this page in doc/: CRUD pattern, journal architecture, stock valuation notes, report formats, setup & commands.

Get started

Put the whole dealership on one ledger.

Clone the repo, run setup, and raise your first sales invoice in minutes.

Drabok DMS · Dealership Management · Accounting + Inventory · Built with Laravel & React