🍫 Cacaomatic Sujet du TP R5.MTD.14 · version hors ligne

Sujet du TP R5.MTD.14 · Interopérabilité

Fichier autonome, généré le 24/10/2026 à 22:26 : il fonctionne sans connexion (aucune image, police ni script externe). Le serveur de l'API est https://cacaomatic.alt4b.fr.

Si la connexion ou les outils sont indisponibles

Faites la phase 0 · Concevoir avant de construire : elle n'a besoin d'aucun outil, seulement de ce document. Rendez vos réponses (document texte, PDF ou photo lisible) à l'enseignant : elles font partie de la note. Dès que les outils sont de nouveau disponibles, vous réaliserez dans n8n ce que vous avez conçu.

Les liens vers n8n et l'API ne fonctionneront qu'avec une connexion.

Contexte

Cacaomatic est une entreprise fictive qui fabrique du chocolat. Deux systèmes doivent travailler ensemble sans se connaître :

  • la boutique en ligne, qui reçoit les commandes des clients, dans son format (sku, cartons ou pièces, dates jj/mm/aaaa) ;
  • l'ERP de l'usine, qui gère commandes, stocks, réservations et fabrication, dans son format (codes article, unités, dates aaaa-mm-jj).

Votre équipe construit, dans n8n, les workflows qui font dialoguer les deux : lire les commandes de la boutique, les traduire, les passer à l'ERP, puis renvoyer le résultat à la boutique. Les deux systèmes sont des API (https://cacaomatic.alt4b.fr/api).

Chaque équipe (A à H) dispose de sa clé d'API et de ses propres données : vous ne pouvez pas perturber les autres équipes.

1. Se connecter à n8n

  • Adresse : https://n8n-tp.alt4b.fr
  • Identifiant : l'adresse e-mail reçue par invitation (ou communiquée par l'enseignant) ; mot de passe : celui défini à l'activation du compte.
  • Chaque groupe a son propre compte : vous ne voyez que vos workflows et vos credentials.

2. Créer le credential de l'API Cacaomatic (une seule fois)

  1. Vérifiez d'abord que l'API répond : /api/ping (sans clé).
  2. Menu de gauche → Credentials → Create credential → cherchez Header Auth.
  3. Name : Authorization ; Value : Bearer <votre clé d'équipe> (avec l'espace après Bearer).
  4. Save, puis nommez-le par exemple « Cacaomatic équipe X ».
  5. Dans un nœud HTTP Request : Authentication « Generic Credential Type » → Header Auth → ce credential. Adresse de base : https://cacaomatic.alt4b.fr/api.

Le même credential sert pour la boutique et pour l'ERP.

3. Premier workflow : lire la boutique et un stock

  1. Workflows → Create workflow, nommez-le « Test équipe X ».
  2. Add first step → Trigger manually.
  3. Cliquez sur le + → HTTP Request : méthode GET, URL https://cacaomatic.alt4b.fr/api/boutique/commandes, credential de l'étape 2. Execute step : vous voyez les commandes de la boutique.
  4. Ajoutez un second HTTP Request : GET https://cacaomatic.alt4b.fr/api/stocks/TAB-001. Vous obtenez stock_unites, reserve et disponible.
  5. Un code article = un type de produit (TAB tablette, BAR barre, BTE boîte, PRA praliné, SAC sachet, POU poudre, PAT pâte à tartiner, CAL calendrier) et un numéro. La liste complète est dans l'onglet Stocks.
  6. Vérifiez vos appels dans l'onglet Journal de votre espace équipe, et les commandes dans l'onglet Boutique.

4. Le format de la boutique

La boutique publie ses commandes au fil du temps : relancez la lecture régulièrement (a_venir dit combien restent à venir). Une commande ressemble à :

{
  "id": 1,
  "id_commande_web": "WEB-2026-0001",
  "passee_le": "24/10/2026 09:12",
  "client": {"nom": "Épicerie Fictive du Port", "email": "achats@epicerie-port.example"},
  "livraison_souhaitee": "15/12/2026",
  "articles": [
    {"sku": "CHOC-LAIT-100", "designation": "Tablette Lait Onctueux", "quantite": 2, "conditionnement": "carton"},
    {"sku": "BARRE-CEREALES-40", "designation": "Barre Croquante aux Céréales", "quantite": 10, "conditionnement": "piece"}
  ],
  "statut": "nouvelle"
}

Pour la passer à l'ERP, il faut traduire : le sku en code_article (table ci-dessous), piece en unite, la date en aaaa-mm-jj, id_commande_web en reference_client, client.nom en client.

Table de correspondance sku → code article

sku (boutique)Désignationcode_article (ERP)
CHOC-NOIR-70-100Tablette Noir Intense 70 %TAB-001
CHOC-LAIT-100Tablette Lait OnctueuxTAB-002
CHOC-BLANC-100Tablette Blanc VanilleTAB-003
CHOC-NOISETTE-100Tablette Lait Noisettes EntièresTAB-004
BARRE-CARAMEL-45Barre Caramel FondantBAR-001
BARRE-CEREALES-40Barre Croquante aux CéréalesBAR-002
COFFRET-TRUFFES-250Coffret de Truffes AssortiesBTE-001
COFFRET-PRALINES-500Grand Coffret de PralinésPRA-001
PEPITES-NOIR-200Pépites de Chocolat NoirSAC-001
CACAO-POUDRE-250Cacao en PoudrePOU-001
PATE-TARTINER-350Pâte à Tartiner Chocolat-NoisettePAT-001
ROCHERS-PRALINES-1KGRochers Pralinés (vrac 1 kg)PRA-002
CALENDRIER-AVENTCalendrier de l'AventCAL-001
OEUFS-FOURRES-200Oeufs Fourrés AssortisSAC-002
COUVERTURE-NOIR-1KG-PROChocolat de Couverture Noir 1 kg (pro)SAC-003
Même table en JSON (à coller dans un nœud « Code » ou « Edit Fields »)
{
    "CHOC-NOIR-70-100": "TAB-001",
    "CHOC-LAIT-100": "TAB-002",
    "CHOC-BLANC-100": "TAB-003",
    "CHOC-NOISETTE-100": "TAB-004",
    "BARRE-CARAMEL-45": "BAR-001",
    "BARRE-CEREALES-40": "BAR-002",
    "COFFRET-TRUFFES-250": "BTE-001",
    "COFFRET-PRALINES-500": "PRA-001",
    "PEPITES-NOIR-200": "SAC-001",
    "CACAO-POUDRE-250": "POU-001",
    "PATE-TARTINER-350": "PAT-001",
    "ROCHERS-PRALINES-1KG": "PRA-002",
    "CALENDRIER-AVENT": "CAL-001",
    "OEUFS-FOURRES-200": "SAC-002",
    "COUVERTURE-NOIR-1KG-PRO": "SAC-003"
}

