Files
arthur 7496aafe64 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
2026-07-20 12:56:42 +02:00

560 lines
24 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: "LOC - Message périodique (spécification complète)"
tags: [ERP, LOC, custom, delta, mouvement, stock, JSON, SAP, GNA]
status: draft
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"
- "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)
> **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 |
## [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
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)
- 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
| 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 |
| 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) - 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 |