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 alle fatture ai contatti, 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 campi, relazioni e logica aziendale.
Questo articolo si concentra su uno dei modelli più importanti del modulo Vendite: sale.order.line. Che tu stia costruendo moduli personalizzati, integrando sistemi esterni o configurando flussi di lavoro sui prezzi, lavorerai con questo modello.
Cos'è il modello sale.order.line
Il modello sale.order.line rappresenta singoli elementi di linea in un preventivo o in un ordine di vendita in Odoo. Ogni linea corrisponde tipicamente a un prodotto, con informazioni su quantità, prezzo e tasse.
Questo modello in Odoo è utilizzato dal modulo Vendite (sale). Eredita da analytic.mixin per il tracciamento dei costi di progetto e l'integrazione con il foglio presenze. Quando aggiungi un prodotto a un preventivo, stai creando un record sale.order.line.
Il modello è definito nel modulo sale. Altri moduli lo estendono attraverso l'ereditarietà dei modelli Odoo. Ad esempio, sale_stock aggiunge campi relativi alla consegna. sale_margin aggiunge calcoli del margine. Ogni modulo aggiunge ciò di cui ha bisogno senza duplicare la struttura di base.
Campi chiave nel modello
Ecco i campi Odoo più importanti nel modello sale.order.line. Comprendere questi ti aiuterà a lavorare in modo efficace con preventivi e ordini di vendita.
1. order_id
Tipo: Many2one (sale.order). Obbligatorio. Riferimento all'ordine di vendita genitore. Questo campo collega ogni linea al suo genitore. Le linee vengono eliminate quando l'ordine viene eliminato (cascata).
2. sequence
Tipo: Intero. Predefinito 10. Controlla l'ordine di visualizzazione delle linee nell'ordine. Utilizzato per ordinare sezioni, note e linee di prodotto.
3. company_id
Tipo: Many2one (res.company). Relazionato da order_id. Utilizzato per le regole multi-azienda e il controllo degli accessi.
4. currency_id
Tipo: Many2one (res.currency). Relazionato da order_id. Utilizzato per tutti i campi monetari sulla linea. Garantisce la corretta valuta per la determinazione dei prezzi.
5. order_partner_id
Tipo: Many2one (res.partner). Relazionato da order_id. Il cliente. Utilizzato per listino prezzi e regole fiscali.
6. salesman_id
Tipo: Many2one (res.users). Relazionato da order_id. Il venditore. Utilizzato per commissioni e reportistica.
7. state
Tipo: Selezione. Relazionato da order_id. Stato dell'ordine (bozza, inviato, vendita, completato, annullato). Determina quali campi sono modificabili.
8. display_type
Tipo: Selezione. Valori: line_section o line_note. Quando impostato, la riga è un'intestazione di sezione o una nota, non una riga di prodotto. I campi del prodotto sono vuoti.
9. is_downpayment
Tipo: Booleano. Indica se la riga è un acconto. Gli acconti vengono fatturati separatamente.
10. is_expense
Tipo: Booleano. Vero quando la riga proviene da una spesa o da una fattura fornitore. Utilizzato per il monitoraggio dei costi di progetto.
11. product_id
Tipo: Many2one (product.product). Il prodotto in vendita. Il dominio è limitato ai prodotti vendibili. Richiesto per le righe di prodotto.
12. product_template_id
Tipo: Many2one (product.template). Calcolato da product_id. Utilizzato dal configuratore di prodotto per la selezione delle varianti.
13. name
Tipo: Testo. La descrizione della riga. Calcolata da prodotto e attributi personalizzati. Include i dettagli della variante quando applicabile.
14. product_uom_qty
Tipo: Float. Richiesto. La quantità ordinata. Predefinito 1.0. Può essere influenzato dal confezionamento.
15. product_uom
Tipo: Many2one (uom.uom). Unità di misura. Predefinito dal prodotto. Utilizzato per quantità e prezzi.
16. tax_id
Tipo: Many2many (account.tax). Tasse applicate alla riga. Calcolato da prodotto e posizione fiscale.
17. price_unit
Tipo: Float. Obbligatorio. Prezzo unitario per prodotto_uom. Calcolato dal listino prezzi o dal prodotto. Può essere sovrascritto manualmente.
18. discount
Tipo: Float. Percentuale di sconto. Applicata a price_unit prima delle tasse.
19. price_subtotal
Tipo: Monetario. Subtotale prima delle tasse. Calcolato da quantità, prezzo unitario e sconto.
20. price_tax
Tipo: Float. Importo totale delle tasse. Calcolato da price_subtotal e tax_id.
21. price_total
Tipo: Monetario. Totale comprensivo di tasse. L'importo principale per la fatturazione.
22. product_packaging_id
Tipo: Many2one (product.packaging). Imballaggio opzionale (ad es. scatola da 12). Quando impostato, la quantità può essere determinata dall'imballaggio.
23. customer_lead
Tipo: Float. Tempo di consegna in giorni. Giorni tra la conferma dell'ordine e la spedizione. Utilizzato per il calcolo della data di consegna.
24. qty_delivered
Tipo: Float. Quantità consegnata. Aggiornata da movimenti di magazzino o manualmente. Utilizzata per la fatturazione parziale.
25. qty_invoiced
Tipo: Float. Quantità già fatturata. Calcolata dalle righe di fattura.
26. qty_to_invoice
Tipo: Float. Quantità rimanente da fatturare. Calcolata da qty_delivered e qty_invoiced.
27. invoice_status
Tipo: Selezione. Valori: upselling, fatturato, da fatturare, no. Indica lo stato di fatturazione per la riga.
28. invoice_lines
Tipo: Many2many (account.move.line). Collega le righe di fattura create da questa riga di vendita. Utilizzato per la tracciabilità.
29. create_date
Tipo: Datetime. Quando il record è stato creato. Gestito automaticamente da Odoo.
30. write_date
Tipo: Datetime. Quando il record è stato modificato l'ultima volta. Utilizzato per l'audit.
Come viene utilizzato questo modello nei flussi di lavoro aziendali
1. Preventivo e Ordine di Vendita
Quando un venditore crea un preventivo, aggiunge prodotti. Ogni prodotto diventa una sale.order.line. Le righe mostrano quantità, prezzo, sconto e totale. L'ordine è confermato quando il cliente accetta.
2. Listino Prezzi e Sconti
I listini prezzi vengono applicati per riga. I campi price_unit e discount sono calcolati in base alle regole del listino prezzi. Gli sconti per volume o i prezzi specifici per cliente sono gestiti qui.
3. Consegna e Fatturazione
Quando la merce viene consegnata, qty_delivered viene aggiornato. La fatturazione può essere effettuata per consegna o in un'unica soluzione. Il campo invoice_status guida l'utente su cosa rimane da fatturare.
4. Progetto e Servizi
Per i prodotti di servizio, le righe sono collegate a compiti di progetto e fogli di presenza. L'ereditarietà analytic.mixin consente il monitoraggio dei costi per progetto.
5. E-commerce e Portale
I visitatori del sito web aggiungono prodotti al carrello. Ogni riga del carrello diventa una sale.order.line quando l'ordine viene creato. Il configuratore di prodotto utilizza product_template_id e attributi personalizzati.
Come gli sviluppatori estendono questo modello
Gli sviluppatori estendono sale.order.line utilizzando diversi modelli. L'ereditarietà del modello Odoo è il principale meccanismo.
Ereditarietà del Modello
Usa _inherit = 'sale.order.line' per estendere il modello. Aggiungi nuovi campi, sovrascrivi metodi o aggiungi vincoli. Il modello ereditato in Odoo mantiene le tue modifiche in un modulo separato per facilitare gli aggiornamenti.
Aggiunta di Campi
Definisci nuovi campi Odoo nel tuo modello ereditato. Usa il tipo di campo corretto: Char, Many2one, Boolean, Integer, Text, Selection. Considera i campi dipendenti dalla società per le multi-società.
Estensioni Python
Sovrascrivi _compute_price_unit, _compute_price_subtotal, o crea/scrivi per aggiungere logica. Usa super() per chiamare l'originale. Fai attenzione ai campi calcolati e alle loro dipendenze.
Odoo Studio
Odoo Studio ti consente di aggiungere campi senza codice. Buono per personalizzazioni rapide. Per logiche complesse o aggiornamenti, i moduli personalizzati sono più manutenibili.
Migliori pratiche
- Usa display_type per sezioni e note invece di righe di prodotto fittizie. Questo mantiene i report puliti.
- Quando si costruiscono integrazioni API, creare righe tramite l'order_id. Utilizzare il campo order_line_ids su sale.order con il formato di comando corretto.
- Rispettare i vincoli SQL. Una riga di prodotto deve avere product_id e product_uom. Una sezione o una nota deve avere display_type.
- Per la pricing personalizzata, utilizzare le regole della lista prezzi quando possibile. Sovrascrivere i metodi di calcolo solo quando è necessaria una logica non supportata dalle liste prezzi.
- Per i campi personalizzati, utilizzare il prefisso
x_o un prefisso di modulo per evitare conflitti con le future versioni di Odoo.
Errori comuni
- Creazione di righe senza order_id. Il campo è obbligatorio. Creare sempre righe nel contesto di un ordine.
- Confondere product_id e product_template_id. Per le righe di prodotto, impostare product_id. Per i flussi di configurazione, utilizzare product_template_id per selezionare una variante.
- Modificare price_unit o sconto dopo la fatturazione. Una volta che qty_invoiced è maggiore di zero, le modifiche ai prezzi possono causare incoerenze.
- Sovrascrivere metodi core senza chiamare super(). Questo può rompere altri moduli o aggiornamenti futuri.
- Dimenticare di impostare display_type per le righe di sezione o nota. Senza di esso, la riga viene trattata come una riga di prodotto e fallirà la validazione.
Conclusione
Il modello sale.order.line è centrale per Odoo Sales. Memorizza ogni riga di prodotto su preventivi e ordini. Comprendere i suoi campi e come i moduli lo estendono ti aiuterà a configurare, personalizzare e integrare Odoo in modo efficace.
Che tu sia un consulente funzionale che mappa i processi aziendali o uno sviluppatore che costruisce moduli personalizzati, una solida comprensione di sale.order.line 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 sale.order.line.
Se hai bisogno di aiuto con la tua implementazione di Odoo, moduli personalizzati o integrazioni, siamo qui per aiutarti. Prenota una demo per discutere del tuo progetto.