diff --git a/README.md b/README.md index 0136279..83801e5 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,24 @@ -# Plugin reçus fiscaux pour Paheko +# Plugin reçus fiscaux pour Garradin/Paheko -Plugin de reçus fiscaux pour le logiciel de gestion d'association [Paheko](https://paheko.cloud). +Plugin de reçus fiscaux pour le logiciel de gestion d'association Garradin/Paheko (https://paheko.cloud). ## Installation -Télécharger la [version la plus récente](https://git.roflcopter.fr/lesanges/recusfiscaux/releases) au format tar.gz, supprimer le numéro de version du nom de l'archive et la copier dans le répertoire data/plugins de Paheko +### Attention +Les archives disponibles sur ce gitlab n'ont pas un format compatible avec Garragin/Paheko et ne peuvent donc être utilisées telles quelles ; il faut soit les transformer pour les rendre compatibles, soit (plus simple) télécharger l'archive indiquée ci-dessous. + +### Archive +Vous pouvez télécharger [l'archive .tar.gz](https://ncloud6.zaclys.com/index.php/s/RZQK2So8HemkH3w), et la copier dans le dossier plugins de Garradin/Paheko. ## Fonctionnalités - Créer des reçus fiscaux pour les dons des membres - - reçu par activité et tarif : un, plusieurs ou tous - - reçu par personne : une, plusieurs ou tous + - reçu par activité et tarif : 1, plusieurs ou tous + - reçu par personne : 1, plusieurs ou tous - distinguer les différents taux de réduction - - génération des reçus au format PDF avec un générateur PDF externe - ou impression depuis le navigateur ## Configuration - association - - Objet (but) de l'association + - Objet (but) de l'association - articles du CGI concernés par la réduction fiscale - taux de réduction applicables - responsable @@ -25,6 +27,6 @@ Télécharger la [version la plus récente](https://git.roflcopter.fr/lesanges/r - signature (image) - autres - ville (précède la date sur le formulaire) - - paramétrage du numéro de reçu (préfixe quelconque, année fiscale, numéro de membre ou séquentiel) - - possibilité d'imprimer l'adresse de courriel + - paramétrage numéro de reçu (préfixe quelconque, année fiscale, numéro de memmbre ou séquentiel) + - possibilité imprimer adresse de courriel - choix et ordre des champs pour le nom et prénom (le libellé doit contenir le terme 'nom', casse indifférente) diff --git a/admin/config.php b/admin/config.php deleted file mode 100644 index a5d7c51..0000000 --- a/admin/config.php +++ /dev/null @@ -1,123 +0,0 @@ -requireAccess($session::SECTION_CONFIG, $session::ACCESS_ADMIN); - -// récupérer les champs des noms -$champsNom = Utils::getChampsNom($config, $plugin); - -$csrf_key = 'recusfiscaux_config'; - -$form->runIf('save', function () use ($plugin, $champsNom) { - // Objet de l'asso - $plugin->setConfigProperty('objet_asso', trim(f('objet_asso'))); - - // Articles du CGI - $confArticles = $plugin->getConfig('articlesCGI'); - // effacer l'ancienne configuration - for ($i = 0; $i < count($confArticles); ++$i) { - $confArticles[$i]->valeur = false; - } - // et copier la nouvelle - $art_sel = f('articlesCGI') ?: []; - foreach ($art_sel as $article) { - $confArticles[$article]->valeur = true; - } - $plugin->setConfigProperty('articlesCGI', $confArticles); - - // Taux de réduction - $confTaux = $plugin->getConfig('reduction'); - // effacer l'ancienne configuration - for ($i = 0; $i < count($confTaux); ++$i) { - $confTaux[$i]->valeur = false; - } - // et copier la nouvelle - $taux_sel = f('tauxReduction') ?: []; - foreach ($taux_sel as $taux) { - $confTaux[$taux]->valeur = true; - } - $plugin->setConfigProperty("reduction", $confTaux); - - // Informations au sujet du responsable - $plugin->setConfigProperty('nom_responsable', trim(f('nom_responsable') ?: '') ?: null); - $plugin->setConfigProperty('fonction_responsable', trim(f('fonction_responsable') ?: '') ?: null); - $plugin->setConfigProperty('ville_asso', trim(f('ville_asso') ?: '') ?: null); - - // signature - if (isset($_SESSION['sig_file']) && count($_SESSION['sig_file']) > 0) { - // supprimer la signature précédente, si besoin - if ( - null !== $plugin->getConfig('signature') - && - $plugin->getConfig('signature') != $_SESSION['sig_file'][0]->path - ) { - $sig_file = \Paheko\Files\Files::get($plugin->getConfig('signature')); - if (null !== $sig_file) { - $sig_file->delete(); - } - } - // puis installer la nouvelle - $plugin->setConfigProperty('signature', $_SESSION['sig_file'][0]->path); - } - - // Numérotation des reçus - $configNum = $plugin->getConfig('numerotation'); - $formNum = clone $configNum; - if ($configNum->prefixe != trim(f('prefixe'))) { - $formNum->prefixe = trim(f('prefixe')); - } - $formNum->annee = f('annee'); - $formNum->membre = f('membre'); - $formNum->sequentiel = f('sequentiel'); - $formNum->valeur_init = f('valeur_init'); - $plugin->setConfigProperty('numerotation', $formNum); - - // Impression des adresses de courriel - $plugin->setConfigProperty('imprimerCourriel', trim(f('imprimerCourriel') ?: '') ?: null); - - // champs pour le nom et prénom - foreach ($champsNom as $nom => $champ) { - $champ->position = 0; - } - $noms_sel = f('champsNom') ?: []; - $i = -count($noms_sel); - foreach ($noms_sel as $nom) { - $champsNom[$nom]->position = $i++; - } - $plugin->setConfigProperty('champsNom', $champsNom); - - // enregistrer la nouvelle config - $plugin->save(); -}, $csrf_key, PLUGIN_ADMIN_URL . 'config.php?ok'); - - -// test fonctions fichiers : voir files.sor -// $fichiers = Files::list('config'); -// error_log("fichiers config = " . print_r($fichiers, true)); -// $fichiers = Files::list('ext/recusfiscaux'); -// error_log("fichiers ext/recusfiscaux = " . print_r($fichiers, true)); -$sig_file = Files::get('ext/recusfiscaux/default_signature.png'); -// error_log("sig_file = " . print_r($sig_file, true)); - -//error_log("config.php::config=" . print_r($plugin->getConfig(), true)); - - -// trier les champs de nom pour l'affichage -uasort($champsNom, function ($a, $b) { - return $a->position - $b->position; -}); - -$path = qg('path') ?: File::CONTEXT_CONFIG; -$tpl->assign('default_signature', '/' . 'ext/recusfiscaux/default_signature.png'); -// $tpl->assign('default_signature', \Paheko\WWW_URL . "plugin/recusfiscaux/default_signature.png"); -$tpl->assign('plugin_config', $plugin->getConfig()); -$tpl->assign('plugin_css', ['style.css']); -$tpl->assign('numerotation', $plugin->getConfig('numerotation')); -$tpl->assign(compact('csrf_key', 'path', 'champsNom')); -$tpl->display(PLUGIN_ROOT . '/templates/config.tpl'); diff --git a/admin/generer_recus.php b/admin/generer_recus.php deleted file mode 100644 index 6fa83bf..0000000 --- a/admin/generer_recus.php +++ /dev/null @@ -1,473 +0,0 @@ -fileURL('signature')) ? - $config->fileURL('signature') : - ((null !== $plugin->getConfig('signature')) ? - \KD2\HTTP::getScheme() . '://' . \KD2\HTTP::getHost() . WWW_URI . $plugin->getConfig('signature') : - ""); - -// logo -$config = Config::getInstance(); -$logo_asso = - (null !== $config->fileURL('logo')) ? - $config->fileURL('logo') : - ""; - -// articles du CGI -$articlesCGI = array(); -foreach ($plugin->getConfig('articlesCGI') as $article) { - if ($article->valeur == 1) { - $articlesCGI[] = $article->titre; - } -} -$nbArticles = count($articlesCGI); -if ($nbArticles == 1) { - $texteArticles = 'à l’article ' . $articlesCGI[0]; -} elseif ($nbArticles > 1) { - $texteArticles = 'aux articles '; - for ($i = 0; $i < $nbArticles; ++$i) { - $texteArticles .= $articlesCGI[$i]; - if ($i < $nbArticles - 2) { - $texteArticles .= ", "; - } else if ($i == $nbArticles - 2) { - $texteArticles .= " et "; - } - } -} - -// libellés pour les taux de réduction -$libelles_taux = Utils::getLignesReduction($plugin->getConfig('reduction')); - -// numérotation des reçus -$configNum = $plugin->getConfig('numerotation'); - -// filtrer les versements sélectionnés -$lesLignes = f('selected'); -$versementsSelectionnes = array(); -foreach ($lesLignes as $ligne) { - $versementsSelectionnes[] = $_SESSION['lesVersements'][$ligne]; -} - -// cumuler les versements -if ($_GET['type'] == 'personne') { - $totalPersonnes = cumulerVersementsPersonne($versementsSelectionnes); -} elseif ($_GET['type'] == 'activite') { - $totalPersonnes = cumulerVersementsTarif($versementsSelectionnes); -} - -// générer les reçus -if ($_GET['format'] == 'pdf') { - genererRecusPDF($totalPersonnes, - $signature, - $logo_asso, - $texteArticles, - $plugin, - $configNum, - $libelles_taux - ); -} else if ($_GET['format'] == 'print') { - generererRecusHTML($tpl, - $totalPersonnes, - $signature, - $logo_asso, - $texteArticles, - $plugin, - $configNum, - $libelles_taux - ); -} else { - // Erreur : format inconnu ; ne devrait pas se produire -} - -function genererRecusPDF($totalPersonnes, - $signature, - $logo_asso, - $texteArticles, - $plugin, - $configNum, - $libelles_taux -) -{ - // - $fichierHTML = sprintf('%s/print-%s.html', CACHE_ROOT, md5(random_bytes(16))); - // - $listeFichiersPDF = array(); - $fmt = new \NumberFormatter('fr_FR', \NumberFormatter::SPELLOUT); - $prefixeNum = getNumPrefixe($configNum); - $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->assignArray(compact('signature', 'logo_asso', 'texteArticles')); - $tpl->assign('objet_asso', $plugin->getConfig('objet_asso')); - $tpl->assign('nom_responsable', $plugin->getConfig('nom_responsable')); - $tpl->assign('fonction_responsable', $plugin->getConfig('fonction_responsable')); - $tpl->assign('ville_asso', $plugin->getConfig('ville_asso')); - $tpl->assign('nom', $personne->nomPrenom); - $tpl->assign('adresse', $personne->adresse); - $tpl->assign('code_postal', $personne->codePostal); - $tpl->assign('ville', $personne->ville); - $tpl->assign('date', date("j/m/Y")); - - // numéro de reçu - $tpl->assign('numero', - faireNumeroRecu($prefixeNum, - $configNum->membre, - $personne->numero, - $numero_sequentiel)); - - // adresse de courriel - if ($plugin->getConfig('imprimerCourriel')) { - $courriel = $personne->courriel; - } else { - $courriel = ""; - } - $tpl->assign('courriel', $courriel); - - // les versements - $tpl->registerSection( - 'versements', - function () use ($personne, $libelles_taux, $fmt) { - foreach ($personne->versements as $taux => $versement) { - $ligne['montant'] = $versement->montant; - $ligne['euros'] = $fmt->format((int)($versement->montant / 100)); - if ($versement->montant % 100 != 0) { - $ligne['cents'] = $fmt->format($versement->montant % 100); - } else { - $ligne['cents'] = ""; - } - $ligne['libelle'] = $libelles_taux[$taux]; - $ligne['dateMin'] = date("d/m/Y", $versement->dateMin); - $ligne['dateMax'] = date("d/m/Y", $versement->dateMax); - yield $ligne; - } - } - ); - - // mentions complémentaires - $complements = mentionsComplémentaires(); - - $tpl->registerSection( - 'informations', - function () use ($complements) { - foreach ($complements as $elem) { - yield (array) $elem; - } - } - ); - - // - // récupérer les reçus au format html - $recuHTML = $tpl->fetch(); - // enregistrer dans le fichier - file_put_contents($fichierHTML, $recuHTML, FILE_APPEND); - // - - // fabriquer le fichier PDF - genererPDF($tpl->fetch(), $personne->nomPrenom, $listeFichiersPDF); - } - - // afficher dans un dialog - //marche pas - // printf(' - // - // - // - // - // ', $fichierHTML, "90%", "90%"); - - // affiche une page vide - // $link = ""; - // echo $link; - - // faire une archive zip - $fichierZip = Utils::makeArchive( - $listeFichiersPDF, - $_SESSION['annee_recu'], - PLUGIN_ROOT . "/zip" - ); - - //supprimer les fichiers pdf - foreach ($listeFichiersPDF as $f) { - \Paheko\Utils::safe_unlink($f); - } -} // genererRecusPDF - -function generererRecusHTML($tpl, - $totalPersonnes, - $signature, - $logo_asso, - $texteArticles, - $plugin, - $configNum, - $libelles_taux -) -{ - $tpl->register_function('afficher_numero_recu', function($params) - { - $prefixeNum = $params['prefixe']; - $membre = $params['membre']; - $numero_personne = $params['numero_personne']; - $numero_sequentiel = $params['numero_sequentiel']; - $numero = faireNumeroRecu($prefixeNum, - $membre, - $numero_personne, - $numero_sequentiel); - $out = sprintf(' -

