màj wiki avec retour MES lot-5 AD
This commit is contained in:
@@ -0,0 +1,225 @@
|
||||
---
|
||||
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: []
|
||||
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
|
||||
author: Arthur
|
||||
---
|
||||
|
||||
# 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,
|
||||
> profils et gestion des poids.
|
||||
|
||||
> **Standard EasyWMS** : → voir [ERP Integration](../../architecture/erp-integration.md)
|
||||
> Ce qui suit documente les **spécificités Limagrain** par rapport au standard.
|
||||
|
||||
## Contexte projet
|
||||
|
||||
Les décisions ci-dessous sont issues des ateliers d'interfaçage EasyWMS / SAP
|
||||
réalisés entre le 05/01/2026 et le 23/02/2026, consolidées le 27/02/2026.
|
||||
|
||||
## Architecture retenue : Lot SAP = Article WMS
|
||||
|
||||
Le code article dans EasyWMS est le **code lot SAP** (et non le code produit
|
||||
SAP). L'option concaténation code produit + lot SAP a été étudiée et écartée.
|
||||
|
||||
Le **code produit SAP** est géré comme un attribut au niveau du stock (pas de
|
||||
la fiche article), car un même lot SAP peut correspondre à plusieurs produits
|
||||
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é |
|
||||
|
||||
### Côté SAP
|
||||
|
||||
Il existe une base article avec des codes articles uniques. Les articles sont
|
||||
gérés au lot. Chaque article peut avoir plusieurs codes lots SAP. Chaque code
|
||||
lot SAP a un équivalent code lot OFFICIEL national (relation 1:1).
|
||||
|
||||
### Côté EasyWMS
|
||||
|
||||
Chaque lot SAP est descendu via le fichier ITM. L'article SAP devient un
|
||||
attribut du lot SAP (et non l'inverse).
|
||||
|
||||
**Code article WMS = code lot SAP**
|
||||
|
||||
## Unité de base selon le type d'article
|
||||
|
||||
| Type article | Description | Unité de base WMS |
|
||||
|--------------|-------------|-------------------|
|
||||
| FERT | Produit fini | BAG (sac) |
|
||||
| ZSIZ | Semi-fini calibré | KG |
|
||||
|
||||
L'unité de base dans le WMS est l'unité logistique (pas l'unité de base SAP).
|
||||
Un même produit peut exister en BAG et en KG = codes articles WMS différents.
|
||||
|
||||
## Mapping fiche article (message ITM)
|
||||
|
||||
| Champ EasyWMS | Champ SAP | Remarque |
|
||||
|---------------|-----------|----------|
|
||||
| ItemCode | Code lot SAP | Clé principale |
|
||||
| Alias | Lot officiel | Relation 1:1, scannable |
|
||||
| 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 |
|
||||
| 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 |
|
||||
| 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 |
|
||||
| Conversion.Principale.CstAtt01 | Poids unitaire article | Poids théorique ERP |
|
||||
|
||||
## Profils logistiques
|
||||
|
||||
| Type d'article | Profil | Description |
|
||||
|----------------|--------|-------------|
|
||||
| Articles classiques | PROFIL_STANDARD | Gestion code produit + propriétaire + description + pays destination |
|
||||
| Palettes bois vides | PROFIL_PALETTE | Gestion palette bois vide |
|
||||
|
||||
## Attributs logistiques du stock
|
||||
|
||||
> **Décision du 11/02/2026** : les Custom Attributes au niveau du stock
|
||||
> (CstAtt01–04) ont été **supprimés** au profit des attributs logistiques
|
||||
> standards du WMS. Les modes de capture sont désactivés pour éviter la
|
||||
> customisation de tous les écrans.
|
||||
|
||||
| Champ EasyWMS (balise API) | Libellé affiché WMS | Champ SAP | Remarque |
|
||||
|----------------------------|---------------------|-----------|----------|
|
||||
| Lot | Lot | Code produit SAP | Différencie les produits pour un même lot SAP |
|
||||
| Color | Couleur | Code propriétaire SAP | ≠ "MECALUX" technique |
|
||||
| Source | Source | Description courte SAP | Désignation courte |
|
||||
| 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.
|
||||
|
||||
> **Point à tester** : en réception, la création du stock via les attributs
|
||||
> logistiques doit être validée (approche standard ou custom — à confirmer
|
||||
> par les tests).
|
||||
|
||||
## Gestion des codes clients / fournisseurs
|
||||
|
||||
La base client/fournisseur SAP **n'est pas interfacée** avec le WMS.
|
||||
Les codes sont gérés via des constantes + champ texte libre :
|
||||
|
||||
| Flux | Champ code | Champ Source |
|
||||
|------|------------|--------------|
|
||||
| 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" | — |
|
||||
|
||||
## 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é |
|
||||
|
||||
Le poids théorique de la ligne de stock (quantité × poids unitaire, hors
|
||||
poids palette) est transmis via l'attribut logistique `Weight`.
|
||||
|
||||
## Champs NON utilisés dans ITM
|
||||
|
||||
Les champs suivants sont explicitement exclus du mapping :
|
||||
|
||||
Stock Label, Classification ABC, Alertes stock (min/max), Image produit,
|
||||
Code danger (pas d'impact logistique), Températures min/max, Cross-docking,
|
||||
Gerbabilité (gérée via ordonnancement picking), Picking message, IsPacking.
|
||||
|
||||
## Conversions
|
||||
|
||||
- Unité de base = BAG ou KG (pas de conversion supplémentaire identifiée)
|
||||
- Pas de gestion financière ni de découpage dans les sacs
|
||||
- Le nombre de sacs par palette pleine est géré dans la conversion container
|
||||
(champ `ContainerQty`)
|
||||
|
||||
## Types de supports
|
||||
|
||||
| Type | Usage | Statut |
|
||||
|------|-------|--------|
|
||||
| EWM-PAL00 / PALETTE_US | Palette standard (un seul type) | ✅ Confirmé |
|
||||
| BIGBAG | Attribut de la HU (pas type séparé) | ✅ Validé |
|
||||
| Octobin | Hors périmètre phase 1 | ❌ |
|
||||
|
||||
La création de types de supports est techniquement lourde (nécessite passage
|
||||
par support Mecalux, impact design entrepôt). Les BigBag sont déclarés par
|
||||
l'opérateur au poste de réception. Le WMS ajuste le calcul de poids (+2 kg
|
||||
environ).
|
||||
|
||||
## Z-Bags (sacs vides)
|
||||
|
||||
Stockés dans le magasin automatique (SRS) **uniquement pour livraison aux
|
||||
clients**, pas pour l'approvisionnement production. Doivent respecter les
|
||||
mêmes formats et règles que les palettes produits. → À valider
|
||||
fonctionnellement.
|
||||
|
||||
## Paramètres généraux de l'interface
|
||||
|
||||
| Paramètre | Valeur |
|
||||
|-----------|--------|
|
||||
| Format | JSON |
|
||||
| Opération par défaut | 3 = Upsert |
|
||||
| Mode de mise à jour | Complete = true (fiche complète à chaque envoi) |
|
||||
| OwnerCode (technique) | "MECALUX" |
|
||||
| Site | WF02 |
|
||||
|
||||
## Points d'attention
|
||||
|
||||
⚠️ 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.
|
||||
|
||||
⚠️ 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
|
||||
développements en cours.
|
||||
|
||||
⚠️ Le mode Complete = true signifie que chaque ITM contient la fiche
|
||||
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
|
||||
custom ? À valider par tests (@Fabien)
|
||||
- [ ] Impact suppression CstAtt stock sur les développements existants (@Nicolas)
|
||||
|
||||
## Historique des modifications
|
||||
|
||||
| Date | Auteur | Modification |
|
||||
|------|--------|--------------|
|
||||
| 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é) |
|
||||
|
||||
## Références
|
||||
|
||||
| Source | Type | Date |
|
||||
|--------|------|------|
|
||||
| Données principales + stock - LIMAGRAIN - DEV | Page Confluence | 27/02/2026 |
|
||||
| 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 |
|
||||
@@ -0,0 +1,219 @@
|
||||
---
|
||||
title: "Intégration GNA → SAP-CPI"
|
||||
tags: [ERP, GNA, SAP-CPI, OAuth, middleware, API, BOO]
|
||||
status: draft
|
||||
standard_ref: architecture/erp-integration.md
|
||||
jira_refs: [LIM-89]
|
||||
confluence_refs: []
|
||||
sources:
|
||||
- "LIM-89 GNA Mise en place de la communication API EasyWMS SAP CPI.md"
|
||||
last_updated: 2026-05-12
|
||||
author: Arthur
|
||||
---
|
||||
|
||||
# Intégration GNA → SAP-CPI
|
||||
|
||||
> **Résumé** : mise en place de la communication entre le GNA (middleware
|
||||
> EasyWMS) et SAP-CPI (middleware cloud SAP) pour l'envoi de tous les
|
||||
> messages WMS sortants. Authentification OAuth 2.0 client_credentials,
|
||||
> endpoint unique, routage par MessageType.
|
||||
|
||||
> **Standard EasyWMS** : → voir [ERP Integration](../../architecture/erp-integration.md)
|
||||
> L'intégration standard cible généralement un ERP via API REST classique
|
||||
> (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),
|
||||
> [Référence messages](messages-reference.md),
|
||||
> [Mapping ERP-WMS](mapping-erp-wms.md)
|
||||
|
||||
## Contexte projet
|
||||
|
||||
Dans le cadre du projet Limagrain, le middleware GNA doit envoyer les
|
||||
messages WMS vers SAP via la plateforme **SAP-CPI** (Cloud Platform
|
||||
Integration). Une implémentation de référence existe chez un autre client
|
||||
(AD) mais communique avec un ERP SAP-AIG via une API REST classique
|
||||
(OAuth password grant).
|
||||
|
||||
L'intégration Limagrain est différente : elle cible **SAP-CPI** avec un
|
||||
**endpoint unique** et une authentification **OAuth 2.0 client_credentials**.
|
||||
|
||||
## Architecture technique
|
||||
|
||||
### Script principal
|
||||
|
||||
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.
|
||||
|
||||
### Flux de communication
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant WMS as EasyWMS
|
||||
participant GNA as GNA (BOO)
|
||||
participant OAuth as SAP OAuth Server
|
||||
participant CPI as SAP-CPI
|
||||
|
||||
WMS->>GNA: Transaction WMS (LOC.SEND, REF01, etc.)
|
||||
GNA->>GNA: Vérifier cache token
|
||||
alt Token expiré ou absent
|
||||
GNA->>OAuth: POST /oauth/token (client_credentials)
|
||||
OAuth-->>GNA: Bearer token + expiration
|
||||
GNA->>GNA: Sauvegarder token sur disque
|
||||
end
|
||||
GNA->>CPI: POST /http/ATHInboundMessage
|
||||
Note right of CPI: Body: {MessageType, MessageSAP, data}
|
||||
CPI-->>GNA: HTTP 200 / erreur
|
||||
alt Erreur HTTP (hors 401)
|
||||
GNA->>CPI: Retry backoff (2s, 4s, 8s, 16s)
|
||||
end
|
||||
alt HTTP 401
|
||||
GNA->>GNA: Échec immédiat (token invalide)
|
||||
end
|
||||
```
|
||||
|
||||
## Authentification OAuth 2.0
|
||||
|
||||
### Mécanisme
|
||||
|
||||
1. Le GNA obtient un **token bearer** auprès du serveur SAP via un POST
|
||||
sur `/oauth/token` avec `client_id` et `client_secret`
|
||||
2. Le grant type est `client_credentials` (pas de password grant)
|
||||
3. Le token est **mis en cache sur disque** (fichier JSON) avec gestion
|
||||
de l'expiration (marge de sécurité de 60 secondes)
|
||||
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
|
||||
|
||||
Pour chaque message WMS exporté, le GNA envoie un POST vers l'endpoint
|
||||
unique SAP-CPI `/http/ATHInboundMessage` avec le body JSON suivant :
|
||||
|
||||
```json
|
||||
{
|
||||
"MessageType": "<type_message_WMS>",
|
||||
"MessageSAP": "<code_CPI>",
|
||||
"data": "<contenu_message>"
|
||||
}
|
||||
```
|
||||
|
||||
Le champ `MessageType` permet au iFlow CPI de **router le message** vers
|
||||
le bon traitement SAP.
|
||||
|
||||
## Table de correspondance MessageType → MessageSAP
|
||||
|
||||
Le champ `MessageSAP` est déterminé par une table de correspondance entre
|
||||
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 |
|
||||
| ATH201 | LOC | Message périodique delta mouvements |
|
||||
| ATH202 | LOF | Finalisation chargement |
|
||||
|
||||
> ⚠️ 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é :
|
||||
|
||||
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`
|
||||
|
||||
## 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 |
|
||||
|
||||
## Configuration requise
|
||||
|
||||
Six clés `CPI_*` à ajouter dans `CommonAppSettings.config`
|
||||
(section `appSettings`) :
|
||||
|
||||
| Clé | Description |
|
||||
|-----|-------------|
|
||||
| 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_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) |
|
||||
|
||||
## Fichiers impactés
|
||||
|
||||
| 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_* |
|
||||
|
||||
## Logging
|
||||
|
||||
Chaque étape (connexion, récupération token, envoi message) doit être
|
||||
loguée avec les détails de la requête et de la réponse. Le body JSON
|
||||
est logué en **format indenté** pour faciliter le debug.
|
||||
|
||||
> ⚠️ Le **token ne doit jamais être logué** (sécurité).
|
||||
|
||||
## 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
|
||||
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
|
||||
|
||||
## Points d'attention
|
||||
|
||||
⚠️ Le **secret OAuth est en clair** dans le fichier de configuration —
|
||||
accès au fichier à restreindre.
|
||||
|
||||
⚠️ 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
|
||||
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)
|
||||
|
||||
## Historique des modifications
|
||||
|
||||
| Date | Auteur | Modification |
|
||||
|------|--------|--------------|
|
||||
| 2026-05-12 | Arthur | Création depuis LIM-89 |
|
||||
|
||||
## Références
|
||||
|
||||
| Source | Type | Date |
|
||||
|--------|------|------|
|
||||
| [LIM-89](https://easywmsfrance.atlassian.net/browse/LIM-89) | Ticket Jira | 2026 |
|
||||
@@ -0,0 +1,494 @@
|
||||
---
|
||||
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
|
||||
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
|
||||
author: Arthur
|
||||
---
|
||||
|
||||
# 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.
|
||||
> Le LOC remplace les messages PCK, MOVE, STV et STC et devient le **seul
|
||||
> canal** de notification des mouvements de stock vers SAP.
|
||||
|
||||
> **Standard EasyWMS** : → voir [ERP Integration](../../architecture/erp-integration.md)
|
||||
> 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),
|
||||
> [Intégration GNA → SAP-CPI](gna-sap-cpi.md)
|
||||
|
||||
## Contexte projet
|
||||
|
||||
Le LOC est un message custom envoyé du WMS vers SAP **toutes les 5 minutes**
|
||||
(✅ reconfirmé le 30/04/2026), contenant l'état de toutes les HU ayant subi
|
||||
une modification durant la période écoulée.
|
||||
|
||||
Il **remplace** les messages PCK et MOVE (supprimés) et centralise la
|
||||
communication des mouvements physiques vers l'ERP. Le LOC ne transmet pas
|
||||
l'intégralité de la base, uniquement le **delta sur la fenêtre de 5 minutes**
|
||||
(basé sur la `CreationDate` des transactions WMS).
|
||||
|
||||
### Pourquoi le LOC plutôt que des STV purs ?
|
||||
|
||||
Limagrain (Nicolas Sanchez) a exprimé que les STV en delta (+/-)
|
||||
ne sont **pas fiables** : si un message se perd ou est mal intégré, l'écart
|
||||
est définitivement perdu. Limagrain souhaite recevoir des **quantités
|
||||
absolues** que SAP prend pour argent comptant et compare à ses propres
|
||||
données pour générer les écritures de delta.
|
||||
|
||||
Le LOC est un **fork fonctionnel du WSC** (Warehouse Stock Count) adapté
|
||||
pour ne remonter que le delta des 5 dernières minutes, formaté selon un
|
||||
JSON spécifique attendu par SAP.
|
||||
|
||||
### Décisions structurantes
|
||||
|
||||
- **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
|
||||
B6 (blocage logistique) et sont couverts par le LOC (action R/U).
|
||||
Les statuts des retours sont remontés dans le REF
|
||||
|
||||
## Architecture technique
|
||||
|
||||
### Chaîne de traitement
|
||||
|
||||
```
|
||||
Job (toutes les 5 min) → Workflow → Transaction custom LOC.SEND → GNA →
|
||||
Script BOO (requêtes WMS + agrégation + formatage JSON) → POST API SAP
|
||||
```
|
||||
|
||||
### Côté WMS
|
||||
|
||||
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 —
|
||||
toute la logique est dans le GNA
|
||||
|
||||
### Côté GNA
|
||||
|
||||
1. Un **script BOO** dédié au message LOC est créé dans le GNA
|
||||
2. Le GNA détecte la transaction custom `LOC.SEND`
|
||||
3. À réception, le script BOO :
|
||||
- Collecte toutes les transactions WMS pertinentes sur le delta de temps
|
||||
- Agrège les données par HU et détermine le code ACTION pour chaque
|
||||
mouvement
|
||||
- Construit le JSON au format attendu par SAP
|
||||
- Effectue un **appel POST** vers l'API SAP-CPI (voir
|
||||
[Intégration GNA → SAP-CPI](gna-sap-cpi.md))
|
||||
|
||||
### Détection du delta
|
||||
|
||||
1. À chaque exécution, enregistrer un timestamp de dernière exécution
|
||||
2. Récupérer toutes les transactions dont `CreationDate > dernier_timestamp`
|
||||
et `CreationDate ≤ timestamp_courant`
|
||||
3. Agréger par HU, déterminer le code ACTION pour chaque mouvement
|
||||
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
|
||||
|
||||
| Code | Signification | Déclencheur |
|
||||
|------|---------------|-------------|
|
||||
| **B** | Déplacement bin-to-bin | Déplacement de HU d'une zone à une autre |
|
||||
| **U** | Set to Unrestricted (déblocage) | Déblocage statut B6 |
|
||||
| **R** | Set to Restricted (blocage) | Blocage statut B6 |
|
||||
| **S** | Scrap quantity (suppression) | Suppression de stock / support |
|
||||
| **T** | Transfert inter-HU | Transfert de quantité entre deux HU |
|
||||
| **C** | Correction de poids | Ajustement de quantité (valeur absolue) |
|
||||
| **P** | Assignation client | Palette positionnée sur image de quai |
|
||||
|
||||
### Palettes exclues du LOC
|
||||
|
||||
**Exclure les palettes liées à une réception non fermée** (= dont le REF
|
||||
n'a pas encore été envoyé). Seules les HU déjà connues de SAP via un REF
|
||||
préalable doivent apparaître dans le LOC.
|
||||
|
||||
## Format JSON attendu par SAP
|
||||
|
||||
### Paramètres d'import
|
||||
|
||||
| Réf. | Champ | Type | Description |
|
||||
|------|-------|------|-------------|
|
||||
| 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
|
||||
|
||||
```json
|
||||
{
|
||||
"IV_LGNUM": "WF02",
|
||||
"IV_TREATMENT_ID": "<HORODATAGE_GENERATION_LOC>",
|
||||
"IT_CREATE": [
|
||||
{
|
||||
"MATNR": "<CODE_PRODUIT_SAP>",
|
||||
"BATCHID": "<LOT_SAP>",
|
||||
"ACTION": "<CODE_ACTION>",
|
||||
"ANFME": "<QUANTITE_OU_VIDE>",
|
||||
"ALTME": "<UDM_OU_VIDE>",
|
||||
"VLPLA": "<ZONE_STOCKAGE_ORIGINE>",
|
||||
"NLPLA": "<ZONE_STOCKAGE_DESTINATION>",
|
||||
"VLENR": "<CODE_SUPPORT_ORIGINE>",
|
||||
"NLENR": "<CODE_SUPPORT_DESTINATION>",
|
||||
"REASON": "<CODE_RAISON_OU_VIDE>",
|
||||
"VBELN": "<CODE_LIVRAISON_OU_VIDE>",
|
||||
"POSNR": "<LIGNE_LIVRAISON_OU_VIDE>"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### 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 |
|
||||
| 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 |
|
||||
| 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 |
|
||||
|
||||
### Données stock/container à récupérer par ligne LOC
|
||||
|
||||
Pour chaque HU identifiée dans les transactions du delta :
|
||||
|
||||
- **Code produit SAP** : attribut logistique LotCode du stock
|
||||
- **Code lot SAP** : ItemCode du stock (= code article WMS)
|
||||
- **Quantité** : quantité actuelle de la ligne de stock (UdM de base WMS =
|
||||
unité alternative SAP)
|
||||
- **UdM** : BAG ou KG
|
||||
- **Zone de stockage** : zone WMS du container (origine et destination)
|
||||
- **Code support** : ContainerCode (SSCC)
|
||||
- **Code livraison sortante** : ShippingOrderCode si action P
|
||||
|
||||
## Règles de remplissage par action
|
||||
|
||||
| Champ | B (déplacement) | U/R (statut) | S (suppression) | T (transfert) | C (correction) | P (assignation) |
|
||||
|-------|-----------------|--------------|-----------------|---------------|----------------|-----------------|
|
||||
| MATNR | Vide | Code produit | Code produit | Code produit | Code produit | Vide |
|
||||
| BATCHID | Vide | Lot SAP | Lot SAP | Lot SAP | Lot SAP | Vide |
|
||||
| ACTION | B | U ou R | S | T | C | P |
|
||||
| ANFME | Vide | Vide | Qté supprimée | Qté transférée | Qté absolue | Vide |
|
||||
| ALTME | Vide | UdM | UdM | UdM | UdM | Vide |
|
||||
| VLPLA | Zone origine | Zone actuelle | Zone actuelle | Zone HU source | Zone actuelle | Vide |
|
||||
| NLPLA | Zone destination | Vide | Vide | Zone HU dest. | Vide | Image de quai |
|
||||
| VLENR | Code HU | Code HU | Code HU | Code HU source | Code HU | Code HU |
|
||||
| NLENR | Vide | Vide | Vide | Code HU dest. | Vide | Vide |
|
||||
| REASON | Vide | Vide | ZSC1 | Vide | Vide | Vide |
|
||||
| VBELN | Vide | Vide | Vide | Vide | Vide | Code livraison |
|
||||
| POSNR | Vide | Vide | Vide | Vide | Vide | Ligne livraison |
|
||||
|
||||
## Règles métier par type d'action
|
||||
|
||||
### 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.
|
||||
Le contenu de la HU n'est pas rediscuté.
|
||||
|
||||
### ACTION = U / R (Déblocage / Blocage statut)
|
||||
|
||||
Hors flux retour, le seul statut autorisé est le **B6** (blocage
|
||||
logistique). ACTION=R pour bloquer, ACTION=U pour débloquer.
|
||||
|
||||
Les statuts exotiques des retours (B6, F2, F9, etc.) sont gérés dans
|
||||
le **REF** de la réception retour, pas dans le LOC.
|
||||
|
||||
### ACTION = S (Suppression / Scrap)
|
||||
|
||||
REASON est renseigné **uniquement** pour cette action. Valeur : `ZSC1`
|
||||
(scrapping normal). Pas d'autre valeur possible.
|
||||
|
||||
### ACTION = T (Transfert inter-HU)
|
||||
|
||||
Source et destination **dans la même ligne** (VLENR + NLENR). ANFME =
|
||||
quantité transférée (pas le solde restant).
|
||||
|
||||
Si le transfert passe par une étape intermédiaire (table de travail),
|
||||
transmettre chaque étape séparément avec un emplacement matérialisé.
|
||||
|
||||
**Cas picking** : 5 tâches alimentant la même palette fille = 5 lignes
|
||||
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
|
||||
source connue.
|
||||
|
||||
### ACTION = C (Correction de quantité)
|
||||
|
||||
Quantité **absolue** comptée/validée (pas un écart). SAP calcule le
|
||||
delta. REASON n'est pas renseigné.
|
||||
|
||||
### ACTION = P (Assignation client)
|
||||
|
||||
Déclencheur : palette physiquement positionnée sur l'**image de quai**
|
||||
(pas l'assignation logique). Champs obligatoires :
|
||||
|
||||
- ACTION = P
|
||||
- VLENR = Code HU
|
||||
- NLPLA = Image de quai de la HU
|
||||
- VBELN = Code livraison sortante SAP (= SorCode côté WMS)
|
||||
- POSNR = Ligne de livraison sortante SAP (= ligne d'OS associée à
|
||||
l'article)
|
||||
|
||||
Les champs MATNR, BATCHID, ANFME, ALTME, VLPLA, NLENR, REASON sont
|
||||
**vides** pour cette action.
|
||||
|
||||
## Transactions WMS sources
|
||||
|
||||
| Transaction WMS | Action LOC | Données à récupérer |
|
||||
|-----------------|------------|---------------------|
|
||||
| CON.MOVE | **B** (déplacement) | ContainerCode, zone origine, zone destination |
|
||||
| CON.LOCATE | **B** (déplacement) | Idem |
|
||||
| STK.MOVE | **B** ou **T** | ContainerCode source et dest. Si ContainerTo ≠ ContainerCode → T avec qté transférée |
|
||||
| STK.ADJ | **C** (correction) | ContainerCode, quantité absolue actuelle après ajustement, UdM |
|
||||
| CST.STK | **U** ou **R** | ContainerCode, nouveau statut (B6 uniquement hors retour) |
|
||||
| STK.PICKING | **T** (transfert) | Container source, container destination (palette fille), qté transférée |
|
||||
| CON.DELETE | **S** (suppression) | ContainerCode, quantité supprimée |
|
||||
|
||||
> ⚠️ Vérifier si d'autres transactions sont utiles pour le LOC
|
||||
> (ex. STK.SCR pour le scrap depuis RF).
|
||||
|
||||
## Zones de stockage (VLPLA / NLPLA)
|
||||
|
||||
Les codes zone WMS ne correspondent pas directement aux codes emplacement
|
||||
SAP. Une **table de correspondance** est nécessaire, réalisée via un
|
||||
paramètre EasyS (ex : `[TK_5_A:TK_5][TK_5_B:TK_5]`).
|
||||
|
||||
### Zones attendues par SAP
|
||||
|
||||
| Zone SAP | Correspondance WMS |
|
||||
|----------|--------------------|
|
||||
| ASRS1 | TK1 (compartiment anoxie) |
|
||||
| ASRS2 | TK2 (compartiment du milieu) |
|
||||
| ASRS3 | Zone accessible du TK3 uniquement (grand compartiment) |
|
||||
| ASRS4 | Zone accessible du TK4 uniquement (grand compartiment) |
|
||||
| ASRS34 | Zone accessible des deux TK3 et TK4 (grand compartiment) |
|
||||
| PICKING | Si présent sur un PK/TP |
|
||||
| QUAI | Si présent sur un emplacement d'image de quai ou sur le quai |
|
||||
|
||||
## Horodatage (IV_TREATMENT_ID)
|
||||
|
||||
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).
|
||||
|
||||
## Ordre des lignes
|
||||
|
||||
Les lignes dans IT_CREATE doivent être dans l'**ordre chronologique**
|
||||
des transactions WMS. SAP traite les lignes dans l'ordre du fichier.
|
||||
|
||||
## Contraintes de longueur
|
||||
|
||||
| Champ | Type | Longueur max |
|
||||
|-------|------|--------------|
|
||||
| IV_LGNUM | CHAR | 4 |
|
||||
| IV_TREATMENT_ID | CHAR | 24 |
|
||||
| MATNR | CHAR | 40 |
|
||||
| BATCHID | CHAR | 10 |
|
||||
| ACTION | CHAR | 1 |
|
||||
| ANFME | NUM | 13.3 (13 entiers, 3 décimales) |
|
||||
| ALTME | CHAR | 3 |
|
||||
| VLPLA | CHAR | 18 |
|
||||
| NLPLA | CHAR | 18 |
|
||||
| VLENR | CHAR | 20 |
|
||||
| NLENR | CHAR | 20 |
|
||||
| REASON | CHAR | 4 |
|
||||
|
||||
## Désactivation STV et STC
|
||||
|
||||
### STV
|
||||
|
||||
Désactiver le post-processing des transactions STK.ADJ → plus de
|
||||
génération de message STV. Le LOC couvre ce besoin via ACTION=C.
|
||||
|
||||
**Vérifications préalables obligatoires :**
|
||||
|
||||
- Lister toutes les transactions qui génèrent un STV et confirmer que le
|
||||
LOC couvre chaque cas
|
||||
- Vérifier que le middleware GNA n'a pas d'autre dépendance au STV
|
||||
|
||||
### STC
|
||||
|
||||
Désactiver le post-processing des transactions CST.STK → plus de
|
||||
génération de message STC. Le LOC couvre le B6 via ACTION=R/U.
|
||||
|
||||
Mêmes vérifications à effectuer que pour le STV. Documenter les
|
||||
résultats de cette analyse dans un commentaire de la tâche avant de
|
||||
procéder à la désactivation.
|
||||
|
||||
## Critères d'acceptation
|
||||
|
||||
1. Un job WMS tourne toutes les 5 minutes et crée une transaction custom
|
||||
LOC.SEND
|
||||
2. Le GNA détecte cette transaction et génère un JSON LOC conforme
|
||||
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 —
|
||||
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,
|
||||
REASON, VBELN, POSNR vides
|
||||
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
|
||||
13. IV_TREATMENT_ID = horodatage de génération (CHAR 24)
|
||||
14. Aucune transaction pertinente sur le delta → pas d'envoi de LOC
|
||||
15. Contraintes de longueur respectées sur tous les champs
|
||||
16. STV et STC désactivés après validation de l'analyse d'impact
|
||||
17. Picking N tâches → N lignes ACTION=T dans l'ordre chronologique
|
||||
18. SSCC inconnu en NLENR lors d'un ACTION=T → LOC ne bloque pas, SAP
|
||||
crée la HU automatiquement
|
||||
|
||||
## Cas de tests
|
||||
|
||||
### Architecture et Job
|
||||
|
||||
| CT | CA | Description | Résultat attendu |
|
||||
|----|-----|-------------|------------------|
|
||||
| CT-01 | 1 | Déclenchement job toutes les 5 min | 3 transactions LOC.SEND en 15 min |
|
||||
| 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
|
||||
|
||||
| CT | CA | Description | Résultat attendu |
|
||||
|----|-----|-------------|------------------|
|
||||
| CT-10 | 4,5 | Déplacement via CON.MOVE | ACTION=B, seuls VLPLA/NLPLA/VLENR renseignés |
|
||||
| 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
|
||||
|
||||
| CT | CA | Description | Résultat attendu |
|
||||
|----|-----|-------------|------------------|
|
||||
| CT-20 | 4,6 | Blocage HU via CST.STK (→ B6) | ACTION=R, MATNR/BATCHID/ALTME/VLPLA/VLENR renseignés |
|
||||
| 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
|
||||
|
||||
| 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
|
||||
|
||||
| CT | CA | Description | Résultat attendu |
|
||||
|----|-----|-------------|------------------|
|
||||
| CT-40 | 4,8 | STK.MOVE avec ContainerTo ≠ ContainerCode | ACTION=T, VLENR+NLENR+ANFME renseignés |
|
||||
| CT-41 | 4,8 | STK.PICKING | ACTION=T, ANFME = qté transférée (pas solde) |
|
||||
| CT-42 | 17 | 3 pickings → même palette fille | 3 lignes T dans l'ordre chronologique |
|
||||
| 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é
|
||||
|
||||
| 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
|
||||
|
||||
| CT | CA | Description | Résultat attendu |
|
||||
|----|-----|-------------|------------------|
|
||||
| CT-60 | 4,10 | Palette sur image de quai | ACTION=P, VLENR/NLPLA/VBELN/POSNR renseignés |
|
||||
| CT-61 | 10 | Champs vides vérifiés | MATNR/BATCHID/ANFME/ALTME/VLPLA/NLENR/REASON vides |
|
||||
|
||||
### Filtre d'exclusion
|
||||
|
||||
| CT | CA | Description | Résultat attendu |
|
||||
|----|-----|-------------|------------------|
|
||||
| CT-70 | 11 | HU réception non fermée (pas de REF) | Aucune ligne dans le LOC |
|
||||
| CT-71 | 11 | HU réception fermée (REF envoyé) | Ligne présente dans le LOC |
|
||||
|
||||
### Ordre chronologique et horodatage
|
||||
|
||||
| CT | CA | Description | Résultat attendu |
|
||||
|----|-----|-------------|------------------|
|
||||
| CT-80 | 12 | 3 transactions dans l'ordre | Lignes dans l'ordre chronologique |
|
||||
| CT-81 | 13 | IV_TREATMENT_ID | Horodatage de génération, ≤ 24 car. |
|
||||
|
||||
### Contraintes de longueur et cas combinés
|
||||
|
||||
| CT | CA | Description | Résultat attendu |
|
||||
|----|-----|-------------|------------------|
|
||||
| CT-90 | 15 | Valeurs aux limites de longueur | JSON sans troncature |
|
||||
| CT-91 | 15 | ANFME avec décimales | Format NUM 13.3 respecté |
|
||||
| CT-100 | 16 | STK.ADJ après désactivation STV | Pas de STV, LOC contient ACTION=C |
|
||||
| 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 |
|
||||
|
||||
## Points d'attention
|
||||
|
||||
⚠️ **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
|
||||
globalement désactivé.
|
||||
|
||||
⚠️ Le LOC ne doit jamais transmettre de palettes dont la réception n'est
|
||||
pas fermée (pas de REF envoyé).
|
||||
|
||||
⚠️ Pour ACTION=B, les champs MATNR, BATCHID, ANFME, ALTME sont tous vides.
|
||||
|
||||
⚠️ 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).
|
||||
|
||||
## Questions ouvertes
|
||||
|
||||
- [ ] 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)
|
||||
(@Fabien)
|
||||
- [ ] Vérifier si d'autres transactions WMS sont utiles pour le LOC
|
||||
(ex. STK.SCR) (@Fabien)
|
||||
|
||||
## Historique des modifications
|
||||
|
||||
| Date | Auteur | Modification |
|
||||
|------|--------|--------------|
|
||||
| 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 |
|
||||
|
||||
## Références
|
||||
|
||||
| Source | Type | Date |
|
||||
|--------|------|------|
|
||||
| [LIM-76](https://easywmsfrance.atlassian.net/browse/LIM-76) | Ticket Jira (LOT 1.2) | 2026 |
|
||||
| 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 |
|
||||
@@ -0,0 +1,173 @@
|
||||
---
|
||||
title: "Mapping ERP-WMS — Changement article et propriétaire"
|
||||
tags: [ERP, mapping, CHG, STR, article, propriétaire, custom]
|
||||
status: draft
|
||||
standard_ref: architecture/erp-integration.md
|
||||
jira_refs: []
|
||||
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
|
||||
author: Arthur
|
||||
---
|
||||
|
||||
# Mapping ERP-WMS — Changement article et propriétaire
|
||||
|
||||
> **Résumé** : processus [CUSTOM] de changement d'article et de propriétaire
|
||||
> en cours de vie du stock, via message CHG.
|
||||
|
||||
> **Standard EasyWMS** : → voir [ERP Integration](../../architecture/erp-integration.md)
|
||||
> Ce qui suit documente les **spécificités Limagrain** par rapport au standard.
|
||||
|
||||
> Voir aussi : [Données principales et stock](donnees-principales.md) pour
|
||||
> le mapping complet ITM, attributs logistiques et architecture article/lot.
|
||||
|
||||
## Contexte projet
|
||||
|
||||
Chez Limagrain, l'article (numéro, description et destination) et le
|
||||
propriétaire peuvent être modifiés en cours de vie du stock. Ces changements
|
||||
sont notifiés par un message CHG descendant de SAP vers EasyWMS.
|
||||
|
||||
Le message standard STR (Stock Transfer Request) est aussi utilisé pour
|
||||
les demandes de changement de statut de stock.
|
||||
|
||||
## Message STR — Demande de Changement de Stock
|
||||
|
||||
### Cas d'usage
|
||||
|
||||
L'ERP envoie un STR pour :
|
||||
|
||||
- Changement de code article (produit SAP + description)
|
||||
- Changement de propriétaire
|
||||
- Blocage/déblocage de lot
|
||||
|
||||
### Règles d'acceptation
|
||||
|
||||
- **Accepté** si la palette n'est pas assignée à une commande ou en cours
|
||||
de mouvement
|
||||
- **Refusé** si palette "client" ou en préparation → code erreur API explicite
|
||||
(ERR renvoyé à SAP)
|
||||
|
||||
### Interaction STV/GNA
|
||||
|
||||
L'ajustement de stock avec motif "STR" est filtré par le middleware GNA
|
||||
(pas de retraitement STV pour éviter les doublons). Ce mécanisme devient
|
||||
caduc si le STV est globalement désactivé (décision 30/04/2026).
|
||||
|
||||
### Monitoring
|
||||
|
||||
Limagrain mettra en place un **monitoring des erreurs** STR pour les cas
|
||||
de refus. Les refus sont attendus en fonctionnement normal (palette en
|
||||
cours de préparation au moment du STR).
|
||||
|
||||
## Message CHG — Changement article / propriétaire
|
||||
|
||||
### Contenu du message
|
||||
|
||||
| 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 |
|
||||
|
||||
### Contrainte d'exécution
|
||||
|
||||
Le changement ne peut avoir lieu **que si le stock n'est pas assigné à
|
||||
un processus** (picking, expédition, regroupement, etc.).
|
||||
|
||||
Si le stock est assigné → le message CHG génère un message **ERR** pour
|
||||
informer SAP que le changement est impossible.
|
||||
|
||||
## Statut de stock
|
||||
|
||||
### Changement sur poste de travail
|
||||
|
||||
[CUSTOM] L'utilisateur peut changer le statut du stock sur le poste de
|
||||
travail **uniquement** lors du processus de **retour commandes clients**,
|
||||
pour appliquer :
|
||||
|
||||
- **F9** — Sacs sales
|
||||
- **B6** — Non conforme
|
||||
|
||||
Un commentaire est associé au statut et remonté dans le message d'interface
|
||||
(STC) pour informer l'ERP.
|
||||
|
||||
### Attributs du statut de stock
|
||||
|
||||
[CUSTOM] 3 attributs relatifs au statut de stock chez Limagrain :
|
||||
|
||||
1. **Statut de stock** : valeur du statut (ex : F9, B6)
|
||||
2. **Commentaire** : raison du changement (liste déroulante contextuelle)
|
||||
3. **Date de changement** : horodatage automatique
|
||||
|
||||
Les commentaires sont présentés sous une liste déroulante avec les
|
||||
possibilités dépendant du statut sélectionné.
|
||||
|
||||
### Autonomie Limagrain
|
||||
|
||||
Limagrain peut créer ses propres statuts de stock :
|
||||
|
||||
- Menu « Données principales » → « Types de verrous » → « Statut de stock »
|
||||
- Bouton « Nouveau » → remplir les champs requis
|
||||
|
||||
## Diagramme de séquence — Changement article
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant SAP
|
||||
participant WMS as EasyWMS
|
||||
|
||||
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)
|
||||
end
|
||||
```
|
||||
|
||||
## Diagramme de séquence — Changement statut (retour client)
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant OP as Opérateur
|
||||
participant WMS as EasyWMS
|
||||
participant SAP
|
||||
|
||||
OP->>WMS: Changement statut (F9 ou B6) + commentaire
|
||||
WMS->>WMS: MAJ statut ligne de stock
|
||||
WMS->>SAP: STC (notification changement statut)
|
||||
```
|
||||
|
||||
## Points d'attention
|
||||
|
||||
⚠️ Le CHG ne renvoie pas de confirmation positive — seule l'erreur (ERR)
|
||||
est remontée si le changement échoue.
|
||||
|
||||
⚠️ Le changement de statut sur poste est limité au processus retour client
|
||||
(pas en picking ni en regroupement).
|
||||
|
||||
⚠️ Le message STR (standard) est aussi utilisé pour des demandes de
|
||||
changement de statut initiées par SAP.
|
||||
|
||||
## Questions ouvertes
|
||||
|
||||
- [ ] 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)
|
||||
|
||||
## Historique des modifications
|
||||
|
||||
| Date | Auteur | Modification |
|
||||
|------|--------|--------------|
|
||||
| 2026-05-05 | Arthur | Création initiale depuis AF V1.5 |
|
||||
| 2026-05-06 | Arthur | Ajout section STR détaillée (CR consolidé ERP) |
|
||||
|
||||
## Références
|
||||
|
||||
| Source | Type | Date |
|
||||
|--------|------|------|
|
||||
| FR-SW-04-07_LIMAGRAIN_Functional_Analysis_V1.5 | Analyse fonctionnelle | 28/11/2025 |
|
||||
| CR CONSOLIDES REU ERP LIMAGRAIN V1 | CR ateliers interfaçage | 23/02/2026 |
|
||||
@@ -0,0 +1,321 @@
|
||||
---
|
||||
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: []
|
||||
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
|
||||
author: Arthur
|
||||
---
|
||||
|
||||
# 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.
|
||||
|
||||
> **Standard EasyWMS** : → voir [ERP Integration](../../architecture/erp-integration.md)
|
||||
> Ce qui suit documente les **spécificités Limagrain** par rapport au standard.
|
||||
|
||||
## Contexte projet
|
||||
|
||||
La communication entre SAP EWM et EasyWMS utilise XML + Webservice.
|
||||
Le détail des champs est dans le document « Liste Interfaces LIMAGRAIN »
|
||||
(fichier séparé). Cette page référence la typologie et le rôle de chaque
|
||||
message.
|
||||
|
||||
## Tableau synthétique
|
||||
|
||||
### SAP → EasyWMS (flux entrants)
|
||||
|
||||
| Domaine | Message | Standard/Custom | Description | Statut |
|
||||
|---------|---------|-----------------|-------------|--------|
|
||||
| Master Data | ITM | Standard | Fiche article (Lot SAP) | ✅ Validé |
|
||||
| Réception | ASN | Standard | Réception production (1 par palette) | ✅ Validé |
|
||||
| Réception | ROR | Standard | Réceptions externes + retours clients | ✅ Validé |
|
||||
| Expédition | SOR | Standard | Ordres de sortie (prod/recertif) | ✅ Validé |
|
||||
| Expédition | RUT | Standard | Routes / tournées client | ✅ Validé |
|
||||
| Stock | STR | Standard | Demande changement de stock (article, statut) | ✅ Validé |
|
||||
| Inventaire | COR | Standard | Demande d'échantillonnage | ✅ Validé |
|
||||
| Inventaire | SCR | Standard | Demande image de stock de l'entrepôt | ✅ Validé |
|
||||
|
||||
### EasyWMS → SAP (flux sortants)
|
||||
|
||||
| Domaine | Message | Standard/Custom | Description | Statut |
|
||||
|---------|---------|-----------------|-------------|--------|
|
||||
| Réception | REF | Standard | Finalisation de réception (+ zone stockage) | ✅ Validé |
|
||||
| Réception | ROF | Standard | Clôture d'ordre d'entrée | ✅ Validé |
|
||||
| Expédition | SOF | Standard | Finalisation ordre de sortie | 🟡 Phase 2 |
|
||||
| Expédition | LOF | Standard | Finalisation de chargement | ✅ Validé |
|
||||
| Stock | STV | Standard | Variation de stock | ⚠️ **DÉSACTIVÉ** (remplacé par LOC) |
|
||||
| Stock | STC | Standard | Notification changement de statut | ⚠️ **DÉSACTIVÉ** (remplacé par LOC) |
|
||||
| Stock | LOC | [CUSTOM] | Message périodique delta 5 min | ✅ Validé |
|
||||
| Stock | WSC | Standard | Image de stock journalière | 🟡 Volumétrie à vérifier |
|
||||
| Inventaire | COF | Standard | Confirmation d'échantillonnage | 🟡 Traitement à confirmer |
|
||||
| Expédition | PCK | [CUSTOM] | Passage conteneur client | ⚠️ **REMPLACÉ** par LOC |
|
||||
| Erreur | ERR | Standard | Erreur d'importation de message | ✅ Validé |
|
||||
|
||||
### Flux supprimés ou non retenus
|
||||
|
||||
| Message | Statut | Raison |
|
||||
|---------|--------|--------|
|
||||
| MOV | **Supprimé** | Redondant avec LOC + STR combinés |
|
||||
| PCK | **Remplacé** par LOC | Le LOC périodique couvre le besoin |
|
||||
| STV | **Désactivé** | Le LOC devient le seul canal stock (décision 30/04/2026) |
|
||||
| STC | **Désactivé** | Statuts hors retour = B6 uniquement via LOC |
|
||||
| ACC/SUP | **Non transmis** par l'ERP | Base client/fournisseur non interfacée |
|
||||
| ROC | **Non utilisé** a priori | À confirmer côté Limagrain |
|
||||
|
||||
### Messages bidirectionnels / custom
|
||||
|
||||
| Domaine | Message | Direction | Standard/Custom | Description |
|
||||
|---------|---------|-----------|-----------------|-------------|
|
||||
| Réception | API Lot | WMS ↔ ERP | [CUSTOM] | Demande/réponse lot SAP pour retours clients |
|
||||
| Stock | CHG | ERP → WMS | [CUSTOM] | Changement article et/ou propriétaire |
|
||||
|
||||
## Messages custom détaillés
|
||||
|
||||
### 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É
|
||||
|
||||
> **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é)
|
||||
|
||||
- **Déclencheur** : Job toutes les 5 min → WF → transaction `LOC.SEND` → GNA
|
||||
(script BOO) → POST SAP-CPI
|
||||
- **Remplace** : PCK, MOVE, STV, STC
|
||||
- **Actions** : B (déplacement), U/R (statut B6), S (suppression), T (transfert
|
||||
inter-HU), C (correction quantité), **P (assignation client)**
|
||||
- **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) —
|
||||
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É)
|
||||
|
||||
> ⚠️ **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.
|
||||
|
||||
- **Direction** : WMS → SAP
|
||||
- **Rôle initial** : notifier les ajustements de quantités manuels (hors flux
|
||||
standards réception/expédition)
|
||||
- **Mapping clé** :
|
||||
|
||||
| Balise | Utilisation |
|
||||
|--------|-------------|
|
||||
| Operation | C (positif) / D (négatif) |
|
||||
| Site | WF02 |
|
||||
| ItemCode | Code lot SAP |
|
||||
| OwnerCode | MECALUX |
|
||||
| ContainerCode | Numéro HU |
|
||||
| FilterAttributes | Attributs du stock existant modifié |
|
||||
| Attributes | Attributs du stock nouvellement créé |
|
||||
| ReasonCode | AJUSTEMENT MANUEL |
|
||||
| ERPReasonCode | ZSC1 |
|
||||
| Comment | Facultatif (opérateur) |
|
||||
|
||||
- **Point ouvert** : Limagrain doit définir comment gérer côté ERP un STV de
|
||||
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
|
||||
définitivement perdu
|
||||
|
||||
### STR — Demande de Changement de Stock
|
||||
|
||||
- **Direction** : ERP → WMS
|
||||
- **Cas d'usage** : changement de code article (produit SAP + description),
|
||||
changement de propriétaire, blocage/déblocage de lot
|
||||
- **Règles d'acceptation** :
|
||||
- **Accepté** si la palette n'est pas assignée à une commande ou en cours
|
||||
de mouvement
|
||||
- **Refusé** si palette "client" ou en préparation (code erreur API explicite)
|
||||
- **Interaction avec STV** : ajustement avec motif "STR" → le middleware (GNA)
|
||||
ne traite pas les STV avec ce motif pour éviter les doublons
|
||||
- **Monitoring** : Limagrain mettra en place un monitoring des erreurs pour
|
||||
les cas de refus
|
||||
- **Voir** : [Mapping ERP-WMS](mapping-erp-wms.md)
|
||||
|
||||
### COR — Demande d'Échantillonnage
|
||||
|
||||
- **Direction** : ERP → WMS
|
||||
- **Usage** : **uniquement** pour les demandes d'échantillonnage (pas pour les
|
||||
inventaires physiques classiques, gérés dans EasyWMS en phase 1)
|
||||
- **Mapping** :
|
||||
|
||||
| Balise | Valeur |
|
||||
|--------|--------|
|
||||
| Description | "ECHANTILLONNAGE" (en dur, discriminant WMS) |
|
||||
| Code | Numéro du lot d'inspection SAP |
|
||||
| Priority | 3 (basse) |
|
||||
| ProductCode | Code lot SAP |
|
||||
| LotCode | Code produit SAP |
|
||||
| Color, Source, Size | Attributs logistiques standards |
|
||||
|
||||
- **Flux** : COR envoyé → WMS fait venir la palette sur un poste de travail →
|
||||
opérateur prélève → palette repart en stockage → COF envoyé
|
||||
- **Règle** : un article en cours d'échantillonnage **n'est pas disponible**
|
||||
pour les ordres de sortie
|
||||
- **Voir** : [Échantillonnage](../03-picking/echantillonnage.md)
|
||||
|
||||
### COF — Confirmation d'Échantillonnage
|
||||
|
||||
- **Direction** : WMS → ERP
|
||||
- **Mapping** :
|
||||
|
||||
| Balise | Description |
|
||||
|--------|-------------|
|
||||
| CountCode | Numéro du lot d'inspection |
|
||||
| Status | Closed (effectué) ou Cancelled (annulé) |
|
||||
| UpdateDate | Date/heure de changement |
|
||||
|
||||
- **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
|
||||
|
||||
- **Direction** : WMS → ERP
|
||||
- **Rôle** : image de stock complète pour vérification de cohérence. Contient
|
||||
l'ensemble du stock : code OS, statut palette, toutes les informations
|
||||
disponibles
|
||||
- **Démarrage** : export manuel EasyWMS + export SAP + comparaison.
|
||||
Automatisation possible ultérieurement (quotidien à heure fixe)
|
||||
- **Point d'attention** : Limagrain doit vérifier sa capacité à traiter ce
|
||||
fichier (volumétrie potentiellement élevée pour CPI)
|
||||
- **Déclenchement** : transaction `SCR.REQ` ou `STOCKSYNC.ASKED`
|
||||
|
||||
### 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
|
||||
|
||||
- **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)
|
||||
|
||||
### API Lot SAP — Retours clients
|
||||
|
||||
- **Déclencheur** : lot officiel inconnu lors d'un retour client
|
||||
- **Contenu (demande)** : lot officiel à vérifier
|
||||
- **Contenu (réponse)** : lot SAP correspondant + attributs logistiques
|
||||
- **Parallèle** : un ITM est descendu avec les infos article
|
||||
- **Voir** : [Réception retour](../01-inbound/reception-retour.md)
|
||||
|
||||
## Flux par processus
|
||||
|
||||
### Réception production (ASN)
|
||||
|
||||
```
|
||||
SAP → ASN → EasyWMS → (réception + stockage) → REF → SAP
|
||||
→ ROF → SAP
|
||||
→ LOC (delta 5 min) → SAP
|
||||
```
|
||||
|
||||
### Réception extérieure / retour (ROR)
|
||||
|
||||
```
|
||||
SAP → ROR → EasyWMS → (réception + contrôle) → REF → SAP
|
||||
→ ROF → SAP
|
||||
→ LOC (delta 5 min) → SAP
|
||||
```
|
||||
|
||||
### Expédition client (RUT)
|
||||
|
||||
```
|
||||
SAP → RUT → EasyWMS → (picking + chargement) → LOC (delta 5 min) → SAP
|
||||
→ LOF → SAP
|
||||
→ SOF → SAP (phase 2)
|
||||
```
|
||||
|
||||
### Consommation OF (SOR)
|
||||
|
||||
```
|
||||
SAP → SOR → EasyWMS → (sortie) → LOC (delta 5 min) → SAP
|
||||
→ SOF → SAP (phase 2)
|
||||
```
|
||||
|
||||
### Échantillonnage
|
||||
|
||||
```
|
||||
SAP → COR → EasyWMS → (prélèvement poste) → COF → SAP
|
||||
```
|
||||
|
||||
### Image stock (vérification cohérence)
|
||||
|
||||
```
|
||||
SAP → SCR → EasyWMS → WSC → SAP (image complète)
|
||||
```
|
||||
|
||||
### Changement de stock
|
||||
|
||||
```
|
||||
SAP → STR → EasyWMS → (MAJ stock) → LOC (delta 5 min) → SAP
|
||||
OU → ERR → SAP (si stock assigné)
|
||||
```
|
||||
|
||||
## Points d'attention
|
||||
|
||||
⚠️ **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.
|
||||
|
||||
⚠️ 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
|
||||
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
|
||||
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
|
||||
STK.ADJ et vérifier couverture LOC (@Mecalux)
|
||||
- [ ] Effets de bord désactivation STC — idem pour CST.STK (@Mecalux)
|
||||
|
||||
## Historique des modifications
|
||||
|
||||
| Date | Auteur | Modification |
|
||||
|------|--------|--------------|
|
||||
| 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) |
|
||||
|
||||
## Références
|
||||
|
||||
| Source | Type | Date |
|
||||
|--------|------|------|
|
||||
| FR-SW-04-07_LIMAGRAIN_Functional_Analysis_V1.5 | Analyse fonctionnelle | 28/11/2025 |
|
||||
| CR CONSOLIDES REU ERP LIMAGRAIN V1 | CR ateliers interfaçage | 05/01 → 23/02/2026 |
|
||||
| Expédition - LIMAGRAIN - DEV | Page ateliers DEV | 2026 |
|
||||
@@ -0,0 +1,58 @@
|
||||
---
|
||||
title: "Interface ERP — Vue d'ensemble"
|
||||
tags: [erp, interface, messages, index]
|
||||
status: draft
|
||||
last_updated: 2026-05-05
|
||||
---
|
||||
|
||||
# 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.
|
||||
|
||||
> **Standard EasyWMS** : voir [ERP Integration](../../architecture/erp-integration.md)
|
||||
|
||||
## Pages de cette section
|
||||
|
||||
- [Référence messages](messages-reference.md)
|
||||
- [Données principales et stock](donnees-principales.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
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
subgraph SAP[SAP EWM]
|
||||
ITM[ITM]
|
||||
ASN[ASN]
|
||||
ROR[ROR]
|
||||
RUT[RUT]
|
||||
SOR[SOR]
|
||||
STR[STR]
|
||||
SCR[SCR]
|
||||
COR[COR]
|
||||
CHG[CHG]
|
||||
end
|
||||
subgraph WMS[EasyWMS]
|
||||
ROF[ROF]
|
||||
REF[REF]
|
||||
SOF[SOF]
|
||||
LOF[LOF]
|
||||
PCK[PCK]
|
||||
MOV[MOV]
|
||||
STV[STV]
|
||||
STC[STC]
|
||||
WSC[WSC]
|
||||
LOC[LOC]
|
||||
ERR[ERR]
|
||||
end
|
||||
SAP -->|ERP → WMS| WMS
|
||||
WMS -->|WMS → ERP| SAP
|
||||
```
|
||||
|
||||
> **21 messages** au total : 9 entrants (ERP → WMS), 11 sortants (WMS → ERP),
|
||||
> 1 bidirectionnel (API Lot). Voir [Référence messages](messages-reference.md)
|
||||
> pour le détail.
|
||||
@@ -0,0 +1,58 @@
|
||||
---
|
||||
title: "Interface ERP — Vue d'ensemble"
|
||||
tags: [erp, interface, messages, index]
|
||||
status: draft
|
||||
last_updated: 2026-05-05
|
||||
---
|
||||
|
||||
# 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.
|
||||
|
||||
> **Standard EasyWMS** : voir [ERP Integration](../../concepts/erp-interface.md)
|
||||
|
||||
## Pages de cette section
|
||||
|
||||
- [Référence messages](messages-reference.md)
|
||||
- [Données principales et stock](donnees-principales.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
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
subgraph SAP[SAP EWM]
|
||||
ITM[ITM]
|
||||
ASN[ASN]
|
||||
ROR[ROR]
|
||||
RUT[RUT]
|
||||
SOR[SOR]
|
||||
STR[STR]
|
||||
SCR[SCR]
|
||||
COR[COR]
|
||||
CHG[CHG]
|
||||
end
|
||||
subgraph WMS[EasyWMS]
|
||||
ROF[ROF]
|
||||
REF[REF]
|
||||
SOF[SOF]
|
||||
LOF[LOF]
|
||||
PCK[PCK]
|
||||
MOV[MOV]
|
||||
STV[STV]
|
||||
STC[STC]
|
||||
WSC[WSC]
|
||||
LOC[LOC]
|
||||
ERR[ERR]
|
||||
end
|
||||
SAP -->|ERP → WMS| WMS
|
||||
WMS -->|WMS → ERP| SAP
|
||||
```
|
||||
|
||||
> **21 messages** au total : 9 entrants (ERP → WMS), 11 sortants (WMS → ERP),
|
||||
> 1 bidirectionnel (API Lot). Voir [Référence messages](messages-reference.md)
|
||||
> pour le détail.
|
||||
@@ -0,0 +1,225 @@
|
||||
---
|
||||
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: []
|
||||
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
|
||||
author: Arthur
|
||||
---
|
||||
|
||||
# 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,
|
||||
> profils et gestion des poids.
|
||||
|
||||
> **Standard EasyWMS** : → voir [ERP Integration](../../concepts/erp-interface.md)
|
||||
> Ce qui suit documente les **spécificités Limagrain** par rapport au standard.
|
||||
|
||||
## Contexte projet
|
||||
|
||||
Les décisions ci-dessous sont issues des ateliers d'interfaçage EasyWMS / SAP
|
||||
réalisés entre le 05/01/2026 et le 23/02/2026, consolidées le 27/02/2026.
|
||||
|
||||
## Architecture retenue : Lot SAP = Article WMS
|
||||
|
||||
Le code article dans EasyWMS est le **code lot SAP** (et non le code produit
|
||||
SAP). L'option concaténation code produit + lot SAP a été étudiée et écartée.
|
||||
|
||||
Le **code produit SAP** est géré comme un attribut au niveau du stock (pas de
|
||||
la fiche article), car un même lot SAP peut correspondre à plusieurs produits
|
||||
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é |
|
||||
|
||||
### Côté SAP
|
||||
|
||||
Il existe une base article avec des codes articles uniques. Les articles sont
|
||||
gérés au lot. Chaque article peut avoir plusieurs codes lots SAP. Chaque code
|
||||
lot SAP a un équivalent code lot OFFICIEL national (relation 1:1).
|
||||
|
||||
### Côté EasyWMS
|
||||
|
||||
Chaque lot SAP est descendu via le fichier ITM. L'article SAP devient un
|
||||
attribut du lot SAP (et non l'inverse).
|
||||
|
||||
**Code article WMS = code lot SAP**
|
||||
|
||||
## Unité de base selon le type d'article
|
||||
|
||||
| Type article | Description | Unité de base WMS |
|
||||
|--------------|-------------|-------------------|
|
||||
| FERT | Produit fini | BAG (sac) |
|
||||
| ZSIZ | Semi-fini calibré | KG |
|
||||
|
||||
L'unité de base dans le WMS est l'unité logistique (pas l'unité de base SAP).
|
||||
Un même produit peut exister en BAG et en KG = codes articles WMS différents.
|
||||
|
||||
## Mapping fiche article (message ITM)
|
||||
|
||||
| Champ EasyWMS | Champ SAP | Remarque |
|
||||
|---------------|-----------|----------|
|
||||
| ItemCode | Code lot SAP | Clé principale |
|
||||
| Alias | Lot officiel | Relation 1:1, scannable |
|
||||
| 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 |
|
||||
| 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 |
|
||||
| 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 |
|
||||
| Conversion.Principale.CstAtt01 | Poids unitaire article | Poids théorique ERP |
|
||||
|
||||
## Profils logistiques
|
||||
|
||||
| Type d'article | Profil | Description |
|
||||
|----------------|--------|-------------|
|
||||
| Articles classiques | PROFIL_STANDARD | Gestion code produit + propriétaire + description + pays destination |
|
||||
| Palettes bois vides | PROFIL_PALETTE | Gestion palette bois vide |
|
||||
|
||||
## Attributs logistiques du stock
|
||||
|
||||
> **Décision du 11/02/2026** : les Custom Attributes au niveau du stock
|
||||
> (CstAtt01–04) ont été **supprimés** au profit des attributs logistiques
|
||||
> standards du WMS. Les modes de capture sont désactivés pour éviter la
|
||||
> customisation de tous les écrans.
|
||||
|
||||
| Champ EasyWMS (balise API) | Libellé affiché WMS | Champ SAP | Remarque |
|
||||
|----------------------------|---------------------|-----------|----------|
|
||||
| Lot | Lot | Code produit SAP | Différencie les produits pour un même lot SAP |
|
||||
| Color | Couleur | Code propriétaire SAP | ≠ "MECALUX" technique |
|
||||
| Source | Source | Description courte SAP | Désignation courte |
|
||||
| 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.
|
||||
|
||||
> **Point à tester** : en réception, la création du stock via les attributs
|
||||
> logistiques doit être validée (approche standard ou custom — à confirmer
|
||||
> par les tests).
|
||||
|
||||
## Gestion des codes clients / fournisseurs
|
||||
|
||||
La base client/fournisseur SAP **n'est pas interfacée** avec le WMS.
|
||||
Les codes sont gérés via des constantes + champ texte libre :
|
||||
|
||||
| Flux | Champ code | Champ Source |
|
||||
|------|------------|--------------|
|
||||
| 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" | — |
|
||||
|
||||
## 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é |
|
||||
|
||||
Le poids théorique de la ligne de stock (quantité × poids unitaire, hors
|
||||
poids palette) est transmis via l'attribut logistique `Weight`.
|
||||
|
||||
## Champs NON utilisés dans ITM
|
||||
|
||||
Les champs suivants sont explicitement exclus du mapping :
|
||||
|
||||
Stock Label, Classification ABC, Alertes stock (min/max), Image produit,
|
||||
Code danger (pas d'impact logistique), Températures min/max, Cross-docking,
|
||||
Gerbabilité (gérée via ordonnancement picking), Picking message, IsPacking.
|
||||
|
||||
## Conversions
|
||||
|
||||
- Unité de base = BAG ou KG (pas de conversion supplémentaire identifiée)
|
||||
- Pas de gestion financière ni de découpage dans les sacs
|
||||
- Le nombre de sacs par palette pleine est géré dans la conversion container
|
||||
(champ `ContainerQty`)
|
||||
|
||||
## Types de supports
|
||||
|
||||
| Type | Usage | Statut |
|
||||
|------|-------|--------|
|
||||
| EWM-PAL00 / PALETTE_US | Palette standard (un seul type) | ✅ Confirmé |
|
||||
| BIGBAG | Attribut de la HU (pas type séparé) | ✅ Validé |
|
||||
| Octobin | Hors périmètre phase 1 | ❌ |
|
||||
|
||||
La création de types de supports est techniquement lourde (nécessite passage
|
||||
par support Mecalux, impact design entrepôt). Les BigBag sont déclarés par
|
||||
l'opérateur au poste de réception. Le WMS ajuste le calcul de poids (+2 kg
|
||||
environ).
|
||||
|
||||
## Z-Bags (sacs vides)
|
||||
|
||||
Stockés dans le magasin automatique (SRS) **uniquement pour livraison aux
|
||||
clients**, pas pour l'approvisionnement production. Doivent respecter les
|
||||
mêmes formats et règles que les palettes produits. → À valider
|
||||
fonctionnellement.
|
||||
|
||||
## Paramètres généraux de l'interface
|
||||
|
||||
| Paramètre | Valeur |
|
||||
|-----------|--------|
|
||||
| Format | JSON |
|
||||
| Opération par défaut | 3 = Upsert |
|
||||
| Mode de mise à jour | Complete = true (fiche complète à chaque envoi) |
|
||||
| OwnerCode (technique) | "MECALUX" |
|
||||
| Site | WF02 |
|
||||
|
||||
## Points d'attention
|
||||
|
||||
⚠️ 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.
|
||||
|
||||
⚠️ 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
|
||||
développements en cours.
|
||||
|
||||
⚠️ Le mode Complete = true signifie que chaque ITM contient la fiche
|
||||
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
|
||||
custom ? À valider par tests (@Fabien)
|
||||
- [ ] Impact suppression CstAtt stock sur les développements existants (@Nicolas)
|
||||
|
||||
## Historique des modifications
|
||||
|
||||
| Date | Auteur | Modification |
|
||||
|------|--------|--------------|
|
||||
| 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é) |
|
||||
|
||||
## Références
|
||||
|
||||
| Source | Type | Date |
|
||||
|--------|------|------|
|
||||
| Données principales + stock - LIMAGRAIN - DEV | Page Confluence | 27/02/2026 |
|
||||
| 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 |
|
||||
@@ -0,0 +1,265 @@
|
||||
---
|
||||
title: "Intégration GNA → SAP-CPI"
|
||||
tags: [ERP, GNA, SAP-CPI, OAuth, middleware, API, BOO]
|
||||
status: draft
|
||||
standard_ref: architecture/erp-integration.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
|
||||
author: Arthur
|
||||
---
|
||||
|
||||
# Intégration GNA → SAP-CPI
|
||||
|
||||
> **Résumé** : mise en place de la communication entre le GNA (middleware
|
||||
> EasyWMS) et SAP-CPI (middleware cloud SAP) pour l'envoi de tous les
|
||||
> messages WMS sortants. Authentification OAuth 2.0 client_credentials,
|
||||
> endpoint unique, routage par MessageType.
|
||||
|
||||
> **Standard EasyWMS** : → voir [ERP Integration](../../concepts/erp-interface.md)
|
||||
> L'intégration standard cible généralement un ERP via API REST classique
|
||||
> (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),
|
||||
> [Référence messages](messages-reference.md),
|
||||
> [Mapping ERP-WMS](mapping-erp-wms.md)
|
||||
|
||||
## Contexte projet
|
||||
|
||||
Dans le cadre du projet Limagrain, le middleware GNA doit envoyer les
|
||||
messages WMS vers SAP via la plateforme **SAP-CPI** (Cloud Platform
|
||||
Integration). Une implémentation de référence existe chez un autre client
|
||||
(AD) mais communique avec un ERP SAP-AIG via une API REST classique
|
||||
(OAuth password grant).
|
||||
|
||||
L'intégration Limagrain est différente : elle cible **SAP-CPI** avec un
|
||||
**endpoint unique** et une authentification **OAuth 2.0 client_credentials**.
|
||||
|
||||
## Architecture technique
|
||||
|
||||
### Script principal
|
||||
|
||||
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.
|
||||
|
||||
### Flux de communication
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant WMS as EasyWMS
|
||||
participant GNA as GNA (BOO)
|
||||
participant OAuth as SAP OAuth Server
|
||||
participant CPI as SAP-CPI
|
||||
|
||||
WMS->>GNA: Transaction WMS (LOC.SEND, REF01, etc.)
|
||||
GNA->>GNA: Vérifier cache token
|
||||
alt Token expiré ou absent
|
||||
GNA->>OAuth: POST /oauth/token (client_credentials)
|
||||
OAuth-->>GNA: Bearer token + expiration
|
||||
GNA->>GNA: Sauvegarder token sur disque
|
||||
end
|
||||
GNA->>CPI: POST /http/ATHInboundMessage
|
||||
Note right of CPI: Body: {MessageType, MessageSAP, data}
|
||||
CPI-->>GNA: HTTP 200 / erreur
|
||||
alt Erreur HTTP (hors 401)
|
||||
GNA->>CPI: Retry backoff (2s, 4s, 8s, 16s)
|
||||
end
|
||||
alt HTTP 401
|
||||
GNA->>GNA: Échec immédiat (token invalide)
|
||||
end
|
||||
```
|
||||
|
||||
## Authentification OAuth 2.0
|
||||
|
||||
### Mécanisme
|
||||
|
||||
1. Le GNA obtient un **token bearer** auprès du serveur SAP via un POST
|
||||
sur `/oauth/token` avec `client_id` et `client_secret`
|
||||
2. Le grant type est `client_credentials` (pas de password grant)
|
||||
3. Le token est **mis en cache sur disque** (fichier JSON) avec gestion
|
||||
de l'expiration (marge de sécurité de 60 secondes)
|
||||
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
|
||||
|
||||
Pour chaque message WMS exporté, le GNA envoie un POST vers l'endpoint
|
||||
unique SAP-CPI `/http/ATHInboundMessage` avec le body JSON suivant :
|
||||
|
||||
```json
|
||||
{
|
||||
"MessageType": "<type_message_WMS>",
|
||||
"MessageSAP": "<code_CPI>",
|
||||
"data": "<contenu_message>"
|
||||
}
|
||||
```
|
||||
|
||||
Le champ `MessageType` permet au iFlow CPI de **router le message** vers
|
||||
le bon traitement SAP.
|
||||
|
||||
## Table de correspondance MessageType → MessageSAP
|
||||
|
||||
Le champ `MessageSAP` est déterminé par une table de correspondance entre
|
||||
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 |
|
||||
| ATH201 | LOC | Message périodique delta mouvements |
|
||||
| ATH202 | LOF | Finalisation chargement |
|
||||
|
||||
> ⚠️ 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é :
|
||||
|
||||
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`
|
||||
|
||||
## Cartographie complète des interfaces Athenzat
|
||||
|
||||
Tous les flux entre SAP et EasyWMS sont identifiés par un code ATH.
|
||||
Source : doc CPI Maxime Tourrette (24/04/2026) + mail S15 Justine.
|
||||
|
||||
### Flux SAP → EasyWMS (entrants)
|
||||
|
||||
| Code ATH | Type SAP | Type Easy | Description |
|
||||
|----------|----------|-----------|-------------|
|
||||
| ATH002 | BATMAS | ITM01 | Fiche article (Item) |
|
||||
| ATH103A | DELIVRY07 | ROR01 | Ordre de réception (Inbound delivery) |
|
||||
| ATH108 | ORDRSP | ROR01 | Ordre de réception retour (Return delivery) |
|
||||
| ATH103B | SHPUNT7 | RUT | Ordre de sortie (Outbound delivery) |
|
||||
| ATH102BOM | LOIPRO | SOR | Ordre d'expédition (Shipping order) |
|
||||
| ATH111 | ZSTKATH11 | ASN / STR | HU à recevoir / HU change |
|
||||
| ATH302 | ZQMINSPLOT | COR | Tâche inventaire / échantillon |
|
||||
|
||||
### Flux EasyWMS → SAP (sortants via CPI)
|
||||
|
||||
| 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 |
|
||||
| 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) |
|
||||
|
||||
> **Note** : les flux ATH103A/B, ATH108, ATH111, ATH302 utilisent
|
||||
> l'infrastructure GNA standard (pas de custom CPI côté EasyWMS).
|
||||
> Seuls les flux sortants (ATH2xx) passent par `CommonExportWebApi.boo`.
|
||||
|
||||
> **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
|
||||
|
||||
| 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 |
|
||||
|
||||
## Configuration requise
|
||||
|
||||
Six clés `CPI_*` à ajouter dans `CommonAppSettings.config`
|
||||
(section `appSettings`) :
|
||||
|
||||
| Clé | Description |
|
||||
|-----|-------------|
|
||||
| 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_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) |
|
||||
|
||||
**Valeurs environnement TEST** :
|
||||
|
||||
- `CPI_AUTH_URL` :
|
||||
`https://vilm-cpi-test-73ltxp48.authentication.eu30.hana.ondemand.com/oauth/token`
|
||||
- `CPI_ENDPOINT_URL` :
|
||||
`https://vilm-cpi-test-73ltxp48.it-cpi020-rt.cfapps.eu30.hana.ondemand.com/http/ATHInboundMessage`
|
||||
- Environnement PROD : URLs à définir
|
||||
|
||||
## Fichiers impactés
|
||||
|
||||
| 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_* |
|
||||
|
||||
## Logging
|
||||
|
||||
Chaque étape (connexion, récupération token, envoi message) doit être
|
||||
loguée avec les détails de la requête et de la réponse. Le body JSON
|
||||
est logué en **format indenté** pour faciliter le debug.
|
||||
|
||||
> ⚠️ Le **token ne doit jamais être logué** (sécurité).
|
||||
|
||||
## 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
|
||||
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
|
||||
|
||||
## Points d'attention
|
||||
|
||||
⚠️ Le **secret OAuth est en clair** dans le fichier de configuration —
|
||||
accès au fichier à restreindre.
|
||||
|
||||
⚠️ 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
|
||||
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)
|
||||
|
||||
## Historique des modifications
|
||||
|
||||
| Date | Auteur | Modification |
|
||||
|------|--------|--------------|
|
||||
| 2026-05-12 | Arthur | Création depuis LIM-89 |
|
||||
| 2026-05-13 | Arthur | Ajout cartographie ATH complète, URLs TEST, note ATH214 hors GNA |
|
||||
|
||||
## Références
|
||||
|
||||
| Source | Type | Date |
|
||||
|--------|------|------|
|
||||
| [LIM-89](https://easywmsfrance.atlassian.net/browse/LIM-89) | Ticket Jira | 2026 |
|
||||
| Athenzat SAP-CPI Webservices Documentation v1.0 | PDF (Maxime Tourrette) | 2026-04-24 |
|
||||
| Mail Justine S15 | Cartographie interfaces | 2026-04 |
|
||||
@@ -0,0 +1,494 @@
|
||||
---
|
||||
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
|
||||
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
|
||||
author: Arthur
|
||||
---
|
||||
|
||||
# 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.
|
||||
> Le LOC remplace les messages PCK, MOVE, STV et STC et devient le **seul
|
||||
> 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.
|
||||
|
||||
> Voir aussi : [Référence messages](messages-reference.md),
|
||||
> [Flux ERP outbound](../04-outbound/flux-erp-outbound.md),
|
||||
> [Intégration GNA → SAP-CPI](gna-sap-cpi.md)
|
||||
|
||||
## Contexte projet
|
||||
|
||||
Le LOC est un message custom envoyé du WMS vers SAP **toutes les 5 minutes**
|
||||
(✅ reconfirmé le 30/04/2026), contenant l'état de toutes les HU ayant subi
|
||||
une modification durant la période écoulée.
|
||||
|
||||
Il **remplace** les messages PCK et MOVE (supprimés) et centralise la
|
||||
communication des mouvements physiques vers l'ERP. Le LOC ne transmet pas
|
||||
l'intégralité de la base, uniquement le **delta sur la fenêtre de 5 minutes**
|
||||
(basé sur la `CreationDate` des transactions WMS).
|
||||
|
||||
### Pourquoi le LOC plutôt que des STV purs ?
|
||||
|
||||
Limagrain (Nicolas Sanchez) a exprimé que les STV en delta (+/-)
|
||||
ne sont **pas fiables** : si un message se perd ou est mal intégré, l'écart
|
||||
est définitivement perdu. Limagrain souhaite recevoir des **quantités
|
||||
absolues** que SAP prend pour argent comptant et compare à ses propres
|
||||
données pour générer les écritures de delta.
|
||||
|
||||
Le LOC est un **fork fonctionnel du WSC** (Warehouse Stock Count) adapté
|
||||
pour ne remonter que le delta des 5 dernières minutes, formaté selon un
|
||||
JSON spécifique attendu par SAP.
|
||||
|
||||
### Décisions structurantes
|
||||
|
||||
- **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
|
||||
B6 (blocage logistique) et sont couverts par le LOC (action R/U).
|
||||
Les statuts des retours sont remontés dans le REF
|
||||
|
||||
## Architecture technique
|
||||
|
||||
### Chaîne de traitement
|
||||
|
||||
```
|
||||
Job (toutes les 5 min) → Workflow → Transaction custom LOC.SEND → GNA →
|
||||
Script BOO (requêtes WMS + agrégation + formatage JSON) → POST API SAP
|
||||
```
|
||||
|
||||
### Côté WMS
|
||||
|
||||
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 —
|
||||
toute la logique est dans le GNA
|
||||
|
||||
### Côté GNA
|
||||
|
||||
1. Un **script BOO** dédié au message LOC est créé dans le GNA
|
||||
2. Le GNA détecte la transaction custom `LOC.SEND`
|
||||
3. À réception, le script BOO :
|
||||
- Collecte toutes les transactions WMS pertinentes sur le delta de temps
|
||||
- Agrège les données par HU et détermine le code ACTION pour chaque
|
||||
mouvement
|
||||
- Construit le JSON au format attendu par SAP
|
||||
- Effectue un **appel POST** vers l'API SAP-CPI (voir
|
||||
[Intégration GNA → SAP-CPI](gna-sap-cpi.md))
|
||||
|
||||
### Détection du delta
|
||||
|
||||
1. À chaque exécution, enregistrer un timestamp de dernière exécution
|
||||
2. Récupérer toutes les transactions dont `CreationDate > dernier_timestamp`
|
||||
et `CreationDate ≤ timestamp_courant`
|
||||
3. Agréger par HU, déterminer le code ACTION pour chaque mouvement
|
||||
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
|
||||
|
||||
| Code | Signification | Déclencheur |
|
||||
|------|---------------|-------------|
|
||||
| **B** | Déplacement bin-to-bin | Déplacement de HU d'une zone à une autre |
|
||||
| **U** | Set to Unrestricted (déblocage) | Déblocage statut B6 |
|
||||
| **R** | Set to Restricted (blocage) | Blocage statut B6 |
|
||||
| **S** | Scrap quantity (suppression) | Suppression de stock / support |
|
||||
| **T** | Transfert inter-HU | Transfert de quantité entre deux HU |
|
||||
| **C** | Correction de poids | Ajustement de quantité (valeur absolue) |
|
||||
| **P** | Assignation client | Palette positionnée sur image de quai |
|
||||
|
||||
### Palettes exclues du LOC
|
||||
|
||||
**Exclure les palettes liées à une réception non fermée** (= dont le REF
|
||||
n'a pas encore été envoyé). Seules les HU déjà connues de SAP via un REF
|
||||
préalable doivent apparaître dans le LOC.
|
||||
|
||||
## Format JSON attendu par SAP
|
||||
|
||||
### Paramètres d'import
|
||||
|
||||
| Réf. | Champ | Type | Description |
|
||||
|------|-------|------|-------------|
|
||||
| 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
|
||||
|
||||
```json
|
||||
{
|
||||
"IV_LGNUM": "WF02",
|
||||
"IV_TREATMENT_ID": "<HORODATAGE_GENERATION_LOC>",
|
||||
"IT_CREATE": [
|
||||
{
|
||||
"MATNR": "<CODE_PRODUIT_SAP>",
|
||||
"BATCHID": "<LOT_SAP>",
|
||||
"ACTION": "<CODE_ACTION>",
|
||||
"ANFME": "<QUANTITE_OU_VIDE>",
|
||||
"ALTME": "<UDM_OU_VIDE>",
|
||||
"VLPLA": "<ZONE_STOCKAGE_ORIGINE>",
|
||||
"NLPLA": "<ZONE_STOCKAGE_DESTINATION>",
|
||||
"VLENR": "<CODE_SUPPORT_ORIGINE>",
|
||||
"NLENR": "<CODE_SUPPORT_DESTINATION>",
|
||||
"REASON": "<CODE_RAISON_OU_VIDE>",
|
||||
"VBELN": "<CODE_LIVRAISON_OU_VIDE>",
|
||||
"POSNR": "<LIGNE_LIVRAISON_OU_VIDE>"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### 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 |
|
||||
| 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 |
|
||||
| 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 |
|
||||
|
||||
### Données stock/container à récupérer par ligne LOC
|
||||
|
||||
Pour chaque HU identifiée dans les transactions du delta :
|
||||
|
||||
- **Code produit SAP** : attribut logistique LotCode du stock
|
||||
- **Code lot SAP** : ItemCode du stock (= code article WMS)
|
||||
- **Quantité** : quantité actuelle de la ligne de stock (UdM de base WMS =
|
||||
unité alternative SAP)
|
||||
- **UdM** : BAG ou KG
|
||||
- **Zone de stockage** : zone WMS du container (origine et destination)
|
||||
- **Code support** : ContainerCode (SSCC)
|
||||
- **Code livraison sortante** : ShippingOrderCode si action P
|
||||
|
||||
## Règles de remplissage par action
|
||||
|
||||
| Champ | B (déplacement) | U/R (statut) | S (suppression) | T (transfert) | C (correction) | P (assignation) |
|
||||
|-------|-----------------|--------------|-----------------|---------------|----------------|-----------------|
|
||||
| MATNR | Vide | Code produit | Code produit | Code produit | Code produit | Vide |
|
||||
| BATCHID | Vide | Lot SAP | Lot SAP | Lot SAP | Lot SAP | Vide |
|
||||
| ACTION | B | U ou R | S | T | C | P |
|
||||
| ANFME | Vide | Vide | Qté supprimée | Qté transférée | Qté absolue | Vide |
|
||||
| ALTME | Vide | UdM | UdM | UdM | UdM | Vide |
|
||||
| VLPLA | Zone origine | Zone actuelle | Zone actuelle | Zone HU source | Zone actuelle | Vide |
|
||||
| NLPLA | Zone destination | Vide | Vide | Zone HU dest. | Vide | Image de quai |
|
||||
| VLENR | Code HU | Code HU | Code HU | Code HU source | Code HU | Code HU |
|
||||
| NLENR | Vide | Vide | Vide | Code HU dest. | Vide | Vide |
|
||||
| REASON | Vide | Vide | ZSC1 | Vide | Vide | Vide |
|
||||
| VBELN | Vide | Vide | Vide | Vide | Vide | Code livraison |
|
||||
| POSNR | Vide | Vide | Vide | Vide | Vide | Ligne livraison |
|
||||
|
||||
## Règles métier par type d'action
|
||||
|
||||
### 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.
|
||||
Le contenu de la HU n'est pas rediscuté.
|
||||
|
||||
### ACTION = U / R (Déblocage / Blocage statut)
|
||||
|
||||
Hors flux retour, le seul statut autorisé est le **B6** (blocage
|
||||
logistique). ACTION=R pour bloquer, ACTION=U pour débloquer.
|
||||
|
||||
Les statuts exotiques des retours (B6, F2, F9, etc.) sont gérés dans
|
||||
le **REF** de la réception retour, pas dans le LOC.
|
||||
|
||||
### ACTION = S (Suppression / Scrap)
|
||||
|
||||
REASON est renseigné **uniquement** pour cette action. Valeur : `ZSC1`
|
||||
(scrapping normal). Pas d'autre valeur possible.
|
||||
|
||||
### ACTION = T (Transfert inter-HU)
|
||||
|
||||
Source et destination **dans la même ligne** (VLENR + NLENR). ANFME =
|
||||
quantité transférée (pas le solde restant).
|
||||
|
||||
Si le transfert passe par une étape intermédiaire (table de travail),
|
||||
transmettre chaque étape séparément avec un emplacement matérialisé.
|
||||
|
||||
**Cas picking** : 5 tâches alimentant la même palette fille = 5 lignes
|
||||
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
|
||||
source connue.
|
||||
|
||||
### ACTION = C (Correction de quantité)
|
||||
|
||||
Quantité **absolue** comptée/validée (pas un écart). SAP calcule le
|
||||
delta. REASON n'est pas renseigné.
|
||||
|
||||
### ACTION = P (Assignation client)
|
||||
|
||||
Déclencheur : palette physiquement positionnée sur l'**image de quai**
|
||||
(pas l'assignation logique). Champs obligatoires :
|
||||
|
||||
- ACTION = P
|
||||
- VLENR = Code HU
|
||||
- NLPLA = Image de quai de la HU
|
||||
- VBELN = Code livraison sortante SAP (= SorCode côté WMS)
|
||||
- POSNR = Ligne de livraison sortante SAP (= ligne d'OS associée à
|
||||
l'article)
|
||||
|
||||
Les champs MATNR, BATCHID, ANFME, ALTME, VLPLA, NLENR, REASON sont
|
||||
**vides** pour cette action.
|
||||
|
||||
## Transactions WMS sources
|
||||
|
||||
| Transaction WMS | Action LOC | Données à récupérer |
|
||||
|-----------------|------------|---------------------|
|
||||
| CON.MOVE | **B** (déplacement) | ContainerCode, zone origine, zone destination |
|
||||
| CON.LOCATE | **B** (déplacement) | Idem |
|
||||
| STK.MOVE | **B** ou **T** | ContainerCode source et dest. Si ContainerTo ≠ ContainerCode → T avec qté transférée |
|
||||
| STK.ADJ | **C** (correction) | ContainerCode, quantité absolue actuelle après ajustement, UdM |
|
||||
| CST.STK | **U** ou **R** | ContainerCode, nouveau statut (B6 uniquement hors retour) |
|
||||
| STK.PICKING | **T** (transfert) | Container source, container destination (palette fille), qté transférée |
|
||||
| CON.DELETE | **S** (suppression) | ContainerCode, quantité supprimée |
|
||||
|
||||
> ⚠️ Vérifier si d'autres transactions sont utiles pour le LOC
|
||||
> (ex. STK.SCR pour le scrap depuis RF).
|
||||
|
||||
## Zones de stockage (VLPLA / NLPLA)
|
||||
|
||||
Les codes zone WMS ne correspondent pas directement aux codes emplacement
|
||||
SAP. Une **table de correspondance** est nécessaire, réalisée via un
|
||||
paramètre EasyS (ex : `[TK_5_A:TK_5][TK_5_B:TK_5]`).
|
||||
|
||||
### Zones attendues par SAP
|
||||
|
||||
| Zone SAP | Correspondance WMS |
|
||||
|----------|--------------------|
|
||||
| ASRS1 | TK1 (compartiment anoxie) |
|
||||
| ASRS2 | TK2 (compartiment du milieu) |
|
||||
| ASRS3 | Zone accessible du TK3 uniquement (grand compartiment) |
|
||||
| ASRS4 | Zone accessible du TK4 uniquement (grand compartiment) |
|
||||
| ASRS34 | Zone accessible des deux TK3 et TK4 (grand compartiment) |
|
||||
| PICKING | Si présent sur un PK/TP |
|
||||
| QUAI | Si présent sur un emplacement d'image de quai ou sur le quai |
|
||||
|
||||
## Horodatage (IV_TREATMENT_ID)
|
||||
|
||||
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).
|
||||
|
||||
## Ordre des lignes
|
||||
|
||||
Les lignes dans IT_CREATE doivent être dans l'**ordre chronologique**
|
||||
des transactions WMS. SAP traite les lignes dans l'ordre du fichier.
|
||||
|
||||
## Contraintes de longueur
|
||||
|
||||
| Champ | Type | Longueur max |
|
||||
|-------|------|--------------|
|
||||
| IV_LGNUM | CHAR | 4 |
|
||||
| IV_TREATMENT_ID | CHAR | 24 |
|
||||
| MATNR | CHAR | 40 |
|
||||
| BATCHID | CHAR | 10 |
|
||||
| ACTION | CHAR | 1 |
|
||||
| ANFME | NUM | 13.3 (13 entiers, 3 décimales) |
|
||||
| ALTME | CHAR | 3 |
|
||||
| VLPLA | CHAR | 18 |
|
||||
| NLPLA | CHAR | 18 |
|
||||
| VLENR | CHAR | 20 |
|
||||
| NLENR | CHAR | 20 |
|
||||
| REASON | CHAR | 4 |
|
||||
|
||||
## Désactivation STV et STC
|
||||
|
||||
### STV
|
||||
|
||||
Désactiver le post-processing des transactions STK.ADJ → plus de
|
||||
génération de message STV. Le LOC couvre ce besoin via ACTION=C.
|
||||
|
||||
**Vérifications préalables obligatoires :**
|
||||
|
||||
- Lister toutes les transactions qui génèrent un STV et confirmer que le
|
||||
LOC couvre chaque cas
|
||||
- Vérifier que le middleware GNA n'a pas d'autre dépendance au STV
|
||||
|
||||
### STC
|
||||
|
||||
Désactiver le post-processing des transactions CST.STK → plus de
|
||||
génération de message STC. Le LOC couvre le B6 via ACTION=R/U.
|
||||
|
||||
Mêmes vérifications à effectuer que pour le STV. Documenter les
|
||||
résultats de cette analyse dans un commentaire de la tâche avant de
|
||||
procéder à la désactivation.
|
||||
|
||||
## Critères d'acceptation
|
||||
|
||||
1. Un job WMS tourne toutes les 5 minutes et crée une transaction custom
|
||||
LOC.SEND
|
||||
2. Le GNA détecte cette transaction et génère un JSON LOC conforme
|
||||
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 —
|
||||
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,
|
||||
REASON, VBELN, POSNR vides
|
||||
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
|
||||
13. IV_TREATMENT_ID = horodatage de génération (CHAR 24)
|
||||
14. Aucune transaction pertinente sur le delta → pas d'envoi de LOC
|
||||
15. Contraintes de longueur respectées sur tous les champs
|
||||
16. STV et STC désactivés après validation de l'analyse d'impact
|
||||
17. Picking N tâches → N lignes ACTION=T dans l'ordre chronologique
|
||||
18. SSCC inconnu en NLENR lors d'un ACTION=T → LOC ne bloque pas, SAP
|
||||
crée la HU automatiquement
|
||||
|
||||
## Cas de tests
|
||||
|
||||
### Architecture et Job
|
||||
|
||||
| CT | CA | Description | Résultat attendu |
|
||||
|----|-----|-------------|------------------|
|
||||
| CT-01 | 1 | Déclenchement job toutes les 5 min | 3 transactions LOC.SEND en 15 min |
|
||||
| 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
|
||||
|
||||
| CT | CA | Description | Résultat attendu |
|
||||
|----|-----|-------------|------------------|
|
||||
| CT-10 | 4,5 | Déplacement via CON.MOVE | ACTION=B, seuls VLPLA/NLPLA/VLENR renseignés |
|
||||
| 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
|
||||
|
||||
| CT | CA | Description | Résultat attendu |
|
||||
|----|-----|-------------|------------------|
|
||||
| CT-20 | 4,6 | Blocage HU via CST.STK (→ B6) | ACTION=R, MATNR/BATCHID/ALTME/VLPLA/VLENR renseignés |
|
||||
| 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
|
||||
|
||||
| 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
|
||||
|
||||
| CT | CA | Description | Résultat attendu |
|
||||
|----|-----|-------------|------------------|
|
||||
| CT-40 | 4,8 | STK.MOVE avec ContainerTo ≠ ContainerCode | ACTION=T, VLENR+NLENR+ANFME renseignés |
|
||||
| CT-41 | 4,8 | STK.PICKING | ACTION=T, ANFME = qté transférée (pas solde) |
|
||||
| CT-42 | 17 | 3 pickings → même palette fille | 3 lignes T dans l'ordre chronologique |
|
||||
| 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é
|
||||
|
||||
| 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
|
||||
|
||||
| CT | CA | Description | Résultat attendu |
|
||||
|----|-----|-------------|------------------|
|
||||
| CT-60 | 4,10 | Palette sur image de quai | ACTION=P, VLENR/NLPLA/VBELN/POSNR renseignés |
|
||||
| CT-61 | 10 | Champs vides vérifiés | MATNR/BATCHID/ANFME/ALTME/VLPLA/NLENR/REASON vides |
|
||||
|
||||
### Filtre d'exclusion
|
||||
|
||||
| CT | CA | Description | Résultat attendu |
|
||||
|----|-----|-------------|------------------|
|
||||
| CT-70 | 11 | HU réception non fermée (pas de REF) | Aucune ligne dans le LOC |
|
||||
| CT-71 | 11 | HU réception fermée (REF envoyé) | Ligne présente dans le LOC |
|
||||
|
||||
### Ordre chronologique et horodatage
|
||||
|
||||
| CT | CA | Description | Résultat attendu |
|
||||
|----|-----|-------------|------------------|
|
||||
| CT-80 | 12 | 3 transactions dans l'ordre | Lignes dans l'ordre chronologique |
|
||||
| CT-81 | 13 | IV_TREATMENT_ID | Horodatage de génération, ≤ 24 car. |
|
||||
|
||||
### Contraintes de longueur et cas combinés
|
||||
|
||||
| CT | CA | Description | Résultat attendu |
|
||||
|----|-----|-------------|------------------|
|
||||
| CT-90 | 15 | Valeurs aux limites de longueur | JSON sans troncature |
|
||||
| CT-91 | 15 | ANFME avec décimales | Format NUM 13.3 respecté |
|
||||
| CT-100 | 16 | STK.ADJ après désactivation STV | Pas de STV, LOC contient ACTION=C |
|
||||
| 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 |
|
||||
|
||||
## Points d'attention
|
||||
|
||||
⚠️ **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
|
||||
globalement désactivé.
|
||||
|
||||
⚠️ Le LOC ne doit jamais transmettre de palettes dont la réception n'est
|
||||
pas fermée (pas de REF envoyé).
|
||||
|
||||
⚠️ Pour ACTION=B, les champs MATNR, BATCHID, ANFME, ALTME sont tous vides.
|
||||
|
||||
⚠️ 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).
|
||||
|
||||
## Questions ouvertes
|
||||
|
||||
- [ ] 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)
|
||||
(@Fabien)
|
||||
- [ ] Vérifier si d'autres transactions WMS sont utiles pour le LOC
|
||||
(ex. STK.SCR) (@Fabien)
|
||||
|
||||
## Historique des modifications
|
||||
|
||||
| Date | Auteur | Modification |
|
||||
|------|--------|--------------|
|
||||
| 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 |
|
||||
|
||||
## Références
|
||||
|
||||
| Source | Type | Date |
|
||||
|--------|------|------|
|
||||
| [LIM-76](https://easywmsfrance.atlassian.net/browse/LIM-76) | Ticket Jira (LOT 1.2) | 2026 |
|
||||
| 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 |
|
||||
@@ -0,0 +1,173 @@
|
||||
---
|
||||
title: "Mapping ERP-WMS — Changement article et propriétaire"
|
||||
tags: [ERP, mapping, CHG, STR, article, propriétaire, custom]
|
||||
status: draft
|
||||
standard_ref: architecture/erp-integration.md
|
||||
jira_refs: []
|
||||
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
|
||||
author: Arthur
|
||||
---
|
||||
|
||||
# Mapping ERP-WMS — Changement article et propriétaire
|
||||
|
||||
> **Résumé** : processus [CUSTOM] de changement d'article et de propriétaire
|
||||
> en cours de vie du stock, via message CHG.
|
||||
|
||||
> **Standard EasyWMS** : → voir [ERP Integration](../../concepts/erp-interface.md)
|
||||
> Ce qui suit documente les **spécificités Limagrain** par rapport au standard.
|
||||
|
||||
> Voir aussi : [Données principales et stock](donnees-principales.md) pour
|
||||
> le mapping complet ITM, attributs logistiques et architecture article/lot.
|
||||
|
||||
## Contexte projet
|
||||
|
||||
Chez Limagrain, l'article (numéro, description et destination) et le
|
||||
propriétaire peuvent être modifiés en cours de vie du stock. Ces changements
|
||||
sont notifiés par un message CHG descendant de SAP vers EasyWMS.
|
||||
|
||||
Le message standard STR (Stock Transfer Request) est aussi utilisé pour
|
||||
les demandes de changement de statut de stock.
|
||||
|
||||
## Message STR — Demande de Changement de Stock
|
||||
|
||||
### Cas d'usage
|
||||
|
||||
L'ERP envoie un STR pour :
|
||||
|
||||
- Changement de code article (produit SAP + description)
|
||||
- Changement de propriétaire
|
||||
- Blocage/déblocage de lot
|
||||
|
||||
### Règles d'acceptation
|
||||
|
||||
- **Accepté** si la palette n'est pas assignée à une commande ou en cours
|
||||
de mouvement
|
||||
- **Refusé** si palette "client" ou en préparation → code erreur API explicite
|
||||
(ERR renvoyé à SAP)
|
||||
|
||||
### Interaction STV/GNA
|
||||
|
||||
L'ajustement de stock avec motif "STR" est filtré par le middleware GNA
|
||||
(pas de retraitement STV pour éviter les doublons). Ce mécanisme devient
|
||||
caduc si le STV est globalement désactivé (décision 30/04/2026).
|
||||
|
||||
### Monitoring
|
||||
|
||||
Limagrain mettra en place un **monitoring des erreurs** STR pour les cas
|
||||
de refus. Les refus sont attendus en fonctionnement normal (palette en
|
||||
cours de préparation au moment du STR).
|
||||
|
||||
## Message CHG — Changement article / propriétaire
|
||||
|
||||
### Contenu du message
|
||||
|
||||
| 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 |
|
||||
|
||||
### Contrainte d'exécution
|
||||
|
||||
Le changement ne peut avoir lieu **que si le stock n'est pas assigné à
|
||||
un processus** (picking, expédition, regroupement, etc.).
|
||||
|
||||
Si le stock est assigné → le message CHG génère un message **ERR** pour
|
||||
informer SAP que le changement est impossible.
|
||||
|
||||
## Statut de stock
|
||||
|
||||
### Changement sur poste de travail
|
||||
|
||||
[CUSTOM] L'utilisateur peut changer le statut du stock sur le poste de
|
||||
travail **uniquement** lors du processus de **retour commandes clients**,
|
||||
pour appliquer :
|
||||
|
||||
- **F9** — Sacs sales
|
||||
- **B6** — Non conforme
|
||||
|
||||
Un commentaire est associé au statut et remonté dans le message d'interface
|
||||
(STC) pour informer l'ERP.
|
||||
|
||||
### Attributs du statut de stock
|
||||
|
||||
[CUSTOM] 3 attributs relatifs au statut de stock chez Limagrain :
|
||||
|
||||
1. **Statut de stock** : valeur du statut (ex : F9, B6)
|
||||
2. **Commentaire** : raison du changement (liste déroulante contextuelle)
|
||||
3. **Date de changement** : horodatage automatique
|
||||
|
||||
Les commentaires sont présentés sous une liste déroulante avec les
|
||||
possibilités dépendant du statut sélectionné.
|
||||
|
||||
### Autonomie Limagrain
|
||||
|
||||
Limagrain peut créer ses propres statuts de stock :
|
||||
|
||||
- Menu « Données principales » → « Types de verrous » → « Statut de stock »
|
||||
- Bouton « Nouveau » → remplir les champs requis
|
||||
|
||||
## Diagramme de séquence — Changement article
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant SAP
|
||||
participant WMS as EasyWMS
|
||||
|
||||
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)
|
||||
end
|
||||
```
|
||||
|
||||
## Diagramme de séquence — Changement statut (retour client)
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant OP as Opérateur
|
||||
participant WMS as EasyWMS
|
||||
participant SAP
|
||||
|
||||
OP->>WMS: Changement statut (F9 ou B6) + commentaire
|
||||
WMS->>WMS: MAJ statut ligne de stock
|
||||
WMS->>SAP: STC (notification changement statut)
|
||||
```
|
||||
|
||||
## Points d'attention
|
||||
|
||||
⚠️ Le CHG ne renvoie pas de confirmation positive — seule l'erreur (ERR)
|
||||
est remontée si le changement échoue.
|
||||
|
||||
⚠️ Le changement de statut sur poste est limité au processus retour client
|
||||
(pas en picking ni en regroupement).
|
||||
|
||||
⚠️ Le message STR (standard) est aussi utilisé pour des demandes de
|
||||
changement de statut initiées par SAP.
|
||||
|
||||
## Questions ouvertes
|
||||
|
||||
- [ ] 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)
|
||||
|
||||
## Historique des modifications
|
||||
|
||||
| Date | Auteur | Modification |
|
||||
|------|--------|--------------|
|
||||
| 2026-05-05 | Arthur | Création initiale depuis AF V1.5 |
|
||||
| 2026-05-06 | Arthur | Ajout section STR détaillée (CR consolidé ERP) |
|
||||
|
||||
## Références
|
||||
|
||||
| Source | Type | Date |
|
||||
|--------|------|------|
|
||||
| FR-SW-04-07_LIMAGRAIN_Functional_Analysis_V1.5 | Analyse fonctionnelle | 28/11/2025 |
|
||||
| CR CONSOLIDES REU ERP LIMAGRAIN V1 | CR ateliers interfaçage | 23/02/2026 |
|
||||
@@ -0,0 +1,321 @@
|
||||
---
|
||||
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: []
|
||||
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
|
||||
author: Arthur
|
||||
---
|
||||
|
||||
# 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.
|
||||
|
||||
> **Standard EasyWMS** : → voir [ERP Integration](../../concepts/erp-interface.md)
|
||||
> Ce qui suit documente les **spécificités Limagrain** par rapport au standard.
|
||||
|
||||
## Contexte projet
|
||||
|
||||
La communication entre SAP EWM et EasyWMS utilise XML + Webservice.
|
||||
Le détail des champs est dans le document « Liste Interfaces LIMAGRAIN »
|
||||
(fichier séparé). Cette page référence la typologie et le rôle de chaque
|
||||
message.
|
||||
|
||||
## Tableau synthétique
|
||||
|
||||
### SAP → EasyWMS (flux entrants)
|
||||
|
||||
| Domaine | Message | Standard/Custom | Description | Statut |
|
||||
|---------|---------|-----------------|-------------|--------|
|
||||
| Master Data | ITM | Standard | Fiche article (Lot SAP) | ✅ Validé |
|
||||
| Réception | ASN | Standard | Réception production (1 par palette) | ✅ Validé |
|
||||
| Réception | ROR | Standard | Réceptions externes + retours clients | ✅ Validé |
|
||||
| Expédition | SOR | Standard | Ordres de sortie (prod/recertif) | ✅ Validé |
|
||||
| Expédition | RUT | Standard | Routes / tournées client | ✅ Validé |
|
||||
| Stock | STR | Standard | Demande changement de stock (article, statut) | ✅ Validé |
|
||||
| Inventaire | COR | Standard | Demande d'échantillonnage | ✅ Validé |
|
||||
| Inventaire | SCR | Standard | Demande image de stock de l'entrepôt | ✅ Validé |
|
||||
|
||||
### EasyWMS → SAP (flux sortants)
|
||||
|
||||
| Domaine | Message | Standard/Custom | Description | Statut |
|
||||
|---------|---------|-----------------|-------------|--------|
|
||||
| Réception | REF | Standard | Finalisation de réception (+ zone stockage) | ✅ Validé |
|
||||
| Réception | ROF | Standard | Clôture d'ordre d'entrée | ✅ Validé |
|
||||
| Expédition | SOF | Standard | Finalisation ordre de sortie | 🟡 Phase 2 |
|
||||
| Expédition | LOF | Standard | Finalisation de chargement | ✅ Validé |
|
||||
| Stock | STV | Standard | Variation de stock | ⚠️ **DÉSACTIVÉ** (remplacé par LOC) |
|
||||
| Stock | STC | Standard | Notification changement de statut | ⚠️ **DÉSACTIVÉ** (remplacé par LOC) |
|
||||
| Stock | LOC | [CUSTOM] | Message périodique delta 5 min | ✅ Validé |
|
||||
| Stock | WSC | Standard | Image de stock journalière | 🟡 Volumétrie à vérifier |
|
||||
| Inventaire | COF | Standard | Confirmation d'échantillonnage | 🟡 Traitement à confirmer |
|
||||
| Expédition | PCK | [CUSTOM] | Passage conteneur client | ⚠️ **REMPLACÉ** par LOC |
|
||||
| Erreur | ERR | Standard | Erreur d'importation de message | ✅ Validé |
|
||||
|
||||
### Flux supprimés ou non retenus
|
||||
|
||||
| Message | Statut | Raison |
|
||||
|---------|--------|--------|
|
||||
| MOV | **Supprimé** | Redondant avec LOC + STR combinés |
|
||||
| PCK | **Remplacé** par LOC | Le LOC périodique couvre le besoin |
|
||||
| STV | **Désactivé** | Le LOC devient le seul canal stock (décision 30/04/2026) |
|
||||
| STC | **Désactivé** | Statuts hors retour = B6 uniquement via LOC |
|
||||
| ACC/SUP | **Non transmis** par l'ERP | Base client/fournisseur non interfacée |
|
||||
| ROC | **Non utilisé** a priori | À confirmer côté Limagrain |
|
||||
|
||||
### Messages bidirectionnels / custom
|
||||
|
||||
| Domaine | Message | Direction | Standard/Custom | Description |
|
||||
|---------|---------|-----------|-----------------|-------------|
|
||||
| Réception | API Lot | WMS ↔ ERP | [CUSTOM] | Demande/réponse lot SAP pour retours clients |
|
||||
| Stock | CHG | ERP → WMS | [CUSTOM] | Changement article et/ou propriétaire |
|
||||
|
||||
## Messages custom détaillés
|
||||
|
||||
### 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É
|
||||
|
||||
> **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é)
|
||||
|
||||
- **Déclencheur** : Job toutes les 5 min → WF → transaction `LOC.SEND` → GNA
|
||||
(script BOO) → POST SAP-CPI
|
||||
- **Remplace** : PCK, MOVE, STV, STC
|
||||
- **Actions** : B (déplacement), U/R (statut B6), S (suppression), T (transfert
|
||||
inter-HU), C (correction quantité), **P (assignation client)**
|
||||
- **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) —
|
||||
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É)
|
||||
|
||||
> ⚠️ **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.
|
||||
|
||||
- **Direction** : WMS → SAP
|
||||
- **Rôle initial** : notifier les ajustements de quantités manuels (hors flux
|
||||
standards réception/expédition)
|
||||
- **Mapping clé** :
|
||||
|
||||
| Balise | Utilisation |
|
||||
|--------|-------------|
|
||||
| Operation | C (positif) / D (négatif) |
|
||||
| Site | WF02 |
|
||||
| ItemCode | Code lot SAP |
|
||||
| OwnerCode | MECALUX |
|
||||
| ContainerCode | Numéro HU |
|
||||
| FilterAttributes | Attributs du stock existant modifié |
|
||||
| Attributes | Attributs du stock nouvellement créé |
|
||||
| ReasonCode | AJUSTEMENT MANUEL |
|
||||
| ERPReasonCode | ZSC1 |
|
||||
| Comment | Facultatif (opérateur) |
|
||||
|
||||
- **Point ouvert** : Limagrain doit définir comment gérer côté ERP un STV de
|
||||
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
|
||||
définitivement perdu
|
||||
|
||||
### STR — Demande de Changement de Stock
|
||||
|
||||
- **Direction** : ERP → WMS
|
||||
- **Cas d'usage** : changement de code article (produit SAP + description),
|
||||
changement de propriétaire, blocage/déblocage de lot
|
||||
- **Règles d'acceptation** :
|
||||
- **Accepté** si la palette n'est pas assignée à une commande ou en cours
|
||||
de mouvement
|
||||
- **Refusé** si palette "client" ou en préparation (code erreur API explicite)
|
||||
- **Interaction avec STV** : ajustement avec motif "STR" → le middleware (GNA)
|
||||
ne traite pas les STV avec ce motif pour éviter les doublons
|
||||
- **Monitoring** : Limagrain mettra en place un monitoring des erreurs pour
|
||||
les cas de refus
|
||||
- **Voir** : [Mapping ERP-WMS](mapping-erp-wms.md)
|
||||
|
||||
### COR — Demande d'Échantillonnage
|
||||
|
||||
- **Direction** : ERP → WMS
|
||||
- **Usage** : **uniquement** pour les demandes d'échantillonnage (pas pour les
|
||||
inventaires physiques classiques, gérés dans EasyWMS en phase 1)
|
||||
- **Mapping** :
|
||||
|
||||
| Balise | Valeur |
|
||||
|--------|--------|
|
||||
| Description | "ECHANTILLONNAGE" (en dur, discriminant WMS) |
|
||||
| Code | Numéro du lot d'inspection SAP |
|
||||
| Priority | 3 (basse) |
|
||||
| ProductCode | Code lot SAP |
|
||||
| LotCode | Code produit SAP |
|
||||
| Color, Source, Size | Attributs logistiques standards |
|
||||
|
||||
- **Flux** : COR envoyé → WMS fait venir la palette sur un poste de travail →
|
||||
opérateur prélève → palette repart en stockage → COF envoyé
|
||||
- **Règle** : un article en cours d'échantillonnage **n'est pas disponible**
|
||||
pour les ordres de sortie
|
||||
- **Voir** : [Échantillonnage](../03-picking/echantillonnage.md)
|
||||
|
||||
### COF — Confirmation d'Échantillonnage
|
||||
|
||||
- **Direction** : WMS → ERP
|
||||
- **Mapping** :
|
||||
|
||||
| Balise | Description |
|
||||
|--------|-------------|
|
||||
| CountCode | Numéro du lot d'inspection |
|
||||
| Status | Closed (effectué) ou Cancelled (annulé) |
|
||||
| UpdateDate | Date/heure de changement |
|
||||
|
||||
- **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
|
||||
|
||||
- **Direction** : WMS → ERP
|
||||
- **Rôle** : image de stock complète pour vérification de cohérence. Contient
|
||||
l'ensemble du stock : code OS, statut palette, toutes les informations
|
||||
disponibles
|
||||
- **Démarrage** : export manuel EasyWMS + export SAP + comparaison.
|
||||
Automatisation possible ultérieurement (quotidien à heure fixe)
|
||||
- **Point d'attention** : Limagrain doit vérifier sa capacité à traiter ce
|
||||
fichier (volumétrie potentiellement élevée pour CPI)
|
||||
- **Déclenchement** : transaction `SCR.REQ` ou `STOCKSYNC.ASKED`
|
||||
|
||||
### 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
|
||||
|
||||
- **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)
|
||||
|
||||
### API Lot SAP — Retours clients
|
||||
|
||||
- **Déclencheur** : lot officiel inconnu lors d'un retour client
|
||||
- **Contenu (demande)** : lot officiel à vérifier
|
||||
- **Contenu (réponse)** : lot SAP correspondant + attributs logistiques
|
||||
- **Parallèle** : un ITM est descendu avec les infos article
|
||||
- **Voir** : [Réception retour](../01-inbound/reception-retour.md)
|
||||
|
||||
## Flux par processus
|
||||
|
||||
### Réception production (ASN)
|
||||
|
||||
```
|
||||
SAP → ASN → EasyWMS → (réception + stockage) → REF → SAP
|
||||
→ ROF → SAP
|
||||
→ LOC (delta 5 min) → SAP
|
||||
```
|
||||
|
||||
### Réception extérieure / retour (ROR)
|
||||
|
||||
```
|
||||
SAP → ROR → EasyWMS → (réception + contrôle) → REF → SAP
|
||||
→ ROF → SAP
|
||||
→ LOC (delta 5 min) → SAP
|
||||
```
|
||||
|
||||
### Expédition client (RUT)
|
||||
|
||||
```
|
||||
SAP → RUT → EasyWMS → (picking + chargement) → LOC (delta 5 min) → SAP
|
||||
→ LOF → SAP
|
||||
→ SOF → SAP (phase 2)
|
||||
```
|
||||
|
||||
### Consommation OF (SOR)
|
||||
|
||||
```
|
||||
SAP → SOR → EasyWMS → (sortie) → LOC (delta 5 min) → SAP
|
||||
→ SOF → SAP (phase 2)
|
||||
```
|
||||
|
||||
### Échantillonnage
|
||||
|
||||
```
|
||||
SAP → COR → EasyWMS → (prélèvement poste) → COF → SAP
|
||||
```
|
||||
|
||||
### Image stock (vérification cohérence)
|
||||
|
||||
```
|
||||
SAP → SCR → EasyWMS → WSC → SAP (image complète)
|
||||
```
|
||||
|
||||
### Changement de stock
|
||||
|
||||
```
|
||||
SAP → STR → EasyWMS → (MAJ stock) → LOC (delta 5 min) → SAP
|
||||
OU → ERR → SAP (si stock assigné)
|
||||
```
|
||||
|
||||
## Points d'attention
|
||||
|
||||
⚠️ **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.
|
||||
|
||||
⚠️ 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
|
||||
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
|
||||
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
|
||||
STK.ADJ et vérifier couverture LOC (@Mecalux)
|
||||
- [ ] Effets de bord désactivation STC — idem pour CST.STK (@Mecalux)
|
||||
|
||||
## Historique des modifications
|
||||
|
||||
| Date | Auteur | Modification |
|
||||
|------|--------|--------------|
|
||||
| 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) |
|
||||
|
||||
## Références
|
||||
|
||||
| Source | Type | Date |
|
||||
|--------|------|------|
|
||||
| FR-SW-04-07_LIMAGRAIN_Functional_Analysis_V1.5 | Analyse fonctionnelle | 28/11/2025 |
|
||||
| CR CONSOLIDES REU ERP LIMAGRAIN V1 | CR ateliers interfaçage | 05/01 → 23/02/2026 |
|
||||
| Expédition - LIMAGRAIN - DEV | Page ateliers DEV | 2026 |
|
||||
Reference in New Issue
Block a user