Un sku absent de cette table est une anomalie à signaler, pas à deviner.

Phase 0 · Concevoir avant de construire

Avant d'ouvrir n8n, on raisonne sur le papier (ou dans un document) : quels appels, dans quel ordre, avec quelles données, et que faire quand ça se passe mal ? Cette phase ne demande ni n8n ni l'API : elle se fait sans connexion avec ce sujet et la documentation. Elle sert aussi de plan de secours : si les outils sont indisponibles pendant la séance, c'est le TP du jour, et ce que vous concevez ici se réalise ensuite dans n8n.

Les données de départ

Extrait du catalogue de l'ERP (stock initial et unités par carton). Chaque équipe démarre avec les mêmes stocks.

code_articleLibelléStock initial (unités)Unités par carton
TAB-001Tablette chocolat noir 70 % 100 g40020
TAB-002Tablette chocolat au lait 100 g50020
TAB-003Tablette chocolat blanc 100 g18020
TAB-004Tablette chocolat noisettes 100 g6020
BAR-001Barre chocolatée caramel 45 g30036
BAR-002Barre croquante céréales 40 g72036
BTE-001Boîte de truffes assorties 250 g9612
PRA-001Boîte de pralinés 500 g488
SAC-001Sachet de pépites de chocolat noir 200 g24024
POU-001Cacao en poudre 250 g15012
PAT-001Pâte à tartiner chocolat-noisette 350 g1206
PRA-002Rochers pralinés en vrac 1 kg3510
CAL-001Calendrier de l'Avent chocolaté06
SAC-002Oeufs fourrés assortis 200 g9015
SAC-003Chocolat de couverture noir 1 kg (pro)2510

Les 8 commandes que la boutique publie, dans l'ordre d'arrivée (à traiter dans cet ordre, les stocks se consomment au fur et à mesure) :

CommandeClientLivraisonArticles (sku × quantité)
WEB-2026-0001Épicerie Fictive du Port15/12/2026 CHOC-LAIT-100 × 2 cartons
BARRE-CEREALES-40 × 10 pièces
WEB-2026-0002Biscuiterie Imaginaire20/12/2026 CHOC-NOIR-70-100 × 5 cartons
WEB-2026-0003Café du Marché10/12/2026 BARRE-CARAMEL-45 × 300 pièces
WEB-2026-0004Boutique Les Délices Fictifs18/12/2026 CHOC-NOISETTE-100 × 61 pièces
WEB-2026-0005Hôtel Fictif des Alpes22/12/2026 CALENDRIER-AVENT × 6 cartons
CHOC-BLANC-100 × 1 carton
WEB-2026-0006Épicerie Fictive du Port19/12/2026 SAISON-NOEL-2025 × 1 pièce
WEB-2026-0002Biscuiterie Imaginaire20/12/2026 CHOC-NOIR-70-100 × 5 cartons
WEB-2026-0008Traiteur Fictif Chocolat Pro23/12/2026 COFFRET-PRALINES-500 × 4 cartons
CACAO-POUDRE-250 × 2 cartons
PEPITES-NOIR-200 × 30 pièces
Les mêmes commandes en JSON (format de la boutique)
[
    {
        "id_commande_web": "WEB-2026-0001",
        "client": {
            "nom": "Épicerie Fictive du Port",
            "email": "achats@epicerie-port.example"
        },
        "livraison_souhaitee": "15/12/2026",
        "articles": [
            {
                "sku": "CHOC-LAIT-100",
                "quantite": 2,
                "conditionnement": "carton"
            },
            {
                "sku": "BARRE-CEREALES-40",
                "quantite": 10,
                "conditionnement": "piece"
            }
        ]
    },
    {
        "id_commande_web": "WEB-2026-0002",
        "client": {
            "nom": "Biscuiterie Imaginaire",
            "email": "commandes@biscuiterie.example"
        },
        "livraison_souhaitee": "20/12/2026",
        "articles": [
            {
                "sku": "CHOC-NOIR-70-100",
                "quantite": 5,
                "conditionnement": "carton"
            }
        ]
    },
    {
        "id_commande_web": "WEB-2026-0003",
        "client": {
            "nom": "Café du Marché",
            "email": "cafe@marche.example"
        },
        "livraison_souhaitee": "10/12/2026",
        "articles": [
            {
                "sku": "BARRE-CARAMEL-45",
                "quantite": 300,
                "conditionnement": "piece"
            }
        ]
    },
    {
        "id_commande_web": "WEB-2026-0004",
        "client": {
            "nom": "Boutique Les Délices Fictifs",
            "email": "contact@delices.example"
        },
        "livraison_souhaitee": "18/12/2026",
        "articles": [
            {
                "sku": "CHOC-NOISETTE-100",
                "quantite": 61,
                "conditionnement": "piece"
            }
        ]
    },
    {
        "id_commande_web": "WEB-2026-0005",
        "client": {
            "nom": "Hôtel Fictif des Alpes",
            "email": "direction@hotel-alpes.example"
        },
        "livraison_souhaitee": "22/12/2026",
        "articles": [
            {
                "sku": "CALENDRIER-AVENT",
                "quantite": 6,
                "conditionnement": "carton"
            },
            {
                "sku": "CHOC-BLANC-100",
                "quantite": 1,
                "conditionnement": "carton"
            }
        ]
    },
    {
        "id_commande_web": "WEB-2026-0006",
        "client": {
            "nom": "Épicerie Fictive du Port",
            "email": "achats@epicerie-port.example"
        },
        "livraison_souhaitee": "19/12/2026",
        "articles": [
            {
                "sku": "SAISON-NOEL-2025",
                "quantite": 1,
                "conditionnement": "piece"
            }
        ]
    },
    {
        "id_commande_web": "WEB-2026-0002",
        "client": {
            "nom": "Biscuiterie Imaginaire",
            "email": "commandes@biscuiterie.example"
        },
        "livraison_souhaitee": "20/12/2026",
        "articles": [
            {
                "sku": "CHOC-NOIR-70-100",
                "quantite": 5,
                "conditionnement": "carton"
            }
        ]
    },
    {
        "id_commande_web": "WEB-2026-0008",
        "client": {
            "nom": "Traiteur Fictif Chocolat Pro",
            "email": "cuisine@traiteur.example"
        },
        "livraison_souhaitee": "23/12/2026",
        "articles": [
            {
                "sku": "COFFRET-PRALINES-500",
                "quantite": 4,
                "conditionnement": "carton"
            },
            {
                "sku": "CACAO-POUDRE-250",
                "quantite": 2,
                "conditionnement": "carton"
            },
            {
                "sku": "PEPITES-NOIR-200",
                "quantite": 30,
                "conditionnement": "piece"
            }
        ]
    }
]

