En vous promenant sur Beamreactor, nous stockons votre IP 48h pour des raisons de sécurité.

Lecteur Markdown

invoices Documentation › INVOICES_DOCUMENTATION

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`
de en fr