Documentation11 min de lecture

Contrats récurrents : cycle de vie, prévisions et quantités variables

Le module OCA `contract_line_successor` (dépôt `contract`, version 18.0.1.0.2, licence AGPL-3) gère le cycle de vie de **chaque ligne de contrat indépendamment** : arrêt, suspension temporaire, planification d'un successeur, annulation, réactivation et renouvellement automatique — et sert de socle à six autres modules du dépôt. Douze autres modules traitent le prévisionnel, les quantités variables et la résiliation rétroactive.

Contrat signé posé sur un bureau

Un contrat récurrent ne se résume pas à une facture qui revient chaque mois. Une ligne s'arrête, une autre se suspend, une troisième se renouvelle à un tarif révisé, et le client résilie au 15 alors qu'on a déjà facturé le trimestre.

Treize modules communautaires traitent ce cycle de vie — et la question que tout dirigeant pose : combien va-t-on facturer les six prochains mois ?

Résumé

Un module central gère le cycle de vie par ligne : arrêt, suspension, successeur planifié, annulation, réactivation, renouvellement automatique. Trois modules s'appuient dessus : la révision de prix en masse par assistant — nouvelles lignes au tarif ajusté, anciennes clôturées —, la résiliation avec motif, commentaire et date, et l'arrêt rétroactif générant un avoir pour la période déjà facturée en trop.

Deux modules traitent le prévisionnel : la génération et le suivi des prévisions de facturation par ligne de contrat, visibles en vue dédiée, et une colle recalculant ces prévisions quand une formule de quantité variable change.

Quatre modules traitent les quantités variables : une formule de quantité proratisée au nombre de jours réellement couverts, trois formules calculant la quantité depuis les feuilles de temps, des valeurs par défaut de quantité variable sur un produit de contrat, et l'affichage du montant total sur la durée du contrat sur la ligne de commande.

Trois modules enfin complètent : des dates de service sur les lignes, la correction manuelle des dates de facturation, et une application d'abonnements indépendante du module de contrats.

L'essentiel

  • Un cycle de vie par ligne : arrêt, suspension, successeur, réactivation.
  • Un prévisionnel de facturation par ligne de contrat.
  • Une quantité proratisée au nombre de jours réellement couverts.
  • Des quantités issues des feuilles de temps.
  • Une révision de prix en masse par assistant.
  • La résiliation avec motif, commentaire et date, bloquant les modifications.
  • L'arrêt rétroactif avec avoir automatique sur le trop-facturé.
  • Une application d'abonnements distincte du module de contrats.

Ce que ces modules ajoutent à l'instance

ModuleVersionCe qu'il apporte
contract_line_successor18.0.1.0.2Le cycle de vie complet d'une ligne de contrat — socle de six autres modules
contract_price_revision18.0.1.0.0Révision de prix en masse : pourcentage ou prix fixe, par assistant
contract_termination18.0.1.0.0Motif, commentaire et date de résiliation ; contrat verrouillé ensuite
contract_refund_on_stop18.0.1.0.1Arrêt rétroactif avec avoir sur la période facturée en trop
contract_forecast18.0.1.0.1Prévisions de facturation par ligne (Facturation ▸ Analyse ▸ Gestion ▸ Prévisionnel de Contrat)
contract_forecast_variable_quantity18.0.1.0.0Recalcul des prévisions quand une formule de quantité change
contract_variable_qty_prorated18.0.1.0.0Formule Prorated Quantity : prorata au nombre de jours couverts
contract_variable_qty_timesheet18.0.1.0.0Trois formules calculant la quantité depuis les feuilles de temps
product_contract_variable_quantity18.0.1.0.1Valeurs par défaut de quantité variable sur un produit de contrat
product_contract_recurrence_in_price18.0.1.0.0Le montant total sur la durée affiché sur la ligne de commande
contract_service_dates18.0.1.0.0Des dates de service sur les lignes de contrat
contract_update_last_date_invoiced18.0.1.0.1Correction manuelle des dates de dernière et prochaine facturation
subscription_oca18.0.1.0.0Une application Abonnements complète et indépendante du module de contrats

Les menus : Facturation ▸ Analyse ▸ Gestion ▸ Prévisionnel de Contrat, Facturation ▸ Configuration ▸ Contrats ▸ Raison de la clôture du contrat, et un menu racine Abonnements avec ses sous-menus.

Le cycle de vie, ligne par ligne

Le standard traite un contrat comme un bloc : il court ou il s'arrête. La réalité est plus fine — un client garde la maintenance et abandonne l'hébergement, suspend une prestation pendant l'été, et renouvelle le reste à un tarif revu.

contract_line_successor apporte cette granularité : chaque ligne s'arrête, se suspend temporairement, planifie son successeur, s'annule, se réactive ou se renouvelle automatiquement — indépendamment des autres lignes du même contrat.

