Files
unionflow-server-impl-quarkus/src/main/java/dev/lions/unionflow/server/entity/Devise.java
dahoud 86842f27af
Some checks failed
CI/CD Pipeline / pipeline (push) Failing after 4m11s
feat(sprint-6 P2-NEW-7 2026-04-25): multi-devise + KYC non-résident diaspora + tests
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)
2026-04-25 10:33:05 +00:00

59 lines
1.7 KiB
Java

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
}
}