Introduzione
In Odoo, i modelli stabiliscono la forma dei dati: quali campi esistono, come si collegano e come vengono memorizzati nel database. Ogni elemento operativo — dall'ordine di vendita alla fattura fino alla scrittura contabile — è incarnato in un modello.
Capire la logica dei modelli è fondamentale sia per chi configura i processi aziendali sia per chi sviluppa: sono il progetto su cui poggia tutta l'architettura dati di Odoo, definendo campi, relazioni e regole di business.
Questo articolo si concentra su uno dei modelli più critici per la contabilità in Odoo: account.move. Se devi creare report personalizzati, collegare sistemi esterni o configurare il ciclo di fatturazione, lavorerai spesso con questo modello.
Cos'è il modello account.move
Il modello account.move rappresenta le registrazioni di prima nota. Dalla versione 13 in poi Odoo ha unificato più entità (fatture clienti, note di credito, fatture fornitori e scritture manuali) in un unico modello: tutto viene gestito come record di account.move.
In pratica, il modulo Accounting usa account.move come contenitore principale: le righe contabili sono memorizzate in account.move.line, figlie del movimento. Ogni fattura, nota o registrazione è quindi un account.move con una o più righe associate.
La definizione base si trova nel modulo account, mentre altri moduli estendono il modello tramite ereditarietà. Per esempio, il modulo Sales aggiunge la logica per generare fatture dalle vendite e Purchase per le fatture fornitori, senza replicare la struttura centrale.
Campi chiave del modello
Di seguito i campi più rilevanti di account.move: conoscerli ti aiuta a maneggiare correttamente fatture, registrazioni e riconciliazioni.
1. name
Tipo: Char. Memorizza il numero o il nome del movimento, in genere generato dalla sequenza del giornale. È il riferimento mostrato nelle liste e sui documenti stampati.
2. move_type
Tipo: Selection. Indica la natura del movimento: entry (scrittura manuale), out_invoice (fattura cliente), out_refund (nota di credito cliente), in_invoice (fattura fornitore), in_refund (nota di credito fornitore). Questo campo determina viste e workflow applicabili.
3. state
Tipo: Selection. Stato del processo: draft, posted o cancel. I movimenti in draft sono modificabili; quelli posted sono bloccati e impattano il libro mastro; cancel annulla l'effetto.
4. date
Tipo: Date. Data del documento, usata per reporting, scadenze e chiusure. Nelle fatture corrisponde spesso alla data fattura.
5. journal_id
Tipo: Many2one (account.journal). Il giornale di appartenenza: Vendite, Acquisti, Banca, Varie. Il giornale definisce la sequenza e gli account predefiniti.
6. company_id
Tipo: Many2one (res.company). In configurazioni multi-company indica a quale società appartiene il movimento, influenzando visibilità e consolidamento.
7. partner_id
Tipo: Many2one (res.partner). Cliente o fornitore collegato al movimento. Obbligatorio per fatture e bollette; fondamentale per aging, riconciliazioni e righe di testata.
8. currency_id
Tipo: Many2one (res.currency). Valuta del movimento: gli importi sono espressi in questa valuta; per reporting multi-valuta si riconcilia con la valuta della società.
9. amount_total
Tipo: Monetary. Totale complessivo del movimento: per le fatture rappresenta l'importo da pagare. È calcolato dalle righe.
10. amount_residual
Tipo: Monetary. Importo non ancora saldato: per fatture pagate è zero. Usato per aging e flussi di pagamento.
11. payment_state
Tipo: Selection. Stato di pagamento: not_paid, in_payment, paid, partial, reversed o invoicing_legacy. Influisce su promemoria e reportistica.
12. line_ids
Tipo: One2many (account.move.line). Le singole righe contabili: ogni riga contiene conto, dare e avere. Il totale dei dare deve uguagliare il totale degli avere.
13. invoice_line_ids
Tipo: One2many (account.move.line). Per fatture e bollette queste righe rappresentano prodotti o servizi; alla registrazione generano una o più righe contabili.
14. invoice_date
Tipo: Date. Data fattura: rilevante per periodi fiscali e IVA; può differire dalla data del movimento in alcune configurazioni.
15. invoice_date_due
Tipo: Date. Data di scadenza del pagamento: calcolata da termini di pagamento o impostata manualmente; usata per aging e solleciti.
16. ref
Tipo: Char. Riferimento esterno o numero fattura fornitore: utile per riconciliazioni e confronti con documenti esterni.
17. invoice_origin
Tipo: Char. Documento sorgente: per fatture originate da ordini contiene il numero dell'ordine, utile per tracciare il flusso dall'ordine alla fattura.
18. create_date
Tipo: Datetime. Timestamp di creazione del record: gestito automaticamente da Odoo.
19. write_date
Tipo: Datetime. Timestamp dell'ultima modifica: anch'esso gestito automaticamente.
20. narration
Tipo: Text. Note interne o memorie: generalmente visibili nelle registrazioni ma non stampate per il cliente nelle fatture.
21. fiscal_position_id
Tipo: Many2one (account.fiscal.position). Posizione fiscale che determina regole IVA in base a partner e paese.
22. invoice_payment_term_id
Tipo: Many2one (account.payment.term). Termini di pagamento (es. Net 30): servono per calcolare la scadenza e suddividere gli incassi.
23. invoice_user_id
Tipo: Many2one (res.users). Utente responsabile o venditore associato alla fattura, utile per report commerciali e commissioni.
24. reversed_entry_id
Tipo: Many2one (account.move). Collegamento alla scrittura che annulla l'originale: importante per la tracciabilità delle rettifiche.
25. to_check
Tipo: Boolean. Flag per indicare movimenti da revisionare: usato nelle riconciliazioni bancarie e nei flussi di eccezione.
26. active
Tipo: Boolean. Flag di soft-delete: se False il record è archiviato. Le scritture annullate spesso vengono marcate come non attive.
27. sequence_number
Tipo: Integer. Numero di sequenza del giornale: usato per ordinamento e visualizzazione, gestito dal meccanismo di sequenza.
28. amount_untaxed
Tipo: Monetary. Imponibile: totale delle righe prima delle imposte, usato per riepiloghi e calcoli IVA.
29. amount_tax
Tipo: Monetary. Totale imposte: calcolato dalle righe e dalla configurazione fiscale.
30. invoice_source_email
Tipo: Char. Indirizzo email sorgente per fatture fornitore importate via mail: utile per l'acquisizione automatica delle bollette.
Come viene impiegato nei processi aziendali
1. Fatturazione clienti
Quando una consegna o una vendita viene fatturata, Odoo crea un account.move di tipo out_invoice con le righe provenienti dall'ordine. La pubblicazione del movimento genera le scritture e aggiorna i conti clienti.
2. Fatture fornitori
Le fatture possono essere generate dagli ordini d'acquisto o inserite manualmente: sono account.move di tipo in_invoice con partner_id impostato al fornitore; quando pubblicate aggiornano i debiti verso fornitori.
3. Riconciliazione pagamenti
I pagamenti vengono abbinati alle fatture utilizzando amount_residual e payment_state: la riconciliazione collega i movimenti di pagamento con le fatture e azzera il residuo appropriato.
4. Scritture manuali
I contabili inseriscono movimenti di tipo entry per rettifiche, accrual o correzioni: si aggiungono righe (line_ids) con conti, dare e avere; il movimento deve quadrare prima della registrazione.
5. Note di credito e rimborsi
Le note di credito sono movimenti di tipo out_refund o in_refund e annullano l'effetto di una fattura/bolla: reversed_entry_id mantiene il collegamento all'originale per l'audit.
Come gli sviluppatori estendono questo modello
Gli sviluppatori estendono account.move con diversi approcci: l'ereditarietà dei modelli è lo strumento principale per aggiungere campi e logiche senza toccare il core.
Ereditarietà del modello
Impostando _inherit = 'account.move' puoi estendere la struttura: aggiungere campi, sovrascrivere metodi o definire vincoli. L'ereditarietà mantiene le modifiche modulari e facilita gli aggiornamenti.
Aggiunta di campi
Dichiara nuovi campi nel modello ereditato scegliendo il tipo appropriato: Char, Many2one, Boolean, Integer, Text, Selection. Valuta la visibilità per società diverse e usa domini su move_type per campi specifici di fattura.
Estensioni Python
Sovrascrivi metodi come create, write, _post o button_draft per integrare logiche personalizzate, chiamando super() per preservare il comportamento base. Presta attenzione ai campi calcolati e alle loro dipendenze con i decoratori @api.
Odoo Studio
Odoo Studio permette di inserire campi senza codice: ottimo per richieste rapide. Per logiche complesse, controlli o automazioni ripetute, è preferibile sviluppare un modulo personalizzato più robusto.
Nota: account.move è un modello persistente: crea tabelle nel database e conserva i dati contabili. Non è un modello astratto (template) né transient (wizard), che hanno scopi e durate diverse.
Buone pratiche
- Quando crei report o integrazioni filtra sempre per move_type: i tipi diversi hanno campi obbligatori e comportamenti distinti.
- Usa il giornale corretto per ogni tipo di movimento: assegnare un journal non coerente può compromettere sequenze e risultati contabili.
- Se crei movimenti via API assicurati che line_ids sia bilanciato (dare = avere) prima di pubblicare: movimenti sbilanciati vengono rifiutati.
- Nel mappare documenti esterni, traduci correttamente i tipi: out_invoice per vendite, in_invoice per acquisti, evitando ambiguità tra fatture e note di credito.
- Per i campi custom usa il prefisso x_ per ridurre conflitti con future versioni di Odoo.
Errori comuni
- Pubblicare movimenti con righe non bilanciate: Odoo impedisce il post; verifica sempre che i totali di dare e avere combacino.
- Modificare direttamente movimenti già postati: sono bloccati. Per rettifiche usa una registrazione di storno o crea un nuovo movimento di rettifica.
- Dimenticare partner_id su documenti clienti o fornitori: molte funzionalità (aging, report, riconciliazioni) dipendono da questo campo.
- Usare il move_type sbagliato: una out_refund non è lo stesso di una out_invoice negativa; scegli il tipo corretto per rimborsi e note di credito.
- Sovrascrivere metodi core senza chiamare super(): questo può rompere integrazioni e complicare gli aggiornamenti futuri.
Conclusione
Il modello account.move è il cuore della contabilità in Odoo: unifica fatture, bollette e scritture in una struttura coerente. Padroneggiarne i campi e i meccanismi di estensione ti aiuta a configurare, personalizzare e integrare Odoo con sicurezza.
Sia che tu disegni processi funzionali o sviluppi moduli su misura, conoscere account.move riduce tempi, rischi e errori implementativi.
Hai bisogno di aiuto con il tuo progetto Odoo?
Dasolo supporta aziende nell'implementazione, personalizzazione e ottimizzazione di Odoo, con specializzazione in integrazioni API e sviluppo su misura. Il nostro team conosce in profondità l'architettura dati di Odoo e modelli come account.move.
Se ti serve supporto per l'implementazione, moduli personalizzati o integrazioni, siamo a disposizione per aiutarti. Prenota una demo per discutere il tuo progetto.