← All projects

Odoo 17 Community · Automotive service · 2 branches · Live

Saigon Car Care — multi-branch workshop ERP

One system for the whole chain: from the first quotation to the payslip of the technician who did the work.

Client
Saigon Car Care — car care, maintenance and detailing, two branches

Platform
Odoo 17 Community, PostgreSQL, OWL

Scope
Sales, inventory, invoicing, expenses, purchasing, HR & payroll, management reporting, website

Custom modules
Workshop core · Expense & purchasing · HR & payroll

Footprint
17 new models, 11 standard models extended, ~3,400 lines of Python

My role
Systems Analyst & lead implementer — requirements, solution design, module development, data migration, UAT, training

The challenge

The chain ran on an Odoo Enterprise trial that had expired. Quotations, work orders and receipts were printed from ad-hoc templates; service history was tied to customers rather than vehicles, so it was lost whenever a car changed hands; expenses were recorded outside the books; and salary advances and payroll for technicians were calculated by hand in spreadsheets.

The solution

Rather than bolt on generic apps, I designed three tightly integrated modules on top of standard Sales, Inventory and Accounting — each enforcing the business rules the owners had signed off.

Module 1 · Workshop core

Sales, vehicles & documents

  • Licence-plate-first vehicle registry. Plates are normalised and unique; typing a plate on an order suggests the owner, and an unknown plate creates the vehicle on save.
  • Ownership history. When a car is sold or traded in, ownership is transferred with a dated history record — the vehicle keeps its full service record while past orders stay with the previous owner.
  • End-to-end flow: quotation → confirmation → work order → invoice → receipt, with line- and order-level discounts recalculated on untaxed amounts.
  • Stock-aware ordering. Live availability on each line, an out-of-stock warning before confirmation, automatic delivery validation on invoicing, and an optional warehouse-approval step.
  • Safe cancellation. Cancelling a delivered, invoiced order generates the stock returns, unreconciles and removes only the payments tied exclusively to that invoice, then cancels the order — no orphaned entries.
  • Branded print-outs for quotations, work orders, invoices and receipts, with mixed VAT (0% / 8% / 10%) or single-rate layouts, printed straight from the browser or downloaded as PDF.

Module 2 · Expense & purchasing

Every cost on the books

  • Expense categories mapped to GL accounts (utilities, rent, salaries, advances, purchases…); payment vouchers post directly to the right expense account.
  • Voucher control: supplier invoice number, due date and a searchable Unpaid / Paid / Overdue status; posted amounts and accounts are locked, only descriptions can change.
  • Purchase receipts without the Purchase app. One document receives the goods (validated stock move, average cost in the product's base unit) and creates the matching payment; cancelling it checks stock and posts the return.
  • Revenue vs. expense report — a custom OWL screen aggregating journal items by day, week, month, quarter or year; revenue by account, expenses by category; click any figure to drill into the source entries; export to Excel.

Module 3 · HR & payroll

Advances and payroll without spreadsheets

  • Salary configuration with monthly history per employee; a configuration locks once it has been used in an approved payroll.
  • Allowance types paid either as a fixed monthly amount or pro-rata per day worked.
  • Salary advances with instalment schedules. An advance is repaid over several months; if a month is already closed, the schedule shifts forward automatically and the change is logged. Early repayment is handled by a refund wizard that issues a receipt.
  • Monthly payroll run: load salaries and planned advance deductions in one click, record leave days, bonuses and penalties; approval is blocked if leave exceeds standard days or net pay would go negative.
  • Accounting integration. Paying an advance or a payroll creates a payment voucher posted to the salary / advance expense category; un-approving reverses it cleanly.

Delivery

  • Migrated each branch's live orders, invoices and payments from the Enterprise database, preserving document numbers and reconciliations.
  • Designed role-based access groups — Sales, Warehouse, Accounting, Marketing, Admin — so each person sees only their own work.
  • Built a management dashboard (revenue, receivables, uninvoiced orders, new customers, top services) and replicated it across both branches.
  • Wrote role-based user guides and trained staff on desktop and on the Odoo mobile app.

Outcome

Both branches now run on the same process design: a vehicle's full history is one search away, every document prints in the house format, every cost lands in the right account, and payroll that used to take a day of spreadsheet work is a reviewed, one-click run.

Discuss a similar project
Zalo