Aller au contenu principal

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
Menuid, date, name, site_id, created_at, updated_at
MenuProductid, menu_id, product_id, quantity, unit_price_cents, group_id, created_at
MenuGroupid, menu_id, name, sort_order, created_at

GET /admin/org/menus​

Liste les menus.

Permissions : menu.read

ParamTypeDéfautDescription
datedate—Si fourni, retourne tous les menus de cette date
limitinteger20Éléments par page
offsetinteger0Dé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​

PermissionDescription
menu.read / menu.create / menu.update / menu.deleteCRUD menu
menu.manageSuper-permission