Retour d’expérience sur la résolution d’un problème de gestion des numéros de série dans Odoo à partir d’un fichier XML

nasser 14/06/2024 (10:40) GMT

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 :

  1. S’assurer d’avoir activé le suivi des numéros de série dans les configurations de l’inventaire de chaque produit
  2. 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 et product_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 :

  1. Récupérer les produits, les quantités et les numéros de série dans le fichier XML.
  2. Vérifier la correspondance entre le nombre de numéros de série et la quantité de chaque produit
  3. Construire la variable context, un dictionnaire avec default_location_dest_id et default_product_id.
  4. Définir le mode qui sera "import".
  5. Construire le lot_text avec une ligne par numéro de série contenu dans le XML
  6. Appeler action_generate_lot_line_vals pour chaque ligne du stock picking.
  7. Écrire les tests unitaires pour valider le tout.
  8. 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+

Veuillez-vous connecter poster un commentaire

Projets et Missions Freelances pour Développeurs d'Applications

Explorez notre sélection de missions adaptées à votre expertise et à votre disponibilité pour mettre en valeur votre savoir-faire et gagner de l'argent.

Trouver un projet