Introduzione
In Odoo, i modelli definiscono come i dati sono strutturati e memorizzati nel database. Ogni pezzo di dati aziendali con cui lavori, dagli ordini di vendita all'inventario ai prodotti, vive in un modello.
Comprendere i modelli di Odoo è essenziale sia per gli sviluppatori che per i consulenti funzionali. I modelli sono la base dell'architettura dei dati di Odoo. Definiscono i campi di Odoo, le relazioni e la logica aziendale.
Questo articolo si concentra su uno dei modelli più importanti di Odoo: product.product. Che tu stia costruendo moduli personalizzati, integrando sistemi esterni o configurando cataloghi di prodotti, lavorerai con questo modello.
Cos'è il modello product.product
Il modello product.product rappresenta le varianti di prodotto effettive in Odoo. Questi sono gli articoli concreti, vendibili e acquistabili che appaiono negli ordini di vendita, negli ordini di acquisto e nei movimenti di magazzino.
Questo modello in Odoo è diverso da product.template. Il template contiene attributi condivisi per una famiglia di prodotti. I record product.product sono le varianti specifiche. Per un prodotto semplice senza varianti, c'è un product.product per ogni product.template. Per i prodotti configurabili (ad es. T-shirt con taglia e colore), ogni combinazione è un product.product separato.
Il modello è definito nel modulo prodotto (product). Vendite, Acquisto, Magazzino e e-commerce fanno tutti riferimento a product.product. Quando aggiungi una riga a un preventivo o ricevi merce, lavori con i record product.product.
product.product utilizza l'ereditarietà per delega da product.template. Molti campi di Odoo sono definiti sul template e ereditati dalla variante. Questo mantiene i dati condivisi in un unico posto consentendo al contempo sovrascritture specifiche per variante.
Campi chiave nel modello
Ecco i campi Odoo più importanti nel modello product.product. Comprendere questi ti aiuterà a lavorare in modo efficace con le varianti di prodotto.
1. name
Tipo: Char. Questo campo memorizza il nome della variante di prodotto. Viene tipicamente visualizzato in elenchi, moduli e documenti. Per i prodotti semplici corrisponde al nome del template. Per le varianti può includere valori di attributo (ad es. "T-Shirt - Blu / M").
2. product_tmpl_id
Tipo: Many2one (product.template). Collega la variante al suo template genitore. Questa è la relazione principale. Ogni product.product appartiene esattamente a un product.template. Utilizza questo quando hai bisogno di ereditare il modello in Odoo o estendere la logica del prodotto.
3. default_code
Tipo: Char. Riferimento interno o SKU. Utilizzato per identificazione, ricerca codice a barre e integrazione con sistemi esterni. Ogni variante può avere il proprio codice.
4. barcode
Tipo: Carattere. Codice a barre (EAN, UPC, ecc.). Utilizzato per la scansione nei punti vendita, nei magazzini e nell'inventario. Deve essere unico tra i prodotti quando impostato.
5. data_creazione
Tipo: Data e ora. Memorizza la data e l'ora in cui il record è stato creato. Gestito automaticamente da Odoo. Utile per report e audit.
6. data_modifica
Tipo: Data e ora. Memorizza la data e l'ora dell'ultima modifica. Anche questo è gestito automaticamente. Aiuta a tenere traccia di quando i dati sono stati aggiornati l'ultima volta.
7. attivo
Tipo: Booleano. Flag di cancellazione soft. Quando è False, il record è archiviato e nascosto dalle visualizzazioni predefinite. I prodotti non vengono fisicamente eliminati per preservare la storia.
8. tipo
Tipo: Selezione. Tipo di prodotto: Consumato, Servizio o Prodotto Stoccabile. I consumabili non sono tracciati nell'inventario. I servizi non hanno stock. I prodotti stoccabili sono tracciati in magazzino. Questo determina quali moduli e flussi di lavoro si applicano.
9. categ_id
Tipo: Many2one (product.category). La categoria del prodotto. Utilizzata per report, regole di prezzo e organizzazione del catalogo. Le categorie possono avere una gerarchia padre-figlio.
10. prezzo_lista
Tipo: Float. Il prezzo di vendita. Visualizzato nelle quotazioni e utilizzato come predefinito quando si aggiunge una riga. Può essere sovrascritto per cliente o da listini prezzi.
11. standard_price
Tipo: Float. Il prezzo di costo. Utilizzato per la valutazione dell'inventario e i calcoli dei margini. Tipicamente aggiornato tramite ordini di acquisto o inserimento manuale.
12. uom_id
Tipo: Many2one (uom.uom). Unità di misura per vendite e inventario. Definisce come vengono espresse le quantità (unità, kg, litri, ecc.).
13. uom_po_id
Tipo: Many2one (uom.uom). Unità di misura per acquisti. Può differire da uom_id (ad esempio, acquistare in scatole, vendere in unità). La conversione è gestita automaticamente.
14. description_sale
Tipo: Html. Descrizione di vendita. Mostrata su quotazioni, ordini e fatture. Può includere formattazione e dettagli del prodotto.
15. description_purchase
Tipo: Html. Descrizione di acquisto. Mostrata su ordini di acquisto e fatture dei fornitori. Utilizzata per comunicazioni interne e con i fornitori.
16. sale_ok
Tipo: Booleano. Può essere venduto. Quando è False, il prodotto è nascosto dalle vendite e dall'e-commerce. Utile per articoli interni o solo per acquisto.
17. purchase_ok
Tipo: Booleano. Può essere acquistato. Quando è False, il prodotto è nascosto dagli acquisti. Utile per articoli fabbricati o solo per vendite.
18. image_1920
Tipo: Binario. Immagine del prodotto a risoluzione completa. Odoo memorizza più dimensioni (image_512, image_256, ecc.) per la visualizzazione. Utilizzato in moduli, e-commerce e report.
19. weight
Tipo: Float. Peso del prodotto. Utilizzato per calcoli di spedizione e logistica. L'unità dipende dalla configurazione dell'azienda.
20. volume
Tipo: Float. Volume del prodotto. Utilizzato per spedizioni e capacità di magazzino. Importante per le aziende con vincoli volumetrici.
21. company_id
Tipo: Many2one (res.company). In configurazioni multi-azienda, questo indica quale azienda possiede il prodotto. Influisce sulla visibilità dei record e sullo stock.
22. currency_id
Tipo: Many2one (res.currency). Valuta per list_price e standard_price. Di solito la valuta dell'azienda. I listini possono convertire in altre valute.
23. qty_available
Tipo: Float. Quantità disponibile. Calcolata a partire dai quants di magazzino. Solo in lettura. Utilizzata per controlli di disponibilità e report. Solo per prodotti stoccabili.
24. virtual_available
Tipo: Float. Quantità prevista (disponibile più in arrivo meno in uscita). Utilizzata per disponibilità e rifornimento. Campo calcolato solo in lettura.
25. product_template_attribute_value_ids
Tipo: Many2many. Collega ai valori degli attributi che definiscono questa variante (ad es. Colore=Blu, Taglia=M). Utilizzato per la configurazione e il filtraggio delle varianti.
26. sequence
Tipo: Integer. Ordine di visualizzazione. Utilizzato per ordinare i prodotti in elenchi e configuratori. Valori più bassi appaiono per primi.
27. display_name
Tipo: Char. Nome visualizzato calcolato. Combina il nome con gli attributi della variante. Utilizzato nei menu a discesa many2one e nei risultati di ricerca. Solo in lettura.
28. responsible_id
Tipo: Many2one (res.users). Persona responsabile per il prodotto. Utilizzato per le regole di riordino e l'assegnazione interna. Facoltativo.
Come questo modello viene utilizzato nei flussi di lavoro aziendali
1. Vendite e Preventivi
Quando un venditore crea un preventivo, seleziona un prodotto.product dal catalogo. Il list_price, description_sale e uom_id fluiscono nella riga dell'ordine. I listini prezzi possono sovrascrivere il prezzo. Solo i prodotti con sale_ok=True appaiono.
2. Acquisti e Fornitori
Gli ordini di acquisto e le fatture dei fornitori fanno riferimento a product.product. Il standard_price viene aggiornato dai costi di acquisto. I prodotti con purchase_ok=True sono disponibili. L'uom_po_id definisce come vengono ordinati i quantitativi (ad esempio, per scatola).
3. Inventario e Magazzino
I movimenti di magazzino, le picking e i quants utilizzano product.product. I campi qty_available e virtual_available determinano la disponibilità. Solo i prodotti stoccabili vengono tracciati. La scansione dei codici a barre utilizza il campo barcode per una ricerca rapida.
4. E-commerce e Sito Web
Il negozio del sito web visualizza i record di product.product. Le varianti con attributi diversi (taglia, colore) sono mostrate come opzioni. Le immagini, le descrizioni e i prezzi dei prodotti provengono dal modello. Il flag sale_ok controlla la visibilità.
5. Produzione e MRP
Le distinte basi fanno riferimento a product.product sia per i componenti che per i prodotti finiti. Il campo type determina se un prodotto è fabbricato (stoccabile) o consumato. I livelli di stock guidano la pianificazione della produzione.
Come gli sviluppatori estendono questo modello
Gli sviluppatori estendono product.product utilizzando diversi modelli. L'ereditarietà del modello Odoo è il principale meccanismo.
Ereditarietà del Modello
Usa _inherit = 'product.product' per estendere il modello. Aggiungi nuovi campi Odoo, sovrascrivi metodi o aggiungi vincoli. Il modello ereditato in Odoo mantiene le tue modifiche in un modulo separato per facilitare gli aggiornamenti. Scegli product.product quando il campo è specifico per la variante; usa product.template quando si applica all'intera famiglia di prodotti.
Aggiunta di Campi
Definisci nuovi campi Odoo nel tuo modello ereditato. Usa il tipo di campo corretto: Char, Many2one, Boolean, Integer, Text, Selection. Considera se il campo appartiene al template (condiviso) o alla variante (specifico). Per dati specifici della variante come SKU o sovrascritture del codice a barre, usa product.product.
Estensioni Python
Sovrascrivi create, write o unlink per aggiungere logica. Usa super() per chiamare l'originale. Fai attenzione ai campi calcolati e alle loro dipendenze. Il modello product.product ha molti campi calcolati dai moduli di stock e vendita.
Odoo Studio
Odoo Studio ti consente di aggiungere campi senza codice. Utile per personalizzazioni rapide. Per logiche complesse o aggiornamenti, i moduli personalizzati sono più manutenibili. Il modello API in Odoo (product.product) è completamente esposto tramite XML-RPC e JSON-RPC per integrazioni.
Migliori pratiche
- Usa default_code o barcode per la mappatura dei sistemi esterni. Mantienili unici e coerenti.
- Imposta correttamente il tipo per ogni prodotto. Consumabile vs Stoccabile vs Servizio influisce su quali moduli e flussi di lavoro si applicano.
- Quando costruisci integrazioni API, usa product.product per righe d'ordine e transazioni. Usa product.template per operazioni a livello di catalogo.
- Per campi personalizzati, usa il prefisso
x_o un prefisso di modulo per evitare conflitti con le future versioni di Odoo. - Considera product.template quando aggiungi campi che si applicano a tutte le varianti (ad es. marca, categoria). Usa product.product per dati specifici della variante (ad es. codice a barre specifico della variante).
Errori comuni
- Eredita da product.template quando hai bisogno di logica specifica per la variante. Usa product.product per comportamenti per variante.
- Crea record product.product manualmente invece che tramite il template. Per i prodotti varianti, creali tramite il configuratore di prodotto.
- Dimenticare di impostare sale_ok o purchase_ok. I prodotti sono nascosti da vendite/acquisti per impostazione predefinita in alcune configurazioni.
- Sovrascrivere metodi core senza chiamare super(). Questo può rompere altri moduli o futuri aggiornamenti.
- Usare product.product nei domini quando product.template sarebbe più appropriato (ad es. filtrare per categoria sul template).
Conclusione
Il modello product.product è centrale nell'architettura dei prodotti di Odoo. Rappresenta gli articoli effettivamente vendibili e acquistabili. Comprendere i suoi campi e come si relaziona a product.template ti aiuterà a configurare, personalizzare e integrare Odoo in modo efficace.
Che tu sia un consulente funzionale che mappa cataloghi di prodotti o uno sviluppatore che costruisce moduli personalizzati, una solida comprensione di product.product ti farà risparmiare tempo e prevenire errori.
Hai bisogno di aiuto con la tua implementazione di Odoo?
Dasolo aiuta le aziende a implementare, personalizzare e ottimizzare Odoo. Siamo specializzati in integrazioni API e sviluppo Odoo. Il nostro team ha una profonda esperienza con l'architettura dei dati di Odoo e modelli come product.product.
Se hai bisogno di aiuto con la tua implementazione Odoo, moduli personalizzati o integrazioni, siamo qui per aiutarti. Prenota una demo per discutere del tuo progetto.