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 aux factures en passant par les contacts, 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, les relations et la logique commerciale.
Cet article se concentre sur l'un des modèles les plus importants du module Ventes : sale.order.line. Que vous construisiez des modules personnalisés, intégriez des systèmes externes ou configuriez des flux de travail de tarification, vous travaillerez avec ce modèle.
Qu'est-ce que le modèle sale.order.line
Le modèle sale.order.line représente des lignes d'articles individuelles sur un devis ou une commande de vente dans Odoo. Chaque ligne correspond généralement à un produit, avec des informations sur la quantité, le prix et la taxe.
Ce modèle dans Odoo est utilisé par le module Ventes (sale). Il hérite de analytic.mixin pour le suivi des coûts de projet et l'intégration des feuilles de temps. Lorsque vous ajoutez un produit à un devis, vous créez un enregistrement sale.order.line.
Le modèle est défini dans le module de vente. D'autres modules l'étendent par le biais de l'héritage de modèle Odoo. Par exemple, sale_stock ajoute des champs liés à la livraison. sale_margin ajoute des calculs de marge. Chaque module ajoute ce dont il a besoin sans dupliquer la structure de base.
Champs clés dans le modèle
Voici les champs Odoo les plus importants dans le modèle sale.order.line. Comprendre ceux-ci vous aidera à travailler efficacement avec les devis et les commandes de vente.
1. order_id
Type : Many2one (sale.order). Requis. Référence à la commande de vente parente. Ce champ lie chaque ligne à sa parente. Les lignes sont supprimées lorsque la commande est supprimée (cascade).
2. sequence
Type : Integer. Par défaut 10. Contrôle l'ordre d'affichage des lignes sur la commande. Utilisé pour trier les sections, les notes et les lignes de produits.
3. company_id
Type : Many2one (res.company). Lié à order_id. Utilisé pour les règles multi-entreprises et le contrôle d'accès.
4. currency_id
Type : Many2one (res.currency). Lié à order_id. Utilisé pour tous les champs monétaires sur la ligne. Assure la bonne devise pour la tarification.
5. order_partner_id
Type : Many2one (res.partner). Lié à order_id. Le client. Utilisé pour la liste de prix et les règles fiscales.
6. salesman_id
Type : Many2one (res.users). Lié à order_id. Le vendeur. Utilisé pour les commissions et les rapports.
7. state
Type : Sélection. Lié à order_id. Statut de la commande (brouillon, envoyé, vente, terminé, annulé). Détermine quels champs sont modifiables.
8. display_type
Type : Sélection. Valeurs : line_section ou line_note. Lorsqu'il est défini, la ligne est un en-tête de section ou une note, et non une ligne de produit. Les champs de produit sont vides.
9. is_downpayment
Type : Booléen. Indique si la ligne est un acompte. Les acomptes sont facturés séparément.
10. is_expense
Type : Booléen. Vrai lorsque la ligne provient d'une dépense ou d'une facture fournisseur. Utilisé pour le suivi des coûts de projet.
11. product_id
Type: Many2one (product.product). Le produit vendu. Le domaine est restreint aux produits vendables. Requis pour les lignes de produit.
12. product_template_id
Type: Many2one (product.template). Calculé à partir de product_id. Utilisé par le configurateur de produit pour la sélection de variantes.
13. name
Type: Text. La description de la ligne. Calculée à partir des attributs de produit et personnalisés. Inclut les détails de variante le cas échéant.
14. product_uom_qty
Type: Float. Requis. La quantité commandée. Par défaut 1.0. Peut être déterminée par l'emballage.
15. product_uom
Type: Many2one (uom.uom). Unité de mesure. Par défaut à partir du produit. Utilisé pour la quantité et le prix.
16. tax_id
Type: Many2many (account.tax). Taxes appliquées à la ligne. Calculées à partir du produit et de la position fiscale.
17. prix_unitaire
Type : Flottant. Requis. Prix unitaire par produit_uom. Calculé à partir de la liste de prix ou du produit. Peut être modifié manuellement.
18. remise
Type : Flottant. Pourcentage de remise. Appliqué au prix_unitaire avant taxe.
19. prix_sous_total
Type : Monétaire. Sous-total avant taxe. Calculé à partir de la quantité, du prix unitaire et de la remise.
20. prix_taxe
Type : Flottant. Montant total de la taxe. Calculé à partir du prix_sous_total et de tax_id.
21. prix_total
Type : Monétaire. Total incluant la taxe. Le montant principal pour la facturation.
22. produit_emballage_id
Type : Many2one (produit.emballage). Emballage optionnel (par exemple, boîte de 12). Lorsqu'il est défini, la quantité peut être déterminée par l'emballage.
23. client_piste
Type: Flottant. Délai en jours. Jours entre la confirmation de commande et l'expédition. Utilisé pour le calcul de la date de livraison.
24. qty_livré
Type: Flottant. Quantité livrée. Mise à jour par les mouvements de stock ou manuellement. Utilisé pour la facturation partielle.
25. qty_facturé
Type: Flottant. Quantité déjà facturée. Calculée à partir des lignes de facture.
26. qty_à_facturer
Type: Flottant. Quantité restante à facturer. Calculée à partir de qty_livré et qty_facturé.
27. statut_facture
Type: Sélection. Valeurs: vente additionnelle, facturé, à facturer, non. Indique l'état de facturation pour la ligne.
28. lignes_facture
Type: Plusieurs à plusieurs (account.move.line). Lien vers les lignes de facture créées à partir de cette ligne de vente. Utilisé pour la traçabilité.
29. date_de_création
Type : Datetime. Quand l'enregistrement a été créé. Géré automatiquement par Odoo.
30. date_de_modification
Type : Datetime. Quand l'enregistrement a été modifié pour la dernière fois. Utilisé pour l'audit.
Comment ce modèle est utilisé dans les flux de travail commerciaux
1. Devis et Commande de Vente
Lorsqu'un commercial crée un devis, il ajoute des produits. Chaque produit devient une sale.order.line. Les lignes montrent la quantité, le prix, la remise et le total. La commande est confirmée lorsque le client accepte.
2. Liste de Prix et Remises
Les listes de prix sont appliquées par ligne. Les champs price_unit et discount sont calculés à partir des règles de la liste de prix. Les remises sur volume ou les prix spécifiques aux clients sont gérés ici.
3. Livraison et Facturation
Lorsque le stock est livré, qty_delivered est mis à jour. La facturation peut se faire par livraison ou en une seule fois. Le champ invoice_status guide l'utilisateur sur ce qu'il reste à facturer.
4. Projet et Services
Pour les produits de service, les lignes sont liées aux tâches de projet et aux feuilles de temps. L'héritage analytic.mixin permet le suivi des coûts par projet.
5. E-commerce et Portail
Les visiteurs du site ajoutent des produits au panier. Chaque ligne de panier devient une vente.commande.ligne lorsque la commande est créée. Le configurateur de produit utilise product_template_id et des attributs personnalisés.
Comment les développeurs étendent ce modèle
Les développeurs étendent vente.commande.ligne en utilisant plusieurs modèles. L'héritage de modèle Odoo est le principal mécanisme.
Héritage de Modèle
Utilisez _inherit = 'sale.order.line' pour étendre le modèle. Ajoutez de nouveaux champs, remplacez des méthodes ou ajoutez des contraintes. Le modèle hérité dans Odoo conserve vos modifications dans un module séparé pour des mises à jour faciles.
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, Sélection. Considérez les champs dépendants de l'entreprise pour les multi-entreprises.
Extensions Python
Remplacez _compute_price_unit, _compute_price_subtotal, ou créez/écrivez pour ajouter de la logique. Utilisez super() pour appeler l'original. Faites attention aux champs calculés et à leurs dépendances.
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 faciles à maintenir.
Meilleures pratiques
- Utilisez display_type pour les sections et les notes au lieu de fausses lignes de produit. Cela garde les rapports clairs.
- Lors de la création d'intégrations API, créez des lignes via l'order_id. Utilisez le champ order_line_ids sur sale.order avec le format de commande correct.
- Respectez les contraintes SQL. Une ligne de produit doit avoir product_id et product_uom. Une section ou une note doit avoir display_type.
- Pour les prix personnalisés, utilisez les règles de liste de prix lorsque cela est possible. Surchargez les méthodes de calcul uniquement lorsque vous avez besoin d'une logique non prise en charge par les listes de prix.
- 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.
Erreurs courantes
- Création de lignes sans order_id. Le champ est requis. Créez toujours des lignes dans le contexte d'une commande.
- Confondre product_id et product_template_id. Pour les lignes de produit, définissez product_id. Pour les flux de configurateur, utilisez product_template_id pour sélectionner une variante.
- Modification de price_unit ou de discount après facturation. Une fois que qty_invoiced est supérieur à zéro, les changements de prix peuvent causer des incohérences.
- Surcharge des méthodes de base sans appeler super(). Cela peut casser d'autres modules ou des mises à jour futures.
- Oublier de définir display_type pour les lignes de section ou de note. Sans cela, la ligne est traitée comme une ligne de produit et échouera à la validation.
Conclusion
Le modèle sale.order.line est central pour Odoo Sales. Il stocke chaque ligne de produit sur les devis et les commandes. Comprendre ses champs et comment les modules l'étendent vous aidera à configurer, personnaliser et intégrer Odoo efficacement.
Que vous soyez un consultant fonctionnel cartographiant des processus métier ou un développeur construisant des modules personnalisés, une bonne compréhension de sale.order.line 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 sommes spécialisés dans les intégrations API et le développement Odoo. Notre équipe a une grande expérience de l'architecture des données Odoo et des modèles comme sale.order.line.
Si vous avez besoin d'aide pour votre implémentation 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.