From 57f0d77527204ead53ecd6da3e0b5235eff79fb0 Mon Sep 17 00:00:00 2001 From: engel <> Date: Tue, 30 Dec 2025 09:35:39 +0000 Subject: [PATCH] =?UTF-8?q?Ajout=20calcul=20total=20g=C3=A9n=C3=A9ral=20ca?= =?UTF-8?q?se=20coch=C3=A9es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit FossilOrigin-Name: 3a1cdc3cd5b81be5a45684569107bbe48f547d471a6873aaa508652cf8103b0b --- admin/action.php | 14 ++-- admin/script.js | 118 +++++++++++++++++------------ admin/style.css | 4 + templates/versements_activites.tpl | 15 +++- templates/versements_personnes.tpl | 42 ++++++---- 5 files changed, 120 insertions(+), 73 deletions(-) diff --git a/admin/action.php b/admin/action.php index b0500ac..f3aa4dc 100644 --- a/admin/action.php +++ b/admin/action.php @@ -71,8 +71,8 @@ $tpl->register_function('afficher_debut_tarif', function ($params)
', - $idTarif); + onclick="cocherDecocherTarif(check_%1$s, %2$s)" />', + $idTarif, "total_general"); if ($idTarif == 0) { // versement sur un compte non rattaché à une activité $out .= sprintf(' @@ -122,7 +122,7 @@ $tpl->register_function('afficher_debut_personne', function ($params)
+ onclick="cocherDecocherPersonne(check_%1$s, total_%1$s, %3$s)" /> @@ -130,7 +130,8 @@ $tpl->register_function('afficher_debut_personne', function ($params)
', $idVersement, - $personne->nomPrenom + $personne->nomPrenom, + "total_general" ); return $out; }); @@ -163,7 +164,7 @@ $tpl->register_function('afficher_versement', function ($params) id="check_%1$s_%2$s" name="selected[]" value="%2$s" - onclick="cocherDecocherVersement(check_%1$s_%2$s, total_%1$s)" /> + onclick="cocherDecocherCase(check_%1$s_%2$s, total_%1$s, %5$s)" /> @@ -176,7 +177,8 @@ $tpl->register_function('afficher_versement', function ($params) ",", " " ), - date_format(date_create($versement->date),"d/m/Y") + date_format(date_create($versement->date),"d/m/Y"), + "total_general" ); return $out; }); diff --git a/admin/script.js b/admin/script.js index a46ce9a..8faea47 100644 --- a/admin/script.js +++ b/admin/script.js @@ -1,5 +1,26 @@ "use strict"; +/** + * renvoyer la valeur numérique d'un montant formaté en € + * @param texte qui représente nu nombre + */ +function getNumber(texte) { + return Number(texte.replace(/[^0-9,]/g, '').replace(/,/, '.')); +} + +/** + * afficher un montant au format monétaire + * @param montant à afficher + * @param idElem : élément où faire l'affichage + */ +function displayNumber(montant, idElem) { + idElem.innerHTML = + montant.toLocaleString('fr-FR', { + style: 'currency', currency: 'EUR', + minimumFractionDigits: 2 + }); +} + // ------------------------------------------------------------------------ // actions sur la liste des versements // ------------------------------------------------------------------------ @@ -8,14 +29,15 @@ * Fonction appelée quand on (dé)coche la case globale * (dé)sélectionner toutes les cases de toutes les activités * @param {HTMLInputElement} idCaseGlobale id de la case globale + * @param {HTMLSpanElement} idTotalGeneral id du total général */ -function cocherDecocherTout(idCaseGlobale) { +function cocherDecocherTout(idCaseGlobale, idTotalGeneral) { // itérer sur la liste des éléments détails : 1 par couple let lesDetails = document.querySelectorAll("details.activite"); for (let i = 0; i < lesDetails.length; ++i) { let idCase = lesDetails[i].querySelector("input[type=checkbox]"); idCase.checked = idCaseGlobale.checked; - cocherDecocherTarif(idCase); + cocherDecocherTarif(idCase, idTotalGeneral); } // changer le message changerMessage(idCaseGlobale.nextElementSibling, idCaseGlobale); @@ -25,35 +47,37 @@ function cocherDecocherTout(idCaseGlobale) { * Fonction appelée quand on (dé)coche la case d'activité * (dé)sélectionner toutes les cases de cette activité * @param {HTMLInputElement} idCaseGlobale id de la case d'activité + * @param {HTMLSpanElement} idTotalGeneral id du total général */ -function cocherDecocherTarif(idCaseGlobale) { +function cocherDecocherTarif(idCaseGlobale, idTotalGeneral) { let lesPersonnes = idCaseGlobale.closest("details").querySelectorAll("div.personne"); - cocherDecocherLesPersonnes(idCaseGlobale, lesPersonnes); + cocherDecocherLesPersonnes(idCaseGlobale, lesPersonnes, idTotalGeneral); } /** * idem dans le cas des versements des personnes * @param {HTMLInputElement} idCaseGlobale id case à cocher d'une personne */ -function cocherDecocherToutesLesPersonnes(idCaseGlobale) { - let lesPersonnes = document.querySelectorAll("div.personne"); - cocherDecocherLesPersonnes(idCaseGlobale, lesPersonnes); +function cocherDecocherToutesLesPersonnes(idCaseGlobale, idTotalGeneral) { + let lesPersonnes = document.querySelectorAll("summary.personne"); + cocherDecocherLesPersonnes(idCaseGlobale, lesPersonnes, idTotalGeneral); changerMessage(idCaseGlobale.nextElementSibling, idCaseGlobale); } /** * @param {HTMLInputElement} idCaseGlobale * @param {NodeListOf} lesPersonnes - */ -function cocherDecocherLesPersonnes(idCaseGlobale, lesPersonnes) { + * @param {HTMLSpanElement} idTotalGeneral id du total général +*/ +function cocherDecocherLesPersonnes(idCaseGlobale, lesPersonnes, idTotalGeneral) { for (let j = 0; j < lesPersonnes.length; ++j) { // trouver l'élément total de la personne - let idTotal = lesPersonnes[j].querySelector("span"); + let idTotal = lesPersonnes[j].querySelector("span.total"); // puis la case à cocher - let idCase = lesPersonnes[j].closest("summary").querySelector("input"); + let idCase = lesPersonnes[j].querySelector("input[type=checkbox]"); idCase.checked = idCaseGlobale.checked; // puis traiter toutes les cases de la personne - cocherDecocherPersonne(idCase, idTotal); + cocherDecocherPersonne(idCase, idTotal, idTotalGeneral); } } @@ -62,51 +86,45 @@ function cocherDecocherLesPersonnes(idCaseGlobale, lesPersonnes) { * - (dé)sélectionner toutes les cases à cocher * - faire le total des cases cochées et l'afficher * @param {HTMLInputElement} idCase id de la case qui a été cochée - * @param {HTMLSpanElement} idTotal id de l'élément où afficher le total + * @param {HTMLSpanElement} idTotal id de l'élément où afficher le total de la personne + * @param {HTMLSpanElement} idTotalGeneral id de l'élément où afficher le total général */ -function cocherDecocherPersonne(idCase, idTotal) { - // chercher le fieldset des versements - let fieldset = idCase.closest("details").querySelector("div.versements"); - let listeCases = fieldset.querySelectorAll("input[type=checkbox]"); - for (let i = 0; i < listeCases.length; ++i) { - listeCases[i].checked = idCase.checked; - cocherDecocherVersement(listeCases[i], idTotal); - } +function cocherDecocherPersonne(idCase, idTotal, idTotalGeneral) { + let conteneur = idCase.closest("details").querySelector("div.versements"); + let listeCases = conteneur.querySelectorAll("input[type=checkbox]"); + + for (let i = 0; i < listeCases.length; ++i) { + if (listeCases[i].checked != idCase.checked) { + listeCases[i].checked = idCase.checked; + cocherDecocherVersement(listeCases[i], idTotal, idTotalGeneral); + } + } } /** * Fonction appelée quand on (dé)coche la case d'un versement - * Faire le total des cases cochées et l'afficher + * Mettre à jour le total des cases cochées et le total global et les afficher * - * @param {HTMLInputElement} idCase id de la case qui a été cochée - * @param {HTMLSpanElement} idTotal id de l'élément où afficher le total + * @param {HTMLInputElement} idCase id de la case qui a été (dé)cochée + * @param {HTMLSpanElement} idTotal id du total de la personne + * @param {HTMLSpanElement} idTotalGeneral id du total général */ -function cocherDecocherVersement(idCase, idTotal) { - let fieldset = idCase.closest("div.versements"); - let listeCases = fieldset.querySelectorAll("input[type=checkbox]"); - let listeMontants = fieldset.querySelectorAll("span.montant"); - calculerTotal(listeCases, listeMontants, idTotal); -} -/** - * Faire le total des cases cochées et l'afficher - * @param {NodeListOf} listeCases liste des cases - * @param {NodeListOf} listeMontants liste des montants associés - * @param {HTMLSpanElement} idTotal id de l'élément où afficher le total - */ -function calculerTotal(listeCases, listeMontants, idTotal) { - let total = 0; - for (let i = 0; i < listeCases.length; ++i) { - if (listeCases[i].checked) { - total += parseFloat(listeMontants[i].textContent.replace(/\s/g, "").replace(",", ".")); - } - } - // afficher le total - idTotal.innerHTML = - total.toLocaleString('fr-FR', { - style: 'currency', currency: 'EUR', - minimumFractionDigits: 2 - }); +function cocherDecocherVersement(idCase, idTotal, idTotalGeneral) { + let div = idCase.closest("div"); + let idmontant = div.querySelector("span.montant"); + let montant = getNumber(idmontant.textContent); + let totalPersonne = getNumber(idTotal.textContent); + let totalGeneral = getNumber(idTotalGeneral.textContent); + if (idCase.checked) { + totalPersonne += montant; + totalGeneral += montant; + } else { + totalPersonne -= montant; + totalGeneral -= montant; + } + displayNumber(totalPersonne, idTotal); + displayNumber(totalGeneral, idTotalGeneral); } /** @@ -273,4 +291,4 @@ function changerStyle(document) { if (sheet.href.includes('imprimer_recu.css')) { sheet.media = 'print'; } } // console.log(styles); -} \ No newline at end of file +} diff --git a/admin/style.css b/admin/style.css index e096fff..23b3976 100644 --- a/admin/style.css +++ b/admin/style.css @@ -2,6 +2,10 @@ * liste des versements */ +label.strong { + font-weight : bold; +} + div.pair { background-color: rgba(var(--gSecondColor), 0.15); } diff --git a/templates/versements_activites.tpl b/templates/versements_activites.tpl index f343490..aff07a9 100644 --- a/templates/versements_activites.tpl +++ b/templates/versements_activites.tpl @@ -4,15 +4,24 @@

Année {$annee_recu} : versements par activité et tarif

- +
+
+ + 0,00 € +
+
+ +
+
-
+
+
{button type="submit" label="Télécharger les reçus au format PDF" shape="download" form="versements_activites" formaction="generer_recus.php?type=activite&format=pdf" @@ -21,6 +30,8 @@ form="versements_activites" formaction="generer_recus.php?type=activite&format=print" onclick="return verifierChoix(this.form)"} +
+
diff --git a/templates/versements_personnes.tpl b/templates/versements_personnes.tpl index 380a584..4020a7c 100644 --- a/templates/versements_personnes.tpl +++ b/templates/versements_personnes.tpl @@ -4,21 +4,33 @@

Année {$annee_recu} : versements par personne

- - - -
- {button type="submit" label="Télécharger les reçus au format PDF" shape="download" - form="versements_personnes" - formaction="generer_recus.php?type=personne&format=pdf" - onclick="return verifierChoix(this.form)"} - {button type="submit" label="Imprimer les reçus" shape="print" - form="versements_personnes" - formaction="generer_recus.php?type=personne&format=print" - onclick="return verifierChoix(this.form)"} +
+ +
+ + 0,00 € +
+
+ + +
+
+ +
+
+ {button type="submit" label="Télécharger les reçus au format PDF" shape="download" + form="versements_personnes" + formaction="generer_recus.php?type=personne&format=pdf" + onclick="return verifierChoix(this.form)"} + {button type="submit" label="Imprimer les reçus" shape="print" + form="versements_personnes" + formaction="generer_recus.php?type=personne&format=print" + onclick="return verifierChoix(this.form)"} +
+