Commit Graph

52 Commits

Author SHA1 Message Date
dahoud
f96ab6e86e fix(prod): corriger URL API prod et bundler fonts Roboto
- apiBaseUrl: https://api.lions.devhttps://api.lions.dev/unionflow
  (l'ingress K8s route /unionflow/* vers le backend)
- wsBaseUrl: wss://api.lions.dev → wss://api.lions.dev/unionflow
- Bundler 13 fichiers TTF Roboto dans google_fonts/
  (GoogleFonts.allowRuntimeFetching=false en prod crashait sans fonts locales)
- Déclarer google_fonts/ dans pubspec.yaml assets
2026-04-17 19:20:36 +00:00
dahoud
9ebb845cae feat(dashboards): ajouter RefreshIndicator pull-to-refresh sur 4 dashboards
Le SuperAdmin dashboard avait déjà RefreshIndicator+Completer.
Les 4 autres (OrgAdmin, ActiveMember, SimpleMember, Moderator) n'en avaient pas.

Ajout sur chacun :
- RefreshIndicator avec couleur thème (gold pour OrgAdmin, unionGreen pour les autres)
- AlwaysScrollableScrollPhysics (permet pull-to-refresh même si contenu < écran)
- onRefresh dispatche LoadDashboardData avec orgId + userId du contexte courant
- Délai 1.2s pour laisser le BLoC recharger avant de masquer l'indicateur
2026-04-16 19:57:32 +00:00
dahoud
8f28881c82 fix: ContributionRepository → ContributionRepositoryImpl (nom correct) 2026-04-16 19:47:34 +00:00
dahoud
5dd6535191 fix: corriger 5 erreurs compilation mock-complete
1. confirmerMockPaiement() placé HORS de la classe → déplacé à l'intérieur
   (contribution_repository.dart + transaction_epargne_repository.dart)
2. result.clientReference?.isNotEmpty → null-safe avec ?.
3. IContributionRepository n'a pas confirmerMockPaiement → cast vers
   ContributionRepository (implémentation) avec check is
4. Import data/repositories ajouté dans payment_dialog.dart
2026-04-16 19:46:06 +00:00
dahoud
22fec56fcf fix(wave-mock): appeler mock-complete backend pour créditer réellement les comptes
Le mock simulait seulement l'UI mais n'appelait pas le backend pour
confirmer le paiement → le solde restait à 0 après dépôt simulé.

Fix : en mode mock, après la simulation UI, appeler
GET /api/wave-redirect/mock-complete?ref={id} qui :
- Marque l'intention de paiement comme complétée
- Crédite le compte épargne (pour les dépôts)
- Enregistre le paiement de cotisation (pour les cotisations)

Changements :
- depot_epargne_dialog : appelle confirmerMockPaiement(versementId)
- payment_dialog : appelle confirmerMockPaiement(clientReference)
- transaction_epargne_repository : nouvelle méthode confirmerMockPaiement()
  + versementId ajouté à DepotWaveResult
- contribution_repository : nouvelle méthode confirmerMockPaiement()
  + intentionPaiementId ajouté à WavePaiementInitResult
2026-04-16 19:39:27 +00:00
dahoud
1d20687a43 feat(wave-mock): simuler le paiement Wave en mode dev (épargne + cotisations)
En mode dev (URL contient 'mock' ou 'localhost', ou !AppConfig.isProd),
le paiement Wave est simulé directement sans ouvrir le navigateur :
- Dépôt épargne (depot_epargne_dialog.dart) : simulation 800ms + SnackBar succès
- Paiement cotisation (payment_dialog.dart) : même pattern

En mode prod : comportement inchangé (ouvre l'app Wave via launchUrl).

Pattern identique à wave_payment_page.dart (onboarding souscription)
appliqué à tous les flux Wave de l'application.
2026-04-16 19:29:26 +00:00
dahoud
18203f07b2 fix(epargne): corriger URL dépôt épargne /api/paiements → /api/versements
L'endpoint de dépôt épargne est dans VersementResource, pas PaiementResource :
- Mobile appelait : POST /api/paiements/initier-depot-epargne-en-ligne → 405
- Backend expose : POST /api/versements/initier-depot-epargne
Corrigé le path + retiré le suffixe '-en-ligne' (absent du backend).
2026-04-16 19:08:17 +00:00
dahoud
36a39433c2 fix(payment): overflow 2px sur le nom d'organisation dans la carte montant
Le Column du nom d'organisation n'était pas dans un Flexible — si le nom
est long, le Row débordait. Ajout Flexible + maxLines: 1 + ellipsis.
2026-04-16 19:03:15 +00:00
dahoud
14ecdd642b feat(members): filtres toujours visibles + filtre par rôle + refresh AppBar
Améliorations UX Annuaire Membres (parité avec Gestion Organisations) :

1. Panneau recherche/filtres toujours visible (plus de toggle collapsible)
   → UX plus directe, pas de clic supplémentaire pour chercher

2. Filtre par rôle (nouveau) : chips Admin, Modérateur, Membre Actif, Membre Simple
   avec icône badge devant la rangée, couleur accent différente du statut

3. Bouton Refresh ajouté dans l'AppBar (cohérence avec la page Organisations)

4. Lien 'Réinitialiser les filtres' visible quand au moins un filtre est actif

5. _filteredMembers intègre le filtre rôle via _roleFilterMapping

Supprimé :
- _isSearchExpanded (plus utile — panneau toujours visible)
- Bouton toggle search dans l'AppBar (remplacé par affichage permanent)
2026-04-16 15:05:07 +00:00
dahoud
989b411afe feat(organizations): parité UX avec Annuaire Membres — filtres statut + grille + swipe
3 fonctionnalités ajoutées pour aligner avec l'UX de l'Annuaire Membres :

1. Filtres par statut (chips) : Tous, Active, En création, Inactive, Suspendue, Dissoute
   Chips horizontaux scrollables sous la barre de recherche, filtre local
   (combiné avec le filtre par type de la TabBar + recherche texte)

2. Vue grille toggle : bouton grid/list dans l'AppBar
   Grid 2 colonnes avec cartes compactes (icône, nom, statut, type, localisation, membres)

3. Swipe actions : swipe DROIT → modifier, swipe GAUCHE → supprimer
   Uniquement pour SuperAdmin/OrgAdmin (canManage=true)
   Background coloré avec icônes + labels
   confirmDismiss retourne false → la carte ne disparaît pas
2026-04-16 14:58:29 +00:00
dahoud
f74f13c174 feat(org-types): retirer le champ code du formulaire de création
Le code technique est désormais auto-généré par le backend depuis le libellé.

Création : le champ code est supprimé du formulaire. Le backend génère
automatiquement un code UPPER_SNAKE_CASE depuis le libellé saisi.

Édition : le code existant est affiché en lecture seule (container gris monospace)
pour information — non modifiable (les types système sont protégés).

Le paramètre code: '' est envoyé en création (le backend détecte le vide et
auto-génère).
2026-04-16 10:21:43 +00:00
dahoud
0626bb0c27 docs: archiver rapports historiques + fixer lien cassé communication README
Archivés dans docs/archive/ :
- TACHES_70_TRAITEES.md, TACHES_RESTANTES_SOURCE.md (historique mars 2026)
- TESTS_UNITAIRES_PROGRESS.md (progression ancienne)
- TASK_5_COMPLETION_REPORT.md, TASK_6_WEBSOCKET_COMPLETION_REPORT.md (rapports figés)

Fix : communication/README.md → lien vers AUDIT_METIER_COMPLET.md (cassé)
remplacé par lien vers constitution.md (existant)
2026-04-16 09:32:40 +00:00
dahoud
5984e64dc2 chore(gitignore): ajout secrets Android/iOS + Flutter dev tools
Ajouts critiques pour éviter les fuites de secrets :
- Android signing : key.properties, *.jks, *.keystore, google-services.json
  (local.properties déjà ignoré via android/.gitignore)
- iOS : xcuserdata/, Pods/, GoogleService-Info.plist, Flutter/Generated.xcconfig
- Flutter Version Management : .fvm/
- DevTools : devtools_options.yaml
- Build multi-plateforme : windows/linux/macos flutter ephemeral
- Obfuscation maps + symbols
- Dumps / crashes : *.stackdump, hs_err_pid*
- OS artefacts : .DS_Store, Thumbs.db, desktop.ini
2026-04-15 23:19:22 +00:00
dahoud
970e7063c5 chore: lib/main.dart — entry point avec environnement configuré 2026-04-15 20:27:50 +00:00
dahoud
22dece52ef test: couverture tests modules (communication, contributions, dashboard, events, members, organizations, profile, reports, settings, finance_workflow, core/network) 2026-04-15 20:27:38 +00:00
dahoud
7cd7c6fc9e feat(shared): legacy presentation/ + shared design system + widgets
- lib/presentation : pages legacy (explore/network, notifications) avec BLoC
- lib/shared/design_system : UnionFlow Design System v2 (tokens, components)
  + MD3 tokens + module_colors par feature
- lib/shared/widgets : widgets transversaux (core_card, core_shimmer,
  error_widget, loading_widget, powered_by_lions_dev, etc.)
- lib/shared/constants + utils
2026-04-15 20:27:23 +00:00
dahoud
744faa3a9c feat(features): refontes onboarding/organizations/profile/reports/settings/solidarity
- onboarding : datasource souscription, models formule/status, bloc complet
- organizations : bloc orgs + switcher + types bloc, models, pages edit/create
- profile : bloc complet avec change password, delete account, preferences
- reports : bloc avec DashboardReports + ScheduleReports + GenerateReport
- settings : language, privacy, feedback pages
- solidarity : bloc complet demandes d'aide (CRUD, approuver, rejeter)
2026-04-15 20:27:12 +00:00
dahoud
dbf6a972ba feat(features): refontes explore/feed/finance_workflow/help/logs/members/notifications
- explore + feed : pages de découverte (réseau, fil d'actualité)
- finance_workflow : approvals bloc + budgets bloc + dialogs
- help : support page avec FAQ + contact
- logs : monitoring bloc avec metrics + alerts + searchLogs
- members : recherche avancée, bulk actions, bloc complet, import/export
- notifications : bloc + page
2026-04-15 20:27:01 +00:00
dahoud
120434aba0 feat(features): refontes adhesions/admin/auth/backup/contributions/dashboard/epargne/events
- adhesions : bloc complet avec events/states/model, dialogs paiement/rejet
- admin : users bloc, user management list/detail pages
- authentication : bloc + keycloak auth service + webview
- backup : bloc complet, repository, models
- contributions : bloc + widgets + export
- dashboard : widgets connectés (activities, events, notifications, search)
  + charts + monitoring + shortcuts
- epargne : repository, transactions, dialogs
- events : bloc complet, pages (detail, connected, wrapper), models
2026-04-15 20:26:48 +00:00
dahoud
45dcd2171e feat(communication): module messagerie unifié + contact policies + blocages
Aligné avec le backend MessagingResource :
- Nouveau module communication (conversations, messages, participants)
- Respect des ContactPolicy (qui peut parler à qui par rôle)
- Gestion MemberBlock (blocages individuels)
- UI : conversations list, conversation detail, broadcast, tiles
- BLoC : MessagingBloc avec events (envoyer, démarrer conversation rôle, etc.)
2026-04-15 20:26:35 +00:00
dahoud
07b8488714 feat(core): refonte architecture transverse (cache, network, websocket, DI)
- lib/app : app.dart, router mis à jour (routes nouveaux modules)
- lib/core/cache : cache_service + cached_datasource_decorator
- lib/core/network : api_client, offline_manager, retry_policy
- lib/core/websocket : websocket service (reconnexion exponentielle, heartbeat)
- lib/core/di : injection + register_module
- lib/core/storage : pending_operations_store (offline support)
- lib/core/navigation : main_navigation_layout (onglets par rôle)
- lib/core/config : environment, lcb_ft_constants
- lib/core/utils : error_formatter, validators
- pubspec.yaml/lock : dépendances mises à jour
2026-04-15 20:26:20 +00:00
dahoud
3a2c8a808f chore(platform): assets app + config Android/iOS + screenshots
- Icônes app (hdpi/mdpi/xhdpi/xxhdpi/xxxhdpi + iOS AppIcon) régénérées
- Launch screens Android + iOS actualisés
- ios/Runner : Info.plist, LaunchScreen.storyboard, project.pbxproj
- android/gradle.properties, drawables, styles (values + values-night)
- assets/images : branding/logo
- Screenshots Flutter (flutter_01-04.png) + script PowerShell start-emulators
2026-04-15 20:26:11 +00:00
dahoud
fa232f8634 chore(dev): revert IP LAN 192.168.1.13 → 192.168.1.145
android/local.properties non versionné (gitignored)
2026-04-15 20:15:10 +00:00
dahoud
ba779a7a40 feat(ui): dark mode adaptatif sur 15 pages/widgets restants
Pattern AppColors pair (isDark ternaries) appliqué sur :
- login_page : SnackBar error color Color(0xFFDC2626) → AppColors.error
  (gradient brand intentionnel non modifié)
- help_support : barre de recherche + ExpansionTile + chevrons → scheme adaptatif
- system_settings : état 'Accès réservé' + unselectedLabelColor TabBar
- epargne : date/description/boutons OutlinedButton foregroundColor adaptatifs
- conversation_tile, connected_recent_activities, connected_upcoming_events
- dashboard_notifications_widget
- budgets_list_page, pending_approvals_page, approve/reject_dialog
- create_organization_page, edit_organization_page, about_page

Les couleurs sémantiques (error, success, warning, primary) restent inchangées.
Les blancs/gradients intentionnels (AppBars brand, logos payment) préservés.
2026-04-15 20:14:59 +00:00
dahoud
b2f29922d3 feat(navigation): titre 'Mon/Mes Organisations' dynamique + fallback modules
Plus page (more_page.dart) :
- Titre entrée Organisations dynamique selon rôle/nombre d'orgs :
  * SuperAdmin → 'Gestion des Organisations'
  * OrgAdmin 1 org → 'Mon Organisation'
  * OrgAdmin 2+ orgs → 'Mes Organisations'
- Sous-titres adaptés
- Helpers _orgTitle/_orgSubtitle utilisent OrgSwitcherBloc pour le count
- 7 modules non encore implémentés (TONTINE, CREDIT, AGRICULTURE, COLLECTE_FONDS,
  PROJETS_ONG, CULTE_DONS, VOTES) : Navigator.pushNamed remplacé par _comingSoon()
  SnackBar 'Disponible prochainement' (les routes n'étaient enregistrées nulle part)
- Entrée 'Comptes épargne' → 'Épargne & Crédit' (terme métier pour mutuelles)

Organizations page :
- AppBar title dynamique via _appBarTitle() (même logique que more_page)
- SnackBars OrganizationCreated/Updated/Deleted : Color(0xFF16A34A) → AppColors.success
2026-04-15 20:14:42 +00:00
dahoud
21b519de53 feat(onboarding): UI/UX polish + mapping typeOrg + gestion erreur paiement Wave
Plan selection :
- Grille 2×2 compacte pour les plages (au lieu de liste verticale)
- Badge  POPULAIRE sur STANDARD
- Remise annuelle affichée (−X%/an)
- AnimatedSwitcher + auto-scroll vers formules quand plage sélectionnée
- Dark mode adaptatif complet

Récapitulatif :
- Dark mode complet (AppColors pairs)
- Bloc Total gradient gold adaptatif
- NoteBox avec backgrounds accent.withOpacity()
- Utilise OnboardingBottomBar (consistence)

Payment method :
- Dark mode + couleurs de marque Wave/Orange hardcodées (intentionnel)
- Logo container reste blanc (brand)
- Mapping typeOrganisation détaillé → enum backend ASSOCIATION/MUTUELLE/
  COOPERATIVE/FEDERATION (fix HTTP 400 'Valeur invalide pour typeOrganisation')

Wave payment :
- Dark mode adaptatif
- Message dev clair (simulation automatique)
- Gestion OnboardingPaiementEchoue : SnackBar rouge + reset flags + reste sur page
  (plus de faux succès quand confirmerPaiement() return false ou lève exception)

Bloc : nouvel état OnboardingPaiementEchoue, _onRetourDepuisWave vérifie le return
de confirmerPaiement() (plus de catch silencieux qui émettait OnboardingPaiementConfirme)

Shared widgets : OnboardingSectionTitle + OnboardingBottomBar dark mode + hint optionnel
2026-04-15 20:14:27 +00:00
dahoud
36a903c80e feat(members): swipe par rôle + suppression SuperAdmin avec cascade UX
Swipe actions différenciées par rôle :
- SuperAdmin : → Reset MDP, ← Affecter Org
- OrgAdmin  : → Reset MDP, ← lifecycle selon statut (Suspendre/Activer/Réactiver)
  (masqué si cible = ORGADMIN/SUPERADMIN — cohérent avec guard backend)
- Autres rôles : → Reset MDP seulement

Suppression compte (SuperAdmin uniquement) :
- Nouveau callback onDeleteAccount dans MembersPage + MemberDetailPage
- Bouton rouge 'Supprimer ce compte' dans action sheet (zone destructive)
- Dialog de confirmation adaptatif dark/light avec badge admin si cible ORGADMIN
- Bouton caché si compte déjà désactivé (actif=false)
- Bannière 'Compte désactivé' visible sur page détail d'un compte soft-deleted
- BlocListener MembreDeleted : SnackBar + maybePop() + reload liste
- Bloc gère 409 Conflict (mono-admin) → MembresActionForbidden avec message backend

Nouvelles signatures :
- onLifecycleAction : (memberId, organisationId, action, motif) — inclut orgId
  pour permettre au SuperAdmin d'agir via l'org du membre lui-même
- 'actif' et 'roleCode' exposés dans la map via _convertMembreToMap
2026-04-15 20:14:08 +00:00
dahoud
55f84da49a feat(ui): RefreshIndicator + AlwaysScrollable + dark mode sur 14 pages
RefreshIndicator ajouté (dispatche les events BLoC appropriés) :
- adhesion_detail, adhesions_page, demande_aide_detail, demandes_aide_page
- event_detail, organization_detail, org_selector, org_types
- user_management_detail, reports (TabBarView), logs (Dashboard tab)
- profile (onglet Perso), backup (3 onglets), notifications

Fixes associés :
- AlwaysScrollableScrollPhysics sur tous les scroll widgets
  (permet pull-to-refresh même si contenu < écran)
- Empty states des listes : wrappés dans SingleChildScrollView pour refresh
- Dark mode adaptatif sur textes/surfaces/borders hardcodés
- backup_page : bouton retour ajouté dans le header gradient
- org_types : chevron/star/border adaptatifs
- reports : couleurs placeholders graphique + chevrons
2026-04-15 20:13:50 +00:00
dahoud
f78892e5f6 fix(dashboards): dark mode + scrolledUnderElevation + DashboardInitial
- SuperAdminDashboard : scrolledUnderElevation 1→0 (pas de tint surface sur gradient)
- OrgAdminDashboard : idem + gestion état DashboardInitial (plus de blanc flash)
- VisitorDashboard : tous les conteneurs body + bouton outline → AppColors pairs
  (surface/border/textPrimary/textSecondary remplacés par isDark ternaires)
2026-04-15 20:13:34 +00:00
dahoud
0abcdcc478 feat(design-system): dark mode adaptatif sur widgets partagés
Pattern AppColors pair (isDark ? AppColors.surfaceDark : AppColors.surface)
appliqué sur :
- UnionStatWidget, UnionBalanceCard, UnionActionButton, UFSectionHeader
- DashboardEventRow, DashboardActivityRow, UnionExportButton
- MiniAvatar (border adaptatif)
- ConfirmationDialog (cancel colors adaptés)
- FileUploadWidget (textSecondary adaptatif)

Les couleurs surface/border/textPrimary/textSecondary hardcodées (light-only)
sont remplacées par les paires *Dark conditionnelles.
Les couleurs sémantiques (error, success, warning, primary) restent inchangées.
2026-04-15 20:13:22 +00:00
dahoud
318195c6fd feat(dev): centraliser l'IP LAN dans android/local.properties — source unique
- build.gradle : tâche generateDevConfig qui propage dev.host vers
  network_security_config.xml et lib/core/config/local_config.dart à chaque build
- environment.dart : import kDevHost depuis local_config.dart pour les URLs dev
  (apiBaseUrl, keycloakBaseUrl, wsBaseUrl) — plus de constante IP hardcodée
- local_config.dart : fichier auto-généré (ne pas éditer directement)
- network_security_config.xml : autorisation cleartext pour 192.168.1.13

Pour changer l'IP : modifier uniquement android/local.properties → dev.host
2026-04-12 14:51:36 +00:00
dahoud
cf2866a0aa fix(UI-02): guards rôle sur pages organisations — FAB, édition, suppression SUPER_ADMIN only
- OrgTypesPage: FAB création, tap/édition/suppression type visibles uniquement SUPER_ADMIN
- OrganizationDetailPage: bouton édition visible orgAdmin+superAdmin, suppression SUPER_ADMIN only, section Actions cachée si non autorisé
2026-04-11 01:27:42 +00:00
dahoud
04896349d6 fix: BUG-02 IC-03 session expirée sur Workflow Financier et Messagerie
Ajoute KeycloakAuthService.getValidAccessToken() qui vérifie l'expiration
du JWT et rafraîchit automatiquement avant de retourner le token.

FinanceWorkflowRemoteDatasource et MessagingRemoteDatasource injectent
désormais KeycloakAuthService au lieu de FlutterSecureStorage directement,
ce qui évite d'envoyer un Bearer expiré et d'obtenir un 401 silencieux.
2026-04-10 20:53:28 +00:00
dahoud
70cbd1c873 fix(mobile): URL changement mdp corrigée + v3.0 — multi-org, AppAuth, sécurité prod
Auth:
- profile_repository.dart: /api/auth/change-password → /api/membres/auth/change-password

Multi-org (Phase 3):
- OrgSelectorPage, OrgSwitcherBloc, OrgSwitcherEntry
- org_context_service.dart: headers X-Active-Organisation-Id + X-Active-Role

Navigation:
- MorePage: navigation conditionnelle par typeOrganisation
- Suppression adaptive_navigation (remplacé par main_navigation_layout)

Auth AppAuth:
- keycloak_webview_auth_service: fixes AppAuth Android
- AuthBloc: gestion REAUTH_REQUIS + premierLoginComplet

Onboarding:
- Nouveaux états: payment_method_page, onboarding_shared_widgets
- SouscriptionStatusModel mis à jour StatutValidationSouscription

Android:
- build.gradle: ProGuard/R8, network_security_config
- Gradle wrapper mis à jour
2026-04-07 20:56:03 +00:00
dahoud
22f9c7e9a1 fix(nav): supprimer onNavigate de DashboardDrawer et tous ses appelants 2026-04-05 13:48:16 +00:00
dahoud
7686eb647f fix(nav): supprimer les modules metier du drawer — ils appartiennent uniquement a la page Plus 2026-04-05 13:46:08 +00:00
dahoud
289efc4956 feat(mobile): consolidation modules epargne, messaging, organisations
- Epargne: badge LCB-FT (bouclier ambre) sur comptes avec fonds bloques + note recap
- EpargneDetail: historique pagine (page/size), affichage soldeAvant/soldeApres/motif dans chaque transaction, bouton "Charger plus"
- TransactionEpargneRepository: getByCompte accepte page et size, gere reponse paginee Spring (content[])
- MessagingDatasource: markMessageAsRead silencieuse (pas d'endpoint unitaire), getUnreadCount somme unreadCount des conversations
- OrganizationDetail: _memberCount charge le vrai nombre depuis GET /membres/count, affiche la valeur reelle au lieu de nombreMembres (toujours 0)
2026-04-05 13:37:21 +00:00
dahoud
65b5c79c43 feat(auth): gestion reAuthRequired + suppression flux changement mot de passe manuel
- AuthStatusResult: nouveau champ reAuthRequired (ancien compte nécessitant UPDATE_PASSWORD)
- AuthBloc._onLoginRequested: si reAuthRequired → logout silencieux + re-déclenchement AppAuth
  automatique (Keycloak affiche l'écran de changement de mot de passe dans Chrome Custom Tab)
- AuthBloc._onStatusChecked: si reAuthRequired → logout + AuthUnauthenticated (redirection login)
- Remplacement du flux premierLoginComplet (boolean) par enum côté backend
- Suppression de AuthPasswordChangeRequired, AuthPasswordChanging, change_password_page.dart
2026-04-05 11:13:36 +00:00
dahoud
5383df6dcb refactoring 2026-03-31 09:14:47 +00:00
dahoud
9bfffeeebe Refactoring - Version stable 2026-03-28 16:16:33 +00:00
dahoud
b650734075 Refactoring - Version stable 2026-03-28 15:33:44 +00:00
dahoud
95d0e4502e Refactoring - Version stable 2026-03-28 14:35:32 +00:00
dahoud
d0e61ead97 Refactoring - Version stable 2026-03-28 14:25:59 +00:00
dahoud
11f9135f90 Refactoring - Version stable 2026-03-28 14:22:16 +00:00
dahoud
33134f834e feat(mobile): T027 - intégrer KycStatusWidget dans ProfilePage
- Import KycStatusWidget dans ProfilePage
- Ajout BlocBuilder dans _buildSecurityTab()
- Affichage KYC en premier dans onglet Sécurité
- Données depuis ProfileLoaded state (niveauVigilanceKyc, statutKyc, dateVerificationIdentite)

Spec 001-mutuelles-anti-blanchiment - Phase 4 Mobile
Task T027 complétée : Widget KYC intégré dans UI profil

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-03-17 11:02:20 +00:00
dahoud
b63fc46182 feat(mobile): amélioration UX NotImplementedFailure + SnackbarHelper
- NotImplementedFailure: ajout userFriendlyMessage et icon construction (blue)
- ErrorDisplayWidget: support spécial pour NotImplementedFailure (bientôt disponible)
- SnackbarHelper: classe centralisée pour messages cohérents (success, error, warning, info, notImplemented)
- budgets_list_page: remplace generic snackbar par SnackbarHelper.showNotImplemented
- conversations_page: remplace 2 TODOs par SnackbarHelper.showNotImplemented
- export_members: met à jour TODO obsolète (endpoint PDF maintenant disponible)
- cache_service: fix AppLogger.error calls (error: named param)
- cached_datasource_decorator: fix AppLogger.error call

Task #64 - Fix Snackbar Placeholders + NotImplementedFailure UX
2026-03-17 10:06:21 +00:00
dahoud
f4bdd81141 feat(mobile): implémentation 8 méthodes workflow financier manquantes
Datasource (finance_workflow_remote_datasource.dart) :
- requestApproval() : POST /api/finance/approvals (avec organizationId optionnel)
- getApprovalsHistory() : GET /api/finance/approvals/history (date + statut)
- updateBudget() : PUT /api/finance/budgets/{id} (updates map)
- deleteBudget() : DELETE /api/finance/budgets/{id}
- getWorkflowStats() : GET /api/finance/stats
- getAuditLogs() : GET /api/finance/audit-logs (filtres complets)
- getAnomalies() : GET /api/finance/audit-logs/anomalies
- exportAuditLogs() : POST /api/finance/audit-logs/export (format CSV/PDF)

Repository (finance_workflow_repository_impl.dart) :
- Remplacement de 8 NotImplementedFailure par vraies implémentations
- Conversion enums (TransactionType, ApprovalStatus, etc.) → String avec .name
- Gestion réseau : NetworkInfo check + RetryPolicy + exception mapping
- FinancialAuditLog.fromJson() pour convertir réponses audit/anomalies

Résultat : 0 erreur compilation, workflow financier 100% fonctionnel

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-03-16 21:17:37 +00:00
dahoud
2639850861 feat(mobile): implémentation feedback + correction URLs inscriptions
Connecte le frontend mobile aux nouveaux endpoints backend événements.

## Repository Interface (evenement_repository.dart)
-  Ajout submitFeedback(evenementId, note, commentaire)
-  Ajout getFeedbacks(evenementId) → retourne feedbacks + stats

## Repository Impl (evenement_repository_impl.dart)
-  Correction inscrireEvenement : /inscrire → /inscriptions (POST)
-  Correction desinscrireEvenement : /desinscrire → /inscriptions (DELETE)
-  Implémentation submitFeedback : POST /api/evenements/{id}/feedback
-  Implémentation getFeedbacks : GET /api/evenements/{id}/feedbacks
- Gestion erreurs 400 (déjà soumis, pas participant, etc.)

## Use Case (submit_event_feedback.dart)
-  Remplacement UnimplementedError par appel repository
-  Validation note 1-5
-  Transmission note + commentaire optionnel

## Fonctionnalités débloquées
- Inscription/désinscription événements  (URLs corrigées)
- Soumission feedback post-événement 
- Consultation feedbacks + note moyenne 

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-03-16 20:15:35 +00:00
dahoud
df1e8f417d feat(mobile): intégration complète API messagerie backend
Connecte le système de communication mobile aux endpoints backend créés.

## Datasource (messaging_remote_datasource.dart)
-  Correction URLs : /api/messaging/* → /api/conversations et /api/messages
-  Ajout archiveConversation (PUT /api/conversations/{id}/archive)
-  Ajout markConversationAsRead (PUT /api/conversations/{id}/mark-read)
-  Ajout toggleMuteConversation (PUT /api/conversations/{id}/toggle-mute)
-  Ajout togglePinConversation (PUT /api/conversations/{id}/toggle-pin)
-  Ajout editMessage (PUT /api/messages/{id})
-  Ajout deleteMessage (DELETE /api/messages/{id})
- Correction paramètres : organizationId → organisationId (backend)
- Ajout type: GROUP dans createConversation (requis par backend)

## Repository (messaging_repository_impl.dart)
Remplacement 6 stubs NotImplementedFailure par vrais appels API :
-  archiveConversation : appel datasource avec gestion erreurs
-  markConversationAsRead : appel datasource avec gestion erreurs
-  toggleMuteConversation : appel datasource avec gestion erreurs
-  togglePinConversation : appel datasource avec gestion erreurs
-  editMessage : appel datasource avec gestion erreurs + NotFoundException
-  deleteMessage : appel datasource avec gestion erreurs + NotFoundException

## État final
- 14 méthodes implémentées (sur 22 définies dans le repository)
- 8 stubs restants (templates + sendTargetedMessage) → backend non implémenté
- Analyse Flutter : 0 erreur de compilation (990 warnings de style)
- Communication feature : 100% fonctionnelle côté CRUD de base

Débloquer la fonctionnalité Communication mobile (était 100% stubs).

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-03-16 06:46:47 +00:00
dahoud
5c5ec3ad00 docs(mobile): documentation complète Spec 001 + architecture
Documentation ajoutée :
- ARCHITECTURE.md : Clean Architecture par feature, BLoC pattern
- OPTIMISATIONS_PERFORMANCE.md : Cache multi-niveaux, pagination, lazy loading
- SECURITE_PRODUCTION.md : FlutterSecureStorage, JWT, HTTPS, ProGuard
- CHANGELOG.md : Historique versions
- CONTRIBUTING.md : Guide contribution
- README.md : Mise à jour (build, env config)

Widgets partagés :
- file_upload_widget.dart : Upload fichiers (photos/PDFs)

Cache :
- lib/core/cache/ : Système cache L1/L2 (mémoire/disque)

Dependencies :
- pubspec.yaml : file_picker 8.1.2, injectable, dio

Spec 001 : 27/27 tâches (100%)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-03-16 05:15:38 +00:00