lint(limagrain): corrections completes Phase 1+2

- Bloquants: mermaid 03-picking/_index reconstitue (archive 11-05), 13 liens vers pages squelette retires, 2 liens recibles (anoxie, application-dictionary)
- Conventions: 910 em dashes -> tirets simples, 145 checklists -> puces question, 13 questions resolues barrees
- Liens: 9 ancres reparees (slugs GitHub)
- Delta: 12 standard_ref remappes, blocs Standard EasyWMS + sections References ajoutes, front matter complete
- Glossaire: 15 termes standard deplaces en section rappel avec renvoi
- Rapport: limagrain/_lint_report.md (Phase 1 + Phase 2 + re-scan final)
- Inclut les pages des sessions precedentes non commitees + CLAUDE.md et consume.log en l'etat
This commit is contained in:
2026-07-20 12:56:42 +02:00
parent 23eb3f3c84
commit 7496aafe64
59 changed files with 6457 additions and 2023 deletions
@@ -1,16 +1,16 @@
---
title: "Mapping ERP-WMS Changement article et propriétaire"
tags: [ERP, mapping, CHG, STR, article, propriétaire, custom]
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: architecture/erp-integration.md
jira_refs: []
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"]
last_updated: 2026-05-06
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
# 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.
@@ -30,7 +30,7 @@ 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
## Message STR - Demande de Changement de Stock
### Cas d'usage
@@ -59,26 +59,113 @@ 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
## Message CHG - Changement article / propriétaire (LIM-113)
### Contenu du message
> **Statut (LIM-113)** : En cours - revue fonctionnelle uniquement ; dévs non
> démarrés, en attente de validation technique client (Arthur 06/07).
| Champ | Description | Modifié si |
|-------|-------------|------------|
| Numéro de HU | Identifiant palette | Toujours présent |
| Lot Officiel | Lot de référence | Toujours présent |
| Code nouvel article | Nouveau code article | Changement article |
| Description nouvel article | Libellé | Changement article |
| Destination | Nouvelle destination | Changement article |
| Propriétaire Limagrain | Nouveau propriétaire | Changement propriétaire |
### Objectif et contexte
### Contrainte d'exécution
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.
Le changement ne peut avoir lieu **que si le stock n'est pas assigné à
un processus** (picking, expédition, regroupement, etc.).
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**.
Si le stock est assigné → le message CHG génère un message **ERR** pour
informer SAP que le changement est impossible.
### 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
@@ -88,11 +175,16 @@ informer SAP que le changement est impossible.
travail **uniquement** lors du processus de **retour commandes clients**,
pour appliquer :
- **F9** Sacs sales
- **B6** Non conforme
- **F9** - Sacs sales
- **B6** - Non conforme
Un commentaire est associé au statut et remonté dans le message d'interface
(STC) pour informer l'ERP.
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
@@ -112,23 +204,25 @@ 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
## Diagramme de séquence - Changement article
```mermaid
sequenceDiagram
participant SAP
participant WMS as EasyWMS
participant WMS as EasyWMS (CST_CHG_WF)
SAP->>WMS: CHG (nouveau code article, description, destination)
alt Stock non assigné
WMS->>WMS: MAJ article sur les lignes de stock
Note over WMS: Pas de confirmation retour
else Stock assigné à un processus
WMS->>SAP: ERR (changement impossible)
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)
## Diagramme de séquence - Changement statut (retour client)
```mermaid
sequenceDiagram
@@ -138,13 +232,25 @@ sequenceDiagram
OP->>WMS: Changement statut (F9 ou B6) + commentaire
WMS->>WMS: MAJ statut ligne de stock
WMS->>SAP: STC (notification changement statut)
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 ne renvoie pas de confirmation positive — seule l'erreur (ERR)
est remontée si le changement échoue.
⚠️ 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).
@@ -154,9 +260,21 @@ changement de statut initiées par SAP.
## Questions ouvertes
- [ ] Liste exhaustive des statuts de stock Limagrain prévus au démarrage (@Justine)
- [ ] Liste des commentaires par statut — validée ? (@Justine)
- [ ] CHG envoie-t-il un acquittement positif ou juste ERR en cas d'échec ? (@Nicolas)
- [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
@@ -164,6 +282,8 @@ changement de statut initiées par SAP.
|------|--------|--------------|
| 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
@@ -171,3 +291,7 @@ changement de statut initiées par SAP.
|--------|------|------|
| 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) | - |