diff --git a/as-talange-core/src/main/java/com/astalange/core/repository/PaiementRepository.java b/as-talange-core/src/main/java/com/astalange/core/repository/PaiementRepository.java index 03237b4..efa9f3d 100644 --- a/as-talange-core/src/main/java/com/astalange/core/repository/PaiementRepository.java +++ b/as-talange-core/src/main/java/com/astalange/core/repository/PaiementRepository.java @@ -11,4 +11,12 @@ public interface PaiementRepository extends JpaRepository { @Query("SELECT SUM(p.montant) FROM Paiement p") BigDecimal sumMontant(); + + @Query("SELECT p FROM Paiement p " + + "LEFT JOIN FETCH p.licence l " + + "LEFT JOIN FETCH l.adherent a " + + "LEFT JOIN FETCH l.categorie c " + + "LEFT JOIN FETCH p.modePaiement m " + + "ORDER BY p.datePaiement DESC, p.id DESC") + java.util.List findAllWithAssociations(); } diff --git a/as-talange-web/src/main/java/com/astalange/web/controller/PaiementsController.java b/as-talange-web/src/main/java/com/astalange/web/controller/PaiementsController.java index 5d63d56..82091d7 100644 --- a/as-talange-web/src/main/java/com/astalange/web/controller/PaiementsController.java +++ b/as-talange-web/src/main/java/com/astalange/web/controller/PaiementsController.java @@ -1,23 +1,125 @@ package com.astalange.web.controller; +import com.astalange.core.entity.Paiement; +import com.astalange.core.repository.CategorieRepository; +import com.astalange.core.repository.ModePaiementRepository; import com.astalange.core.repository.PaiementRepository; -import org.springframework.data.domain.Sort; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; +import java.util.stream.Collectors; @Controller public class PaiementsController { private final PaiementRepository paiementRepository; + private final CategorieRepository categorieRepository; + private final ModePaiementRepository modePaiementRepository; - public PaiementsController(PaiementRepository paiementRepository) { + public PaiementsController(PaiementRepository paiementRepository, + CategorieRepository categorieRepository, + ModePaiementRepository modePaiementRepository) { this.paiementRepository = paiementRepository; + this.categorieRepository = categorieRepository; + this.modePaiementRepository = modePaiementRepository; } @GetMapping("/paiements") - public String listPaiements(Model model) { - model.addAttribute("paiements", paiementRepository.findAll(Sort.by(Sort.Direction.DESC, "datePaiement", "id"))); + public String listPaiements( + @RequestParam(required = false) String query, + @RequestParam(required = false) String adherent, + @RequestParam(required = false) String categorie, + @RequestParam(required = false) String saison, + @RequestParam(required = false) String modePaiement, + @RequestParam(required = false) String montant, + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "20") int size, + Model model) { + + List allPaiements = paiementRepository.findAllWithAssociations(); + + List filtered = allPaiements.stream() + .filter(p -> { + // Global query + if (query != null && !query.trim().isEmpty()) { + String q = query.toLowerCase().trim(); + String fullName = (p.getLicence().getAdherent().getPrenom() + " " + p.getLicence().getAdherent().getNom()).toLowerCase(); + String catName = p.getLicence().getCategorie().getNom().toLowerCase(); + String modeName = p.getModePaiement().getNom().toLowerCase(); + String seasonName = p.getLicence().getSaison().getNom().toLowerCase(); + if (!fullName.contains(q) && !catName.contains(q) && !modeName.contains(q) && !seasonName.contains(q)) { + return false; + } + } + + // Column filters + if (adherent != null && !adherent.trim().isEmpty()) { + String af = adherent.toLowerCase().trim(); + String fullName = (p.getLicence().getAdherent().getPrenom() + " " + p.getLicence().getAdherent().getNom()).toLowerCase(); + if (!fullName.contains(af)) { + return false; + } + } + + if (categorie != null && !categorie.trim().isEmpty()) { + if (!p.getLicence().getCategorie().getNom().equalsIgnoreCase(categorie.trim())) { + return false; + } + } + + if (saison != null && !saison.trim().isEmpty()) { + String sf = saison.toLowerCase().trim(); + if (!p.getLicence().getSaison().getNom().toLowerCase().contains(sf)) { + return false; + } + } + + if (modePaiement != null && !modePaiement.trim().isEmpty()) { + if (!p.getModePaiement().getNom().equalsIgnoreCase(modePaiement.trim())) { + return false; + } + } + + if (montant != null && !montant.trim().isEmpty()) { + String mf = montant.trim(); + if (!p.getMontant().toString().contains(mf)) { + return false; + } + } + + return true; + }) + .collect(Collectors.toList()); + + int totalElements = filtered.size(); + int totalPages = (int) Math.ceil((double) totalElements / size); + int fromIndex = page * size; + int toIndex = Math.min(fromIndex + size, totalElements); + + List paginated = List.of(); + if (fromIndex < totalElements) { + paginated = filtered.subList(fromIndex, toIndex); + } + + model.addAttribute("paiements", paginated); + model.addAttribute("categories", categorieRepository.findAll()); + model.addAttribute("modesPaiement", modePaiementRepository.findAll()); + model.addAttribute("currentPage", page); + model.addAttribute("pageSize", size); + model.addAttribute("totalPages", totalPages); + model.addAttribute("totalElements", totalElements); + + // Keep filter values in model to restore inputs after swap + model.addAttribute("searchQuery", query); + model.addAttribute("adherentFilter", adherent); + model.addAttribute("categorieFilter", categorie); + model.addAttribute("saisonFilter", saison); + model.addAttribute("modePaiementFilter", modePaiement); + model.addAttribute("montantFilter", montant); + return "paiements/list"; } } diff --git a/as-talange-web/src/main/resources/templates/paiements/list.html b/as-talange-web/src/main/resources/templates/paiements/list.html index d514f7e..6880a40 100644 --- a/as-talange-web/src/main/resources/templates/paiements/list.html +++ b/as-talange-web/src/main/resources/templates/paiements/list.html @@ -4,6 +4,7 @@ Paiements - AS Talange + @@ -21,39 +22,135 @@

Transactions Récentes

-
- - - - - - - - - - - - - - - - - - - - - - - - -
DateAdhérentCatégorieSaisonMode de paiementMontant
Aucun paiement enregistré pour le moment.
15/05/2026 - Jean Dupont - U132024-2025 - Chèque - 50.00 €
+
+
+
+ + + Effacer +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DateAdhérentCatégorieSaisonMode de paiementMontant
+ + + + + + + + + +
Aucun paiement trouvé.
15/05/2026 + Jean Dupont + U132024-2025 + Chèque + 50.00 €
+
+ + +
+
+ Affichage de 1 à + 20 sur + 100 paiements +
+
+ Aucun paiement à afficher +
+
+ + + + Précédent + + + + + + + + + + + Suivant + +
+