Aller au contenu principal

API SRV-APPS — Référence complète

Base URL : http://192.168.1.17:8002/api
Accessible depuis le réseau interne uniquement.


Authentification

Les routes protégées requièrent un token Bearer :

Authorization: Bearer <EDI_ENGINE_API_TOKEN>

Défini dans /opt/medithau/api/.envEDI_ENGINE_API_TOKEN.
Si la variable est vide, toutes les requêtes sont autorisées (réseau fermé).


Statut système

GET /health

Aucune authentification.

{
"status": "ok",
"version": "1.0",
"mode": "production",
"timestamp": "2026-06-10T07:00:00+02:00"
}

EDI Engine

Toutes les routes ci-dessous requièrent le token Bearer.

Deux préfixes équivalents :

  • /api/... — chemins courts (rétrocompatibilité)
  • /api/edi-engine/... — recommandé pour les nouveaux appels

Fichiers en attente

GET /api/edi-engine/incoming

Liste les fichiers en attente dans incoming/.

[
{
"filename": "order_001.pdf",
"source": "pdf",
"size_bytes": 45210,
"mtime": "2026-06-10T08:30:00+02:00",
"error_excerpt": "2026-06-10 08:30 | ERROR | Fichier illisible"
}
]

error_excerpt : dernière ligne de log mentionnant ce fichier (null si aucune).


DELETE /api/edi-engine/incoming/{type}/{filename}

Supprime un fichier de la file d'attente.

Réponse 200 :

{ "deleted": true, "type": "pdf", "filename": "order_001.pdf" }

Erreurs : 400 type invalide, 404 introuvable.


Archives

GET /api/edi-engine/dates

Liste les dates ayant des archives ou des fichiers en quarantaine.

["20260610", "20260609", "20260608"]

GET /api/edi-engine/commands

Commandes traitées (archives + quarantaine) pour une date.

ParamTypeDéfautDescription
datestringrequisFormat YYYYMMDD
pageint1
per_pageint200
{
"page": 1,
"per_page": 200,
"total": 42,
"items": [
{
"filename": "order_001.json",
"source": "edi",
"origin": "carrefour",
"order_number": "CMD-12345",
"client": "CARREFOUR VAUVERT",
"order_date": "2026-06-10",
"delivery_date": "2026-06-12",
"status": "OK",
"warnings": [],
"edi_exists": true,
"source_file": "order_001.pdf",
"pdf_url": "/api/edi-engine/pdfs/20260610/order_001.pdf",
"edi_url": "/api/edi-engine/edis/20260610/CMD-12345.edi",
"metadata_url": "/api/edi-engine/commands/order_001.json?date=20260610",
"quarantined": false
}
]
}

status : OK | WARNING | QUARANTINE


GET /api/edi-engine/commands/{filename}

Détail complet d'une commande (contenu JSON du fichier archivé).

ParamTypeDescription
datestringRequis. Format YYYYMMDD

GET /api/edi-engine/pdfs/{date}/{filename}

Sert le PDF source. Réponse : application/pdf.


GET /api/edi-engine/edis/{date}/{filename}

Sert le fichier EDI généré. Réponse : text/plain.


Quarantaine

GET /api/edi-engine/quarantine

Fichiers en quarantaine pour une date.

ParamTypeDescription
datestringRequis
[
{
"filename": "order_002.json",
"source": "edi",
"size_bytes": 1240,
"mtime": "2026-06-10T09:00:00+02:00",
"type": "json",
"url": "/api/edi-engine/quarantine/20260610/edi/order_002.json",
"order_number": "CMD-99999",
"client": "CLIENT INCONNU",
"warnings": ["GLN non trouvé : 3012345678901"]
}
]

GET /api/edi-engine/quarantine/{date}/{source}/{filename}

Sert un fichier de quarantaine (PDF, JSON ou texte).


Erreurs

GET /api/edi-engine/errors

Lignes ERROR/ERREUR du log pour une date.

ParamTypeDescription
datestringRequis
[
{
"filename": "order_003.pdf",
"message": "2026-06-10 10:15:32 | ERROR | Impossible de lire le fichier",
"ts": "2026-06-10 10:15:32"
}
]

Logs

GET /api/edi-engine/logs

Dernières entrées du log EDI Engine.

ParamTypeDéfautDescription
datestringrequisFormat YYYYMMDD
tailint200Nb de lignes
[
{ "ts": "2026-06-10 08:30:00", "level": "INFO", "message": "Traitement de order_001.pdf" },
{ "ts": "2026-06-10 08:30:05", "level": "ERROR", "message": "GLN non trouvé" }
]

level : INFO | WARNING | ERROR


GET /api/edi-engine/logs/{date}/raw

Log brut en téléchargement (Content-Disposition: attachment).


Jobs (retraitement)

POST /api/edi-engine/commands/{date}/{filename}/reprocess

Lance le retraitement d'une commande archivée.

Réponse 202 :

{ "job_id": "019eabcd-..." }

