diff --git a/README.md b/README.md index 8bcd025..c2570fb 100644 --- a/README.md +++ b/README.md @@ -1,30 +1,19 @@ # Plugin reçus fiscaux pour Garradin Plugin de reçus fiscaux pour le logiciel de gestion d'association Garradin ( https://garradin.eu/ - https://fossil.kd2.org/garradin ). -Source : https:// +Source : https://git.roflcopter.fr/lesanges/recus-fiscaux-garradin -## Installation: +## Installation Vous pouvez télécharger l'archive .tar.gz depuis la page des [releases](https://), et la placer directement dans le dossier plugins de Garradin. -## Fonctionnalités : +## Fonctionnalités - Créer des reçus fiscaux pour des dons et génération du cerfa correspondant - - reçu par type d'activité : 1, n ou tous - - reçu par tarif d'activité : 1, n ou tous + - reçu par activité et tarif : 1, n ou tous - reçu par personne : 1, n ou tous - reçu par versement : 1, n ou tous - distinguer les différents taux de réduction -- Créer des reçus sur des cotisations -- **Configuration** : - - Possibilité d'ajouter un numéro RNA et SIRET de l'association si elle en possède (apparait alors sur les documents) - - Modification du pied de page des documents (notament pour y inscrire des mentions légales) - - Informations relatives au cerfa pour les reçus fiscaux - - Image qui set de signature sur le cerfa -Le plugin nécessite l'extension PHP mbstring. - -## Inclus les bibliothèques suivantes : - -- Composer : - https://getcomposer.org/ - Copyright (c) Nils Adermann, Jordi Boggiano, - Licence: MIT +## Configuration +- Objet (but) de l'association +- Sélection des articles du CGI concernés par la réduction fiscale +- Enregistrement de la signature du responsable (image) diff --git a/config.json b/config.json index 59b6ce7..995e5df 100644 --- a/config.json +++ b/config.json @@ -1,15 +1,15 @@ { "articlesCGI" : [ { - "titre" : "Article 200", + "titre" : "200", "valeur" : 0 }, { - "titre" : "Article 228 bis", + "titre" : "228 bis", "valeur" : 0 }, { - "titre" : "Article 978", + "titre" : "978", "valeur" : 0 } ], diff --git a/garradin_plugin.ini b/garradin_plugin.ini index 1660303..a32c0bf 100644 --- a/garradin_plugin.ini +++ b/garradin_plugin.ini @@ -2,7 +2,7 @@ nom="Reçus fiscaux" description="Génération de reçus fiscaux pour les dons des membres" auteur="jce" url="https://git.roflcopter.fr/lesanges/recus-fiscaux-garradin" -version="0.1" +version="0.4" menu=1 config=1 min_version="1.1" diff --git a/install.php b/install.php index 3405396..17063aa 100644 --- a/install.php +++ b/install.php @@ -1,20 +1,8 @@ createAndStore('skel/plugin/recusFiscaux','default_signature.png', $path, null); -//$db->import(dirname(__FILE__) . "/data/schema.sql"); - -/* -$plugin->setConfig('footer', "[EXEMPLE]\n". - "Association exonérée des impôts commerciaux\n". - "En cas de retard de paiement, indemnité forfaitaire légale pour frais de recouvrement : 40,00 €\n". - "[Coordonnées bancaires]\n". - "Association enregistrée en préfecture de XXX au numéro YYY" - ); -$plugin->setConfig('validate_cp', true); - -$path = __DIR__.'/data/default_signature.png'; -$png = (new File)->createAndStore('skel/plugin/recusDons','signature.png', $path, null); -*/ diff --git a/lib/RecusHTML.php b/lib/RecusHTML.php index b5db027..d00e780 100644 --- a/lib/RecusHTML.php +++ b/lib/RecusHTML.php @@ -9,6 +9,9 @@ class RecusHTML private $nomAsso; private $adresseAsso; private $objetAsso; + private $nomResponsable; + private $fonctionResponsable; + private $articlesCGI; private $signature; /** @@ -17,18 +20,23 @@ class RecusHTML function __construct($nomAsso, $adresseAsso, $objetAsso, + $nomResponsable, + $fonctionResponsable, + $articlesCGI, $signature) { $this->nomAsso = $nomAsso; $this->adresseAsso = $adresseAsso; $this->objetAsso = $objetAsso; + $this->nomResponsable = $nomResponsable; + $this->fonctionResponsable = $fonctionResponsable; $this->signature = $signature; + $this->articlesCGI = $articlesCGI; $this->html = $this->entete(); } function get() { - //echo $this->html; return $this->html; } @@ -69,24 +77,37 @@ FDD; foreach ($lesMontants as $taux => $montant) { - $this->imprimer_montant("la somme de ", - $montant, + $this->imprimer_montant($montant, Utils::getLigneReduction($taux)); } echo "\n"; - $this->imprimer_description("Date des versements :", "année {$annee_recu}"); -echo <<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 à l’article 200 du CGI

