Introduzione
In Odoo i dati aziendali non stanno sparsi: sono organizzati in modelli. Ogni documento operativo — dall’ordine di vendita al trasferimento di magazzino — è memorizzato in un modello che definisce campi, relazioni e regole. Pensalo come lo scheletro dei dati dell’applicazione.
Conoscere i modelli è fondamentale sia per chi configura Odoo sia per chi sviluppa. Sono la base dell’architettura: stabiliscono come vengono rappresentate le informazioni, come si collegano tra loro e quali comportamenti automatici applicare.
Qui ci concentriamo su uno dei modelli più importanti del modulo Inventario: stock.picking. Se lavori su flussi di magazzino, integrazioni esterne o personalizzazioni legate ai movimenti, questo modello sarà spesso al centro delle tue modifiche.
Cos’è il modello stock.picking
Il modello stock.picking rappresenta i trasferimenti di merce in Odoo. Ogni record descrive uno spostamento di prodotti da una posizione a un’altra ed è il punto di riferimento per tracciare lo stato delle operazioni di magazzino.
Nel modulo Inventario lo stock.picking è usato per ricevute, spedizioni e trasferimenti interni. Confermare una consegna, ricevere la merce da un fornitore o spostare scorte tra depositi crea o aggiorna record di questo tipo.
Il modello viene definito nel modulo stock e poi arricchito da altri moduli tramite l’ereditarietà di modello. Il modulo Vendite aggiunge campi legati a consegna, il modulo Acquisti gestisce le ricevute, la Produzione estende i flussi per materie prime e prodotti finiti: ciascun modulo integra ciò che serve senza duplicare la struttura centrale.
stock.picking eredita funzionalità per la comunicazione e le attività (mail.thread e mail.activity.mixin). Questo permette di avere lo storico delle modifiche, il chatter e attività pianificate direttamente sul trasferimento.
Campi principali del modello
Di seguito trovi i campi chiave che incontrerai nello stock.picking. Capirli ti aiuta a modellare processi, sviluppare integrazioni e risolvere problemi operativi.
1. name
Tipo: Char. Identificativo del trasferimento, di solito generato automaticamente da una sequenza (es. WH/OUT/00001). Appare in cima al documento e funge da riferimento principale per il picking.
2. origin
Tipo: Char. Riferimento al documento sorgente (es. nome dell’ordine di vendita o d’acquisto). Serve per ricostruire la provenienza del trasferimento durante audit e report.
3. state
Tipo: Selection. Stato del trasferimento (es. draft, waiting, ready, done, cancelled). Lo stato guida le azioni disponibili e deriva dai movimenti associati.
4. picking_type_id
Tipo: Many2one (stock.picking.type). Definisce il tipo di operazione: ingresso, uscita o trasferimento interno. È obbligatorio e imposta le posizioni di origine/destinazione predefinite.
5. move_ids
Tipo: One2many (stock.move). Le righe di movimento: ogni record indica prodotto e quantità da spostare. Sono il cuore del trasferimento e sui loro vincoli opera la logica di riserva e disponibilità.
6. move_line_ids
Tipo: One2many (stock.move.line). Le operazioni dettagliate: lotti, serie e posizioni precise vengono gestite qui. Essenziali per picking, imballaggio e validazione con tracciabilità.
7. location_id
Tipo: Many2one (stock.location). Posizione di origine: da dove vengono prelevati i prodotti. Campo obbligatorio; per le spedizioni coincide spesso con il magazzino.
8. location_dest_id
Tipo: Many2one (stock.location). Posizione di destinazione: dove arrivano i prodotti. Campo obbligatorio; per le ricevute è di solito la posizione di stock.
9. partner_id
Tipo: Many2one (res.partner). Il contatto collegato: cliente per le uscite, fornitore per gli ingressi. Serve per indirizzi, documenti e integrazioni con corrieri.
10. scheduled_date
Tipo: Datetime. Data/ora pianificata per il trasferimento. Utile per pianificazione e priorità: influisce sulla preparazione e sulle prenotazioni delle scorte.
11. date_deadline
Tipo: Datetime. Termine o scadenza del trasferimento, spesso derivata dall’ordine di vendita o acquisto. Usata per segnalare ritardi e rispettare le promesse al cliente.
12. date_done
Tipo: Datetime. Data di validazione (o cancellazione). Campo di sola lettura impostato automaticamente quando il picking viene finalizzato.
13. priority
Tipo: Selection. Livello di priorità: ordini urgenti vengono riservati prima. Utile per gestire le code di evasione.
14. move_type
Tipo: Selection. Politica di spedizione: consegna parziale appena possibile oppure solo quando tutte le righe sono pronte. Influisce sul comportamento di processamento.
15. user_id
Tipo: Many2one (res.users). Utente responsabile del picking. Serve per assegnazioni e bilanciamento dei carichi; di default è l’utente che crea il record.
16. company_id
Tipo: Many2one (res.company). Società di appartenenza, normalmente ereditata dal picking type. Rilevante in ambienti multi-company per isolare dati e politiche.
17. group_id
Tipo: Many2one (procurement.group). Gruppo di approvvigionamento: collega movimenti correlati (es. più pickings derivanti dallo stesso ordine).
18. backorder_id
Tipo: Many2one (stock.picking). Se un trasferimento viene parzialmente validato, il backorder creato per il resto rimanda al picking originale tramite questo campo.
19. backorder_ids
Tipo: One2many (stock.picking). Elenco dei backorder generati da questo picking; utile quando la validazione avviene per parti e il resto resta da processare.
20. return_id
Tipo: Many2one (stock.picking). Se il picking è stato creato come reso, questo campo collega al trasferimento originale e supporta i flussi di ritorno merce.
21. note
Tipo: Html. Note interne visibili agli operatori di magazzino: istruzioni speciali, condizioni di handling o informazioni operative.
22. signature
Tipo: Image. Firma raccolta alla convalida della consegna, usata come prova di avvenuta ricezione e memorizzata come allegato.
23. is_signed
Tipo: Boolean. Valore calcolato dalla presenza della firma; indica se la consegna è stata firmata.
24. owner_id
Tipo: Many2one (res.partner). Proprietario della merce al momento della validazione: utile per gestione di conto deposito o beni di terzi.
25. package_level_ids
Tipo: One2many (stock.package_level). Livelli di imballaggio quando si utilizza il flusso 'put in pack': raggruppa le righe di movimento in pacchi per la spedizione.
26. create_date
Tipo: Datetime. Data di creazione del record. Gestita automaticamente dal framework di Odoo.
27. write_date
Tipo: Datetime. Data dell’ultima modifica del record. Aggiornata automaticamente dal sistema.
28. active
Tipo: Boolean. Flag per soft-delete: se False il record è archiviato ma non cancellato fisicamente.
Come questo modello si integra nei processi aziendali
1. Vendite e spedizioni
Alla conferma di un ordine di vendita Odoo crea un picking di uscita collegato all’ordine (origin). Gli operatori di magazzino eseguono picking e imballaggio, quindi validano il trasferimento: lo stato evolve da 'draft' a 'ready' e infine 'done'.
2. Acquisti e ricevute
Quando un ordine di acquisto viene confermato si genera un picking in ingresso. La merce passa dalla posizione del fornitore al magazzino: il partner_id indica il fornitore e la validazione aggiorna le quantità di magazzino.
3. Trasferimenti interni
Spostare scorte tra depositi o ubicazioni interne genera pickings con picking_type impostato su 'internal'. Sia origine che destinazione sono posizioni interne del magazzino.
4. Resi e backorder
Per un reso di vendita viene creato un picking di ritorno che punta al picking originale tramite return_id. Nei casi di validazione parziale, i restanti articoli vengono spostati in backorder collegati al picking iniziale.
5. Produzione e fabbrica
Gli ordini di produzione generano pickings per il prelievo delle materie prime e per l’ingresso dei prodotti finiti. Il modulo MR P estende stock.picking per gestire questi scenari di consumo e rientro.
In che modo gli sviluppatori estendono questo modello
Gli sviluppatori possono estendere stock.picking con diversi approcci; l’ereditarietà del modello è la tecnica principale in Odoo.
Ereditarietà del modello
Dichiarando _inherit = 'stock.picking' si estende il modello esistente: si possono aggiungere campi, sovrascrivere metodi o aggiungere vincoli. Questa pratica mantiene le modifiche nel tuo modulo, facilitando aggiornamenti e manutenzione.
Aggiungere campi
Nei moduli ereditati definisci i campi necessari usando i tipi appropriati (Char, Many2one, Boolean, Integer, Text, Selection). Valuta la dipendenza da company per campi che devono comportarsi diversamente in contesti multi-company.
Estensioni Python
Sovrascrivi metodi come button_validate, action_assign o _create_backorder per inserire logica personalizzata. Richiama sempre super() quando necessario e fai attenzione alle transizioni di stato e alla creazione dei movimenti.
Odoo Studio
Odoo Studio consente di aggiungere campi e personalizzazioni senza codice: ottimo per modifiche rapide come etichette o campi informativi. Per logiche complesse o integrazioni con corrieri è però preferibile sviluppare moduli dedicati.
Buone pratiche
- Imposta sempre il picking_type_id quando crei pickings manualmente: determina le ubicazioni predefinite e il comportamento del trasferimento.
- Usa il campo origin per mantenere la tracciabilità verso il documento sorgente: semplifica report, debug e riconciliazioni.
- Nelle integrazioni via API il modello stock.picking è accessibile: crea movimenti attraverso la relazione move_ids. Evita di creare pickings vuoti senza movimenti, perché non rappresentano trasferimenti reali.
- Utilizza scheduled_date per la pianificazione operativa: influisce su prenotazioni e priorità di evasione.
- Per i campi custom usa il prefisso
x_o un prefisso legato al tuo modulo per evitare collisioni con futuri campi standard di Odoo.
Errori comuni
- Creare pickings senza specificare il picking_type_id: questo provoca assegnazioni di ubicazioni predefinite errate e comportamenti inattesi.
- Modificare move_ids dopo la conferma senza conoscere la macchina a stati: le transizioni possono essere complesse e rompere le regole di riserva.
- Dimenticare di impostare partner_id per le consegne: questo impedisce la stampa di documenti corretti e blocca integrazioni con corrieri.
- Sovrascrivere button_validate senza chiamare
super(): può interrompere la creazione di backorder e rompere l’integrazione con altri moduli. - Dare per scontato che move_ids e move_line_ids siano sempre sincronizzati: le move_line vengono generate in fase di riserva o quando si usa il picking dettagliato, quindi il loro stato può differire.
Conclusione
Il modello stock.picking è il fulcro dell’inventario in Odoo: raccoglie spedizioni, ricevute e trasferimenti. Conoscere i suoi campi e le estensioni ti aiuta a configurare, personalizzare e integrare Odoo con sicurezza.
Che tu sia un consulente funzionale a mappare processi di magazzino o uno sviluppatore che costruisce moduli personalizzati, padroneggiare stock.picking riduce errori e tempi di implementazione.
Pronto a ottimizzare il tuo magazzino Odoo
Dasolo supporta le aziende nell’implementazione, personalizzazione e ottimizzazione di Odoo. Ci concentriamo su integrazioni API e sviluppo su misura, con esperienza consolidata nella struttura dati di Odoo e modelli come stock.picking.
Se ti serve supporto per l’implementazione di Odoo, moduli di magazzino personalizzati o integrazioni, possiamo aiutarti. Prenota una demo per discutere il tuo progetto.