package dev.lions.unionflow.client.view; import dev.lions.unionflow.client.dto.MembreDTO; import dev.lions.unionflow.client.service.MembreService; import jakarta.enterprise.context.SessionScoped; import jakarta.inject.Inject; import jakarta.inject.Named; import jakarta.annotation.PostConstruct; import org.eclipse.microprofile.rest.client.inject.RestClient; import java.io.Serializable; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.UUID; import java.util.logging.Logger; import org.primefaces.event.FileUploadEvent; @Named("membreProfilBean") @SessionScoped public class MembreProfilBean implements Serializable { private static final long serialVersionUID = 1L; private static final Logger LOGGER = Logger.getLogger(MembreProfilBean.class.getName()); // Constantes de navigation outcomes (WOU/DRY - réutilisables) private static final String OUTCOME_MEMBRE_LISTE = "membreListPage"; private static final String OUTCOME_MEMBRE_COTISATIONS = "membreCotisationsPage"; @Inject @RestClient private MembreService membreService; private Membre membre; private Membre membreEdit; private Statistiques statistiques; private CotisationsData cotisations; private EvenementsData evenements; private AidesData aides; private DemandesData demandes; private HistoriqueData historique; private ContactData contact; private UUID membreId; @PostConstruct public void init() { if (membreId == null) { LOGGER.warning("Aucun membreId fourni, impossible de charger le profil"); return; } chargerMembre(); chargerStatistiques(); chargerCotisations(); chargerEvenements(); chargerAides(); chargerDemandes(); chargerHistorique(); initContact(); } private void chargerMembre() { try { MembreDTO dto = membreService.obtenirParId(membreId); membre = convertToMembre(dto); // Copie pour l'édition membreEdit = new Membre(); copierMembre(membre, membreEdit); } catch (Exception e) { LOGGER.severe("Erreur lors du chargement du membre: " + e.getMessage()); membre = new Membre(); membre.setId(membreId); } } private Membre convertToMembre(MembreDTO dto) { Membre membre = new Membre(); membre.setId(dto.getId()); membre.setNumeroMembre(dto.getNumeroMembre()); membre.setPrenom(dto.getPrenom()); membre.setNom(dto.getNom()); membre.setEmail(dto.getEmail()); membre.setTelephone(dto.getTelephone()); membre.setDateNaissance(dto.getDateNaissance()); // Note: Genre, situation familiale, ville, pays, type membre ne sont pas disponibles dans MembreDTO client // Ces champs seront ajoutés ultérieurement si nécessaire membre.setProfession(dto.getProfession()); membre.setAdresse(dto.getAdresse()); membre.setStatut(dto.getStatut() != null ? dto.getStatut() : "ACTIF"); membre.setDateAdhesion(dto.getDateInscription() != null ? dto.getDateInscription().toLocalDate() : null); return membre; } private void chargerStatistiques() { statistiques = new Statistiques(); statistiques.setEvenementsParticipes(24); statistiques.setCotisationsPayees(12); statistiques.setAidesRecues(2); statistiques.setScoreEngagement(95); statistiques.setTauxParticipation(85); statistiques.setEvenementsAnnee(8); statistiques.setEvenementsTotal(24); statistiques.setEvenementsOrganises(3); statistiques.setAbsences(2); } private void chargerCotisations() { cotisations = new CotisationsData(); cotisations.setStatutActuel("À jour"); cotisations.setStatutSeverity("success"); cotisations.setDernierPaiement("15/07/2024"); cotisations.setProchaineEcheance("15/08/2024"); cotisations.setProchaineEcheanceClass("text-green-500"); cotisations.setTotalAnnee("120 000 FCFA"); // Historique des paiements List historique = new ArrayList<>(); for (int i = 1; i <= 6; i++) { PaiementCotisation paiement = new PaiementCotisation(); paiement.setDate(LocalDate.now().minusMonths(i)); paiement.setMontant(10000.0); paiement.setModePaiement(i % 2 == 0 ? "Wave Money" : "Espèces"); paiement.setModeIcon(i % 2 == 0 ? "pi-mobile" : "pi-money-bill"); paiement.setStatut("Validé"); paiement.setStatutSeverity("success"); historique.add(paiement); } cotisations.setHistorique(historique); } private void chargerEvenements() { evenements = new EvenementsData(); List recents = new ArrayList<>(); String[] titres = {"Réunion mensuelle", "Action humanitaire", "Formation leadership", "Collecte de fonds"}; String[] lieux = {"Hôtel Radisson", "École Primaire", "Centre de formation", "Stade Léopold Sédar Senghor"}; String[] types = {"REUNION", "ACTION", "FORMATION", "COLLECTE"}; for (int i = 0; i < 4; i++) { EvenementParticipation evt = new EvenementParticipation(); evt.setTitre(titres[i]); evt.setDate(LocalDate.now().minusDays(i * 7).toString()); evt.setLieu(lieux[i]); evt.setParticipation(i < 3 ? "Présent" : "Absent"); evt.setParticipationSeverity(i < 3 ? "success" : "danger"); evt.setRole(i == 0 ? "Organisateur" : "Participant"); evt.setTypeIcon("pi-calendar"); evt.setTypeColorClass("bg-blue-500"); recents.add(evt); } evenements.setRecents(recents); } private void chargerAides() { aides = new AidesData(); List recues = new ArrayList<>(); Aide aide1 = new Aide(); aide1.setType("Aide médicale"); aide1.setMontant(50000.0); aide1.setDate(LocalDate.of(2024, 5, 10)); aide1.setStatut("Validée"); aide1.setStatutSeverity("success"); aide1.setTypeIcon("pi-heart"); aide1.setTypeColor("text-red-500"); recues.add(aide1); Aide aide2 = new Aide(); aide2.setType("Aide scolaire"); aide2.setMontant(25000.0); aide2.setDate(LocalDate.of(2024, 1, 15)); aide2.setStatut("Validée"); aide2.setStatutSeverity("success"); aide2.setTypeIcon("pi-book"); aide2.setTypeColor("text-blue-500"); recues.add(aide2); aides.setRecues(recues); } private void chargerDemandes() { demandes = new DemandesData(); List enCours = new ArrayList<>(); Demande demande1 = new Demande(); demande1.setType("Certificat"); demande1.setObjet("Certificat d'adhésion"); demande1.setDateDepot(LocalDate.now().minusDays(3)); demande1.setStatut("En cours"); demande1.setStatutSeverity("warning"); enCours.add(demande1); demandes.setEnCours(enCours); } private void chargerHistorique() { historique = new HistoriqueData(); List activites = new ArrayList<>(); String[] descriptions = { "Profil mis à jour", "Participation à la réunion mensuelle", "Paiement de cotisation validé", "Nouvelle adhésion enregistrée" }; for (int i = 0; i < 4; i++) { Activite activite = new Activite(); activite.setDescription(descriptions[i]); activite.setDate(LocalDateTime.now().minusDays(i * 2).toString()); activite.setAuteur(i == 0 ? "Jean DIALLO" : "Admin"); activite.setIcone(i % 2 == 0 ? "pi-user" : "pi-calendar"); activite.setCouleur(i % 2 == 0 ? "text-blue-500" : "text-green-500"); if (i == 2) { activite.setDetails("Montant: 10 000 FCFA via Wave Money"); } activites.add(activite); } historique.setActivites(activites); } private void initContact() { contact = new ContactData(); contact.setCanaux(new ArrayList<>()); } // Actions public void changerPhoto(FileUploadEvent event) { // Logique de changement de photo LOGGER.info("Photo changée: " + event.getFile().getFileName()); } public String gererCotisations() { // Utilisation de navigation outcome au lieu de chemin direct (WOU/DRY) return OUTCOME_MEMBRE_COTISATIONS + "?id=" + membre.getId() + "&faces-redirect=true"; } public void sauvegarderModifications() { copierMembre(membreEdit, membre); LOGGER.info("Profil mis à jour pour: " + membre.getNomComplet()); } public void envoyerMessage() { LOGGER.info("Message envoyé: " + contact.getSujet() + " via " + contact.getCanaux()); contact = new ContactData(); contact.setCanaux(new ArrayList<>()); } public void envoyerRappelCotisation() { LOGGER.info("Rappel de cotisation envoyé à: " + membre.getEmail()); } public void suspendre() { membre.setStatut("SUSPENDU"); LOGGER.info("Membre suspendu: " + membre.getNomComplet()); } public void reactiver() { membre.setStatut("ACTIF"); LOGGER.info("Membre réactivé: " + membre.getNomComplet()); } public void exporterDonnees() { LOGGER.info("Export des données pour: " + membre.getNomComplet()); } public String supprimer() { LOGGER.info("Membre supprimé: " + membre.getNomComplet()); return OUTCOME_MEMBRE_LISTE + "?faces-redirect=true"; } private void copierMembre(Membre source, Membre destination) { destination.setId(source.getId()); destination.setPrenom(source.getPrenom()); destination.setNom(source.getNom()); destination.setEmail(source.getEmail()); destination.setTelephone(source.getTelephone()); destination.setDateNaissance(source.getDateNaissance()); destination.setProfession(source.getProfession()); destination.setAdresse(source.getAdresse()); } // Getters et Setters public Membre getMembre() { return membre; } public void setMembre(Membre membre) { this.membre = membre; } public Membre getMembreEdit() { return membreEdit; } public void setMembreEdit(Membre membreEdit) { this.membreEdit = membreEdit; } public Statistiques getStatistiques() { return statistiques; } public void setStatistiques(Statistiques statistiques) { this.statistiques = statistiques; } public CotisationsData getCotisations() { return cotisations; } public void setCotisations(CotisationsData cotisations) { this.cotisations = cotisations; } public EvenementsData getEvenements() { return evenements; } public void setEvenements(EvenementsData evenements) { this.evenements = evenements; } public AidesData getAides() { return aides; } public void setAides(AidesData aides) { this.aides = aides; } public DemandesData getDemandes() { return demandes; } public void setDemandes(DemandesData demandes) { this.demandes = demandes; } public HistoriqueData getHistorique() { return historique; } public void setHistorique(HistoriqueData historique) { this.historique = historique; } public ContactData getContact() { return contact; } public void setContact(ContactData contact) { this.contact = contact; } public UUID getMembreId() { return membreId; } public void setMembreId(UUID membreId) { this.membreId = membreId; } // Classes internes public static class Membre { private UUID id; private String numeroMembre; private String prenom; private String nom; private String email; private String telephone; private LocalDate dateNaissance; private String genre; private String situationFamiliale; private String profession; private String adresse; private String ville; private String pays; private String typeMembre; private String statut; private String entite; private LocalDate dateAdhesion; private String cotisationStatut; private int tauxParticipation; private String photoUrl; private List famille = new ArrayList<>(); // Getters et setters public UUID getId() { return id; } public void setId(UUID id) { this.id = id; } public String getNumeroMembre() { return numeroMembre; } public void setNumeroMembre(String numeroMembre) { this.numeroMembre = numeroMembre; } public String getPrenom() { return prenom; } public void setPrenom(String prenom) { this.prenom = prenom; } public String getNom() { return nom; } public void setNom(String nom) { this.nom = nom; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getTelephone() { return telephone; } public void setTelephone(String telephone) { this.telephone = telephone; } public LocalDate getDateNaissance() { return dateNaissance; } public void setDateNaissance(LocalDate dateNaissance) { this.dateNaissance = dateNaissance; } public String getGenre() { return genre; } public void setGenre(String genre) { this.genre = genre; } public String getSituationFamiliale() { return situationFamiliale; } public void setSituationFamiliale(String situationFamiliale) { this.situationFamiliale = situationFamiliale; } public String getProfession() { return profession; } public void setProfession(String profession) { this.profession = profession; } public String getAdresse() { return adresse; } public void setAdresse(String adresse) { this.adresse = adresse; } public String getVille() { return ville; } public void setVille(String ville) { this.ville = ville; } public String getPays() { return pays; } public void setPays(String pays) { this.pays = pays; } public String getTypeMembre() { return typeMembre; } public void setTypeMembre(String typeMembre) { this.typeMembre = typeMembre; } public String getStatut() { return statut; } public void setStatut(String statut) { this.statut = statut; } public String getEntite() { return entite; } public void setEntite(String entite) { this.entite = entite; } public LocalDate getDateAdhesion() { return dateAdhesion; } public void setDateAdhesion(LocalDate dateAdhesion) { this.dateAdhesion = dateAdhesion; } public String getCotisationStatut() { return cotisationStatut; } public void setCotisationStatut(String cotisationStatut) { this.cotisationStatut = cotisationStatut; } public int getTauxParticipation() { return tauxParticipation; } public void setTauxParticipation(int tauxParticipation) { this.tauxParticipation = tauxParticipation; } public String getPhotoUrl() { return photoUrl; } public void setPhotoUrl(String photoUrl) { this.photoUrl = photoUrl; } public List getFamille() { return famille; } public void setFamille(List famille) { this.famille = famille; } // Propriétés dérivées public String getNomComplet() { return prenom + " " + nom; } public String getInitiales() { return (prenom != null ? prenom.substring(0, 1) : "") + (nom != null ? nom.substring(0, 1) : ""); } public String getStatutSeverity() { return switch (statut) { case "ACTIF" -> "success"; case "INACTIF" -> "warning"; case "SUSPENDU" -> "danger"; case "RADIE" -> "danger"; default -> "secondary"; }; } public String getStatutIcon() { return switch (statut) { case "ACTIF" -> "pi-check"; case "INACTIF" -> "pi-pause"; case "SUSPENDU" -> "pi-ban"; case "RADIE" -> "pi-times"; default -> "pi-circle"; }; } public String getTypeSeverity() { return switch (typeMembre) { case "ACTIF" -> "info"; case "ASSOCIE" -> "success"; case "BIENFAITEUR" -> "warning"; case "HONORAIRE" -> "secondary"; default -> "info"; }; } public String getTypeIcon() { return switch (typeMembre) { case "ACTIF" -> "pi-user"; case "ASSOCIE" -> "pi-users"; case "BIENFAITEUR" -> "pi-star"; case "HONORAIRE" -> "pi-crown"; default -> "pi-user"; }; } public String getAnciennete() { if (dateAdhesion == null) return "N/A"; long mois = java.time.temporal.ChronoUnit.MONTHS.between(dateAdhesion, LocalDate.now()); if (mois < 12) return mois + " mois"; return (mois / 12) + " an" + (mois / 12 > 1 ? "s" : ""); } public String getCotisationColor() { return cotisationStatut != null && cotisationStatut.equals("À jour") ? "text-green-500" : "text-red-500"; } } public static class MembreFamille { private String nomComplet; private String relation; private LocalDate dateNaissance; private boolean beneficiaire; // Getters et setters public String getNomComplet() { return nomComplet; } public void setNomComplet(String nomComplet) { this.nomComplet = nomComplet; } public String getRelation() { return relation; } public void setRelation(String relation) { this.relation = relation; } public LocalDate getDateNaissance() { return dateNaissance; } public void setDateNaissance(LocalDate dateNaissance) { this.dateNaissance = dateNaissance; } public boolean isBeneficiaire() { return beneficiaire; } public void setBeneficiaire(boolean beneficiaire) { this.beneficiaire = beneficiaire; } } public static class Statistiques { private int evenementsParticipes; private int cotisationsPayees; private int aidesRecues; private int scoreEngagement; private int tauxParticipation; private int evenementsAnnee; private int evenementsTotal; private int evenementsOrganises; private int absences; // Getters et setters public int getEvenementsParticipes() { return evenementsParticipes; } public void setEvenementsParticipes(int evenementsParticipes) { this.evenementsParticipes = evenementsParticipes; } public int getCotisationsPayees() { return cotisationsPayees; } public void setCotisationsPayees(int cotisationsPayees) { this.cotisationsPayees = cotisationsPayees; } public int getAidesRecues() { return aidesRecues; } public void setAidesRecues(int aidesRecues) { this.aidesRecues = aidesRecues; } public int getScoreEngagement() { return scoreEngagement; } public void setScoreEngagement(int scoreEngagement) { this.scoreEngagement = scoreEngagement; } public int getTauxParticipation() { return tauxParticipation; } public void setTauxParticipation(int tauxParticipation) { this.tauxParticipation = tauxParticipation; } public int getEvenementsAnnee() { return evenementsAnnee; } public void setEvenementsAnnee(int evenementsAnnee) { this.evenementsAnnee = evenementsAnnee; } public int getEvenementsTotal() { return evenementsTotal; } public void setEvenementsTotal(int evenementsTotal) { this.evenementsTotal = evenementsTotal; } public int getEvenementsOrganises() { return evenementsOrganises; } public void setEvenementsOrganises(int evenementsOrganises) { this.evenementsOrganises = evenementsOrganises; } public int getAbsences() { return absences; } public void setAbsences(int absences) { this.absences = absences; } } public static class CotisationsData { private String statutActuel; private String statutSeverity; private String dernierPaiement; private String prochaineEcheance; private String prochaineEcheanceClass; private String totalAnnee; private List historique = new ArrayList<>(); // Getters et setters public String getStatutActuel() { return statutActuel; } public void setStatutActuel(String statutActuel) { this.statutActuel = statutActuel; } public String getStatutSeverity() { return statutSeverity; } public void setStatutSeverity(String statutSeverity) { this.statutSeverity = statutSeverity; } public String getDernierPaiement() { return dernierPaiement; } public void setDernierPaiement(String dernierPaiement) { this.dernierPaiement = dernierPaiement; } public String getProchaineEcheance() { return prochaineEcheance; } public void setProchaineEcheance(String prochaineEcheance) { this.prochaineEcheance = prochaineEcheance; } public String getProchaineEcheanceClass() { return prochaineEcheanceClass; } public void setProchaineEcheanceClass(String prochaineEcheanceClass) { this.prochaineEcheanceClass = prochaineEcheanceClass; } public String getTotalAnnee() { return totalAnnee; } public void setTotalAnnee(String totalAnnee) { this.totalAnnee = totalAnnee; } public List getHistorique() { return historique; } public void setHistorique(List historique) { this.historique = historique; } } public static class PaiementCotisation { private LocalDate date; private Double montant; private String modePaiement; private String modeIcon; private String statut; private String statutSeverity; // Getters et setters public LocalDate getDate() { return date; } public void setDate(LocalDate date) { this.date = date; } public Double getMontant() { return montant; } public void setMontant(Double montant) { this.montant = montant; } public String getModePaiement() { return modePaiement; } public void setModePaiement(String modePaiement) { this.modePaiement = modePaiement; } public String getModeIcon() { return modeIcon; } public void setModeIcon(String modeIcon) { this.modeIcon = modeIcon; } public String getStatut() { return statut; } public void setStatut(String statut) { this.statut = statut; } public String getStatutSeverity() { return statutSeverity; } public void setStatutSeverity(String statutSeverity) { this.statutSeverity = statutSeverity; } } public static class EvenementsData { private List recents = new ArrayList<>(); public List getRecents() { return recents; } public void setRecents(List recents) { this.recents = recents; } } public static class EvenementParticipation { private String titre; private String date; private String lieu; private String participation; private String participationSeverity; private String role; private String typeIcon; private String typeColorClass; // Getters et setters public String getTitre() { return titre; } public void setTitre(String titre) { this.titre = titre; } public String getDate() { return date; } public void setDate(String date) { this.date = date; } public String getLieu() { return lieu; } public void setLieu(String lieu) { this.lieu = lieu; } public String getParticipation() { return participation; } public void setParticipation(String participation) { this.participation = participation; } public String getParticipationSeverity() { return participationSeverity; } public void setParticipationSeverity(String participationSeverity) { this.participationSeverity = participationSeverity; } public String getRole() { return role; } public void setRole(String role) { this.role = role; } public String getTypeIcon() { return typeIcon; } public void setTypeIcon(String typeIcon) { this.typeIcon = typeIcon; } public String getTypeColorClass() { return typeColorClass; } public void setTypeColorClass(String typeColorClass) { this.typeColorClass = typeColorClass; } } public static class AidesData { private List recues = new ArrayList<>(); public List getRecues() { return recues; } public void setRecues(List recues) { this.recues = recues; } } public static class Aide { private String type; private Double montant; private LocalDate date; private String statut; private String statutSeverity; private String typeIcon; private String typeColor; // Getters et setters public String getType() { return type; } public void setType(String type) { this.type = type; } public Double getMontant() { return montant; } public void setMontant(Double montant) { this.montant = montant; } public LocalDate getDate() { return date; } public void setDate(LocalDate date) { this.date = date; } public String getStatut() { return statut; } public void setStatut(String statut) { this.statut = statut; } public String getStatutSeverity() { return statutSeverity; } public void setStatutSeverity(String statutSeverity) { this.statutSeverity = statutSeverity; } public String getTypeIcon() { return typeIcon; } public void setTypeIcon(String typeIcon) { this.typeIcon = typeIcon; } public String getTypeColor() { return typeColor; } public void setTypeColor(String typeColor) { this.typeColor = typeColor; } } public static class DemandesData { private List enCours = new ArrayList<>(); public List getEnCours() { return enCours; } public void setEnCours(List enCours) { this.enCours = enCours; } } public static class Demande { private String type; private String objet; private LocalDate dateDepot; private String statut; private String statutSeverity; // Getters et setters public String getType() { return type; } public void setType(String type) { this.type = type; } public String getObjet() { return objet; } public void setObjet(String objet) { this.objet = objet; } public LocalDate getDateDepot() { return dateDepot; } public void setDateDepot(LocalDate dateDepot) { this.dateDepot = dateDepot; } public String getStatut() { return statut; } public void setStatut(String statut) { this.statut = statut; } public String getStatutSeverity() { return statutSeverity; } public void setStatutSeverity(String statutSeverity) { this.statutSeverity = statutSeverity; } } public static class HistoriqueData { private List activites = new ArrayList<>(); public List getActivites() { return activites; } public void setActivites(List activites) { this.activites = activites; } } public static class Activite { private String description; private String date; private String auteur; private String icone; private String couleur; private String details; // Getters et setters public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getDate() { return date; } public void setDate(String date) { this.date = date; } public String getAuteur() { return auteur; } public void setAuteur(String auteur) { this.auteur = auteur; } public String getIcone() { return icone; } public void setIcone(String icone) { this.icone = icone; } public String getCouleur() { return couleur; } public void setCouleur(String couleur) { this.couleur = couleur; } public String getDetails() { return details; } public void setDetails(String details) { this.details = details; } } public static class ContactData { private String sujet; private String message; private List canaux = new ArrayList<>(); // Getters et setters public String getSujet() { return sujet; } public void setSujet(String sujet) { this.sujet = sujet; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public List getCanaux() { return canaux; } public void setCanaux(List canaux) { this.canaux = canaux; } } }