# Plateforme Mutualisée CLJ / CZJ / COZ

Squelette fonctionnel initial : noyau applicatif (routeur, auth, RBAC, audit)
+ module `auth` + module `clj/membres` comme premier bloc testable.

## Installation en local (Laragon)

1. Placer le dossier dans `www/plateforme-jeunesse` (ou équivalent Laragon).
2. Créer la base de données :
   ```
   mysql -u root -p -e "CREATE DATABASE plateforme_jeunesse CHARACTER SET utf8mb4;"
   mysql -u root -p plateforme_jeunesse < database/schema.sql
   mysql -u root -p plateforme_jeunesse < database/seeds/001_roles.sql
   ```
3. Générer un hash de mot de passe puis compléter `database/seeds/002_demo.sql` :
   ```
   php -r "echo password_hash('Demo1234', PASSWORD_DEFAULT);"
   ```
   puis :
   ```
   mysql -u root -p plateforme_jeunesse < database/seeds/002_demo.sql
   ```
4. Copier `.env.example` en `.env` et ajuster les identifiants DB si besoin.
5. (Optionnel mais recommandé) Installer les dépendances :
   ```
   composer install
   ```
6. Définir `public/` comme dossier racine (document root) dans Laragon.
7. Ouvrir `http://plateforme-jeunesse.test/login` et se connecter avec
   `president@demo.local` / `Demo1234`.

Pour tester le module Finances (déclaration de cotisation au CZJ), exécuter
aussi `database/seeds/003_bareme_demo.sql` (crée un Conseil Zonal + barème
A/B/C/D de démonstration).

Pour tester le module CZJ (validation des cotisations), exécuter aussi
`database/seeds/004_bureau_czj_demo.sql` (compte `czj@demo.local`) — même
remarque : générer le hash du mot de passe avant d'exécuter le script.

Pour tester l'espace personnel du jeune et la composition de la COZ, exécuter
aussi `database/seeds/005_comptes_supplementaires_demo.sql` (comptes
`jeune@demo.local` et `coz@demo.local`).

**Si ta base existe déjà**, applique les migrations dans l'ordre (`--force` sur
les anciennes, sans sur les nouvelles pour repérer une vraie erreur) :
```
mysql -u root --force plateforme_jeunesse < database/migrations/002_departements_col_activites.sql
mysql -u root --force plateforme_jeunesse < database/migrations/003_czj_departements_coz_pao_activites.sql
mysql -u root --force plateforme_jeunesse < database/migrations/004_czj_menu_unifie.sql
mysql -u root --force plateforme_jeunesse < database/migrations/005_comites_historique_details.sql
mysql -u root plateforme_jeunesse < database/migrations/006_coz_sous_commission_responsable.sql
mysql -u root plateforme_jeunesse < database/migrations/007_rapport_activites_piece_jointe.sql
mysql -u root plateforme_jeunesse < database/migrations/008_projets_parametres_cas_sociaux_czj.sql
```

## Itération suivante — Projets, Cas sociaux, Finances, Paramètres, Habilitations

- **Structures & Départements** : la section CLJ/COZ retirée (déjà couverte
  par "Les CLJ" et le menu COZ) — ne reste que la gestion des départements
  et mouvements zonaux.
- **Projets (CLJ et CZJ)** : ajout des **contributions**, à l'image de
  ChoralDB — un membre propose une contribution à un projet, le bureau la
  valide, et la validation **enregistre automatiquement la recette** dans
  les finances (internes au CLJ, ou budget propre du CZJ) — aucune ressaisie.
- **Nouveau module Cas sociaux (CZJ)** (`czj/cas_sociaux`) : cas ouverts
  directement par le CZJ + demandes d'appui remontées par les CLJ, toutes
  traitées au même endroit. L'octroi d'un appui **enregistre automatiquement
  la dépense** dans le budget CZJ.
- **Finances (CZJ)** : le fonds de solidarité est retiré (table et module
  supprimés) — les appuis sociaux passent maintenant par le budget CZJ
  directement, tracés dans le nouveau module Cas sociaux.
