Version 1.11: Steuerkategorien als Wissensbasis
Ein Enum mit allen neun Steuerkategorien, die PEPPOL erlaubt, mit Erklärung, wann du welche nutzt und welcher Befreiungsgrund dazugehört. validate() prüft jetzt auch, was jede Kategorie verlangt.
darvis/ubl-peppol
Ein PHP Paket, das UBL 2.1 Rechnungen und Gutschriften nach PEPPOL BIS Billing 3.0 und EN 16931 erstellt. Mit niederländischen und belgischen Regeln, einer Prüfung der Steuernummer über VIES und einer optionalen Laravel Anbindung.
<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>
Deine Rechnungsdaten hast du schon, in einer Datenbank, einem ERP oder einem Webshop. Dieses Paket macht daraus ein XML Dokument, das ein PEPPOL Empfänger akzeptiert. Du übergibst deine Daten an den Builder, das Paket schreibt das XML.
Neu bei Peppol? Lies zuerst nach, was Peppol ist und wie das Netzwerk funktioniert, oder nimm Kontakt auf, wenn du Hilfe bei deiner Anbindung möchtest.
Ein Enum mit allen neun Steuerkategorien, die PEPPOL erlaubt, mit Erklärung, wann du welche nutzt und welcher Befreiungsgrund dazugehört. validate() prüft jetzt auch, was jede Kategorie verlangt.
Lade eine UBL Rechnung oder Gutschrift hoch oder füge sie ein und prüfe sie gegen die offiziellen Regeln von EN 16931 und PEPPOL BIS Billing 3.0. Alles läuft in deinem Browser, nichts wird hochgeladen.
Seit Version 1.10 erstellt auch der niederländische Builder Gutschriften, mit einem Verweis auf die Rechnung, die du korrigierst.
Erstelle einen Builder, füge Kopf, Parteien, Zahlung, Umsatzsteuer, Summen und Positionen hinzu und lass ihn das XML schreiben.
Mit validateFirst: true weißt du vor dem Versand, ob etwas fehlt.
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(/* deine Firma */);
$ubl->addAccountingCustomerParty(/* dein Kunde */);
$ubl->addPaymentMeans('30', 'Credit transfer', 'INV-2026-001', 'NL91ABNA0417164300');
$ubl->addTaxTotal([/* Umsatzsteuer je Kategorie */]);
$ubl->addLegalMonetaryTotal([/* Summen */], 'EUR');
$ubl->addInvoiceLine([/* Rechnungsposition */]);
// Throws an InvalidArgumentException when validate() finds an error.
$xml = $ubl->generateXml(validateFirst: true);
Seit dem 1. Januar 2026 müssen belgische Unternehmen einander elektronisch Rechnungen stellen. Peppol ist dafür der Standardkanal.
Die niederländische Regierung will elektronische Rechnungen zwischen Unternehmen ab dem 1. Juli 2030 zur Pflicht machen. Wer jetzt anbindet, ist rechtzeitig bereit.
Mit ViDA kommen digitale Umsatzsteuermeldungen und elektronische Rechnungen für den grenzüberschreitenden Handel zwischen Unternehmen.
Nein. Das Paket ist kein Access Point. PEPPOL ist ein geschlossenes Netzwerk, das du über einen Access Point Provider erreichst, mit dem du einen Vertrag hast. In Laravel sendet PeppolService das XML an die API dieses Providers, mit PEPPOL_URL, PEPPOL_USERNAME und PEPPOL_PASSWORD aus deiner .env.
Wähle den Builder nach dem Land des Empfängers. UblNlBis3Service bringt die Elemente selbst in die richtige Reihenfolge und prüft die niederländischen Regeln. UblBeBis3Service summiert mit calculateTotals() die Positionen für dich und prüft, ob die Beträge stimmen. Beide erstellen Gutschriften.
Nein. validate() ändert nichts an deinem Dokument und prüft die Regeln, die das Paket kennt. Ein Empfänger prüft mehr. Prüfe ein Dokument deshalb mit einem offiziellen Validator, bevor du live gehst, zum Beispiel mit dem Online Validator in der Dokumentation.
PHP 8.2 oder neuer mit den Erweiterungen dom und libxml. Für eine IBAN Prüfung brauchst du bcmath, für VIES die soap Erweiterung. Laravel 11, 12 oder 13 ist nur für die optionale Laravel Schicht nötig.
Ja. Das Paket ist kostenlos und steht unter der MIT Lizenz. Du darfst es in kommerziellen Projekten einsetzen.