From 0e3c356d1a2ba270eb04ebf177484e7df8833fc9 Mon Sep 17 00:00:00 2001 From: engel <> Date: Tue, 31 Jan 2023 18:35:27 +0000 Subject: [PATCH] =?UTF-8?q?impl=C3=A9mentation=20impression=20re=C3=A7us?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit FossilOrigin-Name: 81f54c69ca30c343f75b4190728e55d7679b6580724471ec69a6cca70f8f94ea --- templates/recu.skel | 38 +-- templates/recu_html.tpl | 128 ++++++++++ www/admin/config.php | 3 - www/admin/generer_recus.php | 459 +++++++++++++++++++++++------------- www/admin/imprimer_recu.css | 38 +++ www/admin/previs_recu.css | 97 ++++++++ www/admin/script.js | 113 ++++----- 7 files changed, 609 insertions(+), 267 deletions(-) create mode 100644 templates/recu_html.tpl create mode 100644 www/admin/imprimer_recu.css create mode 100644 www/admin/previs_recu.css diff --git a/templates/recu.skel b/templates/recu.skel index 18a5d65..d60fa68 100644 --- a/templates/recu.skel +++ b/templates/recu.skel @@ -8,15 +8,12 @@ size: A4 portrait; margin: 1cm; } - body + body.print { + width : 19cm; font-family: Serif; font-size: 11pt; background-color: white; - width : 19cm; - } - #entete - { } #logo { @@ -24,14 +21,13 @@ } #titre { - margin : 0 2.5cm 0 2.5cm; + margin : 0 2cm 0 2cm; text-align : center; font-size : 14pt; font-weight: bold; } #articles { - margin : 0 2.5cm 0.5cm 2.5cm; text-align : center; } #numRecu @@ -39,20 +35,6 @@ text-align : right; margin-right: 1em; } - #beneficiaire, #donateur - { - } - - #beneficiaire, #donateur, #versements, #final - { - } - - #beneficiaire > h3 - { - } - #donateur > h3 - { - } #versements { @@ -84,22 +66,10 @@ margin: 0 auto; padding-bottom : 2mm; } - #final - { - page-break-after: auto; - } - /* - @media print - { - div#imprimer { - display:none; - } - } - */ -
+Reçu au titre des dons à certains organismes d'intérêt général
diff --git a/templates/recu_html.tpl b/templates/recu_html.tpl new file mode 100644 index 0000000..170a47c --- /dev/null +++ b/templates/recu_html.tpl @@ -0,0 +1,128 @@ + +{include file="%s/templates/_nav.tpl"|args:$plugin_root current_nav="activite"} + + + +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
+Association « {$nom_asso} »
+ {$adresse_asso}
+ Objet : {$objet_asso}
+
+ {$personne.nomPrenom}
+ {$personne.adresse}
+ {$personne.code} {$personne.ville}
+ {if $courriel && $personne.courriel != ""}
+
courriel : {$personne.courriel}
+ {/if}
+
Le bénéficiaire reconnaît avoir reçu au titre des dons et versements ouvrant droit à réduction d'impôt :
+{$elem.titre} {$elem.libelle}
+ {/foreach} + +Le bénéficiaire certifie sur l’honneur que les dons et versements qu’il reçoit ouvrent droit à la réduction d'impôt prévue {$texteArticles} du code général des impôts.
+{$ville_asso} le {$date} + +
+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('nom_asso', Config::getInstance()->get('nom_asso')); + $tpl->assign('adresse_asso', Config::getInstance()->get('adresse_asso')); $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('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 - $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) - { - 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 - $donnees = array( - 'Nature du don : ' => "Numéraire", - 'Mode de versement : ' => "chèque et/ou virement" - ); - $infos = array(); - foreach ($donnees as $titre => $libelle) - { - $elem = new \stdClass(); - $elem->titre = $titre; - $elem->libelle = $libelle; - $infos[] = $elem; - } - - $tpl->registerSection('informations', - function () use ($infos) - { - foreach ($infos as $elem) - { - yield (array) $elem; - } - }); - - // fabriquer le fichier PDF - $result = $tpl->fetch(); - $nomPDF = \Garradin\Utils::filePDF($result); - // changer le nom du fichier - $nom = str_replace(' ', '_', $personne->nomPrenom); - $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; -} - -// faire une archive zip -$fichierZip = Utils::makeArchive( - $listeFichiersPDF, - $_SESSION['annee_recu'], - PLUGIN_ROOT . "/zip" -); - -//supprimer les fichiers pdf (utile ?) -foreach ($listeFichiersPDF as $f) -{ - unlink($f); -} + $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 @@ -210,13 +243,10 @@ function cumulerVersementsPersonne($versements) $dateMin = PHP_INT_MAX; $dateMax = -1; $totalVersements = 0; - foreach ($versements as $ligne) - { - if ($ligne->idUser != $idPersonneCourant) - { + foreach ($versements as $ligne) { + if ($ligne->idUser != $idPersonneCourant) { // changement de personne - if ($idPersonneCourant != -1) - { + if ($idPersonneCourant != -1) { $totalPersonnes[$idPersonneCourant]->ajouterVersement( $_SESSION['taux_reduction'], $totalVersements, @@ -229,15 +259,18 @@ function cumulerVersementsPersonne($versements) $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(); + 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); } + if (strtotime($ligne->date) < $dateMin) { + $dateMin = strtotime($ligne->date); + } + if (strtotime($ligne->date) > $dateMax) { + $dateMax = strtotime($ligne->date); + } } } // et le dernier @@ -248,7 +281,7 @@ function cumulerVersementsPersonne($versements) $dateMax ); return $totalPersonnes; -} +} // cumulerVersementsPersonne /** * Cumuler les versements de chaque personne par tarif @@ -264,20 +297,17 @@ function cumulerVersementsTarif($versements) $dateMin = PHP_INT_MAX; $dateMax = -1; $totalVersements = 0; - foreach ($versements as $ligne) - { + foreach ($versements as $ligne) { if ( $ligne->idTarif != $idTarifCourant || $ligne->idUser != $idPersonneCourant || $ligne->idCompte != $idCompteCourant - ) - { - if ($idTarifCourant != -1) - { + ) { + if ($idTarifCourant != -1) { // changement de tarif, de personne ou de compte $tarifCompte = ($idTarifCourant == 0) ? - $idCompteCourant : - $idTarifCourant . "_" . $idCompteCourant; + $idCompteCourant : + $idTarifCourant . "_" . $idCompteCourant; $totalPersonnes[$idPersonneCourant]->ajouterVersement( $_SESSION['tauxSelectionnes'][$tarifCompte], $totalVersements, @@ -292,21 +322,24 @@ function cumulerVersementsTarif($versements) $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(); + 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); } + 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; + $idCompteCourant : + $idTarifCourant . "_" . $idCompteCourant; $totalPersonnes[$idPersonneCourant]->ajouterVersement( $_SESSION['tauxSelectionnes'][$tarifCompte], $totalVersements, @@ -314,4 +347,94 @@ function cumulerVersementsTarif($versements) $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 = \Garradin\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/www/admin/imprimer_recu.css b/www/admin/imprimer_recu.css new file mode 100644 index 0000000..8a51941 --- /dev/null +++ b/www/admin/imprimer_recu.css @@ -0,0 +1,38 @@ +/* + * 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; + page-break-after: always; +} diff --git a/www/admin/previs_recu.css b/www/admin/previs_recu.css new file mode 100644 index 0000000..0bf2103 --- /dev/null +++ b/www/admin/previs_recu.css @@ -0,0 +1,97 @@ +/* + * 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; +} diff --git a/www/admin/script.js b/www/admin/script.js index c517d65..a46ce9a 100644 --- a/www/admin/script.js +++ b/www/admin/script.js @@ -9,12 +9,10 @@ * (dé)sélectionner toutes les cases de toutes les activités * @param {HTMLInputElement} idCaseGlobale id de la case globale */ -function cocherDecocherTout(idCaseGlobale) -{ +function cocherDecocherTout(idCaseGlobale) { // itérer sur la liste des éléments détails : 1 par couple