feat(sprint-6 P2-NEW-7 2026-04-25): multi-devise + KYC non-résident diaspora + tests
Some checks failed
CI/CD Pipeline / pipeline (push) Failing after 4m11s
Some checks failed
CI/CD Pipeline / pipeline (push) Failing after 4m11s
Ouvre UnionFlow à la diaspora UEMOA (France, USA, Canada, UK, Suisse...). Entités & migration - Enum Devise (10 valeurs : XOF, XAF, EUR, USD, GBP, CAD, CHF, GHS, NGN, MAD) - Zones : UEMOA, CEMAC, CEDEAO, EUROPE, AMERIQUE, MAGHREB - DEVISES_INTERNATIONALES : EUR/USD/GBP/CAD/CHF (déclenchent AML international) - Entité TauxChange (devise_source × devise_cible × date_validite, taux NUMERIC(18,8)) - Repository : trouverExact, trouverPlusRecent (≤ date) - V49 : - Table taux_change (contrainte unicité paire+date, devises distinctes) - Seed BCEAO_FIXED EUR↔XOF + taux indicatifs USD/GBP/CAD au 2026-04-25 - Membres : pays_residence (ISO-3), numero_passeport, numero_fiscal_etranger, est_diaspora, devise_preferee - KycDossiers : pays_origine_fonds, justificatif_residence_etrangere, niveau_due_diligence (SIMPLIFIE/STANDARD/RENFORCE) DeviseConversionService - Stratégie de résolution : direct → inverse → pivot via XOF → fallback récent ≤ date - Cache thread-safe (ConcurrentHashMap, TTL 1h) - TauxIntrouvableException si aucun taux résolvable - invaliderCache() pour reload après import batch KycDiasporaService - validerCoherence : passeport obligatoire si diaspora, pays_residence ≠ UEMOA, format passeport regex - determinerNiveauDueDiligence (Instr. BCEAO 001-03-2025) : - PEP → RENFORCE - Diaspora pays sécurisés (UE/G7/Asie) → STANDARD - Diaspora FATF grey-list → RENFORCE - Diaspora pays inconnu → RENFORCE par prudence - depasseSeuilAmlInternational : seuil 1000 EUR équivalent, false sur devises locales - PAYS_UEMOA hardcodé (8 pays), PAYS_GREY_LIST_FATF snapshot 2026-04-25 Tests Sprint 6 (34/34 verts) - DeviseTest : 5 tests (référence, internationales, zones, libellés) - DeviseConversionServiceTest : 10 tests (identité, direct, inverse, pivot XOF, fallback récent, cache, invalider, exception, inputs invalides) - KycDiasporaServiceTest : 19 tests (cohérence valide/sans passeport/pays UEMOA/pays étranger, due diligence PEP/FRA/grey-list/inconnu/UEMOA, seuil EUR/USD avec taux/sans taux/XOF/null)
This commit is contained in:
58
src/main/java/dev/lions/unionflow/server/entity/Devise.java
Normal file
58
src/main/java/dev/lions/unionflow/server/entity/Devise.java
Normal file
@@ -0,0 +1,58 @@
|
||||
package dev.lions.unionflow.server.entity;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Devises supportées par UnionFlow.
|
||||
*
|
||||
* <p>UnionFlow vise prioritairement la zone UEMOA (XOF/XAF) mais s'ouvre à la diaspora
|
||||
* (EUR/USD/GBP/CAD). Le {@link ZoneDevise} permet de discriminer pour les règles
|
||||
* AML (transferts internationaux, due diligence renforcée).
|
||||
*
|
||||
* @since 2026-04-25 (P2-NEW-7)
|
||||
*/
|
||||
public enum Devise {
|
||||
|
||||
// Zone UEMOA / CEMAC
|
||||
XOF("Franc CFA Ouest", ZoneDevise.UEMOA),
|
||||
XAF("Franc CFA Centrale", ZoneDevise.CEMAC),
|
||||
|
||||
// Diaspora — Europe / Amérique
|
||||
EUR("Euro", ZoneDevise.EUROPE),
|
||||
USD("Dollar US", ZoneDevise.AMERIQUE),
|
||||
GBP("Livre Sterling", ZoneDevise.EUROPE),
|
||||
CAD("Dollar Canadien", ZoneDevise.AMERIQUE),
|
||||
CHF("Franc Suisse", ZoneDevise.EUROPE),
|
||||
|
||||
// CEDEAO non-UEMOA (pour intégrations futures)
|
||||
GHS("Cédi Ghanéen", ZoneDevise.CEDEAO),
|
||||
NGN("Naira Nigérian", ZoneDevise.CEDEAO),
|
||||
|
||||
// Maghreb
|
||||
MAD("Dirham Marocain", ZoneDevise.MAGHREB);
|
||||
|
||||
private final String libelle;
|
||||
private final ZoneDevise zone;
|
||||
|
||||
Devise(String libelle, ZoneDevise zone) {
|
||||
this.libelle = libelle;
|
||||
this.zone = zone;
|
||||
}
|
||||
|
||||
public String libelle() { return libelle; }
|
||||
public ZoneDevise zone() { return zone; }
|
||||
|
||||
/** Devise de référence UnionFlow / BCEAO. */
|
||||
public static Devise reference() { return XOF; }
|
||||
|
||||
/** Devises pour lesquelles un transfert depuis/vers UEMOA déclenche AML renforcé. */
|
||||
public static final Set<Devise> DEVISES_INTERNATIONALES = Set.of(EUR, USD, GBP, CAD, CHF);
|
||||
|
||||
public boolean estInternationale() {
|
||||
return DEVISES_INTERNATIONALES.contains(this);
|
||||
}
|
||||
|
||||
public enum ZoneDevise {
|
||||
UEMOA, CEMAC, CEDEAO, EUROPE, AMERIQUE, MAGHREB
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user