Exemples de réponses de l'API

Réponses réelles, à connaître pour concevoir les tests de votre workflow. Toutes les erreurs ont le même format {"erreur", "message", "details"}.

201 · POST /api/commandes (cartons déjà convertis en unités par l'ERP)
{"id": 21, "reference_client": "WEB-2026-0002", "client": "Biscuiterie Imaginaire",
 "date_livraison_souhaitee": "2026-12-20", "statut": "recue",
 "lignes": [{"code_article": "TAB-001", "quantite": 5, "unite": "carton", "quantite_unites": 100}]}
201 · POST /api/reservations
{"id": 13, "reference_commande": "WEB-2026-0002", "lignes": [{"code_article": "TAB-001", "quantite": 100}]}
409 · POST /api/reservations : stock insuffisant (rien n'est réservé)
{"erreur": "stock_insuffisant", "message": "Stock insuffisant : aucune réservation n'a été enregistrée.",
 "details": {"lignes": [{"code_article": "TAB-004", "demande": 61, "disponible": 60, "suffisant": false}]}}
409 · POST /api/commandes : référence déjà utilisée
{"erreur": "commande_existante", "message": "Une commande avec la référence client « WEB-2026-0002 » existe déjà.",
 "details": {"reference_client": "WEB-2026-0002"}}
422 · données invalides
{"erreur": "validation_echouee", "message": "Les données envoyées sont invalides.",
 "details": {"champs": {"lignes.0.unite": ["La valeur du champ lignes.0.unite est invalide (valeurs acceptées : unite, carton)."]}}}
503 · panne simulée (en-tête Retry-After: 30)
{"erreur": "service_indisponible", "message": "Panne simulée : le service est indisponible pendant encore 30 seconde(s).",
 "details": {"secondes_restantes": 30}}
201 · POST /api/ordres-fabrication et POST /api/boutique/commandes/{id}/statut (200)
{"id": 7, "code_article": "TAB-004", "quantite": 1, "reference_commande": "WEB-2026-0004", "statut": "planifie"}

Exercices (à rendre, par équipe)

  1. Traduire. Écrivez le corps JSON du POST /api/commandes correspondant à la commande WEB-2026-0001 (sku, conditionnement, date, noms de champs). Quelles transformations avez-vous dû faire ?
  2. Prévoir. Complétez ce tableau pour les 8 commandes, traitées dans l'ordre : appels à faire (dans l'ordre), réponse attendue de chacun, quantités réservées en unités, et statut renvoyé à la boutique. Indiquez le stock disponible de chaque article touché après chaque commande.
    CommandeAppels dans l'ordreRéponses attenduesStock aprèsStatut renvoyé
    WEB-2026-0001    
    WEB-2026-0002    
    WEB-2026-0003    
    WEB-2026-0004    
    WEB-2026-0005    
    WEB-2026-0006    
    WEB-2026-0002    
    WEB-2026-0008    
  3. Dessiner. Représentez votre workflow : la liste des nœuds n8n (déclencheur, HTTP Request, Split Out, Code, IF…), leur ordre, et pour chaque appel de l'ERP ce que vous faites des réponses 201, 409, 422 et 503. Où renvoyez-vous le statut à la boutique ?
  4. Diagnostiquer. Pour chaque situation, donnez la cause probable et la correction :
    • un appel répond 401 non_authentifie alors que la clé semble correcte ;
    • la création d'une commande répond 422 avec lignes.0.unite invalide pour une ligne « piece » de la boutique ;
    • la commande WEB-2026-0002 répond 409 commande_existante au deuxième passage de votre workflow : est-ce un bug ? que faire ?
    • tous les appels de l'ERP répondent 503 avec Retry-After: 30 alors que la boutique répond normalement.
  5. Réfléchir. L'ERP tombe en panne entre la création de la commande et sa réservation. Que se passe-t-il au passage suivant de votre workflow ? Comment éviter de perdre ou de dupliquer une commande ? Pourquoi ne faut-il surtout pas envoyer « 5 » (cartons) dans la réservation de la commande WEB-2026-0002 ?

6. Travail demandé

Un workflow (ou plusieurs) qui traite toutes les commandes de la boutique. Les 8 commandes ne se ressemblent pas : chacune cache un cas à gérer.

a. Récupérer les commandes à traiter

  • Lisez GET /api/boutique/commandes?statut=nouvelle. Une commande déjà traitée n'y figure plus.
  • Les commandes arrivent progressivement : faites tourner le workflow à intervalle régulier (Schedule Trigger) ou relancez-le.

b. Traduire et enregistrer dans l'ERP

  • Convertissez le format (voir plus haut) puis envoyez la commande avec POST /api/commandes. Les quantités en carton sont converties par l'ERP.
  • Une même reference_client ne peut être utilisée qu'une fois : la boutique peut renvoyer une commande. Traitez le 409 sans réserver deux fois.
  • Un 422 signale des données invalides : lisez details.

c. Contrôler le stock et réserver

  • La réservation se fait en unités : POST /api/reservations. Elle est « tout ou rien » : un 409 stock_insuffisant détaille les lignes en cause.
  • Une quantité exactement égale au disponible est acceptée ; une unité de plus est refusée.

d. Fabriquer ou prévenir

  • Stock insuffisant : créez un ordre avec POST /api/ordres-fabrication pour la quantité manquante.
  • Informez le bon service avec POST /api/notifications (adv, production ou client) : refus, rupture, anomalie.

e. Renvoyer le résultat à la boutique

  • POST /api/boutique/commandes/{id}/statut avec acceptee, refusee ou en_attente_fabrication (et un motif pour un refus).
  • Le tableau de l'onglet Boutique de votre espace équipe doit refléter ces statuts.

f. Rendre le workflow robuste

  • Une panne de l'ERP peut être déclenchée sur votre équipe (par vous avec POST /api/panne, ou par l'enseignant) : l'ERP répond 503 avec Retry-After. La boutique, elle, continue de répondre. Configurez les nouvelles tentatives (Retry On Fail) et une branche d'erreur : aucune commande ne doit être perdue.
  • La limite est de 120 requêtes par minute : au-delà, 429. Évitez les boucles qui martèlent l'API.
  • Un 401 signale une clé absente ou erronée.

