7496aafe64
- 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
708 lines
34 KiB
Markdown
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 |
|