-- ============================================================================
-- V48 — Reporting trimestriel ControleurInterne automatisé (P2-NEW-3)
-- 2026-04-25
--
-- Génère un rapport agrégé par trimestre × organisation, signé par le
-- contrôleur interne et archivé immuablement (hash SHA-256). Source pour
-- les inspections BCEAO/ARTCI et les AG annuelles.
-- ============================================================================

CREATE TABLE IF NOT EXISTS rapports_trimestriels_controleur_interne (
    id                  UUID PRIMARY KEY,
    organisation_id     UUID NOT NULL REFERENCES organisations(id) ON DELETE CASCADE,
    annee               INTEGER NOT NULL CHECK (annee BETWEEN 2024 AND 2099),
    trimestre           INTEGER NOT NULL CHECK (trimestre BETWEEN 1 AND 4),
    date_generation     TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    statut              VARCHAR(20) NOT NULL DEFAULT 'DRAFT'
                        CHECK (statut IN ('DRAFT', 'SIGNE', 'ARCHIVE')),
    score_conformite    INTEGER NOT NULL DEFAULT 0
                        CHECK (score_conformite BETWEEN 0 AND 100),
    contenu_jsonb       JSONB,
    pdf_bytes           BYTEA,
    signataire_id       UUID,
    date_signature      TIMESTAMP,
    hash_sha256         VARCHAR(64),
    -- BaseEntity
    date_creation       TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    date_modification   TIMESTAMP,
    cree_par            VARCHAR(255),
    modifie_par         VARCHAR(255),
    version             BIGINT,
    actif               BOOLEAN NOT NULL DEFAULT TRUE,
    CONSTRAINT uq_rapport_trim_org_annee_trim
        UNIQUE (organisation_id, annee, trimestre)
);

CREATE INDEX IF NOT EXISTS idx_rapport_trim_org
    ON rapports_trimestriels_controleur_interne (organisation_id);

CREATE INDEX IF NOT EXISTS idx_rapport_trim_annee_trim
    ON rapports_trimestriels_controleur_interne (annee, trimestre);

CREATE INDEX IF NOT EXISTS idx_rapport_trim_statut
    ON rapports_trimestriels_controleur_interne (statut)
    WHERE statut <> 'ARCHIVE';

COMMENT ON TABLE rapports_trimestriels_controleur_interne IS
    'Rapport trimestriel agrégé du Contrôleur Interne — source AG + inspections BCEAO/ARTCI';
COMMENT ON COLUMN rapports_trimestriels_controleur_interne.contenu_jsonb IS
    'Snapshot JSON : compliance score, AML DOS count, formations LBC/FT count, KYC %, audit anomalies';
COMMENT ON COLUMN rapports_trimestriels_controleur_interne.hash_sha256 IS
    'Hash SHA-256 du contenu_jsonb au moment de la signature — immuable après SIGNE';
