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
+349 -108
View File
@@ -3,10 +3,10 @@ title: "Réception retour commandes clients"
tags: [inbound, réception, retour, client, API, lot]
status: draft
standard_ref: concepts/reception.md
jira_refs: [LIM-72, LIM-67, LIM-68, LIM-66, LIM-64, LIM-70, LIM-73]
jira_refs: [LIM-93, LIM-72, LIM-67, LIM-68, LIM-66, LIM-64, LIM-70, LIM-73, LIM-90]
confluence_refs: []
sources: [FR-SW-04-07_LIMAGRAIN_Functional_Analysis_V1.5.docx, "Réception - LIMAGRAIN - DEV - Confluence.md", "LIM-72 LOT1.3 [RETOUR] Flux complet PK.md", "LIM-73 - LOT1.3 [RECEPTION] Fermetures, REF et gestion retours.md", "recap_session_LIM-72_13-05-2026.md"]
last_updated: 2026-05-13
sources: [FR-SW-04-07_LIMAGRAIN_Functional_Analysis_V1.5.docx, "Réception - LIMAGRAIN - DEV - Confluence.md", "LIM-72 LOT1.3 [RETOUR] Flux complet PK.md", "LIM-73 - LOT1.3 [RECEPTION] Fermetures, REF et gestion retours.md", "Jira LIM-93 (V2, préprod, revue de code en cours 2026-07-17)", "Jira LIM-73 (revue de code validée 2026-06-02, relecture 2026-07-17)", "Jira LIM-90 (revue de code terminée 2026-06-03)", "recap_session_LIM-72_13-05-2026.md"]
last_updated: 2026-07-17
author: Arthur
---
@@ -19,16 +19,30 @@ author: Arthur
> **Standard EasyWMS** : → voir [Reception](../../concepts/reception.md)
> Ce qui suit documente les **spécificités Limagrain** par rapport au standard.
> ⚠️ **V1 annulé → V2 (LIM-93) intégré** : le ticket
> [LIM-72](https://easywmsfrance.atlassian.net/browse/LIM-72) « Flux complet
> PK V1 » est **Annulé(e)**. Le traitement retour au PK est repris et livré
> par [LIM-93](https://easywmsfrance.atlassian.net/browse/LIM-93) (V2,
> **En cours de test client / préprod**). Le contenu ci-dessous reflète la
> version définitive V2 (description + revue de code, relecture
> 2026-07-17). Différences majeures V2 vs V1 : appel ATH214
> **systématique** (plus de branche « lot connu »), champ `ZDEPLOY`
> confirmé, nouveaux champs `ET_BATCH`, sélection du statut de stock en
> **étape dédiée** avant la quantité (statut fictif « Stock conforme »),
> étiquette = **RFID LIM-68 enrichie** (A5 Zebra, pas de rapport séparé),
> rejet PIE **renvoyé au PK** pour recomptage (placeholder, solution
> technique à définir).
## Contexte projet
Les retours client suivent un flux similaire aux réceptions extérieures
(passage poste de travail obligatoire) mais avec des particularités :
- `InboundType = 1` (Return) vs 0 (Standard) pour les autres flux
- `InboundType = 1` (Return) - vs 0 (Standard) pour les autres flux
- Création de lignes autorisée (article non attendu possible)
- Tolérance illimitée : profil de réception par défaut configuré en
« illimité » sur tous les articles
- `ReceiveLessAllowed = true` réception partielle toujours autorisée
- `ReceiveLessAllowed = true` - réception partielle toujours autorisée
- Interrogation API SAP pour valider le lot officiel
- `AccountCode` = code client SAP (le client doit exister dans EasyWMS)
@@ -38,12 +52,12 @@ Les retours client suivent un flux similaire aux réceptions extérieures
|-------|-------------|--------|
| 1 | Déclaration sur l'image de quai | [LIM-64](https://easywmsfrance.atlassian.net/browse/LIM-64) |
| 2 | Déplacement AGV → poste de travail | [LIM-70](https://easywmsfrance.atlassian.net/browse/LIM-70) |
| 3 | **Traitement au poste de travail** | [LIM-72](https://easywmsfrance.atlassian.net/browse/LIM-72) |
| 4 | Déplacement AGV → table d'entrée (+ filmage si demandé) | |
| 3 | **Traitement au poste de travail** | [LIM-72](https://easywmsfrance.atlassian.net/browse/LIM-72) (V1 annulé) → [LIM-93](https://easywmsfrance.atlassian.net/browse/LIM-93) (V2) |
| 4 | Déplacement AGV → table d'entrée (+ filmage si demandé) | - |
| 5 | Passage PIE | [LIM-66](https://easywmsfrance.atlassian.net/browse/LIM-66) |
| 6 | Stockage ou rejet | |
| 7 | Clôture de la réception | |
| 8 | Libération quai / image de quai | |
| 6 | Stockage ou rejet | - |
| 7 | Clôture de la réception | - |
| 8 | Libération quai / image de quai | - |
Voir [Réception fournisseur](reception-fournisseur.md) pour le détail
du déchargement camion et des déclarations initiales
@@ -57,17 +71,24 @@ Message ROR de SAP (type ORDRSP) avec :
- Numéro de réception
- Articles / Lots / Quantités attendues
- Codes articles **génériques** (codes uniques avec nomenclature
précise, pas réutilisables assure la traçabilité)
précise, pas réutilisables - assure la traçabilité)
**Différence clé** : cette réception **autorise la création de lignes**.
Limagrain peut recevoir un article non présent dans le ROR initial.
Un article inconnu de la base EasyWMS = ROR refusé. Un article connu
mais non prévu dans le retour = accepté (tolérance illimitée).
## [CUSTOM] Identification lot Interrogation API SAP
## [CUSTOM] Identification lot - Interrogation API SAP
Lors du scan du lot officiel sur le poste de travail, le WMS vérifie
d'abord si le lot est connu localement. Si oui, pas d'appel API. Sinon :
Lors du scan du lot officiel sur le poste de travail, le WMS appelle
**systématiquement** l'API SAP ATH214, que le lot soit déjà connu en
base ou non.
> **Changement V2 (confirmation Vincent Goyet, 13/05)** : l'appel ATH214
> est désormais systématique. Il n'y a plus de branche « lot connu → pas
> d'appel ». La vérification « vendu par Limagrain » (flag `ZDEPLOY`)
> passe toujours par SAP. Cela ferme le trou fonctionnel A4 (lots connus
> non re-vérifiés).
### Rappel : structure des articles chez Limagrain
@@ -85,24 +106,26 @@ SAP d'envoyer la fiche article complète.
```mermaid
flowchart TD
A[Scan / saisie lot officiel] --> B{Lot officiel connu du WMS ?<br/>= alias article existant ?}
B -- Oui --> C{Vendu par Limagrain ?}
B -- Non --> D[Appel API SAP]
D --> E[Écran attente<br/>refresh 5s / timeout 1 min]
E --> F{ITM reçu via API WMS ?}
F -- Oui --> C
A[Scan / saisie lot officiel] --> D[Appel API SAP ATH214<br/>SYSTÉMATIQUE<br/>IV_BATCH_OFF + IV_RETURN]
D --> R{EV_RETURN = X ?}
R -- Non --> Z[Erreur SAP<br/>afficher ET_RETURN]
R -- Oui --> C{Au moins un<br/>ZDEPLOY = X ?}
C -- Non --> K[Erreur : lot non vendu<br/>par Limagrain]
C -- Oui --> B{Article déjà en base ?<br/>= alias existant ?}
B -- Non --> E[SAP pousse l'ITM<br/>via ATH002/ITM01<br/>Écran attente refresh 5s / timeout 1 min]
E --> F{Alias trouvé en base ?}
F -- Non / Timeout --> G{Tentative < 5 ?}
G -- Oui --> H[Bouton Réessayer]
H --> D
G -- Non --> I[Erreur finale :<br/>contacter responsable]
C -- Oui --> J{Plusieurs articles ?}
C -- Non --> K[Erreur : lot non vendu<br/>par Limagrain]
F -- Oui --> J
B -- Oui --> J{Plusieurs lots<br/>ZDEPLOY = X ?}
J -- Non --> L[Sélection automatique<br/>→ déclaration contenu]
J -- Oui --> M[Dialogue choix article<br/>par pays d'origine]
J -- Oui --> M[Dialogue choix lot SAP<br/>Variété - Trt commercial - Destination code]
M --> L
```
### Appel API SAP Vérification du lot officiel (ATH214)
### Appel API SAP - Vérification du lot officiel (ATH214)
L'appel API REST est fait **directement depuis le workflow** (pas via
GNA). Il sert à notifier SAP que le WMS a besoin de la fiche article.
@@ -176,7 +199,7 @@ GET /http/ATHInboundMessage
| `IV_BATCH_OFF` | CHAR 30 | Lot officiel scanné sur le sac |
| `IV_RETURN` | CHAR 10 | Numéro du document de retour (code OE) |
> ⚠️ **Méthode HTTP** : `GET` avec body JSON spécifique SAP CPI.
> ⚠️ **Méthode HTTP** : `GET` avec body JSON - spécifique SAP CPI.
> Header `Connection: keep-alive` requis.
**Payload de réponse :**
@@ -190,7 +213,12 @@ GET /http/ATHInboundMessage
"MATNR": "000000000000020955",
"CHARG": "2023293649",
"BATCH_OFF": "F0964D002488",
"EV_DEPLOY": "X"
"DESCRIPTION": "Tournesol variété XYZ",
"DESTINATION": "FR",
"OWNER": "LFS",
"ZDEPLOY": "X",
"VAR_DESC": "LG50459 SX",
"COM_TRT_DESC": "Korit"
}
]
}
@@ -203,7 +231,12 @@ GET /http/ATHInboundMessage
| `ET_BATCH[].MATNR` | CHAR 40 | Code lot WMS = product code SAP |
| `ET_BATCH[].CHARG` | CHAR 10 | Code article WMS = lot SAP |
| `ET_BATCH[].BATCH_OFF` | CHAR 30 | Lot officiel |
| `ET_BATCH[].EV_DEPLOY` | CHAR 1 | `"X"` = déployé/vendu, `""` = non |
| `ET_BATCH[].DESCRIPTION` | CHAR 40 | Description article SAP |
| `ET_BATCH[].DESTINATION` | CHAR 18 | Pays de destination |
| `ET_BATCH[].OWNER` | CHAR 10 | Propriétaire Limagrain |
| `ET_BATCH[].ZDEPLOY` | CHAR 1 | `"X"` = déployé/vendu, `""` = non |
| `ET_BATCH[].VAR_DESC` | - | Variété (ajout Justine 08/07) |
| `ET_BATCH[].COM_TRT_DESC` | - | Traitement commercial (ajout Justine 08/07) |
> ⚠️ **Mapping inversé CHARG / MATNR** : contrairement à la
> nomenclature SAP standard, `MATNR` (Material Number) porte ici le
@@ -211,14 +244,16 @@ GET /http/ATHInboundMessage
> **code article WMS** (= lot SAP). Ce mapping est confirmé par Michael
> Chaudier et Vincent Goyet (avril 2026).
> ⚠️ **À confirmer** : le nom du champ de déploiement est ambigu dans
> les échanges — `EV_DEPLOY` ou `ZDEPLOY` ? En attente de clarification
> (question A2 dans
> [Questions ouvertes](../08-transverse/questions-ouvertes.md)).
**Traitement de la réponse (V2) :**
Si `EV_RETURN = "X"`, on récupère dans `ET_BATCH` tous les
`BATCH_OFF` dont `EV_DEPLOY = "X"` — ce sont les lots autorisés
pour l'opérateur.
1. Si `EV_RETURN = ""` → afficher le message d'erreur de `ET_RETURN`
à l'opérateur
2. Si `EV_RETURN = "X"` → filtrer `ET_BATCH` pour ne garder que les
entrées avec `ZDEPLOY = "X"` (lots déployés/vendus)
3. Si aucune entrée `ZDEPLOY = "X"` → erreur « le lot n'a pas été vendu
par Limagrain »
4. Sinon → vérifier l'existence des articles en base (voir écran
d'attente ITM), puis sélection automatique ou dialogue multi-lot
### Écran d'attente pendant la réception de l'ITM
@@ -240,20 +275,30 @@ l'ITM. Pendant cette attente :
### Choix du code lot (multi-résultat)
Si l'API a renvoyé **plusieurs résultats** dans `ET_BATCH` (plusieurs
`BATCH_OFF` avec `EV_DEPLOY = "X"`), un dialogue de sélection est
affiché avec la liste des codes lots disponibles. L'opérateur en choisit
un (filtrage par pays d'origine).
entrées avec `ZDEPLOY = "X"`), le dialogue `CST_EtBatchSelector` est
affiché avec la liste des lots SAP disponibles. L'opérateur en choisit un.
Si un **seul résultat** → sélection automatique, pas de dialogue.
**Format d'affichage d'une ligne (revu Justine, 08/07)** :
**Pourquoi le choix article ?** Un lot SAP peut être associé à plusieurs
articles (dépend du pays d'origine). L'opérateur doit choisir l'article
physiquement présent sur la palette.
```text
VAR_DESC - COM_TRT_DESC - DESTINATION (MATNR)
```
soit `Variété - Traitement commercial - Pays destination (product code)`.
Ce format remplace l'affichage d'origine `CHARG / BATCH_OFF / DESCRIPTION
/ DESTINATION / OWNER`.
Si un **seul résultat** `ZDEPLOY = "X"` → sélection automatique, pas de
dialogue.
**Pourquoi le choix article ?** Un lot officiel peut correspondre à
plusieurs lots SAP (dépend notamment de la destination). L'opérateur doit
choisir le lot physiquement présent sur la palette.
**Gestion dans le REF :** le code générique envoyé dans le ROR est
remplacé par le vrai code lot dans le REF (custom).
## Déclaration au poste de travail (LIM-72)
## Déclaration au poste de travail (LIM-93)
Le traitement au PK reprend les mêmes étapes que le flux fournisseur
([LIM-67](https://easywmsfrance.atlassian.net/browse/LIM-67)) avec des
@@ -263,28 +308,74 @@ différences :
| # | Étape | Différence vs fournisseur (LIM-67) |
|---|-------|------------------------------------|
| 1 | Sélection de la réception | Affichage "**Client: CODE - NOM**" (au lieu de "Fournisseur") sur tous les écrans |
| 2 | Big bag (CstAtt02) | Identique toggle ON/OFF |
| 3 | Scan lot officiel + vérification | **+ Vérification API SAP** (voir section ci-dessus) |
| 4 | Déclaration quantité | Identique — affichage qté attendue + UdM, prompt non pré-rempli |
| 4bis | Flag big-bag (bouton custom) | Identique (CstAtt02) |
| 5 | Statut de stock | **Modifiable** — boutons visibles (masqués dans LIM-67) |
| 6 | Flag "À anoxier" | Identique (CstAtt03 = true) |
| 7 | Programme de filmage | Identique (paramètre FILMAGES → CstAtt05) |
| 8 | Impression étiquette RFID | Identique ([LIM-68](https://easywmsfrance.atlassian.net/browse/LIM-68)) |
| 9 | Validation → évacuation AGV | Identique |
| 2 | Big bag (CstAtt02) | Identique - toggle ON/OFF |
| 3 | Scan lot officiel + vérification | **+ Vérification API SAP systématique** (voir section ci-dessus) |
| 4 | Statut de stock | **Étape dédiée AVANT la quantité** (V2) - dialogue avec statut fictif « Stock conforme » en tête (voir ci-dessous) |
| 5 | Déclaration quantité | Identique - affichage qté attendue + UdM, prompt non pré-rempli. Bouton statut supprimé (ESC renvoie au dialogue statut) |
| 5bis | Flag big-bag (bouton custom) | Identique (CstAtt02) |
| 6 | Attributs logistiques | **Auto-validés si présents/uniques dans le ROR**, sinon demandés (voir ci-dessous) |
| 7 | Flag "À anoxier" | Identique (CstAtt03 = true) |
| 8 | Programme de filmage | Identique (paramètre FILMAGES → CstAtt05) |
| 9 | Impression étiquette RFID | **Enrichie** - RFID [LIM-68](https://easywmsfrance.atlassian.net/browse/LIM-68) + code produit / lots SAP / lot officiel, format A5 Zebra (voir ci-dessous) |
| 10 | Validation → évacuation AGV | Identique |
### Statut de stock Modifiable
### Statut de stock - Modifiable, en étape dédiée (V2)
Contrairement au flux fournisseur (LIM-67) où le statut de stock est
verrouillé (boutons masqués), dans le flux retour client :
verrouillé (boutons masqués), dans le flux retour client l'opérateur
peut **choisir** le statut. Le choix se fait désormais dans une **étape
dédiée, avant la saisie de la quantité** (et non plus via un bouton sur
l'écran quantité).
- Les **boutons de changement de statut sont visibles** et fonctionnels
- L'opérateur peut modifier le statut (ex : Conforme, Sac sale,
Non conforme, etc.)
- Un dialogue liste les statuts autorisés en retour
(query `CST_StockStatus_AllowedForReturn`, CstAtt1 = applicable en
réception)
- En **position 0** de la liste : un statut fictif « **Stock
conforme** » qui, s'il est choisi, **n'applique aucun statut**
(paramètre `RECEPTION_CONFORM_STOCK_STATUS`). Cela permet à
« n'avoir aucun statut » d'être un vrai choix explicite (demande
client 09/06)
- Le bouton « statut » de l'écran quantité est **supprimé** ; la touche
**ESC** depuis l'écran quantité **renvoie au dialogue des statuts**
- Les écrans de **date de fin de statut** et **commentaire** suivent
le comportement standard (non skippés contrairement au fournisseur)
- Un message d'avertissement s'affiche si « Stock conforme » est
sélectionné pour une ligne qui ne demande pas de statut
- [CUSTOM] Statuts spécifiques retour : **F9** (sacs sales), **B6**
(non conforme) assignables uniquement dans ce processus
(non conforme) - assignables uniquement dans ce processus.
Catalogue complet des 8 statuts et remontée REF : voir
[Statuts de stock retour et remontée REF (LIM-90)](#statuts-de-stock-retour-et-remontée-ref-lim-90)
### Attributs logistiques - Auto-validation (V2)
Les attributs logistiques (lot officiel, etc.) sont **validés
automatiquement** s'ils sont renseignés dans le ROR **et uniques** pour
l'article. Sinon :
- Un attribut manquant → **demandé à l'opérateur**
- Le ROR possède **plusieurs lignes avec le même lot SAP mais des
attributs logistiques différents** → l'attribut est demandé
(EasyWMS ne peut pas deviner à quelle ligne la réception se rattache)
### Étiquette RFID enrichie (V2)
Il n'y a **pas de rapport d'étiquette stock séparé**. L'étiquette
imprimée automatiquement après validation du filmage est l'**étiquette
HU/RFID de [LIM-68](https://easywmsfrance.atlassian.net/browse/LIM-68)**,
enrichie de champs supplémentaires. Elle est glissée entre les sacs de
la palette.
Champs ajoutés (en plus du contenu standard LIM-68) :
- Code produit (`MATNR` / product code SAP)
- Lot SAP (`CHARG` / code article WMS)
- Lot officiel (`BATCH_OFF` / alias)
Format : **A5 Zebra** (pas A6). Imprimante : **dédiée au PK**.
> **Impact LIM-68** : la tâche
> [LIM-68](https://easywmsfrance.atlassian.net/browse/LIM-68) devra
> intégrer ces champs supplémentaires et le format A5 Zebra.
### Tolérance illimitée
@@ -295,7 +386,7 @@ verrouillé (boutons masqués), dans le flux retour client :
manuellement)
> Le prompt type de poste (3 ou 6 TP) prévu initialement est
> **abandonné** remplacé par un message d'avertissement si le poste
> **abandonné** - remplacé par un message d'avertissement si le poste
> adjacent est déjà ouvert (voir
> [Stations picking](../03-picking/stations-picking.md)).
@@ -315,18 +406,40 @@ prorata, mêmes contrôles). Voir
**Différences pour les retours client :**
- Verrou si écart poids : **« Écart inventaire »** (vs « Réception »
pour les autres flux) verrou posé sur le **support** (pas sur
- Verrou si écart poids : **« ECART RETOUR »** (vs « HORS TOLERANCE »
pour les autres flux) - verrou posé sur le **support** (pas sur
le stock)
- Action requise en cas d'écart : **recomptage du nombre de sacs**
- Rejet PIE : dirigé vers **poumon au sol** + notification SmartUI
(ancienne approche de renvoi au PK abandonnée)
## Clôture — Spécificités retour client (LIM-73)
### Flux de rejet PIE (⚠️ placeholder V2 - solution technique à définir)
> **Changement V2 (confirmation Leila Chajjaoui, 13/05)** : le client
> souhaite que les palettes retour rejetées au PIE (verrou ECART RETOUR)
> **retournent au PK pour recomptage immédiat**. L'approche V1 (poumon de
> rejet au sol + notification SmartUI) **ne correspond pas** au besoin et
> est abandonnée.
Points à résoudre avant implémentation :
- Routage AGV retour **PIE → PK** : comment EasyS gère-t-il le renvoi
vers un PK ?
- Relance du workflow de déclaration sur la même palette : peut-on
ré-ouvrir la palette au PK sans perdre les données déjà déclarées, ou
faut-il repartir de zéro ?
- Gestion du verrou ECART RETOUR : levé automatiquement au retour au PK,
ou levé manuellement par le responsable ?
- Impact sur la clôture : une palette en boucle PIE ↔ PK bloque-t-elle
indéfiniment la clôture ?
Cette section sera complétée une fois la solution technique définie
(question B2 dans
[Questions ouvertes](../08-transverse/questions-ouvertes.md)).
## Clôture - Spécificités retour client (LIM-73)
Le mécanisme général de clôture (déclenchement auto-close, tolérance par
ligne, CstAtt01 OE hors tolérance, clôture OE) est documenté dans
[Réception fournisseur Clôture](reception-fournisseur.md). Cette
[Réception fournisseur - Clôture](reception-fournisseur.md). Cette
section décrit le **delta retour client** : le REF est conditionné au
rangement ASRS complet.
@@ -341,9 +454,10 @@ Pour les autres types de réception (fournisseur / intersite), le REF est
émis à la clôture de la réception, quelle que soit la position des
supports.
### CstAtt11 Marqueur de rangement ASRS
### CstAtt11 - Marqueur de rangement ASRS
À chaque fin de tâche de rangement dans l'ASRS :
À chaque fin de tâche de rangement dans l'ASRS
(WF `Container_MovedEventHandler_Warehouse_PR`, sur fin de tâche APS) :
- Vérifier si le support provient d'une réception de type **retour**
- Si oui → `CstAtt11 = true` sur le support
@@ -367,7 +481,7 @@ Dans la vue des réceptions, le statut visuel est piloté par le
Pour les réceptions non-retour, CstAtt01 de la réception n'est pas
utilisé (affichage standard).
### Adaptation Reception_Close_PR_V2 Partie A (retours)
### Adaptation Reception_Close_PR_V2 - Partie A (retours)
- **Si non-retour** → clôture immédiate, génération REF (standard)
- **Si retour** :
@@ -391,57 +505,177 @@ en ASRS → la valeur sera toujours une zone réelle (jamais "NON RANGEE").
| CstAtt | Entité | Rôle |
|--------|--------|------|
| CstAtt08 | Palette fictive | Code réception détecte l'absence de palettes fictives restantes (§ auto-close) |
| CstAtt10 | Palette réelle au PK | `true` pendant traitement PK détecte qu'aucune palette n'est en cours de traitement |
| CstAtt11 | Palette réelle | `true` quand rangée en ASRS condition de clôture retour |
| CstAtt08 | Palette fictive | Code réception - détecte l'absence de palettes fictives restantes (§ auto-close) |
| CstAtt10 | Palette réelle au PK | `true` pendant traitement PK - détecte qu'aucune palette n'est en cours de traitement |
| CstAtt11 | Palette réelle | `true` quand rangée en ASRS - condition de clôture retour |
| CstAtt01 | Réception | `true` = clôture en attente de rangement ASRS (affichage jaune) |
## État du développement LIM-72
### [CUSTOM] Détection du mode retour (revue de code validée 2026-06-02)
### Implémenté (commit 8401f5456d, 28/04/2026)
Éléments techniques propres au flux retour issus de la revue de code
LIM-73 (le socle clôture / tolérance est dans
[Réception fournisseur](reception-fournisseur.md#custom-éléments-techniques-revue-de-code-validée-2026-06-02)) :
- Entité `CST_StockStatus` : CstAtt 1 applicable en retour, CstAtt 2 =
ZLOG, CstAtt 3 = ZINCO
- Query `CST_StockStatus_AllowedForReturn` : filtre statuts autorisés
- Workflow `CST_Return_Stock_GetStatus_UI` : sélection statut simplifié
- Workflow `Reception_FilterLinesByProductAndContainer_UI_V1` : retrait
filtre quantité (tolérance illimitée)
- Dialog `CST_GetProductQuantity_Prompt` : option SelectStatus ajoutée
| Élément | Type | Rôle |
|---------|------|------|
| `CST_Reception_GetReceptionFromContainer` | WF | Si aucune réception trouvée pour le conteneur, recherche un **retour** au code correspondant ; si trouvé → `returnMode = true` |
| `Reception_Supplier_ChooseReception_UI` | WF/UI | Ajout du paramètre formel `CST_ReturnMode` |
| `WorkStation_Reception_Supplier_UI` | WF/UI | Ajout de l'attribut `CST_ReturnMode` |
| `WorkStation_Reception_Supplier_ConfirmReceivedStock_UI` | WF/UI | Si retour → création du stock via une **commande différente** |
| `CST_View_WaitForFullPutaway` | Ressource | Libellé du statut « Clôture en cours » : FR « En attente de rangement [CST 1] », EN « Waiting for full putaway [CST 1] » |
### Reste à développer
## Statuts de stock retour et remontée REF (LIM-90)
- Appel API SAP ATH214 + gestion token OAuth 2.0
- Écran d'attente ITM (polling alias 5s, timeout 1 min, 5 tentatives)
- Dialogue choix multi-lot (quand ET_BATCH contient plusieurs articles)
- Impression étiquette stock retour client (rapport custom à créer)
- Configuration flux de rejet PIE retours (verrou ECART RETOUR,
destination, notification)
> **Statut** : préprod / test client. Revue de code terminée (03/06,
> après une première itération NOK 02/06 : commentaires `// Custom`
> manquants sur `REF01.boo` / `REF01Observer.boo`).
Custom du message REF + GNA pour remonter à SAP le **statut de stock**
(codes SAP ZLOG/ZINCO) et le **lot officiel** lors des réceptions retour
client. Réutilise la détermination retour/fournisseur de
[LIM-89](../06-erp-interface/gna-sap-cpi.md) : les balises ZLOG/ZINCO ne
sont posées que si la réception est de **type retour**.
Le STC étant désactivé (décision 30/04), le REF est le seul canal de
remontée des statuts pour les retours.
### Catalogue des 8 statuts (master data)
`F2` (« Conforme sac propre ») = **absence de statut** dans le WMS : rien
à créer. SAP interprète l'absence de statut comme F2 (ZLOG `0002` /
ZINCO `0001`).
| Libellé statut WMS | ZLOG (CstAtt2) | ZINCO (CstAtt3) | Bloque picking | Bloque shipping |
|---|---|---|---|---|
| (F9) Conforme sac sale | 0002 | 0091 | Non | Non |
| (B6) Non conforme - Sacs ouverts | 0001 | 0002 | Oui | Oui |
| (B6) Non conforme - Lot de l'année précédente | 0001 | 0003 | Oui | Oui |
| (B6) Non conforme - Certificat absent | 0001 | 0004 | Oui | Oui |
| (B6) Non conforme - Anomalie couture | 0001 | 0005 | Oui | Oui |
| (B6) Non conforme - Article externe - Hors LMG | 0001 | 0006 | Oui | Oui |
| (B6) Non conforme - Article non prévu | 0001 | 0007 | Oui | Oui |
| (B6) Non conforme - Sac ouvert / endommagé | 0001 | 0008 | Oui | Oui |
> ⚠️ Les blocages picking/shipping par statut sont **à confirmer avec
> le client** (proposition ci-dessus : F9 ne bloque rien, tous les B6
> bloquent picking et shipping).
### Balises REF ajoutées (par ligne de stock)
| Balise | Contenu | Cas F2 (sans statut) |
|---|---|---|
| `LneStockStatus` | Libellé du statut (ex. « (B6) Non conforme - Sacs ouverts ») | vide |
| `LneStockZLOG` | Valeur CstAtt2 du statut | vide |
| `LneStockZINCO` | Valeur CstAtt3 du statut | vide |
| `LneStockOfficialLot` | Alias de l'article WMS = lot officiel SAP (1er alias dont la valeur diffère du code article), ajouté sous `LneItemCode` | vide/absent si pas d'alias |
### Implémentation GNA (revue de code)
| Fichier | Rôle |
|---|---|
| `REF01.boo` | Ajout du header du message REF (nouvelles données) |
| `REF01Observer.boo` | Cœur : récupère l'alias selon le code produit ; récupère les CstAtt du statut de stock et les pose **uniquement si la réception est de type retour** |
| `REF01.xsd` | Structure du message REF avec les données custom |
Entité `CST_StockStatus` (déjà cataloguée, CstAtt2 = ZLOG, CstAtt3 =
ZINCO) : voir [AD Customs](../07-admin/ad-customs.md).
> Un REF **non-retour** (fournisseur / intersite) ne porte pas de
> ZLOG/ZINCO ; le lot officiel reste présent si l'article a un alias.
> Prérequis : le REF retour est conditionné au **rangement ASRS complet**
> (LIM-73, CstAtt11).
## [CUSTOM] Éléments techniques (LIM-93, revue de code)
> **Statut** : LIM-93 « En cours de test client (préprod) ». Le socle
> statut de stock a une revue de code validée (26/06) ; la partie API
> ATH214 est en cours de revue (voir caveat plus bas).
### Statut de stock - sélection en étape dédiée
Implémentation (commits `5b36a4c5a3` 11/06, `55f8ced13f` 12/06 ; revue
de code validée 26/06) :
| Élément | Type | Rôle |
|---------|------|------|
| `CST_StockStatus` | Entité | CstAtt1 = applicable en réception, CstAtt2 = ZLOG, CstAtt3 = ZINCO |
| `CST_StockStatus_AllowedForReturn` | Query | Statuts sélectionnables en réception retour (CstAtt1) |
| `CST_StockStatus_ForView` | Query | Query de la vue `StockStatusVList` |
| `StockStatusVList` | Vue | Affichage des CstAtt 1, 2 et 3 |
| `CST_Return_Stock_GetStatus_UI` | WF | Clone simplifié de `Stock_GetStatus_UI` pour le retour ; ajoute le statut fictif « Stock conforme » en tête (paramètre `RECEPTION_CONFORM_STOCK_STATUS`) |
| `Reception_GetQuantityAndUom_UI` | WF | Suppression du bouton de sélection de statut sur l'écran quantité |
| `WorkStation_Reception_Supplier_UI` | WF | Déplacement de la sélection du statut **avant** la quantité |
| `Reception_FilterLinesByProductAndContainer_UI_V1` | WF | Retrait du filtre qui exclut les lignes déjà réceptionnées → autorise la réception en excès (tolérance illimitée) |
| `Reception_Supplier_CheckReceptionStatus_UI_V1` | WF | Autorise la création de ligne pour les réceptions de type retour |
| `CST_GetProductQuantity_Prompt` | Dialog | Suppression de l'option de sélection de statut |
| `RECEPTION_CONFORM_STOCK_STATUS` | Paramètre | Nom du statut fictif « Stock conforme » |
### API ATH214 - vérification lot
Implémentation (commit `d33037da72` 25/05 ; champs VAR_DESC/COM_TRT_DESC
`fa5f2f863d` 08/07 ; auto-validation attributs `02364f440f` 07/07) :
| Élément | Type | Rôle |
|---------|------|------|
| `CST_Reception_Return_ATH214_Request_UI` | WF | Gère la requête ATH214 vers SAP CPI et renvoie la liste `ET_BATCH` |
| `CST_Reception_Return_ATH214_CheckData_UI` | WF | Process réception classe « Retour » : demande le code OE et la sélection du lot parmi ceux renvoyés par SAP |
| `CST_Reception_Return_ATH214_CheckData_Product_UI` | WF | Vérifie l'existence du produit en base et gère l'attente de l'ITM (ATH002) |
| `CaptureProductLotAttributeForReception_UI` | WF | Réutilise le lot sélectionné dans `CST_Reception_Return_ATH214_CheckData_UI` |
| `GetReceptionProductByIA` | WF | En classe « Retour », permet de sélectionner un article/alias qui n'existe pas encore |
| `CST_EtBatch` | Record | Modèle de données d'une entrée `ET_BATCH` (+ champs VarDesc, ComTrtDesc) |
| `CST_EtBatchList` | List | Liste de `CST_EtBatch` |
| `CST_EtBatchSelector` | Dialog | Sélecteur multi-lot (`VAR_DESC - COM_TRT_DESC - DESTINATION (MATNR)`) |
| `CST_Reception_Return_API_TimeoutOption` | Dialog | Options en cas d'échec de communication selon le nombre de timeouts |
| `CST_LogWebServiceCommunication` | Toggle | Active le logging de la communication API ATH214 |
Ressources principales : `CST_Reception_Return_API_SelectLot`,
`..._Error`, `..._MultiLot`, `..._NoDeployedLot`, `..._Timeout`,
`..._TimeoutExceededTry_1`, `..._WaitingResponse`,
`CST_Reception_Return_Prompt_InboundOrderCode`,
`CST_Reception_Return_API_LotSelectionColumnHeader`.
> ⚠️ **Caveat revue de code (Maxime Halgand 16/07 → Vincent Charvet
> 17/07)** : sur `CST_Reception_Return_ATH214_Request_UI`, l'appel est
> lancé en tâche `async` (`Task.Factory.StartNew`) pour afficher les
> écrans sans attendre ; `callResult` est mis à jour dans la tâche. Le
> timeout vient du `HttpClient` (100 s par défaut, soit ~200 s max :
> token + data). **Seul cas de boucle infinie résiduel** : si
> `LogManager.GetLogger` lève une exception (hors try/catch),
> `callResult` n'est jamais mis à jour → à corriger avant validation.
## Points d'attention
⚠️ Le paramètre `SAP_LOT_VERIFY_URL` doit pointer vers l'endpoint CPI
unique `/http/ATHInboundMessage`, pas vers `/api/v1/lot/verify`.
⚠️ Endpoint CPI unique `/http/ATHInboundMessage` avec `MessageType =
"ATH214"` dans l'enveloppe JSON. Les paramètres V1 `SAP_LOT_VERIFY_*`
sont **remplacés** par `SAP_CPI_TOKEN_URL`, `SAP_CPI_ENDPOINT_URL`,
`SAP_ATH214_TIMEOUT` (60 s), `SAP_ATH214_MAX_RETRIES` (5),
`SAP_ATH214_REFRESH_INTERVAL` (5000 ms) - voir
[Paramètres projet](../07-admin/parametres-projet.md).
⚠️ Le `MessageType` doit être `"ATH214"` dans l'enveloppe JSON.
⚠️ Pour les lots **déjà connus** en base WMS, le flag "déployé" n'est
pas vérifié dans le design actuel — trou fonctionnel identifié (question
A4 dans [Questions ouvertes](../08-transverse/questions-ouvertes.md)).
⚠️ La vérification « déployé » (`ZDEPLOY`) des lots **déjà connus** en
base est désormais assurée par l'appel ATH214 **systématique** (V2). Le
trou fonctionnel A4 est fermé.
## Questions ouvertes
- [ ] Champs manquants ET_BATCH : description article, pays destination,
propriétaire (@Vincent Goyet) — A1
- [ ] Nom final champ déploiement : EV_DEPLOY ou ZDEPLOY ?
(@Vincent Goyet) — A2
- [ ] Délai ATH214 → push ITM dimensionnement polling
(@Vincent Goyet) — A3
- [ ] Vérification "déployé" pour lots déjà connus sans ATH214
(@Vincent Goyet) — A4
- [ ] Étiquette stock retour : format, champs, imprimante
(@Leila / @Antoine) — B1
- [ ] Flux rejet PIE retour : destination, notification, actions
(@Leila / @Antoine) — B2
- [x] ~~Champs manquants ET_BATCH : description article, pays destination,
propriétaire - A1~~ → Résolu : `DESCRIPTION`, `DESTINATION`, `OWNER`
ajoutés, plus `VAR_DESC` (variété) et `COM_TRT_DESC` (traitement
commercial)
- [x] ~~Nom final champ déploiement : EV_DEPLOY ou ZDEPLOY ? - A2~~
Résolu : `ZDEPLOY` (confirmé V2)
- [x] ~~Délai ATH214 → push ITM dimensionnement polling - A3~~ → Résolu :
polling 5000 ms, timeout 60 s, 5 tentatives (paramétrés)
- [x] ~~Vérification "déployé" pour lots déjà connus sans ATH214 - A4~~
Résolu : appel ATH214 systématique
- [x] ~~Étiquette stock retour : format, champs, imprimante - B1~~
Résolu : pas de rapport séparé, RFID LIM-68 enrichie (A5 Zebra,
imprimante dédiée PK)
- Flux rejet PIE retour (B2) : le client veut un **renvoi au PK pour
recomptage** (approche poumon abandonnée). Routage AGV PIE → PK, relance
du workflow sur la même palette, levée du verrou ECART RETOUR, impact
clôture - **solution technique à définir** (@Leila / @Antoine)
## Historique des modifications
@@ -452,15 +686,22 @@ A4 dans [Questions ouvertes](../08-transverse/questions-ouvertes.md)).
| 2026-05-12 | Arthur | Intégration LIM-72 (process complet 8 étapes, API SAP, CstAtt) |
| 2026-05-12 | Arthur | Intégration LIM-73 (clôture retour, CstAtt11, REF conditionné) |
| 2026-05-13 | Arthur | Correction API : endpoint CPI unique + ATH214, auth OAuth 2.0, mapping CHARG/MATNR, état dev, questions ouvertes |
| 2026-07-17 | Arthur | LIM-72 confirmé Annulé(e) (V1) → repris par LIM-93 (V2) : notes de supersession ajoutées (résumé, table process, état dev) ; contenu V1 conservé comme référence à valider. Détail définitif différé à la relecture de LIM-93 |
| 2026-07-17 | Arthur | Relecture revue de code LIM-73 (validée 02/06, préprod) : sous-section « Détection du mode retour » (WF returnMode, `Container_MovedEventHandler_Warehouse_PR` pour CstAtt11, ressource `CST_View_WaitForFullPutaway`) |
| 2026-07-17 | Arthur | Intégration LIM-90 (revue de code terminée 03/06, préprod) : section « Statuts de stock retour et remontée REF » (catalogue 8 statuts ZLOG/ZINCO + blocage picking/shipping, F2 = absence de statut, balises `LneStockStatus`/`LneStockZLOG`/`LneStockZINCO`/`LneStockOfficialLot`, GNA `REF01.boo`/`REF01Observer.boo`/`REF01.xsd`, réutilise détermination retour LIM-89) |
| 2026-07-17 | Arthur | Intégration LIM-93 V2 (préprod, revue de code en cours) : appel ATH214 **systématique** (résout A4), champs `ET_BATCH` `DESCRIPTION`/`DESTINATION`/`OWNER`/`ZDEPLOY`/`VAR_DESC`/`COM_TRT_DESC` (résout A1/A2), dialogue multi-lot reformaté, statut de stock en **étape dédiée** + statut fictif « Stock conforme » (`RECEPTION_CONFORM_STOCK_STATUS`), auto-validation attributs logistiques, **étiquette RFID enrichie** A5 Zebra (résout B1, impact LIM-68), rejet PIE **renvoi au PK** placeholder (B2), section « Éléments techniques » (WF/dialogs/records ATH214 + caveat boucle infinie), verrou PIE renommé « ECART RETOUR » |
## Références
| Source | Type | Date |
|--------|------|------|
| Jira LIM-72 | Ticket | 2025 |
| Jira LIM-73 | Ticket | 2025 |
| [LIM-72](https://easywmsfrance.atlassian.net/browse/LIM-72) | Ticket Jira (V1, Annulé) | 2026 |
| [LIM-93](https://easywmsfrance.atlassian.net/browse/LIM-93) | Ticket Jira (V2 - description + revue de code, préprod) | 2026-07-17 |
| Commits LIM-93 : `d33037da72` (API ATH214), `5b36a4c5a3` / `55f8ced13f` (statut de stock), `02364f440f` (auto-validation attributs), `fa5f2f863d` (VAR_DESC/COM_TRT_DESC) | Git | 2026-05/07 |
| [LIM-73](https://easywmsfrance.atlassian.net/browse/LIM-73) | Ticket Jira (clôture/REF retour) - revue de code validée, préprod | 2026-06-02 |
| [LIM-90](https://easywmsfrance.atlassian.net/browse/LIM-90) | Ticket Jira (statuts ZLOG/ZINCO + lot officiel) - revue de code terminée, préprod | 2026-06-03 |
| Jira LIM-14 | Ticket (CstAtt) | 2025 |
| Athenzat SAP-CPI Webservices Documentation v1.0 | PDF | 2026-04-24 |
| Mail Michael Chaudier ↔ Vincent Goyet | Échange | 2026-04-07/10 |
| Mail Justine ↔ Leila ↔ Vincent Goyet ↔ Maxime Tourrette | Échange | 2026-04-24/29 |
| recap_session_LIM-72_13-05-2026.md | Récap session | 2026-05-13 |
| recap_session_LIM-72_13-05-2026.md | Récap session | 2026-05-13 |