Introduzione
In Odoo i modelli definiscono la struttura dei dati e come vengono conservati nel database: ogni informazione operativa — dall'ordine di vendita alla fattura fino alla scrittura contabile — risiede all'interno di un modello ben definito.
Conoscere i modelli Odoo è fondamentale sia per chi configura i processi sia per chi sviluppa: è la base dell'architettura dati, dove si definiscono campi, relazioni e regole di business.
Questo articolo si concentra su uno dei modelli chiave della contabilità in Odoo: account.move.line. Se devi creare report personalizzati, collegare sistemi esterni o gestire riconciliazioni, incontrerai spesso questo modello.
Che cos'è il modello account.move.line
Il modello account.move.line rappresenta le singole righe di una scrittura contabile: ogni riga è un importo in Dare o Avere. Le righe di una stessa scrittura devono quadrare: la somma dei DARE deve essere uguale alla somma degli AVERE.
Nel flusso dell'app Contabilità, account.move.line è figlio di account.move, che rappresenta la registrazione completa (fatture, note, estratti conto, scritture manuali). Una registrazione può contenere una o più righe.
La definizione base del modello sta nel modulo account, mentre altri moduli lo estendono tramite l'ereditarietà dei modelli Odoo: il modulo Vendite aggiunge dettagli delle righe fattura, Acquisti gestisce righe di fornitore, l'analitica inserisce ripartizioni. Così ogni app arricchisce il modello senza ricrearne la struttura centrale.
Campi principali del modello
Di seguito trovi i campi più rilevanti di account.move.line: comprenderli ti aiuterà a lavorare correttamente con scritture contabili e report finanziari.
1. name
Tipo: Char. Etichetta o descrizione della riga, visibile nelle viste della scrittura e nei documenti. Sulle fatture deriva spesso dal nome del prodotto o da una descrizione personalizzata.
2. move_id
Tipo: Many2one (account.move). Collega la riga alla scrittura padre: ogni riga appartiene a un solo move. È la relazione primaria del modello.
3. account_id
Tipo: Many2one (account.account). L'account di destinazione della riga. Campo obbligatorio: deve essere un conto operativo (non di sola visualizzazione o chiuso). Serve per la rendicontazione e i raggruppamenti del piano dei conti.
4. debit
Tipo: Float. Importo in Dare. Default 0.0. Una riga ha tipicamente o il valore in debit o in credit, non entrambi. I DARE tipicamente aumentano attività e costi.
5. credit
Tipo: Float. Importo in Avere. Default 0.0. Gli AVERE aumentano passività, patrimonio e ricavi. In una scrittura la somma dei dare deve uguagliare la somma degli avere.
6. balance
Tipo: Float (calcolato). Differenza debit minus credit: rappresenta l'effetto netto della riga — positivo per i DARE, negativo per gli AVERE — utile nei report e nelle riconciliazioni.
7. partner_id
Tipo: Many2one (res.partner). Cliente, fornitore o altra controparte collegata alla riga. Necessario per scadenziari, aging e riconciliazione delle partite aperte.
8. date
Tipo: Date. Data di registrazione della riga, di norma ereditata dalla move padre. Influisce sulle chiusure periodiche, sui report e sugli scadenzari.
9. date_maturity
Tipo: Date. Data di scadenza del pagamento. Rilevante per crediti e debiti, usata negli aging report e per pianificare pagamenti.
10. currency_id
Tipo: Many2one (res.currency). Valuta della riga; può differire dalla valuta societaria per scritture in valuta estera.
11. amount_currency
Tipo: Float. Importo espresso nella valuta della riga. Insieme a currency_id abilita la contabilità multi-valuta.
12. quantity
Tipo: Float. Quantità opzionale, utile per righe legate a prodotti (fatture, note di credito) per report basati sui volumi e calcoli unitari.
13. product_id
Tipo: Many2one (product.product). Il prodotto associato alla riga quando proviene da ordini di vendita/acquisto o da righe fattura.
14. product_uom_id
Tipo: Many2one (uom.uom). Unità di misura della quantità; necessaria per una corretta visualizzazione e conversione unità.
15. price_unit
Tipo: Float. Prezzo unitario: usato insieme alla quantità per calcolare gli importi delle righe di fattura o nota.
16. tax_ids
Tipo: Many2many (account.tax). Imposte applicate alla riga; al momento della registrazione Odoo può generare righe dedicate per gli importi IVA.
17. tax_line_id
Tipo: Many2one (account.tax). Per le righe imposta indica il tax che ha generato quella riga, distinguendola dalle righe contabili ordinarie.
18. analytic_account_id
Tipo: Many2one (account.analytic.account). Conto analitico per tracciare costi e ricavi su progetto, reparto o centro di costo quando l'analitica è attiva.
19. analytic_distribution
Tipo: Json o Text. Ripartizione analitica su più conti; nelle versioni più recenti può sostituire il singolo analytic_account_id quando si usano piani di distribuzione.
20. ref
Tipo: Char. Riferimento esterno o memo, spesso ereditato dalla move; utile per abbinamenti e per comparire nei report.
21. narration
Tipo: Text. Nota interna ereditata dalla move; non viene stampata sui documenti verso i clienti a meno di personalizzazioni.
22. journal_id
Tipo: Many2one (account.journal). Il giornale di appartenenza della registrazione; utile per filtrare e raggruppare i movimenti.
23. company_id
Tipo: Many2one (res.company). La compagnia a cui appartiene la riga: nei setup multi-company la visibilità e la consolidazione dipendono da questo campo.
24. reconciled
Tipo: Boolean. Indica se la riga è stata completamente riconciliata; usato per trovare rapidamente le partite aperte.
25. full_reconcile_id
Tipo: Many2one (account.full.reconcile). Collega tutte le righe riconciliate insieme, permettendo di ricostruire i gruppi di riconciliazione.
26. payment_id
Tipo: Many2one (account.payment). Per le righe collegate a pagamenti indica il record pagamento, utile per associare fatture e incassi.
27. statement_id
Tipo: Many2one (account.bank.statement). Per righe provenienti da estratti conto bancari collega lo statement; usato in fase di riconciliazione bancaria.
28. statement_line_id
Tipo: Many2one (account.bank.statement.line). Collega la riga alla specifica linea dell'estratto conto quando si effettua il matching con le transazioni bancarie.
29. display_type
Tipo: Selection. Valori come 'line_section' o 'line_note' per sezionare la scrittura o aggiungere note: queste righe sono puramente informative e non hanno debit/credit.
30. create_date
Tipo: Datetime. Timestamp di creazione del record, gestito automaticamente da Odoo; utile per audit e tracciamento.
31. write_date
Tipo: Datetime. Timestamp dell'ultima modifica, anch'esso gestito automaticamente e utile per storicizzare le variazioni.
Come questo modello viene usato nei processi aziendali
1. Fatturazione clienti
Alla conferma di una fattura, Odoo genera le righe in account.move.line: i ricavi vengono registrati sugli account di vendita, le partite a cliente sugli account clienti, e per ogni imposta viene creata una riga dedicata. partner_id lega la riga al cliente per aging e riconciliazione.
2. Fatture fornitori
Le fatture fornitori generano righe per costi, IVA detraibile e debiti verso fornitori: la struttura è analoga a quella delle fatture clienti ma con tipi di conto differenti.
3. Riconciliazione bancaria
Le linee dell'estratto conto si abbinano alle righe contabili tramite statement_line_id; in fase di riconciliazione Odoo collega le righe (full_reconcile_id) e marca reconciled = True.
4. Registrazioni manuali
Gli utenti possono creare scritture manuali composte da più righe: ogni riga ha account, importo in dare o avere e partner opzionale. Odoo richiede che le scritture quadrare prima della registrazione definitiva.
5. Report analitici e di costo
Con l'analitica attiva, le righe portano analytic_account_id o una distribuzione analitica; i report possono raggruppare per conto analitico per mostrare costi e ricavi per progetto, ufficio o altra dimensione.
Come gli sviluppatori estendono questo modello
Gli sviluppatori estendono account.move.line con vari approcci, sfruttando principalmente l'ereditarietà dei modelli di Odoo.
Ereditarietà del modello
Dichiarando _inherit = 'account.move.line' in un modulo si estende il modello: si possono aggiungere campi, sovrascrivere metodi o aggiungere vincoli. L'ereditarietà mantiene le modifiche nel modulo dedicato facilitando gli aggiornamenti.
Aggiunta di campi
Definisci nuovi campi nel modello ereditato usando il tipo corretto (Char, Many2one, Boolean, Integer, Text, Selection). Valuta se rendere i campi dipendenti dalla company in ambienti multi-company e presta attenzione alle dipendenze per i campi calcolati.
Estensioni in Python
Sovrascrivi i metodi create, write o unlink per introdurre logica custom; chiama sempre super() per preservare il comportamento di base. Evita di violare la regola che assicura che debiti e crediti si bilancino.
Odoo Studio
Odoo Studio permette di aggiungere campi su account.move.line senza codice, utile per personalizzazioni rapide come etichette o tag. Per logiche complesse e regole di riconciliazione è però preferibile sviluppare moduli dedicati più sostenibili nel tempo.
Buone pratiche
- Non creare o modificare righe di movimento bypassando la move: usa l'API del move (es. line_ids) così Odoo mantiene la coerenza e applica i controlli necessari.
- Negli estratti e nei report filtra sempre per move_id.state = 'posted' per escludere bozze o registrazioni annullate.
- Usa account_id con il tipo di conto corretto (receivable, payable, ecc.) per garantire comportamento corretto negli aging e nella riconciliazione.
- Se integri tramite API, crea prima il move e poi le righe; assicurati che debiti e crediti siano bilanciati prima di postare la registrazione.
- Per campi personalizzati, usa il prefisso
x_o un prefisso del modulo per ridurre il rischio di conflitti con future versioni di Odoo.
Errori comuni
- Impostare contemporaneamente debit e credit sulla stessa riga. Ogni riga dovrebbe avere o debit o credit, non entrambi.
- Creare movimenti sbilanciati. La somma dei debiti deve sempre uguagliare la somma degli averi: Odoo blocca la registrazione in caso contrario.
- Modificare righe già registrate senza utilizzare gli strumenti di rettifica o storno. Le scritture postate vanno rettificate con movimenti compensativi, non alterando direttamente le righe.
- Dimenticare partner_id sulle righe di crediti e debiti. Senza partner le scadenze e la riconciliazione possono risultare incomplete o inaccurate.
- Sovrascrivere metodi core senza chiamare
super(). Questo può compromettere il funzionamento della riconciliazione, dei lock o di altri moduli collegati.
Conclusione
Il modello account.move.line è il cuore della contabilità in Odoo: registra ogni Dare e Avere di fatture, note e scritture. Conoscere i suoi campi e come viene esteso ti permette di configurare, personalizzare e integrare Odoo con più efficacia.
Sia che tu sia un consulente funzionale che mappa i processi contabili, sia che tu sia uno sviluppatore che costruisce report o integrazioni, padroneggiare account.move.line riduce tempi e rischi di errore.
Hai bisogno di aiuto per la tua implementazione Odoo?
Dasolo supporta le aziende nell'implementazione, personalizzazione e ottimizzazione di Odoo. Siamo specializzati in integrazioni API e sviluppo su misura, con esperienza approfondita nell'architettura dati e nei modelli come account.move.line.
Se ti serve supporto per la tua implementazione Odoo, moduli custom o integrazioni, possiamo aiutarti. Prenota una demo per parlare del tuo progetto.