feat: WebSocket temps réel + Finance Workflow + corrections

- 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
This commit is contained in:
dahoud
2026-03-15 02:12:17 +00:00
parent bbc409de9d
commit e8ad874015
635 changed files with 58160 additions and 20674 deletions

View File

@@ -0,0 +1,481 @@
-- ================================================================
-- 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;