POST /api/edi-engine/commands/{date}/{filename}/force-integration

Force l'intégration d'une commande (bypasse les vérifications).

Body requis :

{ "user": "prenom.nom" }

Réponse 202 :

{
"job_id": "019eabcd-...",
"type": "force-integration",
"date": "20260610",
"filename": "order_001.json",
"params": { "user": "prenom.nom" },
"status": "pending",
"requested_by": { "ip": "192.168.1.27", "user_agent": "..." },
"requested_at": "2026-06-10T08:30:00+02:00",
"started_at": null,
"finished_at": null,
"result": null
}

GET /api/edi-engine/jobs/{jobId}

Suivi d'un job de retraitement.

status : pending | running | done | failed

Même structure que force-integration ci-dessus.


Configuration

GET /api/edi-engine/config/crons

Contenu de crons.json (planification des scripts EDI).


PUT /api/edi-engine/config/crons

Met à jour crons.json.

Body : nouvel objet complet.

{ "status": "ok", "message": "crons.json mis à jour." }

GET /api/edi-engine/config/gln

Table de correspondance GLN → clients.


PUT /api/edi-engine/config/gln

Met à jour la table GLN.


GET /api/edi-engine/config/env

Variables d'environnement de l'EDI Engine.
Les clés contenant PASSWORD, TOKEN, PASS, SECRET, KEY sont masquées en ***.

{
"ERP_SSH_IP": "192.168.1.13",
"ERP_SSH_PORT": "34322",
"ERP_SSH_USER": "edi",
"CRF_USER": "mon_user",
"CRF_PASSWORD": "***"
}

PUT /api/edi-engine/config/env

Met à jour des variables d'environnement (hors clés secrètes).

Erreur 403 si une clé secrète est incluse.


Web-Orders

Webhooks WooCommerce

Sans authentification Bearer. Sécurité par token dans le corps XML et vérification User-Agent.

POST /api/web-orders/webhook/main

Reçoit une commande de la boutique principale.

Body : XML WooCommerce brut.

<?xml version="1.0" encoding="UTF-8"?>
<Orders>
<Order>
<token>xxxx</token>
<NumCommandeweb>67489</NumCommandeweb>
<datecommande>2026-06-10 09:00</datecommande>
...
</Order>
</Orders>

Réponse 202 :

{
"status": "received",
"id": "019eabcd-...",
"filename": "order_20260610_090000_abc12345.xml"
}

Erreurs : 400 XML invalide ou vide, 403 token invalide ou User-Agent non autorisé.


POST /api/web-orders/webhook/ostrealia

Identique à webhook/main pour la boutique Ostrealia.


Gestion (Bearer token requis)

GET /api/web-orders

100 dernières commandes web. Filtrables par ?source=main|ostrealia et ?status=.

[
{
"id": "019eabcd-...",
"source": "main",
"filename": "order_20260610_090000_abc12345.xml",
"status": "transferred",
"error": null,
"received_at": "2026-06-10T09:00:00.000000Z",
"transferred_at": "2026-06-10T09:00:01.000000Z",
"order_number": "67489",
"order_date": "2026-06-10 09:00",
"delivery_date": "2026-06-10",
"delivery_type": "pickup",
"shipping_method": "Retrait au Mas",
"client": "Nicolas Lapeyre",
"company": "Medithau frontignan",
"total": 5.60,
"lines_count": 2
}
]

status : received | transferring | transferred | failed


GET /api/web-orders/{id}

Détail complet avec parsed_data (sans le XML brut).

{
"id": "019eabcd-...",
"parsed_data": {
"order_number": "67489",
"billing": { "last_name": "Lapeyre", "first_name": "Nicolas", ... },
"shipping": { ... },
"lines": [
{ "reference": "MITSV1,4unit", "name": "Moules d'Italie", "qty": 2, "unit_price": 2.65, "line_total": 5.30 }
],
"totals": { "shipping": 0.0, "refund": 0.0, "total": 5.60 },
"coupons": []
}
}

POST /api/web-orders/{id}/retry

Relance le transfert d'une commande failed.

Réponse 200 :

{ "status": "queued", "id": "019eabcd-..." }

Erreur 409 si la commande n'est pas en statut failed.


Codes HTTP

CodeSignification
200Succès
202Accepté (job ou commande en file)
400Paramètre manquant ou invalide
401Token Bearer absent ou incorrect
403Action interdite (clé secrète, token XML invalide, User-Agent)
404Ressource introuvable
409Conflit d'état (ex. retry sur commande non failed)

Notes d'intégration

  • Toutes les réponses sont application/json sauf les endpoints fichiers (PDF, EDI, log brut).
  • Les dates en réponse sont en ISO 8601 UTC (2026-06-10T09:00:00.000000Z).
  • Les IDs des commandes web sont des UUID v7.
  • Pas de pagination pour /api/web-orders (limite fixe 100) — filtrer par source et status.
  • Pour les jobs de retraitement : polling sur GET /api/edi-engine/jobs/{jobId} jusqu'à status: done ou failed.