# Phase 2 - Plan de Refactorisation : Cotisations & Adhésions

**Date** : 17 novembre 2025  
**Objectif** : Refactoriser les modules Cotisations et Adhésions selon DRY/WOU

---

## 📊 ÉTAT ACTUEL DÉTAILLÉ

### Beans Existants

#### 1. `CotisationsBean` (`@Named("cotisationsBean")`)
- **Usage** : Pages `/pages/secure/cotisation/*`
- **Problèmes** :
  - ❌ Classe interne `Cotisation` duplique `CotisationDTO`
  - ❌ Données mockées : `evolutionPaiements`, `repartitionMethodes`, `rappelsEnAttente`
  - ❌ Actions non connectées : `marquerCommePaye()`, `enregistrerPaiementPartiel()`, etc.
  - ❌ Statistiques calculées côté client au lieu d'utiliser `/api/cotisations/stats`
  - ✅ Utilise déjà `CotisationService` pour charger les données

#### 2. `CotisationsGestionBean` (`@Named("cotisationsGestionBean")`)
- **Usage** : Page `/pages/admin/cotisations/gestion.xhtml`
- **Problèmes** :
  - ❌ Classe interne `CotisationAdmin` duplique `CotisationDTO`
  - ❌ Actions non connectées : toutes les actions sont juste des `LOGGER.info()`
  - ❌ Statistiques calculées côté client
  - ✅ Utilise déjà `CotisationService` pour charger les données

### Pages Existantes

#### Pages Cotisations (`/pages/secure/cotisation/`)
- ❌ `paiement.xhtml` - **PLACEHOLDER**
- ❌ `historique.xhtml` - **PLACEHOLDER**
- ❌ `relances.xhtml` - **PLACEHOLDER**
- ❌ `rapports.xhtml` - **PLACEHOLDER**
- ❌ `collect.xhtml` - **PLACEHOLDER**
- ❌ `reminders.xhtml` - **PLACEHOLDER**
- ❌ `report.xhtml` - **PLACEHOLDER**

#### Page Admin Cotisations
- ✅ `/pages/admin/cotisations/gestion.xhtml` - **EXISTE** (utilise `cotisationsGestionBean`)

### Composants Réutilisables Disponibles

✅ **Déjà créés** :
- `page-header.xhtml`
- `form-section.xhtml`
- `form-field-text.xhtml`
- `form-field-calendar.xhtml`
- `form-field-select.xhtml`
- `form-field-textarea.xhtml`
- `form-field-number.xhtml`
- `form-field-checkbox-menu.xhtml`
- `form-field-autocomplete.xhtml`
- `form-field-boolean.xhtml`
- `form-field-group.xhtml`
- `button-primary.xhtml`
- `button-secondary.xhtml`
- `button-success.xhtml`
- `button-info.xhtml`
- `button-warning.xhtml`
- `button-icon.xhtml`
- `stat-card.xhtml`

---

## 🎯 PLAN DE REFACTORISATION

### **ÉTAPE 1 : Refactoriser CotisationsBean** (Priorité 1)

#### 1.1 Supprimer la classe interne `Cotisation`
- [ ] Utiliser directement `CotisationDTO` partout
- [ ] Supprimer `convertToCotisation()` et utiliser directement les DTOs
- [ ] Adapter les propriétés dérivées (statutSeverity, etc.) dans le DTO ou créer un helper

#### 1.2 Utiliser les statistiques du backend
- [ ] Remplacer `initializeStatistiques()` pour utiliser `cotisationService.obtenirStatistiques()`
- [ ] Supprimer le calcul côté client

#### 1.3 Supprimer les données mockées
- [ ] `initializeEvolutionPaiements()` - Calculer depuis les données réelles
- [ ] `initializeRepartitionMethodes()` - Calculer depuis les données réelles
- [ ] `initializeRappels()` - Utiliser `cotisationService.obtenirEnRetard()`

#### 1.4 Connecter les actions au backend
- [ ] `enregistrerCotisation()` → `cotisationService.creer()`
- [ ] `marquerCommePaye()` → `cotisationService.modifier()` avec statut PAYEE
- [ ] `enregistrerPaiementPartiel()` → `cotisationService.modifier()` avec montant partiel
- [ ] `envoyerRappel()` → À implémenter (service de notification)
- [ ] `envoyerRappelsGroupes()` → À implémenter
- [ ] `exporterCotisations()` → À implémenter
- [ ] `genererRapportFinancier()` → Utiliser les statistiques du backend

#### 1.5 Améliorer la recherche
- [ ] Utiliser `cotisationService.rechercher()` au lieu de filtrage côté client
- [ ] Supprimer `appliquerFiltres()` et utiliser la recherche backend

---

### **ÉTAPE 2 : Refactoriser CotisationsGestionBean** (Priorité 2)

#### 2.1 Supprimer la classe interne `CotisationAdmin`
- [ ] Utiliser directement `CotisationDTO`
- [ ] Supprimer `convertToCotisationAdmin()`

#### 2.2 Utiliser les statistiques du backend
- [ ] Remplacer `initializeKPIs()` pour utiliser `cotisationService.obtenirStatistiques()`

