-- ============================================================================
-- PLATEFORME MUTUALISÉE CLJ / CZJ / COZ
-- Schéma de base de données MySQL — v1.0
-- Convention : InnoDB, utf8mb4, clés étrangères explicites, timestamps standard
-- ============================================================================


-- ============================================================================
-- 0. NOYAU : IDENTITÉ, RÔLES, ÉGLISES
-- ============================================================================

-- Utilisateur unique pour toute la plateforme (jeune, bureau CLJ, bureau CZJ, COZ, admin)
CREATE TABLE users (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    nom             VARCHAR(100) NOT NULL,
    prenom          VARCHAR(100) NOT NULL,
    sexe            ENUM('M','F') NOT NULL,
    date_naissance  DATE NULL,
    telephone       VARCHAR(30) NULL,
    profession      VARCHAR(150) NULL,
    secteur_activite VARCHAR(150) NULL,
    eglise_id       INT UNSIGNED NULL,
    email           VARCHAR(150) NULL UNIQUE,
    mot_de_passe    VARCHAR(255) NOT NULL,
    photo_url       VARCHAR(255) NULL,
    situation_matrimoniale ENUM('celibataire','marie','autre') NULL,
    situation_professionnelle ENUM('etudiant','actif','sans_emploi','autre') NULL,
    niveau_etude    VARCHAR(100) NULL,
    filiere_metier  VARCHAR(150) NULL,
    statut          ENUM('actif','inactif','suspendu') NOT NULL DEFAULT 'actif',
    created_at      TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at      TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (eglise_id) REFERENCES eglises(id)
) ENGINE=InnoDB;

-- Catalogue des rôles disponibles sur la plateforme
CREATE TABLE roles (
    id          TINYINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    code        VARCHAR(50) NOT NULL UNIQUE,  -- ex: JEUNE, BUREAU_CLJ_PRESIDENT, BUREAU_CZJ, COZ_PERMANENT, COZ_RENFORT, SUPERADMIN
    libelle     VARCHAR(100) NOT NULL,
    niveau      ENUM('CLJ','CZJ','COZ','PLATEFORME') NOT NULL
) ENGINE=InnoDB;

-- Attribution des rôles : un user peut avoir plusieurs rôles, sur des périmètres différents et des périodes différentes
-- scope_type + scope_id permettent de rattacher le rôle à un CLJ précis, au CZJ, ou à la COZ
CREATE TABLE user_roles (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    user_id         INT UNSIGNED NOT NULL,
    role_id         TINYINT UNSIGNED NOT NULL,
    scope_type      ENUM('CLJ','CZJ','COZ','PLATEFORME') NOT NULL,
    scope_id        INT UNSIGNED NULL,  -- id du CLJ si scope_type=CLJ, sinon NULL
    date_debut      DATE NOT NULL,
    date_fin        DATE NULL,          -- NULL = mandat en cours ; rempli automatiquement pour un renfort COZ à la clôture du mandat
    statut          ENUM('actif','termine') NOT NULL DEFAULT 'actif',
    created_at      TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
    FOREIGN KEY (role_id) REFERENCES roles(id),
    INDEX idx_user_roles_scope (scope_type, scope_id)
) ENGINE=InnoDB;

