fusion branche gestion signature

FossilOrigin-Name: 5d236649c2473c5d8deb1534b19c70712404a1c95b9bdb2c7e42fb5a81c1975a
This commit is contained in:
engel 2022-02-25 14:54:43 +00:00
commit 0554b6fda0
12 changed files with 176 additions and 85 deletions

View File

@ -1,30 +1,19 @@
# Plugin reçus fiscaux pour Garradin # 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 ). 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. 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 - 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 activité et tarif : 1, n ou tous
- reçu par tarif d'activité : 1, n ou tous
- reçu par personne : 1, n ou tous - reçu par personne : 1, n ou tous
- reçu par versement : 1, n ou tous - reçu par versement : 1, n ou tous
- distinguer les différents taux de réduction - 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. ## Configuration
- Objet (but) de l'association
## Inclus les bibliothèques suivantes : - Sélection des articles du CGI concernés par la réduction fiscale
- Enregistrement de la signature du responsable (image)
- Composer :
https://getcomposer.org/
Copyright (c) Nils Adermann, Jordi Boggiano,
Licence: MIT

View File

@ -1,15 +1,15 @@
{ {
"articlesCGI" : [ "articlesCGI" : [
{ {
"titre" : "Article 200", "titre" : "200",
"valeur" : 0 "valeur" : 0
}, },
{ {
"titre" : "Article 228 bis", "titre" : "228 bis",
"valeur" : 0 "valeur" : 0
}, },
{ {
"titre" : "Article 978", "titre" : "978",
"valeur" : 0 "valeur" : 0
} }
], ],

View File

@ -2,7 +2,7 @@ nom="Reçus fiscaux"
description="Génération de reçus fiscaux pour les dons des membres" description="Génération de reçus fiscaux pour les dons des membres"
auteur="jce" auteur="jce"
url="https://git.roflcopter.fr/lesanges/recus-fiscaux-garradin" url="https://git.roflcopter.fr/lesanges/recus-fiscaux-garradin"
version="0.1" version="0.4"
menu=1 menu=1
config=1 config=1
min_version="1.1" min_version="1.1"

View File

@ -1,20 +1,8 @@
<?php <?php
namespace Garradin; namespace Garradin;
//use Garradin\Entities\Files\File; use Garradin\Entities\Files\File;
//$db = DB::getInstance(); // « signature » par défaut à remplacer (voir configuration)
$path = __DIR__ . '/data/default_signature.png';
$default_signature_file = (new File)->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);
*/

View File

@ -9,6 +9,9 @@ class RecusHTML
private $nomAsso; private $nomAsso;
private $adresseAsso; private $adresseAsso;
private $objetAsso; private $objetAsso;
private $nomResponsable;
private $fonctionResponsable;
private $articlesCGI;
private $signature; private $signature;
/** /**
@ -17,18 +20,23 @@ class RecusHTML
function __construct($nomAsso, function __construct($nomAsso,
$adresseAsso, $adresseAsso,
$objetAsso, $objetAsso,
$nomResponsable,
$fonctionResponsable,
$articlesCGI,
$signature) $signature)
{ {
$this->nomAsso = $nomAsso; $this->nomAsso = $nomAsso;
$this->adresseAsso = $adresseAsso; $this->adresseAsso = $adresseAsso;
$this->objetAsso = $objetAsso; $this->objetAsso = $objetAsso;
$this->nomResponsable = $nomResponsable;
$this->fonctionResponsable = $fonctionResponsable;
$this->signature = $signature; $this->signature = $signature;
$this->articlesCGI = $articlesCGI;
$this->html = $this->entete(); $this->html = $this->entete();
} }
function get() function get()
{ {
//echo $this->html;
return $this->html; return $this->html;
} }
@ -69,24 +77,37 @@ FDD;
foreach ($lesMontants as $taux => $montant) foreach ($lesMontants as $taux => $montant)
{ {
$this->imprimer_montant("la somme de ", $this->imprimer_montant($montant,
$montant,
Utils::getLigneReduction($taux)); Utils::getLigneReduction($taux));
} }
echo "</ul>\n"; echo "</ul>\n";
$this->imprimer_description("Date des versements :", $this->imprimer_description("Date des versements :",
"année {$annee_recu}"); "année {$annee_recu}");
echo <<<FDD
<p>Le bénéficiaire certifie sur lhonneur que les dons et versements quil reçoit ouvrent droit à la réduction d'impôt prévue à larticle 200 du CGI</p>
FDD;
$this->imprimer_description("Forme du don : ",
"Autre");
$this->imprimer_description("Nature du don : ", $this->imprimer_description("Nature du don : ",
"Numéraire"); "Numéraire");
$this->imprimer_description("Mode de versement : ", $this->imprimer_description("Mode de versement : ",
"chèque et/ou virement"); "chèque et/ou virement");
// articles du CGI
$nbArticles = count($this->articlesCGI);
if ($nbArticles == 1)
{
echo "Le bénéficiaire certifie sur lhonneur que les dons et versements quil reçoit ouvrent droit à la réduction d'impôt prévue à larticle $this->articlesCGI[0] du CGI</p>\n";
}
else if ($nbArticles > 1)
{
echo "<p>Le bénéficiaire certifie sur lhonneur que les dons et versements quil 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</p>";
}
echo "</div>\n"; echo "</div>\n";
// cartouche final // cartouche final
@ -95,7 +116,8 @@ echo <<<FDD
<div class="cartouche" id="final"> <div class="cartouche" id="final">
<p>Rennes le {$date}</p> <p>Rennes le {$date}</p>
<img id="signature" src="$this->signature" /> <img id="signature" src="$this->signature" />
<p id="fonction">Président</p> <p id="nom">$this->nomResponsable</p>
<p id="fonction">$this->fonctionResponsable</p>
</div> </div>
</body> </body>
</html> </html>
@ -112,13 +134,13 @@ FDD;
FDD; FDD;
} }
// imprimer le montant de la réduction et un libellé // imprimer le montant du versement et un libellé
function imprimer_montant($texte, $montant, $libelle = "") function imprimer_montant($montant, $libelle = "")
{ {
$valeur = number_format($montant, 2, ',', ''); $valeur = number_format($montant, 2, ',', '');
echo "<li>{$texte} {$valeur} euros"; echo "<li>la somme de <b>{$valeur} euros</b>";
if ($libelle != "") { if ($libelle != "") {
echo " : {$libelle}"; echo " ({$libelle})";
} }
echo "</li>\n"; echo "</li>\n";
} }
@ -143,7 +165,7 @@ echo <<<FDD
<span> 11580*4</span> <span> 11580*4</span>
</div> </div>
<p id="titre">Reçu au titre des dons à certains organismes d'intérêt général</p> <p id="titre">Reçu au titre des dons à certains organismes d'intérêt général</p>
<p id="articles">Article 200, 238 bis et 885-0 V bis A du code général des impôts</p> <p id="articles">Articles 200, 238 bis et 978 du code général des impôts</p>
FDD; FDD;
return ob_get_clean(); return ob_get_clean();

View File

@ -141,11 +141,14 @@ class Utils
{ {
foreach ($lesTaux as $elem) foreach ($lesTaux as $elem)
{ {
/*
$ligne = "taux " . $elem->taux . ", ligne " . $elem->ligne; $ligne = "taux " . $elem->taux . ", ligne " . $elem->ligne;
if ($elem->remarque != "") { if ($elem->remarque != "") {
$ligne .= ", " . $elem->remarque; $ligne .= ", " . $elem->remarque;
} }
$lignes[$elem->taux] = $ligne; $lignes[$elem->taux] = $ligne;
*/
$lignes[$elem->taux] = $elem->remarque;
} }
return $lignes; return $lignes;
} }