- **Module Rencontres supprimé** — le Conseil Zonal reste accessible
  directement (`/czj/conseil-zonal`) pour la fixation du barème.
- **Paramètres reconstruit** à l'image d'Outils ChoralDB : plus de création
  de CLJ ici (déplacée dans "Les CLJ"), tarifs de cotisation par catégorie
  affichés (fixés officiellement via le Conseil Zonal), **durées de mandat**
  configurables (CLJ, COZ), **activation/désactivation** des CLJ, des
  membres d'un CLJ et de la coordination COZ, et **réinitialisation de mot
  de passe** pour n'importe quel compte (CZJ, CLJ, COZ) — affiche le nouveau
  mot de passe une seule fois, comme pour toute création de compte.
- **Habilitations** : passé en **3 onglets** (CZJ / CLJ / COZ) au lieu d'un
  filtre "Tous/CLJ/CZJ/COZ".

## Itération suivante — Alignement précis sur les captures ChoralDB

Après avoir vu tes captures d'écran de ChoralDB (Habilitations, Projets,
Finances, Cas sociaux), ces modules ont été reconstruits pour coller de
près à ces références :

- **Cas sociaux** : passe d'un simple champ "montant accordé" à un
  **soutien financier cumulable** (plusieurs versements successifs), chacun
  débité automatiquement de la caisse CZJ — fiche détaillée dédiée par cas,
  comme dans ChoralDB.
- **Finances** : cartes de synthèse (prévu/perçu/dû/autres entrées/solde) +
  onglets **Cotisations** / **Entrées & Sorties** (pénalités et fonds de
  solidarité toujours absents, comme demandé).
- **Projets** : grille de cartes avec barre de progression "collecté", et
  fiche projet dédiée pour gérer contributions et dépenses (au lieu de tout
  afficher en accordéon sur une seule page).
- **Habilitations** : vraie matrice de permissions par profil (Voir /
  Modifier / Supprimer, groupée par catégorie de modules), en 3 onglets
  CZJ/CLJ/COZ, avec "Tout cocher"/"Tout décocher". **Point important** :
  cette page enregistre la matrice voulue, mais la vérification technique
  de ces droits dans chaque contrôleur n'est pas encore câblée partout —
  l'accès reste pour l'instant régi par les rôles existants (Président,
  Trésorier...). C'est un chantier suivant si tu veux une application
  stricte et automatique de cette matrice.