#### 2.3 Connecter toutes les actions au backend
- [ ] `enregistrerPaiement()` → `cotisationService.modifier()`
- [ ] `genererRecu()` → À implémenter (génération PDF)
- [ ] `envoyerRappel()` → À implémenter
- [ ] `marquerPayeesGroupees()` → Boucle sur sélection + `cotisationService.modifier()`
- [ ] `envoyerRelancesGroupees()` → À implémenter
- [ ] `genererRecusGroupes()` → À implémenter
- [ ] `annulerCotisationsGroupees()` → `cotisationService.supprimer()`
- [ ] `creerCampagne()` → Créer plusieurs cotisations via `cotisationService.creer()`

---

### **ÉTAPE 3 : Créer les Pages Cotisations** (Priorité 3)

#### 3.1 Page Paiement (`paiement.xhtml`)
- [ ] Utiliser `page-header.xhtml`
- [ ] Formulaire avec `form-field-*` components
- [ ] Sélection méthode paiement (Wave, Orange, etc.)
- [ ] Connexion à `cotisationService.modifier()` pour enregistrer le paiement
- [ ] Utiliser composants boutons réutilisables

#### 3.2 Page Historique (`historique.xhtml`)
- [ ] Utiliser `page-header.xhtml`
- [ ] Tableau avec `p:dataTable`
- [ ] Filtres avec composants réutilisables
- [ ] Connexion à `cotisationService.obtenirParMembre()` ou `cotisationService.rechercher()`
- [ ] Pagination

#### 3.3 Page Relances (`relances.xhtml`)
- [ ] Utiliser `page-header.xhtml`
- [ ] Liste des cotisations en retard via `cotisationService.obtenirEnRetard()`
- [ ] Actions groupées pour envoi de rappels
- [ ] Utiliser composants réutilisables

#### 3.4 Page Rapports (`rapports.xhtml`)
- [ ] Utiliser `page-header.xhtml`
- [ ] Statistiques via `cotisationService.obtenirStatistiques()`
- [ ] Graphiques d'évolution
- [ ] Export Excel/PDF

#### 3.5 Pages Collect, Reminders, Report
- [ ] Déterminer si nécessaire ou fusionner avec autres pages
- [ ] Si nécessaire, créer avec composants réutilisables

---

### **ÉTAPE 4 : Créer Module Adhésions Backend** (Priorité 4)

#### 4.1 Créer `AdhesionDTO` dans `unionflow-server-api`
- [ ] Structure complète avec validations
- [ ] Champs : membreId, typeAdhesion, dateDemande, dateValidation, statut, etc.

#### 4.2 Créer `Adhesion` Entity dans `unionflow-server-impl-quarkus`
- [ ] Entité JPA avec UUID
- [ ] Relations avec Membre et Association

#### 4.3 Créer `AdhesionRepository`
- [ ] Repository Panache
- [ ] Méthodes de recherche

#### 4.4 Créer `AdhesionService`
- [ ] Logique métier complète
- [ ] Méthodes CRUD
- [ ] Validation, Renouvellement, Rejet

#### 4.5 Créer `AdhesionResource`
- [ ] REST API complète
- [ ] Tous les endpoints nécessaires

---

### **ÉTAPE 5 : Créer Module Adhésions Frontend** (Priorité 5)

#### 5.1 Créer `AdhesionService` (RestClient)
- [ ] Interface complète correspondant au backend

#### 5.2 Créer `AdhesionsBean`
- [ ] Bean JSF
- [ ] Connexion complète au backend
- [ ] Utiliser directement `AdhesionDTO` (pas de classe interne)

#### 5.3 Créer les pages Adhésions
- [ ] `demande.xhtml` - Formulaire avec composants réutilisables
- [ ] `validation.xhtml` - Liste + actions avec composants réutilisables
- [ ] `renouvellement.xhtml` - Formulaire avec composants réutilisables
- [ ] `liste.xhtml` - Tableau avec composants réutilisables
- [ ] `pending.xhtml` - Liste en attente
- [ ] `history.xhtml` - Historique

---

## 🔄 ORDRE D'EXÉCUTION

1. **Étape 1** : Refactoriser `CotisationsBean` (1-2 semaines)
2. **Étape 2** : Refactoriser `CotisationsGestionBean` (1 semaine)
3. **Étape 3** : Créer pages Cotisations (2-3 semaines)
4. **Étape 4** : Créer module Adhésions Backend (1-2 semaines)
5. **Étape 5** : Créer module Adhésions Frontend (2-3 semaines)

**Durée totale** : 7-11 semaines

---

## ✅ PRINCIPES À RESPECTER

### DRY (Don't Repeat Yourself)
- ❌ Pas de duplication de DTOs (supprimer classes internes)
- ❌ Pas de calculs dupliqués (utiliser backend)
- ❌ Pas de code répétitif (utiliser composants)

### WOU (Write Once, Use Everywhere)
- ✅ Utiliser composants réutilisables créés
- ✅ Utiliser `CotisationDTO` directement
- ✅ Centraliser la logique dans les services

### Connexion Backend
- ✅ Toutes les actions doivent appeler le backend
- ✅ Utiliser les statistiques du backend
- ✅ Gérer les erreurs proprement

---

**Document créé le** : 17 novembre 2025

