17 KiB
Diagramme de cas d'utilisation - Wakdo
Phase UML : P1 - Conception, complement UML (apres MCD)
Statut : v0.2 - prod-like, 5 roles RBAC + catalogue de 23 permissions
Date : 2026-06-11
Branche : feat/p1-conception
Auteur methodologie : BYAN
1. Objet du document
Ce document recense les cas d'utilisation de Wakdo, c'est-a-dire les
fonctionnalites observables du systeme du point de vue de ses acteurs. Il
complete le MCD (docs/merise/mcd.md), le dictionnaire
(docs/merise/dictionary.md) et le MCT (docs/merise/mct.md, 26 operations) en
passant de la vue donnees / traitements a la vue usages.
Le diagramme reste au niveau conceptuel : il identifie qui fait quoi, sans
prejuger de l'ecran ou de l'endpoint qui realise chaque cas. Chaque cas
back-office est rattache a la permission qui le conditionne (catalogue fige
de 23 codes, dictionary.md 3.17), conformement a la regle RBAC
permission-driven : le code teste une permission, pas un nom de role.
Sources :
docs/PROJECT_CONTEXT.mdsections 2 (acteurs, processus), 7 (scope back-office)docs/merise/dictionary.md3.14-3.18 (user,role,role_visible_source,permission,role_permission)docs/merise/mct.md(operations, acteurs, permissions par operation)
2. Acteurs - perimetre et challenge de pertinence
Le brief initial (PROJECT_CONTEXT.md section 2) decrivait quatre acteurs
metier (Client, Accueil, Preparation, Administration) adosses a 3 roles RBAC. Le
modele v0.2 (prod-like, Decision 4 de revue-alignement-p1.md section 7) raffine
le back-office en 5 roles pour coller a l'organisation reelle d'un fast-food
multi-canal. Chaque acteur candidat est confronte au perimetre reel.
| Acteur candidat (brief) | Statut v0.2 | Justification (perimetre reel) |
|---|---|---|
| Client (borne kiosk) | Retenu (acteur CUSTOMER) |
Acteur central du Bloc 1. Compose et valide une commande sur la borne tactile autonome (canal kiosk). Non authentifie. |
| Accueil | Scinde en counter et drive |
Le besoin "Accueil" recouvre deux canaux operationnels distincts : le comptoir (counter) et le drive (drive). Le v0.2 les separe car le tag source de la commande et le filtre de dashboard (role_visible_source) different. Tous deux saisissent des commandes, les remettent et les annulent. |
| Preparation | Retenu, renomme kitchen |
Role RBAC kitchen. Voit la file des commandes paid triees par paid_at croissant. Lecture seule : ne declenche aucune transition de statut (le KDS est un dispositif visuel ; la remise revient a counter/drive). |
| Administration | Scinde en admin et manager |
Le v0.1 fusionnait "Manager/Admin". Le v0.2 distingue : admin (gestion des utilisateurs, des roles et permissions, suppressions catalogue) et manager (catalogue create/update, stock/reappro, stats), sans acces aux utilisateurs ni au RBAC. Resout le point ouvert v0.1 "Manager vs Admin". |
| Caisse | Ecarte (recouvert par counter/drive) |
Aucun role caisse n'existe. L'encaissement est atomique a la creation de commande (saisie du numero = substitut de paiement) ; il est realise par le Client (kiosk) ou par counter/drive (back-office). Resout le point ouvert v0.1 "Caisse absente du RBAC". |
| Systeme | Retenu (acteur SYS) |
Logique interne (generation du numero, reponse API de confirmation). Apparait dans le MCT (3.4 DISPLAY_CONFIRMATION) ; non represente comme acteur humain au diagramme. |
Decision sur les acteurs retenus
Six acteurs sont conserves : un acteur public et cinq roles back-office.
- Customer (borne kiosk, non authentifie)
- Admin (role
admin) - Manager (role
manager) - Kitchen (role
kitchen, ex-"Preparation", lecture seule) - Counter (role
counter, ex-"Accueil" comptoir) - Drive (role
drive, ex-"Accueil" drive)
Regle RBAC permission-driven (
dictionary.md3.15) : les rattachements acteur -> cas ci-dessous refletent la matrice de permissions par defaut au seed. Le gardien reel est la permission, pas le nom du role : un role personnalise (ex. "chef-patissier") dote des bonnes permissions ouvre les memes cas, sans changement de code. Les 5 roles seed sont un point de depart, pas une liste fermee.
3. Diagramme de cas d'utilisation
Mermaid ne fournit pas de type usecase natif. La representation utilise un
flowchart : les acteurs sont a gauche, les cas d'utilisation regroupes par
sous-systeme. La permission qui conditionne chaque cas back-office est precisee
en section 4.
flowchart LR
%% Acteurs
Customer(("Customer<br/>borne kiosk<br/>non authentifie"))
Admin(("Admin<br/>role admin"))
Manager(("Manager<br/>role manager"))
Kitchen(("Kitchen<br/>role kitchen<br/>lecture seule"))
Counter(("Counter<br/>role counter"))
Drive(("Drive<br/>role drive"))
%% Sous-systeme Borne client
subgraph BORNE["Borne client - Bloc 1 (public)"]
UC1(["Consulter le catalogue"])
UC2(["Composer le panier"])
UC3(["Consulter les allergenes"])
UC4(["Passer une commande"])
UC5(["Saisir le numero de retrait"])
UC6(["Recevoir la confirmation"])
end
%% Sous-systeme Operations commande
subgraph OPS["Operations commande - back-office"]
UC10(["Saisir une commande<br/>comptoir / drive"])
UC11(["Consulter la file de preparation"])
UC12(["Remettre la commande"])
UC13(["Annuler une commande"])
end
%% Sous-systeme Catalogue
subgraph CAT["Catalogue - back-office"]
UC20(["Gerer produits"])
UC21(["Gerer menus et slots"])
UC22(["Gerer categories"])
UC23(["Gerer ingredients,<br/>compositions, allergenes"])
end
%% Sous-systeme Stock
subgraph STK["Stock - back-office"]
UC30(["Consulter le stock"])
UC31(["Compter l'inventaire"])
UC32(["Reapprovisionner"])
end
%% Sous-systeme Administration
subgraph ADM["Administration - back-office"]
UC40(["Gerer les utilisateurs"])
UC41(["Gerer roles et permissions"])
UC42(["Consulter les statistiques"])
end
%% Transverse
UC50(["S'authentifier"])
UC51(["Se deconnecter"])
%% Relations Customer
Customer --> UC1
Customer --> UC2
Customer --> UC4
Customer --> UC6
UC2 -. include .-> UC1
UC2 -. extend .-> UC3
UC4 -. include .-> UC5
UC4 -. include .-> UC2
%% Relations Counter / Drive (operations commande + stock)
Counter --> UC10
Counter --> UC11
Counter --> UC12
Counter --> UC13
Drive --> UC10
Drive --> UC11
Drive --> UC12
Drive --> UC13
UC10 -. include .-> UC1
%% Kitchen (lecture seule)
Kitchen --> UC11
%% Stock (kitchen / counter / drive / manager / admin)
Kitchen --> UC30
Kitchen --> UC31
Counter --> UC30
Counter --> UC31
Drive --> UC30
Drive --> UC31
Manager --> UC30
Manager --> UC31
Manager --> UC32
%% Catalogue (manager + admin)
Manager --> UC20
Manager --> UC21
Manager --> UC22
Manager --> UC23
Admin --> UC20
Admin --> UC21
Admin --> UC22
Admin --> UC23
%% Administration (admin) + stats (manager + admin)
Admin --> UC40
Admin --> UC41
Admin --> UC42
Admin --> UC30
Admin --> UC31
Admin --> UC32
Admin --> UC11
Admin --> UC13
Manager --> UC42
%% Authentification mutualisee (tout cas back-office)
UC10 -. include .-> UC50
UC11 -. include .-> UC50
UC20 -. include .-> UC50
UC30 -. include .-> UC50
UC40 -. include .-> UC50
UC42 -. include .-> UC50
4. Description des cas d'utilisation
4.1 Acteur Customer (borne kiosk, non authentifie)
| Cas | Operation MCT | Description | Entites manipulees |
|---|---|---|---|
| Consulter le catalogue | 3.1 LOAD_CATALOGUE | Parcourir categories, produits et menus disponibles, charges via GET /api/categories, /api/products, /api/menus (ou JSON fallback). |
category, product, menu, menu_slot, menu_slot_option |
| Composer le panier | 3.2 COMPOSE_CART | Ajouter produits a la carte ou menus ; remplir les slots d'un menu (order_item_selection), choisir le format Normal/Maxi, ajouter/retirer des ingredients (order_item_modifier). Panier volatil cote front, aucun ecrit BDD a ce stade. |
product, menu, menu_slot, menu_slot_option, ingredient, product_ingredient |
| Consulter les allergenes | (derive de 3.1) | Afficher en modal les allergenes d'un produit, calcules par jointure product_ingredient -> ingredient_allergen -> allergen (INCO 1169/2011). Etend la composition. |
allergen, ingredient_allergen, product_ingredient |
| Passer une commande | 3.3 CREATE_ORDER | Valider le panier et saisir le numero de retrait. Creation atomique : INSERT customer_order (pending_payment puis paid dans la meme transaction), order_item + selections + modifiers snapshotes, decrement du stock + stock_movement. |
customer_order, order_item, order_item_selection, order_item_modifier, ingredient, stock_movement |
| Saisir le numero de retrait | (inclus dans 3.3) | Renseigner le numero qui identifie le client. Tient lieu de paiement (cadre RNCP). Cas inclus par "Passer une commande". | customer_order.order_number |
| Recevoir la confirmation | 3.4 DISPLAY_CONFIRMATION | Afficher l'ecran de confirmation avec le numero, apres reponse 201 (statut paid). La borne se reinitialise. |
customer_order |
4.2 Acteurs Counter et Drive (roles counter, drive)
| Cas | Operation MCT | Permission | Description | Entites |
|---|---|---|---|---|
| Saisir une commande comptoir/drive | 4.1 CREATE_COUNTER_ORDER | order.create |
Composer une commande pour un client au comptoir (counter) ou au drive (drive). Logique identique a CREATE_ORDER ; source auto-tague depuis role.order_source. Numero C-/D-YYYY-MM-DD-NNN. |
customer_order, order_item, order_item_selection, order_item_modifier, ingredient, stock_movement |
| Consulter la file de preparation | 5.1 LIST_ORDERS_DISPLAY | order.read |
Voir les commandes paid triees par paid_at croissant, filtrees par role_visible_source (counter voit kiosk+counter ; drive voit drive). Couleur KDS = now - paid_at. |
customer_order, order_item, order_item_selection, order_item_modifier, role_visible_source |
| Remettre la commande | 6.1 DELIVER_ORDER | order.deliver |
Geste unique paid -> delivered, delivered_at = NOW(). |
customer_order |
| Annuler une commande | 7.1 CANCEL_ORDER | order.cancel |
Transition vers cancelled depuis pending_payment/paid, cancelled_at = NOW(). Re-credit du stock si paid. |
customer_order, ingredient, stock_movement |
4.3 Acteur Kitchen (role kitchen, lecture seule)
| Cas | Operation MCT | Permission | Description | Entites |
|---|---|---|---|---|
| Consulter la file de preparation | 5.1 LIST_ORDERS_DISPLAY | order.read |
Voir toutes les sources (kiosk, counter, drive) en lecture seule. Aucune transition de statut : le KDS est un affichage visuel. | customer_order, order_item, order_item_selection, order_item_modifier, role_visible_source |
4.4 Stock (Kitchen, Counter, Drive, Manager, Admin)
| Cas | Operation MCT | Permission | Description | Entites |
|---|---|---|---|---|
| Consulter le stock | 9.3 READ_STOCK | stock.read |
Lister les ingredients avec stock courant ; alerte rupture calculee a l'affichage (stock_quantity <= low_stock_threshold). |
ingredient, stock_movement |
| Compter l'inventaire | 9.2 INVENTORY_COUNT | stock.count |
Saisir un comptage physique ; le systeme enregistre l'ecart (inventory_correction). Inclut les equipiers (kitchen/counter/drive). |
ingredient, stock_movement |
| Reapprovisionner | 9.1 RESTOCK | stock.manage |
Enregistrer une livraison en conditionnements (+= N * pack_size). Reserve manager/admin. |
ingredient, stock_movement |
4.5 Catalogue (Manager, Admin)
| Cas | Operation MCT | Permissions | Description | Entites |
|---|---|---|---|---|
| Gerer produits | 8.1-8.3 CREATE/UPDATE/DELETE_PRODUCT | product.create/update (manager+admin), product.delete (admin seul) |
CRUD produits (nom, prix, vat_rate, image, dispo). La suppression physique est reservee a admin et bloquee si reference (FK RESTRICT). |
product, category |
| Gerer menus et slots | 8.4-8.6 CREATE/UPDATE/DELETE_MENU | menu.create/update (manager+admin), menu.delete (admin seul) |
CRUD menus avec leur configuration de slots (menu_slot, menu_slot_option) et le burger fixe. |
menu, menu_slot, menu_slot_option, product |
| Gerer categories | 8.7 MANAGE_CATEGORY | category.manage (manager+admin) |
CRUD categories ; desactivation is_active=0. |
category |
| Gerer ingredients, compositions, allergenes | 8.8 MANAGE_INGREDIENT | ingredient.manage (manager+admin) |
CRUD ingredient ; composition product_ingredient (quantites Normal/Maxi, retirable/ajoutable, supplement) ; mapping ingredient_allergen (14 allergenes UE). |
ingredient, product_ingredient, ingredient_allergen, allergen |
4.6 Administration (role admin) + Stats (Manager, Admin)
| Cas | Operation MCT | Permissions | Description | Entites |
|---|---|---|---|---|
| Gerer les utilisateurs | 10.1-10.3 CREATE/UPDATE/DEACTIVATE_USER | user.create/update/deactivate (admin) ; user.read (admin+manager) |
CRUD comptes back-office avec hash argon2id ; desactivation sans suppression (historique preserve). | user, role |
| Gerer roles et permissions | 10.4 MANAGE_RBAC | role.manage (admin) |
Editer la matrice role_permission, creer/modifier des roles personnalises (default_route, order_source), regler role_visible_source. Permissions statiques (declarees en migration). |
role, permission, role_permission, role_visible_source |
| Consulter les statistiques | 11.1 READ_STATS | stats.read (admin+manager) |
Agregats par service_day (coupure 10h), top produits, taux d'annulation, temps moyen de remise delivered_at - paid_at, repartition par source/service_mode. |
customer_order, order_item |
4.7 Cas transverses - Authentification
| Cas | Operation MCT | Description |
|---|---|---|
| S'authentifier | 12.1 AUTHENTICATE_USER | Tous les roles back-office passent par ce cas avant d'acceder a leurs cas (relation <<include>>). Verification argon2id, regeneration de session (anti-fixation), is_active=1 requis, redirection vers role.default_route. Le Customer du kiosk n'est pas authentifie. |
| Se deconnecter | 12.2 LOGOUT_USER | Destruction de session (session_destroy()) sur clic ou expiration (idle 4h / absolu 10h). |
5. Relations include / extend retenues
| Relation | Type | Justification |
|---|---|---|
| Passer une commande -> Saisir le numero de retrait | include | La saisie du numero fait partie integrante de toute validation de commande. |
| Passer une commande -> Composer le panier | include | Une commande resulte d'un panier compose. |
| Composer le panier -> Consulter le catalogue | include | Composer suppose de parcourir les produits eligibles (a la carte ou par slot). |
| Composer le panier -> Consulter les allergenes | extend | La consultation des allergenes est un cas optionnel declenche a la demande du client sur un produit. |
| Saisir une commande (Counter/Drive) -> Consulter le catalogue | include | L'equipier consulte le catalogue pour saisir au comptoir/drive. |
| Cas back-office -> S'authentifier | include | Acces conditionne a une session authentifiee detenant la permission requise. |
6. Points resolus par rapport au v0.1
Les incoherences que le v0.1 remontait pour arbitrage sont desormais tranchees
par le modele v0.2 (dictionary.md, mct.md).
- Acteur "Caisse" : ecarte. L'encaissement est atomique a la creation
(saisie du numero = substitut de paiement,
mct.mdsection 13) et realise par le Customer (kiosk) ou parcounter/drive(back-office). Aucun rolecaissen'est necessaire. - "Manager" vs "Admin" : scindes en deux roles distincts.
managergere le catalogue (create/update), le stock/reappro et les stats ;adminajoute les suppressions catalogue, la gestion des utilisateurs et le RBAC. - "Accueil" unique : scinde en
counteretdrive, car le tagsourceet le filtrerole_visible_sourcedifferent selon le canal. - Machine a etats : alignee sur les 4 etats du
dictionary.md3.10 (pending_payment -> paid -> delivered+cancelled). Plus depreparing/ready: la cuisine (kitchen) est en lecture seule, la remise est un geste unique (counter/drive). - Modele permission-driven : chaque cas back-office est rattache a sa
permission (catalogue de 23 codes fige,
dictionary.md3.17). Le diagramme reflete la matrice seed ; le gardien effectif reste la permission.