Wiki/docs/08-merise-mct.md
Corentin JOGUET 668576cdc4 chore: initial commit — formation-hub conception phase
Conception complete (Phase 0) pour formation-hub Acadenice :

- 19 docs Merise Agile + UML + GitOps + plans (tests/deploy/ops/api)
  cf docs/00-readme.md pour l'index complet
- Stack Docker compose (Docmost + Baserow + Postgres + Redis + MinIO local FS)
  compose.yml + compose.staging.yml + compose.prod.yml
- CI/CD GitHub Actions skeleton (ci, deploy-staging, deploy-prod)
- Bridge service skeleton (Hono + TS + Biome + Vitest + zod + pino)
- Templates GitHub : PR + 3 issue types + CODEOWNERS + dependabot.yml
- Scripts ops : healthcheck, backup quotidien, smoke-test post-deploy
- LICENSE AGPL-3.0 + SECURITY.md + CONTRIBUTING.md + CHANGELOG.md
- Diagramme drawIO archi infra (XML importable dans diagrams.net)

Decisions structurelles enregistrees :
- Scope CFA + Agence avec entite PERSONNE pivot multi-roles (ADR-001)
- Stack composite Docmost AGPL + Baserow MIT + bridge custom (ADR-001)
- Path B : UX quasi-unified via Tiptap node-views custom (ADR-002)
- Monorepo trunk-based development (ADR-003)
- Postgres separe Docmost/Baserow (ADR-004)
- Bridge stack Node 22 + Hono (ADR-005)
- Repo neuf prefere a fork Docmost
- Prod-like des le jour 1 (pas MVP)
2026-05-07 12:16:19 +02:00

226 lines
9.1 KiB
Markdown

