Introduction
Dans Odoo, les modèles déterminent la manière dont les informations sont organisées et gardées en base de données. Tout élément métier — devis, facture, écriture comptable — repose sur un modèle qui structure ses champs et ses relations.
Maîtriser les modèles Odoo est indispensable aussi bien pour les développeurs que pour les consultants fonctionnels. Ce sont eux qui dictent les champs disponibles, les liens entre objets et la logique métier appliquée aux données.
Cet article se concentre sur un modèle fondamental de la comptabilité Odoo : account.move.line. Que vous construisiez des rapports, intégriez des flux externes ou paramétriez des rapprochements, vous serez amené à manipuler ce modèle.
Qu'est-ce que le modèle account.move.line
Le modèle account.move.line correspond aux lignes d'écritures comptables. Chaque enregistrement reflète un débit ou un crédit d'une écriture : ensemble, les lignes d'une écriture doivent s'équilibrer (total débits = total crédits).
Ce modèle appartient au module Comptabilité et est l'enfant de account.move, qui représente l'écriture globale (factures, avoirs, relevés bancaires, écritures manuelles). Une écriture contient toujours une ou plusieurs lignes.
La définition de base se trouve dans le module account ; les autres modules étendent ce socle via l'héritage Odoo. Par exemple, la vente complète les lignes avec des informations produits, les achats ajoutent des données de facture fournisseur, et l'analytique injecte ses répartitions — sans dupliquer la structure principale.
Champs clés du modèle
Voici les champs les plus utiles du modèle account.move.line. Les connaître facilite la lecture des écritures et la conception de traitements ou rapports comptables.
1. name
Type : Char. Sert d'intitulé ou de description pour la ligne. Champ souvent visible dans les vues d'écriture et les rapports. Pour une facture, il reprend généralement le nom du produit ou un libellé personnalisé.
2. move_id
Type : Many2one (account.move). Relie la ligne à son écriture parente. Chaque ligne appartient à une unique écriture — c'est la relation centrale pour naviguer entre en-tête et lignes.
3. account_id
Type : Many2one (account.account). Compte général auquel la ligne est postée. Champ obligatoire : il doit pointer vers un compte opérationnel (pas un compte de type 'view' ni un compte clôturé). Indispensable pour les états et regroupements comptables.
4. debit
Type : Float. Montant au débit. Valeur par défaut 0.0. Sur une ligne donnée, soit debit soit credit est renseigné. Les débits augmentent les comptes d'actif et de charge.
5. credit
Type : Float. Montant au crédit. Valeur par défaut 0.0. Les crédits augmentent les passifs, les fonds propres et les produits. La somme des débits doit correspondre à la somme des crédits d'une écriture.
6. balance
Type : Float. Champ calculé : debit moins credit. Reflète l'effet net de la ligne (positif pour les débits, négatif pour les crédits). Utile pour rapports et rapprochements.
7. partner_id
Type : Many2one (res.partner). Le client, fournisseur ou autre tiers lié à la ligne. Essentiel pour le suivi des créances/dettes, les états d'échéance et la réconciliation.
8. date
Type : Date. Date effective de la ligne, généralement héritée de l'écriture parente. Utilisée pour la clôture, les rapports et le calcul des échéances.
9. date_maturity
Type : Date. Date d'échéance du règlement. Pertinent pour les comptes clients/fournisseurs, les états d'âge et la planification des paiements.
10. currency_id
Type : Many2one (res.currency). Monnaie de la ligne. Peut différer de la monnaie de la société pour gérer les écritures multi-devises.
11. amount_currency
Type : Float. Montant exprimé dans la devise de la ligne. Associé à currency_id, il permet la comptabilité multi-devises et les conversions.
12. quantity
Type : Float. Quantité optionnelle, surtout utilisée pour les lignes produits (factures, factures fournisseurs). Permet des rapports basés sur les unités et le calcul des prix unitaires.
13. product_id
Type : Many2one (product.product). Produit lié à la ligne. Renseigné quand la ligne provient d'une commande de vente, d'achat ou d'une ligne de facture.
14. product_uom_id
Type : Many2one (uom.uom). Unité de mesure associée à la quantité. Utilisée pour l'affichage cohérent et les conversions d'unités.
15. price_unit
Type : Float. Prix unitaire. Calculé avec la quantité pour déterminer les montants sur factures et avoirs.
16. tax_ids
Type : Many2many (account.tax). Taxes applicables à la ligne. Lors du lettrage, Odoo crée des lignes distinctes pour les montants de taxes, nécessaires aux déclarations TVA.
17. tax_line_id
Type : Many2one (account.tax). Pour les lignes de taxe, référence la taxe à l'origine de la ligne. Permet de distinguer les lignes fiscales des lignes comptables standard.
18. analytic_account_id
Type : Many2one (account.analytic.account). Compte analytique destiné au suivi des coûts et recettes par projet ou centre de coûts. Utilisé quand l'analytique est activé.
19. analytic_distribution
Type : Json ou Texte. Stocke la ventilation analytique sur plusieurs comptes. Dans les versions récentes, remplace parfois analytic_account_id pour gérer des répartitions complexes.
20. ref
Type : Char. Référence externe ou mémo, souvent héritée de l'écriture parente. Affichée dans les rapports et utile pour faire des correspondances lors du rapprochement.
21. narration
Type : Text. Note interne liée à l'écriture. En général, elle n'apparaît pas sur les documents destinés au client sans configuration spécifique.
22. journal_id
Type : Many2one (account.journal). Journal de l'écriture parente. Sert aux filtres et aux états par journal.
23. company_id
Type : Many2one (res.company). Société à laquelle appartient la ligne. En multi-sociétés, chaque ligne est rattachée à une seule société, ce qui impacte visibilité et consolidation.
24. reconciled
Type : Boolean. Indique si la ligne est complètement rapprochée. Pratique pour isoler les éléments à rapprocher dans l'interface de rapprochement bancaire.
25. full_reconcile_id
Type : Many2one (account.full.reconcile). Regroupe les lignes qui ont été rapprochées ensemble. Permet de suivre les ensembles de transactions rapprochées.
26. payment_id
Type : Many2one (account.payment). Pour les lignes liées à un paiement, référence l'enregistrement paiement correspondant. Utilisé au moment du rapprochement facture-paiement.
27. statement_id
Type : Many2one (account.bank.statement). Pour les lignes issues d'un relevé bancaire, référence le relevé. Utile lors du rapprochement bancaire.
28. statement_line_id
Type : Many2one (account.bank.statement.line). Lie la ligne à la ligne exacte du relevé bancaire. Sert lors de la correspondance entre écritures et mouvements bancaires.
29. display_type
Type : Selection. Valeurs comme 'line_section' ou 'line_note' pour insérer des sections ou notes visuelles dans une écriture. Ces lignes n'ont ni débit ni crédit et servent uniquement à l'affichage.
30. create_date
Type : Datetime. Date et heure de création de l'enregistrement, gérée automatiquement par Odoo. Utile pour l'audit.
31. write_date
Type : Datetime. Date et heure de la dernière modification, également gérée automatiquement. Permet de tracer les évolutions d'un enregistrement.
Usage du modèle dans les processus métier
1. Facturation client
À la validation d'une facture client, Odoo génère des lignes account.move.line : les produits ou services créditent les comptes de produit, la contrepartie va sur le compte client et des lignes TVA sont créées. Le partner_id relie les montants au client pour le lettrage et le suivi des échéances.
2. Factures fournisseurs
Les factures fournisseurs produisent des lignes pour les charges, la TVA déductible et les comptes fournisseurs. La logique est similaire à celle des factures clients mais avec des types de comptes inversés (charges vs produits).
3. Rapprochement bancaire
Les lignes provenant des relevés bancaires sont appairées avec les écritures via statement_line_id. Lors du rapprochement, Odoo groupe les lignes et renseigne full_reconcile_id ; le champ reconciled passe à True.
4. Écritures manuelles
Les utilisateurs peuvent saisir des écritures manuelles composées de plusieurs lignes. Chaque ligne nécessite un compte et un montant en débit ou crédit ; Odoo empêche la validation si l'écriture n'est pas équilibrée.
5. Reporting analytique et suivi des coûts
Avec l'analytique activée, les lignes transportent un account analytique ou une distribution. Les rapports peuvent alors ventiler coûts et revenus par projet, service ou autre dimension choisie.
Comment les développeurs étendent ce modèle
Les développeurs enrichissent account.move.line via plusieurs approches — l'héritage de modèle étant la plus courante.
Héritage de modèle
Déclarez _inherit = 'account.move.line' pour étendre le modèle : ajouter des champs, redéfinir des méthodes ou ajouter des contraintes. Gardez vos modifications dans un module séparé pour faciliter les mises à jour.
Ajout de champs
Définissez de nouveaux champs dans votre modèle hérité en choisissant le type approprié (Char, Many2one, Boolean, Integer, Text, Selection). Prévoyez la dépendance société pour les champs sensitive multi-company et réfléchissez aux champs calculés et à leurs dépendances.
Extensions Python
Surchargez create, write ou unlink pour injecter de la logique métier, en appelant systématiquement super(). Évitez de violer l'invariant débit = crédit. Ces méthodes sont aussi le point d'entrée pour les intégrations externes via l'API.
Odoo Studio
Odoo Studio permet d'ajouter rapidement des champs sans coder, idéal pour des personnalisations légères (étiquettes, tags). Pour des règles complexes de rapprochement ou des traitements automatisés, préférez un module sur mesure.
Bonnes pratiques
- Ne créez ni ne modifiez des lignes d'écriture en contournant l'écriture parente. Utilisez l'API du move (par exemple line_ids) pour que Odoo applique toutes les vérifications et maintienne la cohérence des données.
- Pour les rapports, filtrez sur move_id.state = 'posted' afin d'exclure les brouillons et écritures annulées.
- Assurez-vous d'utiliser account_id avec le bon type de compte (receivable, payable, etc.) pour que le lettrage et les états d'échéance fonctionnent correctement.
- Lors d'une intégration via API, créez d'abord l'écriture (move) puis ajoutez ses lignes. Vérifiez que débits et crédits s'équilibrent avant de poster l'écriture.
- Pour les champs personnalisés, préfixez-les par
x_ou le préfixe de votre module afin de minimiser les risques de collision avec de futures versions d'Odoo.
Erreurs fréquentes
- Définir à la fois debit et credit sur une même ligne. Chaque ligne doit être soit débitée soit créditée, jamais les deux en même temps.
- Créer des écritures non équilibrées. La validation exige que la somme des débits corresponde à la somme des crédits.
- Modifier directement des lignes déjà comptabilisées au lieu de passer par des écritures d'annulation ou des ajustements. Les écritures postées doivent être corrigées par des mouvements complémentaires, pas par édition directe.
- Oublier d'indiquer partner_id sur les lignes clients/fournisseurs. Cela empêche un lettrage correct et fausse les états d'âge.
- Surcharger des méthodes cœur sans appeler
super(). Cela peut casser le rapprochement, les verrous d'enregistrement ou impacter d'autres modules fonctionnels.
Conclusion
Le modèle account.move.line est au cœur de la comptabilité Odoo : il enregistre chaque débit et crédit des factures, relevés et écritures. Bien connaître ses champs et son extension par d'autres modules vous aidera à paramétrer, personnaliser et intégrer Odoo en toute sécurité.
Que vous soyez consultant fonctionnel en charge de modéliser des processus ou développeur qui produit des rapports et des intégrations, une bonne maîtrise d'account.move.line vous fera gagner du temps et évitera des erreurs coûteuses.
Besoin d'aide pour votre implémentation Odoo ?
Dasolo accompagne les entreprises dans l'implémentation, la personnalisation et l'optimisation d'Odoo. Nous sommes spécialisés en intégrations API et développement Odoo, avec une expertise approfondie de l'architecture de données et des modèles comme account.move.line.
Si vous avez besoin d'aide pour votre implémentation Odoo, la création de modules personnalisés ou des intégrations, notre équipe est à votre disposition. Demandez une démo pour discuter de votre projet.