Lecteur Markdown
Invoices Documentation
Invoices #
Facturation électronique Factur-X EN16931.
Namespace: Beamreactor\Invoices
Version: 1.0.0
Niveau requis: ORDERS_LEVEL_ADMIN
Vue d'ensemble #
Plugin de génération et de gestion des factures électroniques pour BeamReactor. Conforme au profil Factur-X EN16931 (urn:cen.eu:en16931:2017#compliant#urn:factur-x.eu:1p0:en16931), il génère des fichiers XML CII D16B directement transmissibles à Chorus Pro ou à toute PDP certifiée.
Répond à la réforme française de facturation électronique obligatoire :
- 1er septembre 2026 — obligation de réception pour toutes les entreprises
- 1er septembre 2027 — obligation d'émission pour PME et micro-entreprises
Fonctionnalités #
- Génération de factures et avoirs depuis les commandes (
orders) - XML EN16931 (CII D16B) généré nativement — zéro dépendance externe
- Numérotation séquentielle immutable (
FACT-YYYY-NNNNN) - Snapshot financier et acheteur figé à l'émission
- Vue HTML imprimable avec badges de statut
- Téléchargement XML direct
- Traçabilité de la chaîne de transmission
- Placeholder Chorus Pro (OAuth2 PISTE — implémentation à venir)
Actions (paramètre invact) #
| Valeur | Méthode | Action |
|--------|---------|--------|
| (défaut) | GET | Liste des factures avec filtres par statut |
| generate | GET | Formulaire de confirmation (paramètre order_id requis) |
| generate | POST | Génération effective (champ order_id requis) |
| view | GET | Détail HTML imprimable (paramètre id requis) |
| download | GET | Téléchargement XML Factur-X (paramètre id requis) |
| transmit | GET | Transmission Chorus Pro — placeholder (paramètre id requis) |
Classe FacturX #
Générateur XML EN16931 basé sur DOMDocument natif PHP.
use Beamreactor\Invoices\FacturX;
$xml = FacturX::generate($invoice, $seller, $items);
Paramètres #
$invoice — ligne de la table invoices :
| Clé | Type | Description |
|-----|------|-------------|
| invoice_number | string | Numéro de facture (FACT-YYYY-NNNNN) |
| type | string | invoice ou credit_note |
| issue_date | string | Date d'émission (YYYY-MM-DD) |
| due_date | string\|null | Date d'échéance (YYYY-MM-DD) |
| currency | string | Devise ISO 4217 (défaut EUR) |
| subtotal_ht | decimal | Sous-total HT |
| vat_amount | decimal | Montant TVA |
| total_ttc | decimal | Total TTC |
| buyer_name | string | Raison sociale ou nom complet acheteur |
| buyer_siren | string\|null | SIREN/SIRET acheteur (9 ou 14 chiffres) |
| buyer_vat_number | string\|null | TVA intracommunautaire acheteur |
| buyer_address | string\|null | Adresse complète acheteur (snapshot) |
$seller — tableau issu de array_merge($cfg[34], $cfg[35]) :
| Clé $cfg[34] | Description |
|----------------|-------------|
| headoffice_name | Raison sociale vendeur |
| company_number | SIRET (ex: SIRET 993 471 077 00012) — chiffres extraits automatiquement |
| headoffice_address | Adresse ligne 1 |
| headoffice_postcode | Code postal |
| headoffice_city | Ville |
| headoffice_country | Pays (nom complet — converti en ISO 3166-1 alpha-2) |
| headoffice_vat_number | TVA vendeur (optionnel — calculée depuis SIREN si absente) |
| Clé $cfg[35] | Description |
|----------------|-------------|
| headoffice_iban | IBAN vendeur (inclus dans le XML si renseigné) |
| headoffice_bic | BIC vendeur |
$items — lignes de order_items :
| Clé | Type | Description |
|-----|------|-------------|
| product_name | string | Désignation produit |
| product_reference | string | Référence produit (optionnel) |
| quantity | int | Quantité |
| unit_price_ht | decimal | Prix unitaire HT |
| vat_rate | decimal | Taux TVA (ex: 20.00) |
Calcul automatique du numéro TVA vendeur #
Si headoffice_vat_number est absent de $cfg[34], la classe calcule le numéro de TVA intracommunautaire français depuis le SIREN :
clé = (12 + 3 × (SIREN mod 97)) mod 97
N° TVA = "FR" + clé (2 chiffres) + SIREN (9 chiffres)
Codes TypeCode EN16931 #
| Constante | Valeur | Usage |
|-----------|--------|-------|
| TYPE_INVOICE | 380 | Facture |
| TYPE_CREDIT_NOTE | 381 | Avoir |
Catégories TVA (schéma EN16931) #
| Constante | Code | Condition |
|-----------|------|-----------|
| VAT_S | S | Taux > 0 (standard) |
| VAT_Z | Z | Taux = 0 |
| VAT_E | E | Exonéré |
| VAT_AE | AE | Autoliquidation |
Numérotation des factures #
Format : FACT-{ANNÉE}-{ID sur 5 chiffres}
Exemple : FACT-2026-00001
La numérotation s'appuie sur l'AUTO_INCREMENT de la table invoices — le numéro est généré après insertion et mis à jour immédiatement. Il est immutable : aucune mise à jour après émission ne doit le modifier.
Stockage des fichiers XML #
Les fichiers XML Factur-X sont écrits dans :
ROOT_DIR/var/invoices/{invoice_number}.xml
Le chemin relatif est conservé dans invoices.facturx_path (depuis ROOT_DIR).
Le répertoire var/invoices/ doit être accessible en écriture. Il est exclu des caches BeamReactor.
Logique SIREN acheteur #
| customer_type | Pays | Comportement |
|-----------------|------|--------------|
| individual | Tous | SIREN NULL — pas de validation |
| company | France | SIREN obligatoire — validé via Parser::sanitize($v, 'siren') |
| company | UE ≠ France | TVA intracommunautaire obligatoire, SIREN NULL |
| company | Hors UE | Les deux NULL — accepté |
Le champ SIREN ne s'affiche dans le formulaire de commande que si customer_type = company et pays = France.
Chaîne de transmission #
| transmission_platform | Description |
|-------------------------|-------------|
| file_export | Téléchargement direct — client dépose sur sa PDP |
| chorus_pro | Transmission Chorus Pro via API PISTE (OAuth2) — à implémenter |
| pdp_xxx | PDP privée certifiée — modules optionnels futurs |
Tables concernées #
| Table | Rôle |
|-------|------|
| invoices | Factures et avoirs — une commande peut en avoir plusieurs |
| orders | Source des données financières et acheteur |
| order_items | Lignes de commande — snapshottées dans le XML |
Dépendances #
Beamreactor\Database\SQL— accès base de donnéesBeamreactor\Sanitizer\Parser— validation SIREN et chaînesDOMDocument— génération XML (natif PHP, aucune lib externe)$cfg[34]— infos vendeur (siège, SIRET, adresse)$cfg[35]— coordonnées bancaires vendeur (IBAN, BIC)
Voir aussi #
- Migrations Factur-X
var/migrations/2026_03_31_orders_facturx_fields.sqlvar/migrations/2026_03_31_invoices.sql