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:
@@ -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 |
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user