Facturer une mairie, un hôpital ou une université passe par Chorus Pro depuis 2017 — pour les entreprises françaises, la facturation électronique au secteur public a dix ans d'avance sur le reste.
Quatre modules communautaires mettent ce circuit dans Odoo : le socle qui parle à l'API, deux modules de format, et un module de vente qui bloque une commande dont la facture serait rejetée.
Résumé
l10n_fr_chorus_account est le socle. Il ajoute sur la fiche contact les informations qu'attend Chorus — SIRET, mode de transmission, identifiant Chorus, obligations de l'entité — crée la notion de service Chorus rattaché à un client public, pose sur la facture un onglet Chorus Pro avec son statut et ses pièces jointes, fournit un assistant d'envoi groupé, et trace chaque dépôt dans un modèle de flux Chorus. Trois tâches planifiées suivent ensuite les statuts.
Il ne génère pas le fichier lui-même : c'est l10n_fr_chorus_facturx (ou le module UBL équivalent) qui ajoute les formats CII 16B XML et Factur-X PDF. l10n_fr_chorus_sale empêche de confirmer une commande destinée à un client Chorus tant que la référence de commande et le service exigés ne sont pas renseignés. l10n_fr_chorus_en16931 fait enfin la jonction avec l'annuaire de la réforme nationale, et fournit un assistant de migration des services Chorus vers les lignes d'annuaire.
L'essentiel
- L'API PISTE en OAuth2 : les identifiants du client OAuth vivent dans le fichier de configuration serveur, pas dans l'interface.
- Un utilisateur technique Chorus (identifiant et mot de passe) se renseigne au niveau de la société.
- Un bac à sable : une clé de configuration serveur bascule vers la plateforme de qualification plutôt que la production.
- Le service Chorus du client porte le code transmis comme référence acheteur — c'est le champ dont l'absence fait rejeter une facture.
- Trois tâches planifiées suivent les statuts de dépôt ; elles sont à activer.
- Le blocage à la confirmation de commande est la vraie valeur du lot : le rejet est évité avant d'exister.
- Une dépendance Python externe (
requests_oauthlib) et le moduleserver_environment: ce lot touche à l'exploitation, pas seulement au paramétrage.
Ce que ces modules ajoutent à l'instance
| Module | Modèles créés | Champs | Menus | Groupes | Version |
|---|---|---|---|---|---|
l10n_fr_chorus_account | 3 | 112 | 3 | 2 | 18.0.1.2.0 |
l10n_fr_chorus_en16931 | 1 | 16 | 2 | 0 | 18.0.1.0.0 |
l10n_fr_chorus_facturx | 0 | 0 | 0 | 0 | 18.0 |
l10n_fr_chorus_sale | 0 | 2 | 0 | 0 | 18.0 |
Les trois modèles créés par le socle disent bien ce qu'il fait : service Chorus d'un partenaire, flux Chorus (un dépôt et son statut d'intégration), et l'assistant d'envoi groupé de factures.
Les deux derniers modules du tableau ne créent rien : l'un est une colle de format qui s'installe automatiquement, l'autre pose deux champs et une contrainte sur la commande de vente.
Où le trouver dans Odoo
| Menu | Ce qu'on y fait |
|---|---|
| Facturation ▸ Configuration ▸ Chorus Pro | L'entrée de la configuration |
| Facturation ▸ Configuration ▸ Chorus Pro ▸ Flux Chorus | Chaque dépôt, avec son statut d'intégration |
| Facturation ▸ Configuration ▸ Chorus Pro ▸ Services Chorus des partenaires | Les services des structures publiques |
| Facturation ▸ Configuration ▸ Paramètres, section Chorus Pro | L'activation de l'API et le format de facture |
| Paramètres ▸ Technique ▸ Chorus Pro ▸ Chorus Directory Line Migration | La migration des services vers les lignes d'annuaire |
Sur la fiche d'une facture client, un onglet Chorus Pro apparaît : statut d'envoi et pièces jointes transmises. C'est là que se lit l'histoire d'une facture refusée, et c'est le premier endroit à regarder quand un comptable public dit n'avoir rien reçu.
Le paramétrage, dans l'ordre
- Obtenir les identifiants PISTE (client OAuth) sur le portail de l'État, et un utilisateur technique Chorus. Ce sont deux choses différentes, et aucune ne s'obtient en cinq minutes.
- Ajouter
chorus_api_oauth_idetchorus_api_oauth_secretdans le fichier de configuration du serveur Odoo, puis redémarrer. Ces valeurs ne se saisissent pas dans l'interface — c'est un choix de sécurité du module. - Pour tester, ajouter la clé d'environnement qui bascule vers la plateforme de qualification plutôt que la production.
- Activer Chorus Pro API dans les paramètres de facturation et y renseigner l'identifiant et le mot de passe de l'utilisateur technique.
- Installer un module de format (
l10n_fr_chorus_facturxou son équivalent UBL) — sans lui, aucun fichier n'est produit. - Choisir le format de facture Chorus : CII 16B XML ou Factur-X PDF.
- Renseigner sur chaque client public son mode de transmission, son identifiant, et les informations qu'il exige : référence de commande, service, engagement.
- Activer les trois tâches planifiées de suivi des statuts.
Une règle de cohérence est posée par le module : si le format Chorus est Factur-X PDF, le format XML embarqué dans le PDF de la société doit être Factur-X. Sinon, l'enregistrement des paramètres est refusé — un garde-fou utile, et déroutant si on ne l'attend pas.
La dépendance à server_environment permet par ailleurs de sortir le compte technique Chorus de la base et de le mettre dans un fichier d'environnement : c'est ce qui évite qu'une copie de production pour recette parte déposer de vraies factures.
Le service Chorus, et le champ qui fait rejeter une facture
Une structure publique n'est pas un client unique : c'est une entité découpée en services, et la facture doit viser le bon service, avec parfois une référence d'engagement.
- Le module crée un modèle service Chorus rattaché au partenaire, avec son code.
- Dans le fichier produit, le code du service devient la référence acheteur, et le nom du service devient le nom du département destinataire.
- Les pièces jointes Chorus déclarées sur la facture sont embarquées dans le fichier Factur-X produit.
La cause numéro un de rejet d'une facture publique n'est ni le montant ni le format : c'est une référence de commande ou un service manquant. Le destinataire le sait, l'émetteur l'apprend au rejet.
D'où l'intérêt du quatrième module, l10n_fr_chorus_sale, qui déplace ce contrôle à l'endroit utile : il recopie le mode de transmission du client sur la commande, affiche le code du service dans le formulaire et dans les listes, et bloque la confirmation d'une commande destinée à un client Chorus tant que les informations obligatoires manquent.
Autrement dit : le rejet n'est pas rattrapé plus vite, il n'a pas lieu. Pour une PME qui facture des collectivités, c'est le module le plus rentable des quatre.
Chorus et la réforme nationale : deux circuits, un pont
La facturation au secteur public (B2G) existe depuis 2017 ; la facturation électronique entre entreprises (B2B) arrive avec la réforme. Les deux circuits coexistent, et une entreprise qui facture les deux publics a deux chaînes à tenir.
| Chorus Pro (B2G) | Réforme B2B | |
|---|---|---|
| Destinataire | Entités publiques | Entreprises assujetties à la TVA |
| Routage | Service Chorus du client | Annuaire national, par SIREN/SIRET |
| Transport | API PISTE | Plateforme agréée |
| Depuis | 2017 | Réception obligatoire depuis le 1ᵉʳ septembre 2026 |
| Module de transport | l10n_fr_chorus_account | l10n_fr_einvoicing |
l10n_fr_chorus_en16931 est le pont entre les deux : il ajoute à la facture et au flux Chorus les champs de la chaîne EN 16931, et fournit un assistant de migration des services Chorus vers les lignes d'annuaire. C'est le module qui évite de tenir deux référentiels de routage pour les mêmes clients publics.
Pour la partie B2B, voir la fiche de l10n_fr_einvoicing et, côté éditorial, facturer le secteur public avec Chorus Pro.
Limites connues
- Le socle ne génère aucun fichier : sans module de format installé, rien ne part.
- Les identifiants PISTE vivent dans le fichier de configuration serveur : il faut un accès à l'exploitation, et un redémarrage, pour les poser ou les changer.
- Une dépendance Python externe (
requests_oauthlib) doit être présente dans l'image : ce n'est pas un module Odoo, c'est une bibliothèque. - Les trois tâches planifiées sont à activer : sans elles, les statuts de dépôt ne se mettent jamais à jour tout seuls.
- Le format Factur-X PDF impose le format XML embarqué de la société : un paramétrage incohérent est refusé à l'enregistrement.
- L'interface reste en anglais sur une partie des libellés du lot.
Identité technique
| Module | Dépôt OCA | Version | Licence | Dépend de |
|---|---|---|---|---|
l10n_fr_chorus_account | l10n-france | 18.0.1.2.0 | AGPL-3 | l10n_fr_siret_account, server_environment |
l10n_fr_chorus_facturx | l10n-france | 18.0 | AGPL-3 | l10n_fr_chorus_account, l10n_fr_account_invoice_facturx |
l10n_fr_chorus_sale | l10n-france | 18.0 | AGPL-3 | l10n_fr_chorus_account, sale |
l10n_fr_chorus_en16931 | fr-einvoicing | 18.0.1.0.0 | AGPL-3 | l10n_fr_chorus_account, l10n_fr_einvoicing |
Questions fréquentes
Que faut-il obtenir avant de paramétrer Chorus dans Odoo ?
Deux choses distinctes : des identifiants PISTE (le client OAuth de l'API de l'État) et un utilisateur technique Chorus (identifiant et mot de passe). Les premiers se posent dans le fichier de configuration du serveur Odoo et demandent un redémarrage ; le second se saisit dans les paramètres de facturation. Aucun des deux ne s'obtient dans la journée.
Peut-on tester sans envoyer de vraies factures ?
Oui : une clé d'environnement dans la configuration du serveur bascule le module vers la plateforme de qualification de Chorus Pro au lieu de la production. La dépendance à server_environment permet en plus de sortir le compte technique de la base — ce qui évite qu'une copie de production destinée à la recette dépose de vraies factures.
Pourquoi une facture publique est-elle rejetée par Chorus ?
Le plus souvent parce qu'une référence de commande ou un service attendu par l'entité publique est manquant, pas à cause du format. C'est précisément ce que l10n_fr_chorus_sale empêche : il bloque la confirmation d'une commande destinée à un client Chorus tant que ces informations ne sont pas renseignées.
Chorus Pro et la réforme B2B, est-ce la même chose ?
Non : deux circuits distincts. Chorus Pro concerne les factures au secteur public depuis 2017, via l'API PISTE et le service Chorus du client. La réforme B2B passe par une plateforme agréée et l'annuaire national, par SIREN et SIRET. Une entreprise qui facture les deux publics tient les deux chaînes — l10n_fr_chorus_en16931 sert de pont et migre les services vers les lignes d'annuaire.
Les statuts de dépôt se mettent-ils à jour automatiquement ?
Seulement si les trois tâches planifiées livrées par le module sont activées dans les actions planifiées. Sans elles, le flux Chorus garde le statut du dépôt initial, et l'onglet Chorus Pro de la facture ne reflète plus la réalité de la plateforme.
Se faire accompagner
Chorus Pro est le dossier où la technique est la partie facile. Ce qui prend du temps, ce sont les identifiants PISTE, le compte technique, et surtout le relevé — client public par client public — du service, de l'engagement et de la référence de commande attendus. C'est un travail de données, pas de paramétrage.
Nous le menons dans cet ordre : les accès d'abord, le bac à sable ensuite, le relevé des exigences par entité, puis le blocage à la commande pour que le rejet n'arrive plus. Voir notre accompagnement sur la facture électronique ou demander un rappel.
Pour aller plus loin
- Factur-X et EN 16931 : la chaîne de génération
- l10n_fr_einvoicing : annuaire, flux et cycle de vie
- Facturer le secteur public avec Chorus Pro
En résumé
Un socle de 112 champs qui parle à l'API PISTE, un module de format sans lequel rien ne part, un pont vers l'annuaire de la réforme, et surtout un blocage à la confirmation de commande qui supprime la première cause de rejet d'une facture publique. Les identifiants, eux, s'obtiennent en semaines. Parlons de vos factures publiques.