Introduction
L'une des fonctionnalités les moins souvent évoquées dans le modèle de données Odoo est le champ dépendant de l'entreprise. C'est un petit attribut qui fait une grande différence une fois que vous commencez à travailler avec des configurations multi-entreprises.
Dans la plupart des configurations Odoo, un champ sur un enregistrement contient une seule valeur que chaque utilisateur de la base de données peut voir. Mais que se passe-t-il lorsque deux entreprises partagent le même catalogue de produits, et que chaque entreprise a besoin de son propre code de référence interne ? Ou lorsque différentes entreprises ont besoin de différents comptes par défaut pour le même produit ?
C'est exactement le problème que résout l'attribut company_dependent. Que vous fassiez du développement Odoo, de la personnalisation Odoo, ou que vous exploriez simplement le cadre Odoo, comprendre ce type de champ vous donnera un véritable avantage dans les projets multi-entreprises.
Qu'est-ce qu'un champ dépendant de l'entreprise dans Odoo
Un champ dépendant de l'entreprise est un champ qui stocke une valeur distincte par entreprise, sur le même enregistrement. Lorsqu'un utilisateur appartenant à l'entreprise A lit le champ, il voit la valeur de son entreprise. Lorsqu'un utilisateur de l'entreprise B lit le même enregistrement, il voit une valeur différente.
De l'extérieur, il ressemble et se comporte comme un champ normal. Les utilisateurs interagissent avec lui de la même manière dans l'interface Odoo. La magie se produit en coulisses dans l'ORM Odoo.
Comment cela apparaît dans l'interface
Dans l'interface utilisateur Odoo, un champ dépendant de l'entreprise ressemble à un champ régulier. Il n'y a aucun indicateur visible indiquant à un utilisateur que la valeur qu'il voit est spécifique à l'entreprise. C'est intentionnel : le comportement est transparent pour les utilisateurs finaux.
D'un point de vue développeur, c'est l'un des types de champs Odoo qui peuvent être appliqués à de nombreux types de base : Char, Boolean, Integer, Float, Many2one, et d'autres. L'attribut company_dependent=True est ce qui active ce comportement dans l'ORM Odoo.
Dans Odoo Studio, certains champs dépendants de l'entreprise sont déjà exposés sur des modèles standards (comme les champs liés aux produits pour les comptes). Des champs dépendants de l'entreprise personnalisés peuvent également être créés, bien que le support de Studio pour cet attribut spécifique soit limité dans certaines versions d'Odoo.
Comment fonctionne le champ
Sous le capot, les champs dépendants de l'entreprise fonctionnent très différemment des champs réguliers. Comprendre le mécanisme aide à éviter les surprises lors de la création ou du débogage des personnalisations Odoo.
Stockage dans ir.property
Dans Odoo 16 et les versions antérieures, les valeurs des champs dépendants de l'entreprise ne sont pas stockées dans la propre table de base de données du modèle. Au lieu de cela, elles sont stockées dans une table système séparée appelée ir.property.
Chaque entrée dans ir.property lie :
- Un enregistrement spécifique (par exemple, produit avec l'ID 42)
- Un champ spécifique (par exemple,
property_account_income_id) - Une entreprise spécifique
- La valeur réelle pour cette combinaison
C'est pourquoi les valeurs semblent transparentes pour les utilisateurs : l'ORM récupère et écrit dans ir.property automatiquement en fonction du contexte de l'entreprise actuelle.
Changements dans Odoo 17+
À partir d'Odoo 17, le mécanisme de stockage a été refactorisé. Les champs dépendants de l'entreprise sont maintenant stockés directement dans la table du modèle à l'aide d'une colonne jsonb, avec les valeurs de l'entreprise stockées sous forme de dictionnaire JSON. Cela améliore considérablement les performances et simplifie les requêtes.
L'interface et l'API destinées aux développeurs restent les mêmes, mais les requêtes sur les champs dépendants de l'entreprise sont désormais beaucoup plus rapides à grande échelle.
Valeurs par défaut
Les champs dépendants de l'entreprise prennent en charge des valeurs par défaut spécifiques à l'entreprise. Lorsqu'aucune valeur n'a été explicitement définie pour une entreprise donnée, le champ revient à la valeur par défaut définie sur le champ lui-même. Cette valeur par défaut peut également être définie par entreprise via le modèle ir.property (Odoo 16 et antérieur) ou directement sur le modèle (Odoo 17+).
Interaction avec l'ORM
Dans le contexte de l'orm d'odoo, accéder à un champ dépendant de l'entreprise respecte toujours l'entreprise actuelle dans l'environnement (self.env.company). Cela signifie :
- Lire le champ renvoie la valeur pour l'entreprise active
- Écrire dans le champ ne met à jour la valeur que pour l'entreprise active
- Changer le contexte de l'entreprise (
record.with_company(company)) vous permet de lire ou d'écrire des valeurs pour une entreprise spécifique
Cas d'utilisation commerciale
Le champ dépendant de l'entreprise n'est pas juste une curiosité technique. Il résout de réels problèmes quotidiens dans les configurations multi-entreprises d'Odoo. Voici cinq scénarios courants où il mérite vraiment sa place.
1. Comptabilité : Comptes de revenus et de dépenses par entreprise
C'est l'exemple le plus courant dans Odoo tel quel. Les champs property_account_income_id et property_account_expense_id sur les produits sont dépendants de l'entreprise.
En pratique : L'entreprise A vend le même produit que l'entreprise B, mais chaque entreprise a un plan comptable différent. Au lieu de dupliquer l'enregistrement du produit, chaque entreprise configure simplement ses propres lignes comptables. Le produit est partagé ; la logique comptable ne l'est pas.
2. Ventes et CRM : Tarifs par entreprise
Dans un groupe qui gère plusieurs entités de vente, chaque entreprise peut utiliser différentes stratégies de tarification. Avec un champ de liste de prix dépendant de l'entreprise, un enregistrement client partagé peut porter différentes listes de prix par défaut selon l'entreprise qui traite la vente.
Cela garde les données CRM centralisées tout en permettant à chaque entreprise d'appliquer ses propres règles commerciales.
3. Inventaire : Méthode d'évaluation des stocks par entreprise
Certaines groupes exploitent des entrepôts à travers plusieurs entités juridiques avec différentes réglementations locales. Un produit peut nécessiter un coût FIFO dans un pays et un coût moyen dans un autre. L'utilisation de champs dépendants de l'entreprise sur le produit ou la catégorie évite de dupliquer l'ensemble du catalogue de produits.
4. Fabrication : Fournisseur par défaut par entreprise
Lorsqu'un produit partagé est acheté auprès de différents fournisseurs selon l'entreprise, un champ many2one dépendant de l'entreprise pointant vers res.partner peut contenir le fournisseur préféré par entité. Chaque entreprise voit son propre fournisseur préféré sans conflit.
5. Champs personnalisés pour les données réglementaires
Les groupes opérant dans plusieurs pays ont souvent besoin de stocker des références de conformité spécifiques à chaque pays sur des enregistrements partagés. Par exemple, un produit peut nécessiter un code SH ou une classification fiscale différente selon la juridiction. Un champ dépendant de l'entreprise Char est un moyen propre et peu coûteux de gérer cela sans créer de variantes de modèle.
Créer ou personnaliser le champ
Il existe deux principales façons de créer des champs dépendants de l'entreprise dans Odoo : en utilisant Odoo Studio ou en écrivant directement du code Python.
Utilisation d'Odoo Studio
Odoo Studio vous permet de créer des champs sans aucun code. Cependant, Studio n'expose pas de bascule dédiée pour company_dependent dans toutes les versions. Dans Odoo 16 et 17, l'option est disponible pour certains types de champs lors de la création de nouveaux champs sur des modèles standard.
Si vous avez besoin d'un contrôle total sur cet attribut, le développement technique est l'approche la plus fiable. Studio est un bon point de départ pour des cas plus simples, mais il a des limites en ce qui concerne les scénarios de personnalisation avancée d'Odoo.
Approche technique : Champs Python
Dans un module Odoo personnalisé, déclarer un champ dépendant de l'entreprise est simple. Voici le modèle standard utilisé dans le développement de champs Python d'Odoo :
from odoo import fields, models
class ProductTemplate(models.Model):
_inherit = 'product.template'
x_internal_ref = fields.Char(
string='Référence interne (par entreprise)',
company_dependent=True,
)
x_preferred_carrier_id = fields.Many2one(
comodel_name='res.partner',
string='Transporteur préféré',
company_dependent=True,
)
Ajouter company_dependent=True à toute déclaration de champ est tout ce qu'il faut. L'ORM gère le reste automatiquement.
Définir des valeurs par défaut par entreprise
Dans Odoo 16 et les versions antérieures, vous pouvez définir une valeur par défaut au niveau de l'entreprise via le modèle ir.property. Cela est utile lorsque vous souhaitez une valeur par défaut raisonnable pour tous les enregistrements d'une entreprise, sans la définir enregistrement par enregistrement :
self.env['ir.property']._set_default(
'x_internal_ref',
'product.template',
'DEFAULT-VALUE',
company_id=self.env.company.id,
)
Dans Odoo 17+, la valeur par défaut est stockée directement sur l'enregistrement du modèle et est également accessible via la définition du champ.
Champs et limitations d'Odoo Studio
Lorsque vous travaillez avec des champs d'Odoo Studio, gardez à l'esprit que le préfixe x_ est requis pour les champs personnalisés. Le comportement dépendant de l'entreprise peut ne pas être visible dans l'interface utilisateur de Studio, mais il peut toujours être configuré depuis le menu technique sous Paramètres si le mode développeur est actif.
Meilleures pratiques
Travailler avec des champs dépendants de l'entreprise est simple une fois que vous connaissez les modèles. Voici les pratiques qui vous feront gagner du temps et éviteront des maux de tête.
1. Utilisez-le uniquement lorsque les valeurs diffèrent réellement par entreprise
Les champs dépendants de l'entreprise ajoutent de la complexité. Si la valeur est la même pour toutes les entreprises, utilisez un champ régulier. Réservez company_dependent=True pour les champs où différentes entreprises ont réellement besoin de valeurs différentes sur des enregistrements partagés.
2. Testez toujours dans un contexte multi-entreprises
Lorsque vous construisez ou testez des fonctionnalités impliquant des champs dépendants de l'entreprise, testez toujours avec au moins deux entreprises actives. Il est facile de manquer des problèmes dans une configuration à entreprise unique qui se manifesteront immédiatement en production.
3. Utilisez with_company() pour des opérations inter-entreprises
Si votre code doit lire ou écrire des valeurs de champs dépendants de l'entreprise pour une entreprise autre que la courante, utilisez record.with_company(target_company). Évitez de changer manuellement l'entreprise de l'environnement sans la restaurer.
4. Faites attention aux exportations et importations
Lors de l'exportation d'enregistrements contenant des champs dépendants de l'entreprise, les valeurs exportées reflètent l'entreprise de l'utilisateur effectuant l'exportation. L'importation du même fichier dans un contexte d'entreprise différent définira les valeurs pour cette entreprise. C'est souvent le comportement correct, mais soyez explicite à ce sujet dans les workflows de migration et d'importation de données.
5. Documentez Quels Champs Sont Dépendants de l'Entreprise
Les utilisateurs finaux savent rarement quels champs sont dépendants de l'entreprise. Une courte note dans votre documentation interne Odoo ou vos matériaux d'intégration est très utile. Cela évite la confusion lorsqu'un utilisateur change d'entreprise et voit des valeurs différentes sur le même enregistrement.
6. Préférez Many2one à Char pour les Données Structurées
Lorsque la valeur par entreprise est une référence à un autre enregistrement (compte, liste de prix, partenaire), utilisez un champ dépendant de l'entreprise Many2one plutôt que de stocker un nom en tant que texte. Cela maintient le modèle de données propre et rend les rapports plus fiables.
Pièges courants
Même les développeurs Odoo expérimentés rencontrent des problèmes avec les champs dépendants de l'entreprise. Savoir quoi surveiller permettra d'éviter de perdre du temps en débogage.
Piège 1 : Oublier le Contexte de l'Entreprise dans les Actions Automatisées
Les actions planifiées et les actions serveur s'exécutent souvent dans un contexte où l'entreprise est la première entreprise de la base de données, pas nécessairement celle que vous attendez. Si votre action automatisée lit ou écrit un champ dépendant de l'entreprise, vérifiez explicitement le contexte de l'entreprise. Utilisez with_company() pour être en sécurité.
Piège 2 : Supposer que le Champ Comporte un Comportement de Champ Calculé
Les champs dépendants de l'entreprise ne sont pas des champs calculés. Ils n'ont pas de méthode compute. La variation par entreprise provient du stockage, pas du calcul. Essayer d'ajouter compute= aux côtés de company_dependent=True ne fonctionnera pas comme prévu et peut provoquer des erreurs dans le framework Odoo.
Piège 3 : Rechercher à Travers les Entreprises
Les recherches ORM standard sur les champs dépendants de l'entreprise ne retournent que des résultats correspondant au contexte de l'entreprise actuel. Si vous devez rechercher à travers toutes les entreprises, vous devez interroger directement ir.property (Odoo 16 et antérieur) ou gérer soigneusement la colonne jsonb (Odoo 17+). C'est une source courante de confusion dans le reporting et le travail d'extraction de données.
Piège 4 : Ne pas définir de valeurs par défaut pour toutes les entreprises
Lorsque vous introduisez un champ dépendant de l'entreprise dans un système en direct, les enregistrements existants retourneront False ou None pour toute entreprise qui n'a pas explicitement défini de valeur. Si votre logique métier attend une valeur par défaut, définissez-la de manière proactive pour toutes les entreprises concernées à l'aide d'un script de migration de données.
Piège 5 : Le confondre avec les droits d'accès
Les champs dépendants de l'entreprise contrôlent quelle valeur est affichée, pas si l'utilisateur peut voir le champ ou non. Si vous devez cacher complètement un champ à certaines entreprises ou utilisateurs, cela relève des règles d'enregistrement ou des droits d'accès au niveau des champs, pas de company_dependent.
Conclusion
Le champ dépendant de l'entreprise est l'une de ces fonctionnalités dans Odoo qui semble invisible jusqu'à ce que vous en ayez besoin, et devient alors indispensable. C'est l'outil approprié pour toute situation où le même enregistrement doit porter des valeurs différentes selon les entreprises : configurations comptables, règles de tarification, références réglementaires ou tout attribut spécifique à l'entreprise qui varie selon l'entité légale.
Comprendre comment cela fonctionne au niveau de l'ORM, quelle version d'Odoo a changé le modèle de stockage et quels pièges éviter vous fera gagner un temps précieux sur les projets multi-entreprises. Que vous le rencontriez dans un guide de développeur Odoo standard ou que vous le découvriez en déboguant un système en direct, connaître ce type de champ est un signe de véritable expertise Odoo.
Si vous construisez sur le framework Odoo et avez besoin de gérer des données par entreprise de manière propre, company_dependent=True est la réponse que vous cherchiez.
Besoin d'aide avec votre implémentation Odoo ?
Chez Dasolo, nous aidons les entreprises à mettre en œuvre, personnaliser et optimiser Odoo à toutes les échelles et configurations, y compris les configurations multi-entreprises complexes. Que vous ayez besoin d'un modèle de données sur mesure, d'une stratégie de champ personnalisée ou d'un déploiement complet d'Odoo, notre équipe a la profondeur technique et fonctionnelle pour bien faire les choses.
Si vous avez des questions sur les champs dépendants de l'entreprise ou tout autre aspect de votre mise en œuvre Odoo, nous sommes heureux de vous aider. Contactez-nous et parlons de ce que vous construisez.