--- title: "Mapping ERP-WMS - Changement article et propriétaire" tags: [ERP, mapping, CHG, STR, article, propriétaire, custom, cst-chg-wf, api] status: draft standard_ref: concepts/erp-interface.md jira_refs: [LIM-90, LIM-113] confluence_refs: [] sources: [FR-SW-04-07_LIMAGRAIN_Functional_Analysis_V1.5.docx, "CR CONSOLIDES REU ERP LIMAGRAIN V1 - CR.md", "Jira LIM-90 (revue de code terminée 2026-06-03)", "Jira LIM-113 (lecture directe 2026-07-20)"] last_updated: 2026-07-20 author: Arthur --- # Mapping ERP-WMS - Changement article et propriétaire > **Résumé** : processus [CUSTOM] de changement d'article et de propriétaire > en cours de vie du stock, via message CHG. > **Standard EasyWMS** : → voir [ERP Integration](../../concepts/erp-interface.md) > Ce qui suit documente les **spécificités Limagrain** par rapport au standard. > Voir aussi : [Données principales et stock](donnees-principales.md) pour > le mapping complet ITM, attributs logistiques et architecture article/lot. ## Contexte projet Chez Limagrain, l'article (numéro, description et destination) et le propriétaire peuvent être modifiés en cours de vie du stock. Ces changements sont notifiés par un message CHG descendant de SAP vers EasyWMS. Le message standard STR (Stock Transfer Request) est aussi utilisé pour les demandes de changement de statut de stock. ## Message STR - Demande de Changement de Stock ### Cas d'usage L'ERP envoie un STR pour : - Changement de code article (produit SAP + description) - Changement de propriétaire - Blocage/déblocage de lot ### Règles d'acceptation - **Accepté** si la palette n'est pas assignée à une commande ou en cours de mouvement - **Refusé** si palette "client" ou en préparation → code erreur API explicite (ERR renvoyé à SAP) ### Interaction STV/GNA L'ajustement de stock avec motif "STR" est filtré par le middleware GNA (pas de retraitement STV pour éviter les doublons). Ce mécanisme devient caduc si le STV est globalement désactivé (décision 30/04/2026). ### Monitoring Limagrain mettra en place un **monitoring des erreurs** STR pour les cas de refus. Les refus sont attendus en fonctionnement normal (palette en cours de préparation au moment du STR). ## Message CHG - Changement article / propriétaire (LIM-113) > **Statut (LIM-113)** : En cours - revue fonctionnelle uniquement ; dévs non > démarrés, en attente de validation technique client (Arthur 06/07). ### Objectif et contexte SAP demande au WMS de modifier une **ligne de stock existante** (code article, propriétaire, destination et attributs logistiques induits) **sans mouvement physique** de la palette. Cas principal : **bascule de propriétaire** lors des clôtures fiscales (ex. `FR10` → `FR02`, deux sociétés juridiques distinctes), où tout ou partie du stock d'une société est vendu à l'autre par une opération purement comptable/légale. Ce flux va **à l'encontre de la règle d'or** (le WMS est maître de l'état physique du stock ; toute variation est normalement initiée par le WMS). Le CHG demande au WMS de subir un ordre sur son propre stock. Il est donc **encadré** : le WMS ne modifie le stock que si la HU **et** ses lignes de stock ne sont engagées dans **aucun** processus, sinon il **refuse**. ### Mécanisme d'appel SAP appelle la commande `StartWorkflowCommand` (`Mecalux.ITSW.Application.CommonApplication.Commands.StartWorkflowCommand`) sur `CustomApplication`, `ProcessName = CST_CHG_WF` (WF custom à développer de zéro). SAP envoie **l'identité complète de la palette** : toutes les valeurs cibles, pas seulement les champs modifiés, pas de couple ancienne/nouvelle valeur. ### Champs modifiables (JSON reçu) | Attribut (JSON) | Sémantique | Exemple | |-----------------|-----------|---------| | `containerCode` | Code HU (clé primaire) | `036607231001292781` | | `ContainerTypeCode` | Type de support | `PALETTE_US` | | `productCode` | Code article | `2025078581` | | `Quantity` | Quantité | `1.000` | | `UnitOfMeasureCode` | Unité de mesure | `BAG` | | `LotCode` | Lot (code produit SAP) | `000000000000384823` | | `Color` | Propriétaire SAP | `FR10` | | `Source` | Description courte SAP | `SC04-FERT-B 400KG-BE-NEU` | | `Size` | Pays de destination | `BE` | > **Statut de stock explicitement EXCLU du CHG.** Le changement de statut > passe par le flux **STR standard** (voir ci-dessus), inchangé. Le WF > `CST_CHG_WF` **ignore** le champ statut même s'il est présent dans le JSON. > > ⚠️ Pour changer **à la fois** un attribut **et** le statut d'une même HU : > **deux appels API distincts** (CHG puis STR). Risque assumé : l'un peut > passer et l'autre échouer (travail à moitié fait) → le client gère le rejeu > de l'appel en erreur. ### Logique du workflow `CST_CHG_WF` 1. **Récupération HU + identification de la ligne** : clé = `containerCode` ; lister toutes les lignes de stock de la HU ; identifier la bonne ligne en comparant les attributs reçus (une HU peut porter plusieurs lignes). HU inexistante ou aucune ligne correspondante → refus (message explicite). 2. **Vérification « HU et lignes libres de tout flux »** : reprendre la logique de **ADB-117** (batterie de `Count()` sur les tables métier), mais appliquée au **code support et aux lignes de stock** (pas à l'article). Différence majeure : ADB-117 supprimait du stock ; ici on ne supprime rien. Si la HU ou une ligne est présente dans **autre chose** que les tables Stocks / Support → **refus**. Tables à contrôler (liste **indicative**, exhaustivité à établir par le dev) : ProductLocations / lignes réservées ou assignées, Tasks, OutboundOrders(Lines), Receptions(Lines), InboundOrders(Lines), chargements camion, tournées, vagues, workorders, inventaires (lignes), livraisons, colis, ajustements de stock. 3. **Refus tout ou rien** : si **une seule** ligne (ou la HU) est engagée → refus **intégral** du CHG. Le message précise **quelle ligne** et **dans quelle(s) table(s)/flux** elle est engagée. 4. **Idempotence** : comparer champ par champ les valeurs cibles aux valeurs actuelles. Si **toutes** déjà en place → **OK (200)** sans rien tenter ; sinon appliquer les champs qui diffèrent. 5. **Application** : si HU + ligne libres → appliquer les nouvelles valeurs (article, propriétaire, destination, attributs logistiques) et renvoyer **200**. ### Acquittement API et notification - **Succès** → WF terminé normalement → API **200**. - **Échec (refus métier ou erreur)** → **throw d'une exception HTTP 500** avec le message d'erreur complet. > ⚠️ **Contrainte technique built-in** : le seul moyen de renvoyer un message > d'erreur exploitable sur ce type d'appel `StartWorkflowCommand` est de > **throw une exception (500)**. Il n'existe pas d'acquittement négatif propre > (200 + payload de refus). Un CHG refusé pour raison métier normale (palette > dans un flux) remonte donc techniquement comme un **500** : SAP doit > l'interpréter comme un **refus métier** (pas un plantage), lire le message, > débloquer, puis rejouer. À communiquer à Limagrain. En complément, le WMS génère une **notification interne** en cas de refus, pour traitement manuel par un gestionnaire formé (paramétrage standard + léger custom potentiel ; mécanisme de notifications/alertes standard à vérifier en doc Confluence). ### Volumétrie et cible fonctionnelle - Pas de flux régulier de faible volume mais des **vagues** liées aux clôtures : jusqu'à ~1000 lignes d'un coup, jusqu'à **un tiers du stock** sur 2 jours. Limagrain envoie des **messages unitaires** (ex. 1000 appels plutôt qu'un message groupé). **À valider (Mecalux)** : traitement **synchrone ou asynchrone / arrière-plan** pour tenir la charge sans bloquer les flux 24/7. - Cible : ~**90 %** des changements passent s'ils sont envoyés au bon moment ; ~**10 %** (palette dans un flux) → refus + correction manuelle par un gestionnaire. Pas de sur-automatisation initiale. ## Statut de stock ### Changement sur poste de travail [CUSTOM] L'utilisateur peut changer le statut du stock sur le poste de travail **uniquement** lors du processus de **retour commandes clients**, pour appliquer : - **F9** - Sacs sales - **B6** - Non conforme Un commentaire est associé au statut. > ⚠️ **Mise à jour (LIM-90)** : le **STC est désactivé** (décision 30/04). > Pour les retours client, les statuts sont remontés dans le **REF** via > les balises ZLOG/ZINCO (codes SAP). Hors retour, seul le B6 remonte, > via le **LOC** (action R/U). Catalogue des 8 statuts + balises REF : > voir [Réception retour](../01-inbound/reception-retour.md#statuts-de-stock-retour-et-remontée-ref-lim-90). ### Attributs du statut de stock [CUSTOM] 3 attributs relatifs au statut de stock chez Limagrain : 1. **Statut de stock** : valeur du statut (ex : F9, B6) 2. **Commentaire** : raison du changement (liste déroulante contextuelle) 3. **Date de changement** : horodatage automatique Les commentaires sont présentés sous une liste déroulante avec les possibilités dépendant du statut sélectionné. ### Autonomie Limagrain Limagrain peut créer ses propres statuts de stock : - Menu « Données principales » → « Types de verrous » → « Statut de stock » - Bouton « Nouveau » → remplir les champs requis ## Diagramme de séquence - Changement article ```mermaid sequenceDiagram participant SAP participant WMS as EasyWMS (CST_CHG_WF) SAP->>WMS: StartWorkflowCommand CST_CHG_WF (identité complète HU) WMS->>WMS: Récupère HU + identifie la ligne de stock alt HU et lignes libres de tout flux WMS->>WMS: Applique article/propriétaire/destination (idempotent) WMS-->>SAP: 200 (OK) else HU/ligne engagée dans un flux, ou HU/ligne introuvable WMS->>WMS: Notification interne (gestionnaire) WMS-->>SAP: throw exception 500 (motif + table/flux) end ``` ## Diagramme de séquence - Changement statut (retour client) ```mermaid sequenceDiagram participant OP as Opérateur participant WMS as EasyWMS participant SAP OP->>WMS: Changement statut (F9 ou B6) + commentaire WMS->>WMS: MAJ statut ligne de stock WMS->>SAP: REF avec ZLOG/ZINCO à la clôture (LIM-90) ``` > ⚠️ Diagramme mis à jour (LIM-90) : la remontée se fait via le **REF** > (balises ZLOG/ZINCO) à la clôture de la réception retour, **pas via > STC** (désactivé). ## Points d'attention ⚠️ Le CHG renvoie **200** en cas de succès et **500** (throw exception) en cas de refus métier ou d'erreur. Le 500 n'est **pas** un plantage mais peut être un refus attendu (palette engagée dans un flux) - SAP doit lire le message pour savoir quoi débloquer avant de rejouer (LIM-113). ⚠️ Le **statut de stock est exclu du CHG** : il passe par le STR. Changer un attribut **et** le statut = **deux appels** distincts (CHG puis STR). ⚠️ Refus **tout ou rien** : une seule ligne engagée bloque l'intégralité du CHG sur la HU. ⚠️ Le changement de statut sur poste est limité au processus retour client (pas en picking ni en regroupement). ⚠️ Le message STR (standard) est aussi utilisé pour des demandes de changement de statut initiées par SAP. ## Questions ouvertes - [x] ~~Liste exhaustive des statuts de stock Limagrain prévus au démarrage~~ → **Résolu** (LIM-90) : 8 statuts retour (F9 + 7 motifs B6), F2 = absence. → voir [Réception retour](../01-inbound/reception-retour.md#statuts-de-stock-retour-et-remontée-ref-lim-90) - [x] ~~Liste des commentaires par statut - validée ?~~ → **Résolu** (LIM-90) : libellés/motifs définis (ZINCO 0002-0008). Blocages à confirmer client. - [x] ~~CHG envoie-t-il un acquittement positif ou juste ERR en cas d'échec ? (@Nicolas)~~ → **Résolu** (LIM-113) : **200** en succès, **500** (throw exception) en refus/erreur ; pas d'acquittement négatif propre, le 500 véhicule le motif - Identification de la ligne de stock concernée dans la HU (une HU peut porter plusieurs lignes) : critère de comparaison des attributs reçus à préciser (@Vincent, commentaire 07/07) - Traitement **synchrone ou asynchrone / arrière-plan** des appels CHG pour tenir la volumétrie des clôtures (~1000 lignes) sans bloquer les flux 24/7 (@Nicolas / Mecalux) - Liste **exhaustive** des tables/entités où une HU ou une ligne de stock peut être référencée/verrouillée (au-delà de la liste indicative ADB-117) - action développeur ## Historique des modifications | Date | Auteur | Modification | |------|--------|--------------| | 2026-05-05 | Arthur | Création initiale depuis AF V1.5 | | 2026-05-06 | Arthur | Ajout section STR détaillée (CR consolidé ERP) | | 2026-07-17 | Arthur | LIM-90 : STC désactivé → remontée statuts retour via REF (ZLOG/ZINCO), diagramme corrigé, 2 questions statuts résolues (renvoi catalogue réception-retour) | | 2026-07-20 | Arthur | LIM-113 (lecture directe, En cours) : refonte complète de la section CHG - objectif/contexte (bascule propriétaire clôture fiscale FR10→FR02, règle d'or), mécanisme `StartWorkflowCommand`/`CST_CHG_WF` (identité complète), table des 9 champs JSON, statut exclu (STR séparé, 2 appels), logique WF en 5 étapes (récup HU + ID ligne, contrôle libre de flux façon ADB-117 sur HU/lignes, refus tout ou rien avec motif, idempotence, application), acquittement 200/500 (throw), notification interne, volumétrie clôtures ~1000 lignes + sync/async, cible 90/10 ; diagramme séquence CHG refondu ; points d'attention (200/500, statut exclu, tout ou rien) ; 1 question résolue (acquittement) + 3 nouvelles (ID ligne @Vincent, sync/async, liste exhaustive tables) ; front matter jira_refs +LIM-113/sources/tags/last_updated | ## Références | Source | Type | Date | |--------|------|------| | FR-SW-04-07_LIMAGRAIN_Functional_Analysis_V1.5 | Analyse fonctionnelle | 28/11/2025 | | CR CONSOLIDES REU ERP LIMAGRAIN V1 | CR ateliers interfaçage | 23/02/2026 | | [LIM-90](https://easywmsfrance.atlassian.net/browse/LIM-90) | Ticket Jira (statuts ZLOG/ZINCO) - revue de code terminée, préprod | 2026-06-03 | | [LIM-113](https://easywmsfrance.atlassian.net/browse/LIM-113) | Ticket Jira (flux API CHG, `CST_CHG_WF`) - En cours, revue fonctionnelle | 2026 | | ADB-117 | DevOps Athenza (logique `Count()` sur tables métier, réf. de reprise) | - | | DevOps 88942 | Work item Athenza (bsd-limagrain) | - |