lint(limagrain): corrections completes Phase 1+2

- Bloquants: mermaid 03-picking/_index reconstitue (archive 11-05), 13 liens vers pages squelette retires, 2 liens recibles (anoxie, application-dictionary)
- Conventions: 910 em dashes -> tirets simples, 145 checklists -> puces question, 13 questions resolues barrees
- Liens: 9 ancres reparees (slugs GitHub)
- Delta: 12 standard_ref remappes, blocs Standard EasyWMS + sections References ajoutes, front matter complete
- Glossaire: 15 termes standard deplaces en section rappel avec renvoi
- Rapport: limagrain/_lint_report.md (Phase 1 + Phase 2 + re-scan final)
- Inclut les pages des sessions precedentes non commitees + CLAUDE.md et consume.log en l'etat
This commit is contained in:
2026-07-20 12:56:42 +02:00
parent 23eb3f3c84
commit 7496aafe64
59 changed files with 6457 additions and 2023 deletions
@@ -1,19 +1,21 @@
---
title: "LOC Message périodique (spécification complète)"
title: "LOC - Message périodique (spécification complète)"
tags: [ERP, LOC, custom, delta, mouvement, stock, JSON, SAP, GNA]
status: draft
standard_ref: architecture/erp-integration.md
standard_ref: concepts/erp-interface.md
jira_refs: [LIM-76]
confluence_refs: []
sources:
- "LOC - Etat des lieux V2.md"
- "CR CONSOLIDES REU ERP LIMAGRAIN V1 - CR.md"
- "LIM-76 LOT1.2 [GNA] Message LOC.md"
last_updated: 2026-05-12
- "Jira LIM-76 (relecture commentaires 2026-07-17, revue de code en cours)"
last_updated: 2026-07-17
author: Arthur
---
# LOC Message périodique (spécification complète)
# LOC - Message périodique (spécification complète)
> **Résumé** : spécification du message custom LOC, envoyé du WMS vers SAP
> toutes les 5 minutes via le GNA, contenant le delta des HU modifiées.
@@ -21,7 +23,7 @@ author: Arthur
> canal** de notification des mouvements de stock vers SAP.
> **Standard EasyWMS** : → voir [ERP Integration](../../concepts/erp-interface.md)
> Ce message est un **[CUSTOM]** il n'existe pas dans le standard EasyWMS.
> Ce message est un **[CUSTOM]** - il n'existe pas dans le standard EasyWMS.
> Voir aussi : [Référence messages](messages-reference.md),
> [Flux ERP outbound](../04-outbound/flux-erp-outbound.md),
@@ -52,9 +54,9 @@ JSON spécifique attendu par SAP.
### Décisions structurantes
- **STV désactivé** (post-processing coupé) le LOC devient le **seul canal**
- **STV désactivé** (post-processing coupé) - le LOC devient le **seul canal**
de notification des mouvements de stock vers SAP
- **STC désactivé** les changements de statut hors retour sont limités au
- **STC désactivé** - les changements de statut hors retour sont limités au
B6 (blocage logistique) et sont couverts par le LOC (action R/U).
Les statuts des retours sont remontés dans le REF
@@ -72,7 +74,7 @@ Script BOO (requêtes WMS + agrégation + formatage JSON) → POST API SAP
1. Un **Job** s'exécute toutes les 5 minutes
2. Ce job appelle un **Workflow custom** dont le seul rôle est de **créer
une transaction custom** `LOC.SEND`
3. Le Workflow et la transaction ne portent aucune logique métier côté WMS
3. Le Workflow et la transaction ne portent aucune logique métier côté WMS -
toute la logique est dans le GNA
### Côté GNA
@@ -96,7 +98,7 @@ Script BOO (requêtes WMS + agrégation + formatage JSON) → POST API SAP
4. Générer le JSON et envoyer
5. **Si aucune transaction pertinente sur le delta → pas d'envoi de LOC**
## Couverture fonctionnelle 7 codes ACTION
## Couverture fonctionnelle - 7 codes ACTION
| Code | Signification | Déclencheur |
|------|---------------|-------------|
@@ -120,7 +122,7 @@ préalable doivent apparaître dans le LOC.
| Réf. | Champ | Type | Description |
|------|-------|------|-------------|
| 1 | IV_LGNUM | CHAR 4 | Numéro d'entrepôt (valeur fixe : `"WF02"`) config EasyS |
| 1 | IV_LGNUM | CHAR 4 | Numéro d'entrepôt (valeur fixe : `"WF02"`) - config EasyS |
| 2 | IV_TREATMENT_ID | CHAR 24 | Horodatage de génération du LOC |
### Structure JSON
@@ -148,22 +150,22 @@ préalable doivent apparaître dans le LOC.
}
```
### Table IT_CREATE Champs (1:n)
### Table IT_CREATE - Champs (1:n)
| Réf. | Champ | Type | Description |
|------|-------|------|-------------|
| 1 | MATNR | CHAR 40 | Code produit SAP vide si action B ou P |
| 2 | BATCHID | CHAR 10 | Code lot SAP vide si action B ou P |
| 1 | MATNR | CHAR 40 | Code produit SAP - vide si action B ou P |
| 2 | BATCHID | CHAR 10 | Code lot SAP - vide si action B ou P |
| 3 | ACTION | CHAR 1 | Code action : B, U, R, S, T, C, P |
| 4 | ANFME | NUM 13.3 | Quantité (absolue ou transférée selon action) vide si B, U/R, P |
| 5 | ALTME | CHAR 3 | Unité de mesure (BAG, KG) vide si action B ou P |
| 4 | ANFME | NUM 13.3 | Quantité (absolue ou transférée selon action) - vide si B, U/R, P |
| 5 | ALTME | CHAR 3 | Unité de mesure (BAG, KG) - vide si action B ou P |
| 6 | VLPLA | CHAR 18 | Zone de stockage origine |
| 7 | NLPLA | CHAR 18 | Zone de stockage destination |
| 8 | VLENR | CHAR 20 | Code HU (palette) source SSCC |
| 9 | NLENR | CHAR 20 | Code HU (palette) destination SSCC |
| 10 | REASON | CHAR 4 | Code raison scrap uniquement pour action S (ZSC1) |
| 11 | VBELN | | Code livraison sortante SAP uniquement pour action P |
| 12 | POSNR | | Ligne de livraison sortante SAP uniquement pour action P |
| 8 | VLENR | CHAR 20 | Code HU (palette) source - SSCC |
| 9 | NLENR | CHAR 20 | Code HU (palette) destination - SSCC |
| 10 | REASON | CHAR 4 | Code raison scrap - uniquement pour action S (ZSC1) |
| 11 | VBELN | - | Code livraison sortante SAP - uniquement pour action P |
| 12 | POSNR | - | Ligne de livraison sortante SAP - uniquement pour action P |
### Données stock/container à récupérer par ligne LOC
@@ -200,7 +202,7 @@ Pour chaque HU identifiée dans les transactions du delta :
### ACTION = B (Déplacement bin-to-bin)
Déplacement de HU d'une zone à une autre. **Pas de quantité, pas de code
article, pas de lot** seuls les champs zone et support sont renseignés.
article, pas de lot** - seuls les champs zone et support sont renseignés.
Le contenu de la HU n'est pas rediscuté.
### ACTION = U / R (Déblocage / Blocage statut)
@@ -229,7 +231,7 @@ ACTION=T dans le même LOC, dans l'ordre chronologique.
**Création de palette au picking** : si le SSCC en NLENR est inconnu de
SAP, SAP crée automatiquement la HU (type palette standard). Le LOC ne
crée que la structure palette le stock est transféré depuis une palette
crée que la structure palette - le stock est transféré depuis une palette
source connue.
### ACTION = C (Correction de quantité)
@@ -291,7 +293,7 @@ IV_TREATMENT_ID = horodatage du moment de **génération du LOC** (pas
l'heure de chaque transaction individuelle). Toutes les lignes d'un
même LOC partagent le même horodatage.
Format : `YYYYMMDD` limité à 24 caractères (CHAR 24).
Format : `YYYYMMDD` - limité à 24 caractères (CHAR 24).
## Ordre des lignes
@@ -345,16 +347,16 @@ procéder à la désactivation.
3. Le JSON est envoyé en POST à l'endpoint SAP
4. Les 7 codes ACTION (B, U, R, S, T, C, P) sont correctement générés
5. ACTION=B : ANFME, ALTME, MATNR, BATCHID, NLENR, REASON, VBELN, POSNR
vides seuls VLPLA, NLPLA et VLENR renseignés
6. ACTION=U/R : MATNR, BATCHID, ALTME, VLPLA, VLENR renseignés
vides - seuls VLPLA, NLPLA et VLENR renseignés
6. ACTION=U/R : MATNR, BATCHID, ALTME, VLPLA, VLENR renseignés -
ANFME, NLPLA, NLENR, REASON, VBELN, POSNR vides
7. ACTION=S : REASON=ZSC1 MATNR, BATCHID, ANFME, ALTME, VLPLA, VLENR
renseignés NLPLA, NLENR, VBELN, POSNR vides
8. ACTION=T : VLENR et NLENR dans la même ligne ANFME = qté transférée
(pas un solde) REASON, VBELN, POSNR vides
9. ACTION=C : ANFME = quantité absolue (pas un delta) NLPLA, NLENR,
7. ACTION=S : REASON=ZSC1 - MATNR, BATCHID, ANFME, ALTME, VLPLA, VLENR
renseignés - NLPLA, NLENR, VBELN, POSNR vides
8. ACTION=T : VLENR et NLENR dans la même ligne - ANFME = qté transférée
(pas un solde) - REASON, VBELN, POSNR vides
9. ACTION=C : ANFME = quantité absolue (pas un delta) - NLPLA, NLENR,
REASON, VBELN, POSNR vides
10. ACTION=P : VLENR, NLPLA (image de quai), VBELN, POSNR renseignés
10. ACTION=P : VLENR, NLPLA (image de quai), VBELN, POSNR renseignés -
MATNR, BATCHID, ANFME, ALTME, VLPLA, NLENR, REASON vides
11. Palettes liées à une réception non fermée (pas de REF envoyé) exclues
12. Lignes dans IT_CREATE dans l'ordre chronologique des transactions WMS
@@ -376,7 +378,7 @@ procéder à la désactivation.
| CT-02 | 2,3 | GNA détecte LOC.SEND et génère JSON | JSON conforme + POST HTTP 200 |
| CT-03 | 14 | Aucune transaction sur le delta | Aucun POST vers SAP |
### ACTION=B Déplacement
### ACTION=B - Déplacement
| CT | CA | Description | Résultat attendu |
|----|-----|-------------|------------------|
@@ -384,7 +386,7 @@ procéder à la désactivation.
| CT-11 | 4,5 | Déplacement via CON.LOCATE | Idem CT-10 |
| CT-12 | 4,5 | STK.MOVE sans changement HU (ContainerTo=ContainerCode) | ACTION=B (pas T) |
### ACTION=U/R Blocage / Déblocage
### ACTION=U/R - Blocage / Déblocage
| CT | CA | Description | Résultat attendu |
|----|-----|-------------|------------------|
@@ -392,14 +394,14 @@ procéder à la désactivation.
| CT-21 | 4,6 | Déblocage HU via CST.STK (← B6) | ACTION=U |
| CT-22 | 6 | Changement statut hors B6 (hors retour) | Aucune ligne dans le LOC |
### ACTION=S Suppression / Scrap
### ACTION=S - Suppression / Scrap
| CT | CA | Description | Résultat attendu |
|----|-----|-------------|------------------|
| CT-30 | 4,7 | CON.DELETE sur une HU | ACTION=S, REASON=ZSC1, qté et champs stock renseignés |
| CT-31 | 7 | Plusieurs suppressions | Chaque ligne S a REASON=ZSC1 uniquement |
### ACTION=T Transfert inter-HU
### ACTION=T - Transfert inter-HU
| CT | CA | Description | Résultat attendu |
|----|-----|-------------|------------------|
@@ -409,14 +411,14 @@ procéder à la désactivation.
| CT-43 | 18 | Picking vers SSCC inconnu SAP | Ligne T générée, LOC ne bloque pas |
| CT-44 | 8 | Transfert via table de travail | 2 lignes distinctes (pas de fusion) |
### ACTION=C Correction de quantité
### ACTION=C - Correction de quantité
| CT | CA | Description | Résultat attendu |
|----|-----|-------------|------------------|
| CT-50 | 4,9 | STK.ADJ (ajustement) | ACTION=C, ANFME = qté absolue après ajustement |
| CT-51 | 9 | Vérification REASON vide | REASON vide pour action C |
### ACTION=P Assignation client
### ACTION=P - Assignation client
| CT | CA | Description | Résultat attendu |
|----|-----|-------------|------------------|
@@ -447,11 +449,67 @@ procéder à la désactivation.
| CT-101 | 16 | CST.STK après désactivation STC | Pas de STC, LOC contient ACTION=R |
| CT-110 | 4,12 | Plusieurs actions dans le même delta | 4 lignes, 4 actions, ordre chronologique |
| CT-111 | 2 | IV_LGNUM | Toujours "WF02" |
| CT-112 | | HU multi-lignes de stock | Plusieurs entrées dans IT_CREATE |
| CT-112 | - | HU multi-lignes de stock | Plusieurs entrées dans IT_CREATE |
## [CUSTOM] Implémentation GNA (statut : en revue de code, préprod)
Statut ticket au 2026-07-17 : **En revue de code** (plusieurs livraisons
préprod, revue Vincent Charvet en cours). Éléments issus de la relecture
des commentaires :
| Élément | Type | Rôle |
|---------|------|------|
| `CST_SendLOCTransaction` | Job | Toutes les 5 min, appelle `CST_SendLOC` |
| `CST_SendLOC` | WF | Crée la transaction `LOC.SEND` (aucune logique métier) |
| `LOC.SEND` | TransactionType | Déclenche la génération du LOC |
| `LOC_ZONE_MAPPING` | Paramètre | Correspondance zones TK → zones client (voir [Paramètres projet](../07-admin/parametres-projet.md)) |
| `CommonExportWebApi.boo` | Script GNA | Structure LOC selon le template client |
| `EasyWMSExportMessages.boo` | Script GNA | Appelle `WriteLOC01` sur réception de `LOC.SEND` |
| `EasyWMSWebApiObserver.boo` | Script GNA | Ajoute le type de message `LOC01` |
| `LOC01.boo` | Script GNA | En-tête du message |
| `WriteLOC01.boo` | Script GNA | Génère le message ; si rien n'a changé → transaction en erreur motif `NO_CHANGES` (évolution demandée : ne plus générer de transaction en erreur si rien à envoyer) |
| `LOC01Observer.boo` | Script GNA | Cœur : récupère la dernière `LOC.SEND`, prend les transactions depuis (CON.MOVE, CON.LOCATE, STK.MOVE, STK.ADJ, CST.STK, STK.PICKING, CON.DELETE), détermine l'`ACTION` |
| `LOC01.xsd` | Schéma | Structure du message LOC |
**Décision réception non fermée** : on n'envoie pas de LOC pour un
conteneur pas encore présent dans l'ERP (SAP les crée à partir du REF).
Conséquence assumée par le client (soulevée par Nicolas le 02/06) : les
modifications intervenues sur la palette **avant** l'envoi du REF ne sont
pas rejouées après coup (filtrage par date/heure de traitement).
### Picking négatif (en cours - point délicat)
Le picking négatif génère la séquence de transactions suivante :
- `CON.CREATE` : nouveau conteneur sur une TP
- `STK.PICKING.NEG` : déplacement de l'excédent vers la nouvelle palette,
origine = destination = conteneur d'origine (picking sur lui-même),
quantité = quantité demandée dans l'OS
- 2× `CHB.LAB` : échange des labels des deux palettes (nouveau → origine,
puis l'inverse)
**Problème** : avec CON.CREATE + STK.PICKING.NEG seuls, on n'a pas la
corrélation entre conteneur source et destination. `CHB.LAB` pourrait
faire le lien, mais le swap des labels intervient **après** le picking -
si le LOC part entre les deux étapes, l'information ne peut pas être
regroupée. Analyse en cours (LOC01Observer mis à jour le 03/07 ; pistes
de réflexion partagées par Arthur).
### Retours revue de code / client (à traiter)
- **Retour client (08/07)** : certains LOC non intégrables côté SAP -
action S avec les autres champs vides ; doublons (même info plusieurs
fois). Corrections appliquées 09/07 puis 17/07.
- **Revue de code (10/07, Vincent Charvet)** : détail des stocks manquant
sur action S ; valeur `WF02` codée en dur ; fonction `BuildZoneMapping`
jamais utilisée (éviterait de parser `LOC_ZONE_MAPPING` par emplacement) ;
null ref potentielles sur la comparaison au statut B6 ; optimiser le
cache (une query par type de donnée). Changements appliqués 17/07,
re-revue à faire.
## Points d'attention
⚠️ **STV et STC désactivés** vérifier qu'aucun autre process métier ne
⚠️ **STV et STC désactivés** - vérifier qu'aucun autre process métier ne
dépend d'eux (middleware GNA, reporting).
⚠️ Le filtrage GNA des STV avec motif "STR" devient caduc si le STV est
@@ -465,17 +523,23 @@ pas fermée (pas de REF envoyé).
⚠️ Les quantités sont des valeurs **absolues** sauf pour ACTION=S (quantité
supprimée) et ACTION=T (quantité transférée).
⚠️ IV_LGNUM = `"WF02"` (pas "WL02" corrigé depuis spec V2).
⚠️ IV_LGNUM = `"WF02"` (pas "WL02" - corrigé depuis spec V2).
## Questions ouvertes
- [ ] Cas palette déposée sur image de quai → chargée → OS fermé →
- Cas palette déposée sur image de quai → chargée → OS fermé →
LOF/SOF envoyé avant le LOC : la HU ne sera pas mentionnée dans le LOC
(@Limagrain)
- [ ] HU multi-lignes de stock : comportement exact à confirmer (CT-112)
- HU multi-lignes de stock : comportement exact à confirmer (CT-112)
(@Fabien)
- [ ] Vérifier si d'autres transactions WMS sont utiles pour le LOC
- Vérifier si d'autres transactions WMS sont utiles pour le LOC
(ex. STK.SCR) (@Fabien)
- Picking négatif : corrélation conteneur source ↔ destination
indisponible via CON.CREATE + STK.PICKING.NEG ; le swap `CHB.LAB`
intervient après le picking. Solution en cours d'analyse
(@Maxime / @Vincent)
- LOC action S : compléter le détail des stocks ; éliminer les doublons
(retour client 08/07, corrections en cours) (@Maxime)
## Historique des modifications
@@ -483,12 +547,13 @@ supprimée) et ACTION=T (quantité transférée).
|------|--------|--------------|
| 2026-05-06 | Arthur | Création depuis spec LOC V2 (réunion 30/04/2026) |
| 2026-05-12 | Arthur | Refonte complète depuis LIM-76 : architecture technique GNA/BOO, ACTION=P confirmé avec VBELN/POSNR, IV_LGNUM corrigé WF02, zones SAP détaillées, contraintes de longueur, 25+ cas de tests, critères d'acceptation |
| 2026-07-17 | Arthur | Relecture commentaires LIM-76 (statut en revue de code, préprod) : section « Implémentation GNA » (job/WF/transaction, scripts .boo, LOC01.xsd, LOC_ZONE_MAPPING, motif NO_CHANGES), décision réception non fermée (modifs pré-REF non rejouées), sous-section picking négatif (CON.CREATE + STK.PICKING.NEG + CHB.LAB, problème de corrélation), retours revue de code / client (action S, doublons, WF02 hardcodé, BuildZoneMapping, cache) |
## Références
| Source | Type | Date |
|--------|------|------|
| [LIM-76](https://easywmsfrance.atlassian.net/browse/LIM-76) | Ticket Jira (LOT 1.2) | 2026 |
| [LIM-76](https://easywmsfrance.atlassian.net/browse/LIM-76) | Ticket Jira (LOT 1.2) - en revue de code, préprod | 2026-07-17 |
| LOC - Etat des lieux V2 | Spécification technique | 30/04/2026 |
| CR CONSOLIDES REU ERP LIMAGRAIN V1 | CR ateliers interfaçage | 23/02/2026 |
| Réunion LOC 30/04/2026 | Réunion Arthur + Justine + Nicolas | 30/04/2026 |