---
title: "Transition order status (state machine)."
method: POST
path: "/api/v1/commandes/{order_id}/transition"
tags: ["Approvisionnement"]
---

# Transition order status (state machine).

`POST /api/v1/commandes/{order_id}/transition`

## Request

- Base URL: `https://erp.eyeot.fr/api/v1`
- URL: `https://erp.eyeot.fr/api/v1/api/v1/commandes/{order_id}/transition`
- Auth: one of:
  - HTTP bearer
  - HTTP bearer

Transition order status (state machine).

    MUST V0 stock-achats-sec (2026-07-03) — audit RBAC 2026-06-23 :
    « approbation >10k€ contournable via /transition ». Quand un PO est gaté
    par le workflow d'approbation (PurchaseOrderApproval pending, R243), la
    transition APPROVED/REJECTED :
    - est DÉLÉGUÉE à po_approval_service.approve()/reject() si l'appelant a
      `commandes:approve` (la décision est enregistrée — le bouton
      « Approuver » du frontend passe par cette route) ;
    - est refusée en 403 sinon (`commandes:write` ne suffit plus).
    Defence-in-depth : `order_service.transition_status` porte le même
    garde côté service (409) pour les appels qui ne passent pas par ici.

**Permissions requises** : `commandes:write`

## Request body

- Transition
  - `reason` string, nullable
  - `status` 'APPROVED' | 'REJECTED' | 'IN_PROGRESS' | 'PARTIAL_RECEIPT' | 'RECEIVED' | 'CANCELLED', required

## Response `200`

Succès — payload `{data, meta}` (cf. API-GUIDE §3.1)

## Other responses

- `201`: Ressource créée. ID dans `data.id`.
- `400`: Validation Marshmallow échouée. `errors` détaille chaque champ invalide.
- `401`: JWT manquant, expiré ou révoqué.
- `402`: L'organisation n'a pas d'abonnement actif (paywall). Rediriger vers /activate.
- `403`: Permissions `module:action` insuffisantes pour cette route.
- `404`: Ressource introuvable (ou cross-tenant — équivalent à hidden).
- `409`: État incohérent (email dupliqué, ressource déjà dans cet état, etc.).
- `422`: Validation Marshmallow échouée. `errors` détaille chaque champ invalide.
- `429`: Trop de requêtes. Honorer le header `Retry-After` (secondes).

---

[API](https://skmtc.dev/eyeot/apis/eyeot-erp-api.md) · [All operations](https://skmtc.dev/eyeot/apis/eyeot-erp-api/llms.txt) · [OpenAPI document](https://skmtc.dev/eyeot/apis/eyeot-erp-api/revisions/42ab95222a89?raw)
