Configure Maven repository for unionflow-server-api dependency

This commit is contained in:
dahoud
2025-12-10 01:12:54 +00:00
commit 2910809949
1173 changed files with 435718 additions and 0 deletions

View File

@@ -0,0 +1,449 @@
<!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">Rapports Financiers - UnionFlow</ui:define>
<ui:define name="content">
<!-- En-tête -->
<div class="grid">
<div class="col-12">
<div class="card">
<div class="flex align-items-center justify-content-between">
<div>
<h3 class="mb-2">
<i class="pi pi-chart-bar text-indigo-500 mr-2"></i>
Rapports Financiers
</h3>
<p class="text-600 m-0">Analyse complète de la situation financière • #{rapportBean.periodeAnalyse}</p>
</div>
<div class="flex gap-2">
<p:commandButton value="Générer rapport PDF"
icon="pi pi-file-pdf"
styleClass="ui-button-danger"
action="#{rapportBean.genererPDF}" />
<p:commandButton value="Exporter Excel"
icon="pi pi-file-excel"
styleClass="ui-button-success"
action="#{rapportBean.exporterExcel}" />
<p:commandButton value="Imprimer"
icon="pi pi-print"
styleClass="ui-button-outlined ui-button-secondary"
onclick="window.print();" />
</div>
</div>
</div>
</div>
</div>
<!-- Sélection de période -->
<div class="card">
<h:form id="formPeriode">
<div class="flex align-items-center gap-3">
<p:selectOneMenu value="#{rapportBean.typePeriode}" style="width: 200px;">
<f:selectItem itemLabel="Cette année" itemValue="ANNEE" />
<f:selectItem itemLabel="Ce trimestre" itemValue="TRIMESTRE" />
<f:selectItem itemLabel="Ce mois" itemValue="MOIS" />
<f:selectItem itemLabel="Période personnalisée" itemValue="CUSTOM" />
<p:ajax update="@form :kpiPanel :graphsPanel :detailsPanel" />
</p:selectOneMenu>
<p:calendar id="dateDebut" value="#{rapportBean.dateDebut}"
pattern="dd/MM/yyyy" showIcon="true"
placeholder="Date début"
disabled="#{rapportBean.typePeriode != 'CUSTOM'}">
<p:ajax event="dateSelect" update=":kpiPanel :graphsPanel :detailsPanel" />
</p:calendar>
<p:calendar id="dateFin" value="#{rapportBean.dateFin}"
pattern="dd/MM/yyyy" showIcon="true"
placeholder="Date fin"
disabled="#{rapportBean.typePeriode != 'CUSTOM'}">
<p:ajax event="dateSelect" update=":kpiPanel :graphsPanel :detailsPanel" />
</p:calendar>
<p:commandButton value="Actualiser"
icon="pi pi-refresh"
styleClass="ui-button-outlined ui-button-info"
action="#{rapportBean.actualiser}"
update=":kpiPanel :graphsPanel :detailsPanel" />
</div>
</h:form>
</div>
<!-- KPIs Financiers -->
<h:panelGroup id="kpiPanel">
<div class="formgrid grid">
<ui:include src="/templates/components/cards/kpi-card.xhtml">
<ui:param name="title" value="Revenus Totaux" />
<ui:param name="value" value="#{rapportBean.revenusTotaux}" />
<ui:param name="icon" value="pi-dollar" />
<ui:param name="iconColor" value="blue-600" />
<ui:param name="growthValue" value="#{rapportBean.croissanceRevenus}" />
<ui:param name="growthLabel" value="vs période précédente" />
<ui:param name="showProgress" value="false" />
</ui:include>
<ui:include src="/templates/components/cards/kpi-card.xhtml">
<ui:param name="title" value="Dépenses Totales" />
<ui:param name="value" value="#{rapportBean.depensesTotales}" />
<ui:param name="icon" value="pi-shopping-cart" />
<ui:param name="iconColor" value="orange-600" />
<ui:param name="growthValue" value="#{rapportBean.croissanceDepenses}" />
<ui:param name="growthLabel" value="vs période précédente" />
<ui:param name="showProgress" value="false" />
</ui:include>
<ui:include src="/templates/components/cards/kpi-card.xhtml">
<ui:param name="title" value="Bénéfice Net" />
<ui:param name="value" value="#{rapportBean.beneficeNet}" />
<ui:param name="icon" value="pi-chart-line" />
<ui:param name="iconColor" value="green-600" />
<ui:param name="progressValue" value="#{rapportBean.margePercentage}" />
<ui:param name="showGrowth" value="false" />
</ui:include>
<ui:include src="/templates/components/cards/kpi-card.xhtml">
<ui:param name="title" value="Trésorerie" />
<ui:param name="value" value="#{rapportBean.tresorerie}" />
<ui:param name="icon" value="pi-wallet" />
<ui:param name="iconColor" value="purple-600" />
<ui:param name="statusIcon" value="pi-info-circle" />
<ui:param name="statusLabel" value="Jours d'autonomie" />
<ui:param name="statusValue" value="#{rapportBean.joursAutonomie}" />
<ui:param name="showProgress" value="false" />
</ui:include>
</div>
</h:panelGroup>
<!-- Graphiques -->
<h:panelGroup id="graphsPanel">
<div class="grid">
<!-- Évolution Revenus/Dépenses -->
<div class="col-12 md:col-6">
<div class="card">
<h5>Évolution Revenus vs Dépenses</h5>
<div class="surface-100 p-4 border-round text-center"><div class="text-2xl font-bold text-primary mb-2">📊</div><div class="text-600">Graphique en cours de développement</div></div>
</div>
</div>
<!-- Répartition des Revenus -->
<div class="col-12 md:col-6">
<div class="card">
<h5>Sources de Revenus</h5>
<div class="surface-100 p-4 border-round text-center"><div class="text-2xl font-bold text-primary mb-2">📊</div><div class="text-600">Graphique en cours de développement</div></div>
</div>
</div>
<!-- Répartition des Dépenses -->
<div class="col-12 md:col-6">
<div class="card">
<h5>Catégories de Dépenses</h5>
<div class="surface-100 p-4 border-round text-center"><div class="text-2xl font-bold text-primary mb-2">📊</div><div class="text-600">Graphique en cours de développement</div></div>
</div>
</div>
<!-- Cash Flow -->
<div class="col-12 md:col-6">
<div class="card">
<h5>Cash Flow Mensuel</h5>
<div class="surface-100 p-4 border-round text-center"><div class="text-2xl font-bold text-primary mb-2">📊</div><div class="text-600">Graphique en cours de développement</div></div>
</div>
</div>
</div>
</h:panelGroup>
<!-- Analyse Détaillée -->
<h:panelGroup id="detailsPanel">
<div class="grid">
<!-- Top Contributeurs -->
<div class="col-12 md:col-6">
<div class="card">
<h5>Top 10 Contributeurs</h5>
<ui:repeat value="#{rapportBean.topContributeurs}" var="contributeur" varStatus="status">
<div class="flex align-items-center justify-content-between p-3 mb-2 border-round"
style="background: var(--surface-50);">
<div class="flex align-items-center">
<div class="bg-primary text-white border-round text-center mr-3"
style="width: 2rem; height: 2rem; line-height: 2rem;">
#{status.index + 1}
</div>
<div>
<div class="font-medium">#{contributeur.nom}</div>
<small class="text-600">#{contributeur.numeroMembre}</small>
</div>
</div>
<div class="text-right">
<div class="font-bold text-primary">#{contributeur.montantTotal}</div>
<small class="text-600">#{contributeur.nombreContributions} contributions</small>
</div>
</div>
</ui:repeat>
</div>
</div>
<!-- Prévisions -->
<div class="col-12 md:col-6">
<div class="card">
<h5>Prévisions Financières</h5>
<div class="surface-50 p-3 border-round mb-3">
<div class="flex align-items-center justify-content-between mb-2">
<span class="font-medium">Revenus prévus (3 mois)</span>
<span class="font-bold text-green-500">#{rapportBean.revenusPrevus3Mois}</span>
</div>
<div class="flex align-items-center justify-content-between mb-2">
<span class="font-medium">Dépenses prévues (3 mois)</span>
<span class="font-bold text-orange-500">#{rapportBean.depensesPrevues3Mois}</span>
</div>
<div class="flex align-items-center justify-content-between">
<span class="font-medium">Solde prévisionnel</span>
<span class="font-bold text-primary">#{rapportBean.soldePrevisionnel}</span>
</div>
</div>
<h6>Recommandations</h6>
<ui:repeat value="#{rapportBean.recommandations}" var="recommandation">
<div class="flex align-items-start mb-2">
<i class="pi pi-lightbulb text-yellow-500 mr-2 mt-1"></i>
<span>#{recommandation}</span>
</div>
</ui:repeat>
</div>
</div>
</div>
<!-- Tableau Détaillé des Transactions -->
<div class="card">
<h:form id="formTransactions">
<h5>Détail des Transactions</h5>
<p:tabView>
<p:tab title="Revenus">
<p:dataTable var="revenu" value="#{rapportBean.detailRevenus}"
paginator="true" rows="10"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink}"
currentPageReportTemplate="Affichage {startRecord}-{endRecord} sur {totalRecords}">
<p:column headerText="Date" sortBy="#{revenu.date}" style="width:120px">
<h:outputText value="#{revenu.date}">
<f:convertDateTime pattern="dd/MM/yyyy" type="localDate" />
</h:outputText>
</p:column>
<p:column headerText="Catégorie" sortBy="#{revenu.categorie}">
<p:tag value="#{revenu.categorie}" styleClass="#{revenu.categorieClass}" />
</p:column>
<p:column headerText="Description" sortBy="#{revenu.description}">
<h:outputText value="#{revenu.description}" />
</p:column>
<p:column headerText="Montant" sortBy="#{revenu.montant}" style="width:150px">
<h:outputText value="#{revenu.montant}" styleClass="font-bold text-green-500">
<f:convertNumber type="currency" currencySymbol="FCFA " />
</h:outputText>
</p:column>
<p:column headerText="Mode" style="width:120px">
<div class="flex align-items-center">
<i class="pi #{revenu.modeIcon} mr-2"></i>
<span>#{revenu.modePaiement}</span>
</div>
</p:column>
</p:dataTable>
</p:tab>
<p:tab title="Dépenses">
<p:dataTable var="depense" value="#{rapportBean.detailDepenses}"
paginator="true" rows="10"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink}"
currentPageReportTemplate="Affichage {startRecord}-{endRecord} sur {totalRecords}">
<p:column headerText="Date" sortBy="#{depense.date}" style="width:120px">
<h:outputText value="#{depense.date}">
<f:convertDateTime pattern="dd/MM/yyyy" type="localDate" />
</h:outputText>
</p:column>
<p:column headerText="Catégorie" sortBy="#{depense.categorie}">
<p:tag value="#{depense.categorie}" styleClass="#{depense.categorieClass}" />
</p:column>
<p:column headerText="Description" sortBy="#{depense.description}">
<h:outputText value="#{depense.description}" />
</p:column>
<p:column headerText="Bénéficiaire" sortBy="#{depense.beneficiaire}">
<h:outputText value="#{depense.beneficiaire}" />
</p:column>
<p:column headerText="Montant" sortBy="#{depense.montant}" style="width:150px">
<h:outputText value="#{depense.montant}" styleClass="font-bold text-red-500">
<f:convertNumber type="currency" currencySymbol="FCFA " />
</h:outputText>
</p:column>
<p:column headerText="Justificatif" style="width:100px; text-align:center;">
<p:commandButton icon="pi pi-file"
styleClass="ui-button-rounded ui-button-text"
action="#{rapportBean.voirJustificatif(depense)}"
rendered="#{depense.hasJustificatif}" />
</p:column>
</p:dataTable>
</p:tab>
</p:tabView>
</h:form>
</div>
<!-- Ratios et Indicateurs -->
<div class="card">
<h5>Indicateurs Clés de Performance</h5>
<div class="formgrid grid">
<ui:include src="/templates/components/cards/kpi-card.xhtml">
<ui:param name="title" value="Taux de Recouvrement" />
<ui:param name="value" value="#{rapportBean.tauxRecouvrement}%" />
<ui:param name="icon" value="pi-percentage" />
<ui:param name="iconColor" value="blue-600" />
<ui:param name="showGrowth" value="false" />
<ui:param name="showProgress" value="false" />
</ui:include>
<ui:include src="/templates/components/cards/kpi-card.xhtml">
<ui:param name="title" value="Ratio de Couverture" />
<ui:param name="value" value="#{rapportBean.ratioCouverture}" />
<ui:param name="icon" value="pi-shield" />
<ui:param name="iconColor" value="green-600" />
<ui:param name="showGrowth" value="false" />
<ui:param name="showProgress" value="false" />
</ui:include>
<ui:include src="/templates/components/cards/kpi-card.xhtml">
<ui:param name="title" value="Coût Moyen/Membre" />
<ui:param name="value" value="#{rapportBean.coutMoyenMembre}" />
<ui:param name="icon" value="pi-user-minus" />
<ui:param name="iconColor" value="orange-600" />
<ui:param name="showGrowth" value="false" />
<ui:param name="showProgress" value="false" />
</ui:include>
<ui:include src="/templates/components/cards/kpi-card.xhtml">
<ui:param name="title" value="Revenu Moyen/Membre" />
<ui:param name="value" value="#{rapportBean.revenuMoyenMembre}" />
<ui:param name="icon" value="pi-user-plus" />
<ui:param name="iconColor" value="purple-600" />
<ui:param name="showGrowth" value="false" />
<ui:param name="showProgress" value="false" />
</ui:include>
</div>
</div>
</h:panelGroup>
<!-- Actions d'export -->
<div class="card">
<div class="flex justify-content-center gap-3">
<p:commandButton value="Envoyer par email"
icon="pi pi-envelope"
styleClass="ui-button-outlined ui-button-info"
onclick="PF('dlgEmail').show();" />
<p:commandButton value="Programmer rapport automatique"
icon="pi pi-calendar"
styleClass="ui-button-outlined ui-button-warning"
onclick="PF('dlgProgrammer').show();" />
<p:commandButton value="Archiver"
icon="pi pi-save"
styleClass="ui-button-outlined ui-button-secondary"
action="#{rapportBean.archiver}" />
</div>
</div>
<!-- Dialog Email -->
<p:dialog header="Envoyer le rapport par email" widgetVar="dlgEmail" modal="true" width="500">
<h:form id="formEmail">
<div class="ui-fluid">
<div class="field">
<p:outputLabel for="destinataires" value="Destinataires" />
<p:chips id="destinataires" value="#{rapportBean.destinataires}" />
</div>
<div class="field">
<p:outputLabel for="message" value="Message" />
<p:inputTextarea id="message" value="#{rapportBean.messageEmail}" rows="5" />
</div>
<div class="field">
<p:selectBooleanCheckbox id="inclurePDF" value="#{rapportBean.inclurePDF}" />
<p:outputLabel for="inclurePDF" value=" Inclure le rapport PDF" />
</div>
<div class="field">
<p:selectBooleanCheckbox id="inclureExcel" value="#{rapportBean.inclureExcel}" />
<p:outputLabel for="inclureExcel" value=" Inclure le fichier Excel" />
</div>
</div>
<div class="flex gap-2 mt-3">
<p:commandButton value="Envoyer" icon="pi pi-send"
styleClass="ui-button-info"
action="#{rapportBean.envoyerEmail}"
oncomplete="PF('dlgEmail').hide();" />
<p:commandButton value="Annuler" icon="pi pi-times"
styleClass="ui-button-secondary"
onclick="PF('dlgEmail').hide();" type="button" />
</div>
</h:form>
</p:dialog>
<!-- Dialog Programmer -->
<p:dialog header="Programmer rapport automatique" widgetVar="dlgProgrammer" modal="true" width="500">
<h:form id="formProgrammer">
<div class="ui-fluid">
<div class="field">
<p:outputLabel for="frequence" value="Fréquence" />
<p:selectOneMenu id="frequence" value="#{rapportBean.frequence}">
<f:selectItem itemLabel="Quotidien" itemValue="QUOTIDIEN" />
<f:selectItem itemLabel="Hebdomadaire" itemValue="HEBDOMADAIRE" />
<f:selectItem itemLabel="Mensuel" itemValue="MENSUEL" />
<f:selectItem itemLabel="Trimestriel" itemValue="TRIMESTRIEL" />
</p:selectOneMenu>
</div>
<div class="field">
<p:outputLabel for="jourEnvoi" value="Jour d'envoi" />
<p:selectOneMenu id="jourEnvoi" value="#{rapportBean.jourEnvoi}">
<f:selectItem itemLabel="Lundi" itemValue="1" />
<f:selectItem itemLabel="Mardi" itemValue="2" />
<f:selectItem itemLabel="Mercredi" itemValue="3" />
<f:selectItem itemLabel="Jeudi" itemValue="4" />
<f:selectItem itemLabel="Vendredi" itemValue="5" />
</p:selectOneMenu>
</div>
<div class="field">
<p:outputLabel for="heureEnvoi" value="Heure d'envoi" />
<p:inputText id="heureEnvoi" value="#{rapportBean.heureEnvoi}" placeholder="09:00" />
</div>
<div class="field">
<p:outputLabel for="destinatairesProg" value="Destinataires" />
<p:chips id="destinatairesProg" value="#{rapportBean.destinatairesProgrammes}" />
</div>
</div>
<div class="flex gap-2 mt-3">
<p:commandButton value="Programmer" icon="pi pi-check"
styleClass="ui-button-warning"
action="#{rapportBean.programmerRapport}"
oncomplete="PF('dlgProgrammer').hide();" />
<p:commandButton value="Annuler" icon="pi pi-times"
styleClass="ui-button-secondary"
onclick="PF('dlgProgrammer').hide();" type="button" />
</div>
</h:form>
</p:dialog>
</ui:define>
</ui:composition>