7. Outils pour vous aider

  • Journal (espace équipe) : tous vos appels avec requête et réponse, pour comprendre ce qui est réellement parti.
  • Essayer un appel (espace équipe) : tester un appel sans n8n.
  • Boutique, Stocks, Commandes, Réservations, Ordres, Notifications : l'état de vos données après chaque test.
  • Les données se remettent à zéro à la demande de l'enseignant (la boutique recommence alors ses publications).

8. À rendre

  • Le document de la phase 0 (réponses aux 5 exercices).
  • L'export JSON de vos workflows n8n.
  • Une capture de l'onglet Boutique avec les statuts des 8 commandes, et un extrait du journal montrant un 409 et une panne (503) gérés.
  • Un court compte rendu : choix faits (traduction du format, conversion des cartons, gestion des erreurs) et difficultés rencontrées.

Les modalités exactes (date, format, barème) sont précisées par l'enseignant.

9. Règles à respecter

  • Ne saisissez aucune donnée personnelle ni aucun mot de passe réel dans vos workflows : tout est fictif ici.
  • Ne partagez pas votre clé d'équipe ; chaque équipe n'utilise que la sienne.
  • Une exécution est coupée après 5 minutes. Évitez les boucles infinies.
  • Certains nodes sont désactivés (commandes système, fichiers, nodes communautaires, API publique). C'est voulu.

10. En cas de problème

SymptômeQue faire
401 non_authentifieVérifiez le credential : nom Authorization, valeur Bearer suivi de la clé, sans espace en trop.
« Connection refused » ou délai dépasséVérifiez l'URL (https://cacaomatic.alt4b.fr/api/…), puis testez /api/ping dans le navigateur.
La liste de la boutique est incomplèteNormal : la boutique publie ses commandes au fil du temps (a_venir). Relancez plus tard ou demandez à l'enseignant de tout libérer.
422Le corps JSON est incomplet ou mal typé : lisez details dans la réponse.
503Panne simulée de l'ERP sur votre équipe : attendez la durée de Retry-After (visible dans l'espace équipe) ou gérez-la dans le workflow.
429Plus de 120 requêtes par minute : attendez une minute et vérifiez qu'une boucle ne tourne pas.
Workflow coupéIl a dépassé 5 minutes : simplifiez-le.
Autre erreurFaites une capture d'écran du message (et du Journal) et appelez l'enseignant.

Bonus · Ajouter une IA locale

Facultatif, une fois le travail principal terminé : faites classer ou résumer par un modèle local les messages que vos workflows envoient.

Credential Ollama (une seule fois)

  1. Credentials → Create credential → cherchez Ollama.
  2. Base URL : http://ollama:11434 (sans espace ni « / » final).
  3. Save : le message « Connection tested successfully » doit s'afficher. Nommez-le par exemple « Ollama équipe X ».

Un assistant qui répond

  1. Nouveau workflow → On chat message → + → Basic LLM Chain.
  2. Sous la chaîne, + de Model → Ollama Chat Model : credential ci-dessus, Model = gemma4:e4b-it-q4_K_M.
  3. Open chat, écrivez un message et vérifiez la réponse.

Exemple de consigne : classer une notification

Classe ce message dans une seule rubrique parmi : adv, production, client.
Réponds uniquement par le nom de la rubrique.

Message : {{ $json.chatInput }}

Idée : utilisez la rubrique renvoyée comme destinataire de POST /api/notifications.

Utilisez uniquement le modèle gemma4:e4b-it-q4_K_M. Tous les groupes le partagent : si la réponse est lente, patientez avant de relancer. Symptômes : « Connection refused » → vérifiez l'URL ; modèle absent de la liste → sauvegardez le credential, rouvrez le node et rechargez la page.

Documentation de l'API

Authentification et règles

Adresse de base : https://cacaomatic.alt4b.fr/api

API du pseudo-ERP fictif de Cacaomatic, une entreprise qui fabrique du chocolat. Elle sert de support aux TP d'interopérabilité (n8n, Postman, curl…). Toutes les données sont fictives.

Authentification : une clé d'API par équipe, dans l'en-tête Authorization: Bearer <clé>. Les données de chaque équipe sont isolées.

Limite : 120 requêtes par minute et par clé (réponse 429).

Erreurs : toutes les erreurs ont le même format {"erreur": "code_machine", "message": "…", "details": {…}}.

Quantités : le stock, les réservations et les ordres de fabrication sont exprimés en unités. Une commande peut être passée en carton : un carton contient N unités selon l'article.

Les exemples curl ci-dessous se tapent dans un terminal (pas dans le navigateur). Ils montrent les informations à reporter dans n8n ou Postman : méthode, adresse, en-têtes et corps JSON. Pour essayer un appel depuis le navigateur, utilisez l'onglet « Essayer un appel » de l'espace équipe.

Dans n8n : nœud HTTP Request → Authentication « Generic Credential Type » → Header Auth, nom Authorization, valeur Bearer <votre clé>. Pour un corps JSON : Send Body → JSON.