- -FDD; - $this->imprimer_description("Forme du don : ", - "Autre"); $this->imprimer_description("Nature du don : ", "Numéraire"); $this->imprimer_description("Mode de versement : ", "chèque et/ou virement"); + + // articles du CGI + $nbArticles = count($this->articlesCGI); + if ($nbArticles == 1) + { + echo "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 à l’article $this->articlesCGI[0] du CGI

\n"; + } + else if ($nbArticles > 1) + { + echo "

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 aux articles "; + for ($i = 0; $i < $nbArticles; ++$i) { + printf("%s", $this->articlesCGI[$i]); + if ($i < $nbArticles - 2) { + echo ", "; + } + else if ($i == $nbArticles - 2) { + echo " et "; + } + } + echo " du code général des impôts

"; + } echo "\n"; // cartouche final @@ -95,7 +116,8 @@ echo <<

Rennes le {$date}

-

Président

+

$this->nomResponsable

+

$this->fonctionResponsable

@@ -112,13 +134,13 @@ FDD; FDD; } - // imprimer le montant de la réduction et un libellé - function imprimer_montant($texte, $montant, $libelle = "") + // imprimer le montant du versement et un libellé + function imprimer_montant($montant, $libelle = "") { $valeur = number_format($montant, 2, ',', ''); - echo "
  • {$texte} {$valeur} euros"; + echo "
  • la somme de {$valeur} euros"; if ($libelle != "") { - echo " : {$libelle}"; + echo " ({$libelle})"; } echo "
  • \n"; } @@ -143,7 +165,7 @@ echo <<N° 11580*4

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

    -

    Article 200, 238 bis et 885-0 V bis A du code général des impôts

    +

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

    FDD; return ob_get_clean(); diff --git a/lib/Utils.php b/lib/Utils.php index 8e7c9a8..14e414d 100644 --- a/lib/Utils.php +++ b/lib/Utils.php @@ -141,11 +141,14 @@ class Utils { foreach ($lesTaux as $elem) { + /* $ligne = "taux " . $elem->taux . ", ligne " . $elem->ligne; if ($elem->remarque != "") { $ligne .= ", " . $elem->remarque; } $lignes[$elem->taux] = $ligne; + */ + $lignes[$elem->taux] = $elem->remarque; } return $lignes; } diff --git a/lib/pdf.css b/lib/pdf.css index a3a92ed..f1f7603 100644 --- a/lib/pdf.css +++ b/lib/pdf.css @@ -1,8 +1,17 @@ /* organisation spatiale */ + +@page +{ + size: A4 portrait; + margin: 1cm; +} + + body { - width : 21cm; - padding : 1cm 1cm; + font-family: Serif; + font-size: 11pt; + background-color: white; display: grid; grid-template-areas: 'entete' @@ -15,7 +24,6 @@ body #entete { grid-area: entete; - width: 100%; } #logoCerfa @@ -25,7 +33,7 @@ body background-color: rgb(0, 0, 128); border-radius : 50%; text-align : center; - margin : 0.5em; + margin : 2mm; } .centre @@ -48,55 +56,51 @@ body { margin : 0 4cm 0 4cm; text-align : center; - font-size : 140%; + font-size : 14pt; font-weight: bold; } #articles { margin : 0 4cm 0 4cm; /* idem titre */ + text-align : center; } #numRecu { text-align : right; -/* display : inline;*/ } #beneficiaire { grid-area: beneficiaire; - width: 100%; } #donateur { grid-area: donateur; - width: 100%; } #versements { grid-area: versements; - width: 100%; } #final { grid-area: signature; - width: 100%; } .rubrique { background-color : rgb(200, 200, 250); - padding : 0.5em; + padding : 2mm; } .cartouche { - margin : 0.5em auto; - padding : 0 0.5em; + margin : 2mm auto; + padding : 0 2mm; border : 1px solid rgb(0, 0, 128); border-radius : 8px; } @@ -111,11 +115,10 @@ body display: block; width : 7cm; margin: 0 auto; - padding-bottom : 0.5em; + padding-bottom : 2mm; } -#fonction +#fonction, #nom { text-align : center; - padding-bottom : 2em; } diff --git a/templates/config.tpl b/templates/config.tpl index 499b494..55796c6 100644 --- a/templates/config.tpl +++ b/templates/config.tpl @@ -11,20 +11,24 @@ {form_errors} -
    +
    +{* Objet (but) de l'association -
    -
    obligatoire
    - {input type="text" name="objet_asso" source=$plugin.config label="" maxlength=300} +*} +
    +
    (obligatoire)
    + {input type="text" name="objet_asso" source=$plugin.config label="" required="required" maxlength=300}
    +{*
    Droit à la réduction d'impôt -
    -
    - obligatoire +*} +
    +
    + (obligatoire)
    {foreach from=$plugin_config->articlesCGI key="key" item="article"} {* @@ -32,10 +36,39 @@ {input type="checkbox" name="articlesCGI[]" value=$key label=$article.titre} *} + {if $article.valeur == 1}checked{/if}> {/foreach}
    +{*
    + +
    + Nom, fonction et signature du responsable +*} +
    +
    (obligatoire)
    + {input type="text" name="nom_responsable" source=$plugin.config label="" required="required" maxlength=50} +
    + +
    +
    (obligatoire)
    + {input type="text" name="fonction_responsable" source=$plugin.config label="" required="required" maxlength=50} +
    + +
    +
    (obligatoire)
    +

    L'image de la signature doit être d'une taille « raisonnable » et avoir un fond transparent

    + {if $plugin_config.signature != ''} + + {else} + + {/if} + {linkbutton shape="upload" label="Changer de signature" target="_dialog" href="upload.php?p=%s"|args:$path} +
    +
    + +

    N'oubliez pas d'enregistrer, sinon les modifications ne seront pas prises en compte !

    +

    {csrf_field key="recusfiscaux_config"} {button type="submit" name="save" label="Enregistrer" shape="right" class="main"} diff --git a/www/admin/config.php b/www/admin/config.php index 5fdd667..c7aca5a 100644 --- a/www/admin/config.php +++ b/www/admin/config.php @@ -1,14 +1,23 @@ requireAccess($session::SECTION_CONFIG, $session::ACCESS_ADMIN); $art_sel=f('articlesCGI') ? : []; +$path = qg('path') ?: File::CONTEXT_CONFIG; +$context = Files::getContext($path); +$context_ref = Files::getContextRef($path); + if (f('save') && $form->check('recusfiscaux_config')) { try { + // objet de l'association $plugin->setConfig('objet_asso', trim(f('objet_asso'))); + + // articles du CGI $confArticles = $plugin->getConfig('articlesCGI'); // effacer l'ancienne configuration for ($i = 0; $i < count($confArticles); ++$i) { @@ -19,6 +28,14 @@ if (f('save') && $form->check('recusfiscaux_config')) $confArticles[$article]->valeur = 1; } $plugin->setConfig("articlesCGI", $confArticles); + + // nom, fonction et signature du responsable + $plugin->setConfig('nom_responsable', trim(f('nom_responsable'))); + $plugin->setConfig('fonction_responsable', trim(f('fonction_responsable'))); + if (isset($_SESSION['sig_file'])) { + $plugin->setConfig('signature', $_SESSION['sig_file'][0]->path); + } + \Garradin\Utils::redirect(PLUGIN_URL . 'config.php?ok'); } catch (UserException $e) @@ -28,7 +45,8 @@ if (f('save') && $form->check('recusfiscaux_config')) } $tpl->assign('ok', qg('ok') !== null); +$tpl->assign('path', $path); +$tpl->assign('default_signature', \Garradin\WWW_URL . "plugin/recusFiscaux/default_signature.png"); $tpl->assign('plugin_config', $plugin->getConfig()); $tpl->assign('plugin_css', ['style.css']); - $tpl->display(PLUGIN_ROOT . '/templates/config.tpl'); diff --git a/www/admin/generer_activites.php b/www/admin/generer_activites.php index a6278d6..8678893 100644 --- a/www/admin/generer_activites.php +++ b/www/admin/generer_activites.php @@ -21,9 +21,20 @@ $totalPersonnes = cumulerVersements($versementsSelectionnes); $nomAsso = Utils::getNomAsso(); $adresseAsso = Utils::getAdresseAsso(); -$signature = PLUGIN_ROOT . "/data/default_signature.png"; -$listeFichiers = []; +$signature = + (null !== $plugin->getConfig('signature')) ? + \Garradin\Files\Files::get($plugin->getConfig('signature'))->fullpath() : + \Garradin\WWW_URL . "plugin/recusFiscaux/default_signature.png"; +// articles du CGI +$articlesCGI = array(); +foreach ($plugin->getConfig('articlesCGI') as $article) +{ + if ($article->valeur == 1) { + $articlesCGI[] = $article->titre; + } +} +$listeFichiers = array(); // fichiers pdf générés foreach ($totalPersonnes as $idPersonne => $personne) { // générer un fichier par reçu @@ -31,6 +42,9 @@ foreach ($totalPersonnes as $idPersonne => $personne) $nomAsso, $adresseAsso, $plugin->getConfig('objet_asso'), + $plugin->getConfig('nom_responsable'), + $plugin->getConfig('fonction_responsable'), + $articlesCGI, $signature ); // extraire les montants des versements diff --git a/www/admin/generer_personnes.php b/www/admin/generer_personnes.php index 15de5f6..1866bdc 100644 --- a/www/admin/generer_personnes.php +++ b/www/admin/generer_personnes.php @@ -19,9 +19,20 @@ foreach ($lesLignes as $ligne) { $nomAsso = Utils::getNomAsso(); $adresseAsso = Utils::getAdresseAsso(); -$signature = PLUGIN_ROOT . "/data/default_signature.png"; -$listeFichiers = []; +$signature = + (null !== $plugin->getConfig('signature')) ? + \Garradin\Files\Files::get($plugin->getConfig('signature'))->fullpath() : + \Garradin\WWW_URL . "plugin/recusFiscaux/default_signature.png"; +// articles du CGI +$articlesCGI = array(); +foreach ($plugin->getConfig('articlesCGI') as $article) +{ + if ($article->valeur == 1) { + $articlesCGI[] = $article->titre; + } +} +$listeFichiers = array(); // fichiers pdf générés foreach ($versementsSelectionnes as $ligne) { // générer un fichier par reçu @@ -29,6 +40,9 @@ foreach ($versementsSelectionnes as $ligne) $nomAsso, $adresseAsso, $plugin->getConfig('objet_asso'), + $plugin->getConfig('nom_responsable'), + $plugin->getConfig('fonction_responsable'), + $articlesCGI, $signature ); @@ -61,4 +75,3 @@ $fichierZip = Utils::makeArchive( $_SESSION['annee_recu'], PLUGIN_ROOT . "/zip" ); - diff --git a/www/admin/style.css b/www/admin/style.css index 605b741..b3a08bc 100644 --- a/www/admin/style.css +++ b/www/admin/style.css @@ -30,3 +30,11 @@ h3.personne { input[type="text"] { width: 50em; } +#signature +{ + width:300px; +} +dl.config +{ + padding : 1ex 0; +}