C'est le socle du dépôt : six autres modules en dépendent, dont le prévisionnel, la révision de prix, la résiliation et l'avoir rétroactif.

Réviser, résilier, rembourser

  • contract_price_revision révise les prix en masse : depuis la liste des contrats, un assistant génère de nouvelles lignes au tarif ajusté — par pourcentage ou prix fixe — et clôture les anciennes. C'est l'indexation annuelle, faite en une opération traçable au lieu de cent modifications.
  • contract_termination ajoute un motif de résiliation, un commentaire et une date, et bloque la modification du contrat résilié. Le référentiel des motifs vit sous Facturation ▸ Configuration ▸ Contrats ▸ Raison de la clôture du contrat.
  • contract_refund_on_stop permet d'arrêter une ligne déjà facturée au-delà de la date d'arrêt, en générant automatiquement l'avoir correspondant à la période facturée en trop.

Le dernier répond à la situation la plus banale d'un abonnement : le client résilie le 15 mars, le trimestre a été facturé le 1er janvier. Sans module, quelqu'un calcule l'avoir à la main — et se trompe une fois sur trois.

contract_update_last_date_invoiced complète cet arsenal de rattrapage : il permet de corriger manuellement la dernière date facturée et la prochaine date de facturation quand des factures ont été supprimées et que ces dates ne reflètent plus la réalité.

Le prévisionnel de facturation

contract_forecast calcule à l'avance les montants et dates de facturation futures de chaque ligne de contrat, consultables sous Facturation ▸ Analyse ▸ Gestion ▸ Prévisionnel de Contrat. Il s'appuie sur le module de files de travaux pour le calcul.

Le chiffre d'affaires récurrent attendu est l'indicateur que tout dirigeant d'une activité d'abonnement demande en premier, et que presque aucun ERP ne fournit sans export. Le calculer depuis les lignes de contrat, avec leurs dates réelles d'arrêt et de renouvellement, est la seule façon d'obtenir un chiffre juste.

contract_forecast_variable_quantity est une colle indispensable dès que les quantités sont variables : elle garantit le recalcul des prévisions quand le type ou la formule de quantité d'une ligne change. Sans elle, le prévisionnel se périme en silence.

Les quantités variables

Le mécanisme de quantité variable permet de calculer par formule la quantité à facturer d'une ligne de contrat. Quatre modules l'outillent :

  • contract_variable_qty_prorated fournit la formule Prorated Quantity : la quantité est proratisée au nombre de jours réellement couverts par la période. C'est le calcul attendu pour un abonnement démarré en cours de mois.
  • contract_variable_qty_timesheet ajoute trois formules calculant la quantité depuis les feuilles de temps saisies sur les lignes analytiques liées. C'est la facturation au temps passé sous contrat-cadre, sans ressaisie.
  • product_contract_variable_quantity fait le pont avec les produits de contrat : un produit qui génère un contrat à la vente porte ses valeurs par défaut de quantité variable.
  • product_contract_recurrence_in_price affiche sur la ligne de commande le montant total de toutes les facturations prévues sur la durée du contrat, et non le montant d'une seule période.

Le dernier règle un malentendu commercial fréquent : un client voit « 150 € » sur son devis d'abonnement mensuel de douze mois, et croit payer 150 € en tout.

contract_service_dates ajoute enfin des dates de service sur les lignes de contrat — la période réellement couverte, distincte de la période de facturation. Son README est minimal, limité à cette phrase.

Une seconde approche : l'application Abonnements

subscription_oca est à part : c'est une application complète et indépendante du module de contrats. Elle crée un modèle d'abonnement qui génère périodiquement des factures et/ou des commandes de vente, selon un gabarit d'abonnement paramétrable.

Elle apporte son propre menu racine Abonnements, avec les abonnements, les produits concernés et les modèles d'abonnement en configuration.

Deux approches coexistent donc dans l'écosystème communautaire : le contrat récurrent, très outillé et orienté comptabilité, et l'abonnement, plus proche du cycle commercial. Le choix se fait au départ, parce que les deux ne partagent aucune donnée.

En pratique : le module de contrats convient quand la facturation récurrente est le sujet — maintenance, hébergement, prestations sous contrat-cadre. L'application d'abonnements convient quand le cycle commercial l'est — souscription, renouvellement, changement de formule.

