Files
mcp-wms-wiki/wiki/limagrain/01-inbound/reception-retour.md
T
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

708 lines
34 KiB
Markdown

---
title: "Réception retour commandes clients"
tags: [inbound, réception, retour, client, API, lot]
status: draft
standard_ref: concepts/reception.md
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", "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
---
# Réception retour commandes clients
> **Résumé** : processus spécifique de réception des retours client, avec
> interrogation API SAP pour validation lot, et déclaration enrichie sur
> poste de travail.
> **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
- 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
- Interrogation API SAP pour valider le lot officiel
- `AccountCode` = code client SAP (le client doit exister dans EasyWMS)
## Process complet de réception retour client
| Étape | Description | Ticket |
|-------|-------------|--------|
| 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) (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 | - |
Voir [Réception fournisseur](reception-fournisseur.md) pour le détail
du déchargement camion et des déclarations initiales
([LIM-67](https://easywmsfrance.atlassian.net/browse/LIM-67) pour le
flux fournisseur au PK).
## Notification ROR
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é)
**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
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
Chez Limagrain, le **code article WMS = lot SAP** (cf.
[Données principales](../06-erp-interface/donnees-principales.md)).
Chaque lot SAP est descendu via le fichier **ITM** (fiche article
complète), et le code produit est un attribut stocké en CstAtt du stock.
Le **lot officiel** est l'alias de l'article dans le WMS.
Quand le lot est "inconnu du WMS", cela signifie qu'**aucun article
(ITM) n'existe avec ce lot officiel comme alias**. Il faut demander à
SAP d'envoyer la fiche article complète.
### Logique de vérification
```mermaid
flowchart TD
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]
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 lot SAP<br/>Variété - Trt commercial - Destination code]
M --> L
```
### 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.
> **Architecture CPI** : tous les flux WMS → SAP passent par un
> **endpoint unique** SAP CPI, différencié par le champ `MessageType`
> dans l'enveloppe JSON. Le flux retour utilise `MessageType = "ATH214"`.
> Voir [Intégration GNA → SAP-CPI](../06-erp-interface/gna-sap-cpi.md)
> pour le détail de l'architecture et de l'authentification OAuth 2.0.
**Séquence d'échange :**
```mermaid
sequenceDiagram
participant WF as WMS (workflow)
participant CPI as SAP CPI
participant SAP as SAP ECC
WF->>CPI: GET /http/ATHInboundMessage<br/>MessageType: ATH214
Note over WF,CPI: Auth: OAuth 2.0 Bearer token<br/>Body: { MessageType, data }
CPI->>SAP: Z_IATH214 (check batch)
SAP-->>CPI: Réponse (EV_RETURN, ET_BATCH)
CPI-->>WF: Réponse JSON
alt EV_RETURN = "X" (OK)
SAP->>CPI: ATH002 (push ITM automatique)
CPI->>WF: POST ApplicationService/ITM
Note over CPI,WF: Fiche article complète :<br/>lot SAP = code article,<br/>lot officiel = alias
WF->>WF: Poll alias en base (5s)
alt Alias trouvé
WF->>WF: Continuer
else Timeout 1 min
WF->>WF: Proposer réessayer
end
else EV_RETURN ≠ "X" (NOK)
WF->>WF: Erreur immédiate
end
```
**Authentification OAuth 2.0 :**
- Grant type : `client_credentials`
- Token endpoint TEST :
`https://vilm-cpi-test-73ltxp48.authentication.eu30.hana.ondemand.com/oauth/token`
- Token endpoint PROD : à définir
- Body : `x-www-form-urlencoded` avec `grant_type`, `client_id`,
`client_secret`
- Le token est envoyé en header `Authorization: Bearer <token>`
- Expiration gérée côté WMS (cache + renouvellement)
**Payload de requête :**
```json
GET /http/ATHInboundMessage
{
"MessageType": "ATH214",
"data": {
"IV_LGNUM": "WF02",
"IV_MATNR": "",
"IV_CHARG": "",
"IV_BATCH_OFF": "<lot officiel scanné>",
"IV_RETURN": "<code OE retour>"
}
}
```
| Champ | Type | Description |
|-------|------|-------------|
| `IV_LGNUM` | CHAR 4 | Toujours `"WF02"` |
| `IV_MATNR` | CHAR 40 | OPTIONNEL - code lot WMS (= product code SAP) |
| `IV_CHARG` | CHAR 10 | OPTIONNEL - code article WMS (= lot SAP) |
| `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.
> Header `Connection: keep-alive` requis.
**Payload de réponse :**
```json
{
"EV_RETURN": "X",
"ET_RETURN": [ { "TYPE": "...", "MESSAGE": "..." } ],
"ET_BATCH": [
{
"MATNR": "000000000000020955",
"CHARG": "2023293649",
"BATCH_OFF": "F0964D002488",
"DESCRIPTION": "Tournesol variété XYZ",
"DESTINATION": "FR",
"OWNER": "LFS",
"ZDEPLOY": "X",
"VAR_DESC": "LG50459 SX",
"COM_TRT_DESC": "Korit"
}
]
}
```
| Champ | Type | Description |
|-------|------|-------------|
| `EV_RETURN` | CHAR 1 | `"X"` = aucune erreur, vide = erreur |
| `ET_RETURN[]` | Table | Messages d'erreur ou de succès SAP |
| `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[].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
> **product code** (= code lot WMS), et `CHARG` (Charge/Batch) porte le
> **code article WMS** (= lot SAP). Ce mapping est confirmé par Michael
> Chaudier et Vincent Goyet (avril 2026).
**Traitement de la réponse (V2) :**
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
Après l'appel API, SAP appelle directement l'API du WMS pour pousser
l'ITM. Pendant cette attente :
- **Message** : "Vérification du lot en cours..."
- **Refresh automatique** toutes les 5 secondes : le WMS vérifie si
un **alias correspondant au lot officiel** existe en base
- **Bouton "Réessayer"** visible (relance un nouvel appel API)
- **Timeout** : 1 minute maximum par tentative
- **Nombre maximum de tentatives** : 5
| Tentative | Comportement en cas de timeout |
|-----------|-------------------------------|
| 1 à 4 | Message "Erreur de communication avec SAP. Réessayer ?" + bouton Réessayer |
| 5 | Message final "Impossible de contacter SAP après 5 tentatives. Veuillez contacter votre responsable." + bouton Annuler → retour au scan lot |
### Choix du code lot (multi-résultat)
Si l'API a renvoyé **plusieurs résultats** dans `ET_BATCH` (plusieurs
entrées avec `ZDEPLOY = "X"`), le dialogue `CST_EtBatchSelector` est
affiché avec la liste des lots SAP disponibles. L'opérateur en choisit un.
**Format d'affichage d'une ligne (revu Justine, 08/07)** :
```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-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
adaptations. Le tableau ci-dessous récapitule chaque étape et ses
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 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, 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 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é).
- 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.
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
- **Article non prévu** dans le retour → accepté (création de ligne
autorisée)
- **Quantité supérieure** au prévu → acceptée
- **Quantité inférieure** au prévu → acceptée (réception fermée
manuellement)
> Le prompt type de poste (3 ou 6 TP) prévu initialement est
> **abandonné** - remplacé par un message d'avertissement si le poste
> adjacent est déjà ouvert (voir
> [Stations picking](../03-picking/stations-picking.md)).
## Constitution palettes mono référence
Obligation de constituer des palettes **mono référence** avant stockage.
Si la palette retour est multi-ref :
- Opérateur appelle une palette vide sur une TP disponible
- Tri de marchandise
## Calcul poids et passage PIE
Identique aux réceptions extérieures (mêmes formules de répartition
prorata, mêmes contrôles). Voir
[Contrôle qualité réception](controle-qualite-reception.md).
**Différences pour les retours client :**
- 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**
### 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
section décrit le **delta retour client** : le REF est conditionné au
rangement ASRS complet.
### Contexte métier
Pour les retours clients, le REF influe sur la **facturation SAP**. Il
ne doit être envoyé que lorsque **tous les supports** de la réception
sont rangés dans l'ASRS (et ont passé l'ensemble des contrôles,
notamment PIE).
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
À 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
- Sinon → aucune action
Le CstAtt11 est posé une fois et n'est **jamais remis à false**, même si
le support ressort ensuite de l'ASRS (picking). Cela garantit que la
condition de clôture reste satisfaisable même si une palette a déjà été
expédiée entre-temps.
### Statut « Clôture en cours »
Dans la vue des réceptions, le statut visuel est piloté par le
`CstAtt01 de la réception` (posé par Reception_Close_PR_V2) :
| CstAtt01 réception | État | Affichage |
|---------------------|------|-----------|
| null / vide | En attente | Standard |
| true | Clôture en attente de rangement ASRS complet | **« Clôture en cours »**, ligne en **jaune** |
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)
- **Si non-retour** → clôture immédiate, génération REF (standard)
- **Si retour** :
- Vérifier que **tous les supports** ont `CstAtt11 = true`
- **Oui** → `CstAtt01 réception = false`, fermer la réception,
générer REF
- **Non** → ne pas fermer, `CstAtt01 réception = true` (statut
« Clôture en cours »). Le WF est rejoué à chaque event
_task finished_ sur un support de la réception
> Si une palette est refusée au PIE puis retirée du retour (ROR), le
> client doit la **supprimer du WMS**, sinon la clôture ne sera jamais
> effectuée.
### Zone de stockage dans le REF
Pour les retours, le REF n'est émis qu'une fois tous les supports rangés
en ASRS → la valeur sera toujours une zone réelle (jamais "NON RANGEE").
### Récapitulatif CstAtt clôture retour
| 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 |
| CstAtt01 | Réception | `true` = clôture en attente de rangement ASRS (affichage jaune) |
### [CUSTOM] Détection du mode retour (revue de code validée 2026-06-02)
É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)) :
| É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] » |
## Statuts de stock retour et remontée REF (LIM-90)
> **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
⚠️ 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).
⚠️ 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
- [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
| Date | Auteur | Modification |
|------|--------|-------------|
| 2026-05-05 | Arthur | Création initiale depuis AF V1.5 |
| 2026-05-05 | Arthur | Enrichissement depuis ateliers DEV réception |
| 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 |
|--------|------|------|
| [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 |