Ajout calcul total général case cochées

FossilOrigin-Name: 3a1cdc3cd5b81be5a45684569107bbe48f547d471a6873aaa508652cf8103b0b
This commit is contained in:
engel 2025-12-30 09:35:39 +00:00
parent 358c44d23c
commit 57f0d77527
5 changed files with 120 additions and 73 deletions

View file

@ -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 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 ()coche la case globale
* ()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 <activité, tarif>
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 ()coche la case d'activité
* ()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<Element>} 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) {
* - ()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 afficher le total
* @param {HTMLSpanElement} idTotal id de l'élément afficher le total de la personne
* @param {HTMLSpanElement} idTotalGeneral id de l'élément 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 ()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 afficher le total
* @param {HTMLInputElement} idCase id de la case qui a été ()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<Element>} listeCases liste des cases
* @param {NodeListOf<Element>} listeMontants liste des montants associés
* @param {HTMLSpanElement} idTotal id de l'élément 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);
}
}