View File

@ -1,8 +1,17 @@
/* organisation spatiale */ /* organisation spatiale */
@page
{
size: A4 portrait;
margin: 1cm;
}
body body
{ {
width : 21cm; font-family: Serif;
padding : 1cm 1cm; font-size: 11pt;
background-color: white;
display: grid; display: grid;
grid-template-areas: grid-template-areas:
'entete' 'entete'
@ -15,7 +24,6 @@ body
#entete #entete
{ {
grid-area: entete; grid-area: entete;
width: 100%;
} }
#logoCerfa #logoCerfa
@ -25,7 +33,7 @@ body
background-color: rgb(0, 0, 128); background-color: rgb(0, 0, 128);
border-radius : 50%; border-radius : 50%;
text-align : center; text-align : center;
margin : 0.5em; margin : 2mm;
} }
.centre .centre
@ -48,55 +56,51 @@ body
{ {
margin : 0 4cm 0 4cm; margin : 0 4cm 0 4cm;
text-align : center; text-align : center;
font-size : 140%; font-size : 14pt;
font-weight: bold; font-weight: bold;
} }
#articles #articles
{ {
margin : 0 4cm 0 4cm; /* idem titre */ margin : 0 4cm 0 4cm; /* idem titre */
text-align : center;
} }
#numRecu #numRecu
{ {
text-align : right; text-align : right;
/* display : inline;*/
} }
#beneficiaire #beneficiaire
{ {
grid-area: beneficiaire; grid-area: beneficiaire;
width: 100%;
} }
#donateur #donateur
{ {
grid-area: donateur; grid-area: donateur;
width: 100%;
} }
#versements #versements
{ {
grid-area: versements; grid-area: versements;
width: 100%;
} }
#final #final
{ {
grid-area: signature; grid-area: signature;
width: 100%;
} }
.rubrique .rubrique
{ {
background-color : rgb(200, 200, 250); background-color : rgb(200, 200, 250);
padding : 0.5em; padding : 2mm;
} }
.cartouche .cartouche
{ {
margin : 0.5em auto; margin : 2mm auto;
padding : 0 0.5em; padding : 0 2mm;
border : 1px solid rgb(0, 0, 128); border : 1px solid rgb(0, 0, 128);
border-radius : 8px; border-radius : 8px;
} }
@ -111,11 +115,10 @@ body
display: block; display: block;
width : 7cm; width : 7cm;
margin: 0 auto; margin: 0 auto;
padding-bottom : 0.5em; padding-bottom : 2mm;
} }
#fonction #fonction, #nom
{ {
text-align : center; text-align : center;
padding-bottom : 2em;
} }

