# Sprint 03 - Workflow inscription complet

Date : 2026-05-09

## Resume

Ce sprint a renforce le workflow d'inscription public et admin, depuis la soumission publique jusqu'au traitement dans `/school/inscriptions`. Les corrections se concentrent sur les statuts, la protection contre la double validation, la verification des parcours par ecole, le rattachement prudent a un ancien etudiant, la generation PDF, les notifications WhatsApp et l'affichage admin du suivi de dossier.

## Workflow actuel observe

- Le formulaire public est gere par `src/Controller/Public/HomeController.php`.
- Les pages publiques filtrent deja les sections, niveaux et classes par ecole via les formulaires Symfony.
- Les inscriptions sont creees avec une ecole, une annee scolaire, un numero de dossier et un statut initial.
- L'espace admin utilise `SchoolContext` et les listes d'inscriptions restent filtrees par ecole.
- La validation admin cree ou rattache un etudiant, genere un matricule si necessaire, cree les parcours etudiant, genere les echeances, tente la fiche PDF et declenche WhatsApp.

## Corrections apportees

- Ajout de methodes metier sur `Inscription` :
  - `isSoumise()`
  - `isATester()`
  - `isAAffecter()`
  - `isValidee()`
  - `isRejetee()`
  - `isAnnulee()`
  - `canBeMarkedForTest()`
  - `canBeAssigned()`
  - `canBeValidated()`
  - `canBeRejected()`
  - `canBeDeleted()`
- Normalisation legere des telephones dans `Inscription` et `Etudiant`.
- Blocage des actions incoherentes :
  - pas de double validation ;
  - pas de rejet d'une inscription deja validee ;
  - pas d'affectation/modification sensible d'un dossier verrouille ;
  - pas de suppression d'un dossier valide.
- Verification serveur des sections, niveaux et classes avant affectation ou validation admin.
- Verification serveur des sections, niveaux et classes a la soumission publique.
- Recherche prudente d'un etudiant existant par contact dans la meme ecole, uniquement si le match est unique et coherent avec le nom.
- La fiche PDF et WhatsApp ne cassent plus tout le flux si une erreur inattendue apparait apres la validation.
- Ajout d'une action admin `Renvoyer WhatsApp`.
- La page detail inscription affiche maintenant un bloc de suivi avec numero de dossier, dates, ecole, parcours souhaite, etudiant lie, PDF et etat WhatsApp.
- Les boutons admin sont affiches selon le statut reel du dossier.

## Fichiers modifies ou crees

- `src/Entity/Inscription.php`
- `src/Entity/Etudiant.php`
- `src/Repository/EtudiantRepository.php`
- `src/Controller/Public/HomeController.php`
- `src/Controller/School/InscriptionController.php`
- `templates/school/inscription/show.html.twig`
- `templates/school/inscription/index.html.twig`
- `docs/tests/manual-inscription-workflow.md`
- `docs/sprints/sprint-03-workflow-inscription.md`

## Routes verifiees

Routes publiques :

- `GET /madrassas/qamar` : 200.
- `GET /madrassas/daroulilm` : 200.
- `GET /madrassas/sahaba` : 200.
- `GET /madrassas/qamar/inscription` : 200.
- `GET /madrassas/daroulilm/inscription` : 200.
- `GET /madrassas/sahaba/inscription` : 200.
- `GET /madrassas/qamar/anciens-etudiants?q=test` : 200.
- `GET /madrassas/daroulilm/anciens-etudiants?q=test` : 200.
- `GET /madrassas/sahaba/anciens-etudiants?q=test` : 200.

Routes admin :

- Non authentifie, `GET /school/inscriptions` : 302 vers login.
- Connecte avec `adminsahaba@salsabilmadrassas.local` :
  - `GET /school/inscriptions` : 200.
  - `GET /school/etudiants` : 200.
  - `GET /school/classes` : 200.
  - `GET /school/paiements` : 200.
- Connecte avec `adminqamar@salsabilmadrassas.local` :
  - `GET /school/inscriptions/4` : 200.
  - `GET /school/inscriptions/4/valider` sur dossier deja valide : 302 avec redirection vers la fiche.
  - `GET /school/inscriptions/4/rejeter` sur dossier deja valide : 302 avec redirection vers la fiche.
  - `GET /school/inscriptions/8/affecter` : 200.
