From 24f489db3fe950150eeadac42192b180feb2262c Mon Sep 17 00:00:00 2001 From: engel <> Date: Sat, 28 Jan 2023 13:01:51 +0000 Subject: [PATCH 1/6] =?UTF-8?q?Ajustement=20feuille=20de=20style=20re?= =?UTF-8?q?=C3=A7us=20pour=20impression?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit FossilOrigin-Name: 458e766460451c3e96aa43e61551c73fc81bd59a2306490ea3200f467d99b305 --- templates/recu.skel | 57 ++++++++++++++++++++++++++++----------------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/templates/recu.skel b/templates/recu.skel index 941ce6a..18a5d65 100644 --- a/templates/recu.skel +++ b/templates/recu.skel @@ -17,53 +17,52 @@ } #entete { - position : relative; } #logo { - position : fixed; - max-width : 4cm; max-height : 4cm; } #titre { - position : fixed; - margin : 0 4.5cm 0 4.5cm; - top : 1cm; + margin : 0 2.5cm 0 2.5cm; text-align : center; font-size : 14pt; font-weight: bold; } #articles { - position : fixed; - margin : 0 4.5cm 0 4.5cm; /* idem titre */ - top : 6em; + margin : 0 2.5cm 0.5cm 2.5cm; text-align : center; } #numRecu { - position : relative; text-align : right; - top : 8em; - right: 1em; + margin-right: 1em; } + #beneficiaire, #donateur + { + } + #beneficiaire, #donateur, #versements, #final { - position : relative; - top : 9em; } + + #beneficiaire > h3 + { + } + #donateur > h3 + { + } + #versements { - position : relative; - top : 9em; border-top: 1px solid rgb(0, 0, 128); border-bottom: 1px solid rgb(0, 0, 128); } .rubrique { background-color : rgb(200, 200, 250); - padding : 2mm; + padding : 0 0 0 1mm; } .titre, .important { @@ -73,6 +72,10 @@ { font-weight: normal; } + #ville + { + margin-bottom: 0; + } #signature { display: block; @@ -81,6 +84,18 @@ margin: 0 auto; padding-bottom : 2mm; } + #final + { + page-break-after: auto; + } + /* + @media print + { + div#imprimer { + display:none; + } + } + */ @@ -97,8 +112,9 @@
Association « {{$config.nom_asso}} »
- {{$config.adresse_asso}}
- Objet : {{$objet_asso}}
{{$ville_asso}} le {{$date}}
+
{{$ville_asso}} le {{$date}}
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