91 lines
4.6 KiB
Markdown
91 lines
4.6 KiB
Markdown
# Tâche Jira — Intégration GNA LIMAGRAIN → SAP-CPI
|
|
|
|
## Contexte
|
|
|
|
Dans le cadre du projet Limagrain, le middleware GNA doit envoyer les messages WMS vers SAP via la plateforme SAP-CPI (middleware cloud). Une implémentation de référence existe chez un autre client (AD) mais communique avec un ERP SAPAIG via une API REST classique (OAuth password grant). L'intégration Limagrain est différente : elle cible SAP-CPI avec un endpoint unique et une authentification OAuth 2.0 client_credentials.
|
|
|
|
## Développement
|
|
|
|
### Périmètre fonctionnel
|
|
|
|
Le script CommonExportWebApi.boo doit :
|
|
|
|
1. **Authentification OAuth 2.0 client_credentials** — Obtenir un token bearer auprès du serveur SAP (/oauth/token) via POST avec client_id et client_secret. Le token doit être mis en cache sur disque (fichier JSON) avec gestion de l'expiration (marge de 60s).
|
|
|
|
2. **Envoi des messages WMS → SAP** — Pour chaque message WMS exporté, envoyer une requête POST vers l'endpoint unique SAP-CPI /http/ATHInboundMessage avec un body JSON structuré : {"MessageType": "<type>", "MessageSAP": "<code>", "data": <messages>}. Le MessageType permet au iFlow CPI de router le message. Le champ MessageSAP est déterminé par une table de correspondance entre le préfixe du MessageType WMS (3 premiers caractères) et le code SAP-CPI :
|
|
|
|
|
|
| | |
|
|
|---|---|
|
|
|Code CPI|Équivalent WMS|
|
|
|ATH214|Check flux retour (bacth)|
|
|
|ATH215|ROF ou REF type == retour|
|
|
|ATH217|REF type == supplier|
|
|
|ATH201|LOC|
|
|
|ATH202|LOF|
|
|
|
|
3. ATH217 — LOC ATH201 — LOF ATH202 —
|
|
|
|
Pour les messages REF, le MessageSAP dépend du type de préavis de réception (InboundOrder) lié. Le type est récupéré par le REF01Observer via une requête LINQ et transmis dans le champ RecCustomAttributes.CstAtt20 du message XML. Le script CommonExportWebApi.boo lit ce champ dans le payload JSON pour déterminer le MessageSAP.
|
|
|
|
Si un type de message n'a pas de correspondance, un warning est logué et le champ MessageSAP n'est pas inclus dans le body.
|
|
|
|
4. **Retry avec backoff exponentiel** — En cas d'échec HTTP (hors 401), réessayer avec un backoff exponentiel (2s, 4s, 8s, 16s). Un 401 doit provoquer un échec immédiat (token invalide).
|
|
|
|
5. **Logging détaillé** — Chaque étape (connexion, récupération token, envoi message) doit être loguée avec les détails de la requête et de la réponse. Le body JSON doit être logué en format indenté pour faciliter le debug. Le token ne doit jamais être logué.
|
|
|
|
|
|
### Configuration requise (CommonAppSettings.config)
|
|
|
|
Six clés CPI_* à ajouter dans la section appSettings :
|
|
|
|
- **CPI_AUTH_URL** — URL du serveur d'authentification SAP OAuth
|
|
|
|
- **CPI_CLIENT_ID** — Identifiant OAuth
|
|
|
|
- **CPI_CLIENT_SECRET** — Secret OAuth (en clair dans le config)
|
|
|
|
- **CPI_ENDPOINT_URL** — Endpoint unique SAP-CPI
|
|
|
|
- **CPI_TOKEN_PATH** — Chemin du fichier cache token sur disque
|
|
|
|
- **CPI_TIMEOUT** — Timeout HTTP en secondes (auth + messages)
|
|
|
|
|
|
5. **Détermination conditionnelle du MessageSAP pour REF** — Le type de préavis de réception (Supplier/Return) doit être récupéré dans le REF01Observer via une requête LINQ sur Context.RecLineInboundOrderLines → Context.InboundOrders, puis transmis dans le champ RecCustomAttributes.CstAtt20 du message REF01. Dans CommonExportWebApi.boo, le champ CstAtt20 est lu dans le payload JSON pour mapper REF → ATH215 (Supplier) ou ATH217 (Return).
|
|
|
|
|
|
### Fichiers impactés
|
|
|
|
- Scripts2015/CommonExportWebApi.boo — Script principal d'export WMS → SAP-CPI
|
|
|
|
- Scripts2015/EasyWMS/XML/REF01/REF01Observer.boo — Ajout de la requête InboundOrderType et écriture dans CstAtt20
|
|
|
|
- Configuration/LIMAGRAI2512/CommonAppSettings.config — Ajout des 6 clés CPI_*
|
|
|
|
|
|
### Cas de test
|
|
|
|
- [ ] Le GNA compile sans erreur
|
|
|
|
- [ ] L'authentification OAuth client_credentials fonctionne (HTTP 200)
|
|
|
|
- [ ] Le token est mis en cache sur disque et réutilisé tant qu'il est valide
|
|
|
|
- [ ] Les messages WMS sont envoyés en POST vers l'endpoint CPI avec le bon format JSON
|
|
|
|
- [ ] Le champ MessageSAP est présent dans le body JSON avec la bonne valeur (ATH215/ATH217/ATH201/ATH202 selon le type)
|
|
|
|
- [ ] Pour un REF de type Supplier, MessageSAP = ATH215
|
|
|
|
- [ ] Pour un REF de type Return, MessageSAP = ATH217
|
|
|
|
- [ ] Le champ CstAtt20 est renseigné dans le message REF01 par le REF01Observer
|
|
|
|
- [ ] Un warning est logué si le MessageType n'a pas de correspondance dans la table
|
|
|
|
- [ ] Le retry avec backoff fonctionne (hors 401)
|
|
|
|
- [ ] Les logs sont détaillés et lisibles (JSON indenté, token masqué)
|
|
|
|
- [ ] Un 401 provoque un échec immédiat sans retry |