Clark
De klerk: schrijft de factuur, houdt ze bij, stuurt ze door.
Belgische B2B-facturatie over Peppol — UBL 2.1 en EN 16931, gevalideerd tegen de officiële regelset vóór er iets buitengaat.
- Belgische B2B-verplichting
- 2026 Belgische B2B-verplichting
- gevalideerd tegen
- EN 16931 gevalideerd tegen
- voor andere applicaties
- API voor andere applicaties
- Rol
- Product, architectuur, bouw
- Periode
- 2026 — nu
- Stack
- Laravel 13 Livewire 3 UBL 2.1 EN 16931 Schematron bcmath Docker
Het probleem
Gestructureerde e-facturatie is de manier waarop Belgische bedrijven elkaar factureren, en een geweigerd document is een document dat de klant nooit ontving. Een facturatietool gaat meestal stil de mist in: de totalen op het scherm en de totalen op de lijn lopen uiteen, en dat komt pas uit wanneer een Access Point het bestand weigert. Dat faalscenario is hier weggeontworpen in plaats van getest.
Hoe het werkt
Alles op het scherm komt uit hetzelfde object dat de UBL-schrijver krijgt, berekend in bcmath, dus de twee kúnnen niet verschillen. Compliance wordt gecontroleerd terwijl je typt — in gewone taal, met de regelcode eronder — want een ontbrekende klantreferentie is nu triviaal en na een weigering archeologie. Het Peppol-werk is een losstaand package dat niets weet van het schema van welke applicatie dan ook; Clark is de interface en het archief.
Wat erin zit
Compliance terwijl je typt
De goedkope PHP-regels draaien per toetsaanslag en lezen als zinnen. De volledige Schematron heeft een JVM en vijftien seconden compilatie nodig en draait dus één keer, vóór verzending — met dezelfde artefacten die het ontvangende Access Point straks draait.
Valideren, bevriezen, verzenden — in die volgorde
De UBL en de gerenderde pdf gaan naar opslag vóór er iets verstuurd wordt. Vanaf het moment dat ze buitengaat is de factuur ook het document van de ontvanger; ze later opnieuw renderen uit een intussen aangepast sjabloon zou stilletjes een ander document opleveren dan wat zij in handen hebben. Een test bewaakt dat het archief byte voor byte gelijk is aan wat verzonden werd.
Niets probeert zichzelf opnieuw
Een weigering laat de factuur bewerkbaar achter met de reden erbij — de toestand waar een mens iets mee kan. Heropenen toont waarom ze terugkwam. Een renderfout houdt een geldige factuur nooit tegen: de UBL is het juridische origineel en de pdf is er een weergave van.
Een API waar andere applicaties door factureren
De payload beschrijft wat er verkocht is. Lay-out, nummering, btw-weergave en Peppol-compliance blijven in Clark, zodat een aanroeper niet opnieuw uitgerold moet worden telkens een factuurontwerp of een regelset wijzigt.
Eerlijke standaardinstellingen
Zonder verzendcontract draait alles behalve de laatste stap: gevalideerd, bevroren, geregistreerd, niets vertrekt. Een driver zonder credentials valt daarop terug in plaats van te crashen — halfgeconfigureerd is de normale toestand van een installatie in opbouw, en het dashboard dat vertelt wat ontbreekt, moet bereikbaar blijven.
Zorgvuldig gekozen woorden
"Vervaldatum verstreken", nooit "onbetaald" — er wordt hier geen betaling opgevolgd, en het verkeerde woord stuurt iemand achter een klant aan die vorige week betaalde. Ontvangen staat als niet beschikbaar in plaats van als nul, want een nul zou lezen als "er kwam niets binnen".
Een keuze die uitleg verdient
Wat naar de verzendpartij gaat, is onze UBL en geen JSON in hun vorm. Bij een dienst die per document aanrekent is dat de hele inzet: geef je het documentmodel uit handen, dan wordt van partij veranderen een herschrijving. Het kost eenmalig een vertaallaag en koopt de vrijheid om te vertrekken.
Staat er zoiets op je lijst?
De projecten verschillen, de manier van werken niet. Vertel wat je probeert op te lossen.
Neemt nieuw werk aan