Apporte aux compliance officers et controleurs internes l'accès mobile au tableau de bord de conformité backend (P1-NEW-7). Et prépare la diaspora avec Devise enum + sélecteur préférence persisté. Feature Compliance (Clean Architecture) - Domain : ComplianceSnapshot + ConformiteIndicateur (Equatable), helpers scoreSeverite + hasAlertesCritiques - Data : ComplianceSnapshotModel.fromJson (parsing tolerant aux nullables), ComplianceRemoteDataSourceImpl Dio (GET /api/compliance/dashboard), ComplianceRepositoryImpl @Injectable - Presentation : ComplianceBloc (Load/Refresh events, Initial/Loading/Loaded/Error states), ConformiteDashboardPage (Material 3, ScoreCard 0-100 colorée, 9 IndicateurTile, AlertesCard rouge si critiques) Feature Devise - Devise enum (10 valeurs miroirs backend, code/libelle/zone) - fromCode tolérant casse + null/vide → XOF - estInternationale pour AML - DeviseSelector widget DropdownButtonFormField + readPreferred/writePreferred via FlutterSecureStorage (clé unionflow.devise.preferee) Tests (17/17 verts) - ComplianceSnapshot : 7 tests (scoreSeverite × 3, hasAlertesCritiques × 4) - ComplianceSnapshotModel.fromJson : 4 tests (complet, fallbacks, string→double, indicateur invalide) - Devise enum : 6 tests (reference, fromCode parse, fromCode null/inconnu, estInternationale × 2, intégrité valeurs) Note : feature reporting trimestriel mobile (PDF viewer + bloc liste) reportée à un sprint dédié — nécessite intégration pdf viewer + cache local non triviale.
42 lines
1.3 KiB
Dart
42 lines
1.3 KiB
Dart
/// Devises supportées par UnionFlow (miroir mobile de l'enum backend).
|
|
///
|
|
/// Les codes ISO-4217 servent aussi d'identifiant pour l'API.
|
|
enum Devise {
|
|
xof('XOF', 'Franc CFA Ouest', 'UEMOA'),
|
|
xaf('XAF', 'Franc CFA Centrale', 'CEMAC'),
|
|
eur('EUR', 'Euro', 'EUROPE'),
|
|
usd('USD', 'Dollar US', 'AMERIQUE'),
|
|
gbp('GBP', 'Livre Sterling', 'EUROPE'),
|
|
cad('CAD', 'Dollar Canadien', 'AMERIQUE'),
|
|
chf('CHF', 'Franc Suisse', 'EUROPE'),
|
|
ghs('GHS', 'Cédi Ghanéen', 'CEDEAO'),
|
|
ngn('NGN', 'Naira Nigérian', 'CEDEAO'),
|
|
mad('MAD', 'Dirham Marocain', 'MAGHREB');
|
|
|
|
final String code;
|
|
final String libelle;
|
|
final String zone;
|
|
const Devise(this.code, this.libelle, this.zone);
|
|
|
|
/// Devise de référence UnionFlow.
|
|
static Devise reference() => Devise.xof;
|
|
|
|
/// Parse un code ISO-4217 en {@link Devise}, fallback sur XOF.
|
|
static Devise fromCode(String? code) {
|
|
if (code == null || code.isEmpty) return reference();
|
|
return Devise.values.firstWhere(
|
|
(d) => d.code.toUpperCase() == code.toUpperCase(),
|
|
orElse: () => reference(),
|
|
);
|
|
}
|
|
|
|
/// True pour les devises internationales (déclenchent AML international).
|
|
bool get estInternationale => const {
|
|
Devise.eur,
|
|
Devise.usd,
|
|
Devise.gbp,
|
|
Devise.cad,
|
|
Devise.chf,
|
|
}.contains(this);
|
|
}
|