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
+4 -5
View File
@@ -1,11 +1,11 @@
---
title: "Interface ERP Vue d'ensemble"
title: "Interface ERP - Vue d'ensemble"
tags: [erp, interface, messages, index]
status: draft
last_updated: 2026-05-05
last_updated: 2026-07-20
---
# Interface ERP Vue d'ensemble
# Interface ERP - Vue d'ensemble
> **Périmètre** : catalogue de messages ERP (SOR, RUT, SOF, LOF, ASN),
> mapping champs ERP↔WMS, monitoring de l'interface.
@@ -16,10 +16,9 @@ last_updated: 2026-05-05
- [Référence messages](messages-reference.md)
- [Données principales et stock](donnees-principales.md)
- [LOC Message périodique](loc-message-periodique.md)
- [LOC - Message périodique](loc-message-periodique.md)
- [Intégration GNA → SAP-CPI](gna-sap-cpi.md)
- [Mapping ERP-WMS](mapping-erp-wms.md)
- [Monitoring interface](interface-monitoring.md)
## Vue synthétique de l'interface ERP Limagrain
@@ -1,16 +1,16 @@
---
title: "Données principales et stock Mapping ITM et attributs"
title: "Données principales et stock - Mapping ITM et attributs"
tags: [ERP, ITM, article, stock, attributs-logistiques, lot-SAP, mapping, CstAtt]
status: draft
standard_ref: architecture/erp-integration.md
jira_refs: []
standard_ref: concepts/erp-interface.md
jira_refs: [LIM-92]
confluence_refs: ["Données principales + stock - LIMAGRAIN - DEV"]
sources: ["Données principales + stock - LIMAGRAIN - DEV - Confluence.md", "CR CONSOLIDES REU ERP LIMAGRAIN V1 - CR.md"]
last_updated: 2026-05-06
sources: ["Données principales + stock - LIMAGRAIN - DEV - Confluence.md", "CR CONSOLIDES REU ERP LIMAGRAIN V1 - CR.md", "Jira LIM-92 (lecture directe, attente déploiement test)"]
last_updated: 2026-07-17
author: Arthur
---
# Données principales et stock Mapping ITM et attributs
# Données principales et stock - Mapping ITM et attributs
> **Résumé** : architecture retenue pour la gestion des articles et du stock
> dans EasyWMS chez Limagrain, mapping du message ITM, attributs logistiques,
@@ -36,8 +36,8 @@ différents (ex. : changement de destination).
| Relation | Type | Statut |
|----------|------|--------|
| Lot SAP ↔ Lot Officiel | 1 pour 1 | ✅ Validé par Limagrain |
| Code article WMS = Code lot SAP | | ✅ Validé |
| Code produit SAP = Attribut logistique du stock | | ✅ Validé |
| Code article WMS = Code lot SAP | - | ✅ Validé |
| Code produit SAP = Attribut logistique du stock | - | ✅ Validé |
### Côté SAP
@@ -68,24 +68,24 @@ Un même produit peut exister en BAG et en KG = codes articles WMS différents.
|---------------|-----------|----------|
| ItemCode | Code lot SAP | Clé principale |
| Alias | Lot officiel | Relation 1:1, scannable |
| OwnerCode | | Constante "MECALUX" (technique) |
| OwnerCode | - | Constante "MECALUX" (technique) |
| Description | Description longue | Affichage PC |
| AltDescription | Description courte (MAKTL) | Affichage mobile, < 65 car. |
| Type | FERT / ZSIZ / etc. | + description du type |
| Family | Traitement commercial | Ex : "20 : R - Cruiser OSR" pas de séparation familles en préparation |
| Family | Traitement commercial | Ex : "20 : R - Cruiser OSR" - pas de séparation familles en préparation |
| BaseUoM | BAG ou KG | Selon type d'article |
| Weight | Poids brut du sac | Poids unitaire théorique |
| ContainerQty | Nb sacs par palette | Palette pleine standard (= Bag/Pal) |
| ContainerType | Palette | Un seul type de palette |
| CstAtt02 | Espèce | Ex : M = Maïs, S = Tournesol pour ordonnancement picking |
| CstAtt02 | Espèce | Ex : M = Maïs, S = Tournesol - pour ordonnancement picking |
| CstAtt03 | Génération | Génération article rattachée au lot SAP |
| CstAtt04 | Variété | Ex : "LG50465" |
| CstAtt05 | Big bag | True / False |
| CstAtt06 | GTIN | Ne peut être un alias car non unique |
| CstAtt07 | Semences essais | True / False |
| CstAtt08 | Size (calibre) | |
| CstAtt09 | Field production area | |
| CstAtt10 | Stage | ⚠️ À ajouter requis pour étiquette échantillon |
| CstAtt08 | Size (calibre) | - |
| CstAtt09 | Field production area | - |
| CstAtt10 | Stage | ⚠️ À ajouter - requis pour étiquette échantillon |
| Conversion.Principale.CstAtt01 | Poids unitaire article | Poids théorique ERP |
## Profils logistiques
@@ -110,12 +110,47 @@ Un même produit peut exister en BAG et en KG = codes articles WMS différents.
| Size | Taille | Pays de destination | Peut changer en cours de vie du stock |
> ⚠️ Les noms de balises API (Color, Size…) ne correspondent pas aux données
> métier. Le renommage d'affichage est géré dans le WMS.
> métier. Le renommage d'affichage est géré dans le WMS (voir
> [Renommage des ressources EasyWMS (LIM-92)](#renommage-des-ressources-easywms-lim-92)).
> **Point à tester** : en réception, la création du stock via les attributs
> logistiques doit être validée (approche standard ou custom à confirmer
> logistiques doit être validée (approche standard ou custom - à confirmer
> par les tests).
## Renommage des ressources EasyWMS (LIM-92)
> **Statut** : dev terminé, en **attente de déploiement pour test**.
Les champs standard EasyWMS (code article, famille, attributs logistiques)
sont **détournés** pour porter les concepts SAP de Limagrain. LIM-92
renomme les **ressources globales** d'affichage en conséquence (le nom
métier remplace le libellé standard partout dans l'UI).
| Champ standard | Ressource | FR (nouveau) | EN (nouveau) |
|---|---|---|---|
| Article (product code) | `Shared_Product` | Code lot SAP | SAP batch code |
| Menu article | `Articulos`, `Menu_Items` | Lots SAP | SAP batchs |
| Famille article | `Prop_Product_ProductFamilyCode` | Traitement commercial | Commercial processing |
| Menu famille | `Menu_ItemFamilies` | Traitements commerciaux | Commercial processings |
| Attr. Lot | `Shared_Lote` | Code produit SAP | SAP product code |
| Attr. Couleur | `Shared_Colour` | Propriétaire SAP | SAP owner |
| Attr. Origine / Source | `Shared_Source` | Description courte SAP | SAP short description |
| Attr. Taille | `Shared_Size` | Pays destination | Destination country |
**Ressources complémentaires** touchées au fil des retours de recette :
- `Shared_Calibre` : corrigée pour afficher « Pays destination » (manquait
à l'ajustement de stock, retour 04/06).
- `Shared_Códigodelote` : passée à « Code produit SAP » (retour 30/06).
- Messages d'erreur d'assignation de stock alignés sur les nouveaux
libellés : `StockAssign_TraceStockDoesNotMeetColour`,
`StockAssign_TraceStockDoesNotMeetLotCode`,
`StockAssign_TraceStockDoesNotMeetSize`,
`StockAssign_TraceStockDoesNotMeetSource`.
> ⚠️ Les 4 ressources `StockAssign_TraceStockDoesNotMeet*` ont été poussées
> par erreur sur la branche LOT2.2 (à surveiller au déploiement).
## Gestion des codes clients / fournisseurs
La base client/fournisseur SAP **n'est pas interfacée** avec le WMS.
@@ -126,14 +161,14 @@ Les codes sont gérés via des constantes + champ texte libre :
| ROR Fournisseur | SupplierCode = "FOURNISSEUR" | Code fournisseur SAP + libellé |
| ROR Retour client | AccountCode = "CLIENT" | Code client SAP + libellé |
| SOR / RUT Client | AccountCode = "CLIENT" | Code client SAP + libellé |
| SOR Production | AccountCode = "PRODUCTION" | |
| SOR Production | AccountCode = "PRODUCTION" | - |
## Gestion des poids
| Situation | Comportement ERP |
|-----------|-----------------|
| Article en BAG (UdM ≠ KG) | L'ERP ne s'intéresse qu'à la quantité de sacs les écarts de poids sont ignorés |
| Article en KG | Seule la quantité en KG intéresse l'ERP si le poids change (balance), le WMS modifie la quantité |
| Article en BAG (UdM ≠ KG) | L'ERP ne s'intéresse qu'à la quantité de sacs - les écarts de poids sont ignorés |
| Article en KG | Seule la quantité en KG intéresse l'ERP - si le poids change (balance), le WMS modifie la quantité |
Le poids théorique de la ligne de stock (quantité × poids unitaire, hors
poids palette) est transmis via l'attribut logistique `Weight`.
@@ -185,28 +220,28 @@ fonctionnellement.
## Points d'attention
⚠️ Le CstAtt10 (Stage) est **à ajouter** il est requis pour l'étiquette
⚠️ Le CstAtt10 (Stage) est **à ajouter** - il est requis pour l'étiquette
d'échantillonnage.
⚠️ Les noms de balises API stock (Color, Size, Source) sont détournés de
leur usage standard ne pas confondre avec les concepts habituels.
leur usage standard - ne pas confondre avec les concepts habituels.
⚠️ Les CstAtt au niveau du stock ont été supprimés (décision 11/02/2026)
au profit des attributs logistiques standards vérifier l'impact sur les
au profit des attributs logistiques standards - vérifier l'impact sur les
développements en cours.
⚠️ Le mode Complete = true signifie que chaque ITM contient la fiche
complète (pas de delta) attention à la volumétrie.
complète (pas de delta) - attention à la volumétrie.
⚠️ La base client/fournisseur n'est pas interfacée : le code est descendu
dans chaque message ROR/SOR/RUT, pas maintenu en master data.
## Questions ouvertes
- [ ] CstAtt10 Stage quand sera-t-il ajouté au mapping ITM ? (@Nicolas)
- [ ] Création stock via attributs logistiques en réception standard ou
- CstAtt10 Stage - quand sera-t-il ajouté au mapping ITM ? (@Nicolas)
- Création stock via attributs logistiques en réception - standard ou
custom ? À valider par tests (@Fabien)
- [ ] Impact suppression CstAtt stock sur les développements existants (@Nicolas)
- Impact suppression CstAtt stock sur les développements existants (@Nicolas)
## Historique des modifications
@@ -214,6 +249,7 @@ dans chaque message ROR/SOR/RUT, pas maintenu en master data.
|------|--------|--------------|
| 2026-05-05 | Arthur | Création initiale depuis page Confluence DEV |
| 2026-05-06 | Arthur | Ajout champs non utilisés, conversions, types supports, Z-Bags (CR consolidé) |
| 2026-07-17 | Arthur | LIM-92 (attente déploiement test) : section « Renommage des ressources EasyWMS » (table ressources → libellés SAP : Shared_Product/Lote/Colour/Source/Size, Prop_Product_ProductFamilyCode, Menu_Items/ItemFamilies, Articulos ; ressources complémentaires Shared_Calibre/Códigodelote + 4 StockAssign_TraceStockDoesNotMeet*, caveat branche LOT2.2) |
## Références
@@ -223,3 +259,4 @@ dans chaque message ROR/SOR/RUT, pas maintenu en master data.
| Ateliers interfaçage EasyWMS/SAP | Ateliers | 05/01 → 23/02/2026 |
| Notes complémentaires 11/02/2026 | Note | 11/02/2026 |
| CR CONSOLIDES REU ERP LIMAGRAIN V1 | CR ateliers | 23/02/2026 |
| [LIM-92](https://easywmsfrance.atlassian.net/browse/LIM-92) | Ticket Jira (renommage ressources) - attente déploiement test | 2026 |
+79 -48
View File
@@ -1,14 +1,16 @@
---
title: "Intégration GNA → SAP-CPI"
tags: [ERP, GNA, SAP-CPI, OAuth, middleware, API, BOO]
status: draft
standard_ref: architecture/erp-integration.md
status: review
standard_ref: concepts/erp-interface.md
jira_refs: [LIM-89]
confluence_refs: []
sources:
- "LIM-89 GNA Mise en place de la communication API EasyWMS SAP CPI.md"
- "recap_session_LIM-72_13-05-2026.md"
last_updated: 2026-05-13
- "Jira LIM-89 (lecture directe, revue de code validée 2026-05-21)"
last_updated: 2026-07-17
author: Arthur
---
@@ -24,7 +26,7 @@ author: Arthur
> (OAuth password grant). Chez Limagrain, la cible est **SAP-CPI** avec
> un mécanisme spécifique.
> Voir aussi : [LOC Message périodique](loc-message-periodique.md),
> Voir aussi : [LOC - Message périodique](loc-message-periodique.md),
> [Référence messages](messages-reference.md),
> [Mapping ERP-WMS](mapping-erp-wms.md)
@@ -47,6 +49,16 @@ Le script `CommonExportWebApi.boo` est le point d'entrée pour tous les
exports WMS → SAP-CPI. Il gère l'authentification, le formatage et
l'envoi des messages.
Structure (revue de code LIM-89) :
| Élément | Rôle |
|---|---|
| `CheckConnection()` | Authentification OAuth 2.0 client_credentials. Retry backoff exponentiel **4 tentatives (2s/4s/8s)**. Token persisté en JSON sur disque, gestion d'expiration (marge 60s). Arrêt immédiat sur 401 |
| `SendWebApiMessage` | Envoi POST vers l'endpoint unique. Détermination du `MessageSAP` puis construction du body. Retry backoff **5 tentatives (2s/4s/8s/16s)**. Token relu depuis le cache à chaque envoi |
| `CpiTokenResponse` | Désérialisation de la réponse OAuth (`access_token`, `token_type`, `expires_in`) |
| `CpiTokenCache` | Cache token JSON sur disque (`AccessToken`, `ExpiresAtUtc`) |
| `ReadWebApiFile`, `GenerateWebApiError`, `RegisterObservers` | Inchangés (template Mecalux standard) |
### Flux de communication
```mermaid
@@ -86,7 +98,7 @@ sequenceDiagram
4. À chaque envoi, le GNA vérifie le cache : si le token est encore valide,
il le réutilise ; sinon il en demande un nouveau
## Envoi des messages Format du body
## Envoi des messages - Format du body
Pour chaque message WMS exporté, le GNA envoie un POST vers l'endpoint
unique SAP-CPI `/http/ATHInboundMessage` avec le body JSON suivant :
@@ -109,29 +121,44 @@ le préfixe du MessageType WMS (3 premiers caractères) et le code SAP-CPI :
| Code CPI | Équivalent WMS | Description |
|----------|----------------|-------------|
| ATH214 | Check flux retour (batch) | Vérification lot retour client |
| ATH215 | REF (type = Supplier) | Finalisation réception fournisseur |
| ATH217 | REF (type = Return) | Finalisation réception retour |
| ATH214 | Check flux retour (BAPI) | Vérification lot retour client |
| ATH215 | REF (type = Retour) | Finalisation réception retour |
| ATH217 | REF (type = Supplier) **ou ROF** | Finalisation réception fournisseur / clôture OE |
| ATH201 | LOC | Message périodique delta mouvements |
| ATH202 | LOF | Finalisation chargement |
> ⚠️ **Correction (revue de code LIM-89, 2026-05-21)** : le sens
> `REF Retour → ATH215` / `REF Supplier → ATH217` retenu ici est celui
> de la table de l'intégrateur ERP et de l'implémentation. Une version
> antérieure de cette page inversait les deux codes. `ROF` est mappé sur
> `ATH217` (et non `ATH215` comme le suggérait la description initiale).
> ⚠️ Si un type de message n'a pas de correspondance dans la table, un
> **warning** est logué et le champ MessageSAP n'est pas inclus dans le
> body.
### Détermination conditionnelle du MessageSAP pour REF
Le message REF peut être routé vers **ATH215** (Supplier) ou **ATH217**
(Return) selon le type de préavis de réception (InboundOrder) lié :
Le message REF est routé vers **ATH215** (type Retour) ou **ATH217**
(type Supplier) selon le type de préavis de réception lié.
1. Le **REF01Observer.boo** récupère le type de préavis via une requête
LINQ sur `Context.RecLineInboundOrderLines``Context.InboundOrders`
2. Le type est transmis dans le champ `RecCustomAttributes.CstAtt20` du
message REF01
3. Le script `CommonExportWebApi.boo` lit `CstAtt20` dans le payload JSON
pour déterminer le `MessageSAP` :
- Type Supplier → `ATH215`
- Type Return → `ATH217`
**Implémentation définitive (revue de code)** : la détermination se fait
**dans `CommonExportWebApi.boo`** (bloc `SendWebApiMessage`), via une
requête LINQ sur `Context.Receptions` en utilisant le `ReceiptCode`
extrait du payload JSON. Le préfixe 3 caractères du `MessageType`
(`REF01``REF`) sert au lookup dans le dictionnaire `messageSapMap` ;
pour REF, la logique conditionnelle sur le type de préavis choisit
ATH215 (Retour) ou ATH217 (Supplier).
- Type Retour → `ATH215`
- Type Supplier → `ATH217`
> **Note (reversal)** : la conception initiale prévoyait de porter le
> type via `RecCustomAttributes.CstAtt20` écrit par le `REF01Observer.boo`
> (requête sur `Context.RecLineInboundOrderLines` → `Context.InboundOrders`).
> Cette approche a été **abandonnée** : le type est désormais résolu
> directement dans `CommonExportWebApi.boo` via le `ReceiptCode`
> (`Context.Receptions`). `REF01Observer.boo` n'est donc pas modifié.
## Cartographie complète des interfaces Athenzat
@@ -155,8 +182,8 @@ Source : doc CPI Maxime Tourrette (24/04/2026) + mail S15 Justine.
| Code ATH | Type Easy | Type SAP | Description |
|----------|-----------|----------|-------------|
| ATH214 | Z_IATH214 | Z_IAT214 | Check Batch (vérification lot retour) |
| ATH215 | REF | Z_IAT215 | Bon de réception fournisseur |
| ATH217 | REF | Z_IAT217 | Bon de réception retour |
| ATH215 | REF (Retour) | Z_IAT215 | Bon de réception retour |
| ATH217 | REF (Supplier) / ROF | Z_IAT217 | Bon de réception fournisseur / clôture OE |
| ATH201 | LOC / STV | Z_IAT201 | Mouvement stock (rangement ASRS, mvt HU, prep mix, customer flag, stock adjust) |
| ATH202 | LOF | Z_IAT202 | Chargement (Loading / Goods Issue) |
@@ -167,13 +194,14 @@ Source : doc CPI Maxime Tourrette (24/04/2026) + mail S15 Justine.
> **Note** : le flux ATH214 est le seul appelé **directement depuis un
> workflow** (pas via GNA/BOO). Voir [Réception retour](../01-inbound/reception-retour.md).
## Gestion des erreurs Retry avec backoff
## Gestion des erreurs - Retry avec backoff
| Situation | Comportement |
|-----------|-------------|
| HTTP 200 | Succès message envoyé |
| HTTP 401 | **Échec immédiat** token invalide, pas de retry |
| Autre erreur HTTP | **Retry backoff exponentiel** : 2s → 4s → 8s → 16s |
| HTTP 200 | Succès - message envoyé |
| HTTP 401 | **Échec immédiat** - token invalide, pas de retry |
| Autre erreur HTTP (auth) | **Retry backoff** : 4 tentatives (2s → 4s → 8s) |
| Autre erreur HTTP (envoi message) | **Retry backoff** : 5 tentatives (2s → 4s → 8s → 16s) |
## Configuration requise
@@ -184,7 +212,7 @@ Six clés `CPI_*` à ajouter dans `CommonAppSettings.config`
|-----|-------------|
| CPI_AUTH_URL | URL du serveur d'authentification SAP OAuth |
| CPI_CLIENT_ID | Identifiant OAuth |
| CPI_CLIENT_SECRET | Secret OAuth (en clair dans le config) |
| CPI_CLIENT_SECRET | Secret OAuth (**chiffré via `PasswordEncrypt.exe`**) |
| CPI_ENDPOINT_URL | Endpoint unique SAP-CPI (`/http/ATHInboundMessage`) |
| CPI_TOKEN_PATH | Chemin du fichier cache token sur disque |
| CPI_TIMEOUT | Timeout HTTP en secondes (auth + messages) |
@@ -201,9 +229,9 @@ Six clés `CPI_*` à ajouter dans `CommonAppSettings.config`
| Fichier | Modification |
|---------|-------------|
| `Scripts2015/CommonExportWebApi.boo` | Script principal d'export WMS → SAP-CPI |
| `Scripts2015/EasyWMS/XML/REF01/REF01Observer.boo` | Ajout requête InboundOrderType + écriture CstAtt20 |
| `Configuration/LIMAGRAI2512/CommonAppSettings.config` | Ajout des 6 clés CPI_* |
| `Scripts2015/CommonExportWebApi.boo` | Script principal d'export WMS → SAP-CPI (auth, MessageSAP, envoi) |
| `Configuration/LIMAGRAI2512/CommonAppSettings.config` | Ajout des 6 clés CPI_* (secret chiffré) |
| ~~`Scripts2015/EasyWMS/XML/REF01/REF01Observer.boo`~~ | Prévu initialement (CstAtt20) - **non retenu** : type REF résolu via `ReceiptCode` dans `CommonExportWebApi.boo` |
## Logging
@@ -215,39 +243,39 @@ est logué en **format indenté** pour faciliter le debug.
## Cas de tests
- [ ] Le GNA compile sans erreur
- [ ] L'authentification OAuth client_credentials fonctionne (HTTP 200)
- [ ] Le token est mis en cache sur disque et réutilisé tant qu'il est
- Le GNA compile sans erreur
- L'authentification OAuth client_credentials fonctionne (HTTP 200)
- Le token est mis en cache sur disque et réutilisé tant qu'il est
valide
- [ ] Les messages WMS sont envoyés en POST avec le bon format JSON
- [ ] Le champ MessageSAP est présent avec la bonne valeur selon le type
- [ ] REF type Supplier → MessageSAP = ATH215
- [ ] REF type Return → MessageSAP = ATH217
- [ ] CstAtt20 renseigné dans le message REF01 par le REF01Observer
- [ ] Warning logué si MessageType sans correspondance
- [ ] Retry backoff fonctionne (hors 401)
- [ ] Logs détaillés et lisibles (JSON indenté, token masqué)
- [ ] HTTP 401 → échec immédiat sans retry
- Les messages WMS sont envoyés en POST avec le bon format JSON
- Le champ MessageSAP est présent avec la bonne valeur selon le type
- REF type Retour → MessageSAP = ATH215
- REF type Supplier → MessageSAP = ATH217
- ❓ REF type résolu via `ReceiptCode` (query `Context.Receptions`)
- Warning logué si MessageType sans correspondance
- Retry backoff fonctionne (hors 401)
- Logs détaillés et lisibles (JSON indenté, token masqué)
- HTTP 401 → échec immédiat sans retry
## Points d'attention
⚠️ Le **secret OAuth est en clair** dans le fichier de configuration —
accès au fichier à restreindre.
Le **secret OAuth est chiffré** via `PasswordEncrypt.exe` dans le
fichier de configuration (résout la question initiale du secret en clair).
⚠️ La marge de 60 secondes sur l'expiration du token évite les races
conditions mais peut générer des re-authentifications prématurées sous
forte charge.
⚠️ Le backoff exponentiel plafonne à 16 secondes si SAP-CPI est
⚠️ Le backoff exponentiel plafonne à 16 secondes - si SAP-CPI est
durablement indisponible, les messages seront perdus (pas de file
d'attente persistante).
## Questions ouvertes
- [ ] Faut-il implémenter une file d'attente persistante pour les
messages en échec après 4 retries ? (@Nicolas)
- [ ] Le secret OAuth doit-il être chiffré dans le config ?
(@Fabien)
- Faut-il implémenter une file d'attente persistante pour les
messages en échec après 5 retries ? (@Nicolas)
- [x] ~~Le secret OAuth doit-il être chiffré dans le config ?~~
**Résolu** (revue de code) : oui, chiffré via `PasswordEncrypt.exe`
## Historique des modifications
@@ -255,11 +283,14 @@ d'attente persistante).
|------|--------|--------------|
| 2026-05-12 | Arthur | Création depuis LIM-89 |
| 2026-05-13 | Arthur | Ajout cartographie ATH complète, URLs TEST, note ATH214 hors GNA |
| 2026-07-17 | Arthur | Delta revue de code : structure du script (CheckConnection/SendWebApiMessage/CpiTokenCache), retry auth 4 vs envoi 5, secret chiffré PasswordEncrypt.exe (question résolue) ; **correction du sens REF Retour→ATH215 / Supplier→ATH217 + ROF→ATH217** ; type REF résolu via ReceiptCode (REF01Observer/CstAtt20 abandonné) ; statut préprod |
## Références
| Source | Type | Date |
|--------|------|------|
| [LIM-89](https://easywmsfrance.atlassian.net/browse/LIM-89) | Ticket Jira | 2026 |
| [LIM-89](https://easywmsfrance.atlassian.net/browse/LIM-89) | Ticket Jira (statut préprod / test client) | 2026 |
| Revue de code LIM-89 (Arthur, N. Chabanis) | Revue de code validée | 2026-05-21 |
| Table de correspondance intégrateur ERP | Commentaire LIM-89 | 2026-05-11 |
| Athenzat SAP-CPI Webservices Documentation v1.0 | PDF (Maxime Tourrette) | 2026-04-24 |
| Mail Justine S15 | Cartographie interfaces | 2026-04 |
@@ -1,19 +1,21 @@
---
title: "LOC Message périodique (spécification complète)"
title: "LOC - Message périodique (spécification complète)"
tags: [ERP, LOC, custom, delta, mouvement, stock, JSON, SAP, GNA]
status: draft
standard_ref: architecture/erp-integration.md
standard_ref: concepts/erp-interface.md
jira_refs: [LIM-76]
confluence_refs: []
sources:
- "LOC - Etat des lieux V2.md"
- "CR CONSOLIDES REU ERP LIMAGRAIN V1 - CR.md"
- "LIM-76 LOT1.2 [GNA] Message LOC.md"
last_updated: 2026-05-12
- "Jira LIM-76 (relecture commentaires 2026-07-17, revue de code en cours)"
last_updated: 2026-07-17
author: Arthur
---
# LOC Message périodique (spécification complète)
# LOC - Message périodique (spécification complète)
> **Résumé** : spécification du message custom LOC, envoyé du WMS vers SAP
> toutes les 5 minutes via le GNA, contenant le delta des HU modifiées.
@@ -21,7 +23,7 @@ author: Arthur
> canal** de notification des mouvements de stock vers SAP.
> **Standard EasyWMS** : → voir [ERP Integration](../../concepts/erp-interface.md)
> Ce message est un **[CUSTOM]** il n'existe pas dans le standard EasyWMS.
> Ce message est un **[CUSTOM]** - il n'existe pas dans le standard EasyWMS.
> Voir aussi : [Référence messages](messages-reference.md),
> [Flux ERP outbound](../04-outbound/flux-erp-outbound.md),
@@ -52,9 +54,9 @@ JSON spécifique attendu par SAP.
### Décisions structurantes
- **STV désactivé** (post-processing coupé) le LOC devient le **seul canal**
- **STV désactivé** (post-processing coupé) - le LOC devient le **seul canal**
de notification des mouvements de stock vers SAP
- **STC désactivé** les changements de statut hors retour sont limités au
- **STC désactivé** - les changements de statut hors retour sont limités au
B6 (blocage logistique) et sont couverts par le LOC (action R/U).
Les statuts des retours sont remontés dans le REF
@@ -72,7 +74,7 @@ Script BOO (requêtes WMS + agrégation + formatage JSON) → POST API SAP
1. Un **Job** s'exécute toutes les 5 minutes
2. Ce job appelle un **Workflow custom** dont le seul rôle est de **créer
une transaction custom** `LOC.SEND`
3. Le Workflow et la transaction ne portent aucune logique métier côté WMS
3. Le Workflow et la transaction ne portent aucune logique métier côté WMS -
toute la logique est dans le GNA
### Côté GNA
@@ -96,7 +98,7 @@ Script BOO (requêtes WMS + agrégation + formatage JSON) → POST API SAP
4. Générer le JSON et envoyer
5. **Si aucune transaction pertinente sur le delta → pas d'envoi de LOC**
## Couverture fonctionnelle 7 codes ACTION
## Couverture fonctionnelle - 7 codes ACTION
| Code | Signification | Déclencheur |
|------|---------------|-------------|
@@ -120,7 +122,7 @@ préalable doivent apparaître dans le LOC.
| Réf. | Champ | Type | Description |
|------|-------|------|-------------|
| 1 | IV_LGNUM | CHAR 4 | Numéro d'entrepôt (valeur fixe : `"WF02"`) config EasyS |
| 1 | IV_LGNUM | CHAR 4 | Numéro d'entrepôt (valeur fixe : `"WF02"`) - config EasyS |
| 2 | IV_TREATMENT_ID | CHAR 24 | Horodatage de génération du LOC |
### Structure JSON
@@ -148,22 +150,22 @@ préalable doivent apparaître dans le LOC.
}
```
### Table IT_CREATE Champs (1:n)
### Table IT_CREATE - Champs (1:n)
| Réf. | Champ | Type | Description |
|------|-------|------|-------------|
| 1 | MATNR | CHAR 40 | Code produit SAP vide si action B ou P |
| 2 | BATCHID | CHAR 10 | Code lot SAP vide si action B ou P |
| 1 | MATNR | CHAR 40 | Code produit SAP - vide si action B ou P |
| 2 | BATCHID | CHAR 10 | Code lot SAP - vide si action B ou P |
| 3 | ACTION | CHAR 1 | Code action : B, U, R, S, T, C, P |
| 4 | ANFME | NUM 13.3 | Quantité (absolue ou transférée selon action) vide si B, U/R, P |
| 5 | ALTME | CHAR 3 | Unité de mesure (BAG, KG) vide si action B ou P |
| 4 | ANFME | NUM 13.3 | Quantité (absolue ou transférée selon action) - vide si B, U/R, P |
| 5 | ALTME | CHAR 3 | Unité de mesure (BAG, KG) - vide si action B ou P |
| 6 | VLPLA | CHAR 18 | Zone de stockage origine |
| 7 | NLPLA | CHAR 18 | Zone de stockage destination |
| 8 | VLENR | CHAR 20 | Code HU (palette) source SSCC |
| 9 | NLENR | CHAR 20 | Code HU (palette) destination SSCC |
| 10 | REASON | CHAR 4 | Code raison scrap uniquement pour action S (ZSC1) |
| 11 | VBELN | | Code livraison sortante SAP uniquement pour action P |
| 12 | POSNR | | Ligne de livraison sortante SAP uniquement pour action P |
| 8 | VLENR | CHAR 20 | Code HU (palette) source - SSCC |
| 9 | NLENR | CHAR 20 | Code HU (palette) destination - SSCC |
| 10 | REASON | CHAR 4 | Code raison scrap - uniquement pour action S (ZSC1) |
| 11 | VBELN | - | Code livraison sortante SAP - uniquement pour action P |
| 12 | POSNR | - | Ligne de livraison sortante SAP - uniquement pour action P |
### Données stock/container à récupérer par ligne LOC
@@ -200,7 +202,7 @@ Pour chaque HU identifiée dans les transactions du delta :
### ACTION = B (Déplacement bin-to-bin)
Déplacement de HU d'une zone à une autre. **Pas de quantité, pas de code
article, pas de lot** seuls les champs zone et support sont renseignés.
article, pas de lot** - seuls les champs zone et support sont renseignés.
Le contenu de la HU n'est pas rediscuté.
### ACTION = U / R (Déblocage / Blocage statut)
@@ -229,7 +231,7 @@ ACTION=T dans le même LOC, dans l'ordre chronologique.
**Création de palette au picking** : si le SSCC en NLENR est inconnu de
SAP, SAP crée automatiquement la HU (type palette standard). Le LOC ne
crée que la structure palette le stock est transféré depuis une palette
crée que la structure palette - le stock est transféré depuis une palette
source connue.
### ACTION = C (Correction de quantité)
@@ -291,7 +293,7 @@ IV_TREATMENT_ID = horodatage du moment de **génération du LOC** (pas
l'heure de chaque transaction individuelle). Toutes les lignes d'un
même LOC partagent le même horodatage.
Format : `YYYYMMDD` limité à 24 caractères (CHAR 24).
Format : `YYYYMMDD` - limité à 24 caractères (CHAR 24).
## Ordre des lignes
@@ -345,16 +347,16 @@ procéder à la désactivation.
3. Le JSON est envoyé en POST à l'endpoint SAP
4. Les 7 codes ACTION (B, U, R, S, T, C, P) sont correctement générés
5. ACTION=B : ANFME, ALTME, MATNR, BATCHID, NLENR, REASON, VBELN, POSNR
vides seuls VLPLA, NLPLA et VLENR renseignés
6. ACTION=U/R : MATNR, BATCHID, ALTME, VLPLA, VLENR renseignés
vides - seuls VLPLA, NLPLA et VLENR renseignés
6. ACTION=U/R : MATNR, BATCHID, ALTME, VLPLA, VLENR renseignés -
ANFME, NLPLA, NLENR, REASON, VBELN, POSNR vides
7. ACTION=S : REASON=ZSC1 MATNR, BATCHID, ANFME, ALTME, VLPLA, VLENR
renseignés NLPLA, NLENR, VBELN, POSNR vides
8. ACTION=T : VLENR et NLENR dans la même ligne ANFME = qté transférée
(pas un solde) REASON, VBELN, POSNR vides
9. ACTION=C : ANFME = quantité absolue (pas un delta) NLPLA, NLENR,
7. ACTION=S : REASON=ZSC1 - MATNR, BATCHID, ANFME, ALTME, VLPLA, VLENR
renseignés - NLPLA, NLENR, VBELN, POSNR vides
8. ACTION=T : VLENR et NLENR dans la même ligne - ANFME = qté transférée
(pas un solde) - REASON, VBELN, POSNR vides
9. ACTION=C : ANFME = quantité absolue (pas un delta) - NLPLA, NLENR,
REASON, VBELN, POSNR vides
10. ACTION=P : VLENR, NLPLA (image de quai), VBELN, POSNR renseignés
10. ACTION=P : VLENR, NLPLA (image de quai), VBELN, POSNR renseignés -
MATNR, BATCHID, ANFME, ALTME, VLPLA, NLENR, REASON vides
11. Palettes liées à une réception non fermée (pas de REF envoyé) exclues
12. Lignes dans IT_CREATE dans l'ordre chronologique des transactions WMS
@@ -376,7 +378,7 @@ procéder à la désactivation.
| CT-02 | 2,3 | GNA détecte LOC.SEND et génère JSON | JSON conforme + POST HTTP 200 |
| CT-03 | 14 | Aucune transaction sur le delta | Aucun POST vers SAP |
### ACTION=B Déplacement
### ACTION=B - Déplacement
| CT | CA | Description | Résultat attendu |
|----|-----|-------------|------------------|
@@ -384,7 +386,7 @@ procéder à la désactivation.
| CT-11 | 4,5 | Déplacement via CON.LOCATE | Idem CT-10 |
| CT-12 | 4,5 | STK.MOVE sans changement HU (ContainerTo=ContainerCode) | ACTION=B (pas T) |
### ACTION=U/R Blocage / Déblocage
### ACTION=U/R - Blocage / Déblocage
| CT | CA | Description | Résultat attendu |
|----|-----|-------------|------------------|
@@ -392,14 +394,14 @@ procéder à la désactivation.
| CT-21 | 4,6 | Déblocage HU via CST.STK (← B6) | ACTION=U |
| CT-22 | 6 | Changement statut hors B6 (hors retour) | Aucune ligne dans le LOC |
### ACTION=S Suppression / Scrap
### ACTION=S - Suppression / Scrap
| CT | CA | Description | Résultat attendu |
|----|-----|-------------|------------------|
| CT-30 | 4,7 | CON.DELETE sur une HU | ACTION=S, REASON=ZSC1, qté et champs stock renseignés |
| CT-31 | 7 | Plusieurs suppressions | Chaque ligne S a REASON=ZSC1 uniquement |
### ACTION=T Transfert inter-HU
### ACTION=T - Transfert inter-HU
| CT | CA | Description | Résultat attendu |
|----|-----|-------------|------------------|
@@ -409,14 +411,14 @@ procéder à la désactivation.
| CT-43 | 18 | Picking vers SSCC inconnu SAP | Ligne T générée, LOC ne bloque pas |
| CT-44 | 8 | Transfert via table de travail | 2 lignes distinctes (pas de fusion) |
### ACTION=C Correction de quantité
### ACTION=C - Correction de quantité
| CT | CA | Description | Résultat attendu |
|----|-----|-------------|------------------|
| CT-50 | 4,9 | STK.ADJ (ajustement) | ACTION=C, ANFME = qté absolue après ajustement |
| CT-51 | 9 | Vérification REASON vide | REASON vide pour action C |
### ACTION=P Assignation client
### ACTION=P - Assignation client
| CT | CA | Description | Résultat attendu |
|----|-----|-------------|------------------|
@@ -447,11 +449,67 @@ procéder à la désactivation.
| CT-101 | 16 | CST.STK après désactivation STC | Pas de STC, LOC contient ACTION=R |
| CT-110 | 4,12 | Plusieurs actions dans le même delta | 4 lignes, 4 actions, ordre chronologique |
| CT-111 | 2 | IV_LGNUM | Toujours "WF02" |
| CT-112 | | HU multi-lignes de stock | Plusieurs entrées dans IT_CREATE |
| CT-112 | - | HU multi-lignes de stock | Plusieurs entrées dans IT_CREATE |
## [CUSTOM] Implémentation GNA (statut : en revue de code, préprod)
Statut ticket au 2026-07-17 : **En revue de code** (plusieurs livraisons
préprod, revue Vincent Charvet en cours). Éléments issus de la relecture
des commentaires :
| Élément | Type | Rôle |
|---------|------|------|
| `CST_SendLOCTransaction` | Job | Toutes les 5 min, appelle `CST_SendLOC` |
| `CST_SendLOC` | WF | Crée la transaction `LOC.SEND` (aucune logique métier) |
| `LOC.SEND` | TransactionType | Déclenche la génération du LOC |
| `LOC_ZONE_MAPPING` | Paramètre | Correspondance zones TK → zones client (voir [Paramètres projet](../07-admin/parametres-projet.md)) |
| `CommonExportWebApi.boo` | Script GNA | Structure LOC selon le template client |
| `EasyWMSExportMessages.boo` | Script GNA | Appelle `WriteLOC01` sur réception de `LOC.SEND` |
| `EasyWMSWebApiObserver.boo` | Script GNA | Ajoute le type de message `LOC01` |
| `LOC01.boo` | Script GNA | En-tête du message |
| `WriteLOC01.boo` | Script GNA | Génère le message ; si rien n'a changé → transaction en erreur motif `NO_CHANGES` (évolution demandée : ne plus générer de transaction en erreur si rien à envoyer) |
| `LOC01Observer.boo` | Script GNA | Cœur : récupère la dernière `LOC.SEND`, prend les transactions depuis (CON.MOVE, CON.LOCATE, STK.MOVE, STK.ADJ, CST.STK, STK.PICKING, CON.DELETE), détermine l'`ACTION` |
| `LOC01.xsd` | Schéma | Structure du message LOC |
**Décision réception non fermée** : on n'envoie pas de LOC pour un
conteneur pas encore présent dans l'ERP (SAP les crée à partir du REF).
Conséquence assumée par le client (soulevée par Nicolas le 02/06) : les
modifications intervenues sur la palette **avant** l'envoi du REF ne sont
pas rejouées après coup (filtrage par date/heure de traitement).
### Picking négatif (en cours - point délicat)
Le picking négatif génère la séquence de transactions suivante :
- `CON.CREATE` : nouveau conteneur sur une TP
- `STK.PICKING.NEG` : déplacement de l'excédent vers la nouvelle palette,
origine = destination = conteneur d'origine (picking sur lui-même),
quantité = quantité demandée dans l'OS
- 2× `CHB.LAB` : échange des labels des deux palettes (nouveau → origine,
puis l'inverse)
**Problème** : avec CON.CREATE + STK.PICKING.NEG seuls, on n'a pas la
corrélation entre conteneur source et destination. `CHB.LAB` pourrait
faire le lien, mais le swap des labels intervient **après** le picking -
si le LOC part entre les deux étapes, l'information ne peut pas être
regroupée. Analyse en cours (LOC01Observer mis à jour le 03/07 ; pistes
de réflexion partagées par Arthur).
### Retours revue de code / client (à traiter)
- **Retour client (08/07)** : certains LOC non intégrables côté SAP -
action S avec les autres champs vides ; doublons (même info plusieurs
fois). Corrections appliquées 09/07 puis 17/07.
- **Revue de code (10/07, Vincent Charvet)** : détail des stocks manquant
sur action S ; valeur `WF02` codée en dur ; fonction `BuildZoneMapping`
jamais utilisée (éviterait de parser `LOC_ZONE_MAPPING` par emplacement) ;
null ref potentielles sur la comparaison au statut B6 ; optimiser le
cache (une query par type de donnée). Changements appliqués 17/07,
re-revue à faire.
## Points d'attention
⚠️ **STV et STC désactivés** vérifier qu'aucun autre process métier ne
⚠️ **STV et STC désactivés** - vérifier qu'aucun autre process métier ne
dépend d'eux (middleware GNA, reporting).
⚠️ Le filtrage GNA des STV avec motif "STR" devient caduc si le STV est
@@ -465,17 +523,23 @@ pas fermée (pas de REF envoyé).
⚠️ Les quantités sont des valeurs **absolues** sauf pour ACTION=S (quantité
supprimée) et ACTION=T (quantité transférée).
⚠️ IV_LGNUM = `"WF02"` (pas "WL02" corrigé depuis spec V2).
⚠️ IV_LGNUM = `"WF02"` (pas "WL02" - corrigé depuis spec V2).
## Questions ouvertes
- [ ] Cas palette déposée sur image de quai → chargée → OS fermé →
- Cas palette déposée sur image de quai → chargée → OS fermé →
LOF/SOF envoyé avant le LOC : la HU ne sera pas mentionnée dans le LOC
(@Limagrain)
- [ ] HU multi-lignes de stock : comportement exact à confirmer (CT-112)
- HU multi-lignes de stock : comportement exact à confirmer (CT-112)
(@Fabien)
- [ ] Vérifier si d'autres transactions WMS sont utiles pour le LOC
- Vérifier si d'autres transactions WMS sont utiles pour le LOC
(ex. STK.SCR) (@Fabien)
- Picking négatif : corrélation conteneur source ↔ destination
indisponible via CON.CREATE + STK.PICKING.NEG ; le swap `CHB.LAB`
intervient après le picking. Solution en cours d'analyse
(@Maxime / @Vincent)
- LOC action S : compléter le détail des stocks ; éliminer les doublons
(retour client 08/07, corrections en cours) (@Maxime)
## Historique des modifications
@@ -483,12 +547,13 @@ supprimée) et ACTION=T (quantité transférée).
|------|--------|--------------|
| 2026-05-06 | Arthur | Création depuis spec LOC V2 (réunion 30/04/2026) |
| 2026-05-12 | Arthur | Refonte complète depuis LIM-76 : architecture technique GNA/BOO, ACTION=P confirmé avec VBELN/POSNR, IV_LGNUM corrigé WF02, zones SAP détaillées, contraintes de longueur, 25+ cas de tests, critères d'acceptation |
| 2026-07-17 | Arthur | Relecture commentaires LIM-76 (statut en revue de code, préprod) : section « Implémentation GNA » (job/WF/transaction, scripts .boo, LOC01.xsd, LOC_ZONE_MAPPING, motif NO_CHANGES), décision réception non fermée (modifs pré-REF non rejouées), sous-section picking négatif (CON.CREATE + STK.PICKING.NEG + CHB.LAB, problème de corrélation), retours revue de code / client (action S, doublons, WF02 hardcodé, BuildZoneMapping, cache) |
## Références
| Source | Type | Date |
|--------|------|------|
| [LIM-76](https://easywmsfrance.atlassian.net/browse/LIM-76) | Ticket Jira (LOT 1.2) | 2026 |
| [LIM-76](https://easywmsfrance.atlassian.net/browse/LIM-76) | Ticket Jira (LOT 1.2) - en revue de code, préprod | 2026-07-17 |
| LOC - Etat des lieux V2 | Spécification technique | 30/04/2026 |
| CR CONSOLIDES REU ERP LIMAGRAIN V1 | CR ateliers interfaçage | 23/02/2026 |
| Réunion LOC 30/04/2026 | Réunion Arthur + Justine + Nicolas | 30/04/2026 |
@@ -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) | - |
@@ -1,16 +1,16 @@
---
title: "Catalogue des messages ERP Référence complète"
title: "Catalogue des messages ERP - Référence complète"
tags: [ERP, messages, interface, SAP, catalogue, ITM, ASN, ROR, ROF, REF, SOR, RUT, SOF, LOF, PCK, MOV, STV, STR, STC, SCR, WSC, COR, COF, LOC, ERR, CHG]
status: draft
standard_ref: architecture/erp-integration.md
jira_refs: []
standard_ref: concepts/erp-interface.md
jira_refs: [LIM-113, LIM-117]
confluence_refs: []
sources: [FR-SW-04-07_LIMAGRAIN_Functional_Analysis_V1.5.docx, "Expédition - LIMAGRAIN - DEV - Confluence.md", "CR CONSOLIDES REU ERP LIMAGRAIN V1 - CR.md"]
last_updated: 2026-05-06
sources: [FR-SW-04-07_LIMAGRAIN_Functional_Analysis_V1.5.docx, "Expédition - LIMAGRAIN - DEV - Confluence.md", "CR CONSOLIDES REU ERP LIMAGRAIN V1 - CR.md", "Jira LIM-113 (lecture directe 2026-07-20)"]
last_updated: 2026-07-20
author: Arthur
---
# Catalogue des messages ERP Référence complète
# Catalogue des messages ERP - Référence complète
> **Résumé** : tableau de référence de tous les messages d'interface entre
> SAP EWM et EasyWMS chez Limagrain, classés par domaine fonctionnel.
@@ -76,21 +76,21 @@ message.
## Messages custom détaillés
### PCK Passage Conteneur Client
### PCK - Passage Conteneur Client
- **Déclencheur** : stock préparé, passage en conteneur client EasyWMS
- **Contenu** : information passage conteneur client
- **Envoyé pour** : commande client, consommation OF hors recert, messagerie
- **Voir** : [Flux ERP outbound](../04-outbound/flux-erp-outbound.md)
### ~~MOV Movement~~ ANNULÉ
### ~~MOV - Movement~~ ANNULÉ
> **ANNULÉ** décision réunion client, jugé inutile.
> **ANNULÉ** - décision réunion client, jugé inutile.
- ~~**Déclencheur** : déplacement de stock entre palettes~~
- ~~**Contenu** : palette d'origine, palette de destination, quantité~~
### LOC Message périodique (détaillé)
### LOC - Message périodique (détaillé)
- **Déclencheur** : Job toutes les 5 min → WF → transaction `LOC.SEND` → GNA
(script BOO) → POST SAP-CPI
@@ -100,13 +100,13 @@ message.
- **Quantités** : valeurs absolues (pas des écarts) sauf ACTION=S et T
- **Exclusion** : palettes dont la réception n'est pas fermée (pas de REF)
- **Approche technique** : fork du WSC avec filtre temporel sur CreationDate
- **Transport** : via GNA → SAP-CPI (OAuth 2.0 client_credentials)
- **Transport** : via GNA → SAP-CPI (OAuth 2.0 client_credentials) -
code CPI : **ATH201**
- **Voir** : [Spécification complète LOC](loc-message-periodique.md),
[Intégration GNA → SAP-CPI](gna-sap-cpi.md),
[Flux ERP outbound](../04-outbound/flux-erp-outbound.md)
### STV Variation de Stock (⚠️ DÉSACTIVÉ)
### STV - Variation de Stock (⚠️ DÉSACTIVÉ)
> ⚠️ **Décision 30/04/2026** : le STV est désactivé (post-processing coupé).
> Le LOC devient le seul canal de notification des mouvements de stock vers SAP.
@@ -133,10 +133,10 @@ message.
type "création de stock" (l'ERP n'autorise pas la création de stock par ce
biais aujourd'hui)
- **Raison désactivation** : Limagrain préfère des quantités absolues (LOC)
plutôt que des écarts +/- (STV) si un message se perd, l'écart est
plutôt que des écarts +/- (STV) - si un message se perd, l'écart est
définitivement perdu
### STR Demande de Changement de Stock
### STR - Demande de Changement de Stock
- **Direction** : ERP → WMS
- **Cas d'usage** : changement de code article (produit SAP + description),
@@ -151,7 +151,7 @@ message.
les cas de refus
- **Voir** : [Mapping ERP-WMS](mapping-erp-wms.md)
### COR Demande d'Échantillonnage
### COR - Demande d'Échantillonnage
- **Direction** : ERP → WMS
- **Usage** : **uniquement** pour les demandes d'échantillonnage (pas pour les
@@ -173,7 +173,7 @@ message.
pour les ordres de sortie
- **Voir** : [Échantillonnage](../03-picking/echantillonnage.md)
### COF Confirmation d'Échantillonnage
### COF - Confirmation d'Échantillonnage
- **Direction** : WMS → ERP
- **Mapping** :
@@ -187,7 +187,7 @@ message.
- **Point ouvert** : Limagrain doit confirmer si le COF sera traité côté ERP.
Si non traité, risque de demandes en double.
### WSC Image de Stock Journalière
### WSC - Image de Stock Journalière
- **Direction** : WMS → ERP
- **Rôle** : image de stock complète pour vérification de cohérence. Contient
@@ -199,21 +199,28 @@ message.
fichier (volumétrie potentiellement élevée pour CPI)
- **Déclenchement** : transaction `SCR.REQ` ou `STOCKSYNC.ASKED`
### STC Notification Changement de Statut (⚠️ DÉSACTIVÉ)
### STC - Notification Changement de Statut (⚠️ DÉSACTIVÉ)
> ⚠️ **Décision 30/04/2026** : le STC est désactivé. Les changements de statut
> hors retour sont limités au B6 (blocage logistique standard) et sont couverts
> par le LOC (action R/U). Les statuts des retours sont remontés dans le REF.
### CHG Changement article / propriétaire
### CHG - Changement article / propriétaire (LIM-113)
- **Déclencheur** : modification article ou propriétaire dans SAP
- **Contenu** : numéro de HU, lot officiel, code nouvel article, description,
destination, propriétaire Limagrain
- **Contrainte** : le stock ne doit pas être assigné à un processus (sinon ERR)
- **Voir** : [Mapping ERP-WMS](mapping-erp-wms.md)
- **Déclencheur** : modification article / propriétaire / destination dans SAP
(cas principal : bascule de propriétaire en clôture fiscale, ex. FR10→FR02),
sans mouvement physique de la palette
- **Mécanisme** : `StartWorkflowCommand` → WF custom `CST_CHG_WF` sur
`CustomApplication` ; SAP envoie l'identité complète de la HU (9 champs :
containerCode, ContainerTypeCode, productCode, Quantity, UnitOfMeasureCode,
LotCode, Color=propriétaire, Source=description, Size=destination)
- **Contrainte** : modification seulement si la HU et ses lignes ne sont
engagées dans **aucun** flux (refus tout ou rien). **Statut de stock exclu**
(passe par STR, appel séparé)
- **Acquittement** : **200** en succès, **500** (throw exception) en refus/erreur
- **Voir** : [Mapping ERP-WMS](mapping-erp-wms.md#message-chg---changement-article--propriétaire-lim-113)
### API Lot SAP Retours clients
### API Lot SAP - Retours clients
- **Déclencheur** : lot officiel inconnu lors d'un retour client
- **Contenu (demande)** : lot officiel à vérifier
@@ -247,6 +254,11 @@ SAP → RUT → EasyWMS → (picking + chargement) → LOC (delta 5 min) → SAP
→ SOF → SAP (phase 2)
```
> **Adresse de livraison (LIM-117)** : la liste de SOR d'un RUT n'expose pas
> les champs d'adresse standard ; SAP la transmet dans le `CustomAttribute`
> (Attribute1-7) de chaque SOR, mappé sur l'OS par un post-subscription WMS.
> Détail : [Flux ERP outbound - Adresse de livraison](../04-outbound/flux-erp-outbound.md#custom-adresse-de-livraison-des-sor-de-tournée-lim-117).
### Consommation OF (SOR)
```
@@ -275,34 +287,35 @@ SAP → STR → EasyWMS → (MAJ stock) → LOC (delta 5 min) → SAP
## Points d'attention
⚠️ **STV et STC désactivés** (décision 30/04/2026) le LOC est le seul canal
⚠️ **STV et STC désactivés** (décision 30/04/2026) - le LOC est le seul canal
de notification des mouvements de stock vers SAP.
⚠️ Le message CHG est rejeté (ERR) si le stock est assigné à un processus
en cours.
⚠️ Le message CHG (WF `CST_CHG_WF`) est **refusé** si la HU ou une de ses
lignes est engagée dans un flux : refus **tout ou rien**, remonté en **500**
(throw exception) avec le motif - pas un plantage mais un refus métier (LIM-113).
⚠️ MOV, PCK sont **supprimés/remplacés** le LOC couvre tous ces besoins.
⚠️ MOV, PCK sont **supprimés/remplacés** - le LOC couvre tous ces besoins.
⚠️ L'ASN envoie 1 palette par message (pas d'agrégation permet suppression
⚠️ L'ASN envoie 1 palette par message (pas d'agrégation - permet suppression
individuelle en cas d'annulation).
⚠️ Le STR est refusé si la palette est assignée "client" ou en préparation.
Le middleware GNA filtre les STV avec motif "STR" pour éviter les doublons
(caduc si STV globalement désactivé).
⚠️ Le COF n'est utile que si SAP le traite sinon risque de demandes
⚠️ Le COF n'est utile que si SAP le traite - sinon risque de demandes
d'échantillonnage en double.
## Questions ouvertes
- [ ] Détail champ par champ de chaque message document séparé à intégrer (@Arthur)
- [ ] Format exact du message CHG (@Nicolas)
- [ ] Confirmer si le COF sera traité côté ERP (@Limagrain)
- [ ] Vérifier capacité de traitement du WSC quotidien volumétrie (@Limagrain)
- [ ] Confirmer retour fournisseur : SOR simple ou RUT ? (@Limagrain)
- [ ] Effets de bord désactivation STV lister toutes les transactions
- Détail champ par champ de chaque message - document séparé à intégrer (@Arthur)
- [x] ~~Format exact du message CHG (@Nicolas)~~**Résolu** (LIM-113) : `StartWorkflowCommand` / `CST_CHG_WF`, 9 champs JSON (voir [Mapping ERP-WMS](mapping-erp-wms.md#message-chg---changement-article--propriétaire-lim-113))
- Confirmer si le COF sera traité côté ERP (@Limagrain)
- Vérifier capacité de traitement du WSC quotidien - volumétrie (@Limagrain)
- Confirmer retour fournisseur : SOR simple ou RUT ? (@Limagrain)
- Effets de bord désactivation STV - lister toutes les transactions
STK.ADJ et vérifier couverture LOC (@Mecalux)
- [ ] Effets de bord désactivation STC idem pour CST.STK (@Mecalux)
- Effets de bord désactivation STC - idem pour CST.STK (@Mecalux)
## Historique des modifications
@@ -311,6 +324,8 @@ d'échantillonnage en double.
| 2026-05-05 | Arthur | Création initiale depuis AF V1.5 |
| 2026-05-05 | Arthur | MOV annulé, LOC détaillé (5 min, delta, structure JSON, flag client) |
| 2026-05-06 | Arthur | Enrichissement complet depuis CR consolidé ERP (STV, STR, COR/COF, WSC, flux supprimés, désactivation STV/STC) |
| 2026-07-20 | Arthur | LIM-113 : refonte entrée CHG (mécanisme `StartWorkflowCommand`/`CST_CHG_WF`, 9 champs, refus tout ou rien, statut exclu, acquittement 200/500) ; point d'attention CHG mis à jour ; question « format CHG » résolue ; front matter jira_refs/sources/last_updated |
| 2026-07-20 | Arthur | LIM-117 (LOT 2.1, Ouvert) : note « Adresse de livraison » sur le flux RUT (adresse dans `CustomAttribute` des SOR, mapping post-subscription vers l'OS) + renvoi vers flux-erp-outbound.md ; jira_refs +LIM-117 |
## Références