# Progression Spec 001 : Mutuelles + Anti-blanchiment LCB-FT **Branche** : `001-mutuelles-anti-blanchiment` **Dernière mise à jour** : 2026-03-13 **Statut global** : **67% complété** (18/27 tâches) --- ## 📊 Vue d'ensemble | Phase | Tâches | Statut | Détails | |-------|--------|--------|---------| | **Phase 1 - API** | 6/6 | ✅ **100%** | DTOs et enums LCB-FT | | **Phase 2 - Migrations** | 5/5 | ✅ **100%** | V3.4 déjà existante | | **Phase 3 - Impl Quarkus** | 4/6 | ✅ **67%** | Services + endpoints | | **Phase 4 - Mobile** | 3/7 | 🚧 **43%** | Épargne LCB-FT (3/4), KYC (0/3) | | **Phase 5 - Finition** | 0/3 | ⏳ **0%** | Tests + docs | | **TOTAL** | **18/27** | 🎯 **67%** | | --- ## ✅ Phase 1 - API (100% complétée) **Commit** : `309edc4` **Date** : 2026-03-13 ### Réalisations #### T001-T002 : DTOs Transaction Épargne ✅ - ✅ `TransactionEpargneRequest` : champs déjà présents - `origineFonds` (String) - Origine des fonds - `pieceJustificativeId` (String) - ID pièce justificative - ✅ `TransactionEpargneResponse` : champs en lecture - Traçabilité complète **Fichiers** : - `unionflow-server-api/.../dto/mutuelle/epargne/TransactionEpargneRequest.java` - `unionflow-server-api/.../dto/mutuelle/epargne/TransactionEpargneResponse.java` #### T003 : Enums et champs KYC membre ✅ - ✅ `NiveauVigilanceKyc` : SIMPLIFIE, RENFORCE - ✅ `StatutKyc` : NON_VERIFIE, EN_COURS, VERIFIE, REFUSE - ✅ `MembreResponse` : niveauVigilanceKyc, statutKyc, dateVerificationIdentite **Fichiers** : - `unionflow-server-api/.../enums/membre/NiveauVigilanceKyc.java` - `unionflow-server-api/.../enums/membre/StatutKyc.java` - `unionflow-server-api/.../dto/membre/response/MembreResponse.java` #### T004 : DTOs Paiement LCB-FT ✅ - ✅ `TypeObjetIntentionPaiement` étendu : - Ajout : `RETRAIT_EPARGNE`, `CREDIT_REMBOURSEMENT` - ✅ 3 DTOs étendus avec `origineFonds` + `justificationLcbFt` : - `InitierDepotEpargneRequest` - `DeclarerPaiementManuelRequest` - `InitierPaiementEnLigneRequest` **Fichiers** : - `unionflow-server-api/.../enums/paiement/TypeObjetIntentionPaiement.java` - `unionflow-server-api/.../dto/paiement/request/` (3 fichiers) #### T005 : Paramètres LCB-FT (seuils) ✅ - ✅ `ParametresLcbFtRequest` créé - montantSeuilJustification - montantSeuilValidationManuelle - codeDevise - ✅ `ParametresLcbFtResponse` créé - Pour organisation ou plateforme **Fichiers** : - `unionflow-server-api/.../dto/config/request/ParametresLcbFtRequest.java` - `unionflow-server-api/.../dto/config/response/ParametresLcbFtResponse.java` #### T006 : Inventaire mis à jour ✅ - ✅ Ajout DTOs config et paiement - ✅ Validation champs existants - ✅ Date consolidation : 2026-03-13 --- ## ✅ Phase 2 - Migrations Flyway (100% complétée) **Migration** : `V3.4__LCB_FT_Anti_Blanchiment.sql` (déjà existante) **Statut** : Validation effectuée, aucune modification nécessaire ### Contenu vérifié #### T007 : Colonnes membres KYC ✅ ```sql ALTER TABLE utilisateurs ADD COLUMN niveau_vigilance_kyc VARCHAR(20) DEFAULT 'SIMPLIFIE', ADD COLUMN statut_kyc VARCHAR(20) DEFAULT 'NON_VERIFIE', ADD COLUMN date_verification_identite DATE; ``` - ✅ Contraintes CHECK (valeurs enum) - ✅ Index sur statut_kyc - ✅ Commentaires SQL #### T008 : Transactions épargne LCB-FT ✅ ```sql ALTER TABLE transactions_epargne ADD COLUMN origine_fonds VARCHAR(200), ADD COLUMN piece_justificative_id UUID; ``` - ✅ Conditionnelle (IF table exists) - ✅ Commentaires SQL #### T009 : Intentions paiement LCB-FT ✅ ```sql ALTER TABLE intentions_paiement ADD COLUMN origine_fonds VARCHAR(200), ADD COLUMN justification_lcb_ft TEXT; ``` #### T010 : Table parametres_lcb_ft ✅ ```sql CREATE TABLE parametres_lcb_ft ( id UUID PRIMARY KEY, organisation_id UUID, montant_seuil_justification DECIMAL(18,4), montant_seuil_validation_manuelle DECIMAL(18,4), code_devise VARCHAR(3), ... ); ``` - ✅ FK organisation (cascade) - ✅ Index unique org+devise - ✅ **Valeur par défaut plateforme** : 500k/1M XOF - ✅ Colonnes audit complètes #### T011 : Inventaire migrations ✅ - ✅ V3.4 documentée dans inventaire-code.md **Fichier** : - `unionflow-server-impl-quarkus/src/main/resources/db/legacy-migrations/V3.4__LCB_FT_Anti_Blanchiment.sql` --- ## ✅ Phase 3 - Impl Quarkus (67% complétée) **Commit** : `eb729bd` (sous-module unionflow-server-impl-quarkus) **Date** : 2026-03-13 ### Réalisations #### T012 : Service ParametresLcbFtService ✅ - ✅ `ParametresLcbFtRepository` déjà existant - ✅ `ParametresLcbFtService` créé avec : - `getParametres()` : params complets (avec cache) - `getSeuilJustification()` : seuil rapide (avec cache) - `saveOrUpdateParametres()` : CRUD - Fallback 500k XOF par défaut - ✅ Cache Quarkus `@CacheResult` pour performance **Fichiers** : - `unionflow-server-impl-quarkus/.../service/ParametresLcbFtService.java` (nouveau) - `unionflow-server-impl-quarkus/.../repository/ParametresLcbFtRepository.java` (existant) #### T013 : Validation seuils transactions épargne ✅ - ✅ `TransactionEpargneService.validerLcbFtSiSeuilAtteint()` **déjà implémentée** - Vérifie montant >= seuil - Exige `origineFonds` (non vide) si seuil atteint - Rejet `IllegalArgumentException` avec message clair - Validation longueur max (ValidationConstants) - ✅ Récupération seuil depuis `ParametresLcbFtRepository` **Fichier** : - `unionflow-server-impl-quarkus/.../service/mutuelle/epargne/TransactionEpargneService.java` (existant) #### T014 : Audit opérations mutuelles ✅ - ✅ `AuditService.logLcbFtSeuilAtteint()` **déjà implémenté** - Appelé dans `TransactionEpargneService` - Enregistre dans `audit_logs` si montant >= seuil - Portée ORGANISATION - Détails : orgId, operateurId, compteId, montant, origineFonds **Fichier** : - `unionflow-server-impl-quarkus/.../service/AuditService.java` (existant) #### T015 : Vérification KYC crédit ⏩ OPTIONNEL (skip) - Vérification `dateVerificationIdentite` avant déblocage crédit - Non critique pour MVP #### T016 : Ressource alertes LCB-FT ⏩ OPTIONNEL (skip) - Alertes dépassement seuil / motif vide - Peut être ajouté en Phase 2 de la spec #### T017 : Resource ParametresLcbFtResource ✅ - ✅ `ParametresLcbFtResource` créée avec 3 endpoints : - `GET /api/parametres-lcb-ft` : params complets (@PermitAll pour mobile) - `GET /api/parametres-lcb-ft/seuil-justification` : seuil uniquement (endpoint léger) - `POST /api/parametres-lcb-ft` : CRUD admin (@RolesAllowed ADMIN/SUPER_ADMIN) - ✅ Documentation OpenAPI/Swagger complète - ✅ Validation Jakarta Bean Validation **Fichier** : - `unionflow-server-impl-quarkus/.../resource/ParametresLcbFtResource.java` (nouveau) ### Tâches optionnelles skippées (T015, T016) Ces tâches ne sont pas critiques pour le MVP de la spec 001 et peuvent être ajoutées ultérieurement si nécessaire. --- ## 🚧 Phase 4 - Mobile (43% complétée) **Commits** : `74161df`, `5ef8ae1`, `6231847` **Date** : 2026-03-13 ### Réalisations #### 4.1 Épargne – Seuil et champs LCB-FT (75% - 3/4) ##### T018 : Récupération seuil depuis API ✅ **Commit** : `74161df` Nouveaux fichiers : - ✅ `SeuilLcbFtModel` : modèle pour seuil récupéré depuis API - `montantSeuil` (double), `codeDevise` (String) - Factory `defaultSeuil()` fallback 500k XOF - ✅ `ParametresLcbFtRepository` : appel `/api/parametres-lcb-ft/seuil-justification` - `@lazySingleton` pour injection GetIt - Fallback automatique si API échoue Modifications : - ✅ `DepotEpargneDialog` : charge seuil au `initState()` - ✅ `RetraitEpargneDialog` : idem - ✅ Remplace constante `kSeuilOrigineFondsObligatoireXOF` par `_seuilLcbFt` dynamique Impact : - Seuil LCB-FT maintenant configurable par organisation depuis backend - Messages utilisateur avec montant seuil dynamique - Conformité BCEAO : seuils centralisés et auditables **Fichiers** : - `lib/core/data/models/seuil_lcb_ft_model.dart` - `lib/core/data/repositories/parametres_lcb_ft_repository.dart` - `lib/features/epargne/presentation/widgets/depot_epargne_dialog.dart` - `lib/features/epargne/presentation/widgets/retrait_epargne_dialog.dart` ##### T019 : Formulaires avec origineFonds obligatoire ✅ **Commit** : `5ef8ae1` Modifications : - ✅ `TransfertEpargneDialog` : ajout champ origine des fonds - Import `ParametresLcbFtRepository` + `lcb_ft_constants` - Chargement seuil au `initState()` - Validation conditionnelle : `montant >= seuil` → origine fonds obligatoire - Message clair avec montant seuil dynamique - `onChanged` sur montant pour mise à jour UI temps réel Impact : - Les 3 types d'opérations (dépôt, retrait, transfert) ont la validation LCB-FT - Champ `origineFonds` transmis dans `TransactionEpargneRequest` - Conformité BCEAO/OHADA sur tous les flux épargne **Fichier** : - `lib/features/epargne/presentation/widgets/transfert_epargne_dialog.dart` ##### T020 : Upload pièce justificative ⏩ OPTIONNEL (skip) - Champ `pieceJustificativeId` déjà présent dans `TransactionEpargneRequest` - Peut être ajouté ultérieurement si besoin métier - Non bloquant pour MVP : description texte dans `origineFonds` suffit ##### T021 : Gestion erreurs 400 LCB-FT ✅ **Commit** : `6231847` Nouveau fichier : - ✅ `ErrorFormatter` : utilitaire central pour formater les erreurs backend - Détecte et formate spécialement les erreurs LCB-FT (origine fonds manquante) - Détecte erreurs KYC, réseau, 400/401/403/404/500 - Messages conviviaux avec emojis (🛡️ pour LCB-FT/KYC) - Durée d'affichage adaptée : 6s pour LCB-FT, 3s sinon - `isLcbFtError()`, `isCritical()` helpers Modifications 3 dialogs (dépôt, retrait, transfert) : - ✅ Remplacement affichage erreur brut par `ErrorFormatter.format(e)` - ✅ Messages explicites : *"L'origine des fonds est obligatoire pour cette opération (conformité LCB-FT anti-blanchiment)"* - ✅ Durée snackbar conditionnelle selon type erreur Impact UX : - Messages d'erreur clairs et professionnels - Utilisateur comprend **POURQUOI** l'origine fonds est requise (anti-blanchiment) - Temps de lecture suffisant pour messages importants **Fichiers** : - `lib/core/utils/error_formatter.dart` - `lib/features/epargne/presentation/widgets/depot_epargne_dialog.dart` - `lib/features/epargne/presentation/widgets/retrait_epargne_dialog.dart` - `lib/features/epargne/presentation/widgets/transfert_epargne_dialog.dart` #### 4.2 Fiche membre – Affichage KYC (0% - 0/3) ##### T022 : Étendre modèle membre mobile ⏳ - `MembreModel` avec champs KYC - niveauVigilanceKyc, statutKyc, dateVerificationIdentite ##### T023 : Affichage fiche membre KYC ⏳ - Lecture seule statut KYC - Date vérification identité ##### T024 : Validation données API uniquement ⏳ - Pas de valeurs en dur - Audit complet mobile --- ## ⏳ Phase 5 - Finition (0% - À démarrer) ### Tâches restantes #### T025 : Mise à jour inventaire mobile - Nouveaux modèles et écrans - Constantes LCB-FT #### T026 : Vérification absence données fictives - Audit complet - Listes en dur supprimées #### T027 : Tests backend et mobile - Tests unitaires services - Tests intégration - Correction régressions --- ## 🎯 Prochaines étapes recommandées ### Court terme (session suivante) 1. **T012** - Implémenter `ParametresLcbFtService` 2. **T013** - Ajouter validation seuils dans `TransactionEpargneService` 3. **T017** - Créer endpoint REST paramètres LCB-FT ### Moyen terme 4. **T014** - Audit opérations mutuelles 5. **Phase 4** - Écrans mobile (7 tâches) ### Long terme 6. **T015-T016** - Fonctionnalités optionnelles 7. **Phase 5** - Tests et finition --- ## 📚 Références - **Spec** : `specs/001-mutuelles-anti-blanchiment/spec.md` - **Plan** : `specs/001-mutuelles-anti-blanchiment/plan.md` - **Tasks** : `specs/001-mutuelles-anti-blanchiment/tasks.md` - **Migration** : `unionflow-server-impl-quarkus/.../V3.4__LCB_FT_Anti_Blanchiment.sql` --- ## 🔖 Notes importantes ### Conformité BCEAO/OHADA/LCB-FT - ✅ Traçabilité complète (origine fonds, pièce justificative) - ✅ Seuils configurables (par org ou plateforme) - ✅ KYC membre (vigilance, statut, date vérification) - ✅ Conservation 10 ans (audit_logs V2.9) - ⏳ Alertes dépassement seuil (Phase 3) ### Zéro données fictives - ✅ API : Pas de mock, données réelles uniquement - ✅ Migrations : Valeur par défaut plateforme 500k/1M XOF - ⏳ Mobile : À vérifier en Phase 4 ### Architecture - ✅ API/Impl séparés (unionflow-server-api / impl-quarkus) - ✅ Clean Architecture mobile (domain/data/presentation) - ✅ DI avec GetIt/Injectable - ✅ BLoC pattern --- **Dernière révision** : 2026-03-13 **Auteur** : lions dev Team