Introduction
Dans Odoo, les modèles définissent la façon dont les informations métier sont structurées et conservées. Chaque élément — commande, transfert de stock, opération d’entrepôt — repose sur un modèle qui organise champs, relations et règles métier dans la base de données.
Comprendre les modèles Odoo est indispensable tant pour les consultants fonctionnels que pour les développeurs. Ce sont eux qui définissent les données manipulées par l’application, les liens entre objets et la logique embarquée sur laquelle reposent les processus métiers.
Cet article met l’accent sur l’un des modèles essentiels du module Inventaire : stock.picking. Que vous configuriez des flux d’entrepôt, développiez des modules sur mesure ou connectiez des systèmes externes, vous croiserez très souvent ce modèle.
Qu’est-ce que le modèle stock.picking
Le modèle stock.picking sert à représenter un transfert de marchandises. C’est le point central où l’on suit l’avancement d’une opération d’entrepôt : chaque enregistrement correspond à un mouvement de produits d’un emplacement A vers un emplacement B.
Dans le module Inventaire, toute opération physique — réception fournisseur, livraison client ou transfert interne — génère un enregistrement stock.picking. La confirmation d’une commande de vente, la réception d’un bon de commande ou un déplacement entre entrepôts passent par ce modèle.
Le modèle est défini dans le module stock et sert de socle extensible : les autres modules l’enrichissent via l’héritage des modèles. Le module Vente ajoutera des champs liés à la livraison, Achats gérera les réceptions, Production intégrera les mouvements liés à la fabrication, sans réécrire la structure de base.
stock.picking hérite aussi de fonctionnalités collaboratives (mail.thread, mail.activity.mixin). Cela permet de suivre les modifications, poster des messages dans le chatter et planifier des actions liées à un transfert depuis la fiche picking.
Champs clés du modèle
Voici les champs principaux du modèle stock.picking. Les connaître facilite la configuration, le débogage et les développements autour des opérations d’entrepôt.
1. name
Type : Char. Référence du transfert, généralement générée par une séquence (ex. WH/OUT/00001). Visible en en-tête de la fiche, c’est l’identifiant principal utilisé par les utilisateurs et les rapports.
2. origin
Type : Char. Référence du document source : nom de la commande de vente, numéro de commande d’achat, etc. Utile pour retracer l’origine du transfert lors d’analyses ou d’audits.
3. state
Type : Selection. État du transfert (Draft, Waiting Another Operation, Waiting, Ready, Done, Cancelled). L’état conditionne les actions disponibles et est calculé à partir des mouvements associés.
4. picking_type_id
Type : Many2one (stock.picking.type). Type d’opération : réception, livraison ou transfert interne. Champ requis qui définit les emplacements source/destination par défaut et le comportement associé.
5. move_ids
Type : One2many (stock.move). Lignes de mouvements. Chaque ligne précise le produit et la quantité à déplacer — c’est le cœur fonctionnel du picking, là où s’applique la logique de réservation et de disponibilité.
6. move_line_ids
Type : One2many (stock.move.line). Opérations détaillées : lots, numéros de série, emplacements précis. Utilisé lors du picking, de l’emballage et de la validation pour tracer les unités physiques.
7. location_id
Type : Many2one (stock.location). Emplacement source : d’où proviennent les produits. Champ requis ; pour une livraison, il s’agira souvent de l’emplacement stock, pour une réception du lieu fournisseur.
8. location_dest_id
Type : Many2one (stock.location). Emplacement de destination : où les produits sont déplacés. Champ requis ; pour une livraison il s’agit souvent de l’emplacement client ou d’expédition, pour une réception de l’emplacement stock.
9. partner_id
Type : Many2one (res.partner). Partenaire lié à l’opération : client pour les livraisons, fournisseur pour les réceptions. Sert aux adresses sur les documents et aux intégrations transporteur.
10. scheduled_date
Type : Datetime. Date prévue de traitement du transfert. Utilisée pour la planification et la priorisation ; la fixer influence la date attendue des mouvements associés.
11. date_deadline
Type : Datetime. Date limite liée au document source (commande vente/achat). Permet d’identifier les retards et de gérer les promesses de livraison au client.
12. date_done
Type : Datetime. Date de validation (ou d’annulation) du transfert. Champ en lecture seule mis à jour automatiquement lorsque le picking est passé en Done.
13. priority
Type : Selection. Niveau de priorité du transfert. Lors de la réservation, les transferts à priorité élevée sont servis en premier, utile pour les commandes urgentes.
14. move_type
Type : Selection. Politique d’expédition : dès que possible (livraison partielle possible) ou quand tout est prêt (tous les produits nécessaires). Impacte le déclenchement du traitement du picking.
15. user_id
Type : Many2one (res.users). Utilisateur responsable du transfert. Sert à l’affectation des tâches et au suivi de la charge de travail ; valeur par défaut : utilisateur courant à la création.
16. company_id
Type : Many2one (res.company). Société propriétaire du transfert. Dans les environnements multi-sociétés, ce champ indique à quelle entité appartient le picking.
17. group_id
Type : Many2one (procurement.group). Groupe de procurement : permet de regrouper les mouvements issus d’une même commande ou d’un même processus.
18. backorder_id
Type : Many2one (stock.picking). Quand une validation est partielle, un backorder est créé pour le reliquat ; ce champ pointe vers le picking original.
19. backorder_ids
Type : One2many (stock.picking). Ensemble des backorders issus d’un picking. Utile pour suivre ce qui reste à exécuter après une validation partielle.
20. return_id
Type : Many2one (stock.picking). Si le picking est issu d’un retour, ce champ relie l’enregistrement au picking d’origine pour tracer la chaîne.
21. note
Type : Html. Notes internes visibles par l’équipe d’entrepôt : consignes particulières, précautions de manutention ou autres remarques opérationnelles.
22. signature
Type : Image. Signature capturée lors de la validation de la livraison. Sert de preuve de livraison et est stockée comme pièce jointe.
23. is_signed
Type : Boolean. Calculé à partir de la présence d’une signature. Indique si la livraison a été signée par le destinataire.
24. owner_id
Type : Many2one (res.partner). Propriétaire des produits au moment de la validation (utile pour le consignation ou pour des produits appartenant à un tiers).
25. package_level_ids
Type : One2many (stock.package_level). Niveaux d’emballage utilisés par le mécanisme « put in pack ». Permet de regrouper les move lines par colis pour l’expédition.
26. create_date
Type : Datetime. Date de création de l’enregistrement. Gestion automatique héritée du modèle de base.
27. write_date
Type : Datetime. Date de dernière modification. Mise à jour automatique pour le suivi des changements.
28. active
Type : Boolean. Indicatif d’archivage (soft delete). Lorsqu’il est à False, l’enregistrement est considéré comme archivé.
Comment ce modèle s’intègre aux processus métiers
1. Ventes et livraisons
À la confirmation d’une commande de vente, Odoo génère un bon de livraison (stock.picking) lié via le champ origin. L’équipe d’entrepôt prépare, emballe puis valide : l’état évolue de brouillon à prêt puis à réalisé.
2. Achats et réceptions
Quand une commande d’achat est confirmée, Odoo crée une réception entrante. Le picking matérialise le transfert depuis le lieu fournisseur vers le stock ; partner_id indique le fournisseur et la validation met à jour les quantités en stock.
3. Transferts internes
Les déplacements entre emplacements internes ou entre entrepôts produisent des pickings de type interne (picking_type_id.code = 'internal'). Les deux emplacements sont des emplacements de stock interne.
4. Retours et reliquats
Les retours génèrent des pickings spécifiques reliés au picking original via return_id. En cas de validation partielle, des backorders sont créés et répertoriés dans backorder_ids pour la suite du traitement.
5. Production et industrie
Les ordres de fabrication génèrent des pickings pour la consommation des composants et la réception des produits finis. Le module MRP étend stock.picking pour intégrer ces flux de production.
Comment les développeurs l’étendent
Les développeurs disposent de plusieurs méthodes pour étendre stock.picking, l’héritage des modèles étant le mécanisme principal.
Héritage de modèle
Déclarez _inherit = 'stock.picking' dans un module pour enrichir le modèle : ajouter des champs, redéfinir des méthodes ou ajouter des contraintes. L’approche permet de conserver les modifications dans un module séparé et facilite les mises à jour.
Ajout de champs
Créez de nouveaux champs dans le modèle hérité en choisissant soigneusement le type (Char, Many2one, Boolean, Integer, Text, Selection). Pensez aux champs dépendant de la société dans les environnements multi-sociétés.
Extensions Python
Surchagez des méthodes comme button_validate, action_assign ou _create_backorder pour injecter de la logique métier. Utilisez super() pour préserver le comportement d’origine et soyez prudent avec les transitions d’état et la création de mouvements.
Odoo Studio
Odoo Studio permet d’ajouter des champs sans coder, utile pour des ajustements rapides ou des étiquettes personnalisées. Pour des règles complexes, intégrations transporteurs ou logique métier critique, préférez un module personnalisé pour la maintenabilité.
Bonnes pratiques
- Toujours définir picking_type_id lors de la création manuelle d’un picking. Ce champ conditionne les emplacements par défaut et le comportement opérationnel.
- Utilisez origin pour garder la traçabilité vers le document source. C’est précieux pour les rapports, le support et le débogage.
- Pour les intégrations API, le modèle stock.picking est exposé par l’API Odoo. Créez les mouvements via la relation move_ids plutôt que d’essayer de créer des pickings vides : un picking sans mouvements n’a pas de sens fonctionnel.
- Exploitez scheduled_date pour la planification : elle influence la réservation et la priorisation des pickings dans les vues et les règles d’allocation.
- Pour les champs personnalisés, utilisez le préfixe x_ ou un préfixe lié à votre module afin d’éviter les collisions avec les futures versions d’Odoo.
Erreurs fréquentes
- Créer des pickings sans renseigner picking_type_id : risque de mauvais emplacements par défaut et de comportements imprévus.
- Modifier move_ids après confirmation sans maîtriser la machine à états : les transitions et règles de réconciliation des mouvements sont complexes et peuvent provoquer des incohérences.
- Oublier partner_id sur les livraisons : les services transport et la génération d’étiquettes/documentation peuvent échouer sans contact défini.
- Surcharger button_validate sans appeler super() : vous risquez de casser la création de backorders et d’impacter d’autres modules dépendants.
- Penser que move_ids et move_line_ids sont systématiquement synchronisés : les move_lines n’apparaissent qu’après réservation ou lors d’opérations détaillées — attention aux hypothèses lors des scripts ou intégrations.
Conclusion
Le modèle stock.picking est au cœur de la gestion des stocks dans Odoo : il enregistre réceptions, livraisons et transferts. Maîtriser ses champs et son extension facilite la configuration, la personnalisation et l’intégration de l’ERP.
Que vous cartographiez des processus d’entrepôt en tant que consultant fonctionnel ou que vous développiez des modules sur mesure, une bonne compréhension de stock.picking vous fera gagner du temps et évitera des erreurs coûteuses.
Prêt à optimiser votre entrepôt Odoo
Dasolo accompagne les entreprises dans l’implémentation, la personnalisation et l’optimisation d’Odoo. Nous sommes spécialisés en intégrations API et développement Odoo, avec une expérience approfondie de l’architecture des données et des modèles comme stock.picking.
Besoin d’aide pour votre implémentation Odoo, un module d’entrepôt sur mesure ou une intégration ? Notre équipe est à votre disposition. Réservez une démo pour discuter de votre projet.