Limites connues

  • contract_line_successor est un socle : l'installer tard, sur des contrats existants, demande de vérifier l'état de chaque ligne.
  • Le prévisionnel dépend du module de files de travaux (queue_job), donc d'une infrastructure de travailleurs à surveiller.
  • Un prévisionnel non recalculé est pire qu'aucun prévisionnel : installer la colle de recalcul dès que les quantités variables sont utilisées.
  • La révision de prix en masse génère des lignes : la vérifier sur une base de recette avant de l'appliquer à un portefeuille entier.
  • L'avoir sur arrêt rétroactif dépend de la formule proratisée : vérifier que le calcul correspond à vos conditions contractuelles.
  • La correction manuelle des dates de facturation est un outil de rattrapage, pas un geste courant : elle contourne la mécanique du module.
  • subscription_oca et le module de contrats ne partagent rien : choisir l'un ou l'autre, et non les deux.
  • contract_service_dates a un README minimal : une phrase, sans détail des champs.

Identité technique

Les treize modules viennent du dépôt OCA contract, branche 18.0 — 31 modules au total —, tous en licence AGPL-3. Les dépendances notables : contract et contract_line_successor en interne, queue_job pour le prévisionnel, hr_timesheet pour les formules de temps, product_contract pour les produits de contrat, account et sale_management pour l'application d'abonnements.

Voir aussi facturer un contrat pour les mandats, les modes de paiement et la transmission.

Questions fréquentes

Peut-on arrêter une seule ligne d'un contrat Odoo ?

Oui, avec contract_line_successor : chaque ligne s'arrête, se suspend, planifie un successeur, s'annule ou se renouvelle indépendamment des autres. Le standard traite le contrat comme un bloc, alors qu'un client garde souvent la maintenance et abandonne l'hébergement.

Comment connaître le chiffre d'affaires récurrent attendu ?

contract_forecast calcule les montants et dates de facturation futures par ligne de contrat, visibles sous Facturation ▸ Analyse ▸ Gestion ▸ Prévisionnel de Contrat. Avec des quantités variables, installez aussi contract_forecast_variable_quantity, sans quoi le prévisionnel se périme en silence.

Que faire si un client résilie après avoir été facturé pour le trimestre ?

contract_refund_on_stop permet d'arrêter la ligne malgré la facturation déjà émise, et génère automatiquement l'avoir pour la période facturée en trop. Sans module, quelqu'un calcule cet avoir à la main — et se trompe une fois sur trois.

Comment appliquer une indexation annuelle à tous les contrats ?

contract_price_revision propose un assistant depuis la liste des contrats : il génère de nouvelles lignes au tarif ajusté — pourcentage ou prix fixe — et clôture les anciennes. Une opération traçable au lieu de cent modifications. À tester sur une base de recette avant de l'appliquer au portefeuille.

Faut-il utiliser le module Contrats ou l'application Abonnements ?

L'un ou l'autre : ils ne partagent aucune donnée. Le module de contrats convient quand la facturation récurrente est le sujet — maintenance, hébergement, prestations sous contrat-cadre. subscription_oca convient quand le cycle commercial l'est — souscription, renouvellement, changement de formule.

Se faire accompagner

La facturation récurrente est l'un des rares domaines où un choix d'architecture engage durablement : contrats ou abonnements, les deux ne se parlent pas, et migrer d'un modèle à l'autre revient à ressaisir le portefeuille.

Nous instruisons donc ce choix d'abord — nature des engagements, besoin de prévisionnel, facturation au temps ou au forfait — puis nous posons le socle de cycle de vie avant le premier contrat. Un prévisionnel juste vaut mieux qu'un prévisionnel. Voir les prestations d'Atalios Consulting ou demander un rappel.

Pour aller plus loin

En résumé

Un contrat récurrent n'est pas une facture qui revient : une ligne s'arrête, une autre se suspend, le client résilie après qu'on a facturé le trimestre. Treize modules traitent ce cycle de vie, le prévisionnel de chiffre d'affaires et les quantités calculées au temps passé. Parlons de vos contrats.

Documentation OCAFacturationOdoo Community

Partager

Fiches connexes

Équipe au travail sur des ordinateurs portables autour d'une table
Le module OCA `account_invoice_en16931` (dépôt `fr-einvoicing`, version 18.0.1.0.0, licence AGPL-3) est le socle qui fabrique le fichier de facture électronique conforme à la norme européenne **EN 16931** : Factur-X (PDF/A-3 avec XML CII embarqué), XML UBL, XML CII ou PDF accompagné d'un UBL — et il ajoute des **contrôles bloquants à la validation** d'une facture client. Les quatre modules qui s'y greffent pour la France, et ce que le socle ne fait pas.
Lire la suite
Documentation OCA, Facturation électronique
Réunion d'approbation autour d'un document de travail
Relevé sur une instance Odoo 18 Community, le module OCA `base_tier_validation` (dépôt `server-ux`, version 18.0.3.5.1, licence AGPL-3) ajoute 1 modèle, 101 champs et 3 menus, mais ne s'active sur aucun document métier par lui-même : il lui faut un module d'implémentation. C'est le point qui surprend le plus — voici ce qu'il fait réellement, et comment le mettre en service.
Lire la suite
Documentation OCA, Odoo