# MCT — Modele Conceptuel de Traitements
> Vue dynamique des operations metier. Complete le MCD (statique) et les state diagrams (cycles de vie).
> Methodologie : Merise. Chaque operation = evenement declencheur + regle de synchronisation + actions + evenement resultat.
## 1. Conventions
- **Evenement** : un fait survenant dans le systeme, declenche une operation. Note `EV-XX`.
- **Operation** : traitement metier qui transforme un etat. Note `OP-XX`.
- **Regle de synchronisation** : condition logique sur les evenements entrants (AND/OR).
- **Regle d'emission** : condition sur les evenements de sortie selon le resultat.
## 2. Liste des evenements
| Code | Evenement | Origine |
|------|-----------|---------|
| EV-01 | Demande creation formation | Admin |
| EV-02 | Specs blocs renseignees | Admin |
| EV-03 | Specs modules renseignees | Admin |
| EV-04 | Demande attribution module | Admin |
| EV-05 | Formateur dispo (capacite >= heures requises) | System (calcul) |
| EV-06 | Date debut module atteinte | System (cron) |
| EV-07 | Saisie heures realisees | Formateur |
| EV-08 | Date fin module atteinte | System (cron) |
| EV-09 | Demande annulation attribution | Admin |
| EV-10 | Rollup recalcule | System (auto) |
| EV-11 | Capacite formateur depassee | System (calcul) |
| EV-12 | Demande archivage formation | Admin |
| EV-13 | Tous modules d'une formation realises | System (calcul) |
| EV-14 | Demande edition page wiki | Admin / Formateur |
| EV-15 | Lien partage cree | Admin |
## 3. Liste des operations
| Code | Operation | Acteur principal |
|------|-----------|------------------|
| OP-01 | Creer une formation | Admin |
| OP-02 | Decomposer en blocs et modules | Admin |
| OP-03 | Attribuer un module a un formateur | Admin |
| OP-04 | Saisir heures realisees | Formateur |
| OP-05 | Annuler une attribution | Admin |
| OP-06 | Cloturer un module | System / Admin |
| OP-07 | Cloturer une formation | System / Admin |
| OP-08 | Recalculer rollups | System (auto) |
| OP-09 | Notifier depassement capacite | System (auto) |
| OP-10 | Archiver une formation | Admin |
| OP-11 | Generer rapport formation | Admin |
| OP-12 | Generer rapport formateur | Admin |
| OP-13 | Inviter client par lien partage | Admin |
| OP-14 | Backup quotidien | System (cron) |
## 4. Operations detaillees
### OP-01 — Creer une formation
```mermaid
flowchart TD
EV01([EV-01 Demande creation formation]) --> SYNC1{Regle sync:<br/>EV-01 saisi}
SYNC1 --> OP01[OP-01 Creer formation]
OP01 -->|Validation OK| EV_OUT_OK([EV: Formation creee statut=draft])
OP01 -->|Nom deja existant| EV_OUT_ERR([EV: Erreur saisie])
```
- **Entrants** : EV-01
- **Synchro** : EV-01 saisi
- **Actions** :
1. Valider unicite du nom
2. Valider `heures_totales > 0`
3. INSERT formation avec `statut = draft`, timestamps auto
- **Sortants** :
- Si OK → "Formation creee" (statut = draft)
- Si erreur → "Erreur saisie"
### OP-03 — Attribuer un module a un formateur
```mermaid
flowchart TD
EV04([EV-04 Demande attribution]) --> SYNC2{AND}
EV05([EV-05 Formateur dispo]) --> SYNC2
SYNC2 --> OP03[OP-03 Creer attribution]
OP03 -->|RG-01 OK| EV_ATTR([EV: Attribution creee statut=planifie])
OP03 -->|RG-01 KO| EV_BLOCK([EV: Erreur depassement heures module])
EV_ATTR --> OP08_TRIG[Trigger OP-08 Recalculer rollups]
```
- **Entrants** : EV-04 AND EV-05
- **Synchro** : les deux evenements presents (formateur dispo verifie avant ouverture du formulaire)
- **Actions** :
1. Valider RG-01 : `SUM(attributions.heures) + nouvelle_attribution.heures <= module.heures_prevues`
2. Valider RG-02 : warning si `formateur.heures_attribuees + nouvelle.heures > formateur.capacite` (mais pas blocage)
3. INSERT attribution avec `statut = planifie`
4. Declenche EV-10 (rollup recalcule)
- **Sortants** :
- Si OK → "Attribution creee" + EV-10
- Si RG-01 KO → "Erreur depassement"
- Si RG-02 warning → "Attribution creee" + "Warning capacite"
### OP-04 — Saisir heures realisees
- **Entrants** : EV-07 (saisie formateur)
- **Synchro** : EV-07 ET attribution.statut IN (`planifie`, `en_cours`)
- **Actions** :
1. Valider RG-05 : `heures_realisees <= heures_attribuees + tolerance`
2. UPDATE attribution.heures_realisees
3. Si `heures_realisees == heures_attribuees` → attribution.statut = `realise`
4. Declenche EV-10 (rollup recalcule)
- **Sortants** : "Heures saisies" + EV-10. Si RG-05 KO → "Erreur depassement heures"
### OP-06 — Cloturer un module
- **Entrants** : EV-08 OR EV-13
- **Synchro** :
- EV-08 (date fin atteinte) ET `module.statut = en_cours`
- OU manuel admin via bouton "Marquer realise"
- **Actions** :
1. Verifier : toutes attributions du module en `realise` ou `annule`
2. UPDATE module.statut = `realise`
3. Si tous les modules de la formation = `realise` → declenche EV-13
- **Sortants** : "Module cloture"
### OP-07 — Cloturer une formation
- **Entrants** : EV-13 (tous modules realises) ET formation.date_fin atteinte
- **Synchro** : AND des deux
- **Actions** : UPDATE formation.statut = `termine`
- **Sortants** : "Formation terminee"
### OP-08 — Recalculer rollups
- **Entrants** : EV-10 (toute modification de attribution, module, bloc, formation)
- **Actions** :
1. Recalcul cascadant : attribution → module → bloc → formation
2. Recalcul formateur.heures_attribuees / heures_restantes
3. Si formateur.heures_restantes < 0 declenche EV-11
- **Sortants** : "Rollups a jour" + EV-11 si depassement
### OP-09 — Notifier depassement capacite
- **Entrants** : EV-11
- **Actions** :
1. Identifier admins du workspace
2. Envoyer notification (email + dans-app) avec details
- **Sortants** : "Notification envoyee"
## 5. Diagramme global du flux
```mermaid
flowchart TD
EV01([EV-01]) --> OP01[OP-01 Creer formation]
OP01 --> EV02_PRE([Formation creee])
EV02_PRE --> OP02[OP-02 Decomposer en blocs/modules]
OP02 --> EV_MOD([Modules crees a_attribuer])
EV_MOD --> OP03[OP-03 Attribuer module]
OP03 --> EV_ATTR_OK([Attribution planifie])
EV_ATTR_OK --> OP08[OP-08 Recalcul rollups]
EV06([EV-06 Date debut]) --> EV_EN_COURS([Module en_cours])
EV_EN_COURS --> OP04[OP-04 Saisie heures realisees]
OP04 --> OP08
OP04 --> EV_REAL([Module realise])
EV_REAL --> OP06[OP-06 Cloturer module]
OP06 --> EV13([EV-13 Tous modules realises])
EV13 --> OP07[OP-07 Cloturer formation]
OP07 --> EV_TERM([Formation terminee])
OP08 --> EV11{Capacite<br/>depassee?}
EV11 -->|Oui| OP09[OP-09 Notifier admin]
```
## 6. Operations secondaires
| Operation | Trigger | Frequence |
|-----------|---------|-----------|
| OP-11 Generer rapport formation | Demande admin | A la demande |
| OP-12 Generer rapport formateur | Demande admin | A la demande |
| OP-13 Inviter client | Demande admin | A la demande |
| OP-14 Backup | Cron quotidien | 1x/jour |
## 7. Operations Agence (extension scope B)
| Code | Operation | Acteur principal | Trigger |
|------|-----------|------------------|---------|
| OPA-01 | Creer client | Admin | Manuel |
| OPA-02 | Creer projet | Admin | Devis signe |
| OPA-03 | Decomposer projet en taches | Admin | Apres creation projet |
| OPA-04 | Attribuer tache a un developpeur | Admin | Manuel |
| OPA-05 | Saisir intervention | Developpeur | Apres travail effectue |
| OPA-06 | Marquer tache `done` | Developpeur ou Admin | Validation |
| OPA-07 | Cloturer projet | Admin | Toutes taches done + livraison validee |
| OPA-08 | Recalculer rollups Agence | System | Sur evenement (intervention modifiee) |
| OPA-09 | Lier projet a formation pedagogique | Admin | Optionnel, sur fiche projet |
| OPA-10 | Recalculer capacite Personne (formation + agence) | System | Sur evenement (attribution OU intervention modifiee) |
### OPA-05 — Saisir intervention (developpeur)
- **Entrants** : Developpeur ouvre l'app + selectionne tache
- **Synchro** : Personne.roles contient `developpeur` ET tache.statut != `abandoned/done`
- **Actions** :
1. Valider `intervention_heures > 0`
2. INSERT intervention statut `realise`
3. Declenche OPA-08 + OPA-10 (recalcul rollups)
- **Sortants** : "Intervention saisie" + "Rollups a jour"
### OPA-10 — Recalculer capacite Personne unifiee
C'est une evolution de l'OP-08 du MCT initial. Maintenant que Personne pivot existe :
```
Personne.heures_attribuees_formation = SUM(ATTRIBUTION.heures_attribuees) WHERE personne ET statut != annule
Personne.heures_attribuees_agence = SUM(INTERVENTION.heures) WHERE personne ET statut != annule
Personne.heures_restantes_total = capacite_annuelle - heures_attribuees_formation - heures_attribuees_agence
```
Si `heures_restantes_total < 0` declenche notification depassement (OP-09 etendu pour capacite totale).
## 8. Questions ouvertes (a valider en MOT)
- [ ] OP-04 (saisie heures) : declenchee quand par le formateur ? En fin de session ? En fin de mois ?
- [ ] OP-06/OP-07 : cloture automatique a la date fin OU manuelle apres validation admin ?
- [ ] OP-09 (notification depassement) : warning soft ou blocage dur ? Email + Slack/Teams ?
- [ ] OP-11/OP-12 (rapports) : format PDF, CSV, Excel ? Push vers comptabilite ?
- [ ] OP-08 (rollups) : tolerance de delai acceptable ? Eventual consistency OK ou TR strict ?