From 197816d1796ce4d14ba2a26321dc49d18c5d43fc Mon Sep 17 00:00:00 2001 From: dahoud Date: Sat, 8 Nov 2025 10:58:04 +0000 Subject: [PATCH] feat: Module Factures professionnel + corrections MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Correction FactureView.java: - getCreatePath() /factures/nouvelle -> /factures/nouveau 2. factures/nouveau.xhtml (393 lignes): - 4 sections professionnelles - Section 1: Informations générales * Numéro auto-généré avec badge primary * Statut (6 valeurs: BROUILLON, EMISE, PAYEE, IMPAYEE, EN_RETARD, ANNULEE) * Type facture (STANDARD, ACOMPTE, SOLDE, AVOIR) * Client, objet, dates (émission, échéance, paiement optionnel) - Section 2: Détail facture * Placeholder lignes de facturation (future) - Section 3: Montants et totaux * Montant HT, TVA 18%, TTC (calculés) * Montant payé, montant restant (color-coded) * Récapitulatif visuel 4 cards (HT, TVA, TTC, Restant) * monetary-display component - Section 4: Informations paiement * Mode (VIREMENT, CHEQUE, ESPECES, CARTE, MOBILE_MONEY) * Référence, conditions - 3 boutons: Annuler, Brouillon, Émettre - Validation complète client + serveur - Responsive design - Sens métier BTP facturation ✅ DRY respecté (composants réutilisables) ✅ Write Once, Use Anywhere ✅ UI/UX professionnel cohérent ✅ Métier BTP: factures, acomptes, avoirs --- .../dev/lions/btpxpress/view/FactureView.java | 2 +- .../META-INF/resources/factures/nouveau.xhtml | 393 +++++++++++++++++- .../META-INF/resources/factures/nouveau.xhtml | 393 +++++++++++++++++- .../btpxpress/view/FactureView$Facture.class | Bin 3191 -> 3530 bytes .../lions/btpxpress/view/FactureView.class | Bin 12435 -> 12469 bytes 5 files changed, 785 insertions(+), 3 deletions(-) diff --git a/src/main/java/dev/lions/btpxpress/view/FactureView.java b/src/main/java/dev/lions/btpxpress/view/FactureView.java index 99cfa3b..dea2f03 100644 --- a/src/main/java/dev/lions/btpxpress/view/FactureView.java +++ b/src/main/java/dev/lions/btpxpress/view/FactureView.java @@ -168,7 +168,7 @@ public class FactureView extends BaseListView impleme @Override protected String getCreatePath() { - return "/factures/nouvelle"; + return "/factures/nouveau"; } @Override diff --git a/src/main/resources/META-INF/resources/factures/nouveau.xhtml b/src/main/resources/META-INF/resources/factures/nouveau.xhtml index 1617fcb..b807f5f 100644 --- a/src/main/resources/META-INF/resources/factures/nouveau.xhtml +++ b/src/main/resources/META-INF/resources/factures/nouveau.xhtml @@ -1 +1,392 @@ -FACTURES - BTP Xpress

FACTURES

Module en cours de développement...

+ + + Nouvelle facture - BTP Xpress + + +
+
+
+
+ +
+
+

Créer une nouvelle facture

+

Émettez une facture pour un chantier ou prestation réalisée

+
+ +
+ + + + + + + +
+ +
+ +
+ + + + +
+ Généré automatiquement selon la séquence configurée +
+ + +
+ + + + + + + + + + +
+ + +
+ + + + + + + + Nature de la facturation +
+ + +
+ + + + + Nom du client ou de l'entreprise +
+ + +
+ + + +
+ + +
+ + + + + Description des prestations facturées +
+ + +
+ + + + Date limite de paiement (généralement 30 jours) +
+ + +
+ + + + Date effective du paiement (optionnel) +
+
+
+ + + +
+
+
+ + Lignes de facturation +
+

+ Ajoutez les différentes prestations, fournitures et quantités facturées. + Cette fonctionnalité sera disponible dans une prochaine version. +

+
+
+ + +
+ +

Gestion des lignes de facture en cours de développement

+

+ Bientôt disponible: ajout de lignes avec désignation, quantité, prix unitaire, remise, etc. +

+
+
+ + + +
+ +
+ + + + Montant hors taxes +
+ + +
+ +
+ + + + +
+ Calculé automatiquement (18% du montant HT) +
+ + +
+ +
+ + + + +
+ Montant toutes taxes comprises (HT + TVA) +
+ + +
+ + + + Montant déjà encaissé +
+ + +
+ +
+ + + + +
+ Reste à encaisser +
+ + +
+
+
+
+
+ Montant HT +
+ + + + +
+
+
+
+
+ TVA (18%) +
+ + + + +
+
+
+
+
+ Total TTC +
+ + + + + +
+
+
+
+
+ Reste à payer +
+ + + + + +
+
+
+
+
+
+
+
+ + + +
+
+ + + + + + + + + +
+
+ + +
+
+ + + +
+
+
+ + +
+
+ Les champs marqués d'un + * + sont obligatoires +
+
+ + + +
+
+ +
+
+
+
+
+
+
diff --git a/target/classes/META-INF/resources/factures/nouveau.xhtml b/target/classes/META-INF/resources/factures/nouveau.xhtml index 1617fcb..b807f5f 100644 --- a/target/classes/META-INF/resources/factures/nouveau.xhtml +++ b/target/classes/META-INF/resources/factures/nouveau.xhtml @@ -1 +1,392 @@ -FACTURES - BTP Xpress

