Documentation10 min de lecture

base_exception : des règles de blocage métier sur n'importe quel document

Le module OCA `base_exception` (dépôt `server-tools`, version 18.0.1.3.0, licence AGPL-3) crée 3 modèles et 23 champs : il permet de définir des règles qui bloquent ou signalent un document avant validation — mais il n'agit sur aucun document sans module d'implémentation. Les trois modes de détection, le groupe à ne pas distribuer, et le risque de sécurité que le dépôt signale lui-même.

Contrôle de conformité sur un document avant validation

« Il ne faut jamais valider un devis sans adresse de livraison. » « Pas de commande d'achat à ce fournisseur au-delà de 10 000 € sans visa. » Ces règles existent dans toutes les entreprises ; elles vivent dans la tête de deux personnes et se perdent à leur départ.

base_exception permet de les écrire dans l'outil. Comme base_tier_validation, c'est un socle : il fournit le moteur et les écrans, et il n'a aucun effet métier sans un module d'implémentation — sale_exception pour les devis, purchase_exception pour les achats.

Résumé

Le module permet d'inscrire dans Odoo les règles métier qui vivent aujourd'hui dans la tête de deux personnes — un champ obligatoire, un seuil, une incohérence — et de bloquer ou signaler un document avant validation.

Comme base_tier_validation, c'est un socle sans effet seul : il lui faut un module d'implémentation. Et le dépôt signale lui-même que le code Python des règles passe par safe_eval, avec un risque de sécurité non résolu — d'où deux consignes : mode By domain par défaut, et groupe réservé aux administrateurs.

L'essentiel

  • Trois modes de détection : par domaine Odoo, par code Python, ou par appel à une méthode existante du modèle.
  • Bloquant ou non : une case Is Blocking décide si l'utilisateur peut passer outre.
  • Une fenêtre de confirmation récapitule les exceptions en cours avant de poursuivre l'action.
  • Aucun effet seul : sans module d'implémentation, les listes de modèles et de méthodes sont vides.
  • Risque de sécurité signalé par le dépôt : le code Python des règles est exécuté via safe_eval.
  • Un groupe dédié : « Exception manager », à ne pas distribuer largement.

Ce que le module ajoute à l'instance

ÉlémentNombre
Modèles créés3
Modèles étendus1
Champs ajoutés23
Menus1
Vues3
Actions de fenêtre2
Groupes de droits1

Le modèle central est exception.rule : une règle, rattachée à un modèle Odoo, avec son mode de détection et son caractère bloquant ou non. À côté, le modèle abstrait base.exception est celui qu'un module d'implémentation vient hériter sur un modèle réel.

C'est cette architecture en deux pièces qui explique le comportement du module installé seul : l'écran de création de règles existe, mais la liste Apply on est vide, parce qu'aucun modèle ne s'est enregistré.

Liste des règles de restriction : chaque règle porte son nom, le modèle auquel elle s'applique et son caractère bloquant
Liste des règles de restriction : chaque règle porte son nom, le modèle auquel elle s'applique et son caractère bloquant

Où le trouver dans Odoo

MenuAccessible à
Paramètres ▸ Technique ▸ Règles de restrictionMembres du groupe « Exception manager » uniquement

Un seul menu, et c'est volontaire : ce module s'adresse aux personnes qui définissent les règles, pas à celles qui les subissent. Les utilisateurs, eux, rencontrent le module sous la forme d'une fenêtre de confirmation au moment de valider un document.

Le groupe technique est base_exception.group_exception_rule_manager. Les utilisateurs du groupe de base (base.group_user) n'ont qu'un droit de lecture sur les règles.

Cas d'usage

Une règle par domaine : le cas le plus sûr

