diff --git a/lib/Utils.php b/lib/Utils.php index d2c3400..0080075 100644 --- a/lib/Utils.php +++ b/lib/Utils.php @@ -9,9 +9,9 @@ class Utils { /** * @return tarifs demandés - * @param array $tarifs + * @param $tarifs */ - public static function getTarifs($tarifs) + public static function getTarifs(array $tarifs) : array { $db = DB::getInstance(); $sql = sprintf( @@ -24,9 +24,9 @@ class Utils /** * @return activités correspondant aux tarifs demandés - * @param array $tarifs + * @param $tarifs */ - public static function getActivites($tarifs) + public static function getActivites(array $tarifs) : array { $db = DB::getInstance(); $sql = sprintf( @@ -42,9 +42,9 @@ class Utils /** * @return versements correspondants à l'année donnée * @param $annee - * @param array $champsNom : liste non vide des champs de nom/prénom + * @param $champsNom : liste non vide des champs de nom/prénom */ - public static function getVersementsPersonnes($annee, $champsNom) + public static function getVersementsPersonnes($annee, array $champsNom) : array { $db = DB::getInstance(); $tri = Utils::combinerTri($champsNom); @@ -74,10 +74,12 @@ class Utils * @return versements correspondants à l'année et aux tarifs donnés * triés par tarif, nom, date * @param $annee - * @param array $tarifs - * @param array $champsNom : liste non vide des champs de nom/prénom + * @param $tarifs + * @param $champsNom : liste non vide des champs de nom/prénom */ - public static function getVersementsTarifs($annee, $tarifs, $champsNom) + public static function getVersementsTarifs($annee, + array $tarifs, + array $champsNom) : array { $db = DB::getInstance(); $tri = Utils::combinerTri($champsNom); @@ -111,10 +113,12 @@ class Utils /** * @return versements correspondants à l'année et aux comptes donnés * @param $annee - * @param array $comptes - * @param array $champsNom : liste non vide des champs de nom/prénom + * @param $comptes + * @param $champsNom : liste non vide des champs de nom/prénom */ - public static function getVersementsComptes($annee, $comptes, $champsNom) + public static function getVersementsComptes($annee, + array $comptes, + array $champsNom) : array { $db = DB::getInstance(); $tri = Utils::combinerTri($champsNom); @@ -147,9 +151,9 @@ class Utils /** * Versements totaux par personne pour une année donnée * @param année - * @param array $champsNom : liste non vide des champs de nom/prénom + * @param $champsNom : liste non vide des champs de nom/prénom */ - public static function getVersementsTotaux($annee, $champsNom) + public static function getVersementsTotaux($annee, array $champsNom) : array { $tri = Utils::combinerTri($champsNom); $sql = sprintf( @@ -181,10 +185,10 @@ class Utils /** * combiner les champs avec un opérateur - * @param array $champs : liste (non vide) de champs + * @param $champs : liste (non vide) de champs * @return chaîne combinée */ - private static function combinerChamps($champs) + private static function combinerChamps(array $champs) : string { $op = ' || " " || '; $result = 'ifnull(membres.' . $champs[0] . ', "")'; @@ -195,7 +199,12 @@ class Utils return $result; } - private static function combinerTri($champs) + /** + * combiner les clés de tri + * @param clés de tri + * @return chaîne combinée + */ + private static function combinerTri(array $champs) : string { $tri = 'membres.' . $champs[0]; for ($i = 1; $i < count($champs); ++$i) @@ -208,9 +217,9 @@ class Utils /** * @return personnes ayant versé des dons pour une année donnée * @param $annee - * @param array $champsNom : champs qui définissent le nom et le prénom d'une personne + * @param $champsNom : champs qui définissent le nom et le prénom d'une personne */ - public static function getDonateurs($annee, $champsNom) : array + public static function getDonateurs($annee, array $champsNom) : array { // concaténer les champs nom/prénoms pour la sélection $nom = 'trim(' . Utils::combinerChamps($champsNom) . ') as nom,'; @@ -254,7 +263,10 @@ class Utils return $donateurs; } - public static function getLignesReduction($lesTaux) + /** + * renvoie un tableau avec les remarques de chaque taux de réduction + */ + public static function getLignesReduction(array $lesTaux) : array { foreach ($lesTaux as $elem) { @@ -269,13 +281,14 @@ class Utils } return $lignes; } + public static function getLigneReduction($taux) { return $_SESSION['ligneReduction'][$taux]; } /** - * @return liste de toutes les activités, tarifs et comptes associés + * @return array liste de toutes les activités, tarifs et comptes associés */ public static function getActivitesTarifsEtComptes() { @@ -297,7 +310,7 @@ class Utils } /** - * @return liste des années fiscales + * @return array liste des années fiscales */ public static function getAnneesFiscales() : array { @@ -317,7 +330,7 @@ class Utils * récupérer dans la config du plugin les champs des membres * utilisés pour le nom et le prénom ; ajouter/supprimer les * modifications par rapport à la config garradin - * @return tableau des champs : clé = nom, valeur = { titre, position } + * @return array tableau des champs : clé = nom, valeur = { titre, position } */ public static function getChampsNom($config, $plugin) : array { diff --git a/www/admin/script.js b/www/admin/script.js index c122c92..8be4be6 100644 --- a/www/admin/script.js +++ b/www/admin/script.js @@ -3,16 +3,16 @@ /** * Fonction appelée quand on (dé)coche la case de sélection globale * (dé)sélectionner toutes les cases à cocher de toutes les activités - * @param id de la case globale + * @param {HTMLInputElement} idCaseGlobale id de la case globale */ function cocherDecocherTout(idCaseGlobale) { // itérer sur la liste des éléments détails : 1 par couple - var lesDetails = document.querySelectorAll("details.activite"); - for (var i = 0; i < lesDetails.length; ++i) + let lesDetails = document.querySelectorAll("details.activite"); + for (let i = 0; i < lesDetails.length; ++i) { // itérer sur les personnes - var lesPersonnes = lesDetails[i].querySelectorAll("h4.personne"); + let lesPersonnes = lesDetails[i].querySelectorAll("h4.personne"); cocherDecocherLesPersonnes(idCaseGlobale, lesPersonnes); } // changer le message @@ -21,22 +21,27 @@ function cocherDecocherTout(idCaseGlobale) /** * idem dans le cas des versements des personnes + * @param {HTMLInputElement} idCaseGlobale id de la case globale */ function cocherDecocherToutesLesPersonnes(idCaseGlobale) { - var lesPersonnes = document.querySelectorAll("h4.personne"); + let lesPersonnes = document.querySelectorAll("h4.personne"); cocherDecocherLesPersonnes(idCaseGlobale, lesPersonnes); changerMessage(idCaseGlobale.nextElementSibling, idCaseGlobale); } +/** + * @param {HTMLInputElement} idCaseGlobale + * @param {NodeListOf} lesPersonnes + */ function cocherDecocherLesPersonnes(idCaseGlobale, lesPersonnes) { - for (var j = 0; j < lesPersonnes.length; ++j) + for (let j = 0; j < lesPersonnes.length; ++j) { // trouver l'élément total de la personne - var idTotal = lesPersonnes[j].querySelector("span"); + let idTotal = lesPersonnes[j].querySelector("span"); // puis la case à cocher - var idCase = lesPersonnes[j].closest("summary").querySelector("input"); + let idCase = lesPersonnes[j].closest("summary").querySelector("input"); idCase.checked = idCaseGlobale.checked; // puis traiter toutes les cases de la personne cocherDecocherPersonne(idCase, idTotal); @@ -47,21 +52,20 @@ function cocherDecocherLesPersonnes(idCaseGlobale, lesPersonnes) * Fonction appelée quand on (dé)coche la case globale d'une personne * - (dé)sélectionner toutes les cases à cocher * - faire le total des cases cochées et l'afficher - * - * @param id de la case qui a été cochée - * @param id de l'élément où afficher le total + * @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 cocherDecocherPersonne(idCase, idTotal) { // chercher le fieldset des versements - var fieldset = idCase.closest("details").querySelector("fieldset"); - var listeCases = fieldset.querySelectorAll("input[type=checkbox]"); - for (var i = 0; i < listeCases.length; ++i) + let fieldset = idCase.closest("details").querySelector("fieldset"); + let listeCases = fieldset.querySelectorAll("input[type=checkbox]"); + for (let i = 0; i < listeCases.length; ++i) { listeCases[i].checked = idCase.checked; } // calculer et afficher le total - var listeMontants = fieldset.querySelectorAll("span.montant"); + let listeMontants = fieldset.querySelectorAll("span.montant"); calculerTotal(listeCases, listeMontants, idTotal); } @@ -69,27 +73,27 @@ function cocherDecocherPersonne(idCase, idTotal) * Fonction appelée quand on (dé)coche la case d'un versement * Faire le total des cases cochées et l'afficher * - * @param id de la case qui a été cochée - * @param id de l'élément où afficher le total + * @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) { - var fieldset = idCase.closest("fieldset"); - var listeCases = fieldset.querySelectorAll("input[type=checkbox]"); - var listeMontants = fieldset.querySelectorAll("span.montant"); + let fieldset = idCase.closest("fieldset"); + 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 listes des cases - * @param listes des montants associés - * @param id de l'élément où afficher le total + * @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) { - var total = 0; - for (var i = 0; i < listeCases.length; ++i) + let total = 0; + for (let i = 0; i < listeCases.length; ++i) { if (listeCases[i].checked) { total += parseFloat(listeMontants[i].textContent.replace(/\s/g, "")); @@ -103,6 +107,8 @@ function calculerTotal(listeCases, listeMontants, idTotal) /** * changer le message en fonction de l'état coché de la case + * @param {Element} message + * @param {HTMLInputElement} idCase */ function changerMessage(message, idCase) { @@ -116,13 +122,13 @@ function changerMessage(message, idCase) /** * fonction appelée lors de la validation du formulaire * @return vrai si au moins un choix a été fait - * @param : formulaire + * @param {HTMLFormElement} formulaire */ function verifierChoix(formulaire) { - var listeCheck = formulaire.getElementsByTagName("input"); - var ok = false; - for (var i = 1; i < listeCheck.length; ++i) + let listeCheck = formulaire.getElementsByTagName("input"); + let ok = false; + for (let i = 1; i < listeCheck.length; ++i) { if (listeCheck[i].checked) { @@ -137,39 +143,55 @@ function verifierChoix(formulaire) return ok; } +/** + * afficher et masquer des portions de formulaire selon l'action + * @param {HTMLFormElement} formulaire + * @param {string} action après envoi du formulaire + * @param {any} nomClasse1 classe des éléments à afficher + * @param {any} nomClasse2 classe des éléments à masquer + */ function choixMethodeGeneration(formulaire, action, nomClasse1, nomClasse2) { formulaire.setAttribute('action', 'action.php?action=' + action); afficherMasquer(formulaire, nomClasse1, nomClasse2); } +/** + * afficher et masquer des portions de formulaire + * @param {HTMLFormElement} formulaire + * @param {any} nomClasse1 classe des éléments à afficher + * @param {any} nomClasse2 classe des éléments à masquer + */ function afficherMasquer(formulaire, nomClasse1, nomClasse2) { - for (var elem of formulaire.querySelectorAll(nomClasse1)) { + for (let elem of formulaire.querySelectorAll(nomClasse1)) { elem.classList.remove('hidden'); } - for (var elem of formulaire.querySelectorAll(nomClasse2)) { + for (let elem of formulaire.querySelectorAll(nomClasse2)) { elem.classList.add('hidden'); } } -// vérifier -// - qu'au moins une activité/tarif est sélectionnée -// - qu'un radio de chaque activité/tarif sélectionné a été sélectionné :) +/** + * vérifier + * - qu'au moins une activité/tarif est sélectionnée + * - qu'un radio de chaque activité/tarif sélectionné a été sélectionné :) + * @param {string} idElem id du conteneur des cases à vérifier + */ function verifierCases(idElem) { - var div = document.getElementById(idElem); - var nbChoix = 0; + let div = document.getElementById(idElem); + let nbChoix = 0; // parcourir les cases à cocher - for (var idCase of div.querySelectorAll("input[type=checkbox]")) + for (let idCase of div.querySelectorAll("input[type=checkbox]")) { if (idCase.checked) { ++nbChoix; // vérifier qu'un radio de la même ligne est sélectionné - var ligneCorrecte = false; + let ligneCorrecte = false; // trouver la ligne englobante - var ligne = idCase.closest("tr"); - for (var idRadio of ligne.querySelectorAll('input[type=radio]')) + let ligne = idCase.closest("tr"); + for (let idRadio of ligne.querySelectorAll('input[type=radio]')) { if (idRadio.checked) { ligneCorrecte = true; break; } } @@ -185,24 +207,33 @@ function verifierCases(idElem) return nbChoix != 0; } -// vérifier qu'un radio a été sélectionné dans la div paramètre +/** + * vérifier qu'un radio a été sélectionné dans la div paramètre + * @param {string} idElem id du conteneur des radios à vérifier + */ function verifierRadio(idElem) { - var div = document.getElementById(idElem); - for (var idRadio of div.querySelectorAll('input[type=radio]')) + let div = document.getElementById(idElem); + for (let idRadio of div.querySelectorAll('input[type=radio]')) { if (idRadio.checked) { return true; } } alert("Erreur : il faut sélectionner un taux de réduction"); - return false; + return false; } +/** + * afficher/masquer les détails + * @param {string} idElem bouton de masquage/affichage + * @param {string} classe des détails à afficher/masquer + * @param {string} texte du bouton + */ function montrerMasquerDetails(idElem, classe, texte) { - var lesDetails = document.querySelectorAll(classe); + let lesDetails = document.querySelectorAll(classe); if (lesDetails.length > 0) { - var leBouton = document.getElementById(idElem); + let leBouton = document.getElementById(idElem); if (leBouton.textContent.startsWith('Replier')) { // masquer