FACTURES

Module en cours de développement...

+ + + Nouvelle facture - BTP Xpress + + +
+
+
+
+ +
+
+

Créer une nouvelle facture

+

Émettez une facture pour un chantier ou prestation réalisée

+
+ +
+ + + + + + + +
+ +
+ +
+ + + + +
+ Généré automatiquement selon la séquence configurée +
+ + +
+ + + + + + + + + + +
+ + +
+ + + + + + + + Nature de la facturation +
+ + +
+ + + + + Nom du client ou de l'entreprise +
+ + +
+ + + +
+ + +
+ + + + + Description des prestations facturées +
+ + +
+ + + + Date limite de paiement (généralement 30 jours) +
+ + +
+ + + + Date effective du paiement (optionnel) +
+
+
+ + + +
+
+
+ + Lignes de facturation +
+

+ Ajoutez les différentes prestations, fournitures et quantités facturées. + Cette fonctionnalité sera disponible dans une prochaine version. +

+
+
+ + +
+ +

Gestion des lignes de facture en cours de développement

+

+ Bientôt disponible: ajout de lignes avec désignation, quantité, prix unitaire, remise, etc. +

+
+
+ + + +
+ +
+ + + + Montant hors taxes +
+ + +
+ +
+ + + + +
+ Calculé automatiquement (18% du montant HT) +
+ + +
+ +
+ + + + +
+ Montant toutes taxes comprises (HT + TVA) +
+ + +
+ + + + Montant déjà encaissé +
+ + +
+ +
+ + + + +
+ Reste à encaisser +
+ + +
+
+
+
+
+ Montant HT +
+ + + + +
+
+
+
+
+ TVA (18%) +
+ + + + +
+
+
+
+
+ Total TTC +
+ + + + + +
+
+
+
+
+ Reste à payer +
+ + + + + +
+
+
+
+
+
+
+
+ + + +
+
+ + + + + + + + + +
+
+ + +
+
+ + + +
+
+
+ + +
+
+ Les champs marqués d'un + * + sont obligatoires +
+
+ + + +
+
+ +
+
+
+
+
+
+
diff --git a/target/classes/dev/lions/btpxpress/view/FactureView$Facture.class b/target/classes/dev/lions/btpxpress/view/FactureView$Facture.class index e4ea02bdc54a439c54847c3c52fe3b20d7de838e..93e11deef94a776219564fafa56b9c67437ae132 100644 GIT binary patch literal 3530 zcmb7`Z*$v35XPUgV>@<~#5hUYkhD-*h?BMvg+d`IDZy@-;ACMm=GvGx6UlHYdI(8lh$+D4g@lGhy0Bs&~TlT zO@X}A?@7-Us0_u90?$^_oJ-4Tb-vxTr9%%!#|q@5p6&azAAyB%QDFC^*>Kxdw@zWA zhSS=o(sJ4|8Xj7<>?ugz53Hb1v|`V70?P?@n*yRPP>ROQW=&u!8XQ``4iGg@T7i1; z;+euk1fyU zapar`PHkUcz43q2Pp{9N$Y76>U8$}Pr8G+S($l`f+1hi?Y~QArZ99%j+2HE(KDutN z<^E(omX7o&m7UEZ1a2D0Ay4TdGVNQHYyJW~Di}|$8Yo~=V3H|HldV(%<@xo}BcFAwM=mE~3M7?^@Fv??ky$KEqAJscaFOMQXrPQ&1g4WPiGw4b7^rY$CW)|8IP}QC9ES$qmB?mk{C6qg@X9>{ z^H`u7`e6;{s-q=jMV0quaO!prEzj!7KzdZUA}tt{W?^_yR2g12Npn<1!s%fhXqV)^ znEfjeU?lm>h$qLrHSi2l9m2x|Q(6f=l-7xAohj3aSGC$qG7h_K08KKtJa$hiaZD^7 zxqYuKcWiE_^3b`o&LfbVmF!Hx+bG5A=R2=)NB4!_*vY=z$*4zkzW&%0z-Z z$JTFJI{G*jw52SfbJlHeH^6WS9I}wTE+N+!aqsJuj%6X5RCCfg+ENk-_gbM z*&5?Z3jaBtrX}aDE}oC<7(b=(N9p)`x_G_`V*IqiH`DR=b@6<`#P}J7{~|s28@hPD zw_^OP!XM+yvANHZmvz7L5?i`>z7Au2S>eA*$8YQ6`Ie3G6@~vg9bebQ^W`1m=M?@M pd^G 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 literal 12435 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