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

Lecteur Markdown

invoices Documentation › INVOICES_MIGRATIONS

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.

de en fr