Format des erreurs

Codes HTTP utilisés : 401, 404, 409, 422, 429, 503. Le corps est toujours :

{"erreur": "stock_insuffisant", "message": "texte en français", "details": {}}

Public

GET /api/ping sans clé
Vérifier que l'API répond

Réponses

200
L'API répond.
Exemple
{
    "statut": "ok",
    "service": "cacaomatic-api",
    "heure": "2026-10-24T09:00:00+00:00"
}
Exemple curl
curl https://cacaomatic.alt4b.fr/api/ping

Commandes

GET /api/commandes
Lister les commandes de l'équipe

Paramètres

NomOùTypeDescription
reference_client requêtestring Ne renvoie que les commandes ayant cette référence client (liste vide si aucune).

Réponses

200
Liste des commandes.
Exemple
{
    "donnees": [
        {
            "id": 1,
            "reference_client": "texte",
            "client": "texte",
            "date_livraison_souhaitee": "2026-12-01",
            "statut": "recue",
            "cree_le": "2026-10-24T09:00:00+00:00",
            "lignes": [
                {
                    "code_article": "texte",
                    "quantite": 1,
                    "unite": "unite",
                    "quantite_unites": 1
                }
            ]
        }
    ]
}
401
Clé d'API absente, invalide ou sans droit sur cette route.
Exemple
{
    "erreur": "non_authentifie",
    "message": "Clé d'API manquante : ajoutez l'en-tête « Authorization: Bearer <clé> ».",
    "details": []
}
429
Limite de 120 requêtes par minute dépassée. Voir l'en-tête Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
503
Panne simulée en cours pour votre équipe. Voir l'en-tête Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
Exemple curl
curl https://cacaomatic.alt4b.fr/api/commandes \
  -H "Authorization: Bearer <votre clé>"
POST /api/commandes
Enregistrer une commande client

Corps JSON

ChampTypeDescription
reference_clientobligatoire stringUnique par équipe.
clientobligatoire string
date_livraison_souhaitee string(peut être nul)
lignes[]obligatoire liste d'objets
lignes[].code_articleobligatoire string
lignes[].quantiteobligatoire integer(min 1)
lignes[].uniteobligatoire string(valeurs : unite, carton)
{
    "reference_client": "CMD-2026-001",
    "client": "Épicerie Fictive du Port",
    "date_livraison_souhaitee": "2026-12-01",
    "lignes": [
        {
            "code_article": "TAB-001",
            "quantite": 5,
            "unite": "carton"
        },
        {
            "code_article": "TAB-002",
            "quantite": 10,
            "unite": "unite"
        }
    ]
}

Réponses

201
Commande enregistrée.
Exemple
{
    "id": 1,
    "reference_client": "texte",
    "client": "texte",
    "date_livraison_souhaitee": "2026-12-01",
    "statut": "recue",
    "cree_le": "2026-10-24T09:00:00+00:00",
    "lignes": [
        {
            "code_article": "texte",
            "quantite": 1,
            "unite": "unite",
            "quantite_unites": 1
        }
    ]
}
401
Clé d'API absente, invalide ou sans droit sur cette route.
Exemple
{
    "erreur": "non_authentifie",
    "message": "Clé d'API manquante : ajoutez l'en-tête « Authorization: Bearer <clé> ».",
    "details": []
}
409
Une commande avec cette reference_client existe déjà pour votre équipe.
Exemple
{
    "erreur": "commande_existante",
    "message": "Une commande avec la référence client « CMD-2026-001 » existe déjà.",
    "details": {
        "reference_client": "CMD-2026-001"
    }
}
422
Données invalides (champ manquant, quantité non entière ou < 1, code article inconnu…).
Exemple
{
    "erreur": "validation_echouee",
    "message": "Les données envoyées sont invalides.",
    "details": {
        "champs": {
            "lignes.0.quantite": [
                "Le champ lignes.0.quantite doit être supérieur ou égal à 1."
            ]
        }
    }
}
429
Limite de 120 requêtes par minute dépassée. Voir l'en-tête Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
503
Panne simulée en cours pour votre équipe. Voir l'en-tête Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
Exemple curl
curl -X POST https://cacaomatic.alt4b.fr/api/commandes \
  -H "Authorization: Bearer <votre clé>" \
  -H "Content-Type: application/json" \
  -d '{"reference_client":"CMD-2026-001","client":"Épicerie Fictive du Port","date_livraison_souhaitee":"2026-12-01","lignes":[{"code_article":"TAB-001","quantite":5,"unite":"carton"},{"code_article":"TAB-002","quantite":10,"unite":"unite"}]}'
GET /api/commandes/{id}
Consulter une commande

Paramètres

NomOùTypeDescription
idobligatoire chemininteger

Réponses

200
La commande.
Exemple
{
    "id": 1,
    "reference_client": "texte",
    "client": "texte",
    "date_livraison_souhaitee": "2026-12-01",
    "statut": "recue",
    "cree_le": "2026-10-24T09:00:00+00:00",
    "lignes": [
        {
            "code_article": "texte",
            "quantite": 1,
            "unite": "unite",
            "quantite_unites": 1
        }
    ]
}
401
Clé d'API absente, invalide ou sans droit sur cette route.
Exemple
{
    "erreur": "non_authentifie",
    "message": "Clé d'API manquante : ajoutez l'en-tête « Authorization: Bearer <clé> ».",
    "details": []
}
404
Commande introuvable (ou appartenant à une autre équipe).
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
429
Limite de 120 requêtes par minute dépassée. Voir l'en-tête Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
503
Panne simulée en cours pour votre équipe. Voir l'en-tête Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
Exemple curl
curl https://cacaomatic.alt4b.fr/api/commandes/<id> \
  -H "Authorization: Bearer <votre clé>"

Stocks

GET /api/stocks/{code_article}
Consulter le stock d'un article (en unités)

Paramètres

NomOùTypeDescription
code_articleobligatoire cheminstring Exemple : TAB-001

Réponses

