Documentation10 min de lecture

Chorus Pro : facturer le secteur public depuis Odoo

Le module OCA `l10n_fr_chorus_account` (dépôt `l10n-france`, version 18.0.1.2.0, licence AGPL-3) relie Odoo 18 Community à **Chorus Pro**, la plateforme de facturation du secteur public français : relevé sur instance, il crée 3 modèles, ajoute **112 champs**, 3 menus et 2 groupes de droits, et dépose les factures via l'API PISTE. Les trois modules qui l'accompagnent, et le blocage de commande qui évite le rejet.

Tours de bureaux vues depuis la rue en contre-plongée

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 module server_environment : ce lot touche à l'exploitation, pas seulement au paramétrage.

Ce que ces modules ajoutent à l'instance

ModuleModèles créésChampsMenusGroupesVersion
l10n_fr_chorus_account31123218.0.1.2.0
l10n_fr_chorus_en169311162018.0.1.0.0
l10n_fr_chorus_facturx000018.0
l10n_fr_chorus_sale020018.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

MenuCe qu'on y fait
Facturation ▸ Configuration ▸ Chorus ProL'entrée de la configuration
Facturation ▸ Configuration ▸ Chorus Pro ▸ Flux ChorusChaque dépôt, avec son statut d'intégration
Facturation ▸ Configuration ▸ Chorus Pro ▸ Services Chorus des partenairesLes services des structures publiques
Facturation ▸ Configuration ▸ Paramètres, section Chorus ProL'activation de l'API et le format de facture
Paramètres ▸ Technique ▸ Chorus Pro ▸ Chorus Directory Line MigrationLa 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

  1. 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.
  2. Ajouter chorus_api_oauth_id et chorus_api_oauth_secret dans 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.
  3. Pour tester, ajouter la clé d'environnement qui bascule vers la plateforme de qualification plutôt que la production.
  4. Activer Chorus Pro API dans les paramètres de facturation et y renseigner l'identifiant et le mot de passe de l'utilisateur technique.
  5. Installer un module de format (l10n_fr_chorus_facturx ou son équivalent UBL) — sans lui, aucun fichier n'est produit.
  6. Choisir le format de facture Chorus : CII 16B XML ou Factur-X PDF.
  7. Renseigner sur chaque client public son mode de transmission, son identifiant, et les informations qu'il exige : référence de commande, service, engagement.
  8. 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
DestinataireEntités publiquesEntreprises assujetties à la TVA
RoutageService Chorus du clientAnnuaire national, par SIREN/SIRET
TransportAPI PISTEPlateforme agréée
Depuis2017Réception obligatoire depuis le 1ᵉʳ septembre 2026
Module de transportl10n_fr_chorus_accountl10n_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

ModuleDépôt OCAVersionLicenceDépend de
l10n_fr_chorus_accountl10n-france18.0.1.2.0AGPL-3l10n_fr_siret_account, server_environment
l10n_fr_chorus_facturxl10n-france18.0AGPL-3l10n_fr_chorus_account, l10n_fr_account_invoice_facturx
l10n_fr_chorus_salel10n-france18.0AGPL-3l10n_fr_chorus_account, sale
l10n_fr_chorus_en16931fr-einvoicing18.0.1.0.0AGPL-3l10n_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

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.

Documentation OCAFacturation électroniqueFrance

Partager

Fiches connexes

Écran de configuration des accès et des permissions
Treize modules OCA complètent le dépôt `sale-workflow` pour Odoo 18 Community : `sale_tier_validation` (version 18.0.1.1.0) soumet la confirmation d'une commande à une **approbation à plusieurs niveaux**, et `sale_validity_auto_cancel` **annule automatiquement les devis périmés** depuis un nombre de jours configurable. Les onze autres, de la visibilité limitée à son équipe commerciale à la liste de souhaits d'un client.
Lire la suite
Documentation OCA, Ventes
Utilisation d'un logiciel de gestion sur tablette et ordinateur
Vingt-quatre modules OCA du dépôt `sale-workflow` traitent le client et l'organisation commerciale dans Odoo 18 Community : `portal_sale_personal_data_only` corrige un défaut de confidentialité : par défaut, un utilisateur du portail voit **toutes les commandes dont un membre de son organisation est suiveur**. Les vingt-trois autres, de l'adresse de livraison restreinte au calendrier des visites commerciales.
Lire la suite
Documentation OCA, Ventes