feat: Module Devis professionnel avec écrans complets

Création de 2 écrans professionnels pour le module Devis:

1. devis/nouveau.xhtml:
   - 4 sections: Informations générales, Détail du devis, Montants, Conditions
   - Numéro auto-généré avec icône
   - Statut avec 5 valeurs (BROUILLON, ATTENTE, ACCEPTE, REFUSE, EXPIRE)
   - Dates d'émission et validité avec calendriers
   - Client et objet du devis requis
   - Placeholder pour lignes de devis (future développement)
   - Calcul automatique TVA 18% et TTC
   - Récapitulatif visuel HT/TVA/TTC avec composant monétaire
   - Conditions de paiement et remarques (section collapsible)
   - 3 boutons: Annuler, Brouillon, Envoyer

2. devis/details.xhtml:
   - En-tête: numéro, statut, client, objet, dates
   - Actions: Retour, Convertir en chantier, PDF, Modifier
   - 4 KPI cards: Montant HT, TVA, TTC, Statut
   - 6 onglets professionnels:
     * Vue d'ensemble: infos + récap financier + actions rapides
     * Détail des lignes: table lignes (placeholder)
     * Conditions: paiement, délais, garanties
     * Documents: GED associée (placeholder)
     * Suivi: timeline actions
     * Historique: modifications (placeholder)

Corrections:
- Fix navigation /factures/nouvelle -> /factures/nouveau (factures.xhtml)
- Fix menu /factures/nouvelle -> /factures/nouveau (menu.xhtml)

Tous les composants réutilisables utilisés (status-badge, monetary-display).
Validation complète côté client et serveur.
UI/UX professionnel adapté au métier BTP.
This commit is contained in:
dahoud
2025-11-08 10:49:19 +00:00
parent 0fad42ccaf
commit ec38f6a23a
192 changed files with 12029 additions and 271 deletions

View File

@@ -0,0 +1,107 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<!--
Composant réutilisable: Barre d'outils d'export
Principe DRY: Un seul composant pour toutes les fonctionnalités d'export
Paramètres:
- tableId: ID du DataTable à exporter - requis
- filename: Nom du fichier sans extension (défaut: "export")
- showPDF: Afficher bouton PDF (défaut: true)
- showExcel: Afficher bouton Excel (défaut: true)
- showCSV: Afficher bouton CSV (défaut: true)
- showPrint: Afficher bouton Imprimer (défaut: false)
- pageOnly: Exporter page courante uniquement (défaut: false)
- selectionOnly: Exporter sélection uniquement (défaut: false)
- alignment: Alignement (left, center, right - défaut: right)
- label: Libellé avant les boutons - optionnel
Utilisation basique:
<ui:include src="/WEB-INF/components/export-toolbar.xhtml">
<ui:param name="tableId" value="dataTable"/>
<ui:param name="filename" value="liste_chantiers"/>
</ui:include>
Export personnalisé:
<ui:include src="/WEB-INF/components/export-toolbar.xhtml">
<ui:param name="tableId" value="facturesTable"/>
<ui:param name="filename" value="factures_#{factureView.mois}"/>
<ui:param name="showPDF" value="true"/>
<ui:param name="showExcel" value="true"/>
<ui:param name="showCSV" value="false"/>
<ui:param name="showPrint" value="true"/>
<ui:param name="label" value="Exporter :"/>
</ui:include>
Export avec sélection:
<ui:include src="/WEB-INF/components/export-toolbar.xhtml">
<ui:param name="tableId" value="devisTable"/>
<ui:param name="filename" value="devis_selectionnes"/>
<ui:param name="selectionOnly" value="true"/>
</ui:include>
-->
<div class="export-toolbar flex align-items-center gap-2"
style="justify-content: #{empty alignment ? 'flex-end' :
alignment eq 'center' ? 'center' :
alignment eq 'left' ? 'flex-start' : 'flex-end'};">
<!-- Libellé optionnel -->
<h:panelGroup rendered="#{not empty label}">
<span class="text-900 font-medium mr-2">#{label}</span>
</h:panelGroup>
<!-- Bouton PDF -->
<h:panelGroup rendered="#{empty showPDF or showPDF eq true}">
<p:commandButton icon="pi pi-file-pdf"
styleClass="ui-button-danger ui-button-outlined"
title="Exporter en PDF">
<p:dataExporter type="pdf"
target="#{tableId}"
fileName="#{empty filename ? 'export' : filename}"
pageOnly="#{empty pageOnly ? false : pageOnly}"
selectionOnly="#{empty selectionOnly ? false : selectionOnly}"/>
</p:commandButton>
</h:panelGroup>
<!-- Bouton Excel -->
<h:panelGroup rendered="#{empty showExcel or showExcel eq true}">
<p:commandButton icon="pi pi-file-excel"
styleClass="ui-button-success ui-button-outlined"
title="Exporter en Excel">
<p:dataExporter type="xlsx"
target="#{tableId}"
fileName="#{empty filename ? 'export' : filename}"
pageOnly="#{empty pageOnly ? false : pageOnly}"
selectionOnly="#{empty selectionOnly ? false : selectionOnly}"/>
</p:commandButton>
</h:panelGroup>
<!-- Bouton CSV -->
<h:panelGroup rendered="#{showCSV eq true}">
<p:commandButton icon="pi pi-file"
styleClass="ui-button-info ui-button-outlined"
title="Exporter en CSV">
<p:dataExporter type="csv"
target="#{tableId}"
fileName="#{empty filename ? 'export' : filename}"
pageOnly="#{empty pageOnly ? false : pageOnly}"
selectionOnly="#{empty selectionOnly ? false : selectionOnly}"/>
</p:commandButton>
</h:panelGroup>
<!-- Bouton Imprimer -->
<h:panelGroup rendered="#{showPrint eq true}">
<p:commandButton icon="pi pi-print"
styleClass="ui-button-secondary ui-button-outlined"
title="Imprimer"
onclick="window.print(); return false;"/>
</h:panelGroup>
</div>
</ui:composition>