200
Stock de l'article. disponible = stock_unites − reserve.
Exemple
{
    "code_article": "TAB-001",
    "stock_unites": 400,
    "reserve": 0,
    "disponible": 400
}
401
Clé d'API absente, invalide ou sans droit sur cette route.
Exemple
{
    "erreur": "non_authentifie",
    "message": "Clé d'API manquante : ajoutez l'en-tête « Authorization: Bearer <clé> ».",
    "details": []
}
404
Code article inconnu.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
429
Limite de 120 requêtes par minute dépassée. Voir l'en-tête Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
503
Panne simulée en cours pour votre équipe. Voir l'en-tête Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
Exemple curl
curl https://cacaomatic.alt4b.fr/api/stocks/<code_article> \
  -H "Authorization: Bearer <votre clé>"

Réservations

POST /api/reservations
Réserver du stock (tout ou rien)

Les quantités sont en unités. Une réservation est acceptée si, pour chaque article, la quantité demandée est inférieure ou égale au disponible (égalité acceptée). Si une ligne est insuffisante, aucune ligne n'est réservée (409).

Corps JSON

ChampTypeDescription
reference_commandeobligatoire string
lignes[]obligatoire liste d'objets
lignes[].code_articleobligatoire string
lignes[].quantiteobligatoire integerEn unités. (min 1)
{
    "reference_commande": "CMD-2026-001",
    "lignes": [
        {
            "code_article": "TAB-001",
            "quantite": 100
        }
    ]
}

Réponses

201
Réservation enregistrée.
Exemple
{
    "id": 1,
    "reference_commande": "texte",
    "cree_le": "2026-10-24T09:00:00+00:00",
    "lignes": [
        {
            "code_article": "texte",
            "quantite": 1
        }
    ]
}
401
Clé d'API absente, invalide ou sans droit sur cette route.
Exemple
{
    "erreur": "non_authentifie",
    "message": "Clé d'API manquante : ajoutez l'en-tête « Authorization: Bearer <clé> ».",
    "details": []
}
409
Stock insuffisant ; details.lignes donne le détail par ligne.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "Stock insuffisant : aucune réservation n'a été enregistrée.",
    "details": {
        "lignes": [
            {
                "code_article": "TAB-001",
                "demande": 10,
                "disponible": 400,
                "suffisant": true
            },
            {
                "code_article": "TAB-004",
                "demande": 61,
                "disponible": 60,
                "suffisant": false
            }
        ]
    }
}
422
Données invalides (champ manquant, quantité non entière ou < 1, code article inconnu…).
Exemple
{
    "erreur": "validation_echouee",
    "message": "Les données envoyées sont invalides.",
    "details": {
        "champs": {
            "lignes.0.quantite": [
                "Le champ lignes.0.quantite doit être supérieur ou égal à 1."
            ]
        }
    }
}
429
Limite de 120 requêtes par minute dépassée. Voir l'en-tête Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
503
Panne simulée en cours pour votre équipe. Voir l'en-tête Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
Exemple curl
curl -X POST https://cacaomatic.alt4b.fr/api/reservations \
  -H "Authorization: Bearer <votre clé>" \
  -H "Content-Type: application/json" \
  -d '{"reference_commande":"CMD-2026-001","lignes":[{"code_article":"TAB-001","quantite":100}]}'

Fabrication

POST /api/ordres-fabrication
Créer un ordre de fabrication

Corps JSON

ChampTypeDescription
code_articleobligatoire string
quantiteobligatoire integer(min 1)
reference_commandeobligatoire string
{
    "code_article": "CAL-001",
    "quantite": 120,
    "reference_commande": "CMD-2026-001"
}

Réponses

201
Ordre de fabrication créé.
Exemple
{
    "id": 1,
    "code_article": "texte",
    "quantite": 1,
    "reference_commande": "texte",
    "statut": "planifie",
    "cree_le": "2026-10-24T09:00:00+00:00"
}
401
Clé d'API absente, invalide ou sans droit sur cette route.
Exemple
{
    "erreur": "non_authentifie",
    "message": "Clé d'API manquante : ajoutez l'en-tête « Authorization: Bearer <clé> ».",
    "details": []
}
422
Données invalides (champ manquant, quantité non entière ou < 1, code article inconnu…).
Exemple
{
    "erreur": "validation_echouee",
    "message": "Les données envoyées sont invalides.",
    "details": {
        "champs": {
            "lignes.0.quantite": [
                "Le champ lignes.0.quantite doit être supérieur ou égal à 1."
            ]
        }
    }
}
429
Limite de 120 requêtes par minute dépassée. Voir l'en-tête Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
503
Panne simulée en cours pour votre équipe. Voir l'en-tête Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
Exemple curl
curl -X POST https://cacaomatic.alt4b.fr/api/ordres-fabrication \
  -H "Authorization: Bearer <votre clé>" \
  -H "Content-Type: application/json" \
  -d '{"code_article":"CAL-001","quantite":120,"reference_commande":"CMD-2026-001"}'

Notifications

GET /api/notifications
Lister les notifications de l'équipe

Réponses

200
Notifications, de la plus ancienne à la plus récente.
Exemple
{
    "donnees": [
        {
            "id": 1,
            "destinataire": "adv",
            "sujet": "texte",
            "message": "texte",
            "cree_le": "2026-10-24T09:00:00+00:00"
        }
    ]
}
401
Clé d'API absente, invalide ou sans droit sur cette route.
Exemple
{
    "erreur": "non_authentifie",
    "message": "Clé d'API manquante : ajoutez l'en-tête « Authorization: Bearer <clé> ».",
    "details": []
}
429
Limite de 120 requêtes par minute dépassée. Voir l'en-tête Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
503
Panne simulée en cours pour votre équipe. Voir l'en-tête Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
Exemple curl
curl https://cacaomatic.alt4b.fr/api/notifications \
  -H "Authorization: Bearer <votre clé>"
POST /api/notifications
Envoyer une notification

Aucun e-mail n'est envoyé : les notifications sont consultables avec GET /notifications.

Corps JSON

ChampTypeDescription
destinataireobligatoire string(valeurs : adv, production, client)
sujetobligatoire string(longueur max 200)
messageobligatoire string(longueur max 2000)
{
    "destinataire": "adv",
    "sujet": "texte",
    "message": "texte"
}

Réponses

