Menus (Administration)
Base URL : /api/v1/admin/org/menus
CRUD des menus, gestion des produits rattachés et des groupes de menu. Pour la consultation publique, voir Menus.
Structure d'un menu
| Entité | Champs |
|---|---|
| Menu | id, date, name, site_id, created_at, updated_at |
| MenuProduct | id, menu_id, product_id, quantity, unit_price_cents, group_id, created_at |
| MenuGroup | id, menu_id, name, sort_order, created_at |
GET /admin/org/menus
Liste les menus.
Permissions : menu.read
| Param | Type | Défaut | Description |
|---|---|---|---|
date | date | — | Si fourni, retourne tous les menus de cette date |
limit | integer | 20 | Éléments par page |
offset | integer | 0 | Décalage |
Réponse (200) : { "items": [Menu], "total": n }
POST /admin/org/menus
Crée un menu.
Permissions : menu.create
{
"date": "2025-06-21",
"name": "Menu du 21 juin",
"site_id": "uuid"
}
Rejette une date passée et un doublon date+site.
Réponse (201) : { "message": "Menu créé", "menu": {...} }
GET /admin/org/menus/{id}
Détail d'un menu avec ses produits et groupes.
Permissions : menu.read
Réponse (200) :
{
"menu": { "id": "uuid", "date": "2025-06-21", "name": "Menu du 21 juin", "site_id": "uuid" },
"products": [
{
"id": "uuid",
"name": "Riz au poisson",
"code": "RZP",
"price_cents": 1200,
"price": 1200,
"price_formatted": "1 200 FCFA",
"menu_product_id": "uuid",
"menu_quantity": 20,
"menu_unit_price_cents": 1200,
"menu_unit_price": 1200,
"menu_unit_price_formatted": "1 200 FCFA",
"group_id": "uuid",
"group_name": "Plats",
"currency": "XOF"
}
],
"group": ["Entrées", "Plats", "Desserts"]
}
group est une liste de noms de groupes.
PUT /admin/org/menus/{id}
Met à jour un menu.
Permissions : menu.update
{ "date": "2025-06-21", "name": "Menu révisé", "site_id": "uuid" }
Réponse (200) : { "message": "Menu mis à jour", "menu": {...} }
DELETE /admin/org/menus/{id}
Permissions : menu.delete
Réponse (200) : { "message": "Menu supprimé" }
POST /admin/org/menus/{id}/duplicate
Duplique un menu vers une autre date.
Permissions : menu.create
{
"target_date": "2025-06-22",
"name": "Menu du 22 juin",
"site_id": "uuid"
}
name et site_id sont optionnels (repris de la source par défaut). Échoue si la cible existe déjà.
Réponse (201) : { "message": "Menu dupliqué", "menu": {...} }
Produits d'un menu
POST /admin/org/menus/{id}/products
Ajoute un produit au menu. Le produit doit exister et être actif.
Permissions : menu.update
{
"product_id": "uuid",
"quantity": 20,
"unit_price_cents": 1200,
"group_id": "uuid"
}
Réponse (201) : { "message": "Produit ajouté au menu", "product": <MenuProduct> }
PUT /admin/org/menus/{id}/products/{product_id}
Met à jour la quantité/prix d'un produit du menu. Le segment {product_id} accepte soit un products.id, soit un menu_products.id.
Permissions : menu.update
{
"quantity": 25,
"unit_price_cents": 1300,
"group_id": null
}
quantity et unit_price_cents doivent être > 0. group_id: null retire le groupe.
Réponse (200) : { "message": "Produit du menu mis à jour", "product": <MenuProduct> }
DELETE /admin/org/menus/{id}/products/{product_id}
Retire un produit du menu.
Permissions : menu.update
Réponse (200) : { "message": "Produit retiré du menu" }
Groupes de menu
GET /admin/org/menus/{id}/groups
Permissions : menu.read
Réponse (200) : { "items": [MenuGroup], "total": n } (triés par sort_order)
POST /admin/org/menus/{id}/groups
Permissions : menu.update
{ "name": "Plats", "sort_order": 1 }
Réponse (201) : { "message": "Groupe créé", "group": {...} }
PUT /admin/org/menus/{id}/groups/{group_id}
Permissions : menu.update
{ "name": "Plats principaux", "sort_order": 2 }
Réponse (200) : { "message": "Groupe mis à jour", "group": {...} }
DELETE /admin/org/menus/{id}/groups/{group_id}
Permissions : menu.update
Réponse (200) : { "message": "Groupe supprimé" } (les produits référençant ce groupe passent à group_id = NULL)
Permissions
| Permission | Description |
|---|---|
menu.read / menu.create / menu.update / menu.delete | CRUD menu |
menu.manage | Super-permission |