Sync: code local unifié
Synchronisation du code source local (fait foi). Signed-off-by: lions dev Team
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
-- ============================================================
|
||||
-- V2.2 — SaaS : formules_abonnement + souscriptions_organisation
|
||||
-- Auteur: UnionFlow Team | BCEAO/OHADA compliant
|
||||
-- ============================================================
|
||||
|
||||
CREATE TABLE IF NOT EXISTS formules_abonnement (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
|
||||
code VARCHAR(20) UNIQUE NOT NULL, -- STARTER, STANDARD, PREMIUM, CRYSTAL
|
||||
libelle VARCHAR(100) NOT NULL,
|
||||
description TEXT,
|
||||
max_membres INTEGER, -- NULL = illimité (Crystal+)
|
||||
max_stockage_mo INTEGER NOT NULL DEFAULT 1024, -- 1 Go par défaut
|
||||
prix_mensuel DECIMAL(10,2) NOT NULL CHECK (prix_mensuel >= 0),
|
||||
prix_annuel DECIMAL(10,2) NOT NULL CHECK (prix_annuel >= 0),
|
||||
actif BOOLEAN NOT NULL DEFAULT TRUE,
|
||||
ordre_affichage INTEGER DEFAULT 0,
|
||||
|
||||
-- Métadonnées BaseEntity
|
||||
date_creation TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
date_modification TIMESTAMP,
|
||||
cree_par VARCHAR(255),
|
||||
modifie_par VARCHAR(255),
|
||||
version BIGINT NOT NULL DEFAULT 0,
|
||||
|
||||
CONSTRAINT chk_formule_code CHECK (code IN ('STARTER','STANDARD','PREMIUM','CRYSTAL'))
|
||||
);
|
||||
|
||||
-- Données initiales des forfaits (XOF, 1er Janvier 2026)
|
||||
INSERT INTO formules_abonnement (id, code, libelle, description, max_membres, max_stockage_mo, prix_mensuel, prix_annuel, actif, ordre_affichage)
|
||||
VALUES
|
||||
(gen_random_uuid(), 'STARTER', 'Formule Starter', 'Idéal pour démarrer — jusqu''à 50 membres', 50, 1024, 5000.00, 50000.00, true, 1),
|
||||
(gen_random_uuid(), 'STANDARD', 'Formule Standard', 'Pour les organisations en croissance', 200, 1024, 7000.00, 70000.00, true, 2),
|
||||
(gen_random_uuid(), 'PREMIUM', 'Formule Premium', 'Organisations établies', 500, 1024, 9000.00, 90000.00, true, 3),
|
||||
(gen_random_uuid(), 'CRYSTAL', 'Formule Crystal', 'Fédérations et grandes organisations', NULL,1024, 10000.00, 100000.00, true, 4)
|
||||
ON CONFLICT (code) DO NOTHING;
|
||||
|
||||
-- ============================================================
|
||||
CREATE TABLE IF NOT EXISTS souscriptions_organisation (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
|
||||
organisation_id UUID UNIQUE NOT NULL,
|
||||
formule_id UUID NOT NULL,
|
||||
type_periode VARCHAR(10) NOT NULL DEFAULT 'MENSUEL', -- MENSUEL | ANNUEL
|
||||
date_debut DATE NOT NULL,
|
||||
date_fin DATE NOT NULL,
|
||||
quota_max INTEGER, -- snapshot de formule.max_membres
|
||||
quota_utilise INTEGER NOT NULL DEFAULT 0,
|
||||
statut VARCHAR(30) NOT NULL DEFAULT 'ACTIVE',
|
||||
reference_paiement_wave VARCHAR(100),
|
||||
wave_session_id VARCHAR(255),
|
||||
date_dernier_paiement DATE,
|
||||
date_prochain_paiement DATE,
|
||||
|
||||
-- Métadonnées BaseEntity
|
||||
actif BOOLEAN NOT NULL DEFAULT TRUE,
|
||||
date_creation TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
date_modification TIMESTAMP,
|
||||
cree_par VARCHAR(255),
|
||||
modifie_par VARCHAR(255),
|
||||
version BIGINT NOT NULL DEFAULT 0,
|
||||
|
||||
CONSTRAINT fk_souscription_org FOREIGN KEY (organisation_id) REFERENCES organisations(id) ON DELETE CASCADE,
|
||||
CONSTRAINT fk_souscription_formule FOREIGN KEY (formule_id) REFERENCES formules_abonnement(id),
|
||||
CONSTRAINT chk_souscription_statut CHECK (statut IN ('ACTIVE','EXPIREE','SUSPENDUE','RESILIEE')),
|
||||
CONSTRAINT chk_souscription_periode CHECK (type_periode IN ('MENSUEL','ANNUEL')),
|
||||
CONSTRAINT chk_souscription_quota CHECK (quota_utilise >= 0)
|
||||
);
|
||||
|
||||
CREATE INDEX idx_souscription_org ON souscriptions_organisation(organisation_id);
|
||||
CREATE INDEX idx_souscription_statut ON souscriptions_organisation(statut);
|
||||
CREATE INDEX idx_souscription_fin ON souscriptions_organisation(date_fin);
|
||||
|
||||
COMMENT ON TABLE formules_abonnement IS 'Catalogue des forfaits SaaS UnionFlow (Starter→Crystal, 5000–10000 XOF/mois)';
|
||||
COMMENT ON TABLE souscriptions_organisation IS 'Abonnement actif d''une organisation racine — quota, durée, référence Wave';
|
||||
COMMENT ON COLUMN souscriptions_organisation.quota_utilise IS 'Incrémenté automatiquement à chaque adhésion validée. Bloquant si = quota_max.';
|
||||
Reference in New Issue
Block a user