Commit Graph

72 Commits

Author SHA1 Message Date
dahoud
4d096a4791 Refactoring - Version stable 2026-03-28 15:15:24 +00:00
dahoud
607d31d2fc Refactoring - Version stable 2026-03-28 14:37:57 +00:00
dahoud
a740c172ef Refactoring - Version stable 2026-03-28 14:21:30 +00:00
dahoud
00b981c510 fix(backend): corriger format log UUID dans OrganisationResource
Erreur corrigée : UUID passé à %d (entier) au lieu de %s (string)
- OrganisationResource.java:227 : LOG.infof(..., %s, id)

Note : 36 tests échouent encore (problèmes d'auth, validation, NPE)
Couverture actuelle : 50% (objectif 100% reporté)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-03-18 02:08:27 +00:00
dahoud
d15324bd41 feat(backend): ajout export PDF pour les membres
Nouveau format d'export :
- GET /api/membres/export?format=PDF - Export membres en PDF (OpenPDF)
- Support formats : EXCEL, CSV, PDF (dans MembreResource)

MembreImportExportService :
- exporterVersPDF() : 193 lignes, génération PDF professionnelle
  * Document A4 landscape pour + de colonnes
  * Titre + métadonnées (date, total)
  * Table avec colonnes configurables (PERSO, CONTACT, ADHESION, ORGANISATION)
  * Styles : headers (bleu foncé, blanc), données (noir, aligné)
  * Page statistiques optionnelle (total, actifs/inactifs/suspendus, orgs)
- Méthodes helper : createHeaderCell, createDataCell, createStatsCell, ajouterStatistiquesPDF

MembreService :
- exporterVersPDF() : délégation vers MembreImportExportService

MembreResource :
- Mise à jour endpoint /export : if ("PDF".equalsIgnoreCase(format))
- Content-Type: application/pdf
- Filename: membres_export_YYYY-MM-DD.pdf

Correctifs imports :
- Résolution conflits OpenPDF vs Apache POI (List, Row, Font)
- Imports spécifiques : com.lowagie.text.Font, Document, PdfPTable, etc.
- Qualification complète pour éviter ambiguïtés (java.util.List vs com.lowagie.text.List)

Résultat : Export membres en 3 formats (EXCEL, CSV, PDF) 

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-03-17 08:40:29 +00:00
dahoud
1c096f0ee1 feat(backend): ajout 8 endpoints manquants workflow financier
Endpoints ajoutés :
- POST /api/finance/approvals - requestApproval (avec organizationId)
- GET /api/finance/approvals/history - historique filtrable
- PUT /api/finance/budgets/{id} - updateBudget (name, description, status)
- DELETE /api/finance/budgets/{id} - deleteBudget (soft delete)
- GET /api/finance/stats - statistiques workflow global
- GET /api/finance/audit-logs - logs d'audit filtrables
- GET /api/finance/audit-logs/anomalies - détection anomalies
- POST /api/finance/audit-logs/export - export CSV/PDF

Services :
- ApprovalService.requestApproval() : logique niveaux LEVEL1/2/3 selon montant
- ApprovalService.getApprovalsHistory() : filtres date + statut
- BudgetService.updateBudget() : validation statut + approbation
- BudgetService.deleteBudget() : soft delete (actif=false)

Notes :
- Niveau approbation : <100K=NONE, 100K-1M=LEVEL1, 1M-5M=LEVEL2, >5M=LEVEL3
- organizationId optionnel dans requestApproval (pas de récup auto depuis Membre)
- FinanceWorkflowResource créé pour stats/audit (implémentation stub)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-03-16 21:17:18 +00:00
dahoud
a7bcaf9277 feat(backend): endpoints inscriptions + feedback événements
Ajoute infrastructure complète pour gérer inscriptions et feedbacks événements.

## Entités
- FeedbackEvenement : note 1-5, commentaire, modération (PUBLIE/EN_ATTENTE/REJETE)
- InscriptionEvenement : déjà existait, utilisation ajoutée

## Repositories
- InscriptionEvenementRepository : findByMembreAndEvenement, findByEvenement, countConfirmees, isMembreInscrit
- FeedbackEvenementRepository : findByMembreAndEvenement, findPubliesByEvenement, calculateAverageNote

## Service (EvenementService)
Inscriptions :
- inscrireEvenement() : vérifie capacité, crée inscription CONFIRMEE
- desinscrireEvenement() : soft delete inscription
- getParticipants() : liste inscriptions confirmées
- getMesInscriptions() : inscriptions du membre connecté

Feedbacks :
- soumetteFeedback() : note 1-5 + commentaire, vérifie participation, événement terminé
- getFeedbacks() : liste feedbacks publiés
- getStatistiquesFeedback() : note moyenne + nombre feedbacks

## REST Endpoints (6 total)
Inscriptions :
- POST /api/evenements/{id}/inscriptions - S'inscrire
- DELETE /api/evenements/{id}/inscriptions - Se désinscrire
- GET /api/evenements/{id}/participants - Liste participants
- GET /api/evenements/mes-inscriptions - Mes inscriptions

Feedbacks :
- POST /api/evenements/{id}/feedback - Soumettre feedback (note+commentaire)
- GET /api/evenements/{id}/feedbacks - Liste feedbacks + stats

## Database
- Migration V7 : table feedbacks_evenement
- Contrainte unique: un feedback par membre/événement
- Index: membre_id, evenement_id, date_feedback, moderation_statut

Débloquer fonctionnalités événements mobile.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-03-16 20:11:03 +00:00
dahoud
3be01e28a7 feat(backend): implémentation complète du système de messagerie
Ajoute l'infrastructure backend complète pour les conversations et messages :

## Entités
- Conversation : conversations individuelles, groupes, broadcast, annonces
- Message : messages avec statut, priorité, pièces jointes, soft delete

## Repositories
- ConversationRepository : findByParticipant, findByIdAndParticipant (sécurité)
- MessageRepository : findByConversation, countUnread, markAsRead

## Services
- ConversationService : CRUD conversations, archive, mute, pin
- MessageService : send, edit, delete, getMessages

## REST Endpoints (12 total)
- GET /api/conversations - Lister mes conversations
- GET /api/conversations/{id} - Récupérer une conversation
- POST /api/conversations - Créer conversation
- PUT /api/conversations/{id}/archive - Archiver
- PUT /api/conversations/{id}/mark-read - Marquer comme lu
- PUT /api/conversations/{id}/toggle-mute - Activer/désactiver son
- PUT /api/conversations/{id}/toggle-pin - Épingler
- GET /api/messages?conversationId=X - Lister messages
- POST /api/messages - Envoyer message
- PUT /api/messages/{id} - Éditer message
- DELETE /api/messages/{id} - Supprimer message

## Database
- Migration V6 : tables conversations, messages, conversation_participants
- Indexes sur organisation, type, archived, deleted pour performance

## Sécurité
- SecuriteHelper.resolveMembreId() : résolution membre depuis JWT
- Vérification accès conversation avant toute opération
- @RolesAllowed sur tous les endpoints

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-03-16 06:39:39 +00:00
dahoud
f5271cc29e feat(admin): sécurité ADMIN_ORGANISATION pour import/création membres
Implémente la sécurité au niveau Resource pour ADMIN_ORGANISATION :
les utilisateurs avec ce rôle ne peuvent gérer que les membres
de leurs organisations.

MembreService.java:
- Ajout listerMembresParOrganisations(orgIds, page, sort)
  * Filtre membres par liste d'organisations avec JOIN
  * Support pagination et tri
  * Retourne liste vide si orgIds vide

- Ajout lierMembreOrganisationEtIncrementerQuota(membre, orgId, typeMembreDefaut)
  * Crée MembreOrganisation avec statut ACTIF ou EN_ATTENTE_VALIDATION
  * Incrémente quota si souscription active existe
  * Gère statut selon typeMembreDefaut fourni

MembreResource.java:
- Injection OrganisationService + import Organisation entity

- GET /api/membres: sécurisé pour ADMIN_ORGANISATION
  * ADMIN_ORGANISATION: filtre par ses organisations uniquement
  * Utilise listerMembresParOrganisations()
  * ADMIN/SUPER_ADMIN: accès complet (inchangé)

- POST /api/membres: sécurisé pour ADMIN_ORGANISATION
  * @RolesAllowed: ADMIN, SUPER_ADMIN, ADMIN_ORGANISATION, MEMBRE
  * ADMIN_ORGANISATION: require organisationId + validation accès
  * Appelle lierMembreOrganisationEtIncrementerQuota()
  * ADMIN/SUPER_ADMIN: fonctionnement inchangé

- POST /api/membres/import: sécurisé pour ADMIN_ORGANISATION
  * ADMIN_ORGANISATION: require organisationId + validation accès
  * Retourne 403 si tentative d'accès à org non autorisée
  * Retourne 400 si organisationId manquant

Spec: admin-org-membres-import-quota.md
Critères acceptation: 8/8 
- Filtrage liste membres par organisation
- Création membre avec organisationId obligatoire
- Import Excel avec orgId obligatoire
- Validation accès organisation
- Format Excel validé (déjà implémenté)
- Quota vérifié (déjà implémenté)
- Membres liés à org (déjà implémenté)
- Quota incrémenté (déjà implémenté)

Tâche: #56 - Implémenter Spec Admin Import Membres

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-03-16 06:07:56 +00:00
dahoud
8a3dd8632b test(dashboard): amélioration des tests dashboard avec données réelles
Remplace les tests "placeholders" qui acceptaient anyOf(200, 500)
par des tests robustes avec assertions sur le contenu JSON.

Modifications:
- DashboardResourceTest: 6 → 8 tests avec setup de données réelles
  * Ajout BeforeEach avec création Organisation + Membre de test
  * Validation du contenu JSON (organizationId, stats, activities, events)
  * Tests cas d'erreur (params manquants, UUIDs invalides)

- MembreDashboardResourceTest: 2 → 5 tests
  * Tests ajustés pour fonctionner sans données seed
  * Ajout test authentification (401)
  * Tests 404 pour membre inexistant

- MembreDashboardServiceTest: ajusté pour absence de données seed
  * Tests 404/NotFoundException au lieu d'attendre des données seed

- application-test.properties: fix wave.api.key/secret vides
  * Valeurs factices pour éviter erreur config en tests

Résultat: 17 tests dashboard, 100% de réussite (0 erreurs, 0 échecs)

Tâche: #57 - Remplacer tests placeholders dashboard

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-03-16 06:07:20 +00:00
dahoud
347d89cc02 feat(backend): consolidation finale Spec 001 LCB-FT + Flyway V1-V5
Migrations Flyway (consolidées) :
- V1 : Schéma complet (69 tables, 1322 lignes)
- V2 : Colonnes BaseEntity (cree_par, modifie_par)
- V3 : Colonnes métier manquantes (adresses, alert_configuration)
- V4 : Correction system_logs (renommage colonnes, ajout timestamp)
- V5 : Nettoyage alert_configuration (suppression colonnes obsolètes)
- Suppression V2-V6 obsolètes (fragmentés)

Entités LCB-FT :
- AlerteLcbFt : Alertes anti-blanchiment
- AlertConfiguration : Configuration alertes
- SystemAlert : Alertes système
- SystemLog : Logs techniques (DÉJÀ COMMITÉE avec super.onCreate fix)

Services LCB-FT (T015, T016) :
- AlerteLcbFtService + Resource : Dashboard alertes admin
- AlertMonitoringService : Surveillance transactions
- SystemLoggingService : Logs centralisés
- FileStorageService : Upload documents

Repositories :
- AlerteLcbFtRepository
- AlertConfigurationRepository
- SystemAlertRepository
- SystemLogRepository

Tests :
- GlobalExceptionMapperTest : 17 erreurs corrigées (toResponse())

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-03-16 05:15:17 +00:00
dahoud
d8e3f23ec4 fix(entity): appeler super.onCreate() dans SystemLog pour peupler dateCreation
Problème : SystemLog override @PrePersist sans appeler parent
Conséquence : dateCreation restait NULL → erreur PostgreSQL constraint violation
Solution : Ajout super.onCreate() pour déclencher BaseEntity.onCreate()

Fixes: null value in column date_creation violates not-null constraint

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-03-16 05:14:04 +00:00
dahoud
75a19988b0 Sync: code local unifié
Synchronisation du code source local (fait foi).

Signed-off-by: lions dev Team
2026-03-15 16:25:40 +00:00
dahoud
e82dc356f3 fix: ParametresLcbFtService compilation errors
Corrections pour T027 (tests backend):
- Logger.getLogger(*.class) au lieu de *.java
- Builder pattern: setters pour champs BaseResponse hérités

Impact: Compilation 100% réussie, tests 1167/1168 passent

Signed-off-by: lions dev Team
2026-03-15 04:50:06 +00:00
dahoud
eb729bdc56 feat(backend): Phase 3 - Service et Resource LCB-FT (Spec 001)
Implémentation backend pour conformité anti-blanchiment :

1. ParametresLcbFtService
   - getParametres() : récupération params par org/devise
   - getSeuilJustification() : seuil rapide (avec cache)
   - saveOrUpdateParametres() : CRUD admin
   - Cache Quarkus pour performance
   - Fallback 500k XOF par défaut

2. ParametresLcbFtResource
   - GET /api/parametres-lcb-ft : params complets (@PermitAll)
   - GET /api/parametres-lcb-ft/seuil-justification : seuil léger
   - POST /api/parametres-lcb-ft : CRUD admin (@RolesAllowed)
   - OpenAPI/Swagger documentation complète

3. Validation existante confirmée
   - TransactionEpargneService.validerLcbFtSiSeuilAtteint()
   - Audit LCB-FT via AuditService.logLcbFtSeuilAtteint()

Phase 3 : 67% complété (4/6 tâches, 2 optionnelles skip)
- T012  Service paramètres
- T013  Validation seuils (existante)
- T014  Audit opérations (existant)
- T017  Endpoint REST mobile
- T015  Optionnel (KYC crédit)
- T016  Optionnel (alertes)

Spec : specs/001-mutuelles-anti-blanchiment/spec.md
Branche : 001-mutuelles-anti-blanchiment

Signed-off-by: lions dev Team
2026-03-15 02:31:35 +00:00
dahoud
a1e30b51fb feat(dashboard): cotisations tout temps + synthèse membre
- CotisationRepository: calculerTotalCotisationsPayeesToutTemps(membreId)
- MembreDashboardService: envoi totalCotisationsPayeesToutTemps dans la synthèse

Made-with: Cursor
2026-03-09 19:58:25 +00:00
dahoud
23528197cf 🔒 SÉCURITÉ - Audit UnionFlow: Corrections Critiques et Majeures
## 🔴 CRITIQUES
- Suppression des secrets hardcodés du Dockerfile (DB_PASSWORD, KEYCLOAK_CLIENT_SECRET)
  Les secrets doivent maintenant être injectés via Kubernetes Secrets au runtime

## 🟠 MAJEURES
- Réduction du seuil Jacoco de 100% (irréaliste) à 80% (réaliste)
  Permet une couverture de tests plus atteignable

## 📋 Contexte
Suite à l'audit de sécurité AUDIT_INTEGRAL_COMPLET_2025.md
Score avant: 5.6/10 - NE PAS DÉPLOYER EN PRODUCTION
Problèmes critiques identifiés et corrigés

## ⚠️ ACTION REQUISE
Créer les Kubernetes Secrets avant déploiement:
kubectl create secret generic unionflow-server-secrets \
  --namespace=applications \
  --from-literal=db-password='...' \
  --from-literal=keycloak-client-secret='...'

Voir: kubernetes/secrets/README.md

🤖 Generated with Claude Code
2025-12-14 17:09:55 +00:00
dahoud
6aceceff81 Fix: Add table existence check in V1.2 migration
V1.2 now checks if the 'membres' table exists before trying to add
the organisation_id column. This prevents failures when Flyway runs
before Hibernate creates the initial schema from JPA entities.

Changes:
- Added table existence check before ALTER TABLE membres
- Migration will skip the ALTER if table doesn't exist yet
- Allows Hibernate to create initial schema first

This ensures migrations work correctly without any test data.
2025-12-12 18:00:44 +00:00
dahoud
5ba96ce33c Fix: Change Quarkus HTTP port from 8085 to 8080 for lionsctl compatibility 2025-12-10 10:56:11 +00:00
dahoud
637f6de9d2 Simplify Dockerfile for lionsctl compatibility - use uber-jar 2025-12-10 10:28:48 +00:00
dahoud
e1c0daa2aa Add Dockerfile for lionsctl deployment 2025-12-10 10:27:35 +00:00
dahoud
4a0c5f9d33 Configure Maven repository for unionflow-server-api dependency 2025-12-10 01:08:17 +00:00