- Task #6: WebSocket /ws/dashboard + Kafka events (5 topics) * Backend: KafkaEventProducer, KafkaEventConsumer * Mobile: WebSocketService (reconnection, heartbeat, typed events) * DashboardBloc: Auto-refresh depuis WebSocket events - Finance Workflow: approbations + budgets (backend + mobile) * Backend: entities, services, resources, migrations Flyway V6 * Mobile: features finance_workflow complète avec BLoC - Corrections DI: interfaces IRepository partout * IProfileRepository, IOrganizationRepository, IMembreRepository * GetIt configuré avec @injectable - Spec-Kit: constitution + templates mis à jour * .specify/memory/constitution.md enrichie * Templates agent, plan, spec, tasks, checklist - Nettoyage: fichiers temporaires supprimés Signed-off-by: lions dev Team
482 lines
13 KiB
SQL
482 lines
13 KiB
SQL
-- ================================================================
|
||
-- Finance Workflow - Données de Test
|
||
-- ================================================================
|
||
-- Date: 2026-03-14
|
||
-- Objectif: Créer des données de test pour valider l'intégration mobile-backend
|
||
-- Usage: psql -U unionflow -d unionflow -h localhost -f FINANCE_WORKFLOW_TEST_DATA.sql
|
||
|
||
-- ================================================================
|
||
-- 1. ORGANISATION DE TEST
|
||
-- ================================================================
|
||
|
||
-- Vérifier si l'organisation existe déjà
|
||
DO $$
|
||
BEGIN
|
||
IF NOT EXISTS (SELECT 1 FROM organisations WHERE id = '00000000-0000-0000-0000-000000000001') THEN
|
||
INSERT INTO organisations (
|
||
id,
|
||
nom,
|
||
type_organisation,
|
||
statut,
|
||
email,
|
||
telephone,
|
||
adresse,
|
||
pays,
|
||
date_creation,
|
||
actif
|
||
) VALUES (
|
||
'00000000-0000-0000-0000-000000000001',
|
||
'Organisation Test Finance',
|
||
'ASSOCIATION',
|
||
'ACTIVE',
|
||
'test@finance.org',
|
||
'+221771234567',
|
||
'123 Rue Test, Dakar',
|
||
'Sénégal',
|
||
CURRENT_TIMESTAMP,
|
||
true
|
||
);
|
||
RAISE NOTICE 'Organisation créée: 00000000-0000-0000-0000-000000000001';
|
||
ELSE
|
||
RAISE NOTICE 'Organisation existe déjà: 00000000-0000-0000-0000-000000000001';
|
||
END IF;
|
||
END $$;
|
||
|
||
-- ================================================================
|
||
-- 2. APPROBATIONS DE TRANSACTIONS EN ATTENTE
|
||
-- ================================================================
|
||
|
||
-- Approbation 1: Contribution mensuelle (LEVEL1 - 1 approbation requise)
|
||
INSERT INTO transaction_approvals (
|
||
id,
|
||
transaction_id,
|
||
transaction_type,
|
||
amount,
|
||
currency,
|
||
requester_id,
|
||
requester_name,
|
||
organisation_id,
|
||
required_level,
|
||
status,
|
||
description,
|
||
created_at,
|
||
expires_at,
|
||
date_creation,
|
||
actif
|
||
) VALUES (
|
||
'11111111-1111-1111-1111-111111111111',
|
||
gen_random_uuid(),
|
||
'CONTRIBUTION',
|
||
50000.00,
|
||
'XOF',
|
||
gen_random_uuid(),
|
||
'Mamadou Diallo',
|
||
'00000000-0000-0000-0000-000000000001',
|
||
'LEVEL1',
|
||
'PENDING',
|
||
'Cotisation mensuelle mars 2026',
|
||
CURRENT_TIMESTAMP,
|
||
CURRENT_TIMESTAMP + INTERVAL '7 days',
|
||
CURRENT_TIMESTAMP,
|
||
true
|
||
) ON CONFLICT (id) DO NOTHING;
|
||
|
||
-- Approbation 2: Retrait épargne (LEVEL2 - 2 approbations requises)
|
||
INSERT INTO transaction_approvals (
|
||
id,
|
||
transaction_id,
|
||
transaction_type,
|
||
amount,
|
||
currency,
|
||
requester_id,
|
||
requester_name,
|
||
organisation_id,
|
||
required_level,
|
||
status,
|
||
description,
|
||
created_at,
|
||
expires_at,
|
||
date_creation,
|
||
actif
|
||
) VALUES (
|
||
'22222222-2222-2222-2222-222222222222',
|
||
gen_random_uuid(),
|
||
'WITHDRAWAL',
|
||
500000.00,
|
||
'XOF',
|
||
gen_random_uuid(),
|
||
'Fatou Sarr',
|
||
'00000000-0000-0000-0000-000000000001',
|
||
'LEVEL2',
|
||
'PENDING',
|
||
'Retrait épargne pour projet personnel',
|
||
CURRENT_TIMESTAMP,
|
||
CURRENT_TIMESTAMP + INTERVAL '7 days',
|
||
CURRENT_TIMESTAMP,
|
||
true
|
||
) ON CONFLICT (id) DO NOTHING;
|
||
|
||
-- Approbation 3: Dépôt solidarité (LEVEL1)
|
||
INSERT INTO transaction_approvals (
|
||
id,
|
||
transaction_id,
|
||
transaction_type,
|
||
amount,
|
||
currency,
|
||
requester_id,
|
||
requester_name,
|
||
organisation_id,
|
||
required_level,
|
||
status,
|
||
description,
|
||
created_at,
|
||
expires_at,
|
||
date_creation,
|
||
actif
|
||
) VALUES (
|
||
'33333333-3333-3333-3333-333333333333',
|
||
gen_random_uuid(),
|
||
'SOLIDARITY',
|
||
75000.00,
|
||
'XOF',
|
||
gen_random_uuid(),
|
||
'Ibrahima Ndiaye',
|
||
'00000000-0000-0000-0000-000000000001',
|
||
'LEVEL1',
|
||
'PENDING',
|
||
'Aide solidarité pour funérailles',
|
||
CURRENT_TIMESTAMP,
|
||
CURRENT_TIMESTAMP + INTERVAL '7 days',
|
||
CURRENT_TIMESTAMP,
|
||
true
|
||
) ON CONFLICT (id) DO NOTHING;
|
||
|
||
-- Approbation 4: Événement (LEVEL3 - 3 approbations requises)
|
||
INSERT INTO transaction_approvals (
|
||
id,
|
||
transaction_id,
|
||
transaction_type,
|
||
amount,
|
||
currency,
|
||
requester_id,
|
||
requester_name,
|
||
organisation_id,
|
||
required_level,
|
||
status,
|
||
description,
|
||
created_at,
|
||
expires_at,
|
||
date_creation,
|
||
actif
|
||
) VALUES (
|
||
'44444444-4444-4444-4444-444444444444',
|
||
gen_random_uuid(),
|
||
'EVENT',
|
||
1500000.00,
|
||
'XOF',
|
||
gen_random_uuid(),
|
||
'Aminata Ba',
|
||
'00000000-0000-0000-0000-000000000001',
|
||
'LEVEL3',
|
||
'PENDING',
|
||
'Organisation gala annuel 2026',
|
||
CURRENT_TIMESTAMP,
|
||
CURRENT_TIMESTAMP + INTERVAL '7 days',
|
||
CURRENT_TIMESTAMP,
|
||
true
|
||
) ON CONFLICT (id) DO NOTHING;
|
||
|
||
-- ================================================================
|
||
-- 3. APPROBATIONS HISTORIQUES (VALIDÉES/REJETÉES)
|
||
-- ================================================================
|
||
|
||
-- Approbation validée (pour historique)
|
||
INSERT INTO transaction_approvals (
|
||
id,
|
||
transaction_id,
|
||
transaction_type,
|
||
amount,
|
||
currency,
|
||
requester_id,
|
||
requester_name,
|
||
organisation_id,
|
||
required_level,
|
||
status,
|
||
description,
|
||
created_at,
|
||
expires_at,
|
||
completed_at,
|
||
date_creation,
|
||
actif
|
||
) VALUES (
|
||
'55555555-5555-5555-5555-555555555555',
|
||
gen_random_uuid(),
|
||
'CONTRIBUTION',
|
||
50000.00,
|
||
'XOF',
|
||
gen_random_uuid(),
|
||
'Ousmane Sow',
|
||
'00000000-0000-0000-0000-000000000001',
|
||
'LEVEL1',
|
||
'VALIDATED',
|
||
'Cotisation mensuelle février 2026',
|
||
CURRENT_TIMESTAMP - INTERVAL '15 days',
|
||
CURRENT_TIMESTAMP - INTERVAL '8 days',
|
||
CURRENT_TIMESTAMP - INTERVAL '14 days',
|
||
CURRENT_TIMESTAMP - INTERVAL '15 days',
|
||
true
|
||
) ON CONFLICT (id) DO NOTHING;
|
||
|
||
-- Action d'approbation pour la transaction validée
|
||
INSERT INTO approver_actions (
|
||
id,
|
||
approval_id,
|
||
approver_id,
|
||
approver_name,
|
||
decision,
|
||
comment,
|
||
decided_at,
|
||
date_creation,
|
||
actif
|
||
) VALUES (
|
||
gen_random_uuid(),
|
||
'55555555-5555-5555-5555-555555555555',
|
||
gen_random_uuid(),
|
||
'Cheikh Diop',
|
||
'APPROVED',
|
||
'Cotisation conforme, approuvé',
|
||
CURRENT_TIMESTAMP - INTERVAL '14 days',
|
||
CURRENT_TIMESTAMP - INTERVAL '14 days',
|
||
true
|
||
) ON CONFLICT DO NOTHING;
|
||
|
||
-- Approbation rejetée (pour historique)
|
||
INSERT INTO transaction_approvals (
|
||
id,
|
||
transaction_id,
|
||
transaction_type,
|
||
amount,
|
||
currency,
|
||
requester_id,
|
||
requester_name,
|
||
organisation_id,
|
||
required_level,
|
||
status,
|
||
description,
|
||
rejection_reason,
|
||
created_at,
|
||
expires_at,
|
||
completed_at,
|
||
date_creation,
|
||
actif
|
||
) VALUES (
|
||
'66666666-6666-6666-6666-666666666666',
|
||
gen_random_uuid(),
|
||
'WITHDRAWAL',
|
||
2000000.00,
|
||
'XOF',
|
||
gen_random_uuid(),
|
||
'Awa Diagne',
|
||
'00000000-0000-0000-0000-000000000001',
|
||
'LEVEL2',
|
||
'REJECTED',
|
||
'Retrait urgent montant élevé',
|
||
'Montant trop élevé sans justificatif adéquat. Révision budgétaire nécessaire avant approbation.',
|
||
CURRENT_TIMESTAMP - INTERVAL '10 days',
|
||
CURRENT_TIMESTAMP - INTERVAL '3 days',
|
||
CURRENT_TIMESTAMP - INTERVAL '9 days',
|
||
CURRENT_TIMESTAMP - INTERVAL '10 days',
|
||
true
|
||
) ON CONFLICT (id) DO NOTHING;
|
||
|
||
-- Action de rejet
|
||
INSERT INTO approver_actions (
|
||
id,
|
||
approval_id,
|
||
approver_id,
|
||
approver_name,
|
||
decision,
|
||
comment,
|
||
decided_at,
|
||
date_creation,
|
||
actif
|
||
) VALUES (
|
||
gen_random_uuid(),
|
||
'66666666-6666-6666-6666-666666666666',
|
||
gen_random_uuid(),
|
||
'Moussa Kane',
|
||
'REJECTED',
|
||
'Montant trop élevé sans justificatif adéquat',
|
||
CURRENT_TIMESTAMP - INTERVAL '9 days',
|
||
CURRENT_TIMESTAMP - INTERVAL '9 days',
|
||
true
|
||
) ON CONFLICT DO NOTHING;
|
||
|
||
-- ================================================================
|
||
-- 4. BUDGETS
|
||
-- ================================================================
|
||
|
||
-- Budget mensuel mars 2026 (actif, avec réalisations partielles)
|
||
INSERT INTO budgets (
|
||
id,
|
||
name,
|
||
description,
|
||
organisation_id,
|
||
period,
|
||
year,
|
||
month,
|
||
start_date,
|
||
end_date,
|
||
currency,
|
||
total_planned,
|
||
total_realized,
|
||
status,
|
||
created_at_budget,
|
||
date_creation,
|
||
actif
|
||
) VALUES (
|
||
'77777777-7777-7777-7777-777777777777',
|
||
'Budget Mars 2026',
|
||
'Budget mensuel pour le mois de mars 2026',
|
||
'00000000-0000-0000-0000-000000000001',
|
||
'MONTHLY',
|
||
2026,
|
||
3,
|
||
'2026-03-01',
|
||
'2026-03-31',
|
||
'XOF',
|
||
3500000.00,
|
||
2950000.00,
|
||
'ACTIVE',
|
||
CURRENT_TIMESTAMP - INTERVAL '14 days',
|
||
CURRENT_TIMESTAMP - INTERVAL '14 days',
|
||
true
|
||
) ON CONFLICT (id) DO NOTHING;
|
||
|
||
-- Lignes budgétaires pour Budget Mars 2026
|
||
INSERT INTO budget_lines (id, budget_id, category, name, description, amount_planned, amount_realized, notes, date_creation, actif) VALUES
|
||
(gen_random_uuid(), '77777777-7777-7777-7777-777777777777', 'CONTRIBUTIONS', 'Cotisations mensuelles', 'Cotisations des membres actifs', 2000000.00, 1800000.00, 'Basé sur 40 membres à 50000 XOF', CURRENT_TIMESTAMP, true),
|
||
(gen_random_uuid(), '77777777-7777-7777-7777-777777777777', 'SAVINGS', 'Épargne collective', 'Épargne pour projets futurs', 1000000.00, 950000.00, NULL, CURRENT_TIMESTAMP, true),
|
||
(gen_random_uuid(), '77777777-7777-7777-7777-777777777777', 'OPERATIONAL', 'Frais opérationnels', 'Loyer, électricité, fournitures', 500000.00, 200000.00, NULL, CURRENT_TIMESTAMP, true)
|
||
ON CONFLICT DO NOTHING;
|
||
|
||
-- Budget trimestriel Q2 2026 (actif, sans réalisations encore)
|
||
INSERT INTO budgets (
|
||
id,
|
||
name,
|
||
description,
|
||
organisation_id,
|
||
period,
|
||
year,
|
||
month,
|
||
start_date,
|
||
end_date,
|
||
currency,
|
||
total_planned,
|
||
total_realized,
|
||
status,
|
||
created_at_budget,
|
||
date_creation,
|
||
actif
|
||
) VALUES (
|
||
'88888888-8888-8888-8888-888888888888',
|
||
'Budget Q2 2026',
|
||
'Budget deuxième trimestre 2026 (avril-juin)',
|
||
'00000000-0000-0000-0000-000000000001',
|
||
'QUARTERLY',
|
||
2026,
|
||
4,
|
||
'2026-04-01',
|
||
'2026-06-30',
|
||
'XOF',
|
||
10000000.00,
|
||
0.00,
|
||
'ACTIVE',
|
||
CURRENT_TIMESTAMP - INTERVAL '7 days',
|
||
CURRENT_TIMESTAMP - INTERVAL '7 days',
|
||
true
|
||
) ON CONFLICT (id) DO NOTHING;
|
||
|
||
-- Lignes budgétaires pour Budget Q2 2026
|
||
INSERT INTO budget_lines (id, budget_id, category, name, description, amount_planned, amount_realized, notes, date_creation, actif) VALUES
|
||
(gen_random_uuid(), '88888888-8888-8888-8888-888888888888', 'CONTRIBUTIONS', 'Cotisations trimestrielles', 'Cotisations Q2', 6000000.00, 0.00, '3 mois × 2M', CURRENT_TIMESTAMP, true),
|
||
(gen_random_uuid(), '88888888-8888-8888-8888-888888888888', 'EVENTS', 'Événements du trimestre', 'AG + formations', 2000000.00, 0.00, NULL, CURRENT_TIMESTAMP, true),
|
||
(gen_random_uuid(), '88888888-8888-8888-8888-888888888888', 'INVESTMENTS', 'Investissements', 'Matériel informatique', 2000000.00, 0.00, NULL, CURRENT_TIMESTAMP, true)
|
||
ON CONFLICT DO NOTHING;
|
||
|
||
-- Budget avec dépassement (pour tester indicateurs)
|
||
INSERT INTO budgets (
|
||
id,
|
||
name,
|
||
description,
|
||
organisation_id,
|
||
period,
|
||
year,
|
||
month,
|
||
start_date,
|
||
end_date,
|
||
currency,
|
||
total_planned,
|
||
total_realized,
|
||
status,
|
||
created_at_budget,
|
||
date_creation,
|
||
actif
|
||
) VALUES (
|
||
'99999999-9999-9999-9999-999999999999',
|
||
'Budget Février 2026',
|
||
'Budget mensuel février (clôturé)',
|
||
'00000000-0000-0000-0000-000000000001',
|
||
'MONTHLY',
|
||
2026,
|
||
2,
|
||
'2026-02-01',
|
||
'2026-02-28',
|
||
'XOF',
|
||
3000000.00,
|
||
3200000.00,
|
||
'CLOSED',
|
||
CURRENT_TIMESTAMP - INTERVAL '45 days',
|
||
CURRENT_TIMESTAMP - INTERVAL '45 days',
|
||
true
|
||
) ON CONFLICT (id) DO NOTHING;
|
||
|
||
-- Lignes avec dépassement
|
||
INSERT INTO budget_lines (id, budget_id, category, name, description, amount_planned, amount_realized, notes, date_creation, actif) VALUES
|
||
(gen_random_uuid(), '99999999-9999-9999-9999-999999999999', 'CONTRIBUTIONS', 'Cotisations', NULL, 2000000.00, 2100000.00, NULL, CURRENT_TIMESTAMP, true),
|
||
(gen_random_uuid(), '99999999-9999-9999-9999-999999999999', 'OPERATIONAL', 'Opérationnel', NULL, 500000.00, 650000.00, 'DÉPASSEMENT: +150k', CURRENT_TIMESTAMP, true),
|
||
(gen_random_uuid(), '99999999-9999-9999-9999-999999999999', 'SOLIDARITY', 'Solidarité', NULL, 500000.00, 450000.00, NULL, CURRENT_TIMESTAMP, true)
|
||
ON CONFLICT DO NOTHING;
|
||
|
||
-- ================================================================
|
||
-- VÉRIFICATION DES DONNÉES
|
||
-- ================================================================
|
||
|
||
-- Compter les approbations créées
|
||
SELECT
|
||
status,
|
||
COUNT(*) as count
|
||
FROM transaction_approvals
|
||
WHERE organisation_id = '00000000-0000-0000-0000-000000000001'
|
||
GROUP BY status
|
||
ORDER BY status;
|
||
|
||
-- Compter les budgets créés
|
||
SELECT
|
||
status,
|
||
COUNT(*) as count
|
||
FROM budgets
|
||
WHERE organisation_id = '00000000-0000-0000-0000-000000000001'
|
||
GROUP BY status
|
||
ORDER BY status;
|
||
|
||
-- Afficher résumé
|
||
SELECT '=============================' as separator;
|
||
SELECT 'DONNÉES DE TEST CRÉÉES' as message;
|
||
SELECT '=============================' as separator;
|
||
SELECT 'Approbations en attente: 4' as stat;
|
||
SELECT 'Approbations historiques: 2' as stat;
|
||
SELECT 'Budgets actifs: 2' as stat;
|
||
SELECT 'Budgets clôturés: 1' as stat;
|
||
SELECT '=============================' as separator;
|