# Sprint 01 - Stabilisation multi-ecole

Date : 2026-05-09

## Resume

Ce sprint a stabilise la base multi-ecole apres l'ajout de Madrassa Sahaba. Les controles ont porte sur les trois ecoles pilotes, leurs themes publics, les formulaires d'inscription, les assets, les routes publiques, les donnees academiques et finance, ainsi que l'isolation par ecole dans l'espace admin.

Ecoles verifiees :

- Madrassatoul Qamar : slug `qamar`, sous-domaine `alqamar`, theme `qamar`, active.
- Madrassa Daroul-Ilm : slug `daroul-ilm`, sous-domaine `darulilm`, theme `daroul_ilm`, active.
- Madrassa Sahaba : slug `sahaba`, sous-domaine `sahaba`, theme `sahaba`, active.

## Verifications effectuees

- Routes publiques verifiees en local :
  - `/madrassas/qamar` : OK.
  - `/madrassas/daroulilm` : OK.
  - `/madrassas/darulilm` : OK.
  - `/madrassas/sahaba` : OK.
- Formulaires publics verifiees :
  - `/madrassas/qamar/inscription` charge le theme Qamar et les parcours Qamar.
  - `/madrassas/daroulilm/inscription` charge le theme Daroul-Ilm et les parcours Daroul-Ilm.
  - `/madrassas/sahaba/inscription` charge le theme Sahaba et uniquement `Programme Qur'an et Mutun`, `N1`, `N2`, `N3`.
  - `templates/public/registration/form.html.twig` et `templates/public/registration/confirmation.html.twig` etendent le layout via `activeTheme`, donc Sahaba utilise le meme `base.html.twig` que sa page publique.
- Theme Sahaba verifie :
  - `src/Service/Theme/ThemeResolver.php` connait `sahaba`.
  - `templates/public/themes/sahaba/base.html.twig` existe.
  - `templates/public/themes/sahaba/home.html.twig` existe.
  - `public/assets/public/themes/sahaba/theme.css` existe.
- Assets de themes verifies :
  - `public/assets/public/themes/qamar/theme.css`
  - `public/assets/public/themes/daroul_ilm/theme.css`
  - `public/assets/public/themes/sahaba/theme.css`
- SEO verifie via `templates/public/_seo.html.twig` avec fallback title, description, canonical et image Open Graph.
- Isolation rapide verifiee dans les controleurs et repositories lies aux sections, niveaux, classes, inscriptions, etudiants, paiements, depenses, regles de frais et dashboard ecole.

## Corrections apportees

- Resolution publique des ecoles :
  - `src/Repository/EcoleRepository.php` accepte maintenant les variantes normalisees d'identifiants publics. Cela permet a `daroulilm`, `darulilm` et `daroul-ilm` de resoudre la meme ecole active sans erreur publique.
- Fixtures ecoles :
  - `src/DataFixtures/AppFixtures.php` complete les medias par defaut si les champs sont vides, sans ecraser les uploads existants.
  - Ajout de logos/favicons par defaut pour Qamar et Daroul-Ilm.
  - Ajout des assets Sahaba par defaut : logo, favicon, hero et deux images de presentation.
- SEO :
  - `templates/public/_seo.html.twig` utilise des fallbacks plus robustes quand une page ne fournit pas explicitement `seo_title`, `seo_description`, `seo_canonical` ou `seo_image`.
- Environnement :
  - `.env.example` cree avec les variables minimales non sensibles du projet.
- Nettoyage :
  - Suppression de `src/Controller/School/EtudiantController.php.tmp`.
  - Suppression de `templates/school/dashboard_index.tmp`.

## Fichiers modifies ou crees

- `.env.example`
- `src/DataFixtures/AppFixtures.php`
- `src/Repository/EcoleRepository.php`
- `templates/public/_seo.html.twig`
- `public/assets/demo-schools/logo_sahaba.png`
- `public/assets/demo-schools/favicon_sahaba.png`
- `public/assets/demo-schools/hero_sahaba.webp`
- `public/assets/demo-schools/sahaba_presentation_1.webp`
- `public/assets/demo-schools/sahaba_presentation_2.webp`
- `docs/sprints/sprint-01-stabilisation-multi-ecole.md`

Fichiers supprimes :

- `src/Controller/School/EtudiantController.php.tmp`
- `templates/school/dashboard_index.tmp`

## Points observes

- La base locale contient bien les trois ecoles actives avec leurs themes.
- La base locale contient actuellement les medias uploades pour Qamar et Sahaba.
- La base locale ne contient pas encore de logo, favicon, hero ou images de presentation pour Daroul-Ilm. Les fixtures ajoutent maintenant des valeurs par defaut quand ces champs sont vides. Relancer les fixtures avec `--append` ou uploader les medias via l'admin permettra de les renseigner.
- Les formulaires publics filtrent les sections, niveaux et classes par ecole.
- L'espace admin ecole utilise globalement `currentEcole()` et des controles `assertSameSchool()` ou des requetes filtrees par ecole sur les donnees sensibles.

## Commandes executees

- `composer validate` : echoue en mode strict car `composer.json` n'a pas `name` et `description`. Le fichier reste valide pour usage simple.
- `php8.4 -l src/Repository/EcoleRepository.php` : OK.
- `php8.4 -l src/DataFixtures/AppFixtures.php` : 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.

Commandes HTTP executees via serveur local PHP :

- `GET /madrassas/qamar` : 200.
- `GET /madrassas/daroulilm` : 200.
- `GET /madrassas/darulilm` : 200.
- `GET /madrassas/sahaba` : 200.
- `GET /madrassas/qamar/inscription` : 200.
- `GET /madrassas/daroulilm/inscription` : 200.
- `GET /madrassas/sahaba/inscription` : 200.

## Commandes a lancer apres modification

```bash
php8.4 bin/console doctrine:fixtures:load --append
php8.4 bin/console cache:clear
```

Si l'environnement utilise `php` directement avec PHP 8.4, les memes commandes peuvent etre lancees avec `php`.

## Points a verifier manuellement

- Ouvrir `/platform/ecoles/5/edit` et verifier les medias Sahaba uploades ou renseignes.
- Ouvrir la page d'inscription Sahaba dans le navigateur et verifier visuellement le rendu complet apres cache clear.
- Soumettre une inscription test par ecole pour verifier le flux complet avec CSRF et persistence.
- Completer ou uploader les medias Daroul-Ilm si l'on veut afficher un logo/image plutot que les fallbacks texte.

## Recommandations sprint suivant

- Ajouter un petit test fonctionnel par ecole pour garantir que chaque page publique charge le bon theme.
- Ajouter un test de formulaire public qui verifie que les choix de section, niveau et classe appartiennent toujours a l'ecole courante.
- Ajouter `name` et `description` dans `composer.json` si l'on veut que `composer validate` passe strictement.
- Centraliser progressivement les helpers `currentEcole()` et `assertSameSchool()` repetes dans les controleurs school.
