En bref pour les pressés : Pour numéroter automatiquement vos opportunités CRM dans Odoo v19 (format AFF/2026/0001), combinez trois composants natifs : une séquence technique, un champ Studio en lecture seule, et deux règles d'automatisation de type "Mettre à jour l'enregistrement". Résultat : 0 € de surcoût, zéro ligne de code Python, et un compteur qui repart à 1 chaque 1er janvier — à condition d'utiliser %(range_year)s et non %(year)s dans le préfixe.
Environnement : Odoo v19 Online · Niveau : Intermédiaire · Coût additionnel : 0 €
Validé en conditions réelles. Procédure complète, scénarios de test inclus.
Le problème (que vous connaissez probablement déjà)
Vos commerciaux ont 80 opportunités dans le CRM. Chaque échange email commence par "c'est pour quel dossier déjà ?". Vos devis n'ont aucune référence commune avec votre CRM. Et quand deux prospects s'appellent Martin, tout le monde hésite.
Ce n'est pas un problème d'outil, c'est un problème de langage commun. Et la solution tient en un code affaire unique par opportunité, attribué automatiquement.
Attaquons point par point.
Pourquoi numéroter vos opportunités ?
Un numéro d'affaire, c'est comme un matricule dans votre équipe RH : ça ne change rien à la personne, mais ça change tout à la traçabilité. Concrètement, un code de type AFF/2026/0001 vous permet de :
- Référencer l'opportunité dans vos emails, devis et contrats sans ambiguïté.
- Faire le lien entre votre CRM et vos autres outils (ERP, comptabilité, tableur partagé).
- Mesurer le temps de traitement par dossier.
- Auditer l'historique commercial même quand deux prospects portent le même nom.
Pourquoi c'est gratuit ?
C'est la question que tout le monde pose en premier, et c'est légitime.
Odoo facture 16 €/mois les automatisations qui utilisent le type "Exécuter le code" (Python). Ce que nous allons construire repose uniquement sur le type "Mettre à jour l'enregistrement", qui n'est pas scanné par le moteur de comptage de lignes de code d'Odoo (cloc.py). Résultat : 0 € de surcoût.
Vue d'ensemble de la solution
Trois composants natifs, combinés sans une seule ligne de Python :
| Composant | Rôle | Où le trouver |
|---|---|---|
| Séquence | Génère les numéros incrémentaux | Paramètres › Technique › Séquences |
| Champ Studio | Stocke le code sur l'opportunité | CRM › Studio › Formulaire |
| Règles d'automatisation | Déclenchent la numérotation | Paramètres › Technique › Automatisations |
Les 7 étapes de configuration
Étape 1 — Activer le mode développeur
Allez dans Paramètres › Paramètres généraux, descendez jusqu'à la section Développeur et cliquez sur Activer le mode développeur. Cette action déverrouille les menus Technique nécessaires aux étapes suivantes. Sans ça, vous ne verrez simplement pas les options.
Étape 2 — Créer la séquence "ID OPP"
Allez dans Paramètres › Technique › Séquences puis cliquez sur Nouveau.
| Champ | Valeur |
|---|---|
| Nom | ID OPP |
| Code de la séquence | crm.opportunity.seq |
| Préfixe | AFF/%(range_year)s/ |
| Taille de la séquence | 4 (→ donne 0001) |
| Incrément | 1 |
| Numéro suivant | 1 |
| Mise en œuvre | Sans espace |
⚠️ Point d'attention critique : la remise à zéro annuelle
Il y a un piège ici, et il est facile à rater. Si vous utilisez %(year)s dans le préfixe, le compteur ne repart pas à 1 au 1er janvier ,il continue à s'incrémenter.
La bonne variable est %(range_year)s, couplée à l'option "Utiliser des plages de dates" sur la séquence. Ensuite, créez une plage par année :
| Début | Fin | Prochain numéro |
|---|---|---|
| 01/01/2026 | 31/12/2026 | 1 |
| 01/01/2027 | 31/12/2027 | 1 |
Chaque plage possède son propre compteur. C'est la méthode standard qu'Odoo utilise en interne pour ses factures et ses commandes.
Étape 3 — Créer le champ "Code Affaire" via Studio
- Ouvrez n'importe quelle opportunité dans le module CRM.
- Cliquez sur l'icône Studio (la clé à molette en haut à droite).
- Dans le panneau gauche, onglet Ajouter, glissez-déposez un champ Texte sur le formulaire.
- Configurez-le ainsi :
| Paramètre | Valeur |
|---|---|
| Étiquette | Code Affaire |
| Lecture seule | ✅ Coché |
| Copier | ✅ Coché (utile pour les exports) |
- Notez bien le nom technique du champ dans ses propriétés ,il ressemble à x_studio_code_affaire. Vous en aurez besoin à l'étape 6.
Étape 4 — Créer l'action serveur "Update Piste"
Allez dans Paramètres › Technique › Actions › Actions Serveur, puis Nouveau :
| Paramètre | Valeur |
|---|---|
| Nom | Update Piste |
| Modèle | Piste (crm.lead) |
| Type d'action | Mettre à jour l'enregistrement |
| Champ à mettre à jour | Code Affaire (x_studio_code_affaire) |
| Type de valeur | Séquence → sélectionner ID OPP |
Si ID OPP n'apparaît pas dans la liste déroulante, utilisez "Recherche avancée…" pour la retrouver.
Étape 5 — Règle n°1 : création directe d'une opportunité
Dans Paramètres › Technique › Automatisations › Règles d'automatisation, créez une nouvelle règle :
| Paramètre | Valeur |
|---|---|
| Nom | N° affaire — Création opportunité |
| Modèle | Piste (crm.lead) |
| Déclencheur | À la création |
| Appliquer sur (domaine) | [('type', '=', 'opportunity')] |
| Action à effectuer | → Update Piste |
Le domaine est important : il cible uniquement les enregistrements de type opportunité, pas les pistes. À saisir en mode code (</>).
Étape 6 — Règle n°2 : conversion d'une piste en opportunité
C'est la règle la plus délicate. Elle surveille le changement du champ type (de lead vers opportunity) et n'agit que si le code affaire est encore vide — ce qui évite d'écraser un numéro existant.
| Paramètre | Valeur |
|---|---|
| Nom | N° affaire — Conversion piste |
| Modèle | Piste (crm.lead) |
| Déclencheur | Lors de la mise à jour |
| Champs surveillés | type |
| Avant mise à jour (filtre) | [('type', '=', 'lead')] |
| Appliquer sur | [('type', '=', 'opportunity'), ('x_studio_code_affaire', '=', False)] |
| Action à effectuer | → Update Piste |
Remplacez x_studio_code_affaire par le nom technique réel noté à l'étape 3.
Étape 7 — Tests de validation
Ne sautez pas cette étape. Voici les 5 scénarios à vérifier :
| Scénario | Résultat attendu |
|---|---|
| Créer une opportunité directement | ✅ Code affaire rempli (ex : AFF/2026/0001) |
| Créer une piste (lead) | ✅ Champ vide — c'est normal |
| Convertir une piste en opportunité | ✅ Code affaire rempli automatiquement |
| Modifier une opportunité existante | ✅ Code affaire inchangé (non écrasé) |
| 1er janvier N+1 | ✅ Compteur repart à AFF/2027/0001 |
Pour aller plus loin
Cette configuration est un socle. À partir de là, plusieurs évolutions sont possibles selon vos besoins :
- Afficher le code affaire dans la vue liste du CRM pour un accès rapide sans ouvrir chaque fiche.
- Reporter le code sur les devis liés à l'opportunité via un champ calculé.
- Segmenter par équipe commerciale avec des préfixes distincts (AFF-NORD/, AFF-SUD/).
- Automatiser la création des plages annuelles via un cron si vous gérez de nombreuses séquences.
Ce que cette configuration change vraiment
Le numéro en lui-même ne vaut rien. Ce qu'il crée, c'est un langage commun entre vos équipes, vos outils et vos clients. C'est exactement ce que doit produire une digitalisation bien conduite : non pas ajouter de la complexité, mais en retirer.
Et comme souvent dans Odoo, la solution était déjà là, il suffisait de savoir où regarder.
Et vous, comment tracez-vous vos dossiers commerciaux aujourd'hui ? Partagez votre méthode en commentaire, je suis curieux de voir les différentes approches. 👇
Vous voulez adapter cette configuration à votre contexte Odoo ? → Réserver 30 minutes