201
Notification enregistrée.
Exemple
{
    "id": 1,
    "destinataire": "adv",
    "sujet": "texte",
    "message": "texte",
    "cree_le": "2026-10-24T09:00:00+00:00"
}
401
Clé d'API absente, invalide ou sans droit sur cette route.
Exemple
{
    "erreur": "non_authentifie",
    "message": "Clé d'API manquante : ajoutez l'en-tête « Authorization: Bearer <clé> ».",
    "details": []
}
422
Données invalides (champ manquant, quantité non entière ou < 1, code article inconnu…).
Exemple
{
    "erreur": "validation_echouee",
    "message": "Les données envoyées sont invalides.",
    "details": {
        "champs": {
            "lignes.0.quantite": [
                "Le champ lignes.0.quantite doit être supérieur ou égal à 1."
            ]
        }
    }
}
429
Limite de 120 requêtes par minute dépassée. Voir l'en-tête Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
503
Panne simulée en cours pour votre équipe. Voir l'en-tête Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
Exemple curl
curl -X POST https://cacaomatic.alt4b.fr/api/notifications \
  -H "Authorization: Bearer <votre clé>" \
  -H "Content-Type: application/json" \
  -d '{"destinataire":"adv","sujet":"texte","message":"texte"}'

Boutique

Boutique en ligne fictive : le système source qui reçoit les commandes des clients, dans son propre format (sku, cartons ou pièces, dates jj/mm/aaaa). Votre workflow lit ces commandes, les traduit pour l'ERP (commandes, réservations, fabrication), puis renvoie à la boutique le résultat avec POST /boutique/commandes/{id}/statut.

Les commandes sont publiées au fil du temps : relisez régulièrement la liste (a_venir indique combien restent à venir). La boutique n'est pas touchée par la panne simulée de l'ERP.

GET /api/boutique/commandes
Lister les commandes publiées par la boutique

Commandes déjà publiées pour votre équipe, de la plus ancienne à la plus récente. Une commande renvoyée par la boutique (doublon) porte le même id_commande_web mais un id différent. Le sku n'est pas le code article de l'ERP : utilisez la table de correspondance donnée dans le sujet du TP.

Paramètres

NomOùTypeDescription
statut requêtestring Ne renvoie que les commandes ayant ce statut (nouvelle = pas encore traitée). Exemple : nouvelle

Réponses

200
Commandes publiées et nombre de commandes encore à venir.
Exemple
{
    "donnees": [
        {
            "id": 1,
            "id_commande_web": "WEB-2026-0001",
            "passee_le": "24/10/2026 09:12",
            "client": {
                "nom": "Épicerie Fictive du Port",
                "email": "achats@epicerie-port.example"
            },
            "livraison_souhaitee": "15/12/2026",
            "articles": [
                {
                    "sku": "CHOC-LAIT-100",
                    "designation": "Tablette Lait Onctueux",
                    "quantite": 2,
                    "conditionnement": "carton"
                }
            ],
            "statut": "nouvelle",
            "reference_erp": "texte",
            "motif": "texte"
        }
    ],
    "a_venir": 5
}
401
Clé d'API absente, invalide ou sans droit sur cette route.
Exemple
{
    "erreur": "non_authentifie",
    "message": "Clé d'API manquante : ajoutez l'en-tête « Authorization: Bearer <clé> ».",
    "details": []
}
422
Données invalides (champ manquant, quantité non entière ou < 1, code article inconnu…).
Exemple
{
    "erreur": "validation_echouee",
    "message": "Les données envoyées sont invalides.",
    "details": {
        "champs": {
            "lignes.0.quantite": [
                "Le champ lignes.0.quantite doit être supérieur ou égal à 1."
            ]
        }
    }
}
429
Limite de 120 requêtes par minute dépassée. Voir l'en-tête Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
Exemple curl
curl https://cacaomatic.alt4b.fr/api/boutique/commandes \
  -H "Authorization: Bearer <votre clé>"
GET /api/boutique/commandes/{id}
Consulter une commande de la boutique

Paramètres

NomOùTypeDescription
idobligatoire chemininteger Identifiant technique (id)

Réponses

200
La commande.
Exemple
{
    "id": 1,
    "id_commande_web": "WEB-2026-0001",
    "passee_le": "24/10/2026 09:12",
    "client": {
        "nom": "Épicerie Fictive du Port",
        "email": "achats@epicerie-port.example"
    },
    "livraison_souhaitee": "15/12/2026",
    "articles": [
        {
            "sku": "CHOC-LAIT-100",
            "designation": "Tablette Lait Onctueux",
            "quantite": 2,
            "conditionnement": "carton"
        }
    ],
    "statut": "nouvelle",
    "reference_erp": "texte",
    "motif": "texte"
}
401
Clé d'API absente, invalide ou sans droit sur cette route.
Exemple
{
    "erreur": "non_authentifie",
    "message": "Clé d'API manquante : ajoutez l'en-tête « Authorization: Bearer <clé> ».",
    "details": []
}
404
Commande inconnue ou pas encore publiée.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
429
Limite de 120 requêtes par minute dépassée. Voir l'en-tête Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
Exemple curl
curl https://cacaomatic.alt4b.fr/api/boutique/commandes/<id> \
  -H "Authorization: Bearer <votre clé>"
POST /api/boutique/commandes/{id}/statut
Renvoyer à la boutique le résultat du traitement

Peut être rappelé : le dernier statut remplace le précédent.

Paramètres

NomOùTypeDescription
idobligatoire chemininteger Identifiant technique (id). Exemple : 1

Corps JSON

ChampTypeDescription
statutobligatoire string(valeurs : acceptee, refusee, en_attente_fabrication)
reference_erp stringRéférence de la commande côté ERP (facultatif). (longueur max 100)
motif stringExplication, notamment pour un refus (facultatif). (longueur max 500)
{
    "statut": "acceptee",
    "reference_erp": "WEB-2026-0001"
}

Réponses

