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