dmsforall

Features

What dmsforall does for your garage

One browser application for the workshop and the counter. It is alpha software: the last section lists what it does not do.

The workshop

  • Clients and vehicles

    Client records, contacts, vehicles with their owner history, and a global search.

  • Repair orders

    Labour, parts and fee lines, statuses from planned to closed, and supplementary quotes that the client accepts or refuses line by line.

  • Appointments and courtesy cars

    Appointments, and a list of courtesy cars.

  • Time clocking

    Technicians clock their time on repair orders from a shared workshop terminal protected by a PIN, or from their own account.

Invoicing and payments

  • Four kinds of document

    Quotes, purchase orders, invoices and credit notes, plus down-payment invoices. Numbers come from a continuous series for each year.

  • Swiss QR-bill

    Invoices carry a QR reference or a creditor reference, with PDF output. VAT is calculated line by line, and amounts are stored as whole centimes.

  • Locked once issued

    An issued invoice is never edited. A credit note corrects it, and a receptionist can issue one only up to a ceiling that management sets.

  • Payments

    Cash, card, bank transfer, QR-bill, TWINT, compensation and leasing, recorded per invoice, partial payments included.

  • Reminders and export

    Automatic e-mail reminders for overdue invoices, and a WinBIZ export of invoices and payments.

Parts, tyres and cars

  • Parts and stock

    Articles, stock per site, movements that keep who and when, reservations on repair orders, supplier orders and supplier invoices.

  • New and used car sales

    Vehicle stock, sales files, trade-ins, and the confirmation of a credit or a leasing.

  • Tyre storage

    Seasonal tyre sets in storage, flagged for recall when they have not moved for a while.

  • Import from your current system

    An import of Microsoft Access or dBase/FoxPro archives, with a plan to review before anything is written. Tested with archives exported from Auto-i.

Running it

  • Nine roles

    Management, accounting, counter, sales, workshop manager, technician, parts, workshop terminal and technical administrator. One rights matrix, checked by the API on every request.

  • Garages kept apart

    One installation can serve several garages. PostgreSQL row-level security keeps their data separate.

  • An open API

    The API describes its endpoints in OpenAPI, and the web interface calls that API.

  • One Docker stack

    Caddy, web, API, worker, PostgreSQL and Redis, started with one command. An optional profile makes encrypted nightly backups.

What it does not do

  • Not in this version

    Bank statement reconciliation (camt.054), SMS reminders, accounting exports other than WinBIZ, and reliable margins per part, because stock valuation by FIFO is decided but not yet implemented.

  • No second factor for garage staff

    Two-factor sign-in is not available for garage accounts yet. Encryption at rest, off-site backups and the server itself are the operator's job.

  • Proven only in part

    The complete install has not been run end to end on a clean machine with a real domain, and a complete restore of a backup has not been proven yet.

  • Alpha

    The data model, the configuration variables and the screens can still change between releases.

  • French, German and Italian only

    The interface exists in these three languages. The documentation is in English.

  • Designed for Switzerland

    Not designed for other countries.

  • No tax or legal guarantee

    Have invoices, VAT figures and accounting exports checked by a fiduciary.

  • Third-party connectors

    Connectors to outside services need their own licences or accounts.

Get dmsforall running

The first garage account is created with a command that is still being delivered. See Set up your first garage.

$ git clone https://github.com/selfhostr/dmsforall.git && cd dmsforall
$ cp .env.example .env  # optional for a first try
$ docker compose up -d  # then open http://localhost:8080