In productie

Het portaal waarop een autobedrijf zijn dag draait

Offertes, werkbonnen, facturen, klanten en voertuigen, planning, een gedeelde inbox, boekhouding en bankkoppelingen in één systeem. Gebruikt aan de balie, in de werkplaats en door de eigenaar.

Rol
Hoofdontwikkelaar
Periode
Sinds augustus 2024
Stack
TypeScript, Next.js, React, tRPC, Prisma, MySQL, Docker, GitHub Actions
Status
In productie
InboxOfferteWerkbonFactuurBankmatchingBoekhoudingmail en WhatsApp, met AI-conceptenautomatisch gematcht, zonder dubbele boekingenMonteurs klokken in met een ondertekende NFC-tag.21 achtergrondtaken met een lock: nooit dubbel,ook niet tijdens een uitrol.
Schets in plaats van schermen: de klant blijft anoniem.

Het probleem

Het bedrijf werkte met losse spreadsheets en losse back-office-tools. Offertes, werkorders, betalingen en klantcontact zaten niet aan elkaar vast.

Wat ik bouwde

Eén systeem, van offerte met voertuig, via goedkeuring en werkbon, tot factuur en de bijbehorende bankboeking. Monteurs klokken in met een NFC-tag aan de muur en werken vanaf een tablet: foto's uploaden, taken afronden.

Mail en WhatsApp komen binnen in één inbox, en de boekhouding wordt automatisch gematcht met de bankrekeningen en doorgeboekt.

Wat er technisch toe doet

  1. Uitrollen zonder dat iemand het merkt

    Een nieuwe versie start op eigen hardware naast de oude en neemt het pas over als de health-check precies die versie meldt. Terugdraaien slaat de schemastap over, en het deployscript heeft een eigen testsuite.

  2. Achtergrondtaken die nooit dubbel draaien

    Tijdens een uitrol draaien twee versies naast elkaar. Elke taak waarbij een dubbele run schade doet, zoals de banksync en de boekingen, neemt daarom eerst een lock in de database: 21 taken in totaal.

  3. Inklokken met ondertekende NFC-tags

    Monteurs tikken een NFC-tag aan de muur. De server controleert de cryptografische handtekening die de chip bij elke tik maakt, zodat een geldige tik alleen van de echte tag kan komen.

  4. Een gedeelde inbox die bijblijft

    Een losse worker houdt de mailverbindingen live open en levert aan dezelfde synchronisatie als de geplande run en de handmatige knop, zodat die nooit uit elkaar lopen. Mailwachtwoorden staan versleuteld in de database.

  5. De AI stelt voor, de server stelt vast

    In de inbox zet een AI-assistent concepten en offertevoorstellen klaar. Het model leest en kiest; elke prijs en elk kenteken controleert de server opnieuw tegen de bron.

  6. Bank en boekhouding zonder dubbele boekingen

    Transacties uit vier betaalbronnen worden gelijkgetrokken en aan facturen gekoppeld. Boekingen gaan via een geplande run met een controle vooraf en een vingerafdruk per bron, zodat niets twee keer wordt geboekt.

  7. Een AI-assistent die namens de gebruiker werkt

    Via een eigen koppeling met OAuth werkt een AI-assistent in het portaal met de rechten van de gebruiker, begrensd per rol en scope. Elke wijziging wordt met de stand ervoor en erna vastgelegd en is in één stap terug te draaien.

Meetstaat

Geteld in de repository, alleen bestanden in git.

eerste commit
17-08-2024
pagina's
64
datamodellen in het schema
158
testbestanden
1.377
achtergrondtaken met een databaselock
21
Hoe gemeten
git log --reverse --format='%ad' --date=short | head -1
git ls-files 'app/**/page.tsx' | wc -l
grep -c '^model ' prisma/schema.prisma
git ls-files | grep -E '\.(test|spec)\.(ts|tsx)$' | wc -l
telling van JOB_LOCKS in app/lib/jobLock.ts

Gemeten op 27-10-2026.

Iets vergelijkbaars nodig, of een team dat zo'n systeem bouwt?

info@bitvire.com