Lecteur Markdown
INVOICES_MIGRATIONS
Migrations — Facturation électronique Factur-X #
Migrations SQL liées à la réforme de facturation électronique obligatoire (France, 2026-2027).
Contexte réglementaire #
La réforme impose la facturation électronique B2B en France via une plateforme agréée (PDP ou PPF). Format cible : Factur-X EN16931 (PDF/A-3 + XML CII D16B embarqué — BeamReactor implémente le XML sans le PDF, qui reste facultatif).
| Échéance | Obligation |
|----------|------------|
| 1er septembre 2026 | Réception électronique obligatoire — grandes entreprises et ETI en émission |
| 1er septembre 2027 | Émission électronique obligatoire — PME et micro-entreprises |
Fichiers #
`2026_03_31_orders_facturx_fields.sql` #
Ajoute deux colonnes à la table `orders` :
| Colonne | Type | Description |
|---------|------|-------------|
| `customer_siren` | `VARCHAR(14)` | SIREN (9) ou SIRET (14) de l'acheteur |
| `customer_vat_number` | `VARCHAR(20)` | TVA intracommunautaire acheteur (ex: `FR12345678901`) |
Ces champs sont `DEFAULT NULL` — ils ne sont obligatoires que pour les entreprises françaises (voir logique SIREN dans la documentation du plugin `invoices`).
Un index est ajouté sur `customer_siren` pour les recherches de facturation.
`2026_03_31_invoices.sql` #
Crée la table `invoices` :
| Colonne | Type | Description |
|---------|------|-------------|
| `id` | `INT UNSIGNED AUTO_INCREMENT` | Clé primaire |
| `invoice_number` | `VARCHAR(30) UNIQUE` | Numéro séquentiel immutable (`FACT-YYYY-NNNNN`) |
| `order_id` | `INT(11)` | Référence `orders.id` (pas de FK — convention BeamReactor) |
| `type` | `ENUM('invoice','credit_note')` | Facture ou avoir |
| `status` | `ENUM(...)` | `draft`, `issued`, `sent`, `acknowledged`, `cancelled` |
| `issue_date` | `DATE` | Date d'émission — obligatoire EN16931 |
| `due_date` | `DATE` | Date d'échéance — obligatoire EN16931 si paiement différé |
| `subtotal_ht` | `DECIMAL(10,2)` | Snapshot HT figé à l'émission |
| `vat_amount` | `DECIMAL(10,2)` | Snapshot TVA |
| `total_ttc` | `DECIMAL(10,2)` | Snapshot TTC |
| `currency` | `VARCHAR(3)` | Devise ISO 4217 |
| `buyer_name` | `VARCHAR(255)` | Snapshot raison sociale ou nom acheteur |
| `buyer_siren` | `VARCHAR(14)` | Snapshot SIREN/SIRET acheteur |
| `buyer_vat_number` | `VARCHAR(20)` | Snapshot TVA intracommunautaire acheteur |
| `buyer_address` | `TEXT` | Snapshot adresse facturation acheteur |
| `facturx_path` | `VARCHAR(500)` | Chemin relatif vers le XML (depuis `ROOT_DIR`) |
| `facturx_profile` | `ENUM(...)` | Profil Factur-X — défaut `en16931` |
| `transmission_status` | `ENUM(...)` | `pending`, `exported`, `sent`, `acknowledged`, `rejected`, `error` |
| `transmission_platform` | `VARCHAR(50)` | `chorus_pro`, `file_export`, `pdp_xxx` |
| `transmission_reference` | `VARCHAR(255)` | Référence retournée par la plateforme |
| `transmitted_at` | `DATETIME` | Horodatage de transmission |
| `transmission_log` | `TEXT` | Réponse brute de la plateforme |
| `created_at` | `DATETIME` | Création |
| `updated_at` | `DATETIME ON UPDATE` | Dernière modification |
Profils Factur-X supportés #
| Valeur | Description |
|--------|-------------|
| `minimum` | Profil minimal (B2G simplifié) |
| `basic_wl` | Basic Without Lines |
| `basic` | Basic |
| `en16931` | Profil cible BeamReactor — conforme EN16931 |
| `extended` | Extended (données supplémentaires) |
Installation #
Exécuter dans l'ordre :
-- 1. Champs acheteur sur orders
SOURCE var/migrations/2026_03_31_orders_facturx_fields.sql;
-- 2. Table invoices
SOURCE var/migrations/2026_03_31_invoices.sql;
Ou via phpMyAdmin, dans l'ordre indiqué.
Décisions d'architecture #
Pas de FK sur `order_id` — convention BeamReactor : les tables e-commerce ne déclarent pas de contraintes de clé étrangère entre modules pour conserver l'indépendance des plugins.
Snapshot financier et acheteur — les données sont copiées au moment de l'émission de la facture et ne suivent pas les modifications ultérieures de la commande. C'est une obligation légale : une facture émise est immutable.
SIREN vendeur dans `$cfg[34]` — le SIREN/SIRET du vendeur est stocké dans les préférences système (`company_number`), pas dans la table `invoices`. La classe `FacturX` l'extrait via `$cfg[34]['company_number']` en supprimant les caractères non numériques.
Conservation légale — les fichiers XML doivent être conservés 6 ans. Le répertoire `var/invoices/` ne doit pas être soumis à des politiques de purge automatique.