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ées
- `Beamreactor\Sanitizer\Parser` — validation SIREN et chaînes
- `DOMDocument` — 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.sql`
- `var/migrations/2026_03_31_invoices.sql`