diff --git a/admin/action.php b/admin/action.php index f3aa4dc..b0500ac 100644 --- a/admin/action.php +++ b/admin/action.php @@ -71,8 +71,8 @@ $tpl->register_function('afficher_debut_tarif', function ($params)
', - $idTarif, "total_general"); + onclick="cocherDecocherTarif(check_%1$s)" />', + $idTarif); 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)" /> @@ -130,8 +130,7 @@ $tpl->register_function('afficher_debut_personne', function ($params)
', $idVersement, - $personne->nomPrenom, - "total_general" + $personne->nomPrenom ); return $out; }); @@ -164,7 +163,7 @@ $tpl->register_function('afficher_versement', function ($params) id="check_%1$s_%2$s" name="selected[]" value="%2$s" - onclick="cocherDecocherCase(check_%1$s_%2$s, total_%1$s, %5$s)" /> + onclick="cocherDecocherVersement(check_%1$s_%2$s, total_%1$s)" /> @@ -177,8 +176,7 @@ $tpl->register_function('afficher_versement', function ($params) ",", " " ), - date_format(date_create($versement->date),"d/m/Y"), - "total_general" + date_format(date_create($versement->date),"d/m/Y") ); return $out; }); diff --git a/admin/generer_recus.php b/admin/generer_recus.php index 6fa83bf..7543b2f 100644 --- a/admin/generer_recus.php +++ b/admin/generer_recus.php @@ -16,11 +16,9 @@ $_GET['_dialog'] = true; // signature $signature = - (null !== $config->fileURL('signature')) ? - $config->fileURL('signature') : - ((null !== $plugin->getConfig('signature')) ? - \KD2\HTTP::getScheme() . '://' . \KD2\HTTP::getHost() . WWW_URI . $plugin->getConfig('signature') : - ""); + (null !== $plugin->getConfig('signature')) ? + \KD2\HTTP::getScheme() . '://' . \KD2\HTTP::getHost() . WWW_URI . "/" . $plugin->getConfig('signature') : + ""; // logo $config = Config::getInstance(); @@ -113,8 +111,7 @@ function genererRecusPDF($totalPersonnes, $numero_sequentiel = getNumSequentiel($configNum); foreach ($totalPersonnes as $idPersonne => $personne) { $tpl = new UserTemplate(null); - /* $tpl->setSource(PLUGIN_ROOT . '/templates/recu.skel'); */ - $tpl->setSourcePath(PLUGIN_ROOT . '/templates/recu.skel'); + $tpl->setSource(PLUGIN_ROOT . '/templates/recu.skel'); $tpl->assignArray(compact('signature', 'logo_asso', 'texteArticles')); $tpl->assign('objet_asso', $plugin->getConfig('objet_asso')); @@ -128,7 +125,7 @@ function genererRecusPDF($totalPersonnes, $tpl->assign('date', date("j/m/Y")); // numéro de reçu - $tpl->assign('numero', + $tpl->assign('numero', faireNumeroRecu($prefixeNum, $configNum->membre, $personne->numero, @@ -208,9 +205,9 @@ function genererRecusPDF($totalPersonnes, ); //supprimer les fichiers pdf - foreach ($listeFichiersPDF as $f) { - \Paheko\Utils::safe_unlink($f); - } + // foreach ($listeFichiersPDF as $f) { + // \Paheko\Utils::safe_unlink($f); + // } } // genererRecusPDF function generererRecusHTML($tpl, diff --git a/admin/imprimer_recu.css b/admin/imprimer_recu.css index 31778da..8a51941 100644 --- a/admin/imprimer_recu.css +++ b/admin/imprimer_recu.css @@ -34,18 +34,5 @@ div.previs_recu font-family: Serif; font-size: 11pt; background-color: white; - break-after: always; -} - -/* supprimer saut de page après dernier */ -div.previs_recu:last-of-type -{ - font-family: Serif; - font-size: 11pt; - background-color: white; - break-after: avoid; -} - -#__profiler { - display: none; + page-break-after: always; } diff --git a/admin/previs_recu.css b/admin/previs_recu.css index 3605d4b..0bf2103 100644 --- a/admin/previs_recu.css +++ b/admin/previs_recu.css @@ -95,9 +95,3 @@ span.titre, span.libelle { display : inline; } - -/* Ne pas imprimer le bandeau des boutons du profiler */ -#__profiler -{ - display: none; -} diff --git a/admin/script.js b/admin/script.js index 8f68766..a46ce9a 100644 --- a/admin/script.js +++ b/admin/script.js @@ -1,26 +1,5 @@ "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 // ------------------------------------------------------------------------ @@ -29,15 +8,14 @@ function displayNumber(montant, idElem) { * 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, idTotalGeneral) { +function cocherDecocherTout(idCaseGlobale) { // 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, idTotalGeneral); + cocherDecocherTarif(idCase); } // changer le message changerMessage(idCaseGlobale.nextElementSibling, idCaseGlobale); @@ -47,37 +25,35 @@ function cocherDecocherTout(idCaseGlobale, idTotalGeneral) { * 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, idTotalGeneral) { +function cocherDecocherTarif(idCaseGlobale) { let lesPersonnes = idCaseGlobale.closest("details").querySelectorAll("div.personne"); - cocherDecocherLesPersonnes(idCaseGlobale, lesPersonnes, idTotalGeneral); + cocherDecocherLesPersonnes(idCaseGlobale, lesPersonnes); } /** * idem dans le cas des versements des personnes * @param {HTMLInputElement} idCaseGlobale id case à cocher d'une personne */ -function cocherDecocherToutesLesPersonnes(idCaseGlobale, idTotalGeneral) { - let lesPersonnes = document.querySelectorAll("summary.personne"); - cocherDecocherLesPersonnes(idCaseGlobale, lesPersonnes, idTotalGeneral); +function cocherDecocherToutesLesPersonnes(idCaseGlobale) { + let lesPersonnes = document.querySelectorAll("div.personne"); + cocherDecocherLesPersonnes(idCaseGlobale, lesPersonnes); changerMessage(idCaseGlobale.nextElementSibling, idCaseGlobale); } /** * @param {HTMLInputElement} idCaseGlobale * @param {NodeListOf} lesPersonnes - * @param {HTMLSpanElement} idTotalGeneral id du total général -*/ -function cocherDecocherLesPersonnes(idCaseGlobale, lesPersonnes, idTotalGeneral) { + */ +function cocherDecocherLesPersonnes(idCaseGlobale, lesPersonnes) { for (let j = 0; j < lesPersonnes.length; ++j) { // trouver l'élément total de la personne - let idTotal = lesPersonnes[j].querySelector("span.total"); + let idTotal = lesPersonnes[j].querySelector("span"); // puis la case à cocher - let idCase = lesPersonnes[j].querySelector("input[type=checkbox]"); + let idCase = lesPersonnes[j].closest("summary").querySelector("input"); idCase.checked = idCaseGlobale.checked; // puis traiter toutes les cases de la personne - cocherDecocherPersonne(idCase, idTotal, idTotalGeneral); + cocherDecocherPersonne(idCase, idTotal); } } @@ -86,45 +62,51 @@ function cocherDecocherLesPersonnes(idCaseGlobale, lesPersonnes, idTotalGeneral) * - (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 de la personne - * @param {HTMLSpanElement} idTotalGeneral id de l'élément où afficher le total général + * @param {HTMLSpanElement} idTotal id de l'élément où afficher le total */ -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); - } - } +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); + } } /** * Fonction appelée quand on (dé)coche la case d'un versement - * Mettre à jour le total des cases cochées et le total global et les afficher + * Faire le total des cases cochées et l'afficher * - * @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 + * @param {HTMLInputElement} idCase id de la case qui a été cochée + * @param {HTMLSpanElement} idTotal id de l'élément où afficher le total */ +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); +} -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); +/** + * 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 + }); } /** @@ -285,8 +267,10 @@ function verifierCases(conteneur, type, message) { */ function changerStyle(document) { let styles = document.querySelectorAll('link[rel="stylesheet"]'); + // console.log(styles); for (let sheet of styles) { - if (sheet.href.includes('print.css')) { sheet.media = "tv"; } + if (sheet.href.includes('print.css')) { sheet.media = "tv"; sheet.remove; } 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 23b3976..e096fff 100644 --- a/admin/style.css +++ b/admin/style.css @@ -2,10 +2,6 @@ * liste des versements */ -label.strong { - font-weight : bold; -} - div.pair { background-color: rgba(var(--gSecondColor), 0.15); } diff --git a/admin/upload.php b/admin/upload.php index fca8872..c98fcd3 100644 --- a/admin/upload.php +++ b/admin/upload.php @@ -15,8 +15,8 @@ if (!File::checkCreateAccess($parent, $session)) { $csrf_key = 'upload_file_' . md5($parent); -$form->runIf('upload', function () use ($parent, $session) { - $_SESSION['sig_file'] = \Paheko\Files\Files::uploadMultiple($parent, 'file', $session); +$form->runIf('upload', function () use ($parent) { + $_SESSION['sig_file'] = \Paheko\Files\Files::uploadMultiple($parent, 'file'); }, $csrf_key, PLUGIN_ROOT . '/admin/config.php'); $tpl->assign(compact('parent', 'csrf_key')); diff --git a/lib/Utils.php b/lib/Utils.php index 343616f..3f00ca9 100644 --- a/lib/Utils.php +++ b/lib/Utils.php @@ -22,7 +22,7 @@ class Utils description, amount as montant FROM services_fees'); - return $db->getGrouped($sql); + return Utils::toAssoc($db->get($sql), 'id'); } /** @@ -37,7 +37,7 @@ class Utils services.label, services.description FROM services'); - return $db->getGrouped($sql); + return Utils::toAssoc($db->get($sql), 'id'); } /** @@ -76,7 +76,7 @@ class Utils $annee, $db->where('code', $op, $comptes) ); - return $db->getGrouped($sql); + return Utils::toAssoc($db->get($sql), 'id'); } /** @@ -120,6 +120,32 @@ class Utils return $db->get($sql); } + /** + * faire un tableau associatif avec le résultat d'une requête + */ + static function toAssoc($array, $nomCle) + { + $assoc = array(); + foreach ($array as $elem) + { + $ro = new \ReflectionObject($elem); + $proprietes = $ro->getProperties(); + $obj = new \stdClass(); + foreach ($proprietes as $p) + { + $pname = $p->getName(); + if ($pname == $nomCle) { + $key = $p->getValue($elem); + } + else { + $obj->$pname = $p->getValue($elem); + } + } + $assoc[$key] = $obj; + } + return $assoc; + } + /** * @return versements correspondants à l'année donnée * @param $annee diff --git a/templates/_nav.tpl b/templates/_nav.tpl index 4f41861..908f943 100644 --- a/templates/_nav.tpl +++ b/templates/_nav.tpl @@ -1,12 +1,12 @@ -{include file="_head.tpl" title="%s"|args:$plugin.label current="plugin_%s"|args:$plugin.name} +{include file="_head.tpl" title="%s"|args:$plugin.label current="plugin_%s"|args:$plugin.id}
@@ -28,20 +28,20 @@

Bénéficiaire des versements

Association « {$org_name} »
- {$org_address}
- Objet : {$objet_asso} + {$org_address}
+ Objet : {$objet_asso}

Donateur

- {$personne.nomPrenom}
- {$personne.adresse}
- {$personne.codePostal} {$personne.ville} - {if $courriel && $personne.courriel != ""} -
courriel : {$personne.courriel} - {/if} + {$personne.nomPrenom}
+ {$personne.adresse}
+ {$personne.codePostal} {$personne.ville} + {if $courriel && $personne.courriel != ""} +
courriel : {$personne.courriel} + {/if}

@@ -50,7 +50,7 @@