-- Églises locales, classées A/B/C/D (détermine le barème de cotisation)
CREATE TABLE eglises (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    nom             VARCHAR(150) NOT NULL,
    localisation    VARCHAR(200) NULL,
    categorie       ENUM('A','B','C','D') NOT NULL,
    created_at      TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

-- ============================================================================
-- 1. NIVEAU CLJ
-- ============================================================================

CREATE TABLE clj (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    eglise_id       INT UNSIGNED NOT NULL,
    nom             VARCHAR(150) NOT NULL,
    date_creation   DATE NOT NULL,
    statut          ENUM('actif','inactif') NOT NULL DEFAULT 'actif',
    created_at      TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (eglise_id) REFERENCES eglises(id)
) ENGINE=InnoDB;

-- Bureau du CLJ : 5 postes nommés, avec historique des mandats
CREATE TABLE clj_bureau (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    clj_id          INT UNSIGNED NOT NULL,
    user_id         INT UNSIGNED NOT NULL,
    poste           ENUM('president','vice_president','secretaire','tresorier','charge_projets_social','aumonier') NOT NULL,
    date_debut      DATE NOT NULL,
    date_fin        DATE NULL,
    FOREIGN KEY (clj_id) REFERENCES clj(id) ON DELETE CASCADE,
    FOREIGN KEY (user_id) REFERENCES users(id)
) ENGINE=InnoDB;

-- Adhésion d'un jeune à un CLJ (le "recensement" vivant, avec historique des statuts)
CREATE TABLE clj_membres (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    clj_id          INT UNSIGNED NOT NULL,
    departement_id  INT UNSIGNED NULL,
    user_id         INT UNSIGNED NOT NULL,
    date_adhesion   DATE NOT NULL,
    date_sortie     DATE NULL,
    statut          ENUM('actif','inactif','en_pause') NOT NULL DEFAULT 'actif',
    FOREIGN KEY (clj_id) REFERENCES clj(id) ON DELETE CASCADE,
    FOREIGN KEY (user_id) REFERENCES users(id),
    FOREIGN KEY (departement_id) REFERENCES clj_departements(id),
    UNIQUE KEY uniq_membre_clj (clj_id, user_id)
) ENGINE=InnoDB;

-- Recensement annuel figé (photo à un instant T, pour historisation et comparaison d'une année à l'autre)
CREATE TABLE recensements (
    id                  INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    clj_id              INT UNSIGNED NOT NULL,
    annee               YEAR NOT NULL,
    date_recensement    DATE NOT NULL,
    effectif_total      SMALLINT UNSIGNED NOT NULL,
    fichier_export_url  VARCHAR(255) NULL,
    FOREIGN KEY (clj_id) REFERENCES clj(id) ON DELETE CASCADE,
    UNIQUE KEY uniq_recensement_annee (clj_id, annee)
) ENGINE=InnoDB;

-- Plan d'Action Opérationnel du CLJ
CREATE TABLE pao_clj (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    clj_id          INT UNSIGNED NOT NULL,
    annee           YEAR NOT NULL,
    periode         ENUM('annuel','trimestriel') NOT NULL DEFAULT 'annuel',
    statut          ENUM('brouillon','soumis','valide') NOT NULL DEFAULT 'brouillon',
    FOREIGN KEY (clj_id) REFERENCES clj(id) ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE pao_axe (
    id          INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    pao_id      INT UNSIGNED NOT NULL,
    nom_axe     VARCHAR(150) NOT NULL,  -- spirituel, social, formation, finances, patrimoine...
    FOREIGN KEY (pao_id) REFERENCES pao_clj(id) ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE pao_activite (
    id                  INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    axe_id              INT UNSIGNED NOT NULL,
    nom                 VARCHAR(200) NOT NULL,
    description         TEXT NULL,
    date_prevue         DATE NULL,
    lieu                VARCHAR(150) NULL,
    frequence           VARCHAR(100) NULL,     -- ex: hebdomadaire, mensuelle, ponctuelle
    responsable_id      INT UNSIGNED NULL,
    budget_alloue       DECIMAL(12,2) NULL,
    resultats_attendus  TEXT NULL,
    statut              ENUM('planifie','en_cours','realise','reporte','annule') NOT NULL DEFAULT 'planifie',
    taux_realisation    TINYINT UNSIGNED NOT NULL DEFAULT 0, -- 0-100
    FOREIGN KEY (axe_id) REFERENCES pao_axe(id) ON DELETE CASCADE,
    FOREIGN KEY (responsable_id) REFERENCES users(id)
) ENGINE=InnoDB;

-- Départements / commissions locales (Chorale, Huissiers/Sentinelle, Sport
-- et Culture, Jeunes filles et dames, etc.)
CREATE TABLE clj_departements (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    clj_id          INT UNSIGNED NOT NULL,
    nom             VARCHAR(150) NOT NULL,
    description     TEXT NULL,
    statut          ENUM('actif','inactif') NOT NULL DEFAULT 'actif',
    FOREIGN KEY (clj_id) REFERENCES clj(id) ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE clj_departement_membres (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    departement_id  INT UNSIGNED NOT NULL,
    user_id         INT UNSIGNED NOT NULL,
    role            VARCHAR(100) NULL,
    date_debut      DATE NOT NULL,
    date_fin        DATE NULL,
    FOREIGN KEY (departement_id) REFERENCES clj_departements(id) ON DELETE CASCADE,
    FOREIGN KEY (user_id) REFERENCES users(id)
) ENGINE=InnoDB;

-- Commission d'Organisation Locale (COL) — aide le comité à réaliser les
-- activités, équivalent local de la COZ.
CREATE TABLE clj_col_membres (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    clj_id          INT UNSIGNED NOT NULL,
    user_id         INT UNSIGNED NOT NULL,
    statut          ENUM('permanent','renfort') NOT NULL DEFAULT 'permanent',
    poste           VARCHAR(100) NULL,
    date_debut      DATE NOT NULL,
    date_fin        DATE NULL,
    FOREIGN KEY (clj_id) REFERENCES clj(id) ON DELETE CASCADE,
    FOREIGN KEY (user_id) REFERENCES users(id)
) ENGINE=InnoDB;

-- Activités réalisées, rapport/PV OBLIGATOIRE, rattachement optionnel à une
-- activité du PAO pour permettre la réconciliation planifié/réalisé :
--   - planifiée ET réalisée   : pao_activite avec une ligne liée ici
--   - planifiée NON réalisée  : pao_activite passée, sans ligne liée
--   - réalisée NON planifiée  : ligne ici avec pao_activite_id = NULL
CREATE TABLE activites_realisees (
    id                   INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    clj_id               INT UNSIGNED NOT NULL,
    pao_activite_id      INT UNSIGNED NULL,
    titre                VARCHAR(200) NOT NULL,
    date_realisation     DATE NOT NULL,
    lieu                 VARCHAR(150) NULL,
    secteur              VARCHAR(150) NULL,
    responsable_id       INT UNSIGNED NULL,
    resultats_obtenus    TEXT NULL,
    rapport_pv           TEXT NULL,
    rapport_fichier_url  VARCHAR(255) NULL,
    budget_reel          DECIMAL(12,2) NULL,
    FOREIGN KEY (clj_id) REFERENCES clj(id) ON DELETE CASCADE,
    FOREIGN KEY (pao_activite_id) REFERENCES pao_activite(id),
    FOREIGN KEY (responsable_id) REFERENCES users(id)
) ENGINE=InnoDB;

-- Vie de la jeunesse : fil d'actualité / annonces
CREATE TABLE publications (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    clj_id          INT UNSIGNED NULL,  -- NULL = publication zonale (CZJ)
    auteur_id       INT UNSIGNED NOT NULL,
    titre           VARCHAR(200) NOT NULL,
    contenu         TEXT NOT NULL,
    type            ENUM('annonce','actualite','photo','enseignement') NOT NULL,
    date_publication TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (clj_id) REFERENCES clj(id) ON DELETE CASCADE,
    FOREIGN KEY (auteur_id) REFERENCES users(id)
) ENGINE=InnoDB;

CREATE TABLE publication_medias (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    publication_id  INT UNSIGNED NOT NULL,
    fichier_url     VARCHAR(255) NOT NULL,
    FOREIGN KEY (publication_id) REFERENCES publications(id) ON DELETE CASCADE
) ENGINE=InnoDB;

-- Calendrier des activités (réunions, prières, formations, sorties, événements) — CLJ ou CZJ
CREATE TABLE activites (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    clj_id          INT UNSIGNED NULL,  -- NULL = activité zonale
    titre           VARCHAR(200) NOT NULL,
    type            ENUM('reunion','priere','formation','sortie','anniversaire','evenement_zonal') NOT NULL,
    date_debut      DATETIME NOT NULL,
    date_fin        DATETIME NULL,
    lieu            VARCHAR(200) NULL,
    reference_id    INT UNSIGNED NULL,  -- pointeur optionnel vers reunions.id, formations.id, mandats_coz.id, etc.
    FOREIGN KEY (clj_id) REFERENCES clj(id) ON DELETE CASCADE
) ENGINE=InnoDB;

-- Cas sociaux — confidentiels par défaut au CLJ, transmis au CZJ uniquement sur demande explicite
CREATE TABLE cas_sociaux (
    id                  INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    clj_id              INT UNSIGNED NOT NULL,
    beneficiaire_id     INT UNSIGNED NULL,  -- peut être NULL si non-membre (famille d'un membre, etc.)
    beneficiaire_nom    VARCHAR(150) NULL,  -- si beneficiaire_id est NULL
    type_cas            ENUM('maladie','deuil','difficulte_financiere','autre') NOT NULL,
    description         TEXT NOT NULL,
    date_ouverture      DATE NOT NULL,
    statut              ENUM('ouvert','clos') NOT NULL DEFAULT 'ouvert',
    FOREIGN KEY (clj_id) REFERENCES clj(id) ON DELETE CASCADE,
    FOREIGN KEY (beneficiaire_id) REFERENCES users(id)
) ENGINE=InnoDB;

CREATE TABLE cas_sociaux_suivi (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    cas_id          INT UNSIGNED NOT NULL,
    date_action     DATE NOT NULL,
    action          TEXT NOT NULL,
    montant_aide    DECIMAL(12,2) NULL,
    FOREIGN KEY (cas_id) REFERENCES cas_sociaux(id) ON DELETE CASCADE
) ENGINE=InnoDB;

-- Demande d'appui zonal — SEUL point de passerelle entre un cas social CLJ et le CZJ
CREATE TABLE demandes_appui_czj (
    id                  INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    cas_id              INT UNSIGNED NOT NULL,
    clj_id              INT UNSIGNED NOT NULL,
    date_demande        DATE NOT NULL,
    montant_demande     DECIMAL(12,2) NULL,
    statut              ENUM('en_attente','accorde','refuse') NOT NULL DEFAULT 'en_attente',
    montant_accorde     DECIMAL(12,2) NULL,
    date_traitement     DATE NULL,
    traite_par_user_id  INT UNSIGNED NULL,
    FOREIGN KEY (cas_id) REFERENCES cas_sociaux(id) ON DELETE CASCADE,
    FOREIGN KEY (clj_id) REFERENCES clj(id),
    FOREIGN KEY (traite_par_user_id) REFERENCES users(id)
) ENGINE=InnoDB;

-- Projets (CLJ ou CZJ)
CREATE TABLE projets (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    portee          ENUM('CLJ','CZJ') NOT NULL,
    clj_id          INT UNSIGNED NULL,  -- NULL si portee = CZJ
    nom             VARCHAR(200) NOT NULL,
    description     TEXT NULL,
    budget_prevu    DECIMAL(12,2) NULL,
    porteur_id      INT UNSIGNED NULL,
    date_debut      DATE NULL,
    date_fin        DATE NULL,
    statut          ENUM('planifie','en_cours','realise','abandonne') NOT NULL DEFAULT 'planifie',
    FOREIGN KEY (clj_id) REFERENCES clj(id) ON DELETE CASCADE,
    FOREIGN KEY (porteur_id) REFERENCES users(id)
) ENGINE=InnoDB;

CREATE TABLE projets_depenses (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    projet_id       INT UNSIGNED NOT NULL,
    description     VARCHAR(200) NOT NULL,
    montant         DECIMAL(12,2) NOT NULL,
    date_depense    DATE NOT NULL,
    justificatif_url VARCHAR(255) NULL,
    FOREIGN KEY (projet_id) REFERENCES projets(id) ON DELETE CASCADE
) ENGINE=InnoDB;

-- Finances internes du CLJ — STRICTEMENT PRIVÉ, jamais consultable par le CZJ
CREATE TABLE clj_finances_mouvements (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    clj_id          INT UNSIGNED NOT NULL,
    type            ENUM('recette','depense') NOT NULL,
    categorie       VARCHAR(100) NOT NULL,  -- cotisation_interne, offrande, don, activite, achat, appui_social...
    montant         DECIMAL(12,2) NOT NULL,
    date_mouvement  DATE NOT NULL,
    description     VARCHAR(255) NULL,
    justificatif_url VARCHAR(255) NULL,
    saisi_par_id    INT UNSIGNED NOT NULL,
    FOREIGN KEY (clj_id) REFERENCES clj(id) ON DELETE CASCADE,
    FOREIGN KEY (saisi_par_id) REFERENCES users(id)
) ENGINE=InnoDB;

-- Cotisations internes des membres du CLJ (usage interne uniquement)
CREATE TABLE clj_cotisations_internes (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    clj_id          INT UNSIGNED NOT NULL,
    membre_id       INT UNSIGNED NOT NULL,
    mois            TINYINT UNSIGNED NOT NULL,
    annee           YEAR NOT NULL,
    montant         DECIMAL(10,2) NOT NULL,
    statut          ENUM('paye','impaye','retard') NOT NULL DEFAULT 'impaye',
    date_paiement   DATE NULL,
    FOREIGN KEY (clj_id) REFERENCES clj(id) ON DELETE CASCADE,
    FOREIGN KEY (membre_id) REFERENCES users(id),
    UNIQUE KEY uniq_cotisation_interne (clj_id, membre_id, mois, annee)
) ENGINE=InnoDB;

-- Patrimoine du CLJ
-- Patrimoine (CLJ ou CZJ selon la portée)
CREATE TABLE patrimoine (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    portee          ENUM('CLJ','CZJ') NOT NULL DEFAULT 'CLJ',
    clj_id          INT UNSIGNED NULL,
    designation     VARCHAR(200) NOT NULL,
    etat            ENUM('bon','moyen','mauvais','hors_service') NOT NULL DEFAULT 'bon',
    date_acquisition DATE NULL,
    valeur          DECIMAL(12,2) NULL,
    localisation    VARCHAR(150) NULL,
    responsable_id  INT UNSIGNED NULL,
    FOREIGN KEY (clj_id) REFERENCES clj(id) ON DELETE CASCADE,
    FOREIGN KEY (responsable_id) REFERENCES users(id)
) ENGINE=InnoDB;

CREATE TABLE patrimoine_mouvements (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    patrimoine_id   INT UNSIGNED NOT NULL,
    type_mouvement  ENUM('pret','sortie','reparation','reforme','retour') NOT NULL,
    date_mouvement  DATE NOT NULL,
    description     VARCHAR(255) NULL,
    FOREIGN KEY (patrimoine_id) REFERENCES patrimoine(id) ON DELETE CASCADE
) ENGINE=InnoDB;

-- Réunions (bureau, générale, prière) — CLJ ou CZJ (portee)
CREATE TABLE reunions (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    portee          ENUM('CLJ','CZJ') NOT NULL,
    clj_id          INT UNSIGNED NULL,
    type_reunion    ENUM('bureau','generale','priere','conseil_zonal','assemblee_generale','rencontre_zonale','camp_biblique','lundi_paques','autre') NOT NULL,
    date_reunion    DATETIME NOT NULL,
    lieu            VARCHAR(150) NULL,
    ordre_du_jour   TEXT NULL,
    pv              TEXT NULL,
    statut          ENUM('planifiee','tenue','annulee') NOT NULL DEFAULT 'planifiee',
    FOREIGN KEY (clj_id) REFERENCES clj(id) ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE reunions_presence (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    reunion_id      INT UNSIGNED NOT NULL,
    user_id         INT UNSIGNED NOT NULL,
    statut          ENUM('present','absent','excuse') NOT NULL,
    FOREIGN KEY (reunion_id) REFERENCES reunions(id) ON DELETE CASCADE,
    FOREIGN KEY (user_id) REFERENCES users(id),
    UNIQUE KEY uniq_presence (reunion_id, user_id)
) ENGINE=InnoDB;

CREATE TABLE reunions_decisions (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    reunion_id      INT UNSIGNED NOT NULL,
    decision        VARCHAR(255) NOT NULL,
    responsable_id  INT UNSIGNED NULL,
    echeance        DATE NULL,
    statut          ENUM('a_faire','en_cours','fait') NOT NULL DEFAULT 'a_faire',
    FOREIGN KEY (reunion_id) REFERENCES reunions(id) ON DELETE CASCADE,
    FOREIGN KEY (responsable_id) REFERENCES users(id)
) ENGINE=InnoDB;

-- Formations (CLJ ou CZJ)
CREATE TABLE formations (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    portee          ENUM('CLJ','CZJ') NOT NULL,
    clj_id          INT UNSIGNED NULL,
    titre           VARCHAR(200) NOT NULL,
    description     TEXT NULL,
    formateur       VARCHAR(150) NULL,
    date_debut      DATE NOT NULL,
    date_fin        DATE NULL,
    lieu            VARCHAR(150) NULL,
    quota_par_clj   SMALLINT UNSIGNED NULL,  -- utilisé si portee = CZJ
    FOREIGN KEY (clj_id) REFERENCES clj(id) ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE formations_inscriptions (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    formation_id    INT UNSIGNED NOT NULL,
    user_id         INT UNSIGNED NOT NULL,
    clj_id          INT UNSIGNED NULL,  -- utile pour les formations CZJ (quel CLJ a inscrit ce jeune)
    presence        ENUM('inscrit','present','absent') NOT NULL DEFAULT 'inscrit',
    attestation_url VARCHAR(255) NULL,
    FOREIGN KEY (formation_id) REFERENCES formations(id) ON DELETE CASCADE,
    FOREIGN KEY (user_id) REFERENCES users(id),
    FOREIGN KEY (clj_id) REFERENCES clj(id),
    UNIQUE KEY uniq_inscription (formation_id, user_id)
) ENGINE=InnoDB;

-- Sondages internes (CLJ ou CZJ)
CREATE TABLE sondages (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    clj_id          INT UNSIGNED NULL,
    question        VARCHAR(255) NOT NULL,
    date_creation   TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    date_cloture    DATETIME NULL,
    FOREIGN KEY (clj_id) REFERENCES clj(id) ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE sondages_options (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    sondage_id      INT UNSIGNED NOT NULL,
    libelle         VARCHAR(150) NOT NULL,
    FOREIGN KEY (sondage_id) REFERENCES sondages(id) ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE sondages_votes (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    option_id       INT UNSIGNED NOT NULL,
    user_id         INT UNSIGNED NOT NULL,
    date_vote       TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (option_id) REFERENCES sondages_options(id) ON DELETE CASCADE,
    FOREIGN KEY (user_id) REFERENCES users(id),
    UNIQUE KEY uniq_vote (option_id, user_id)
) ENGINE=InnoDB;

-- Demandes soumises par un jeune depuis son espace personnel (aide, rdv, suggestion)
CREATE TABLE demandes_jeunes (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    clj_id          INT UNSIGNED NOT NULL,
    user_id         INT UNSIGNED NOT NULL,
    type_demande    ENUM('aide_sociale','rendez_vous','suggestion','autre') NOT NULL,
    contenu         TEXT NOT NULL,
    statut          ENUM('nouvelle','en_cours','traitee') NOT NULL DEFAULT 'nouvelle',
    date_soumission TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (clj_id) REFERENCES clj(id) ON DELETE CASCADE,
    FOREIGN KEY (user_id) REFERENCES users(id)
) ENGINE=InnoDB;

-- ============================================================================
-- 2. NIVEAU CZJ
-- ============================================================================

-- Bureau du CZJ (pas de "membres" génériques — uniquement un bureau)
CREATE TABLE czj_bureau (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    user_id         INT UNSIGNED NOT NULL,
    poste           VARCHAR(100) NOT NULL,  -- Président, Vice-président, Secrétaire, Trésorier, etc.
    date_debut      DATE NOT NULL,
    date_fin        DATE NULL,
    FOREIGN KEY (user_id) REFERENCES users(id)
) ENGINE=InnoDB;

-- PAO Zonal (consolidation + axes propres au CZJ)
CREATE TABLE pao_czj (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    annee           YEAR NOT NULL,
    statut          ENUM('brouillon','valide') NOT NULL DEFAULT 'brouillon'
) ENGINE=InnoDB;

CREATE TABLE pao_czj_axe (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    pao_czj_id      INT UNSIGNED NOT NULL,
    nom_axe         VARCHAR(150) NOT NULL,
    FOREIGN KEY (pao_czj_id) REFERENCES pao_czj(id) ON DELETE CASCADE
) ENGINE=InnoDB;

-- Le CZJ a son propre PAO (distinct de la simple consolidation des PAO CLJ)
CREATE TABLE pao_czj_activite (
    id                  INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    pao_czj_axe_id      INT UNSIGNED NOT NULL,
    nom                 VARCHAR(200) NOT NULL,
    description         TEXT NULL,
    date_prevue         DATE NULL,
    lieu                VARCHAR(150) NULL,
    frequence           VARCHAR(100) NULL,
    responsable_id      INT UNSIGNED NULL,
    budget_alloue       DECIMAL(12,2) NULL,
    resultats_attendus  TEXT NULL,
    statut              ENUM('planifie','en_cours','realise','reporte','annule') NOT NULL DEFAULT 'planifie',
    concerne_toute_jeunesse BOOLEAN NOT NULL DEFAULT FALSE,
    taux_realisation    TINYINT UNSIGNED NOT NULL DEFAULT 0,
    FOREIGN KEY (pao_czj_axe_id) REFERENCES pao_czj_axe(id) ON DELETE CASCADE,
    FOREIGN KEY (responsable_id) REFERENCES users(id)
) ENGINE=InnoDB;

-- Activités réalisées au niveau zonal, rapport/PV OBLIGATOIRE
CREATE TABLE czj_activites_realisees (
    id                   INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    pao_czj_activite_id  INT UNSIGNED NULL,
    titre                VARCHAR(200) NOT NULL,
    date_realisation     DATE NOT NULL,
    lieu                 VARCHAR(150) NULL,
    secteur              VARCHAR(150) NULL,
    responsable_id       INT UNSIGNED NULL,
    resultats_obtenus    TEXT NULL,
    rapport_pv           TEXT NULL,
    rapport_fichier_url  VARCHAR(255) NULL,
    budget_reel          DECIMAL(12,2) NULL,
    FOREIGN KEY (pao_czj_activite_id) REFERENCES pao_czj_activite(id),
    FOREIGN KEY (responsable_id) REFERENCES users(id)
) ENGINE=InnoDB;

-- Départements zonaux (Chorale zonale, Groupe de louange, Sport et Culture,
-- Coordination des mouvements de jeunes filles et dames...)
CREATE TABLE czj_departements (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    nom             VARCHAR(150) NOT NULL,
    description     TEXT NULL,
    statut          ENUM('actif','inactif') NOT NULL DEFAULT 'actif'
) ENGINE=InnoDB;

CREATE TABLE czj_departement_membres (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    departement_id  INT UNSIGNED NOT NULL,
    user_id         INT UNSIGNED NOT NULL,
    role            VARCHAR(100) NULL,
    date_debut      DATE NOT NULL,
    date_fin        DATE NULL,
    FOREIGN KEY (departement_id) REFERENCES czj_departements(id) ON DELETE CASCADE,
    FOREIGN KEY (user_id) REFERENCES users(id)
) ENGINE=InnoDB;

-- Rattachement optionnel d'une activité PAO-CLJ à un axe zonal, pour consolidation
ALTER TABLE pao_activite ADD COLUMN pao_czj_axe_id INT UNSIGNED NULL,
    ADD FOREIGN KEY (pao_czj_axe_id) REFERENCES pao_czj_axe(id);

-- Conseil Zonal des Responsables de Jeunesse (instance annuelle)
CREATE TABLE conseil_zonal (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    annee           YEAR NOT NULL UNIQUE,
    date_conseil    DATE NOT NULL,
    ordre_du_jour   TEXT NULL,
    pv              TEXT NULL,
    statut          ENUM('planifie','tenu') NOT NULL DEFAULT 'planifie'
) ENGINE=InnoDB;

CREATE TABLE conseil_zonal_presence (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    conseil_id      INT UNSIGNED NOT NULL,
    clj_id          INT UNSIGNED NOT NULL,
    user_id         INT UNSIGNED NOT NULL,  -- délégué présent
    statut          ENUM('present','absent','excuse') NOT NULL,
    FOREIGN KEY (conseil_id) REFERENCES conseil_zonal(id) ON DELETE CASCADE,
    FOREIGN KEY (clj_id) REFERENCES clj(id),
    FOREIGN KEY (user_id) REFERENCES users(id)
) ENGINE=InnoDB;

-- Barème annuel de cotisation par catégorie d'église (fixé au Conseil Zonal, historisé)
CREATE TABLE baremes_cotisation (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    conseil_id      INT UNSIGNED NOT NULL,
    annee           YEAR NOT NULL,
    categorie       ENUM('A','B','C','D') NOT NULL,
    montant_mensuel DECIMAL(10,2) NOT NULL,
    date_effet      DATE NOT NULL,
    FOREIGN KEY (conseil_id) REFERENCES conseil_zonal(id),
    UNIQUE KEY uniq_bareme (annee, categorie)
) ENGINE=InnoDB;

-- Déclaration + validation de la cotisation mensuelle CLJ -> CZJ (seul flux financier visible du CZJ)
CREATE TABLE cotisations_clj_czj (
    id                  INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    clj_id              INT UNSIGNED NOT NULL,
    bareme_id           INT UNSIGNED NOT NULL,
    mois                TINYINT UNSIGNED NOT NULL,
    annee               YEAR NOT NULL,
    montant_attendu     DECIMAL(10,2) NOT NULL,
    reference_paiement  VARCHAR(100) NULL,
    date_declaration    DATE NULL,
    justificatif_url    VARCHAR(255) NULL,
    statut              ENUM('en_attente','declare','valide','rejete','en_retard') NOT NULL DEFAULT 'en_attente',
    date_validation      DATE NULL,
    valide_par_id       INT UNSIGNED NULL,
    numero_quittance    VARCHAR(50) NULL,
    FOREIGN KEY (clj_id) REFERENCES clj(id),
    FOREIGN KEY (bareme_id) REFERENCES baremes_cotisation(id),
    FOREIGN KEY (valide_par_id) REFERENCES users(id),
    UNIQUE KEY uniq_cotisation_czj (clj_id, mois, annee)
) ENGINE=InnoDB;

-- Budget propre du CZJ (recettes = cotisations validées + subventions/dons ; dépenses de fonctionnement zonal)
CREATE TABLE czj_budget_mouvements (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    type_mouvement  ENUM('recette','depense') NOT NULL,
    categorie       VARCHAR(100) NOT NULL,  -- cotisation, subvention, don, fonctionnement...
    montant         DECIMAL(12,2) NOT NULL,
    date_mouvement  DATE NOT NULL,
    description     VARCHAR(255) NULL,
    reference_cotisation_id INT UNSIGNED NULL,  -- si origine = cotisation validée
    justificatif_url VARCHAR(255) NULL,
    FOREIGN KEY (reference_cotisation_id) REFERENCES cotisations_clj_czj(id)
) ENGINE=InnoDB;

-- Fonds de solidarité zonal (alimente/traite les demandes d'appui — voir demandes_appui_czj)
CREATE TABLE fonds_solidarite_mouvements (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    demande_appui_id INT UNSIGNED NULL,
    type_mouvement  ENUM('alimentation','decaissement') NOT NULL,
    montant         DECIMAL(12,2) NOT NULL,
    date_mouvement  DATE NOT NULL,
    description     VARCHAR(255) NULL,
    FOREIGN KEY (demande_appui_id) REFERENCES demandes_appui_czj(id)
) ENGINE=InnoDB;

-- ============================================================================
-- 3. NIVEAU COZ
-- ============================================================================

-- Composition COZ : noyau permanent + renforts ponctuels (statut distingué).
-- Les membres sont cooptés depuis les jeunesses locales (clj_origine_id) et
-- une coordination de 3 membres supervise l'ensemble (est_coordinateur).
CREATE TABLE coz_membres (
    id                  INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    user_id             INT UNSIGNED NOT NULL,
    clj_origine_id      INT UNSIGNED NULL,  -- CLJ depuis lequel le jeune a été coopté
    statut              ENUM('permanent','renfort') NOT NULL,
    poste               VARCHAR(100) NULL,
    est_coordinateur    BOOLEAN NOT NULL DEFAULT FALSE,  -- membre de la coordination (max 3, vérifié en appli)
    poste_coordination  ENUM('coordinateur','vice_coordinateur','secretaire','membre') NULL,
    mandat_id           INT UNSIGNED NULL, -- rempli si statut = renfort (voir mandats_coz plus bas, FK ajoutée après création de la table)
    date_debut          DATE NOT NULL,
    date_fin            DATE NULL,          -- auto-rempli à la clôture du mandat pour un renfort
    FOREIGN KEY (user_id) REFERENCES users(id),
    FOREIGN KEY (clj_origine_id) REFERENCES clj(id)
) ENGINE=InnoDB;

-- Sous-commissions PERMANENTES de la COZ (structure standing, différente des
-- commissions_execution qui sont propres à un mandat ponctuel — voir plus bas).
CREATE TABLE coz_sous_commissions (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    nom             VARCHAR(150) NOT NULL,
    description     TEXT NULL,
    responsable_coz_membre_id INT UNSIGNED NULL,
    statut          ENUM('actif','inactif') NOT NULL DEFAULT 'actif',
    FOREIGN KEY (responsable_coz_membre_id) REFERENCES coz_membres(id)
) ENGINE=InnoDB;

CREATE TABLE coz_sous_commission_membres (
    id                  INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    sous_commission_id  INT UNSIGNED NOT NULL,
    coz_membre_id       INT UNSIGNED NOT NULL,
    date_debut          DATE NOT NULL,
    date_fin            DATE NULL,
    FOREIGN KEY (sous_commission_id) REFERENCES coz_sous_commissions(id) ON DELETE CASCADE,
    FOREIGN KEY (coz_membre_id) REFERENCES coz_membres(id) ON DELETE CASCADE
) ENGINE=InnoDB;

-- Mandats confiés par le CZJ à la COZ
CREATE TABLE mandats_coz (
    id                  INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    titre               VARCHAR(200) NOT NULL,
    description         TEXT NULL,
    date_activite       DATE NOT NULL,
    objectifs           TEXT NULL,
    budget_alloue       DECIMAL(12,2) NULL,
    resultats_attendus  TEXT NULL,
    statut              ENUM('recu','en_preparation','en_cours','execute','cloture') NOT NULL DEFAULT 'recu',
    confie_par_id       INT UNSIGNED NULL,  -- membre du bureau CZJ
    FOREIGN KEY (confie_par_id) REFERENCES users(id)
) ENGINE=InnoDB;

ALTER TABLE coz_membres ADD FOREIGN KEY (mandat_id) REFERENCES mandats_coz(id);

CREATE TABLE commissions_execution (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    mandat_id       INT UNSIGNED NOT NULL,
    nom_commission  VARCHAR(150) NOT NULL,  -- logistique, accueil, communication, restauration, sécurité...
    FOREIGN KEY (mandat_id) REFERENCES mandats_coz(id) ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE commissions_membres (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    commission_id   INT UNSIGNED NOT NULL,
    user_id         INT UNSIGNED NOT NULL,
    role            VARCHAR(100) NULL,
    FOREIGN KEY (commission_id) REFERENCES commissions_execution(id) ON DELETE CASCADE,
    FOREIGN KEY (user_id) REFERENCES users(id)
) ENGINE=InnoDB;

CREATE TABLE taches (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    commission_id   INT UNSIGNED NOT NULL,
    description     VARCHAR(255) NOT NULL,
    statut          ENUM('a_faire','en_cours','fait') NOT NULL DEFAULT 'a_faire',
    echeance        DATE NULL,
    responsable_id  INT UNSIGNED NULL,
    FOREIGN KEY (commission_id) REFERENCES commissions_execution(id) ON DELETE CASCADE,
    FOREIGN KEY (responsable_id) REFERENCES users(id)
) ENGINE=InnoDB;

-- Budget d'exécution détaillé par mandat
CREATE TABLE budget_execution_lignes (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    mandat_id       INT UNSIGNED NOT NULL,
    categorie       VARCHAR(100) NOT NULL,  -- location, transport, restauration, communication, imprevus...
    montant_prevu   DECIMAL(12,2) NOT NULL,
    montant_reel    DECIMAL(12,2) NULL,
    justificatif_url VARCHAR(255) NULL,
    FOREIGN KEY (mandat_id) REFERENCES mandats_coz(id) ON DELETE CASCADE
) ENGINE=InnoDB;

-- Logistique (ressources matérielles et lieux)
CREATE TABLE logistique_ressources (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    mandat_id       INT UNSIGNED NOT NULL,
    ressource       VARCHAR(150) NOT NULL,  -- sonorisation, chaises, tentes, véhicule...
    fournisseur_contact VARCHAR(150) NULL,
    statut_reservation ENUM('a_reserver','reserve','confirme','annule') NOT NULL DEFAULT 'a_reserver',
    FOREIGN KEY (mandat_id) REFERENCES mandats_coz(id) ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE logistique_lieux (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    mandat_id       INT UNSIGNED NOT NULL,
    nom_lieu        VARCHAR(150) NOT NULL,
    adresse         VARCHAR(200) NULL,
    capacite        SMALLINT UNSIGNED NULL,
    fiche_technique TEXT NULL,
    FOREIGN KEY (mandat_id) REFERENCES mandats_coz(id) ON DELETE CASCADE
) ENGINE=InnoDB;

-- Bilan post-activité (transmis au CZJ pour clôture du mandat)
CREATE TABLE bilans_activite (
    id                  INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    mandat_id           INT UNSIGNED NOT NULL UNIQUE,
    participation_reelle INT UNSIGNED NULL,
    points_forts        TEXT NULL,
    difficultes         TEXT NULL,
    recommandations     TEXT NULL,
    date_bilan           DATE NOT NULL,
    FOREIGN KEY (mandat_id) REFERENCES mandats_coz(id) ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE bilan_medias (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    bilan_id        INT UNSIGNED NOT NULL,
    fichier_url     VARCHAR(255) NOT NULL,
    FOREIGN KEY (bilan_id) REFERENCES bilans_activite(id) ON DELETE CASCADE
) ENGINE=InnoDB;

-- ============================================================================
-- 4. MODULES TRANSVERSAUX
-- ============================================================================

-- Bibliothèque documentaire (PV types, formulaires, statuts, supports de formation...)
CREATE TABLE documents (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    portee          ENUM('CLJ','CZJ','COZ','PLATEFORME') NOT NULL,
    scope_id        INT UNSIGNED NULL,  -- id du CLJ si portee = CLJ, sinon NULL
    categorie       VARCHAR(100) NULL,
    titre           VARCHAR(200) NOT NULL,
    fichier_url     VARCHAR(255) NOT NULL,
    uploaded_by_id  INT UNSIGNED NOT NULL,
    date_upload     TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (uploaded_by_id) REFERENCES users(id)
) ENGINE=InnoDB;

-- Notifications (in-app + email)
CREATE TABLE notifications (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    user_id         INT UNSIGNED NOT NULL,
    titre           VARCHAR(200) NOT NULL,
    message         TEXT NOT NULL,
    type            VARCHAR(50) NOT NULL,  -- cotisation_echeance, convocation, validation_attente, mandat_coz...
    lien            VARCHAR(255) NULL,
    lu              BOOLEAN NOT NULL DEFAULT FALSE,
    envoye_email    BOOLEAN NOT NULL DEFAULT FALSE,
    date_creation   TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
) ENGINE=InnoDB;

-- Journal d'audit (actions sensibles : finances, validations, changements de rôle)
CREATE TABLE audit_log (
    id              BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    user_id         INT UNSIGNED NULL,
    action          VARCHAR(100) NOT NULL,     -- ex: VALIDATION_COTISATION, CREATION_CAS_SOCIAL, MODIFICATION_BAREME
    table_concernee VARCHAR(100) NOT NULL,
    enregistrement_id INT UNSIGNED NULL,
    donnees_avant   JSON NULL,
    donnees_apres   JSON NULL,
    date_action     TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id)
) ENGINE=InnoDB;

-- Messagerie interne (basique : CZJ <-> CLJ <-> COZ)
CREATE TABLE messages (
    id                  INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    expediteur_id       INT UNSIGNED NOT NULL,
    destinataire_type   ENUM('CLJ','CZJ','COZ') NOT NULL,
    destinataire_id     INT UNSIGNED NULL,
    sujet               VARCHAR(200) NOT NULL,
    contenu             TEXT NOT NULL,
    date_envoi          TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    lu                  BOOLEAN NOT NULL DEFAULT FALSE,
    FOREIGN KEY (expediteur_id) REFERENCES users(id)
) ENGINE=InnoDB;

-- Contributions aux projets (validation + traçabilité en finances)
CREATE TABLE projets_contributions (
    id                  INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    projet_id           INT UNSIGNED NOT NULL,
    user_id             INT UNSIGNED NOT NULL,
    montant             DECIMAL(12,2) NOT NULL,
    date_contribution   DATE NOT NULL,
    statut              ENUM('en_attente','validee','rejetee') NOT NULL DEFAULT 'en_attente',
    valide_par_id       INT UNSIGNED NULL,
    date_validation     DATE NULL,
    FOREIGN KEY (projet_id) REFERENCES projets(id) ON DELETE CASCADE,
    FOREIGN KEY (user_id) REFERENCES users(id),
    FOREIGN KEY (valide_par_id) REFERENCES users(id)
) ENGINE=InnoDB;

-- Paramètres génériques (clé/valeur)
CREATE TABLE parametres (
    id      INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    cle     VARCHAR(100) NOT NULL UNIQUE,
    valeur  VARCHAR(255) NULL
) ENGINE=InnoDB;

-- Cas sociaux gérés directement au niveau CZJ
CREATE TABLE czj_cas_sociaux (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    clj_origine_id  INT UNSIGNED NULL,
    beneficiaire_nom VARCHAR(150) NOT NULL,
    type_cas        ENUM('maladie','deuil','difficulte_financiere','autre') NOT NULL,
    description     TEXT NOT NULL,
    date_ouverture  DATE NOT NULL,
    statut          ENUM('ouvert','clos') NOT NULL DEFAULT 'ouvert',
    montant_accorde DECIMAL(12,2) NULL,
    date_cloture    DATE NULL,
    FOREIGN KEY (clj_origine_id) REFERENCES clj(id)
) ENGINE=InnoDB;

-- Versements cumulables de soutien financier pour un cas social (chacun
-- débité automatiquement de la caisse CZJ)
CREATE TABLE czj_cas_sociaux_appuis (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    cas_id          INT UNSIGNED NOT NULL,
    montant         DECIMAL(12,2) NOT NULL,
    date_versement  DATE NOT NULL,
    mode            VARCHAR(50) NULL,
    reference       VARCHAR(100) NULL,
    note            TEXT NULL,
    FOREIGN KEY (cas_id) REFERENCES czj_cas_sociaux(id) ON DELETE CASCADE
) ENGINE=InnoDB;

-- Permissions par profil (base du module Habilitations à matrice)
CREATE TABLE permissions_profil (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    niveau          ENUM('CZJ','CLJ','COZ') NOT NULL,
    profil          VARCHAR(100) NOT NULL,
    module_code     VARCHAR(100) NOT NULL,
    peut_voir       BOOLEAN NOT NULL DEFAULT FALSE,
    peut_modifier   BOOLEAN NOT NULL DEFAULT FALSE,
    peut_supprimer  BOOLEAN NOT NULL DEFAULT FALSE,
    UNIQUE KEY uniq_permission (niveau, profil, module_code)
) ENGINE=InnoDB;

