Introduzione
In Odoo i modelli sono lo schema che organizza i dati nel database: ogni elemento di business — dall’ordine di vendita alla fattura, dal prodotto al magazzino — è rappresentato da un modello che definisce campi, relazioni e regole.
Per chi lavora su Odoo, sviluppatori e consulenti funzionali, comprendere i modelli è imprescindibile: sono la spina dorsale dell’architettura dei dati e seguono pattern ricorrenti che permettono di estendere e integrare il sistema con sicurezza.
Questo testo prende in esame uno dei modelli più utilizzati in Odoo: product.template. Sia che tu stia creando moduli personalizzati, collegando sistemi esterni o organizzando il catalogo prodotti, incontrerai spesso questo modello.
Cos’è il modello product.template
Il modello product.template rappresenta la ‘scheda madre’ del prodotto: contiene i dati condivisi tra più varianti (per esempio colore o taglia), evitando di duplicare informazioni quando un prodotto si declina in diverse versioni.
product.template è sfruttato in molte aree: Vendite, Acquisti, Magazzino, E‑commerce e Produzione. Quando aggiungi un articolo al catalogo stai creando un template; quando un cliente ordina, si seleziona solitamente una variante che eredita i dati dal template.
Il modello è definito nel modulo product e viene ampliato da altri moduli tramite l’ereditarietà dei modelli. Per esempio, il modulo Sale aggiunge aspetti commerciali, Purchase gestisce fornitori, Inventory traccia le scorte: ognuno completa la struttura base senza ripeterla.
È fondamentale distinguere product.template da product.product: il template contiene le informazioni comuni, mentre la variant (product.product) custodisce i dettagli specifici della variante, come barcode o SKU.
Campi chiave del modello
Di seguito trovi i campi più rilevanti di product.template: conoscerli ti permetterà di lavorare con i prodotti in modo più efficace.
1. name
Tipo: Char. È il nome del prodotto, il primo campo che gli utenti vedono nelle viste e nelle ricerche; funge da identificativo principale del template.
2. create_date
Tipo: Datetime. Registra quando il record è stato creato; è gestito automaticamente e serve a reportistica e audit.
3. write_date
Tipo: Datetime. Tiene traccia dell’ultima modifica; anch’esso automatico, utile per capire quando un dato è stato aggiornato.
4. active
Tipo: Boolean. Bandiera di archiviazione: se False il prodotto viene nascosto nelle viste predefinite senza essere cancellato fisicamente.
5. sequence
Tipo: Integer. Determina l’ordine di visualizzazione nelle liste e nelle selezioni: valori più bassi compaiono prima.
6. type
Tipo: Selection. Classifica il prodotto: Consumabile, Servizio o Prodotto magazzinabile. Influisce sul tracciamento di inventario e sul trattamento logistico.
7. categ_id
Tipo: Many2one (product.category). Categoria di prodotto che guida report, rotaie logistiche e organizzazione del catalogo; le categorie possono essere nidificate.
8. list_price
Tipo: Float. Prezzo di vendita suggerito; valore di default nelle offerte che può essere sovrascritto da listini o prezzi di variante.
9. standard_price
Tipo: Float. Prezzo di costo usato per calcoli di margine e valutazione di magazzino; impatta i report di redditività.
10. currency_id
Tipo: Many2one (res.currency). Valuta per list_price e standard_price; di solito deriva dalla company del record.
11. uom_id
Tipo: Many2one (uom.uom). Unità di misura per la vendita: definisce come vengono espressi i quantitativi (Es. Pezzi, Kg, Litri).
12. uom_po_id
Tipo: Many2one (uom.uom). Unità di misura per gli acquisti, che può differire da uom_id quando è necessaria una conversione.
13. default_code
Tipo: Char. Riferimento interno o codice articolo; molto utile per il mapping con sistemi esterni e per gestire gli SKU.
14. barcode
Tipo: Char. Codice a barre per scansione; usato in POS, magazzino e inventario. Per le varianti il barcode è spesso definito su product.product.
15. description
Tipo: Char. Descrizione interna visibile solo agli utenti interni, utile per note operative sul prodotto.
16. description_sale
Tipo: Text. Descrizione commerciale mostrata su preventivi e fatture; può contenere HTML per formattazioni avanzate.
17. description_purchase
Tipo: Text. Testo per gli ordini d’acquisto e le fatture dei fornitori; facilita la comunicazione con il fornitore.
18. sale_ok
Tipo: Boolean. Indica se il prodotto è vendibile: se False viene nascosto dalle viste di vendita e dai moduli di offerta.
19. purchase_ok
Tipo: Boolean. Indica se il prodotto è acquistabile: se False non appare nelle linee d’acquisto.
20. weight
Tipo: Float. Peso del prodotto, usato per calcoli di spedizione; l’unità dipende dalle impostazioni UoM aziendali.
21. volume
Tipo: Float. Volume del prodotto, rilevante per pianificazione logistica e capacità di magazzino.
22. product_variant_ids
Tipo: One2many (product.product). Elenco delle varianti legate al template: ogni variante eredita i campi comuni.
23. product_variant_count
Tipo: Integer. Numero di varianti calcolato da product_variant_ids; utile per filtri e visualizzazioni sintetiche.
24. image_1920
Tipo: Binary. Immagine del prodotto; Odoo memorizza più risoluzioni per moduli, report e sito web.
25. responsible_id
Tipo: Many2one (res.users). Utente responsabile del prodotto, utile per assegnare attività di gestione prodotto.
26. company_id
Tipo: Many2one (res.company). In ambiti multi‑company indica a quale azienda appartiene il prodotto.
27. tax_ids
Tipo: Many2many (account.tax). Imposte cliente applicabili in fase di vendita; usate su fatture e preventivi.
28. supplier_tax_id
Tipo: Many2many (account.tax). Imposte fornitore applicabili agli acquisti e alle bollette.
29. attribute_line_ids
Tipo: One2many. Linee attributo che definiscono le varianti (Es. Taglia, Colore) e come vengono generate.
30. route_ids
Tipo: Many2many (stock.route). Route di magazzino che definiscono il flusso logistico (Acquista, Produce, Make to Order).
31. property_stock_production
Tipo: Many2one (stock.location). Ubicazione di produzione per prodotti fabbricati; usata quando il tipo è magazzinabile e la route include produzione.
32. property_stock_inventory
Tipo: Many2one (stock.location). Ubicazione usata per rettifiche inventariali e conteggi fisici.
33. property_valuation
Tipo: Selection. Metodo di valutazione: Automatica o Manuale; influenza il calcolo dei costi a magazzino.
34. property_cost_method
Tipo: Selection. Metodo di costing: Standard o FIFO; determina come viene calcolato il valore delle scorte.
35. property_account_income_id
Tipo: Many2one (account.account). Conto ricavi usato in fase di fatturazione.
36. property_account_expense_id
Tipo: Many2one (account.account). Conto costi usato per le fatture fornitori.
37. invoice_policy
Tipo: Selection. Politica di fatturazione: Quantità ordinate o Quantità consegnate; influisce sul riconoscimento del ricavo.
38. expense_policy
Tipo: Selection. Politica di costo: Ordinato o Consegnato; determina quando si riconoscono i costi.
39. service_type
Tipo: Selection. Per i servizi: Manuale, Timesheet o Milestones; definisce come vengono tracciati e fatturati.
40. optional_product_ids
Tipo: Many2many (product.template). Prodotti opzionali per upsell: suggeriti quando si aggiunge il prodotto a un preventivo.
Come viene usato questo modello nei processi aziendali
1. Vendite e preventivi
Quando un commerciale crea un preventivo sceglie articoli dal catalogo: il template fornisce i dati condivisi e, se esistono attributi, si selezionerà la variante corretta (es. rosso, taglia M).
2. E‑commerce
Sul sito il cliente naviga il catalogo basato sui template: immagini e descrizioni comuni vengono mostrate dal template, mentre il cliente seleziona la variante desiderata prima dell’acquisto.
3. Acquisti e fornitori
Ordini di acquisto e bollette sono collegati al prodotto: il flag purchase_ok regola la disponibilità su form d’acquisto, mentre supplier_tax_id e uom_po_id influenzano il comportamento con i fornitori.
4. Magazzino e Produzione
Movimenti di magazzino e ordini di produzione fanno riferimento alle varianti: il template definisce route, valutazione e metodo di costing, ma il tracciamento delle scorte è per variante.
5. Fatturazione
Fatture e note di credito fanno riferimento alle righe prodotto; il template fornisce regole fiscali e contabili e la invoice_policy determina quando registrare il ricavo.
Come gli sviluppatori estendono questo modello
Gli sviluppatori estendono product.template principalmente attraverso l’ereditarietà dei modelli: metodologie consolidate permettono di aggiungere campi, logica e vincoli senza toccare il core.
Ereditarietà del modello
Dichiarando _inherit = 'product.template' si estende il modello esistente: si introducono nuovi campi, si sovrascrivono metodi o si aggiungono constraint mantenendo le modifiche in un modulo separato per facilitare aggiornamenti e manutenzione.
Aggiunta di campi
Nei moduli ereditati puoi definire nuovi campi scegliendo il tipo corretto (Char, Many2one, Boolean, Integer, Text, Selection). Considera campi dipendenti dalla company in scenari multi‑società.
Estensioni in Python
Per inserire logica server‑side è possibile sovrascrivere create, write o unlink; usa super() per preservare il comportamento originale e fai attenzione a campi compute e ai loro dependencies.
Odoo Studio
Odoo Studio è utile per modifiche rapide e senza codice, ma per logiche complesse o per garantire upgrade sicuri è preferibile sviluppare moduli dedicati.
Buone pratiche
- Metti i dati condivisi sul template e lascia ai product.product i dati specifici della variante: questa separazione evita inconsistenze e facilita integrazioni.
- Imposta correttamente categ_id per beneficiare di routing e report predefiniti: le categorie guidano molti comportamenti automatici di Odoo.
- Usa default_code per il mapping con sistemi esterni e per gestire SKU; mantenere questo codice unico semplifica sincronizzazioni e ricerche.
- Nelle integrazioni API sfrutta XML‑RPC o JSON‑RPC: product.template è esposto via API e richiede attenzione nel mapping degli ID esterni per evitare collisioni.
- Per i campi personalizzati segui la convenzione x_ o usa un prefisso di modulo per ridurre il rischio di conflitti con aggiornamenti futuri di Odoo.
Errori comuni
- Creare template duplicati invece di usare le varianti: se le differenze riguardano solo attributi come taglia o colore, è meglio usare attribute_line_ids per generare varianti.
- Confondere product.template con product.product: quando servono dati specifici per variante (barcode, SKU) devi operare su product.product, non sul template.
- Dimenticare di impostare sale_ok o purchase_ok: un prodotto con questi flag a False non sarà visibile nei rispettivi form operativi.
- Sovrascrivere metodi core senza chiamare super(): questo può rompere compatibilità con altri moduli e rendere gli upgrade rischiosi.
- Aggiungere campi custom obbligatori senza default: le registrazioni esistenti potrebbero fallire la validazione durante l’aggiornamento del modulo.
Conclusione
Il modello product.template è un elemento cruciale di Odoo: definisce le schede prodotto e i dati condivisi tra varianti. Capire i campi e il modo in cui i moduli lo estendono è fondamentale per configurare, personalizzare e integrare Odoo correttamente.
Sia che tu stia mappando cataloghi come consulente funzionale, sia che tu stia sviluppando moduli, una buona conoscenza di product.template ti farà risparmiare tempo ed evitare errori.
Inizia con Dasolo
Dasolo supporta le aziende nell’implementazione, personalizzazione e ottimizzazione di Odoo: siamo specializzati in integrazioni API e sviluppo su misura, con esperienza profonda nell’architettura dei dati e modelli come product.template.
Se ti serve assistenza per l’implementazione Odoo, per moduli custom o per integrazioni, possiamo aiutarti. Prenota una demo per parlare del tuo progetto.