Configure Maven repository for unionflow-server-api dependency
This commit is contained in:
@@ -0,0 +1,725 @@
|
||||
<!DOCTYPE html>
|
||||
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
|
||||
xmlns:h="http://xmlns.jcp.org/jsf/html"
|
||||
xmlns:f="http://xmlns.jcp.org/jsf/core"
|
||||
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
|
||||
xmlns:p="http://primefaces.org/ui"
|
||||
template="/templates/main-template.xhtml">
|
||||
|
||||
<ui:define name="title">Gestion des Cotisations - UnionFlow</ui:define>
|
||||
|
||||
<ui:define name="content">
|
||||
<div class="ui-fluid">
|
||||
<!-- En-tête principal avec disposition Freya stricte -->
|
||||
<div class="card">
|
||||
<div class="formgrid grid">
|
||||
<div class="field col-12 lg:col-8">
|
||||
<h2 class="text-primary font-bold mb-2">
|
||||
<i class="pi pi-dollar mr-2"></i>
|
||||
Gestion des Cotisations
|
||||
</h2>
|
||||
<p class="text-600 mt-0">
|
||||
<span class="font-semibold">127 organisations</span> •
|
||||
<span class="font-semibold">#{cotisationsGestionBean.periodeActuelle}</span> •
|
||||
Recouvrement: <span class="font-semibold text-green-600">#{cotisationsGestionBean.tauxRecouvrement}%</span> •
|
||||
<span class="font-semibold">#{cotisationsGestionBean.totalMembresActifs}</span> membres actifs
|
||||
</p>
|
||||
</div>
|
||||
<div class="field col-12 lg:col-4 text-right">
|
||||
<h:form id="formActionsGlobales">
|
||||
<p:commandButton icon="pi pi-megaphone"
|
||||
title="Nouvelle Campagne"
|
||||
styleClass="ui-button-success ui-button-sm mr-3"
|
||||
onclick="PF('dlgNouvelleCampagne').show();" />
|
||||
<p:commandButton icon="pi pi-send"
|
||||
title="Relances groupées"
|
||||
styleClass="ui-button-warning ui-button-outlined ui-button-sm mr-3"
|
||||
action="#{cotisationsGestionBean.relancesGroupees}" />
|
||||
<p:commandButton icon="pi pi-file-excel"
|
||||
title="Export global"
|
||||
styleClass="ui-button-info ui-button-outlined ui-button-sm"
|
||||
action="#{cotisationsGestionBean.exporterTout}" />
|
||||
</h:form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- KPIs Financiers avec grille Freya stricte -->
|
||||
<div class="formgrid grid">
|
||||
<!-- KPI 1: Montant Collecté -->
|
||||
<ui:include src="/templates/components/cards/kpi-card.xhtml">
|
||||
<ui:param name="title" value="Collecté ce mois" />
|
||||
<ui:param name="value" value="#{cotisationsGestionBean.montantCollecte}" />
|
||||
<ui:param name="icon" value="pi-check" />
|
||||
<ui:param name="iconColor" value="green-600" />
|
||||
<ui:param name="growthValue" value="#{cotisationsGestionBean.progressionMensuelle}" />
|
||||
<ui:param name="growthLabel" value="de l'objectif" />
|
||||
<ui:param name="progressValue" value="#{cotisationsGestionBean.progressionMensuelle}" />
|
||||
<ui:param name="colSize" value="col-12 md:col-6 lg:col-3 xl:col-2" />
|
||||
</ui:include>
|
||||
|
||||
<!-- KPI 2: Membres à jour -->
|
||||
<ui:include src="/templates/components/cards/kpi-card.xhtml">
|
||||
<ui:param name="title" value="Membres à jour" />
|
||||
<ui:param name="value" value="#{cotisationsGestionBean.membresAJour}" />
|
||||
<ui:param name="icon" value="pi-users" />
|
||||
<ui:param name="iconColor" value="blue-600" />
|
||||
<ui:param name="statusIcon" value="pi-circle-fill" />
|
||||
<ui:param name="statusLabel" value="Conformes" />
|
||||
<ui:param name="statusValue" value="#{cotisationsGestionBean.pourcentageMembresAJour}%" />
|
||||
<ui:param name="progressValue" value="#{cotisationsGestionBean.pourcentageMembresAJour}" />
|
||||
<ui:param name="colSize" value="col-12 md:col-6 lg:col-3 xl:col-2" />
|
||||
</ui:include>
|
||||
|
||||
<!-- KPI 3: En Attente -->
|
||||
<ui:include src="/templates/components/cards/kpi-card.xhtml">
|
||||
<ui:param name="title" value="En attente" />
|
||||
<ui:param name="value" value="#{cotisationsGestionBean.montantEnAttente}" />
|
||||
<ui:param name="icon" value="pi-clock" />
|
||||
<ui:param name="iconColor" value="orange-600" />
|
||||
<ui:param name="statusIcon" value="pi-exclamation-triangle" />
|
||||
<ui:param name="statusLabel" value="Cotisations" />
|
||||
<ui:param name="statusValue" value="#{cotisationsGestionBean.nombreCotisationsEnAttente}" />
|
||||
<ui:param name="noDataLabel" value="À traiter rapidement" />
|
||||
<ui:param name="colSize" value="col-12 md:col-6 lg:col-3 xl:col-2" />
|
||||
<ui:param name="showProgress" value="false" />
|
||||
</ui:include>
|
||||
|
||||
<!-- KPI 4: Impayés -->
|
||||
<ui:include src="/templates/components/cards/kpi-card.xhtml">
|
||||
<ui:param name="title" value="Impayés" />
|
||||
<ui:param name="value" value="#{cotisationsGestionBean.montantImpayes}" />
|
||||
<ui:param name="icon" value="pi-exclamation-circle" />
|
||||
<ui:param name="iconColor" value="red-600" />
|
||||
<ui:param name="statusIcon" value="pi-arrow-down" />
|
||||
<ui:param name="statusLabel" value="Retard moyen" />
|
||||
<ui:param name="statusValue" value="#{cotisationsGestionBean.joursRetardMoyen}j" />
|
||||
<ui:param name="noDataLabel" value="Action requise" />
|
||||
<ui:param name="colSize" value="col-12 md:col-6 lg:col-3 xl:col-2" />
|
||||
<ui:param name="showProgress" value="false" />
|
||||
</ui:include>
|
||||
|
||||
<!-- KPI 5: Revenus 2024 -->
|
||||
<ui:include src="/templates/components/cards/kpi-card.xhtml">
|
||||
<ui:param name="title" value="Revenus 2024" />
|
||||
<ui:param name="value" value="#{cotisationsGestionBean.revenus2024}" />
|
||||
<ui:param name="icon" value="pi-chart-line" />
|
||||
<ui:param name="iconColor" value="purple-600" />
|
||||
<ui:param name="growthValue" value="#{cotisationsGestionBean.croissanceAnnuelle}" />
|
||||
<ui:param name="growthLabel" value="Croissance annuelle" />
|
||||
<ui:param name="colSize" value="col-12 md:col-6 lg:col-3 xl:col-2" />
|
||||
<ui:param name="showProgress" value="false" />
|
||||
</ui:include>
|
||||
|
||||
<!-- KPI 6: Wave Money -->
|
||||
<ui:include src="/templates/components/cards/kpi-card.xhtml">
|
||||
<ui:param name="title" value="Prélèvements Auto" />
|
||||
<ui:param name="value" value="#{cotisationsGestionBean.prelevementsActifs}" />
|
||||
<ui:param name="icon" value="pi-mobile" />
|
||||
<ui:param name="iconColor" value="teal-600" />
|
||||
<ui:param name="statusIcon" value="pi-sync" />
|
||||
<ui:param name="statusLabel" value="Montant/mois" />
|
||||
<ui:param name="statusValue" value="#{cotisationsGestionBean.montantPrelevementsPrevu} FCFA" />
|
||||
<ui:param name="noDataLabel" value="Automatique" />
|
||||
<ui:param name="colSize" value="col-12 md:col-6 lg:col-3 xl:col-2" />
|
||||
<ui:param name="showProgress" value="false" />
|
||||
</ui:include>
|
||||
</div>
|
||||
|
||||
<!-- Section Analytics avec disposition Freya -->
|
||||
<div class="formgrid grid">
|
||||
<!-- Top Organisations -->
|
||||
<div class="field col-12 lg:col-8">
|
||||
<div class="card">
|
||||
<div class="flex align-items-center justify-content-between mb-3">
|
||||
<h5 class="m-0">
|
||||
<i class="pi pi-trophy text-yellow-500 mr-2"></i>
|
||||
Top 5 Organisations Performantes
|
||||
</h5>
|
||||
<p:selectOneMenu value="#{cotisationsGestionBean.periodeGraphique}" styleClass="w-8rem">
|
||||
<f:selectItem itemLabel="12 mois" itemValue="12M" />
|
||||
<f:selectItem itemLabel="6 mois" itemValue="6M" />
|
||||
<f:selectItem itemLabel="3 mois" itemValue="3M" />
|
||||
<f:selectItem itemLabel="Ce mois" itemValue="1M" />
|
||||
</p:selectOneMenu>
|
||||
</div>
|
||||
|
||||
<p:dataTable value="#{cotisationsGestionBean.topOrganisations}" var="org"
|
||||
styleClass="p-datatable-sm p-datatable-gridlines">
|
||||
<p:column headerText="Organisation" style="width:40%">
|
||||
<div class="flex align-items-center">
|
||||
<div class="flex align-items-center justify-content-center bg-primary-100 border-round mr-2"
|
||||
style="width: 2rem; height: 2rem;">
|
||||
<i class="pi pi-building text-primary-600"></i>
|
||||
</div>
|
||||
<span class="font-semibold">#{org.nom}</span>
|
||||
</div>
|
||||
</p:column>
|
||||
<p:column headerText="Taux" style="width:15%; text-align: center;">
|
||||
<p:progressBar value="#{org.tauxRecouvrement}"
|
||||
labelTemplate="#{org.tauxRecouvrement}%"
|
||||
styleClass="h-1rem" />
|
||||
</p:column>
|
||||
<p:column headerText="Montant" style="width:20%; text-align: right;">
|
||||
<span class="font-bold text-green-600">#{org.montantCollecte} FCFA</span>
|
||||
</p:column>
|
||||
<p:column headerText="Membres" style="width:25%; text-align: center;">
|
||||
<p:tag value="#{org.nombreMembresAJour}/#{org.totalMembres}"
|
||||
severity="info" styleClass="text-xs" />
|
||||
</p:column>
|
||||
</p:dataTable>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Répartition Paiements -->
|
||||
<div class="field col-12 lg:col-4">
|
||||
<div class="card">
|
||||
<h5 class="mb-3">
|
||||
<i class="pi pi-chart-pie text-blue-500 mr-2"></i>
|
||||
Méthodes de Paiement
|
||||
</h5>
|
||||
|
||||
<div class="surface-50 border-round-lg p-3 mb-2">
|
||||
<div class="flex align-items-center justify-content-between mb-2">
|
||||
<div class="flex align-items-center">
|
||||
<i class="pi pi-mobile text-blue-500 mr-2"></i>
|
||||
<span class="font-medium">Wave Money</span>
|
||||
</div>
|
||||
<span class="font-bold">#{cotisationsGestionBean.paiementsWave}%</span>
|
||||
</div>
|
||||
<p:progressBar value="#{cotisationsGestionBean.paiementsWave}"
|
||||
showValue="false"
|
||||
styleClass="h-05rem" />
|
||||
</div>
|
||||
|
||||
<div class="surface-50 border-round-lg p-3 mb-2">
|
||||
<div class="flex align-items-center justify-content-between mb-2">
|
||||
<div class="flex align-items-center">
|
||||
<i class="pi pi-building text-purple-500 mr-2"></i>
|
||||
<span class="font-medium">Virement</span>
|
||||
</div>
|
||||
<span class="font-bold">#{cotisationsGestionBean.paiementsVirement}%</span>
|
||||
</div>
|
||||
<p:progressBar value="#{cotisationsGestionBean.paiementsVirement}"
|
||||
showValue="false"
|
||||
styleClass="h-05rem" />
|
||||
</div>
|
||||
|
||||
<div class="surface-50 border-round-lg p-3">
|
||||
<div class="flex align-items-center justify-content-between mb-2">
|
||||
<div class="flex align-items-center">
|
||||
<i class="pi pi-money-bill text-green-500 mr-2"></i>
|
||||
<span class="font-medium">Espèces</span>
|
||||
</div>
|
||||
<span class="font-bold">#{cotisationsGestionBean.paiementsEspeces}%</span>
|
||||
</div>
|
||||
<p:progressBar value="#{cotisationsGestionBean.paiementsEspeces}"
|
||||
showValue="false"
|
||||
styleClass="h-05rem" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Section Filtrage avec structure Freya -->
|
||||
<div class="card">
|
||||
<h:form id="formFiltres">
|
||||
<div class="formgrid grid">
|
||||
<!-- Filtres principaux -->
|
||||
<div class="field col-12 md:col-6 lg:col-3">
|
||||
<label for="filtreOrganisation" class="block text-900 font-medium mb-2">Organisation</label>
|
||||
<p:selectOneMenu id="filtreOrganisation"
|
||||
value="#{cotisationsGestionBean.filtres.organisation}"
|
||||
filter="true" filterMatchMode="contains"
|
||||
styleClass="w-full">
|
||||
<f:selectItem itemLabel="Toutes les organisations" itemValue="" />
|
||||
<f:selectItems value="#{cotisationsGestionBean.listeOrganisations}"
|
||||
var="org"
|
||||
itemLabel="#{org.nom}"
|
||||
itemValue="#{org.id}" />
|
||||
</p:selectOneMenu>
|
||||
</div>
|
||||
|
||||
<div class="field col-12 md:col-6 lg:col-2">
|
||||
<label for="filtrePeriode" class="block text-900 font-medium mb-2">Période</label>
|
||||
<p:selectOneMenu id="filtrePeriode"
|
||||
value="#{cotisationsGestionBean.filtres.periode}"
|
||||
styleClass="w-full">
|
||||
<f:selectItem itemLabel="Ce mois" itemValue="MOIS" />
|
||||
<f:selectItem itemLabel="3 derniers mois" itemValue="TRIMESTRE" />
|
||||
<f:selectItem itemLabel="6 derniers mois" itemValue="SEMESTRE" />
|
||||
<f:selectItem itemLabel="Cette année" itemValue="ANNEE" />
|
||||
<f:selectItem itemLabel="Toutes" itemValue="TOUTES" />
|
||||
</p:selectOneMenu>
|
||||
</div>
|
||||
|
||||
<div class="field col-12 md:col-6 lg:col-2">
|
||||
<label for="filtreStatut" class="block text-900 font-medium mb-2">Statut</label>
|
||||
<p:selectOneMenu id="filtreStatut"
|
||||
value="#{cotisationsGestionBean.filtres.statut}"
|
||||
styleClass="w-full">
|
||||
<f:selectItem itemLabel="Tous les statuts" itemValue="" />
|
||||
<f:selectItem itemLabel="Payées" itemValue="PAYE" />
|
||||
<f:selectItem itemLabel="En attente" itemValue="EN_ATTENTE" />
|
||||
<f:selectItem itemLabel="En retard" itemValue="EN_RETARD" />
|
||||
<f:selectItem itemLabel="Annulées" itemValue="ANNULE" />
|
||||
</p:selectOneMenu>
|
||||
</div>
|
||||
|
||||
<div class="field col-12 md:col-6 lg:col-2">
|
||||
<label for="filtreType" class="block text-900 font-medium mb-2">Type</label>
|
||||
<p:selectOneMenu id="filtreType"
|
||||
value="#{cotisationsGestionBean.filtres.type}"
|
||||
styleClass="w-full">
|
||||
<f:selectItem itemLabel="Tous les types" itemValue="" />
|
||||
<f:selectItem itemLabel="Mensuelle" itemValue="MENSUELLE" />
|
||||
<f:selectItem itemLabel="Spéciale" itemValue="SPECIALE" />
|
||||
<f:selectItem itemLabel="Adhésion" itemValue="ADHESION" />
|
||||
<f:selectItem itemLabel="Événement" itemValue="EVENEMENT" />
|
||||
</p:selectOneMenu>
|
||||
</div>
|
||||
|
||||
<div class="field col-12 lg:col-3">
|
||||
<label for="recherche" class="block text-900 font-medium mb-2">Recherche</label>
|
||||
<span class="p-input-icon-left w-full">
|
||||
<i class="pi pi-search"></i>
|
||||
<p:inputText id="recherche"
|
||||
value="#{cotisationsGestionBean.filtres.recherche}"
|
||||
placeholder="Membre, numéro, référence..."
|
||||
styleClass="w-full">
|
||||
<p:ajax event="keyup" delay="300"
|
||||
update=":formTableCotisations:dtCotisations"
|
||||
listener="#{cotisationsGestionBean.appliquerFiltres}" />
|
||||
</p:inputText>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Filtres avancés -->
|
||||
<p:panel header="Filtres Avancés (Business Intelligence)"
|
||||
toggleable="true"
|
||||
collapsed="true"
|
||||
styleClass="mt-3">
|
||||
<div class="formgrid grid mt-3">
|
||||
<div class="field col-12 md:col-6 lg:col-3">
|
||||
<label for="filtreMontantMin" class="block text-900 font-medium mb-2">Montant minimum</label>
|
||||
<p:inputNumber id="filtreMontantMin"
|
||||
value="#{cotisationsGestionBean.filtres.montantMin}"
|
||||
suffix=" FCFA"
|
||||
styleClass="w-full" />
|
||||
</div>
|
||||
|
||||
<div class="field col-12 md:col-6 lg:col-3">
|
||||
<label for="filtreMontantMax" class="block text-900 font-medium mb-2">Montant maximum</label>
|
||||
<p:inputNumber id="filtreMontantMax"
|
||||
value="#{cotisationsGestionBean.filtres.montantMax}"
|
||||
suffix=" FCFA"
|
||||
styleClass="w-full" />
|
||||
</div>
|
||||
|
||||
<div class="field col-12 md:col-6 lg:col-3">
|
||||
<label for="filtreRetardJours" class="block text-900 font-medium mb-2">Retard (jours)</label>
|
||||
<p:selectOneMenu id="filtreRetardJours"
|
||||
value="#{cotisationsGestionBean.filtres.retardJours}"
|
||||
styleClass="w-full">
|
||||
<f:selectItem itemLabel="Tous" itemValue="" />
|
||||
<f:selectItem itemLabel="0-7 jours" itemValue="7" />
|
||||
<f:selectItem itemLabel="8-30 jours" itemValue="30" />
|
||||
<f:selectItem itemLabel="31-60 jours" itemValue="60" />
|
||||
<f:selectItem itemLabel="Plus de 60 jours" itemValue="60+" />
|
||||
</p:selectOneMenu>
|
||||
</div>
|
||||
|
||||
<div class="field col-12 md:col-6 lg:col-3">
|
||||
<label for="filtreModePaiement" class="block text-900 font-medium mb-2">Mode de paiement</label>
|
||||
<p:selectOneMenu id="filtreModePaiement"
|
||||
value="#{cotisationsGestionBean.filtres.modePaiement}"
|
||||
styleClass="w-full">
|
||||
<f:selectItem itemLabel="Tous" itemValue="" />
|
||||
<f:selectItem itemLabel="Wave Money" itemValue="WAVE" />
|
||||
<f:selectItem itemLabel="Orange Money" itemValue="ORANGE" />
|
||||
<f:selectItem itemLabel="Virement" itemValue="VIREMENT" />
|
||||
<f:selectItem itemLabel="Espèces" itemValue="ESPECES" />
|
||||
</p:selectOneMenu>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flex justify-content-end mt-3">
|
||||
<p:commandButton value="Appliquer"
|
||||
icon="pi pi-check"
|
||||
styleClass="ui-button-primary ui-button-sm mr-2"
|
||||
action="#{cotisationsGestionBean.appliquerFiltres}"
|
||||
update="@form :formTableCotisations:dtCotisations" />
|
||||
<p:commandButton value="Réinitialiser"
|
||||
icon="pi pi-refresh"
|
||||
styleClass="ui-button-outlined ui-button-secondary ui-button-sm"
|
||||
action="#{cotisationsGestionBean.reinitialiserFiltres}"
|
||||
update="@form :formTableCotisations:dtCotisations" />
|
||||
</div>
|
||||
</p:panel>
|
||||
</h:form>
|
||||
</div>
|
||||
|
||||
<!-- Table des Cotisations avec structure Freya -->
|
||||
<div class="card">
|
||||
<h:form id="formTableCotisations">
|
||||
<div class="flex align-items-center justify-content-between mb-3">
|
||||
<h5 class="m-0">
|
||||
<i class="pi pi-list text-primary mr-2"></i>
|
||||
Liste des Cotisations
|
||||
</h5>
|
||||
<div class="flex gap-3 align-items-center">
|
||||
<p:commandButton value="Actions groupées"
|
||||
icon="pi pi-bars"
|
||||
styleClass="ui-button-warning ui-button-sm"
|
||||
onclick="PF('dlgActionsGroupees').show();"
|
||||
disabled="#{empty cotisationsGestionBean.cotisationsSelectionnees}" />
|
||||
<p:commandButton value="Export Excel"
|
||||
icon="pi pi-file-excel"
|
||||
styleClass="ui-button-success ui-button-outlined ui-button-sm"
|
||||
action="#{cotisationsGestionBean.exporterExcel}" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p:dataTable id="dtCotisations"
|
||||
var="cotisation"
|
||||
value="#{cotisationsGestionBean.cotisationsFiltrees}"
|
||||
selection="#{cotisationsGestionBean.cotisationsSelectionnees}"
|
||||
rowKey="#{cotisation.id}"
|
||||
paginator="true"
|
||||
rows="25"
|
||||
paginatorPosition="bottom"
|
||||
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
|
||||
rowsPerPageTemplate="10,25,50,100"
|
||||
currentPageReportTemplate="Affichage {startRecord}-{endRecord} sur {totalRecords} cotisations"
|
||||
styleClass="p-datatable-sm p-datatable-gridlines p-datatable-striped"
|
||||
emptyMessage="Aucune cotisation trouvée">
|
||||
|
||||
<p:column selectionMode="multiple" style="width:3rem" exportable="false"/>
|
||||
|
||||
<p:column headerText="Organisation" sortBy="#{cotisation.nomOrganisation}" filterBy="#{cotisation.nomOrganisation}">
|
||||
<div class="flex align-items-center">
|
||||
<i class="pi #{cotisation.iconeOrganisation} text-primary mr-2"></i>
|
||||
<div>
|
||||
<div class="font-semibold">#{cotisation.nomOrganisation}</div>
|
||||
<div class="text-500 text-xs">#{cotisation.regionOrganisation}</div>
|
||||
</div>
|
||||
</div>
|
||||
</p:column>
|
||||
|
||||
<p:column headerText="Membre" sortBy="#{cotisation.nomCompletMembre}" filterBy="#{cotisation.nomCompletMembre}">
|
||||
<div class="flex align-items-center">
|
||||
<div class="flex align-items-center justify-content-center bg-primary-100 border-circle mr-2"
|
||||
style="width: 2rem; height: 2rem;">
|
||||
<span class="text-primary-700 font-semibold text-sm">#{cotisation.initialesMembre}</span>
|
||||
</div>
|
||||
<div>
|
||||
<div class="font-medium">#{cotisation.nomCompletMembre}</div>
|
||||
<div class="text-500 text-xs">#{cotisation.numeroMembre} • #{cotisation.typeMembre}</div>
|
||||
</div>
|
||||
</div>
|
||||
</p:column>
|
||||
|
||||
<p:column headerText="Type" sortBy="#{cotisation.type}" filterBy="#{cotisation.type}" style="width:10rem">
|
||||
<p:tag value="#{cotisation.typeLibelle}"
|
||||
severity="#{cotisation.typeSeverity}"
|
||||
icon="pi #{cotisation.typeIcon}"
|
||||
styleClass="text-xs" />
|
||||
</p:column>
|
||||
|
||||
<p:column headerText="Période" sortBy="#{cotisation.periode}" style="width:10rem">
|
||||
<div>
|
||||
<div class="font-medium">#{cotisation.periode}</div>
|
||||
<div class="text-500 text-xs">#{cotisation.annee}</div>
|
||||
</div>
|
||||
</p:column>
|
||||
|
||||
<p:column headerText="Montant" sortBy="#{cotisation.montant}" style="width:8rem; text-align:right">
|
||||
<span class="font-bold text-green-600">#{cotisation.montantFormatte} FCFA</span>
|
||||
</p:column>
|
||||
|
||||
<p:column headerText="Statut" sortBy="#{cotisation.statut}" filterBy="#{cotisation.statut}" style="width:8rem">
|
||||
<p:tag value="#{cotisation.statutLibelle}"
|
||||
severity="#{cotisation.statutSeverity}"
|
||||
icon="pi #{cotisation.statutIcon}"
|
||||
styleClass="text-xs w-full" />
|
||||
</p:column>
|
||||
|
||||
<p:column headerText="Échéance" sortBy="#{cotisation.dateEcheance}" style="width:8rem">
|
||||
<div>
|
||||
<div class="text-xs">#{cotisation.dateEcheanceFormattee}</div>
|
||||
<div class="text-xs #{cotisation.retardCouleur} font-semibold">#{cotisation.retardTexte}</div>
|
||||
</div>
|
||||
</p:column>
|
||||
|
||||
<p:column headerText="Paiement" style="width:10rem">
|
||||
<div rendered="#{cotisation.datePaiement != null}">
|
||||
<div class="text-xs">#{cotisation.datePaiementFormattee}</div>
|
||||
<div class="flex align-items-center text-xs text-500">
|
||||
<i class="pi #{cotisation.modePaiementIcon} mr-1"></i>
|
||||
#{cotisation.modePaiementLibelle}
|
||||
</div>
|
||||
</div>
|
||||
<span class="text-400 text-xs" rendered="#{cotisation.datePaiement == null}">Non payé</span>
|
||||
</p:column>
|
||||
|
||||
<p:column headerText="Actions" style="width:8rem" exportable="false">
|
||||
<div class="flex gap-1">
|
||||
<p:commandButton icon="pi pi-check"
|
||||
styleClass="ui-button-rounded ui-button-text ui-button-success ui-button-sm"
|
||||
title="Enregistrer paiement"
|
||||
action="#{cotisationsGestionBean.enregistrerPaiement(cotisation)}"
|
||||
rendered="#{cotisation.statut != 'PAYE'}" />
|
||||
<p:commandButton icon="pi pi-file-pdf"
|
||||
styleClass="ui-button-rounded ui-button-text ui-button-info ui-button-sm"
|
||||
title="Générer reçu"
|
||||
action="#{cotisationsGestionBean.genererRecu(cotisation)}"
|
||||
rendered="#{cotisation.statut == 'PAYE'}" />
|
||||
<p:commandButton icon="pi pi-send"
|
||||
styleClass="ui-button-rounded ui-button-text ui-button-warning ui-button-sm"
|
||||
title="Envoyer rappel"
|
||||
action="#{cotisationsGestionBean.envoyerRappel(cotisation)}"
|
||||
rendered="#{cotisation.statut == 'EN_RETARD'}" />
|
||||
<p:commandButton icon="pi pi-eye"
|
||||
styleClass="ui-button-rounded ui-button-text ui-button-secondary ui-button-sm"
|
||||
title="Voir détails"
|
||||
action="#{cotisationsGestionBean.voirDetails(cotisation)}" />
|
||||
</div>
|
||||
</p:column>
|
||||
</p:dataTable>
|
||||
|
||||
<!-- Résumé sélection -->
|
||||
<div class="surface-100 border-round-lg p-3 mt-3" rendered="#{not empty cotisationsGestionBean.cotisationsSelectionnees}">
|
||||
<div class="flex align-items-center justify-content-between">
|
||||
<span class="font-medium">
|
||||
<i class="pi pi-info-circle text-blue-500 mr-2"></i>
|
||||
#{cotisationsGestionBean.cotisationsSelectionnees.size()} cotisation(s) sélectionnée(s)
|
||||
</span>
|
||||
<span class="font-bold text-green-600">
|
||||
Montant total: #{cotisationsGestionBean.montantTotalSelectionne}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</h:form>
|
||||
</div>
|
||||
|
||||
<!-- Section Wave Money avec structure Freya -->
|
||||
<div class="formgrid grid">
|
||||
<div class="field col-12 lg:col-6">
|
||||
<div class="card">
|
||||
<h5 class="mb-3">
|
||||
<i class="pi pi-mobile text-teal-500 mr-2"></i>
|
||||
Intégration Wave Money
|
||||
</h5>
|
||||
|
||||
<div class="surface-50 border-round-lg p-3 mb-3">
|
||||
<div class="formgrid grid">
|
||||
<div class="field col-6">
|
||||
<div class="text-500 text-sm mb-1">Membres actifs</div>
|
||||
<div class="text-900 font-bold text-xl">#{cotisationsGestionBean.membresPrelevementActif}</div>
|
||||
</div>
|
||||
<div class="field col-6">
|
||||
<div class="text-500 text-sm mb-1">Montant mensuel</div>
|
||||
<div class="text-900 font-bold text-xl">#{cotisationsGestionBean.montantPrelevementMensuel}</div>
|
||||
</div>
|
||||
<div class="field col-12">
|
||||
<div class="text-500 text-sm mb-1">Prochain prélèvement</div>
|
||||
<div class="text-900 font-bold">#{cotisationsGestionBean.prochainPrelevement}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h:form id="formWaveMoney">
|
||||
<div class="flex flex-wrap gap-2">
|
||||
<p:commandButton value="Lancer prélèvements"
|
||||
icon="pi pi-play"
|
||||
styleClass="ui-button-success ui-button-sm"
|
||||
action="#{cotisationsGestionBean.lancerPrelevements}" />
|
||||
<p:commandButton value="Tester API"
|
||||
icon="pi pi-check-circle"
|
||||
styleClass="ui-button-info ui-button-outlined ui-button-sm"
|
||||
action="#{cotisationsGestionBean.testerAPIWave}" />
|
||||
<p:commandButton value="Historique"
|
||||
icon="pi pi-history"
|
||||
styleClass="ui-button-secondary ui-button-outlined ui-button-sm"
|
||||
action="#{cotisationsGestionBean.voirHistoriquePrelevements}" />
|
||||
</div>
|
||||
</h:form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="field col-12 lg:col-6">
|
||||
<div class="card">
|
||||
<h5 class="mb-3">
|
||||
<i class="pi pi-bolt text-orange-500 mr-2"></i>
|
||||
Actions Rapides
|
||||
</h5>
|
||||
|
||||
<h:form id="formActionsRapides">
|
||||
<div class="formgrid grid">
|
||||
<div class="field col-12 md:col-6">
|
||||
<p:commandButton value="Rapport mensuel"
|
||||
icon="pi pi-chart-bar"
|
||||
styleClass="ui-button-primary ui-button-outlined ui-button-sm w-full mb-2"
|
||||
action="#{cotisationsGestionBean.genererRapportMensuel}" />
|
||||
</div>
|
||||
<div class="field col-12 md:col-6">
|
||||
<p:commandButton value="Relances auto"
|
||||
icon="pi pi-sync"
|
||||
styleClass="ui-button-warning ui-button-outlined ui-button-sm w-full mb-2"
|
||||
action="#{cotisationsGestionBean.configurerRelancesAuto}" />
|
||||
</div>
|
||||
<div class="field col-12 md:col-6">
|
||||
<p:commandButton value="Types cotisations"
|
||||
icon="pi pi-tags"
|
||||
styleClass="ui-button-info ui-button-outlined ui-button-sm w-full mb-2"
|
||||
action="#{cotisationsGestionBean.gererTypesCotisations}" />
|
||||
</div>
|
||||
<div class="field col-12 md:col-6">
|
||||
<p:commandButton value="Tableau de bord"
|
||||
icon="pi pi-desktop"
|
||||
styleClass="ui-button-success ui-button-outlined ui-button-sm w-full mb-2"
|
||||
action="#{cotisationsGestionBean.tableauDeBord}" />
|
||||
</div>
|
||||
</div>
|
||||
</h:form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Dialogs avec structure Freya -->
|
||||
|
||||
<!-- Dialog Nouvelle Campagne -->
|
||||
<p:dialog header="Créer une Nouvelle Campagne de Cotisation"
|
||||
widgetVar="dlgNouvelleCampagne"
|
||||
modal="true"
|
||||
width="600"
|
||||
height="auto"
|
||||
resizable="false">
|
||||
<h:form id="formNouvelleCampagne">
|
||||
<div class="ui-fluid formgrid grid">
|
||||
<div class="field col-12">
|
||||
<label for="nomCampagne" class="block text-900 font-medium mb-2">Nom de la campagne *</label>
|
||||
<p:inputText id="nomCampagne"
|
||||
value="#{cotisationsGestionBean.nouvelleCampagne.nom}"
|
||||
required="true"
|
||||
placeholder="Ex: Cotisation Janvier 2025" />
|
||||
</div>
|
||||
|
||||
<div class="field col-12 md:col-6">
|
||||
<label for="typeCampagne" class="block text-900 font-medium mb-2">Type *</label>
|
||||
<p:selectOneMenu id="typeCampagne"
|
||||
value="#{cotisationsGestionBean.nouvelleCampagne.type}"
|
||||
required="true">
|
||||
<f:selectItem itemLabel="Sélectionner..." itemValue="" />
|
||||
<f:selectItem itemLabel="Mensuelle" itemValue="MENSUELLE" />
|
||||
<f:selectItem itemLabel="Spéciale" itemValue="SPECIALE" />
|
||||
<f:selectItem itemLabel="Événement" itemValue="EVENEMENT" />
|
||||
<f:selectItem itemLabel="Adhésion" itemValue="ADHESION" />
|
||||
</p:selectOneMenu>
|
||||
</div>
|
||||
|
||||
<div class="field col-12 md:col-6">
|
||||
<label for="montantCampagne" class="block text-900 font-medium mb-2">Montant (FCFA) *</label>
|
||||
<p:inputNumber id="montantCampagne"
|
||||
value="#{cotisationsGestionBean.nouvelleCampagne.montant}"
|
||||
required="true"
|
||||
symbol=" FCFA"
|
||||
symbolPosition="s"
|
||||
minValue="0" />
|
||||
</div>
|
||||
|
||||
<div class="field col-12 md:col-6">
|
||||
<label for="dateEcheanceCampagne" class="block text-900 font-medium mb-2">Date d'échéance *</label>
|
||||
<p:datePicker id="dateEcheanceCampagne"
|
||||
value="#{cotisationsGestionBean.nouvelleCampagne.dateEcheance}"
|
||||
required="true"
|
||||
showIcon="true"
|
||||
pattern="dd/MM/yyyy" />
|
||||
</div>
|
||||
|
||||
<div class="field col-12 md:col-6">
|
||||
<label for="scopeCampagne" class="block text-900 font-medium mb-2">Portée</label>
|
||||
<p:selectOneMenu id="scopeCampagne"
|
||||
value="#{cotisationsGestionBean.nouvelleCampagne.scope}">
|
||||
<f:selectItem itemLabel="Toutes les organisations" itemValue="TOUTES" />
|
||||
<f:selectItem itemLabel="Organisations sélectionnées" itemValue="SELECTION" />
|
||||
<f:selectItem itemLabel="Par région" itemValue="REGION" />
|
||||
</p:selectOneMenu>
|
||||
</div>
|
||||
|
||||
<div class="field col-12">
|
||||
<label for="descriptionCampagne" class="block text-900 font-medium mb-2">Description</label>
|
||||
<p:inputTextarea id="descriptionCampagne"
|
||||
value="#{cotisationsGestionBean.nouvelleCampagne.description}"
|
||||
rows="3"
|
||||
placeholder="Description optionnelle de la campagne..." />
|
||||
</div>
|
||||
|
||||
<div class="field col-12">
|
||||
<p:selectBooleanCheckbox id="relanceAuto"
|
||||
value="#{cotisationsGestionBean.nouvelleCampagne.relanceAutomatique}" />
|
||||
<label for="relanceAuto" class="ml-2">Activer les relances automatiques</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flex justify-content-end gap-2 mt-3">
|
||||
<p:commandButton value="Annuler"
|
||||
icon="pi pi-times"
|
||||
styleClass="ui-button-secondary ui-button-outlined ui-button-sm"
|
||||
onclick="PF('dlgNouvelleCampagne').hide();"
|
||||
type="button" />
|
||||
<p:commandButton value="Créer la campagne"
|
||||
icon="pi pi-check"
|
||||
styleClass="ui-button-success ui-button-sm"
|
||||
action="#{cotisationsGestionBean.creerCampagne}"
|
||||
update="@form"
|
||||
oncomplete="if(!args.validationFailed) PF('dlgNouvelleCampagne').hide();" />
|
||||
</div>
|
||||
</h:form>
|
||||
</p:dialog>
|
||||
|
||||
<!-- Dialog Actions Groupées -->
|
||||
<p:dialog header="Actions Groupées"
|
||||
widgetVar="dlgActionsGroupees"
|
||||
modal="true"
|
||||
width="400"
|
||||
height="auto"
|
||||
resizable="false">
|
||||
<h:form id="formActionsGroupees">
|
||||
<div class="surface-50 border-round-lg p-3 mb-3">
|
||||
<div class="text-500 text-sm mb-1">Cotisations sélectionnées</div>
|
||||
<div class="text-900 font-bold text-xl">#{cotisationsGestionBean.cotisationsSelectionnees.size()}</div>
|
||||
<div class="text-500 text-sm">Montant total: #{cotisationsGestionBean.montantTotalSelectionne}</div>
|
||||
</div>
|
||||
|
||||
<div class="flex flex-column gap-2">
|
||||
<p:commandButton value="Marquer comme payées"
|
||||
icon="pi pi-check"
|
||||
styleClass="ui-button-success ui-button-sm w-full"
|
||||
action="#{cotisationsGestionBean.marquerPayeesGroupees}"
|
||||
onclick="PF('dlgActionsGroupees').hide();" />
|
||||
|
||||
<p:commandButton value="Envoyer relances"
|
||||
icon="pi pi-send"
|
||||
styleClass="ui-button-warning ui-button-sm w-full"
|
||||
action="#{cotisationsGestionBean.envoyerRelancesGroupees}"
|
||||
onclick="PF('dlgActionsGroupees').hide();" />
|
||||
|
||||
<p:commandButton value="Générer reçus"
|
||||
icon="pi pi-file-pdf"
|
||||
styleClass="ui-button-info ui-button-sm w-full"
|
||||
action="#{cotisationsGestionBean.genererRecusGroupes}"
|
||||
onclick="PF('dlgActionsGroupees').hide();" />
|
||||
|
||||
<p:commandButton value="Annuler cotisations"
|
||||
icon="pi pi-times"
|
||||
styleClass="ui-button-danger ui-button-outlined ui-button-sm w-full"
|
||||
action="#{cotisationsGestionBean.annulerCotisationsGroupees}"
|
||||
onclick="return confirm('Êtes-vous sûr de vouloir annuler ces cotisations ?');" />
|
||||
</div>
|
||||
</h:form>
|
||||
</p:dialog>
|
||||
</ui:define>
|
||||
</ui:composition>
|
||||
Reference in New Issue
Block a user