On m’a souvent posé la question de savoir comment j’arrive à trouver une solution de code à un problème jusqu’à son implémentation. Bref, quelle est mon approche méthodique de A à Z face à un problème.
Dans cet article, je vais partager mon expérience sur un problème que j’ai imaginé : la récupération des numéros de série à partir d'un fichier XML et leur enregistrement lors de l'entrée en stock des produits.
Il s’agit d’une démarche méthodique basée sur un problème fictif qui va vous permettre de comprendre en profondeur mon raisonnement et peut-être pourrait vous aider à résoudre un problème pareil.
Attention : la solution finale n’est pas forcément la bonne, étant donné que c’est un problème qui a été imaginé. Mais il est important de noter que les fonctions Odoo existent bel et bien.
Le problème
Il s’agit de récupérer des numéros de série à partir d'un fichier XML et les enregistrer lors de l'entrée en stock des produits dans Odoo. Par exemple, le fichier en question pourrait ressembler à ceci
<products>
<product>
<name>Produit 1</name>
<default_code>ABC123</default_code>
<serial_number>SN001</serial_number>
<quantity>5</quantity>
</product>
<product>
<name>Produit 2</name>
<default_code>DEF456</default_code>
<serial_number>SN002</serial_number>
<quantity>3</quantity>
</product>
<product>
<name>Produit 3</name>
<default_code>GHI789</default_code>
<serial_number>SN003</serial_number>
<quantity>2</quantity>
</product>
</products>
En résumé, j’ai un bon de commande (purchase.order) dont la validation va déclencher le processus d’entrée en stock. Ensuite, lors de l’entrée en stock, je dois récupérer un fichier XML pour enregistrer les numéros de série de chaque produit du bon de commande. Le fichier XML pourrait venir du système informatique de mon fournisseur par exemple.
Face à un problème pareil, j’essaie d’abord de comprendre le besoin.
Étape 1 : Comprendre le Besoin
Je commence par lire le ticket et les besoins associés. Après une première simulation de la fonctionnalité sur Odoo en m’imaginant comment elle fonctionnerait, je réalise que certains aspects ne sont pas clairs. À ce niveau, je dois absolument contacter la personne responsable du ticket comme le chef de projet pour obtenir des explications détaillées ou bien pour lui poser des questions. Cette clarification est cruciale pour assurer une compréhension parfaite des exigences.
Une fois les exigences maitrisées, je peux passer à l’analyse du fichier XML.
Étape 2 : Analyse du Fichier XML
Le fichier XML contient les produits à entrer en stock, leur quantité et leurs numéros de série. Par exemple, un produit avec une quantité de 5 doit avoir 5 numéros de série. Il est donc essentiel de mapper correctement ce fichier avec le bon de commande (purchase.order) et, une fois le bon de commande validé, d'ajouter les numéros de série au transfert (stock.picking) correspondant.
En effet, je parle du mapping au niveau du bon de commande parce que le bon de commande est lié avec une relation One2many au transfert de stock. Il s’agit du champ purchase.order().picking_ids . Ensuite, lorsqu’on confirme le bon de commande, un transfert est directement créé. Il serait alors plus facile de faire le mapping à ce niveau là et profiter de la fonctionnalité de création du transfert pour éviter d’écrire un code de trop.
Étape 3 : Mapping et Confirmation du bon de commande
Après avoir effectué le mapping du fichier XML avec le bon de commande, il est possible de confirmer ce bon pour créer le stock picking. Voici les étapes à suivre :
- S’assurer d’avoir activé le suivi des numéros de série dans les configurations de l’inventaire de chaque produit
- Configurer les produits pour qu'ils soient suivis par numéro de série.
Après ces configurations, un petit onglet apparaît sur chaque ligne du transfert, ouvrant un assistant qui propose deux boutons : "Generate Serials/Lots" et "Import Serials/Lots".
Comme les fonctions de génération de numéro de série existent déjà, je vais explorer le code afin de passer tout simplement les numéros de série du fichier XML en argument de cette fonction. Le bouton qui me parle plus est Import Serials/Lots, car comme son nom l’indique, il permet de faire un import de numéros de séries.
Étape 4 : Exploration du Code Odoo
Pour comprendre les fonctions derrière ce bouton, je vais me rendre dans le code source d'Odoo. Après avoir activé le mode debug, j'ai remarqué que l'ouverture de l'assistant était gérée côté JavaScript. J'ai donc cherché dans le module stock et trouvé le fichier generate_serial.js
.
Capture du fichier generate_serial.js montrant l'appel à action_generate_lot_line_vals -> https://github.com/odoo/odoo/blob/17.0/addons/stock/static/src/widgets/generate_serial.js#L32
Capture de la fonction action_generate_lot_line_vals -> https://github.com/odoo/odoo/blob/2a02ba4de1c823bcdef0e8b6b6373fa27b5587a1/addons/stock/models/stock_move.py#L872
Je dois maintenant analyser cette action.
Étape 5 : Analyse de l'Action
L'action action_generate_lot_line_vals
prend plusieurs paramètres :
- Un contexte contenant
location_dest_id
etproduct_id
. - Le mode, qui peut être "serial" ou "import".
En mode "serial", il faut passer first_lot
comme premier numéro pour générer un ensemble, et ajouter count
pour limiter le nombre de numéros à générer. En mode "import", seul lot_text
est nécessaire. Le lot_text
est séparé par des nouvelles lignes ou des espaces, chaque ligne correspondant à un numéro suivi de la quantité.
Je vais encore aller au niveau du fichier XML pour voir les infos que je peux en tirer.
Étape 6 : Validation du XML
OK, je me rends compte qu’il est crucial de vérifier que le nombre de numéros de série correspond à la quantité spécifiée dans le fichier XML. Si ce n'est pas le cas, une exception doit être renvoyée.
Étape 7 : Implémentation du Code
Maintenant que tout est clair, voici les étapes pour implémenter la solution :
- Récupérer les produits, les quantités et les numéros de série dans le fichier XML.
- Vérifier la correspondance entre le nombre de numéros de série et la quantité de chaque produit
- Construire la variable context, un dictionnaire avec
default_location_dest_id
etdefault_product_id
. - Définir le mode qui sera "import".
- Construire le
lot_text
avec une ligne par numéro de série contenu dans le XML - Appeler
action_generate_lot_line_vals
pour chaque ligne du stock picking. - Écrire les tests unitaires pour valider le tout.
- Et pourquoi pas prendre en compte les numéros de série existants ?
Ça y’est, après quelques heures de codes, la solution est prête, je peux passer le ticket à l’étape suivante.
Si vous avez des questions ou des suggestions, veuillez laisser un commentaire.
A+