C'est le mode à privilégier, parce qu'il n'exécute aucun code : la règle est un filtre Odoo, construit avec le sélecteur graphique.

  1. Paramètres ▸ Technique ▸ Règles de restriction, puis Nouveau.
  2. Renseigner Exception Name et Description — la description est ce que l'utilisateur lira dans la fenêtre de confirmation, elle doit être explicite.
  3. Choisir le modèle cible dans Apply on (la liste dépend des modules d'implémentation installés).
  4. Sélectionner By domain dans les boutons radio de type.
  5. Renseigner le domaine, avec le sélecteur graphique : il doit correspondre aux enregistrements à signaler ou bloquer.
  6. Cocher Is Blocking si l'exception ne doit jamais pouvoir être ignorée.
  7. Enregistrer.

Le point d'attention sur le domaine : il décrit les documents en faute, pas les documents conformes. Une règle inversée bloque exactement l'inverse de ce qu'on voulait, et c'est l'erreur la plus fréquente à la première règle.

Bloquant ou simple alerte : l'arbitrage qui compte

La case Is Blocking est le seul réglage réellement structurant du module.

Non bloquanteBloquante
Ce que voit l'utilisateurUne fenêtre récapitulative, puis il peut continuerUne fenêtre, et il ne peut pas continuer
Quand la choisirRègle d'hygiène, information utileExigence légale, risque financier
Effet sur l'adoptionAcceptéeContournée si elle est injustifiée

La dernière ligne est le conseil qui compte : une règle bloquante que l'équipe juge arbitraire finit contournée — par un autre chemin, un autre journal, un autre document. Réservez le blocage à ce qui le mérite vraiment, et laissez le reste en alerte.

Les modes code Python et méthode

Les deux autres modes existent pour les cas qu'un domaine ne peut pas exprimer : une règle qui compare deux champs, qui compte des lignes, ou qui appelle une logique déjà écrite dans le modèle.

  • By python code : une expression évaluée sur l'enregistrement. Puissant, et c'est exactement ce qui porte le risque de sécurité décrit plus bas.
  • By method : l'appel d'une méthode existante du modèle. Plus sûr, mais il faut que la méthode existe — donc un développement en amont.

Le risque de sécurité, signalé par le dépôt

C'est la limite la plus importante de ce module, et elle est écrite noir sur blanc dans sa propre documentation : le code Python saisi dans une règle est exécuté via safe_eval, ce qui peut représenter un risque de sécurité. Le dépôt indique que la façon d'atténuer ce risque reste à traiter dans de futures versions.

Conséquence pratique, et elle n'est pas négociable :

  1. N'attribuez le groupe « Exception manager » qu'à des administrateurs. Créer une règle en mode Python équivaut à faire exécuter du code sur votre instance.
  2. Privilégiez systématiquement le mode « By domain », qui n'exécute rien. La grande majorité des règles métier s'expriment par un domaine.
  3. Relisez les règles existantes si plusieurs personnes ont eu ce groupe par le passé.

C'est aussi un argument en faveur du mode « By method » quand un domaine ne suffit pas : la logique vit alors dans un module versionné et relu, pas dans un champ texte de la base. Voir les droits utilisateurs dans Odoo et les six mesures de sécurité qui comptent.

Configuration

  1. Installer base_exception — il ne dépend que de base_setup.
  2. Installer un module d'implémentation : sale_exception (dépôt sale-workflow) pour les devis, purchase_exception (dépôt purchase-workflow) pour les achats. Sans cela, les listes Apply on et method restent vides.
  3. Attribuer le groupe base_exception.group_exception_rule_manager à un ou deux administrateurs — pas plus.
  4. Créer les règles, en commençant par le mode By domain et en non bloquant.
  5. Après deux ou trois semaines d'observation, passer en bloquant celles qui le méritent.

L'étape 5 est la méthode qui fait adopter ce module : on observe d'abord combien de documents une règle attraperait, on ajuste le domaine, puis on bloque. Bloquer d'emblée sur une règle non éprouvée produit un arrêt de production et une mauvaise réputation pour l'outil.

Limites connues

Le dépôt répertorie une limite, et c'est celle qui doit guider le déploiement.

  • « Ce module exécute du code fourni par l'utilisateur via un safe_eval, ce qui peut être non sécurisé. La façon d'atténuer ce risque devrait être traitée dans de futures versions. » C'est la formulation du dépôt lui-même.

Trois limites d'usage s'y ajoutent :

  • Aucun effet sans module d'implémentation. C'est la même architecture que base_tier_validation, et la même déception à l'installation.
  • Le domaine décrit les documents en faute, pas les conformes. Une règle inversée bloque exactement l'inverse de l'intention.
  • Une règle bloquante injustifiée se contourne. Le module ne protège pas contre un autre chemin de saisie ; il protège une action précise sur un modèle précis.

Si votre besoin est une approbation par une personne plutôt qu'un contrôle sur des données, c'est l'autre module qu'il faut : base_tier_validation. Les deux se complètent — l'un vérifie le contenu, l'autre demande un visa.

Identité technique

Nom techniquebase_exception
Dépôt OCAserver-tools, branche 18.0
Version du module18.0.1.3.0
LicenceAGPL-3
Dépendancesbase_setup
Modules d'implémentationsale_exception, purchase_exception
Groupe crééException manager (group_exception_rule_manager)

Il fait partie de notre socle commun, installé mais sans règle active : les règles se définissent avec le client, parce qu'elles décrivent son organisation.

Questions fréquentes

Pourquoi la liste « Apply on » est-elle vide ?

Parce qu'aucun module d'implémentation n'est installé. base_exception est un socle : il fournit le moteur et les écrans, et il faut un module comme sale_exception ou purchase_exception qui hérite le mixin base.exception sur un modèle réel pour que celui-ci apparaisse dans la liste.

Quelle différence avec base_tier_validation ?

base_exception vérifie le contenu d'un document — un champ manquant, un montant hors limite — et bloque ou signale. base_tier_validation demande un visa à une personne. Les deux se complètent : l'un contrôle les données, l'autre organise l'approbation.

Le mode code Python est-il dangereux ?

Le dépôt le signale lui-même : le code des règles est exécuté via safe_eval, ce qui peut représenter un risque de sécurité, et la façon d'atténuer ce risque reste à traiter. Conclusion pratique : n'attribuez le groupe « Exception manager » qu'à des administrateurs, et privilégiez le mode « By domain », qui n'exécute rien.

Faut-il rendre les règles bloquantes ?

Pas d'emblée. Commencez en non bloquant, observez deux ou trois semaines combien de documents la règle attrape, ajustez le domaine, puis bloquez ce qui le mérite. Une règle bloquante que l'équipe juge arbitraire finit contournée par un autre chemin de saisie.

Le domaine décrit-il les documents conformes ou en faute ?

Les documents en faute : ceux que la règle doit signaler ou bloquer. C'est l'erreur la plus fréquente à la première règle, et elle produit exactement l'inverse de l'effet voulu — testez toujours sur quelques documents avant d'activer le blocage.

Se faire accompagner

Ce module demande deux choses que l'outil ne fournit pas : des règles écrites — donc une organisation explicitée — et un module d'implémentation si le modèle que vous voulez contrôler n'en a pas.

Nous menons l'exercice en deux temps : recueillir les règles qui vivent aujourd'hui dans la tête de vos équipes, puis les écrire en domaines plutôt qu'en code. Et nous développons le module d'implémentation quand il manque — voir les prestations d'Atalios Consulting et notre méthode. Demander un rappel.

Pour aller plus loin

En résumé

base_exception permet d'inscrire dans Odoo les règles qui vivent aujourd'hui dans la tête de deux personnes. Trois recommandations : un module d'implémentation d'abord, le mode « By domain » toujours quand c'est possible, et le groupe « Exception manager » réservé aux administrateurs — le dépôt signale lui-même le risque du mode Python. Parlons de vos règles métier.

Documentation OCAOdooGouvernance

Partager

Fiches connexes

Relevés bancaires et pièces comptables sur un bureau
Relevé sur une instance Odoo 18 Community, le module OCA `account_reconcile_oca` (dépôt `account-reconcile`, version 18.0.1.1.14, licence AGPL-3) ajoute 2 modèles, 87 champs et 17 vues : il remplace le lettrage limité de la Community par deux écrans dédiés, bancaire et par compte. Ce qu'il ajoute à l'instance, où le trouver, ses quatre cas d'usage et ses limites connues.
Lire la suite
Documentation OCA, Comptabilité
Relevé bancaire et suivi des opérations sur un bureau
Odoo a retiré l'import de relevés bancaires de son édition Community à partir de la version 14 : les 3 modules OCA `account_statement_import_file` (18.0.1.0.3, LGPL-3), `_camt` et `_ofx` le rétablissent, avec la détection des transactions déjà importées. Comment ils s'articulent, ce que CAMT apporte de plus qu'OFX, et le piège du fichier sans IBAN.
Lire la suite
Documentation OCA, Comptabilité