View File

@@ -0,0 +1,566 @@
<!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">Rapports et Statistiques - UnionFlow</ui:define>
<ui:define name="content">
<div class="ui-fluid">
<!-- En-tête avec disposition Freya stricte -->
<div class="card surface-0 hover:surface-100 border-round-lg transition-all transition-duration-200">
<div class="p-4">
<div class="formgrid grid">
<div class="field col-12 lg:col-8">
<h2 class="text-primary font-bold mb-2">
<i class="pi pi-chart-bar text-blue-500 mr-2"></i>
Rapports et Statistiques
</h2>
<p class="text-600 mt-0">Analyse des données et indicateurs de performance</p>
</div>
<div class="field col-12 lg:col-4 text-right">
<h:form id="formActionsEntete">
<div class="formgrid grid">
<div class="field col-12 md:col-4">
<p:commandButton value="Générer"
icon="pi pi-file-pdf"
styleClass="ui-button-success ui-button-sm w-full"
onclick="PF('dlgGenererRapport').show();" />
</div>
<div class="field col-12 md:col-4">
<p:commandButton value="Planifier"
icon="pi pi-calendar-plus"
styleClass="ui-button-info ui-button-outlined ui-button-sm w-full"
onclick="PF('dlgPlanifierRapport').show();" />
</div>
<div class="field col-12 md:col-4">
<p:commandButton value="Exporter"
icon="pi pi-download"
styleClass="ui-button-secondary ui-button-outlined ui-button-sm w-full"
action="#{rapportsBean.exporterDonnees}" />
</div>
</div>
</h:form>
</div>
</div>
</div>
</div>
<!-- Sélecteur de période avec Freya stricte -->
<div class="card surface-0 hover:surface-100 border-round-lg transition-all transition-duration-200">
<div class="p-4">
<h5 class="text-900 font-bold mb-4">
<i class="pi pi-calendar text-blue-500 mr-2"></i>
Période d'Analyse
</h5>
<h:form id="formPeriode">
<div class="ui-fluid">
<div class="formgrid grid">
<div class="field col-12 md:col-3">
<p:outputLabel for="periodeRapide" value="Période rapide" />
<p:selectOneMenu id="periodeRapide" value="#{rapportsBean.periodeRapide}">
<f:selectItem itemLabel="Personnalisée" itemValue="" />
<f:selectItem itemLabel="7 derniers jours" itemValue="7_JOURS" />
<f:selectItem itemLabel="30 derniers jours" itemValue="30_JOURS" />
<f:selectItem itemLabel="3 derniers mois" itemValue="3_MOIS" />
<f:selectItem itemLabel="6 derniers mois" itemValue="6_MOIS" />
<f:selectItem itemLabel="Cette année" itemValue="ANNEE_COURANTE" />
<f:selectItem itemLabel="Année dernière" itemValue="ANNEE_PRECEDENTE" />
<p:ajax update="@form :indicateursGlobaux :graphiquesEvolution" />
</p:selectOneMenu>
</div>
<div class="field col-12 md:col-3">
<p:outputLabel for="dateDebut" value="Date début" />
<p:datePicker id="dateDebut" value="#{rapportsBean.dateDebut}"
placeholder="Date de début">
<p:ajax update=":indicateursGlobaux :graphiquesEvolution" />
</p:datePicker>
</div>
<div class="field col-12 md:col-3">
<p:outputLabel for="dateFin" value="Date fin" />
<p:datePicker id="dateFin" value="#{rapportsBean.dateFin}"
placeholder="Date de fin">
<p:ajax update=":indicateursGlobaux :graphiquesEvolution" />
</p:datePicker>
</div>
<div class="field col-12 md:col-3">
<p:outputLabel for="groupeComparaison" value="Comparer avec" />
<p:selectOneMenu id="groupeComparaison" value="#{rapportsBean.groupeComparaison}">
<f:selectItem itemLabel="Aucune comparaison" itemValue="" />
<f:selectItem itemLabel="Période précédente" itemValue="PERIODE_PRECEDENTE" />
<f:selectItem itemLabel="Même période année passée" itemValue="ANNEE_PASSEE" />
<f:selectItem itemLabel="Moyenne historique" itemValue="MOYENNE_HISTORIQUE" />
<p:ajax update=":indicateursGlobaux" />
</p:selectOneMenu>
</div>
</div>
</div>
</h:form>
</div>
</div>
<!-- Indicateurs globaux avec Freya stricte -->
<p:outputPanel id="indicateursGlobaux">
<div class="formgrid grid">
<div class="field col-12 md:col-6 lg:col-3">
<div class="card surface-0 hover:surface-100 border-round-lg transition-all transition-duration-200">
<div class="p-4" style="min-height: 9rem;">
<div class="flex align-items-center justify-content-between mb-3">
<span class="block text-600 font-medium text-sm">Total Membres</span>
<div class="flex align-items-center justify-content-center surface-100 border-round-lg"
style="width: 2.5rem; height: 2.5rem;">
<i class="pi pi-users text-blue-600 text-lg"></i>
</div>
</div>
<div class="text-900 font-bold text-2xl mb-3">#{rapportsBean.indicateurs.totalMembres}</div>
<div class="flex align-items-center mb-2">
<i class="pi pi-arrow-up text-green-500 text-sm mr-2"></i>
<span class="text-green-600 font-semibold text-sm mr-2">+#{rapportsBean.indicateurs.croissanceMembres}%</span>
<span class="text-500 text-xs">ce mois</span>
</div>
</div>
</div>
</div>
<div class="field col-12 md:col-6 lg:col-3">
<div class="card surface-0 hover:surface-100 border-round-lg transition-all transition-duration-200">
<div class="p-4" style="min-height: 9rem;">
<div class="flex align-items-center justify-content-between mb-3">
<span class="block text-600 font-medium text-sm">Revenus Total</span>
<div class="flex align-items-center justify-content-center surface-100 border-round-lg"
style="width: 2.5rem; height: 2.5rem;">
<i class="pi pi-dollar text-green-600 text-lg"></i>
</div>
</div>
<div class="text-900 font-bold text-2xl mb-3">#{rapportsBean.indicateurs.revenus}</div>
<div class="flex align-items-center mb-2">
<i class="pi pi-arrow-up text-green-500 text-sm mr-2"></i>
<span class="text-green-600 font-semibold text-sm mr-2">+#{rapportsBean.indicateurs.croissanceRevenus}%</span>
<span class="text-500 text-xs">ce mois</span>
</div>
</div>
</div>
</div>
<div class="field col-12 md:col-6 lg:col-3">
<div class="card surface-0 hover:surface-100 border-round-lg transition-all transition-duration-200">
<div class="p-4" style="min-height: 9rem;">
<div class="flex align-items-center justify-content-between mb-3">
<span class="block text-600 font-medium text-sm">Événements</span>
<div class="flex align-items-center justify-content-center surface-100 border-round-lg"
style="width: 2.5rem; height: 2.5rem;">
<i class="pi pi-calendar text-orange-600 text-lg"></i>
</div>
</div>
<div class="text-900 font-bold text-2xl mb-3">#{rapportsBean.indicateurs.totalEvenements}</div>
<div class="flex align-items-center mb-2">
<i class="pi pi-arrow-up text-green-500 text-sm mr-2"></i>
<span class="text-green-600 font-semibold text-sm mr-2">+#{rapportsBean.indicateurs.croissanceEvenements}%</span>
<span class="text-500 text-xs">ce mois</span>
</div>
</div>
</div>
</div>
<div class="field col-12 md:col-6 lg:col-3">
<div class="card surface-0 hover:surface-100 border-round-lg transition-all transition-duration-200">
<div class="p-4" style="min-height: 9rem;">
<div class="flex align-items-center justify-content-between mb-3">
<span class="block text-600 font-medium text-sm">Aides Accordées</span>
<div class="flex align-items-center justify-content-center surface-100 border-round-lg"
style="width: 2.5rem; height: 2.5rem;">
<i class="pi pi-heart text-purple-600 text-lg"></i>
</div>
</div>
<div class="text-900 font-bold text-2xl mb-3">#{rapportsBean.indicateurs.totalAides}</div>
<div class="flex align-items-center mb-2">
<i class="pi pi-arrow-up text-green-500 text-sm mr-2"></i>
<span class="text-green-600 font-semibold text-sm mr-2">+#{rapportsBean.indicateurs.croissanceAides}%</span>
<span class="text-500 text-xs">ce mois</span>
</div>
</div>
</div>
</div>
</div>
</p:outputPanel>
<!-- Graphiques d'évolution avec Freya stricte -->
<p:outputPanel id="graphiquesEvolution">
<div class="formgrid grid">
<div class="field col-12 md:col-8">
<div class="card surface-0 hover:surface-100 border-round-lg transition-all transition-duration-200">
<div class="p-4">
<h5 class="text-900 font-bold mb-4">
<i class="pi pi-chart-line text-blue-500 mr-2"></i>
Évolution des Membres et Revenus
</h5>
<div class="surface-100 border-round-lg p-4">
<div class="grid">
<ui:repeat value="#{rapportsBean.evolutionMensuelle}" var="mois" varStatus="status">
<div class="col-12 md:col-2">
<div class="text-center">
<div class="text-600 text-sm mb-2">#{mois.libelle}</div>
<div class="flex flex-column align-items-center gap-2">
<div class="bg-blue-500 border-round" style="width: 20px; height: #{mois.hauteurMembres}px;"></div>
<div class="text-blue-700 font-bold text-sm">#{mois.membres}</div>
<div class="bg-green-500 border-round" style="width: 20px; height: #{mois.hauteurRevenus}px;"></div>
<div class="text-green-700 font-bold text-xs">#{mois.revenus}M</div>
</div>
</div>
</div>
</ui:repeat>
</div>
<div class="flex justify-content-center gap-4 mt-3">
<div class="flex align-items-center">
<div class="bg-blue-500 border-round mr-2" style="width: 12px; height: 12px;"></div>
<span class="text-600 text-sm">Membres</span>
</div>
<div class="flex align-items-center">
<div class="bg-green-500 border-round mr-2" style="width: 12px; height: 12px;"></div>
<span class="text-600 text-sm">Revenus (M FCFA)</span>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="field col-12 md:col-4">
<div class="card surface-0 hover:surface-100 border-round-lg transition-all transition-duration-200">
<div class="p-4">
<h5 class="text-900 font-bold mb-4">
<i class="pi pi-target text-green-500 mr-2"></i>
Objectifs vs Réalisations
</h5>
<div class="grid">
<ui:repeat value="#{rapportsBean.objectifs}" var="objectif" varStatus="status">
<div class="col-12">
<div class="flex align-items-center justify-content-between mb-2">
<span class="text-900 font-medium">#{objectif.libelle}</span>
<span class="text-600 text-sm">#{objectif.pourcentage}%</span>
</div>
<p:progressBar value="#{objectif.pourcentage}" style="height: 8px;"
styleClass="mb-3">
<f:facet name="label">#{objectif.pourcentage}%</f:facet>
</p:progressBar>
<div class="flex justify-content-between text-xs text-600 mb-3">
<span>Réalisé: #{objectif.realise}</span>
<span>Objectif: #{objectif.cible}</span>
</div>
</div>
</ui:repeat>
</div>
</div>
</div>
</div>
</div>
</p:outputPanel>
<!-- Répartitions et analyses avec Freya stricte -->
<div class="formgrid grid">
<div class="field col-12 md:col-6">
<div class="card surface-0 hover:surface-100 border-round-lg transition-all transition-duration-200">
<div class="p-4">
<h5 class="text-900 font-bold mb-4">
<i class="pi pi-users text-purple-500 mr-2"></i>
Répartition des Membres
</h5>
<div class="grid">
<ui:repeat value="#{rapportsBean.repartitionMembres}" var="categorie" varStatus="status">
<div class="col-12">
<div class="flex align-items-center justify-content-between mb-2">
<div class="flex align-items-center">
<div class="bg-#{categorie.couleur} border-round mr-3"
style="width: 12px; height: 12px;"></div>
<span class="text-900">#{categorie.libelle}</span>
</div>
<div class="text-right">
<div class="text-900 font-bold">#{categorie.nombre}</div>
<div class="text-600 text-sm">#{categorie.pourcentage}%</div>
</div>
</div>
<p:progressBar value="#{categorie.pourcentage}" style="height: 6px;"
styleClass="mb-3" />
</div>
</ui:repeat>
</div>
</div>
</div>
</div>
<div class="field col-12 md:col-6">
<div class="card surface-0 hover:surface-100 border-round-lg transition-all transition-duration-200">
<div class="p-4">
<h5 class="text-900 font-bold mb-4">
<i class="pi pi-dollar text-green-500 mr-2"></i>
Analyse des Revenus
</h5>
<div class="grid">
<ui:repeat value="#{rapportsBean.sourceRevenus}" var="source" varStatus="status">
<div class="col-12">
<div class="flex align-items-center justify-content-between mb-2">
<div class="flex align-items-center">
<div class="bg-#{source.couleur} text-white border-round flex align-items-center justify-content-center mr-3"
style="width: 2rem; height: 2rem;">
<i class="pi #{source.icon} text-sm"></i>
</div>
<span class="text-900">#{source.libelle}</span>
</div>
<div class="text-right">
<div class="text-900 font-bold">#{source.montant}</div>
<div class="text-600 text-sm">#{source.pourcentage}%</div>
</div>
</div>
<p:progressBar value="#{source.pourcentage}" style="height: 6px;"
styleClass="mb-3" />
</div>
</ui:repeat>
</div>
</div>
</div>
</div>
</div>
<!-- Tableaux de performance avec Freya stricte -->
<div class="formgrid grid">
<div class="field col-12 md:col-6">
<div class="card surface-0 hover:surface-100 border-round-lg transition-all transition-duration-200">
<div class="p-4">
<h5 class="text-900 font-bold mb-4">
<i class="pi pi-trophy text-yellow-500 mr-2"></i>
Top Entités Performantes
</h5>
<p:dataTable value="#{rapportsBean.topEntites}" var="entite"
styleClass="p-datatable-sm"
emptyMessage="Aucune donnée disponible">
<p:column headerText="Rang" width="60">
<div class="text-center">
<p:tag value="#{entite.rang}"
severity="#{entite.rang == 1 ? 'warning' : (entite.rang le 3 ? 'info' : 'secondary')}" />
</div>
</p:column>
<p:column headerText="Entité">
<div class="flex align-items-center">
<div class="bg-primary text-white border-round flex align-items-center justify-content-center mr-2"
style="width: 24px; height: 24px;">
<i class="pi #{entite.typeIcon} text-xs"></i>
</div>
<span class="text-900 font-medium">#{entite.nom}</span>
</div>
</p:column>
<p:column headerText="Score" width="80">
<div class="text-center">
<span class="text-900 font-bold">#{entite.score}</span>
</div>
</p:column>
<p:column headerText="Évolution" width="80">
<div class="text-center">
<i class="pi #{entite.tendance == 'UP' ? 'pi-arrow-up text-green-500' : (entite.tendance == 'DOWN' ? 'pi-arrow-down text-red-500' : 'pi-minus text-600')}"></i>
</div>
</p:column>
</p:dataTable>
</div>
</div>
</div>
<div class="field col-12 md:col-6">
<div class="card surface-0 hover:surface-100 border-round-lg transition-all transition-duration-200">
<div class="p-4">
<h5 class="text-900 font-bold mb-4">
<i class="pi pi-chart-bar text-blue-500 mr-2"></i>
Indicateurs Clés de Performance
</h5>
<div class="formgrid grid">
<ui:repeat value="#{rapportsBean.kpis}" var="kpi" varStatus="status">
<ui:include src="/templates/components/cards/kpi-card.xhtml">
<ui:param name="title" value="#{kpi.libelle}" />
<ui:param name="value" value="#{kpi.valeur}" />
<ui:param name="icon" value="#{kpi.icon}" />
<ui:param name="iconColor" value="#{kpi.couleur}" />
<ui:param name="growthValue" value="#{kpi.variation}" />
<ui:param name="growthLabel" value="variation" />
<ui:param name="progressValue" value="#{kpi.progression}" />
<ui:param name="colSize" value="col-12" />
</ui:include>
</ui:repeat>
</div>
</div>
</div>
</div>
</div>
<!-- Alertes et recommandations avec Freya stricte -->
<div class="card surface-0 hover:surface-100 border-round-lg transition-all transition-duration-200">
<div class="p-4">
<h5 class="text-900 font-bold mb-4">
<i class="pi pi-exclamation-triangle text-orange-500 mr-2"></i>
Alertes et Recommandations
</h5>
<div class="formgrid grid">
<ui:repeat value="#{rapportsBean.alertes}" var="alerte" varStatus="status">
<div class="field col-12 md:col-6">
<div class="surface-100 border-round-lg p-3 hover:surface-200 transition-colors transition-duration-150 border-left-3 border-#{alerte.severiteCouleur}">
<div class="flex align-items-start">
<div class="bg-#{alerte.severiteCouleur} text-white border-round flex align-items-center justify-content-center mr-3"
style="width: 2.5rem; height: 2.5rem;">
<i class="pi #{alerte.icon}"></i>
</div>
<div class="flex-1">
<h6 class="text-900 m-0 mb-2">#{alerte.titre}</h6>
<div class="text-600 mb-2 text-sm">#{alerte.description}</div>
<div class="flex align-items-center justify-content-between">
<p:tag value="#{alerte.priorite}" severity="#{alerte.severite}" />
<span class="text-600 text-xs">#{alerte.dateDetection}</span>
</div>
</div>
</div>
</div>
</div>
</ui:repeat>
</div>
</div>
</div>
<!-- Historique des rapports avec Freya stricte -->
<div class="card surface-0 hover:surface-100 border-round-lg transition-all transition-duration-200">
<div class="p-4">
<h5 class="text-900 font-bold mb-4">
<i class="pi pi-file-text text-blue-500 mr-2"></i>
Historique des Rapports
</h5>
<p:dataTable value="#{rapportsBean.historiqueRapports}" var="rapport"
paginator="true" rows="10"
styleClass="p-datatable-sm"
emptyMessage="Aucun rapport généré">
<p:column headerText="Date génération" sortBy="#{rapport.dateGeneration}" width="150">
<span class="text-900">#{rapport.dateGenerationFormatee}</span>
</p:column>
<p:column headerText="Type de rapport">
<div class="flex align-items-center">
<i class="pi #{rapport.typeIcon} text-#{rapport.typeCouleur} mr-2"></i>
<span class="text-900">#{rapport.typeLibelle}</span>
</div>
</p:column>
<p:column headerText="Période couverte" width="200">
<span class="text-600">#{rapport.periodeCouverte}</span>
</p:column>
<p:column headerText="Généré par" width="150">
<span class="text-900">#{rapport.generePar}</span>
</p:column>
<p:column headerText="Statut" width="100">
<p:tag value="#{rapport.statut}" severity="#{rapport.statutSeverity}" />
</p:column>
<p:column headerText="Actions" width="120">
<h:form>
<div class="flex gap-1">
<p:commandButton icon="pi pi-eye"
styleClass="ui-button-rounded ui-button-text ui-button-info"
title="Voir le rapport"
action="#{rapportsBean.voirRapport(rapport)}" />
<p:commandButton icon="pi pi-download"
styleClass="ui-button-rounded ui-button-text ui-button-secondary"
title="Télécharger"
action="#{rapportsBean.telechargerRapport(rapport)}" />
<p:commandButton icon="pi pi-share-alt"
styleClass="ui-button-rounded ui-button-text ui-button-primary"
title="Partager"
onclick="PF('dlgPartagerRapport').show();">
<f:setPropertyActionListener target="#{rapportsBean.rapportSelectionne}" value="#{rapport}" />
</p:commandButton>
</div>
</h:form>
</p:column>
</p:dataTable>
</div>
</div>
<!-- Dialog Générer Rapport avec Freya stricte -->
<p:dialog header="Générer un Nouveau Rapport" widgetVar="dlgGenererRapport" modal="true" width="600">
<h:form id="formGenererRapport">
<div class="ui-fluid">
<div class="formgrid grid">
<div class="field col-12 md:col-6">
<p:outputLabel for="typeRapport" value="Type de rapport" />
<p:selectOneMenu id="typeRapport" value="#{rapportsBean.nouveauRapport.type}" required="true">
<f:selectItem itemLabel="Sélectionner..." itemValue="" />
<f:selectItem itemLabel="📊 Rapport Financier" itemValue="FINANCIER" />
<f:selectItem itemLabel="👥 Rapport Membres" itemValue="MEMBRES" />
<f:selectItem itemLabel="📅 Rapport Activités" itemValue="ACTIVITES" />
<f:selectItem itemLabel="🎯 Rapport Performance" itemValue="PERFORMANCE" />
<f:selectItem itemLabel="📈 Rapport Complet" itemValue="COMPLET" />
</p:selectOneMenu>
</div>
<div class="field col-12 md:col-6">
<p:outputLabel for="formatRapport" value="Format de sortie" />
<p:selectOneMenu id="formatRapport" value="#{rapportsBean.nouveauRapport.format}">
<f:selectItem itemLabel="PDF" itemValue="PDF" />
<f:selectItem itemLabel="Excel" itemValue="EXCEL" />
<f:selectItem itemLabel="PowerPoint" itemValue="POWERPOINT" />
<f:selectItem itemLabel="HTML" itemValue="HTML" />
</p:selectOneMenu>
</div>
<div class="field col-12 md:col-6">
<p:outputLabel for="periodeRapport" value="Période du rapport" />
<p:selectOneMenu id="periodeRapport" value="#{rapportsBean.nouveauRapport.periode}">
<f:selectItem itemLabel="7 derniers jours" itemValue="7_JOURS" />
<f:selectItem itemLabel="30 derniers jours" itemValue="30_JOURS" />
<f:selectItem itemLabel="3 derniers mois" itemValue="3_MOIS" />
<f:selectItem itemLabel="6 derniers mois" itemValue="6_MOIS" />
<f:selectItem itemLabel="Cette année" itemValue="ANNEE_COURANTE" />
<f:selectItem itemLabel="Personnalisée" itemValue="PERSONNALISEE" />
</p:selectOneMenu>
</div>
<div class="field col-12 md:col-6">
<p:outputLabel for="niveauDetail" value="Niveau de détail" />
<p:selectOneMenu id="niveauDetail" value="#{rapportsBean.nouveauRapport.detail}">
<f:selectItem itemLabel="Résumé exécutif" itemValue="RESUME" />
<f:selectItem itemLabel="Standard" itemValue="STANDARD" />
<f:selectItem itemLabel="Détaillé" itemValue="DETAILLE" />
<f:selectItem itemLabel="Complet avec annexes" itemValue="COMPLET" />
</p:selectOneMenu>
</div>
<div class="field col-12">
<p:outputLabel for="commentairesRapport" value="Commentaires et notes" />
<p:inputTextarea id="commentairesRapport" value="#{rapportsBean.nouveauRapport.commentaires}"
rows="3" placeholder="Ajouter des commentaires ou instructions spécifiques..." />
</div>
</div>
</div>
<div class="flex gap-2 mt-3">
<p:commandButton value="Générer maintenant" icon="pi pi-play"
styleClass="ui-button-success"
action="#{rapportsBean.genererRapport}"
update="@form"
oncomplete="if(!args.validationFailed) PF('dlgGenererRapport').hide();" />
<p:commandButton value="Programmer" icon="pi pi-calendar"
styleClass="ui-button-info"
onclick="PF('dlgGenererRapport').hide(); PF('dlgPlanifierRapport').show();"
type="button" />
<p:commandButton value="Annuler" icon="pi pi-times"
styleClass="ui-button-secondary"
onclick="PF('dlgGenererRapport').hide();" type="button" />
</div>
</h:form>
</p:dialog>
</div>
</ui:define>
</ui:composition>