-- ============================================================================
-- V32 — Mutuelle : Parts Sociales + Paramètres Financiers + Intérêts
--
-- Ajoute les tables nécessaires pour les fonctionnalités manquantes identifiées
-- dans l'analyse du fichier FUSION 2013-2021.xlsx de la Mutuelle GBANE :
--   1. comptes_parts_sociales     — capital social des membres
--   2. transactions_parts_sociales — historique des mouvements de parts
--   3. parametres_financiers_mutuelle — taux, périodicités, valeur nominale
-- ============================================================================

-- ── 1. Paramètres financiers de la mutuelle ────────────────────────────────
CREATE TABLE IF NOT EXISTS parametres_financiers_mutuelle (
    id                              UUID            NOT NULL DEFAULT gen_random_uuid() PRIMARY KEY,
    organisation_id                 UUID            NOT NULL UNIQUE,
    valeur_nominale_par_defaut      NUMERIC(19,4)   NOT NULL DEFAULT 5000,
    taux_interet_annuel_epargne     NUMERIC(6,4)    NOT NULL DEFAULT 0.0300,
    taux_dividende_parts_annuel     NUMERIC(6,4)    NOT NULL DEFAULT 0.0500,
    periodicite_calcul              VARCHAR(20)     NOT NULL DEFAULT 'MENSUEL',
    seuil_min_epargne_interets      NUMERIC(19,4)            DEFAULT 0,
    prochaine_calcul_interets       DATE,
    dernier_calcul_interets         DATE,
    dernier_nb_comptes_traites      INTEGER                  DEFAULT 0,
    -- BaseEntity cols
    date_creation                   TIMESTAMP       NOT NULL DEFAULT NOW(),
    date_modification               TIMESTAMP,
    cree_par                        VARCHAR(255),
    modifie_par                     VARCHAR(255),
    version                         BIGINT                   DEFAULT 0,
    actif                           BOOLEAN         NOT NULL DEFAULT TRUE,
    CONSTRAINT fk_pfm_organisation FOREIGN KEY (organisation_id) REFERENCES organisations(id)
);

CREATE INDEX IF NOT EXISTS idx_pfm_org ON parametres_financiers_mutuelle(organisation_id);

-- ── 2. Comptes de parts sociales ───────────────────────────────────────────
CREATE TABLE IF NOT EXISTS comptes_parts_sociales (
    id                          UUID            NOT NULL DEFAULT gen_random_uuid() PRIMARY KEY,
    membre_id                   UUID            NOT NULL,
    organisation_id             UUID            NOT NULL,
    numero_compte               VARCHAR(50)     NOT NULL UNIQUE,
    nombre_parts                INTEGER         NOT NULL DEFAULT 0,
    valeur_nominale             NUMERIC(19,4)   NOT NULL,
    montant_total               NUMERIC(19,4)   NOT NULL DEFAULT 0,
    total_dividendes_recus      NUMERIC(19,4)   NOT NULL DEFAULT 0,
    statut                      VARCHAR(30)     NOT NULL DEFAULT 'ACTIF',
    date_ouverture              DATE            NOT NULL DEFAULT CURRENT_DATE,
    date_derniere_operation     DATE,
    notes                       VARCHAR(500),
    -- BaseEntity cols
    date_creation               TIMESTAMP       NOT NULL DEFAULT NOW(),
    date_modification           TIMESTAMP,
    cree_par                    VARCHAR(255),
    modifie_par                 VARCHAR(255),
    version                     BIGINT                   DEFAULT 0,
    actif                       BOOLEAN         NOT NULL DEFAULT TRUE,
    CONSTRAINT fk_cps_membre       FOREIGN KEY (membre_id)       REFERENCES utilisateurs(id),
    CONSTRAINT fk_cps_organisation FOREIGN KEY (organisation_id) REFERENCES organisations(id)
);

CREATE INDEX IF NOT EXISTS idx_cps_numero  ON comptes_parts_sociales(numero_compte);
CREATE INDEX IF NOT EXISTS idx_cps_membre  ON comptes_parts_sociales(membre_id);
CREATE INDEX IF NOT EXISTS idx_cps_org     ON comptes_parts_sociales(organisation_id);

-- ── 3. Transactions sur parts sociales ────────────────────────────────────
CREATE TABLE IF NOT EXISTS transactions_parts_sociales (
    id                      UUID            NOT NULL DEFAULT gen_random_uuid() PRIMARY KEY,
    compte_id               UUID            NOT NULL,
    type_transaction        VARCHAR(50)     NOT NULL,
    nombre_parts            INTEGER         NOT NULL,
    montant                 NUMERIC(19,4)   NOT NULL,
    solde_parts_avant       INTEGER         NOT NULL DEFAULT 0,
    solde_parts_apres       INTEGER         NOT NULL DEFAULT 0,
    motif                   VARCHAR(500),
    reference_externe       VARCHAR(100),
    date_transaction        TIMESTAMP       NOT NULL DEFAULT NOW(),
    -- BaseEntity cols
    date_creation           TIMESTAMP       NOT NULL DEFAULT NOW(),
    date_modification       TIMESTAMP,
    cree_par                VARCHAR(255),
    modifie_par             VARCHAR(255),
    version                 BIGINT                   DEFAULT 0,
    actif                   BOOLEAN         NOT NULL DEFAULT TRUE,
    CONSTRAINT fk_tps_compte FOREIGN KEY (compte_id) REFERENCES comptes_parts_sociales(id)
);

CREATE INDEX IF NOT EXISTS idx_tps_compte ON transactions_parts_sociales(compte_id);
CREATE INDEX IF NOT EXISTS idx_tps_date   ON transactions_parts_sociales(date_transaction);
