lint(limagrain): corrections completes Phase 1+2
- Bloquants: mermaid 03-picking/_index reconstitue (archive 11-05), 13 liens vers pages squelette retires, 2 liens recibles (anoxie, application-dictionary) - Conventions: 910 em dashes -> tirets simples, 145 checklists -> puces question, 13 questions resolues barrees - Liens: 9 ancres reparees (slugs GitHub) - Delta: 12 standard_ref remappes, blocs Standard EasyWMS + sections References ajoutes, front matter complete - Glossaire: 15 termes standard deplaces en section rappel avec renvoi - Rapport: limagrain/_lint_report.md (Phase 1 + Phase 2 + re-scan final) - Inclut les pages des sessions precedentes non commitees + CLAUDE.md et consume.log en l'etat
This commit is contained in:
@@ -1,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 |
|
||||
|
||||
Reference in New Issue
Block a user