- **Correctif** : le barème de cotisation ne pouvait pas être remodifié une
  fois fixé pour une année (plantage sur contrainte d'unicité) — corrigé,
  refixer un tarif met maintenant à jour la ligne existante.

## Itération précédente — Le Comité, Les CLJ, COZ enrichie, PAO/Activités

- **Le Comité (CZJ) et Composition du comité (CLJ)** : fiche complète par
  titulaire (nom, prénom, sexe, profession, église, contact, email,
  situation matrimoniale, date d'élection, date de fin de mandat), poste
  **Aumônier** ajouté, et surtout **l'historique complet de tous les
  titulaires successifs est conservé et affiché** (rien n'est écrasé —
  chaque nomination clôture l'ancien titulaire et crée une nouvelle ligne).
- **Comités locaux (CLJ)** : création d'un CLJ toujours via `czj/parametres`.
  Nommer un membre au bureau **crée automatiquement son compte** avec accès
  scopé à ce CLJ — c'est ce compte qui constitue "sa plateforme" (pas une
  installation séparée : un compte + des droits limités à son CLJ).
- **Structures et Départements (CLJ et CZJ)** : un département/mouvement n'a
  plus une liste ouverte de membres, mais **un seul responsable à la fois**,
  avec historique complet des responsables successifs (même fiche détaillée
  que pour le comité).
- **COZ** : la coordination passe d'un simple compteur "max 3" à **4 postes
  nommés** (Coordinateur, Vice-coordinateur, Secrétaire, Membre), chacun
  historisé comme un poste de bureau. *(Le texte du besoin mentionnait à la
  fois "3 membres" et listait 4 rôles — j'ai retenu les 4 rôles nommés,
  dis-moi si ce n'est pas ce que tu voulais.)*
- **Statistiques de la jeunesse** : toutes les répartitions demandées sont
  ajoutées (tranche d'âge, sexe, situation matrimoniale, situation
  professionnelle, corps de métier, secteur d'activité, niveau de diplôme),
  calculées en temps réel à partir des fiches membres — ce qui a nécessité
  d'ajouter `profession`, `secteur_activite` au formulaire de recensement
  des membres CLJ (`clj/membres`).
- **PAO Zonal** : navigation par année ajoutée pour consulter tous les plans
  passés, pas seulement l'année en cours.
- **Activités et Projets (CZJ)** : déjà conformes au besoin depuis
  l'itération précédente (rapport/PV obligatoire, réconciliation à 3
  volets, rattachement optionnel au PAO) — aucun changement nécessaire.

## Menu CZJ (réorganisé façon ChoralDB) — 13 entrées exactement

Le menu du bureau CZJ est maintenant : **Tableau de bord, Le Comité,
Structures & Départements, Statistiques de la jeunesse, Plan d'Action
Opérationnel, Activités, Projets, Finances, Rencontres, Patrimoine,
Paramètres, Messagerie, Habilitations.**

Certains modules déjà construits ont été **consolidés sous une seule entrée**
plutôt que supprimés — ils restent accessibles par lien interne :
- **Finances** regroupe le budget propre du CZJ, la validation des
  cotisations (`/czj/cotisations`) et le fonds de solidarité
  (`/czj/fonds-solidarite`), accessibles depuis des boutons sur la page.
- **Structures & Départements** regroupe la supervision des CLJ (ex-
  `/czj/supervision`), les départements zonaux et un lien vers la COZ.
- **Rencontres** (nouveau module `czj/rencontres`) unifie réunions,
  Assemblées générales, rencontres zonales, camps bibliques, lundi de
  Pâques, etc. — avec un lien direct vers la gestion spécialisée du
  **Conseil Zonal** (`/czj/conseil-zonal`, pour la fixation du barème).
- **Le Comité** = composition du CZJ (ex-`/czj/gouvernance`, renommé).

Nouveaux modules construits pour compléter ce menu :
- **`czj/parametres`** — création/gestion des CLJ et des églises (catégorie
  A/B/C/D, base du barème de cotisation).
- **`czj/messagerie`** — messagerie interne basique CZJ ↔ CLJ ↔ COZ
  (diffusion à tous ou message ciblé à un CLJ précis).
- **`czj/habilitations`** — vue d'ensemble de tous les rôles RBAC attribués
  sur la plateforme (CLJ/CZJ/COZ), avec révocation possible.

## Itération suivante — Le Comité, Les CLJ, COZ enrichie, PAO/Activités

- **Le Comité (CZJ)** : formulaire de saisie réorganisé avec **photo** (upload
  avec aperçu instantané), les membres actuels sont présentés **en cartes**
  (photo, nom, poste), le bouton "Nommer" devient **"Ajouter"**, la section
  d'ajout est **repliable**, et chaque membre (actuel ou historique) a
  maintenant des actions **Voir / Modifier / Supprimer**.
- **Nouveau module "Les CLJ"** (`czj/les_clj`) : centralise la création d'un
  CLJ et la gestion complète de son comité depuis le CZJ (même principe que
  "Le Comité", avec en plus l'activation/désactivation de l'accès à la
  plateforme de chaque membre). Créer un membre crée automatiquement son
  compte — c'est cet accès qui constitue "sa plateforme".
- **COZ enrichie** — nouveau sous-menu à 5 entrées : Tableau de bord COZ,
  **Coordination** (redessinée en cartes, à l'image des CLJ), **Sous-
  commissions** (un responsable désignable par sous-commission), **Activités**
  (réutilise les mandats existants), et **Rapport** (nouveau, lecture seule —
  synthèse de toutes les activités avec bilans, budget exécuté, participation).
- **PAO Zonal** : section de consolidation retirée comme demandé.
- **Activités (CLJ et CZJ)** : formulaire redessiné, le champ secteur/axe est
  désormais une **liste déroulante** alimentée par les axes du PAO de
  l'année en cours, et le rapport devient une **pièce jointe obligatoire**
  (PDF, Word ou image) plutôt qu'un texte — un champ de note complémentaire
  reste disponible en option.

⚠️ **Photos et rapports uploadés** sont stockés dans `public/uploads/membres/`
et `public/uploads/rapports/` — ces dossiers sont créés automatiquement au
premier upload. Comme pour tout `public/uploads/`, l'exécution de scripts y
est bloquée par le `.htaccess` déjà en place.

**Si ta base existe déjà**, applique aussi (nouvelle, sans `--force`) :
```
mysql -u root plateforme_jeunesse < database/migrations/010_clj_jeunesse_departement_activites_generales.sql
```

## Itération suivante — Côté CLJ : Responsables de jeunesse, Jeunesse, ouverture des projets

- **"Composition du comité" → "Responsables de jeunesse"** : même traitement
  complet que "Le Comité" côté CZJ (cartes avec photo, ajout repliable,
  CRUD voir/modifier/supprimer, historique).
- **"Membres" → "Jeunesse"** : ajout du champ **Département** (liste
  déroulante des départements du CLJ). La création d'un jeune génère
  toujours ses identifiants (affichés une seule fois).
- **Modules retirés** : Commission d'Organisation, Réunions, Formations —
  entièrement supprimés (menu, routes, contrôleurs). Les statistiques de
  présence liées aux réunions ont été retirées de l'espace personnel et du
  tableau de bord, devenues sans objet.
- **Finances (CLJ)** restylée comme le CZJ : cartes de synthèse + onglets
  Cotisations (ce sont les **jeunes** qui cotisent ici) / Entrées & Sorties
  / Cotisation vers le CZJ.
- **Projets ouverts à la participation** :
  - Les projets d'un CLJ sont visibles par **tous ses jeunes**, qui peuvent
    proposer une contribution pour eux-mêmes (le bureau valide toujours).
  - Les projets du CZJ sont visibles par **tout le monde** (CZJ, CLJ, COZ,
    jeunes) avec la même logique de participation.
- **Activités générales de la jeunesse** : une activité du PAO Zonal peut
  être marquée "concerne toute la jeunesse" — elle devient alors visible
  par tous (espace personnel des jeunes + tableau de bord CLJ) à partir de
  **2 jours avant sa date**.
- **Espace personnel réorganisé en modules** distincts : Mon profil
  (bandeau), Mes cotisations, Activités à venir (CLJ + générales CZJ),
  Projets de mon CLJ, Projets du CZJ, Vie de la jeunesse.

## État actuel — TOUS les modules du cahier des charges sont construits

### Noyau
Router, Controller, Model, Auth, Rbac, Notification, AuditLog.

### Niveau CLJ
- `clj/tableau_bord`, `clj/bureau` (composition 5 postes), `clj/membres`,
  `clj/departements`, `clj/col` (Commission d'Organisation Locale),
  `clj/finances`, `clj/cas_sociaux`, `clj/projets`, `clj/pao` (enrichi :
  lieu, fréquence, responsable, budget, résultats attendus),
  `clj/activites` (réalisées + rapport/PV **obligatoire** + réconciliation
  3 volets), `clj/patrimoine`, `clj/reunions`, `clj/formations`,
  `clj/vie_jeunesse`, `clj/espace_personnel`

### Niveau CZJ
- `czj/gouvernance` — **composition du CZJ** : les 5 mêmes postes qu'au
  niveau CLJ (Président, Vice-président, Secrétaire Administratif,
  Trésorier, Chargé aux Affaires sociales et à l'organisation), tout le
  bureau partageant le même rôle RBAC `bureau_czj`
- `czj/departements` — départements zonaux (Chorale zonale, Groupe de
  louange, Sport et Culture, Coordination des mouvements de jeunes filles
  et dames...)
- `czj/statistiques` — **consolidation des recensements** faits à la base
  par les CLJ : effectif zonal, répartition par catégorie d'église,
  évolution pluriannuelle
- `czj/cotisations`, `czj/supervision`, `czj/conseil-zonal`,
  `czj/fonds-solidarite`, `czj/reporting` (déjà en place)
- `czj/finances` — gestion des mouvements du budget propre du CZJ
  (subventions, dons, dépenses de fonctionnement — distinct des cotisations,
  déjà enregistrées automatiquement à la validation)
- `czj/projets` — projets propres au CZJ (portée CZJ, réutilise le modèle
  `Projet` déjà partagé avec les CLJ)
- `czj/pao_zonal` — le CZJ a **son propre PAO** avec ses propres activités
  enrichies (lieu, fréquence, responsable, budget, résultats attendus), en
  plus de la vue de consolidation des activités CLJ rattachées aux mêmes axes
- `czj/activites` — activités zonales réalisées, **rapport/PV obligatoire**,
  rapport de réconciliation à 3 volets, même logique qu'au niveau CLJ
- `czj/patrimoine` — patrimoine propre au CZJ (le modèle `Patrimoine`
  supporte maintenant les deux portées CLJ et CZJ)

### Niveau COZ
- `coz/mandats`, `coz/commissions` (par mandat), `coz/budget_execution`,
  `coz/logistique`, `coz/bilans` (déjà en place)
- `coz/membres` — composition **avec cooptation depuis un CLJ d'origine** et
  **coordination limitée à 3 membres** qui supervise l'ensemble
- `coz/sous_commissions` — structure **permanente** de la COZ (Logistique,
  Communication, Accueil, Sécurité...), à ne pas confondre avec les
  commissions d'exécution propres à chaque mandat ponctuel

### Noyau
Router, Controller, Model, Auth, Rbac, Notification, AuditLog.

## Cloisonnement CLJ ↔ CZJ (rappel du cahier des charges, implémenté dans le code)

- Les finances internes (`CljFinancesMouvement`, `CljCotisationInterne`) et
  les cas sociaux (`CasSocial`) ne sont **jamais interrogés** depuis un
  contrôleur CZJ. Le seul pont financier est `CotisationCljCzj` (déclaration
  → validation), et le seul pont social est `DemandeAppuiCzj` (demande
  explicite du CLJ).
- Chaque action de contrôleur commence par `Rbac::verifier(...)` ou une
  vérification équivalente sur le rôle et le périmètre (`scope_type` +
  `scope_id`), directement branchée sur la table `user_roles`.

## Ce qui reste volontairement simplifié (pistes d'amélioration)

- Pas d'upload de fichiers (justificatifs, photos, PV) — les champs
  `*_url` existent déjà en base, il manque le formulaire d'upload
  (`<input type="file">` + déplacement vers `public/uploads/`).
- Pas de génération PDF/Excel (quittances, attestations, rapports) — prévu
  via Dompdf/PhpSpreadsheet (voir `composer.json`), à brancher dans
  `app/helpers/exporters.php`.
- Pas de vue "modifier" pour les membres CLJ (seulement créer/désactiver).
- Les crons (`cron/*.php`) sont référencés dans la structure mais pas encore
  écrits — ce sont les prochains fichiers à créer pour les rappels
  automatiques (cotisation en retard, Conseil Zonal à venir, clôture des
  renforts COZ expirés).
- Pas de tests automatisés.

## Convention pour ajouter un nouveau module (rappel)

1. Créer `app/modules/{niveau}_{sousmodule}/Controller.php`
   (classe `{Niveau}{SousModule}Controller`, en PascalCase).
2. Créer `app/modules/{niveau}/{sousmodule}/views/*.php`.
3. Ajouter le(s) modèle(s) correspondant(s) dans `app/models/`.
4. Déclarer les routes dans `app/config/routes.php` avec la clé
   `{niveau}_{sousmodule}` (le routeur ne coupe qu'au premier `_`).
5. Protéger chaque action avec `Rbac::verifier([...roles], 'CLJ'|'CZJ'|'COZ', $scopeId)`.
6. Journaliser les actions sensibles avec `AuditLog::enregistrer(...)`.