200
Commande mise à jour.
Exemple
{
    "id": 1,
    "id_commande_web": "WEB-2026-0001",
    "passee_le": "24/10/2026 09:12",
    "client": {
        "nom": "Épicerie Fictive du Port",
        "email": "achats@epicerie-port.example"
    },
    "livraison_souhaitee": "15/12/2026",
    "articles": [
        {
            "sku": "CHOC-LAIT-100",
            "designation": "Tablette Lait Onctueux",
            "quantite": 2,
            "conditionnement": "carton"
        }
    ],
    "statut": "nouvelle",
    "reference_erp": "texte",
    "motif": "texte"
}
401
Clé d'API absente, invalide ou sans droit sur cette route.
Exemple
{
    "erreur": "non_authentifie",
    "message": "Clé d'API manquante : ajoutez l'en-tête « Authorization: Bearer <clé> ».",
    "details": []
}
404
Commande inconnue ou pas encore publiée.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
422
Données invalides (champ manquant, quantité non entière ou < 1, code article inconnu…).
Exemple
{
    "erreur": "validation_echouee",
    "message": "Les données envoyées sont invalides.",
    "details": {
        "champs": {
            "lignes.0.quantite": [
                "Le champ lignes.0.quantite doit être supérieur ou égal à 1."
            ]
        }
    }
}
429
Limite de 120 requêtes par minute dépassée. Voir l'en-tête Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
Exemple curl
curl -X POST https://cacaomatic.alt4b.fr/api/boutique/commandes/<id>/statut \
  -H "Authorization: Bearer <votre clé>" \
  -H "Content-Type: application/json" \
  -d '{"statut":"acceptee","reference_erp":"WEB-2026-0001"}'

Panne simulée

Panne propre à votre équipe. Tant qu'elle est active, tous vos autres appels répondent 503 avec Retry-After.

GET /api/panne
État de la panne

Réponses

200
État courant.
Exemple
{
    "active": true,
    "fin": "2026-10-24T09:00:00+00:00",
    "secondes_restantes": 1
}
401
Clé d'API absente, invalide ou sans droit sur cette route.
Exemple
{
    "erreur": "non_authentifie",
    "message": "Clé d'API manquante : ajoutez l'en-tête « Authorization: Bearer <clé> ».",
    "details": []
}
429
Limite de 120 requêtes par minute dépassée. Voir l'en-tête Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
Exemple curl
curl https://cacaomatic.alt4b.fr/api/panne \
  -H "Authorization: Bearer <votre clé>"
POST /api/panne
Déclencher une panne de votre ERP

Corps JSON (facultatif)

ChampTypeDescription
duree_secondes integer(min 1 ; max 600 ; défaut 120)
{
    "duree_secondes": 1
}

Réponses

201
Panne démarrée.
Exemple
{
    "active": true,
    "fin": "2026-10-24T09:00:00+00:00",
    "secondes_restantes": 1
}
401
Clé d'API absente, invalide ou sans droit sur cette route.
Exemple
{
    "erreur": "non_authentifie",
    "message": "Clé d'API manquante : ajoutez l'en-tête « Authorization: Bearer <clé> ».",
    "details": []
}
422
Données invalides (champ manquant, quantité non entière ou < 1, code article inconnu…).
Exemple
{
    "erreur": "validation_echouee",
    "message": "Les données envoyées sont invalides.",
    "details": {
        "champs": {
            "lignes.0.quantite": [
                "Le champ lignes.0.quantite doit être supérieur ou égal à 1."
            ]
        }
    }
}
429
Limite de 120 requêtes par minute dépassée. Voir l'en-tête Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
Exemple curl
curl -X POST https://cacaomatic.alt4b.fr/api/panne \
  -H "Authorization: Bearer <votre clé>" \
  -H "Content-Type: application/json" \
  -d '{"duree_secondes":1}'
DELETE /api/panne
Arrêter la panne

Réponses

200
Panne arrêtée.
Exemple
{
    "active": true,
    "fin": "2026-10-24T09:00:00+00:00",
    "secondes_restantes": 1
}
401
Clé d'API absente, invalide ou sans droit sur cette route.
Exemple
{
    "erreur": "non_authentifie",
    "message": "Clé d'API manquante : ajoutez l'en-tête « Authorization: Bearer <clé> ».",
    "details": []
}
429
Limite de 120 requêtes par minute dépassée. Voir l'en-tête Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
Exemple curl
curl -X DELETE https://cacaomatic.alt4b.fr/api/panne \
  -H "Authorization: Bearer <votre clé>"

Enseignant

Réservé à la clé enseignant.

GET /api/admin/equipes
Lister les équipes

Réponses

200
Équipes et compteurs d'activité.
Exemple
{
    "donnees": [
        {
            "code": "texte",
            "nom": "texte",
            "session": {
                "promotion": "texte",
                "annee": 1,
                "groupe": "texte"
            },
            "scenario": "texte",
            "panne_active": true,
            "panne_fin": "2026-10-24T09:00:00+00:00",
            "commandes": 1,
            "reservations": 1,
            "ordres_fabrication": 1,
            "notifications": 1,
            "appels": 1
        }
    ]
}
401
Clé d'API absente, invalide ou sans droit sur cette route.
Exemple
{
    "erreur": "non_authentifie",
    "message": "Clé d'API manquante : ajoutez l'en-tête « Authorization: Bearer <clé> ».",
    "details": []
}
429
Limite de 120 requêtes par minute dépassée. Voir l'en-tête Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
Exemple curl
curl https://cacaomatic.alt4b.fr/api/admin/equipes \
  -H "Authorization: Bearer <votre clé>"
POST /api/admin/equipes/{code}/reinitialiser
Remettre une équipe à l'état initial

Remet les stocks, commandes, réservations, ordres de fabrication, notifications, journal et panne de l'équipe à l'état initial.

Paramètres

NomOùTypeDescription
codeobligatoire cheminstring Exemple : A

Réponses

200
Équipe réinitialisée.
Exemple
{
    "code": "A",
    "message": "L'équipe A a été réinitialisée."
}
401
Clé d'API absente, invalide ou sans droit sur cette route.
Exemple
{
    "erreur": "non_authentifie",
    "message": "Clé d'API manquante : ajoutez l'en-tête « Authorization: Bearer <clé> ».",
    "details": []
}
404
Équipe inconnue.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
429
Limite de 120 requêtes par minute dépassée. Voir l'en-tête Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
Exemple curl
curl -X POST https://cacaomatic.alt4b.fr/api/admin/equipes/<code>/reinitialiser \
  -H "Authorization: Bearer <votre clé>"