eInvoicing is a PHP library for creating and reading electronic invoices according to the eInvoicing Directive and European standard.
It aims to be 100% compliant with EN 16931 as well as with the most popular CIUS and extensions, such as PEPPOL BIS.
First of all, make sure your environment meets the following requirements:
Then, you should be able to install this library using Composer:
composer require josemmo/einvoicing
For a proper quick start guide, visit the documentation website at https://josemmo.github.io/einvoicing/.
use Einvoicing\Exceptions\ValidationException;
use Einvoicing\Readers\UblReader;
$reader = new UblReader();
$document = file_get_contents(__DIR__ . "/example.xml");
$inv = $reader->import($document);
try {
$inv->validate();
} catch (ValidationException $e) {
// Invoice is not EN 16931 complaint
}
use Einvoicing\Identifier;
use Einvoicing\Invoice;
use Einvoicing\InvoiceLine;
use Einvoicing\Party;
use Einvoicing\Presets;
use Einvoicing\Writers\UblWriter;
// Create PEPPOL invoice instance
$inv = new Invoice(Presets\Peppol::class);
$inv->setNumber('F-202000012')
->setIssueDate(new DateTime('2020-11-01'))
->setDueDate(new DateTime('2020-11-30'));
// Set seller
$seller = new Party();
$seller->setElectronicAddress(new Identifier('9482348239847239874', '0088'))
->setCompanyId(new Identifier('AH88726', '0183'))
->setName('Seller Name Ltd.')
->setTradingName('Seller Name')
->setVatNumber('ESA00000000')
->setAddress(['Fake Street 123', 'Apartment Block 2B'])
->setCity('Springfield')
->setCountry('DE');
$inv->setSeller($seller);
// Set buyer
$buyer = new Party();
$buyer->setElectronicAddress(new Identifier('ES12345', '0002'))
->setName('Buyer Name Ltd.')
->setCountry('FR');
$inv->setBuyer($buyer);
// Add a product line
$line = new InvoiceLine();
$line->setName('Product Name')
->setPrice(100)
->setVatRate(16)
->setQuantity(1);
$inv->addLine($line);
// Export invoice to a UBL document
header('Content-Type: text/xml');
$writer = new UblWriter();
echo $writer->export($inv);
These are the expected features for the library and how's it going so far: