From 25cba953a75de4d261a1f024700bf7b270c30a64 Mon Sep 17 00:00:00 2001 From: engel <> Date: Mon, 23 Jan 2023 17:53:53 +0000 Subject: [PATCH] =?UTF-8?q?Am=C3=A9lioration=20gestion=20num=C3=A9ro=20de?= =?UTF-8?q?=20re=C3=A7u=20et=20impression=20adresse=20courriel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit FossilOrigin-Name: 7ec287c7e2886a4a91151abf97e5044eb9bf1617063fc3d0c818b5d7ab88eafb --- config.json | 19 +++-- lib/Personne.php | 8 ++ lib/Utils.php | 4 + templates/config.tpl | 154 ++++++++++++++++++++---------------- templates/recu.skel | 13 ++- www/admin/config.php | 79 +++++++++--------- www/admin/generer_recus.php | 49 ++++++++++-- www/admin/index.php | 2 +- www/admin/script.js | 35 ++++++++ www/admin/style.css | 12 ++- 10 files changed, 249 insertions(+), 126 deletions(-) diff --git a/config.json b/config.json index 35c9d50..622936c 100644 --- a/config.json +++ b/config.json @@ -2,15 +2,15 @@ "articlesCGI" : [ { "titre" : "200", - "valeur" : 0 + "valeur" : false }, { "titre" : "238 bis", - "valeur" : 0 + "valeur" : false }, { "titre" : "978", - "valeur" : 0 + "valeur" : false } ], "reduction" : [ @@ -18,18 +18,21 @@ "taux" : "normal", "ligne" : "UF", "remarque" : "", - "valeur" : 0 + "valeur" : false }, { "taux" : "majoré", "ligne" : "UD", "remarque" : "aide aux personnes en difficulté", - "valeur" : 0 + "valeur" : false } ], "numerotation" : { "prefixe" : "", - "separateur" : "-", - "defaut" : "%a-%m" - } + "annee" : false, + "membre" : false, + "sequentiel" : false, + "valeur_init": 1 + }, + "imprimerCourriel" : false } diff --git a/lib/Personne.php b/lib/Personne.php index 8037c1a..2a58115 100644 --- a/lib/Personne.php +++ b/lib/Personne.php @@ -8,6 +8,8 @@ namespace Garradin\Plugin\RecusFiscaux; class Personne { public $id; + public $numero; + public $courriel; public $rang; // par ordre alpha de nomPrenom ; sert aux tris public $nomPrenom; public $adresse; @@ -17,6 +19,8 @@ class Personne public function __construct( $id, + $numero, + $courriel, $rang, $nomPrenom, $adresse, @@ -25,6 +29,8 @@ class Personne ) { $this->id = $id; + $this->numero = $numero; + $this->courriel = $courriel; $this->rang = $rang; $this->nomPrenom = $nomPrenom; $this->adresse = $adresse; @@ -40,6 +46,8 @@ class Personne { return new Personne( $this->id, + $this->numero, + $this->courriel, $this->rang, $this->nomPrenom, $this->adresse, diff --git a/lib/Utils.php b/lib/Utils.php index 5d6bae6..416cfbf 100644 --- a/lib/Utils.php +++ b/lib/Utils.php @@ -297,6 +297,8 @@ class Utils $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, @@ -327,6 +329,8 @@ class Utils foreach (DB::getInstance()->iterate($sql) as $personne) { $donateurs[$personne->idUser] = new Personne($personne->idUser, + $personne->numero, + $personne->email, $personne->rang, $personne->nom, $personne->adresse, diff --git a/templates/config.tpl b/templates/config.tpl index e812ef3..7fdb7cb 100644 --- a/templates/config.tpl +++ b/templates/config.tpl @@ -38,13 +38,14 @@ +
(obligatoire ; sélectionnez tous les taux qui s'appliquent à l'association)
{foreach from=$plugin_config->reduction key="key" item="taux"} -
+
@@ -99,38 +88,65 @@
+ {* Numérotation des reçus *} +
+ Numérotation des reçus +
+ + Sélectionner les éléments qui doivent faire partie du numéro de reçu + +
+
    +
  • Préfixe : texte qui sera imprimé tel quel au début du numéro (ex : sigle de l'association) ; facultatif
  • +
  • Année fiscale : numéro de l'année fiscale (ex : 2022) ; facultatif
  • +
      + Sélectionner au moins un des deux numéros suivants +
    • Numéro de membre
    • +
    • Numéro séquentiel (1, 2, ...) : numéro d'ordre du reçu
    • +
    +
  • Valeur initiale : si vous avez choisi un numéro séquentiel, indiquez le numéro du premier reçu
  • +
+
+
+
+ + {* Préfixe *} +
+ {input type="text" name="prefixe" source=$numerotation label="Préfixe" maxlength=20} +
+ + {* Autres éléments de la numérotation *} +
+ {input type="checkbox" name="annee" source=$numerotation label="Année fiscale" value=1} +
+ +
+ {input type="checkbox" name="membre" source=$numerotation label="N° de membre" value=1} +
+ +
+ {input type="checkbox" name="sequentiel" source=$numerotation label="N° séquentiel" value=1} +
+ +
+ {input type="number" name="valeur_init" source=$numerotation label="Valeur initiale"} +
+
+
+
Autres informations - {* Numérotation des reçus *} -
-
- {* -
-

%a : année ; %m : numéro membre ; %n : numéro séquentiel ; Exemple : HA-%a-%n donne HA-2022-51

-*} - {input type="text" name="numerotation" default=$chaine_numerotation label="Numérotation des reçus" maxlength=50} -
- -
- - Saisir ici un texte qui décrit le format de la numérotation des reçus. - -
- Symboles spéciaux : -
    -
  • %a : année du reçu
  • -
  • %m : numéro de membre
  • -
  • %n : numéro d'ordre séquentiel (1, 2, ...)
  • -
- Exemple : HAL-%a-%m donnera « Reçu numéro HAL-2022-51 » pour le membre de numéro 51 -
-
-
- {* Adresse de courriel *}
- {input type="checkbox" name="afficher_courriel" value=$afficher_courriel label="Imprimer adresse courriel" help="Cocher pour imprimer l'adresse de courriel des membres"} +
+
+ {if $plugin.config.imprimerCourriel} + {input type="checkbox" name="imprimerCourriel" value="1" checked="checked" label="Imprimer" help="Cocher pour imprimer l'adresse de courriel des membres sur les reçus"} + {else} + {input type="checkbox" name="imprimerCourriel" value="1" label="Imprimer" help="Cocher pour imprimer l'adresse de courriel des membres sur les reçus"} + {/if} +
{* les champs de nom *} @@ -141,14 +157,14 @@
{foreach from=$champsNom key="nom" item="champ"} -
-
-
- - -
+
+
+
+ +
+
{/foreach}
@@ -158,28 +174,30 @@

{csrf_field key="recusfiscaux_config"} - {button type="submit" name="save" label="Enregistrer" shape="right" class="main"} + {button type="submit" name="save" label="Enregistrer" shape="right" class="main" onclick="return verifierConfig(this.form, articles_cgi, taux_reduction)"}

{literal} - -{/literal} \ No newline at end of file + +{/literal} +{* scripts divers *} + diff --git a/templates/recu.skel b/templates/recu.skel index dded5b1..941ce6a 100644 --- a/templates/recu.skel +++ b/templates/recu.skel @@ -90,7 +90,7 @@

Reçu au titre des dons à certains organismes d'intérêt général

Articles 200, 238 bis et 978 du code général des impôts

-

Reçu numéro {{$annee_recu}}/{{$numero}}

+

Reçu {{$numero}}

@@ -103,9 +103,14 @@

Donateur

-

{{$nom}}
- {{$adresse}}
- {{$code_postal}} {{$ville}}

+

+ {{$nom}}
+ {{$adresse}}
+ {{$code_postal}} {{$ville}} + {{if $courriel != ""}} +
courriel : {{$courriel}} + {{/if}} +

diff --git a/www/admin/config.php b/www/admin/config.php index 298ad01..f40b688 100644 --- a/www/admin/config.php +++ b/www/admin/config.php @@ -7,15 +7,14 @@ use Garradin\Entities\Files\File; use Garradin\Plugin\RecusFiscaux\Utils; $session->requireAccess($session::SECTION_CONFIG, $session::ACCESS_ADMIN); -$art_sel = f('articlesCGI') ? : []; -$taux_sel = f('tauxReduction') ? : []; -$noms_sel = f('champsNom') ? : []; +$art_sel = f('articlesCGI') ?: []; +$taux_sel = f('tauxReduction') ?: []; +$noms_sel = f('champsNom') ?: []; -// récupérer les champs des noms +// récupérer les champs des noms $champsNom = Utils::getChampsNom($config, $plugin); -if (f('save') && $form->check('recusfiscaux_config')) -{ +if (f('save') && $form->check('recusfiscaux_config')) { try { // objet de l'association if ($plugin->getConfig('objet_asso') != trim(f('objet_asso'))) { @@ -26,11 +25,11 @@ if (f('save') && $form->check('recusfiscaux_config')) $confArticles = $plugin->getConfig('articlesCGI'); // effacer l'ancienne configuration for ($i = 0; $i < count($confArticles); ++$i) { - $confArticles[$i]->valeur = 0; + $confArticles[$i]->valeur = false; // 0 } // et copier la nouvelle foreach ($art_sel as $article) { - $confArticles[$article]->valeur = 1; + $confArticles[$article]->valeur = true; // 1 } $plugin->setConfig("articlesCGI", $confArticles); @@ -38,28 +37,35 @@ if (f('save') && $form->check('recusfiscaux_config')) $confTaux = $plugin->getConfig('reduction'); // effacer l'ancienne configuration for ($i = 0; $i < count($confTaux); ++$i) { - $confTaux[$i]->valeur = 0; + $confTaux[$i]->valeur = false; // 0 } // et copier la nouvelle foreach ($taux_sel as $taux) { - $confTaux[$taux]->valeur = 1; + $confTaux[$taux]->valeur = true; // 1 } $plugin->setConfig("reduction", $confTaux); - // nom, fonction et signature du responsable + // Informations au sujet du responsable if ($plugin->getConfig('nom_responsable') != trim(f('nom_responsable'))) { $plugin->setConfig('nom_responsable', trim(f('nom_responsable'))); } if ($plugin->getConfig('fonction_responsable') != trim(f('fonction_responsable'))) { $plugin->setConfig('fonction_responsable', trim(f('fonction_responsable'))); } - + // ville + if ($plugin->getConfig('ville_asso') != trim(f('ville_asso'))) { + $plugin->setConfig('ville_asso', trim(f('ville_asso'))); + } // signature - if (isset($_SESSION['sig_file']) && count($_SESSION['sig_file']) > 0) - { + // error_log("SESSION['sig_file'] = " . print_r($_SESSION['sig_file'], true)); + // error_log("plugin->getConfig('signature') = " . $plugin->getConfig('signature')); + + if (isset($_SESSION['sig_file']) && count($_SESSION['sig_file']) > 0) { // supprimer la signature précédente, si besoin - if (null !== $plugin->getConfig('signature')) - { + if ( + null !== $plugin->getConfig('signature') && + $plugin->getConfig('signature') != $_SESSION['sig_file'][0]->path + ) { $sig_file = \Garradin\Files\Files::get($plugin->getConfig('signature')); if (null !== $sig_file) { $sig_file->delete(); @@ -70,49 +76,48 @@ if (f('save') && $form->check('recusfiscaux_config')) } // autres informations - // ville - if ($plugin->getConfig('ville_asso') != trim(f('ville_asso'))) { - $plugin->setConfig('ville_asso', trim(f('ville_asso'))); + // numérotation des reçus + $configNum = $plugin->getConfig('numerotation'); + error_log("configNum=" . print_r($configNum, true)); + $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->setConfig('numerotation', $formNum); + + // impression des adresses de courriel + $plugin->setConfig('imprimerCourriel', f('imprimerCourriel')); // champs pour le nom et prénom - foreach ($champsNom as $nom => $champ) - { + foreach ($champsNom as $nom => $champ) { $champ->position = 0; } $i = -count($noms_sel); - foreach ($noms_sel as $nom) - { + foreach ($noms_sel as $nom) { $champsNom[$nom]->position = $i++; } $plugin->setConfig('champsNom', $champsNom); \Garradin\Utils::redirect(PLUGIN_URL . 'config.php?ok'); - } - catch (UserException $e) - { + } catch (UserException $e) { $form->addError($e->getMessage()); } } -$conf_numerotation = $plugin->getConfig('numerotation'); -$chaine_numerotation = (isset($conf_numerotation->prefixe) && $conf_numerotation->prefixe != "") ? $conf_numerotation->prefixe : 'XXX'; -$chaine_numerotation .= $conf_numerotation->separateur . $conf_numerotation->defaut; -$afficher_courriel = false; - // trier les champs de nom pour l'affichage -uasort($champsNom, function ($a, $b) -{ +uasort($champsNom, function ($a, $b) { return $a->position - $b->position; }); $tpl->assign('ok', qg('ok') !== null); $path = qg('path') ?: File::CONTEXT_CONFIG; -//$tpl->assign('path', $path); $tpl->assign('default_signature', \Garradin\WWW_URL . "plugin/recusfiscaux/default_signature.png"); $tpl->assign('plugin_config', $plugin->getConfig()); -//$tpl->assign('champsNom', $champsNom); $tpl->assign('plugin_css', ['style.css']); -//$tpl->assign('chaine_numerotation', $chaine_numerotation); -$tpl->assign(compact('path', 'champsNom', 'chaine_numerotation', 'afficher_courriel')); +$tpl->assign('numerotation', $plugin->getConfig('numerotation')); +$tpl->assign(compact('path', 'champsNom')); $tpl->display(PLUGIN_ROOT . '/templates/config.tpl'); diff --git a/www/admin/generer_recus.php b/www/admin/generer_recus.php index d3f654c..25b5d30 100644 --- a/www/admin/generer_recus.php +++ b/www/admin/generer_recus.php @@ -52,6 +52,24 @@ elseif ($nbArticles > 1) // libellés pour les taux de réduction $libelles_taux = Utils::getLignesReduction($plugin->getConfig('reduction')); +$configNum = $plugin->getConfig('numerotation'); +error_log("config num = " . print_r($configNum, true)); +$prefixeNum = ""; +if (isset($configNum->prefixe) && $configNum->prefixe != "") { + $prefixeNum = $configNum->prefixe; +} +if (isset($configNum->annee) && $configNum->annee) { + if ($prefixeNum != "") { $prefixeNum .= "-"; } + $prefixeNum .= $_SESSION['annee_recu']; +} +if (isset($configNum->sequentiel) && $configNum->sequentiel) { + if (isset($configNum->valeur_init) && $configNum->valeur_init !="") { + $numero_sequentiel = $configNum->valeur_init; + } else { + $numero_sequentiel = 1; + } +} + // filtrer les versements sélectionnés $lesLignes = f('selected'); $versementsSelectionnes = array(); @@ -82,14 +100,33 @@ foreach ($totalPersonnes as $idPersonne => $personne) $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('annee_recu', $_SESSION['annee_recu']); - $tpl->assign('numero', $personne->id); $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 + $chaineNum = $prefixeNum; + if (isset($configNum->membre) && $configNum->membre) { + if ($chaineNum != "") { $chaineNum .= "-"; } + $chaineNum .= $personne->numero; + } + if (isset($configNum->sequentiel) && $configNum->sequentiel) { + if ($chaineNum != "") { $chaineNum .= "-"; } + $chaineNum .= $numero_sequentiel; + ++$numero_sequentiel; + } + $tpl->assign('numero', $chaineNum); + // 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) @@ -156,10 +193,10 @@ $fichierZip = Utils::makeArchive( ); //supprimer les fichiers pdf (utile ?) -// foreach ($listeFichiersPDF as $f) -// { -// unlink($f); -// } +foreach ($listeFichiersPDF as $f) +{ + unlink($f); +} /** * Cumuler les versements de chaque personne diff --git a/www/admin/index.php b/www/admin/index.php index 284ff06..a2a240b 100644 --- a/www/admin/index.php +++ b/www/admin/index.php @@ -19,7 +19,7 @@ if (! isset($_SESSION['annee_recu']) || $_SESSION['annee_recu'] == "") $nbTaux = 0; foreach ($plugin->getConfig('reduction') as $taux) { - if ($taux->valeur == 1) { ++$nbTaux; } + if ($taux->valeur) { ++$nbTaux; } } // idem avec les champs nom/prénom diff --git a/www/admin/script.js b/www/admin/script.js index 883517c..fcc700f 100644 --- a/www/admin/script.js +++ b/www/admin/script.js @@ -258,3 +258,38 @@ function montrerMasquerDetails(idElem, classe, texte) } } } + +/** + * + */ +function aumoinsun(conteneur, message) +{ + let listeCheck = conteneur.querySelectorAll('input[type=checkbox]'); + for (let elem of listeCheck) + { + if (elem.checked) { return true; } + } + alert("Erreur : il faut sélectionner au moins " + message); + return false; +} +/** + * vérifier les données saisies dans le formulaire de configuration +*/ +function verifierConfig( + formulaire, + divArticles, + divTauxReduc +) +{ + // articles + if (! aumoinsun(divArticles, "un article")) { return false; } + + // taux de réduction + if (! aumoinsun(divTauxReduc, "un taux de réduction")) { return false; } + + // Nom, fonction, signature + + + // alert("Erreur : il faut sélectionner au moins un versement"); + return true; +} diff --git a/www/admin/style.css b/www/admin/style.css index 82485ec..9aad3a5 100644 --- a/www/admin/style.css +++ b/www/admin/style.css @@ -100,10 +100,10 @@ div#config_nom_fonction { display: flex; } -div#numerotation +div#numero_recus { display:flex; - align-items: last baseline; +/* align-items: last baseline;*/ } div.champnom { @@ -128,3 +128,11 @@ ul.reduction span.radio-btn margin-left : 2em; border-spacing : 0.1em; } +input#f_prefixe +{ + max-width : 8em; +} +input#f_valeur_init +{ + max-width: 4em; +}