Introduction
Dans Odoo, les modèles définissent comment les données sont structurées et stockées dans la base de données. Chaque élément de données commerciales avec lequel vous travaillez, des commandes de vente à l'inventaire en passant par les produits, vit dans un modèle.
Comprendre les modèles Odoo est essentiel tant pour les développeurs que pour les consultants fonctionnels. Les modèles sont la base de l'architecture des données Odoo. Ils définissent les champs Odoo, les relations et la logique commerciale.
Cet article se concentre sur l'un des modèles les plus importants d'Odoo : product.product. Que vous construisiez des modules personnalisés, intégriez des systèmes externes ou configuriez des catalogues de produits, vous travaillerez avec ce modèle.
Qu'est-ce que le modèle product.product
Le modèle product.product représente les variantes de produit réelles dans Odoo. Ce sont les articles concrets, vendables et achetables qui apparaissent sur les commandes de vente, les commandes d'achat et les mouvements d'inventaire.
Ce modèle dans Odoo est différent de product.template. Le modèle contient des attributs partagés pour une famille de produits. Les enregistrements product.product sont les variantes spécifiques. Pour un produit simple sans variantes, il y a un product.product par product.template. Pour les produits configurables (par exemple, un T-shirt avec taille et couleur), chaque combinaison est un product.product séparé.
Le modèle est défini dans le module produit (product). Vente, Achat, Inventaire et e-commerce font tous référence à product.product. Lorsque vous ajoutez une ligne à un devis ou recevez des stocks, vous travaillez avec des enregistrements product.product.
product.product utilise l'héritage par délégation de product.template. De nombreux champs Odoo sont définis sur le modèle et hérités par la variante. Cela garde les données partagées en un seul endroit tout en permettant des remplacements spécifiques aux variantes.
Champs clés dans le modèle
Voici les champs Odoo les plus importants dans le modèle product.product. Comprendre ceux-ci vous aidera à travailler efficacement avec les variantes de produit.
1. nom
Type : Char. Ce champ stocke le nom de la variante de produit. Il est généralement affiché dans les listes, les formulaires et les documents. Pour les produits simples, il correspond au nom du modèle. Pour les variantes, il peut inclure des valeurs d'attribut (par exemple, "T-Shirt - Bleu / M").
2. product_tmpl_id
Type : Many2one (product.template). Lien entre la variante et son modèle parent. C'est la relation principale. Chaque product.product appartient exactement à un product.template. Utilisez ceci lorsque vous devez hériter d'un modèle dans Odoo ou étendre la logique produit.
3. code_par_defaut
Type : Char. Référence interne ou SKU. Utilisé pour l'identification, la recherche de code-barres et l'intégration avec des systèmes externes. Chaque variante peut avoir son propre code.
4. code-barres
Type : Char. Code-barres (EAN, UPC, etc.). Utilisé pour le scan dans les points de vente, les entrepôts et l'inventaire. Doit être unique parmi les produits lorsqu'il est défini.
5. date_de_création
Type : Datetime. Stocke la date et l'heure de la création de l'enregistrement. Géré automatiquement par Odoo. Utile pour les rapports et l'audit.
6. date_de_modification
Type : Datetime. Stocke la date et l'heure de la dernière modification. Également géré automatiquement. Aide à suivre quand les données ont été mises à jour pour la dernière fois.
7. actif
Type : Boolean. Indicateur de suppression douce. Lorsque Faux, l'enregistrement est archivé et caché des vues par défaut. Les produits ne sont pas physiquement supprimés pour préserver l'historique.
8. type
Type : Sélection. Type de produit : Consommable, Service ou Produit Stockable. Les consommables ne sont pas suivis dans l'inventaire. Les services n'ont pas de stock. Les produits stockables sont suivis en stock. Cela détermine quels modules et flux de travail s'appliquent.
9. categ_id
Type : Many2one (product.category). La catégorie de produit. Utilisé pour les rapports, les règles de tarification et l'organisation du catalogue. Les catégories peuvent avoir une hiérarchie parent-enfant.
10. prix_liste
Type : Flottant. Le prix de vente. Affiché sur les devis et utilisé par défaut lors de l'ajout d'une ligne. Peut être remplacé par client ou par listes de prix.
11. prix_standard
Type : Flottant. Le prix de coût. Utilisé pour l'évaluation des stocks et les calculs de marge. Typiquement mis à jour par des commandes d'achat ou une saisie manuelle.
12. id_uom
Type : Many2one (uom.uom). Unité de mesure pour les ventes et les stocks. Définit comment les quantités sont exprimées (unités, kg, litres, etc.).
13. id_uom_po
Type : Many2one (uom.uom). Unité de mesure pour les achats. Peut différer de id_uom (par exemple, acheter en boîtes, vendre en unités). La conversion est gérée automatiquement.
14. description_vente
Type : Html. Description de vente. Affichée sur les devis, les commandes et les factures. Peut inclure du formatage et des détails sur le produit.
15. description_achat
Type : Html. Description d'achat. Affichée sur les commandes d'achat et les factures fournisseurs. Utilisée pour la communication interne et avec les fournisseurs.
16. vente_ok
Type : Booléen. Peut être vendu. Lorsque Faux, le produit est caché des ventes et du commerce électronique. Utile pour les articles internes ou uniquement achetables.
17. purchase_ok
Type : Booléen. Peut être acheté. Lorsque Faux, le produit est caché des achats. Utile pour les articles fabriqués ou uniquement destinés à la vente.
18. image_1920
Type : Binaire. Image du produit à pleine résolution. Odoo stocke plusieurs tailles (image_512, image_256, etc.) pour l'affichage. Utilisé dans les formulaires, le commerce électronique et les rapports.
19. weight
Type : Flottant. Poids du produit. Utilisé pour les calculs d'expédition et la logistique. L'unité dépend de la configuration de l'entreprise.
20. volume
Type : Flottant. Volume du produit. Utilisé pour l'expédition et la capacité d'entrepôt. Important pour les entreprises ayant des contraintes volumétriques.
21. company_id
Type : Many2one (res.company). Dans les configurations multi-entreprises, cela indique quelle entreprise possède le produit. Affecte la visibilité des enregistrements et le stock.
22. currency_id
Type: Many2one (res.currency). Devise pour list_price et standard_price. Généralement la devise de l'entreprise. Les listes de prix peuvent être converties en d'autres devises.
23. qty_available
Type: Float. Quantité disponible. Calculée à partir des quantités en stock. Lecture seule. Utilisée pour les vérifications de disponibilité et les rapports. Uniquement pour les produits stockables.
24. virtual_available
Type: Float. Quantité prévisionnelle (en main plus entrées moins sorties). Utilisée pour la disponibilité et le réapprovisionnement. Champ calculé en lecture seule.
25. product_template_attribute_value_ids
Type: Many2many. Liens vers les valeurs d'attribut qui définissent cette variante (par exemple, Couleur=Bleu, Taille=M). Utilisé pour la configuration et le filtrage des variantes.
26. sequence
Type: Integer. Ordre d'affichage. Utilisé pour trier les produits dans les listes et les configurateurs. Les valeurs plus basses apparaissent en premier.
27. display_name
Type: Char. Nom d'affichage calculé. Combine le nom avec les attributs de variante. Utilisé dans les menus déroulants many2one et les résultats de recherche. Lecture seule.
28. responsible_id
Type : Many2one (res.users). Personne responsable du produit. Utilisé pour les règles de réapprovisionnement et l'attribution interne. Optionnel.
Comment ce modèle est utilisé dans les flux de travail commerciaux
1. Ventes et Devis
Lorsqu'un commercial crée un devis, il sélectionne un produit.product dans le catalogue. Le list_price, description_sale et uom_id sont transférés à la ligne de commande. Les listes de prix peuvent remplacer le prix. Seuls les produits avec sale_ok=True apparaissent.
2. Achats et Fournisseurs
Les commandes d'achat et les factures fournisseurs font référence à product.product. Le standard_price est mis à jour à partir des coûts d'achat. Les produits avec purchase_ok=True sont disponibles. Le uom_po_id définit comment les quantités sont commandées (par exemple, par boîte).
3. Inventaire et Stock
Les mouvements de stock, les préparations et les quantités utilisent tous product.product. Les champs qty_available et virtual_available déterminent la disponibilité. Seuls les produits stockables sont suivis. Le scan de codes-barres utilise le champ barcode pour une recherche rapide.
4. E-commerce et Site Web
La boutique en ligne affiche les enregistrements product.product. Les variantes avec des attributs différents (taille, couleur) sont présentées comme options. Les images, descriptions et prix des produits proviennent du modèle. Le drapeau sale_ok contrôle la visibilité.
5. Fabrication et MRP
Les nomenclatures font référence à product.product pour les composants et les produits finis. Le champ type détermine si un produit est fabriqué (stockable) ou consommé. Les niveaux de stock déterminent la planification de la production.
Comment les développeurs étendent ce modèle
Les développeurs étendent product.product en utilisant plusieurs modèles. L'héritage de modèle Odoo est le principal mécanisme.
Héritage de Modèle
Utilisez _inherit = 'product.product' pour étendre le modèle. Ajoutez de nouveaux champs Odoo, remplacez des méthodes ou ajoutez des contraintes. Le modèle hérité dans Odoo garde vos modifications dans un module séparé pour des mises à jour faciles. Choisissez product.product lorsque le champ est spécifique à la variante ; utilisez product.template lorsqu'il s'applique à l'ensemble de la famille de produits.
Ajout de Champs
Définissez de nouveaux champs Odoo dans votre modèle hérité. Utilisez le bon type de champ : Char, Many2one, Boolean, Integer, Text, Selection. Considérez si le champ appartient au modèle (partagé) ou à la variante (spécifique). Pour des données spécifiques à la variante comme le SKU ou les remplacements de code-barres, utilisez product.product.
Extensions Python
Remplacez create, write ou unlink pour ajouter de la logique. Utilisez super() pour appeler l'original. Faites attention aux champs calculés et à leurs dépendances. Le modèle product.product a de nombreux champs calculés provenant des modules de stock et de vente.
Odoo Studio
Odoo Studio vous permet d'ajouter des champs sans code. Bon pour des personnalisations rapides. Pour une logique complexe ou des mises à jour, les modules personnalisés sont plus maintenables. Le modèle API dans Odoo (product.product) est entièrement exposé via XML-RPC et JSON-RPC pour les intégrations.
Meilleures pratiques
- Utilisez default_code ou barcode pour le mappage avec des systèmes externes. Gardez-les uniques et cohérents.
- Définissez correctement le type pour chaque produit. Consommable vs Stockable vs Service affecte quels modules et flux de travail s'appliquent.
- Lors de la création d'intégrations API, utilisez product.product pour les lignes de commande et les transactions. Utilisez product.template pour les opérations au niveau du catalogue.
- Pour les champs personnalisés, utilisez le préfixe
x_ou un préfixe de module pour éviter les conflits avec les futures versions d'Odoo. - Considérez product.template lors de l'ajout de champs qui s'appliquent à toutes les variantes (par exemple, marque, catégorie). Utilisez product.product pour les données spécifiques à la variante (par exemple, code-barres spécifique à la variante).
Erreurs courantes
- Hériter de product.template lorsque vous avez besoin d'une logique spécifique à la variante. Utilisez product.product pour le comportement par variante.
- Créer des enregistrements product.product manuellement au lieu de passer par le modèle. Pour les produits variant, créez-les via le configurateur de produits.
- Oublier de définir sale_ok ou purchase_ok. Les produits sont cachés des ventes/achats par défaut dans certaines configurations.
- Surcharger des méthodes de base sans appeler super(). Cela peut casser d'autres modules ou des mises à jour futures.
- Utiliser product.product dans des domaines où product.template serait plus approprié (par exemple, filtrer par catégorie sur le modèle).
Conclusion
Le modèle product.product est central à l'architecture produit d'Odoo. Il représente les articles réellement vendables et achetables. Comprendre ses champs et comment il se rapporte à product.template vous aidera à configurer, personnaliser et intégrer Odoo efficacement.
Que vous soyez un consultant fonctionnel cartographiant des catalogues de produits ou un développeur construisant des modules personnalisés, une bonne compréhension de product.product vous fera gagner du temps et évitera des erreurs.
Besoin d'aide pour votre implémentation Odoo ?
Dasolo aide les entreprises à mettre en œuvre, personnaliser et optimiser Odoo. Nous nous spécialisons dans les intégrations API et le développement Odoo. Notre équipe a une grande expérience de l'architecture de données Odoo et de modèles comme product.product.
Si vous avez besoin d'aide pour votre mise en œuvre Odoo, vos modules personnalisés ou vos intégrations, nous sommes là pour vous aider. Réservez une démo pour discuter de votre projet.