Reçu %s

', - $numero - ); - return $out; - }); - - $tpl->assign(compact( - 'totalPersonnes', - 'logo_asso', - 'signature', - 'libelles_taux', - 'texteArticles' - )); - $tpl->assign('prefixeNum', getNumPrefixe($configNum)); - $tpl->assign('membre', $configNum->membre); - $tpl->assign('numero_sequentiel', getNumSequentiel($configNum)); - $tpl->assign('org_name', Config::getInstance()->get('org_name')); - $tpl->assign('org_address', Config::getInstance()->get('org_address')); - $tpl->assign('objet_asso', $plugin->getConfig('objet_asso')); - $tpl->assign('courriel', $plugin->getConfig('imprimerCourriel')); - $tpl->assign('complements', mentionsComplémentaires()); - $tpl->assign('ville_asso', $plugin->getConfig('ville_asso')); - $tpl->assign('date', date("j/m/Y")); - $tpl->assign('nom_responsable', $plugin->getConfig('nom_responsable')); - $tpl->assign('fonction_responsable', $plugin->getConfig('fonction_responsable')); - - $tpl->assign('plugin_css', ['previs_recu.css', 'imprimer_recu.css']); - $tpl->display(PLUGIN_ROOT . '/templates/recu_html.tpl'); -} // generererRecusHTML - -/** - * Cumuler les versements de chaque personne - * @param tableau des versements triés par idUser, date - * @return tableau des versements cumulés : id => Personne - */ -function cumulerVersementsPersonne($versements) -{ - $totalPersonnes = array(); - $idPersonneCourant = -1; - $dateMin = PHP_INT_MAX; - $dateMax = -1; - $totalVersements = 0; - foreach ($versements as $ligne) { - if ($ligne->idUser != $idPersonneCourant) { - // changement de personne - if ($idPersonneCourant != -1) { - $totalPersonnes[$idPersonneCourant]->ajouterVersement( - $_SESSION['taux_reduction'], - $totalVersements, - $dateMin, - $dateMax - ); - } - $dateMin = strtotime($ligne->date); - $dateMax = strtotime($ligne->date); - $idPersonneCourant = $ligne->idUser; - $totalVersements = $ligne->versement; - // créer les infos de la personne, sauf si elle est déjà présente - if (!array_key_exists($idPersonneCourant, $totalPersonnes)) { - $totalPersonnes[$idPersonneCourant] = $_SESSION['membresDonateurs'][$ligne->idUser]->clone(); - } - } else { - // même personne : cumuler versements et mettre à jour les dates - $totalVersements += $ligne->versement; - if (strtotime($ligne->date) < $dateMin) { - $dateMin = strtotime($ligne->date); - } - if (strtotime($ligne->date) > $dateMax) { - $dateMax = strtotime($ligne->date); - } - } - } - // et le dernier - $totalPersonnes[$idPersonneCourant]->ajouterVersement( - $_SESSION['taux_reduction'], - $totalVersements, - $dateMin, - $dateMax - ); - return $totalPersonnes; -} // cumulerVersementsPersonne - -/** - * Cumuler les versements de chaque personne par tarif - * @param tableau des versements triés par idTarif, idUser, date - * @return tableau des versements cumulés : id => Personne - */ -function cumulerVersementsTarif($versements) -{ - $totalPersonnes = array(); - $idTarifCourant = -1; - $idPersonneCourant = -1; - $idCompteCourant = -1; - $dateMin = PHP_INT_MAX; - $dateMax = -1; - $totalVersements = 0; - foreach ($versements as $ligne) { - if ( - $ligne->idTarif != $idTarifCourant || - $ligne->idUser != $idPersonneCourant || - $ligne->idCompte != $idCompteCourant - ) { - if ($idTarifCourant != -1) { - // changement de tarif, de personne ou de compte - $tarifCompte = ($idTarifCourant == 0) ? - $idCompteCourant : - $idTarifCourant . "_" . $idCompteCourant; - $totalPersonnes[$idPersonneCourant]->ajouterVersement( - $_SESSION['tauxSelectionnes'][$tarifCompte], - $totalVersements, - $dateMin, - $dateMax - ); - } - $dateMin = strtotime($ligne->date); - $dateMax = strtotime($ligne->date); - $idTarifCourant = $ligne->idTarif; - $idPersonneCourant = $ligne->idUser; - $idCompteCourant = $ligne->idCompte; - $totalVersements = $ligne->versement; - // créer les infos de la personne, sauf si elle est déjà présente - if (!array_key_exists($idPersonneCourant, $totalPersonnes)) { - $totalPersonnes[$idPersonneCourant] = $_SESSION['membresDonateurs'][$ligne->idUser]->clone(); - } - } else { - // même personne : cumuler versements et mettre à jour les dates - $totalVersements += $ligne->versement; - if (strtotime($ligne->date) < $dateMin) { - $dateMin = strtotime($ligne->date); - } - if (strtotime($ligne->date) > $dateMax) { - $dateMax = strtotime($ligne->date); - } - } - } - // et le dernier - $tarifCompte = ($idTarifCourant == 0) ? - $idCompteCourant : - $idTarifCourant . "_" . $idCompteCourant; - $totalPersonnes[$idPersonneCourant]->ajouterVersement( - $_SESSION['tauxSelectionnes'][$tarifCompte], - $totalVersements, - $dateMin, - $dateMax - ); - return $totalPersonnes; -} // cumulerVersementsTarif - -/** - * génère un fichier PDF à partir d'un document html - * ajoute son nom à la liste de fichiers - */ -function genererPDF($docHTML, $nomPersonne, &$listeFichiersPDF) -{ - // fabriquer le fichier PDF - $nomPDF = \Paheko\Utils::filePDF($docHTML); - // changer le nom du fichier - $nom = str_replace(' ', '_', $nomPersonne); - $nom = str_replace("'", "", $nom); - $nomFichier = sprintf( - '%s/recu_%s_%s.pdf', - dirname($nomPDF), - $_SESSION['annee_recu'], - $nom - ); - rename($nomPDF, $nomFichier); - // ajouter le nom du fichier à la liste pour mettre dans une archive - $listeFichiersPDF[] = $nomFichier; -} // genererPDF - -function faireNumeroRecu($prefixeNum, $membre, $numero, &$numero_sequentiel) -{ - if (isset($membre) && $membre) { - if ($prefixeNum != "") { - $prefixeNum .= "-"; - } - $prefixeNum .= $numero; - } - if ($numero_sequentiel) { - if ($prefixeNum != "") { - $prefixeNum .= "-"; - } - $prefixeNum .= $numero_sequentiel; - ++$numero_sequentiel; - } - return $prefixeNum; -} - -/** - * renvoyer le préfixe du numéro de reçu - */ -function getNumPrefixe($configNum) -{ - $prefixeNum = ""; - if (isset($configNum->prefixe) && $configNum->prefixe != "") { - $prefixeNum = $configNum->prefixe; - } - if (isset($configNum->annee) && $configNum->annee) { - if ($prefixeNum != "") { - $prefixeNum .= "-"; - } - $prefixeNum .= $_SESSION['annee_recu']; - } - return $prefixeNum; -} - -/** - * renvoyer le premier numéro de la numérotation séquentielle - * renvoie false si pas de numérotation séquentielle - */ -function getNumSequentiel($configNum) -{ - if (isset($configNum->sequentiel) && $configNum->sequentiel) { - if (isset($configNum->valeur_init) && $configNum->valeur_init != "") { - $numero_sequentiel = $configNum->valeur_init; - } else { - $numero_sequentiel = 1; - } - } - return isset($numero_sequentiel) ? $numero_sequentiel : false; -} - -function mentionsComplémentaires() -{ - $donnees = array( - 'Nature du don : ' => "Numéraire", - 'Mode de versement : ' => "chèque et/ou virement" - ); - $complements = array(); - foreach ($donnees as $titre => $libelle) { - $elem = new \stdClass(); - $elem->titre = $titre; - $elem->libelle = $libelle; - $complements[] = $elem; - } - return $complements; -} diff --git a/admin/imprimer_recu.css b/admin/imprimer_recu.css deleted file mode 100644 index 31778da..0000000 --- a/admin/imprimer_recu.css +++ /dev/null @@ -1,51 +0,0 @@ -/* - * impression - */ -@page -{ - size: A4 portrait; -} - -header.header { - display: none; -} - -body { - background: #fff; - padding: 0; - margin: 0; -} - -.noprint { - display: none; -} - -nav.tabs -{ - display: none; -} - -main { - margin: 0; -} - -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; -} diff --git a/admin/previs_recu.css b/admin/previs_recu.css deleted file mode 100644 index 3605d4b..0000000 --- a/admin/previs_recu.css +++ /dev/null @@ -1,103 +0,0 @@ -/* - * prévisualisation reçu au format HTML - */ - -div.previs_recu -{ - width : 18.5cm; -} - -#logo -{ - max-height : 4cm; -} - -#titre -{ - margin : 0 2cm 0 2cm; - text-align : center; - font-size : 14pt; - font-weight: bold; -} - -#articles -{ - margin-bottom: 0.5cm; - text-align : center; -} - -#numRecu -{ - text-align : right; - margin-right: 1em; -} - -#versements -{ - border-top: 1px solid rgb(0, 0, 128); - border-bottom: 1px solid rgb(0, 0, 128); - padding-top: 1em; - margin-bottom: 1em; -} - -.cartouche -{ - padding-bottom: 1em; -} - -.rubrique -{ - background-color : rgb(200, 200, 250); - padding : 0 0 0 1mm; - margin-bottom: 1em; -} - -.titre, .important -{ - font-weight:bold; -} -.libelle -{ - font-weight: normal; -} - -#ville -{ - margin-bottom: 0; -} - -#signature -{ - display: block; - max-width : 7cm; - max-height : 4cm; - margin: 0 auto; - padding-bottom : 2mm; -} - -#versements > ul -{ - list-style: inside; - margin-left: 2em; -} - -#date_versements -{ - margin-left: 1.5em; -} - -p.complements -{ - margin-top : 1em; -} - -span.titre, span.libelle -{ - display : inline; -} - -/* Ne pas imprimer le bandeau des boutons du profiler */ -#__profiler -{ - display: none; -} diff --git a/admin/upload.php b/admin/upload.php deleted file mode 100644 index fca8872..0000000 --- a/admin/upload.php +++ /dev/null @@ -1,24 +0,0 @@ -runIf('upload', function () use ($parent, $session) { - $_SESSION['sig_file'] = \Paheko\Files\Files::uploadMultiple($parent, 'file', $session); -}, $csrf_key, PLUGIN_ROOT . '/admin/config.php'); - -$tpl->assign(compact('parent', 'csrf_key')); - -$tpl->display(PLUGIN_ROOT . '/templates/upload.tpl'); diff --git a/admin/versements_activites.php b/admin/versements_activites.php deleted file mode 100644 index 56114bf..0000000 --- a/admin/versements_activites.php +++ /dev/null @@ -1,98 +0,0 @@ - - strpos($elem, '_') !== false ? substr($elem, 0, strpos($elem, '_')) : "", - $tarifsSelectionnes); -$lesComptes = array_map(fn($elem) : string => - strpos($elem, '_') !== false ? substr($elem, 1 + strpos($elem, '_')) : "", - $tarifsSelectionnes); - -# versements des tarifs sélectionnées et de leur compte associé -if (count($lesTarifs) != 0) -{ - $_SESSION['lesVersements'] = - Utils::getVersementsTarifsComptes( - $_SESSION['annee_recu'], - $lesTarifs, - $lesComptes, - $champsNom); - // error_log("lesVersements=" . print_r($_SESSION['lesVersements'], true)); -} - -// ajouter les versements sans tarif (tri par nom, compte, date) -if (isset($_SESSION['comptesSelectionnes'])) -{ - $versementsSansTarif = Utils::getVersementsComptes($_SESSION['annee_recu'], - $_SESSION['comptesSelectionnes'], - $champsNom); - foreach ($versementsSansTarif as $versement) - { - $_SESSION['lesVersements'][] = $versement; - } -} -//error_log("lesVersements=" . print_r($_SESSION['lesVersements'], true)); - -// préparation de l'affichage -$tpl->assign('lesVersements', $_SESSION['lesVersements']); -$tpl->assign('annee_recu', $_SESSION['annee_recu']); -$tpl->assign('plugin_css', ['style.css']); - -// envoyer au template -$tpl->display(PLUGIN_ROOT . '/templates/versements_activites.tpl'); - diff --git a/garradin_plugin.ini b/garradin_plugin.ini new file mode 100644 index 0000000..27e3292 --- /dev/null +++ b/garradin_plugin.ini @@ -0,0 +1,8 @@ +nom="Reçus fiscaux" +description="Génération de reçus fiscaux pour les dons des membres" +auteur="jce" +url="https://ncloud6.zaclys.com/index.php/s/RZQK2So8HemkH3w" +version="0.8" +menu=1 +config=1 +min_version="1.1.23" diff --git a/install.php b/install.php index c9b26e3..1117fa6 100644 --- a/install.php +++ b/install.php @@ -1,23 +1,10 @@ get('name'); -const SIGNATURE_DEFAUT = 'default_signature.png'; -const CONFIG_INIT = 'config.json'; - -// configuration initiale -$config_init = json_decode(file_get_contents(Plugins::getPath($nom_plugin) . '/' . CONFIG_INIT), - true); - -// enregistrer dans la config du plugin -foreach ($config_init as $cle => $valeur) { - $plugin->setConfigProperty($cle, $valeur); -} -$plugin->save(); +namespace Garradin; +use Garradin\Entities\Files\File; // « signature » par défaut à remplacer (voir l'onglet de configuration) -$path = __DIR__ . '/data/' . SIGNATURE_DEFAUT; -$default_signature_file = Files::createFromPath('ext/' . $nom_plugin . '/' . SIGNATURE_DEFAUT, - $path); +$path = __DIR__ . '/data/default_signature.png'; +$default_signature_file = (new File)->createAndStore('skel/plugin/recusfiscaux', + 'default_signature.png', + $path, + null); diff --git a/lib/Personne.php b/lib/Personne.php index 1f639af..2a58115 100644 --- a/lib/Personne.php +++ b/lib/Personne.php @@ -1,6 +1,6 @@ getGrouped($sql); - } + /** + * @return informations sur les tarifs + */ + public static function getTarifs() + { + $db = DB::getInstance(); + $sql = sprintf( + 'SELECT + id, + id_service as idActivite, + label, + description, + amount as montant + FROM services_fees'); + return Utils::toAssoc($db->get($sql), 'id'); + } - /** - * @return informations sur les activités - */ - public static function getActivites() - { - $db = DB::getInstance(); - $sql = sprintf( - 'SELECT - services.id, - services.label, - services.description - FROM services'); - return $db->getGrouped($sql); - } + /** + * @return informations sur les activités + */ + public static function getActivites() + { + $db = DB::getInstance(); + $sql = sprintf( + 'SELECT + services.id, + services.label, + services.description + FROM services'); + return Utils::toAssoc($db->get($sql), 'id'); + } - /** - * @return comptes sur lesquels des versements de membres ont été faits - * @param string $annee - * @param $op : opérateur de combinaison des comptes - * @param array $comptes - */ - public static function getComptes($annee, $op, $comptes) - { - $db = DB::getInstance(); - $sql = sprintf( - 'SELECT - acc_accounts.id, - acc_years.label, - acc_accounts.code as codeCompte, - acc_accounts.label as nomCompte - FROM acc_transactions_users - INNER JOIN users - ON acc_transactions_users.id_user = users.id - INNER JOIN acc_transactions - ON acc_transactions_users.id_transaction = acc_transactions.id - INNER JOIN acc_transactions_lines - ON acc_transactions_lines.id_transaction = acc_transactions.id - INNER JOIN acc_accounts - ON acc_transactions_lines.id_account = acc_accounts.id - INNER JOIN acc_years - ON acc_transactions.id_year = acc_years.id - WHERE - (strftime("%%Y", acc_transactions.date) = "%d" - AND - acc_accounts.%s - ) - GROUP by acc_accounts.id - ORDER by acc_accounts.code', - $annee, - $db->where('code', $op, $comptes) - ); - return $db->getGrouped($sql); - } + /** + * @return comptes sur lesquels des versements de membres ont été faits + * @param string $annee + * @param $op : opérateur de combinaison des comptes + * @param array $comptes + */ + public static function getComptes($annee, $op, $comptes) + { + $db = DB::getInstance(); + $sql = sprintf( + 'SELECT + acc_accounts.id, + acc_accounts.code as codeCompte, + acc_accounts.label as nomCompte + FROM acc_transactions_users + INNER JOIN membres + ON acc_transactions_users.id_user = membres.id + INNER JOIN acc_transactions + ON acc_transactions_users.id_transaction = acc_transactions.id + INNER JOIN acc_transactions_lines + ON acc_transactions_lines.id_transaction = acc_transactions.id + INNER JOIN acc_accounts + ON acc_transactions_lines.id_account = acc_accounts.id + WHERE + (strftime(%s, acc_transactions.date) = "%d" + AND + acc_accounts.%s + ) + GROUP by acc_accounts.code + ORDER by acc_accounts.code', + '"%Y"', + $annee, + $db->where('code', $op, $comptes) + ); + return Utils::toAssoc($db->get($sql), 'id'); + } - /** - * @return tarifs des activités et comptes ayant des versements de - * membres dans l'année - * @param string $annee - * @param $op : opérateur de combinaison des comptes - * @param array $comptes - */ - public static function getTarifsComptes($annee, $op, $comptes) - { - $db = DB::getInstance(); - $sql = sprintf( - ' - SELECT - services_users.id_fee as idTarif, - acc_accounts.id as idCompte, - acc_accounts.code as codeCompte - FROM acc_transactions_users - INNER JOIN acc_transactions - ON acc_transactions_users.id_transaction = acc_transactions.id - INNER JOIN services_users - ON acc_transactions_users.id_service_user = services_users.id - INNER JOIN services_fees - ON services_users.id_fee = services_fees.id - INNER JOIN acc_transactions_lines - ON acc_transactions_lines.id_transaction = acc_transactions.id - INNER JOIN acc_accounts - ON acc_transactions_lines.id_account = acc_accounts.id - WHERE - (strftime("%%Y", acc_transactions.date) = "%d" - AND - acc_accounts.%s - ) - GROUP BY services_fees.id, acc_accounts.code - ORDER BY acc_accounts.code - ', - $annee, - $db->where('code', $op, $comptes) - ); - return $db->get($sql); - } + /** + * @return tarifs des activités et comptes ayant des versements de + * membres dans l'année + * @param string $annee + * @param $op : opérateur de combinaison des comptes + * @param array $comptes + */ + public static function getTarifsComptes($annee, $op, $comptes) + { + $db = DB::getInstance(); + $sql = sprintf( + ' + SELECT + services_users.id_fee as idTarif, + acc_accounts.id as idCompte, + acc_accounts.code as codeCompte + FROM acc_transactions_users + INNER JOIN acc_transactions + ON acc_transactions_users.id_transaction = acc_transactions.id + INNER JOIN services_users + ON acc_transactions_users.id_service_user = services_users.id + INNER JOIN services_fees + ON services_users.id_fee = services_fees.id + INNER JOIN acc_transactions_lines + ON acc_transactions_lines.id_transaction = acc_transactions.id + INNER JOIN acc_accounts + ON acc_transactions_lines.id_account = acc_accounts.id + WHERE + (strftime(%s, acc_transactions.date) = "%d" + AND + acc_accounts.%s + ) + GROUP BY services_fees.id, acc_accounts.code + ORDER BY acc_accounts.code + ', + '"%Y"', + $annee, + $db->where('code', $op, $comptes) + ); + return $db->get($sql); + } - /** - * @return versements correspondants à l'année donnée - * @param $annee - * @param array $champsNom : liste non vide des champs de nom/prénom - */ - public static function getVersementsPersonnes($annee, $op, $comptes, $champsNom) - { - $db = DB::getInstance(); - $tri = Utils::combinerTri($champsNom); - $sql = sprintf( - 'SELECT - users.id as idUser, - acc_accounts.id as idCompte, - acc_accounts.code as codeCompte, - acc_transactions_lines.credit as versement, - acc_transactions.date - FROM acc_transactions_users - INNER JOIN users - ON acc_transactions_users.id_user = users.id - INNER JOIN acc_transactions - ON acc_transactions_users.id_transaction = acc_transactions.id - INNER JOIN acc_transactions_lines - ON acc_transactions_lines.id_transaction = acc_transactions.id - INNER JOIN acc_accounts - ON acc_transactions_lines.id_account = acc_accounts.id - WHERE - (strftime("%%Y", acc_transactions.date) = "%d" - AND - acc_accounts.%s - ) - GROUP BY acc_transactions.id, acc_accounts.id - ORDER by %s, acc_accounts.code, acc_transactions.date', - $annee, - $db->where('code', $op, $comptes), - $tri - ); - 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 à : - * @param $annee : année fiscale - * @param array $tarifs : tarifs sélectionnés - * @param array $comptes : comptes associés aux tarifs - * @param array $champsNom : liste non vide des champs de nom/prénom - * @remarks tri par tarif, nom, compte, date - */ - public static function getVersementsTarifsComptes($annee, - $tarifs, - $comptes, - $champsNom) - { - $db = DB::getInstance(); - $tri = Utils::combinerTri($champsNom); - $condition = Utils::combinerTarifsComptes($tarifs, $comptes); - $sql = sprintf( - 'SELECT - services_fees.id as idTarif, - acc_accounts.id as idCompte, - acc_accounts.code as codeCompte, - users.id as idUser, - acc_transactions_lines.credit as versement, - acc_transactions.date - FROM acc_transactions_users - INNER JOIN users - ON acc_transactions_users.id_user = users.id - INNER JOIN acc_transactions - ON acc_transactions_users.id_transaction = acc_transactions.id - INNER JOIN services_users - ON acc_transactions_users.id_service_user = services_users.id - INNER JOIN services_fees - ON services_users.id_fee = services_fees.id - INNER JOIN acc_transactions_lines - ON acc_transactions_lines.id_transaction = acc_transactions.id - INNER JOIN acc_accounts - ON acc_transactions_lines.id_account = acc_accounts.id - WHERE - (strftime("%%Y", acc_transactions.date) = "%d" - AND - %s - ) - GROUP BY acc_transactions.id, acc_accounts.id - ORDER by %s, acc_accounts.code, acc_transactions.date', - $annee, - $condition, - $tri - ); - // error_log("\ngetVersementsTarifsComptes : sql=" . $sql); - return $db->get($sql); - } + /** + * @return versements correspondants à l'année donnée + * @param $annee + * @param array $champsNom : liste non vide des champs de nom/prénom + */ + public static function getVersementsPersonnes($annee, $op, $comptes, $champsNom) + { + $db = DB::getInstance(); + $tri = Utils::combinerTri($champsNom); + $sql = sprintf( + 'SELECT + membres.id as idUser, + acc_accounts.id as idCompte, + acc_accounts.code as codeCompte, + acc_transactions_lines.credit as versement, + acc_transactions.date + FROM acc_transactions_users + INNER JOIN membres + ON acc_transactions_users.id_user = membres.id + INNER JOIN acc_transactions + ON acc_transactions_users.id_transaction = acc_transactions.id + INNER JOIN acc_transactions_lines + ON acc_transactions_lines.id_transaction = acc_transactions.id + INNER JOIN acc_accounts + ON acc_transactions_lines.id_account = acc_accounts.id + WHERE + (strftime(%s, acc_transactions.date) = "%d" + AND + acc_accounts.%s + ) + ORDER by %s, acc_accounts.code, acc_transactions.date', + '"%Y"', + $annee, + $db->where('code', $op, $comptes), + $tri + ); + return $db->get($sql); + } - /** - * @return versements correspondants à : - * @param $annee année fiscale - * @param $comptesIsoles comptes NON associés à un tarif - * @param array $champsNom : liste non vide des champs de nom/prénom - * @remarks tri par nom, compte, date - */ - public static function getVersementsComptes($annee, - $comptesIsoles, - $champsNom) - { - $db = DB::getInstance(); - $tri = Utils::combinerTri($champsNom); - $sql = sprintf( - ' - SELECT - 0 as idTarif, - acc_accounts.id as idCompte, - acc_accounts.code as codeCompte, - users.id as idUser, - acc_transactions_lines.credit as versement, - acc_transactions.date - FROM acc_transactions_users - INNER JOIN users - ON acc_transactions_users.id_user = users.id - INNER JOIN acc_transactions - ON acc_transactions_users.id_transaction = acc_transactions.id - INNER JOIN acc_transactions_lines - ON acc_transactions_lines.id_transaction = acc_transactions.id - INNER JOIN acc_accounts - ON acc_transactions_lines.id_account = acc_accounts.id - WHERE - (strftime("%%Y", acc_transactions.date) = "%d" - AND - acc_accounts.%s - ) - GROUP BY acc_transactions.id, acc_accounts.id - ORDER by %s, acc_accounts.code, acc_transactions.date - ', - $annee, - $db->where('id', 'in', $comptesIsoles), - $tri - ); - return $db->get($sql); - } + /** + * @return versements correspondants à : + * @param $annee : année fiscale + * @param $tarifs : tarifs sélectionnés + * @param array $comptes : comptes associés aux tarifs + * @param array $champsNom : liste non vide des champs de nom/prénom + * @remarks tri par tarif, nom, compte, date + */ + public static function getVersementsTarifsComptes($annee, + $tarifs, + $comptes, + $champsNom) + { + $db = DB::getInstance(); + $tri = Utils::combinerTri($champsNom); + $sql = sprintf( + 'SELECT + services_fees.id as idTarif, + acc_accounts.id as idCompte, + acc_accounts.code as codeCompte, + membres.id as idUser, + acc_transactions_lines.credit as versement, + acc_transactions.date + FROM acc_transactions_users + INNER JOIN membres + ON acc_transactions_users.id_user = membres.id + INNER JOIN acc_transactions + ON acc_transactions_users.id_transaction = acc_transactions.id + INNER JOIN services_users + ON acc_transactions_users.id_service_user = services_users.id + INNER JOIN services_fees + ON services_users.id_fee = services_fees.id + INNER JOIN acc_transactions_lines + ON acc_transactions_lines.id_transaction = acc_transactions.id + INNER JOIN acc_accounts + ON acc_transactions_lines.id_account = acc_accounts.id + WHERE + (strftime(%s, acc_transactions.date) = "%d" + AND + services_fees.%s + AND + acc_accounts.%s + ) + ORDER by services_fees.id, %s, acc_accounts.code, acc_transactions.date', + '"%Y"', + $annee, + $db->where('id', 'in', $tarifs), + $db->where('id', 'in', $comptes), + $tri + ); + return $db->get($sql); + } - /** - * @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 - */ - public static function getDonateurs($annee, $champsNom) : array - { - // concaténer les champs nom/prénoms pour la sélection - $nom = Utils::combinerChamps($champsNom); - // et pour le tri - $tri = Utils::combinerTri($champsNom); - $sql = sprintf( - 'SELECT - users.id as idUser, - users.numero, - users.email, - row_number() over(order by %s) as rang, - %s as nom, - users.adresse as adresse, - users.code_postal as codePostal, - users.ville as ville - FROM - acc_transactions_users, - users, - acc_transactions - INNER JOIN acc_transactions_lines - ON acc_transactions_lines.id_transaction = acc_transactions.id - WHERE ( - strftime("%%Y", acc_transactions.date) = "%d" - AND - acc_transactions_users.id_transaction = acc_transactions.id - AND - acc_transactions_users.id_user = users.id - ) - GROUP by users.id - ORDER by %1$s COLLATE U_NOCASE - ', - $tri, - $nom, - $annee - ); - $donateurs = array(); - foreach (DB::getInstance()->iterate($sql) as $personne) - { - $donateurs[$personne->idUser] = new Personne($personne->idUser, - $personne->numero, - $personne->email, - $personne->rang, - $personne->nom, - $personne->adresse, - $personne->codePostal, - $personne->ville); - } - return $donateurs; - } + /** + * @return versements correspondants à : + * @param $annee année fiscale + * @param $comptesIsoles comptes NON associés à un tarif + * @param array $champsNom : liste non vide des champs de nom/prénom + * @remarks tri par nom, compte, date + */ + public static function getVersementsComptes($annee, + $comptesIsoles, + $champsNom) + { + $db = DB::getInstance(); + $tri = Utils::combinerTri($champsNom); + $sql = sprintf( + ' + SELECT + 0 as idTarif, + acc_accounts.id as idCompte, + acc_accounts.code as codeCompte, + membres.id as idUser, + acc_transactions_lines.credit as versement, + acc_transactions.date + FROM acc_transactions_users + INNER JOIN membres + ON acc_transactions_users.id_user = membres.id + INNER JOIN acc_transactions + ON acc_transactions_users.id_transaction = acc_transactions.id + INNER JOIN acc_transactions_lines + ON acc_transactions_lines.id_transaction = acc_transactions.id + INNER JOIN acc_accounts + ON acc_transactions_lines.id_account = acc_accounts.id + WHERE + (strftime(%s, acc_transactions.date) = "%d" + AND + acc_accounts.%s + ) - /** - * combiner les champs avec un opérateur - * @param array $champs : liste (non vide) de champs - * @return chaîne combinée - */ - private static function combinerChamps($champs) - { - $op = ' || " " || '; - $result = 'ifnull(users.' . $champs[0] . ', "")'; - for ($i = 1; $i < count($champs); ++$i) - { - $result .= $op . 'ifnull(users.' . $champs[$i] . ', "")'; - } - return 'trim(' . $result . ')'; - } + ORDER by %s, acc_accounts.code, acc_transactions.date + ', + '"%Y"', + $annee, + $db->where('id', 'in', $comptesIsoles), + $tri + ); + return $db->get($sql); + } - /** - * combiner les clés de tri - * @param clés de tri - * @return chaîne combinée - */ - private static function combinerTri(array $champs) : string - { - $tri = 'users.' . $champs[0]; - for ($i = 1; $i < count($champs); ++$i) - { - $tri .= ', users.' . $champs[$i]; - } - return $tri; - } + /** + * @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 + */ + public static function getDonateurs($annee, $champsNom) : array + { + // concaténer les champs nom/prénoms pour la sélection + $nom = Utils::combinerChamps($champsNom); + // et pour le tri + $tri = Utils::combinerTri($champsNom); + $sql = sprintf( + 'SELECT + membres.id as idUser, + membres.numero, + membres.email, + row_number() over(order by %s) as rang, + %s as nom, + membres.adresse as adresse, + membres.code_postal as codePostal, + membres.ville as ville + FROM + acc_transactions_users, + membres, + acc_transactions + INNER JOIN acc_transactions_lines + ON acc_transactions_lines.id_transaction = acc_transactions.id + WHERE ( + strftime(%s, acc_transactions.date) = "%d" + AND + acc_transactions_users.id_transaction = acc_transactions.id + AND + acc_transactions_users.id_user = membres.id + ) + GROUP by membres.id + ORDER by %1$s COLLATE U_NOCASE + ', + $tri, + $nom, + '"%Y"', + $annee + ); + $donateurs = array(); + foreach (DB::getInstance()->iterate($sql) as $personne) + { + $donateurs[$personne->idUser] = new Personne($personne->idUser, + $personne->numero, + $personne->email, + $personne->rang, + $personne->nom, + $personne->adresse, + $personne->codePostal, + $personne->ville); + } + return $donateurs; + } - /** - * combiner chaque tarif avec le numéro de compte associé - */ - private static function combinerTarifsComptes($tarifs, $comptes) - { - $condition = '('; - $lesCond = array_map(fn($e1, $e2) : string => - "(services_fees.id = '$e1' AND acc_accounts.id = '$e2')", - $tarifs, $comptes); - $nb = 0; - foreach ($lesCond as $cond) - { - if ($nb > 0) { $condition .= ' OR '; } - $condition .= $cond; - ++$nb; - } - $condition .= ')'; - return $condition; - } + /** + * combiner les champs avec un opérateur + * @param array $champs : liste (non vide) de champs + * @return chaîne combinée + */ + private static function combinerChamps($champs) + { + $op = ' || " " || '; + $result = 'ifnull(membres.' . $champs[0] . ', "")'; + for ($i = 1; $i < count($champs); ++$i) + { + $result .= $op . 'ifnull(membres.' . $champs[$i] . ', "")'; + } + return 'trim(' . $result . ')'; + } - /** - * @return liste des années fiscales - */ - public static function getAnneesFiscales() : array - { - $rows = DB::getInstance()->get( - "SELECT strftime('%Y', start_date) as annee - FROM acc_years - UNION - SELECT strftime('%Y', end_date) as annee - FROM acc_years - ORDER by annee DESC" - ); - $anneesFiscales = array(); - foreach ($rows as $row) { - $anneesFiscales[] = $row->annee; - } - return $anneesFiscales; - } + /** + * 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) + { + $tri .= ', membres.' . $champs[$i]; + } + return $tri; + } - public static function getLignesReduction($lesTaux) - { - foreach ($lesTaux as $elem) - { - $lignes[$elem->taux] = $elem->remarque; - } - return $lignes; - } + /** + * @return liste des années fiscales + */ + public static function getAnneesFiscales() : array + { + $rows = DB::getInstance()->get( + "SELECT strftime('%Y', start_date) as annee + FROM acc_years + UNION + SELECT strftime('%Y', end_date) as annee + FROM acc_years + ORDER by annee DESC" + ); + $anneesFiscales = array(); + foreach ($rows as $row) { + $anneesFiscales[] = $row->annee; + } + return $anneesFiscales; + } - /** - * 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 paheko - * @return array tableau des champs : clé = nom, valeur = { titre, position } - */ - public static function getChampsNom($config, $plugin) : array - { - // récupérer dans la config du plugin les champs mémorisés - // pour le nom et le prénom (le tableau est vide si pas mémorisé) - $champsNom = (array) $plugin->getConfig('champsNom'); + public static function getLignesReduction($lesTaux) + { + foreach ($lesTaux as $elem) + { + $lignes[$elem->taux] = $elem->remarque; + } + return $lignes; + } - // récupérer dans la config Paheko les champs des membres - // utilisés pour le nom et le prénom - $champsPaheko = DynamicFields::getInstance()->listAssocNames(); + /** + * 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 array tableau des champs : clé = nom, valeur = { titre, position } + */ + public static function getChampsNom($config, $plugin) : array + { + // récupérer dans la config du plugin les champs mémorisés + // pour le nom et le prénom (le tableau est vide si pas mémorisé) + $champsNom = (array) $plugin->getConfig('champsNom'); - foreach ($champsPaheko as $name => $title) - { - if (stristr($title, 'nom')) - { - // retenir les champs dont le titre contient le terme 'nom' - // est-il présent dans la config du plugin ? - if (! array_key_exists($name, $champsNom)) - { - // absent => l'ajouter - $champ = new \stdClass(); - $champ->titre = $title; - $champ->position = 0; - $champsNom[$name] = $champ; - } - } - } - // opération symétrique : un champ mémorisé dans la config du - // plugin a-t-il disparu de la config paheko ? - foreach ($champsNom as $nom => $champ) - { - if (! array_key_exists($nom, $champsPaheko)) - { - // absent => le supprimer - unset($champsNom[$nom]); - } - } - // mettre à jour la config du plugin - $plugin->setConfigProperty('champsNom', $champsNom); - return $champsNom; - } + // récupérer dans la config Garradin les champs des membres + // utilisés pour le nom et le préno + $champsGarradin = $config->get('champs_membres')->listAssocNames(); - /** - * enregistrer les fichiers dans une archive zip - * @param $fileList : liste des fichiers à archiver - * @param $year : pour générer le nom de l'archive - * @param $archiveDir : ne sert plus - */ - static function makeArchive( - $fileList, - $year, - $archiveDir = null) - { - $zipFilename = "recus_dons" . $year . ".zip"; - header('Content-type: application/zip'); - header(sprintf('Content-Disposition: attachment; filename="%s"', $zipFilename)); - $zip = new ZipWriter('php://output'); - $zip->setCompression(0); - foreach ($fileList as $fileName) - { - $zip->add(basename($fileName), null, $fileName); - } - $zip->close(); - } // makeArchive + foreach ($champsGarradin as $name => $title) + { + if (stristr($title, 'nom')) + { + // retenir les champs dont le titre contient le terme 'nom' + // est-il présent dans la config du plugin ? + if (! array_key_exists($name, $champsNom)) + { + // absent => l'ajouter + $champ = new \stdClass(); + $champ->titre = $title; + $champ->position = 0; + $champsNom[$name] = $champ; + } + } + } + // opération symétrique : un champ mémorisé dans la config du + // plugin a-t-il disparu de la config garradin ? + foreach ($champsNom as $nom => $champ) + { + if (! array_key_exists($nom, $champsGarradin)) + { + // absent => le supprimer + unset($champsNom[$nom]); + } + } + // mettre à jour la config du plugin + $plugin->setConfig('champsNom', $champsNom); + return $champsNom; + } + + /** + * enregistrer les fichiers dans une archive zip + * @param $fileList : liste des fichiers à archiver + * @param $year : pour générer le nom de l'archive + * @param $archiveDir : ne sert plus + */ + static function makeArchive( + $fileList, + $year, + $archiveDir = null) + { + $zipFilename = "recus_dons" . $year . ".zip"; + header('Content-type: application/zip'); + header(sprintf('Content-Disposition: attachment; filename="%s"', $zipFilename)); + $zip = new ZipWriter('php://output'); + $zip->setCompression(0); + foreach ($fileList as $fileName) + { + $zip->add(basename($fileName), null, $fileName); + } + $zip->close(); + } // makeArchive } diff --git a/lib/Versement.php b/lib/Versement.php index 35fa9ec..e52f98c 100644 --- a/lib/Versement.php +++ b/lib/Versement.php @@ -1,6 +1,6 @@ -{include file="_head.tpl" title="%s"|args:$plugin.label current="plugin_%s"|args:$plugin.name} +{include file="admin/_head.tpl" title="%s"|args:$plugin.nom current="plugin_%s"|args:$plugin.id}