View File

@ -11,20 +11,24 @@
{form_errors} {form_errors}
<form method="post" action="{$self_url}"> <form method="post" action="{$self_url}" enctype="multipart/form-data">
<fieldset> <fieldset>
{*
<legend>Objet (but) de l'association</legend> <legend>Objet (but) de l'association</legend>
<dl> *}
<dt><label>Objet</label><b title="Champ obligatoire">obligatoire</b></dt> <dl class="config">
{input type="text" name="objet_asso" source=$plugin.config label="" maxlength=300} <dt><label>Objet (but) de l'association</label> <b title="Champ obligatoire">(obligatoire)</b></dt>
{input type="text" name="objet_asso" source=$plugin.config label="" required="required" maxlength=300}
</dl> </dl>
{*
</fieldset> </fieldset>
<fieldset> <fieldset>
<legend>Droit à la réduction d'impôt</legend> <legend>Droit à la réduction d'impôt</legend>
<dl> *}
<dt><label>Articles concernés par l'association : </label> <dl class="config">
<b title="Champ obligatoire">obligatoire</b> <dt><label>Articles du code général des impôts concernés par l'association : </label>
<b title="Champ obligatoire">(obligatoire)</b>
</dt> </dt>
{foreach from=$plugin_config->articlesCGI key="key" item="article"} {foreach from=$plugin_config->articlesCGI key="key" item="article"}
{* {*
@ -32,10 +36,39 @@
{input type="checkbox" name="articlesCGI[]" value=$key label=$article.titre} {input type="checkbox" name="articlesCGI[]" value=$key label=$article.titre}
*} *}
<input type="checkbox" name="articlesCGI[]" value="{$key}" <input type="checkbox" name="articlesCGI[]" value="{$key}"
{if $article.valeur == 1}checked{/if}><label>{$article.titre}</label> {if $article.valeur == 1}checked{/if}><label>Article {$article.titre}</label>
{/foreach} {/foreach}
</dl> </dl>
{*
</fieldset> </fieldset>
<fieldset>
<legend>Nom, fonction et signature du responsable</legend>
*}
<dl class="config">
<dt><label>Nom du responsable</label> <b title="Champ obligatoire">(obligatoire)</b></dt>
{input type="text" name="nom_responsable" source=$plugin.config label="" required="required" maxlength=50}
</dl>
<dl class="config">
<dt><label>Fonction du responsable</label> <b title="Champ obligatoire">(obligatoire)</b></dt>
{input type="text" name="fonction_responsable" source=$plugin.config label="" required="required" maxlength=50}
</dl>
<dl class="config">
<dt><label>Signature du responsable</label> <b title="Champ obligatoire">(obligatoire)</b></dt>
<p>L'image de la signature doit être d'une taille « raisonnable » et avoir un fond transparent</p>
{if $plugin_config.signature != ''}
<img id="signature" src="/{$plugin_config.signature}" />
{else}
<img id="signature" src="{$default_signature}" />
{/if}
{linkbutton shape="upload" label="Changer de signature" target="_dialog" href="upload.php?p=%s"|args:$path}
</dl>
</fieldset>
<h3 class="warning">N'oubliez pas d'enregistrer, sinon les modifications ne seront pas prises en compte !</h3>
<p class="submit"> <p class="submit">
{csrf_field key="recusfiscaux_config"} {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"}

View File

@ -1,14 +1,23 @@
<?php <?php
namespace Garradin; namespace Garradin;
use Garradin\Files\Files;
use Garradin\Entities\Files\File;
$session->requireAccess($session::SECTION_CONFIG, $session::ACCESS_ADMIN); $session->requireAccess($session::SECTION_CONFIG, $session::ACCESS_ADMIN);
$art_sel=f('articlesCGI') ? : []; $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')) if (f('save') && $form->check('recusfiscaux_config'))
{ {
try { try {
// objet de l'association
$plugin->setConfig('objet_asso', trim(f('objet_asso'))); $plugin->setConfig('objet_asso', trim(f('objet_asso')));
// articles du CGI
$confArticles = $plugin->getConfig('articlesCGI'); $confArticles = $plugin->getConfig('articlesCGI');
// effacer l'ancienne configuration // effacer l'ancienne configuration
for ($i = 0; $i < count($confArticles); ++$i) { for ($i = 0; $i < count($confArticles); ++$i) {
@ -19,6 +28,14 @@ if (f('save') && $form->check('recusfiscaux_config'))
$confArticles[$article]->valeur = 1; $confArticles[$article]->valeur = 1;
} }
$plugin->setConfig("articlesCGI", $confArticles); $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'); \Garradin\Utils::redirect(PLUGIN_URL . 'config.php?ok');
} }
catch (UserException $e) catch (UserException $e)
@ -28,7 +45,8 @@ if (f('save') && $form->check('recusfiscaux_config'))
} }
$tpl->assign('ok', qg('ok') !== null); $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_config', $plugin->getConfig());
$tpl->assign('plugin_css', ['style.css']); $tpl->assign('plugin_css', ['style.css']);
$tpl->display(PLUGIN_ROOT . '/templates/config.tpl'); $tpl->display(PLUGIN_ROOT . '/templates/config.tpl');

View File

@ -21,9 +21,20 @@ $totalPersonnes = cumulerVersements($versementsSelectionnes);
$nomAsso = Utils::getNomAsso(); $nomAsso = Utils::getNomAsso();
$adresseAsso = Utils::getAdresseAsso(); $adresseAsso = Utils::getAdresseAsso();
$signature = PLUGIN_ROOT . "/data/default_signature.png"; $signature =
$listeFichiers = []; (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) foreach ($totalPersonnes as $idPersonne => $personne)
{ {
// générer un fichier par reçu // générer un fichier par reçu
@ -31,6 +42,9 @@ foreach ($totalPersonnes as $idPersonne => $personne)
$nomAsso, $nomAsso,
$adresseAsso, $adresseAsso,
$plugin->getConfig('objet_asso'), $plugin->getConfig('objet_asso'),
$plugin->getConfig('nom_responsable'),
$plugin->getConfig('fonction_responsable'),
$articlesCGI,
$signature $signature
); );
// extraire les montants des versements // extraire les montants des versements

View File

@ -19,9 +19,20 @@ foreach ($lesLignes as $ligne) {
$nomAsso = Utils::getNomAsso(); $nomAsso = Utils::getNomAsso();
$adresseAsso = Utils::getAdresseAsso(); $adresseAsso = Utils::getAdresseAsso();
$signature = PLUGIN_ROOT . "/data/default_signature.png"; $signature =
$listeFichiers = []; (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) foreach ($versementsSelectionnes as $ligne)
{ {
// générer un fichier par reçu // générer un fichier par reçu
@ -29,6 +40,9 @@ foreach ($versementsSelectionnes as $ligne)
$nomAsso, $nomAsso,
$adresseAsso, $adresseAsso,
$plugin->getConfig('objet_asso'), $plugin->getConfig('objet_asso'),
$plugin->getConfig('nom_responsable'),
$plugin->getConfig('fonction_responsable'),
$articlesCGI,
$signature $signature
); );
@ -61,4 +75,3 @@ $fichierZip = Utils::makeArchive(
$_SESSION['annee_recu'], $_SESSION['annee_recu'],
PLUGIN_ROOT . "/zip" PLUGIN_ROOT . "/zip"
); );

View File

@ -30,3 +30,11 @@ h3.personne {
input[type="text"] { input[type="text"] {
width: 50em; width: 50em;
} }
#signature
{
width:300px;
}
dl.config
{
padding : 1ex 0;
}