Files
unionflow-server-impl-quarkus/src/main/resources/db/legacy-migrations/V2.3__Intentions_Paiement.sql
dahoud 75a19988b0 Sync: code local unifié
Synchronisation du code source local (fait foi).

Signed-off-by: lions dev Team
2026-03-15 16:25:40 +00:00

62 lines
3.2 KiB
SQL

-- ============================================================
-- V2.3 — Hub de paiement Wave : intentions_paiement
-- Chaque paiement Wave est initié depuis UnionFlow.
-- Auteur: UnionFlow Team | BCEAO/OHADA compliant
-- ============================================================
CREATE TABLE IF NOT EXISTS intentions_paiement (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
utilisateur_id UUID NOT NULL,
organisation_id UUID, -- NULL pour abonnements UnionFlow SA
montant_total DECIMAL(14,2) NOT NULL CHECK (montant_total > 0),
code_devise VARCHAR(3) NOT NULL DEFAULT 'XOF',
type_objet VARCHAR(30) NOT NULL, -- COTISATION|ADHESION|EVENEMENT|ABONNEMENT_UNIONFLOW
statut VARCHAR(20) NOT NULL DEFAULT 'INITIEE',
-- Wave API
wave_checkout_session_id VARCHAR(255) UNIQUE,
wave_launch_url VARCHAR(1000),
wave_transaction_id VARCHAR(100),
-- Traçabilité des objets payés (JSON: [{type,id,montant},...])
objets_cibles TEXT,
date_creation TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
date_expiration TIMESTAMP, -- TTL 30 min
date_completion TIMESTAMP,
-- Métadonnées BaseEntity
actif BOOLEAN NOT NULL DEFAULT TRUE,
date_modification TIMESTAMP,
cree_par VARCHAR(255),
modifie_par VARCHAR(255),
version BIGINT NOT NULL DEFAULT 0,
CONSTRAINT fk_intention_utilisateur FOREIGN KEY (utilisateur_id) REFERENCES utilisateurs(id),
CONSTRAINT fk_intention_organisation FOREIGN KEY (organisation_id) REFERENCES organisations(id) ON DELETE SET NULL,
CONSTRAINT chk_intention_type CHECK (type_objet IN ('COTISATION','ADHESION','EVENEMENT','ABONNEMENT_UNIONFLOW')),
CONSTRAINT chk_intention_statut CHECK (statut IN ('INITIEE','EN_COURS','COMPLETEE','EXPIREE','ECHOUEE')),
CONSTRAINT chk_intention_devise CHECK (code_devise ~ '^[A-Z]{3}$')
);
CREATE INDEX idx_intention_utilisateur ON intentions_paiement(utilisateur_id);
CREATE INDEX idx_intention_statut ON intentions_paiement(statut);
CREATE INDEX idx_intention_wave_session ON intentions_paiement(wave_checkout_session_id);
CREATE INDEX idx_intention_expiration ON intentions_paiement(date_expiration);
-- Supprimer les champs paiement redondants de cotisations (centralisés dans intentions_paiement)
ALTER TABLE cotisations
DROP COLUMN IF EXISTS methode_paiement,
DROP COLUMN IF EXISTS reference_paiement;
-- Ajouter le lien cotisation → intention de paiement
ALTER TABLE cotisations
ADD COLUMN IF NOT EXISTS intention_paiement_id UUID,
ADD CONSTRAINT fk_cotisation_intention
FOREIGN KEY (intention_paiement_id) REFERENCES intentions_paiement(id) ON DELETE SET NULL;
COMMENT ON TABLE intentions_paiement IS 'Hub centralisé Wave : chaque paiement est initié depuis UnionFlow avant appel API Wave';
COMMENT ON COLUMN intentions_paiement.objets_cibles IS 'JSON: liste des objets couverts par ce paiement — ex: 3 cotisations mensuelles';
COMMENT ON COLUMN intentions_paiement.wave_checkout_session_id IS 'ID de session Wave — clé de réconciliation sur réception webhook';