- Connecte avec `adminsahaba@salsabilmadrassas.local`, acces au dossier Qamar `GET /school/inscriptions/4` : 403.

## Scenarios testes

- Chargement public des formulaires d'inscription pour Qamar, Daroul-Ilm et Sahaba.
- Recherche ancien etudiant publique pour les trois ecoles.
- Chargement admin de la liste inscriptions Sahaba.
- Chargement admin d'une fiche Qamar.
- Blocage GET des actions validation/rejet pour un dossier Qamar deja valide.
- Verification de l'isolation croisee : un admin Sahaba ne peut pas consulter une inscription Qamar.

Les POST de validation/rejet n'ont pas ete executes sur les donnees existantes afin d'eviter de modifier un vrai dossier de demonstration. Les scenarios POST complets sont documentes dans `docs/tests/manual-inscription-workflow.md`.

## Cas Qamar

- Le statut initial reste compatible avec la logique existante : les nouveaux dossiers Qamar peuvent passer par l'evaluation.
- Une inscription deja validee ne peut plus etre validee ou rejetee une deuxieme fois.
- Les controles d'appartenance bloquent un acces croise depuis une autre ecole.

## Cas Daroul-Ilm

- Les routes publiques et le formulaire d'inscription restent disponibles.
- La recherche ancien etudiant reste filtree par l'ecole.
- Le workflow admin garde les memes statuts et actions, avec les nouveaux garde-fous.

## Cas Sahaba

- Le formulaire public Sahaba charge le theme Sahaba et ses parcours.
- Les anciens etudiants Sahaba sont recherches uniquement dans l'ecole Sahaba.
- Les frais Sahaba attendus restent geres par les regles de frais existantes :
  - acompte inscription : 10 000 FCFA ;
  - solde annuel : 15 000 FCFA.
- La periode du solde reste documentee dans la description de la regle, sans migration.

## Points sensibles restants

- La validation POST complete doit etre testee avec une inscription test dediee pour ne pas transformer les donnees de demonstration existantes.
- Le matching par telephone est volontairement prudent : il ne rattache pas si plusieurs etudiants actifs peuvent correspondre.
- Les frais globaux d'une ecole sont generes par parcours actif. Si une inscription multi-parcours doit payer certains frais une seule fois par etudiant, il faudra une regle metier finance dediee dans un sprint ulterieur.
- La fiche PDF peut encore dependre des assets disponibles pour chaque ecole.
- WhatsApp depend de la configuration Green API locale.

## Commandes executees

- `composer validate` : OK.
- `php8.4 -l src/Entity/Inscription.php` : OK.
- `php8.4 -l src/Entity/Etudiant.php` : OK.
- `php8.4 -l src/Repository/EtudiantRepository.php` : OK.
- `php8.4 -l src/Controller/Public/HomeController.php` : OK.
- `php8.4 -l src/Controller/School/InscriptionController.php` : OK.
- `php8.4 bin/console cache:clear` : OK.
- `php8.4 bin/console lint:twig templates` : OK.
- `php8.4 bin/console lint:yaml config` : OK.
- `php8.4 bin/console lint:container` : OK.
- `php8.4 bin/console debug:router` : OK.
- `php8.4 bin/console doctrine:schema:validate` : OK.

Commande non disponible :

- `php8.4 bin/console doctrine:query:sql` : non definie dans ce projet. `doctrine:query:dql` a ete utilise pour inspecter rapidement les inscriptions existantes.

## Recommandations Sprint 4

- Ajouter une base PHPUnit/WebTestCase pour automatiser le workflow inscription.
- Ajouter un test fonctionnel par ecole : formulaire public, soumission, validation admin, echeances.
- Ajouter un test d'acces croise par ID pour les principales ressources `/school`.
- Etudier une regle finance permettant de marquer certains frais comme "une seule fois par etudiant" si les inscriptions multi-parcours deviennent courantes.
- Ajouter un journal d'evenements inscription si le suivi doit devenir audit-proof.
