Versie 1.11: btw categorieën als kennisbank
Een enum met alle negen btw categorieën die PEPPOL toestaat, met uitleg wanneer je welke gebruikt en welke vrijstellingsreden erbij hoort. validate() controleert nu ook wat elke categorie vraagt.
darvis/ubl-peppol
Een PHP pakket dat UBL 2.1 facturen en creditnota's maakt volgens PEPPOL BIS Billing 3.0 en EN 16931. Met Nederlandse en Belgische regels, een btw nummer controle via VIES en een optionele Laravel koppeling.
<Invoice xmlns="urn:oasis:...:Invoice-2"> <cbc:CustomizationID>urn:cen.eu:en16931:2017 #compliant#urn:fdc:peppol.eu:2017:poacc :billing:3.0</cbc:CustomizationID> <cbc:ID>INV-2026-001</cbc:ID> <cbc:IssueDate>2026-01-15</cbc:IssueDate> <cac:TaxTotal> <cbc:TaxAmount currencyID="EUR">89.25</cbc:TaxAmount> </cac:TaxTotal> ... </Invoice>
Je hebt je factuurgegevens al, in een database, een ERP of een webshop. Dit pakket zet ze om in een XML document dat een PEPPOL ontvanger accepteert. Jij koppelt je gegevens aan de builder, het pakket schrijft de XML.
Een enum met alle negen btw categorieën die PEPPOL toestaat, met uitleg wanneer je welke gebruikt en welke vrijstellingsreden erbij hoort. validate() controleert nu ook wat elke categorie vraagt.
Upload of plak een UBL factuur of creditnota en laat hem controleren tegen de officiële EN 16931 en PEPPOL BIS Billing 3.0 regels. Alles draait in je browser, er wordt niets geüpload.
Sinds versie 1.10 maakt ook de Nederlandse builder creditnota's, met een verwijzing naar de factuur die je corrigeert.
Maak een builder, voeg de kop, de partijen, de betaling, de btw, de totalen en de regels toe, en laat hem de XML schrijven.
Met validateFirst: true weet je vóór verzending of er iets ontbreekt.
use Darvis\UblPeppol\UblNlBis3Service;
$ubl = new UblNlBis3Service();
$ubl->createDocument();
$ubl->addInvoiceHeader('INV-2026-001', '2026-01-15', '2026-02-14');
$ubl->addBuyerReference('CLIENT-001');
$ubl->addAccountingSupplierParty(/* jouw bedrijf */);
$ubl->addAccountingCustomerParty(/* je klant */);
$ubl->addPaymentMeans('30', 'Credit transfer', 'INV-2026-001', 'NL91ABNA0417164300');
$ubl->addTaxTotal([/* btw per categorie */]);
$ubl->addLegalMonetaryTotal([/* totalen */], 'EUR');
$ubl->addInvoiceLine([/* factuurregel */]);
// Throws an InvalidArgumentException when validate() finds an error.
$xml = $ubl->generateXml(validateFirst: true);
Sinds 1 januari 2026 moeten Belgische ondernemingen onderling elektronisch factureren. Peppol is daarvoor het standaard kanaal.
Het kabinet wil elektronisch factureren tussen bedrijven vanaf 1 juli 2030 verplicht stellen. Wie nu koppelt, is op tijd klaar.
Met ViDA komen digitale btw rapportage en elektronische facturen voor grensoverschrijdende handel tussen bedrijven.
Nee. Het pakket is geen access point. PEPPOL is een gesloten netwerk dat je bereikt via een access point provider waar je een contract mee hebt. In Laravel stuurt PeppolService de XML naar de API van die provider, met PEPPOL_URL, PEPPOL_USERNAME en PEPPOL_PASSWORD uit je .env.
Kies de builder op basis van het land van de ontvanger. UblNlBis3Service zet de elementen zelf in de juiste volgorde en controleert de Nederlandse regels. UblBeBis3Service rekent met calculateTotals() de regels voor je op en controleert of de bedragen kloppen. Beide maken creditnota's.
Nee. validate() verandert niets aan je document en controleert de regels die het pakket kent. Een ontvanger controleert meer. Haal een document daarom door een officiële validator voordat je live gaat, bijvoorbeeld de online validator in de documentatie.
PHP 8.2 of nieuwer met de dom en libxml extensies. Voor een IBAN controle heb je bcmath nodig, voor VIES de soap extensie. Laravel 11, 12 of 13 is alleen nodig voor de optionele Laravel laag.
Ja. Het pakket is gratis en valt onder de MIT licentie. Je mag het gebruiken in commerciële projecten.