fusion branche gestion signature
FossilOrigin-Name: 5d236649c2473c5d8deb1534b19c70712404a1c95b9bdb2c7e42fb5a81c1975a
This commit is contained in:
commit
0554b6fda0
27
README.md
27
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)
|
||||
|
|
|
@ -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
|
||||
}
|
||||
],
|
||||
|
|
|
@ -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"
|
||||
|
|
20
install.php
20
install.php
|
@ -1,20 +1,8 @@
|
|||
<?php
|
||||
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);
|
||||
*/
|
||||
|
|
|
@ -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 "</ul>\n";
|
||||
|
||||
$this->imprimer_description("Date des versements :",
|
||||
"année {$annee_recu}");
|
||||
echo <<<FDD
|
||||
<p>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</p>
|
||||
|
||||
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</p>\n";
|
||||
}
|
||||
else if ($nbArticles > 1)
|
||||
{
|
||||
echo "<p>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</p>";
|
||||
}
|
||||
echo "</div>\n";
|
||||
|
||||
// cartouche final
|
||||
|
@ -95,7 +116,8 @@ echo <<<FDD
|
|||
<div class="cartouche" id="final">
|
||||
<p>Rennes le {$date}</p>
|
||||
<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>
|
||||
</body>
|
||||
</html>
|
||||
|
@ -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 "<li>{$texte} {$valeur} euros";
|
||||
echo "<li>la somme de <b>{$valeur} euros</b>";
|
||||
if ($libelle != "") {
|
||||
echo " : {$libelle}";
|
||||
echo " ({$libelle})";
|
||||
}
|
||||
echo "</li>\n";
|
||||
}
|
||||
|
@ -143,7 +165,7 @@ echo <<<FDD
|
|||
<span>N° 11580*4</span>
|
||||
</div>
|
||||
<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;
|
||||
return ob_get_clean();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
35
lib/pdf.css
35
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;
|
||||
}
|
||||
|
|
|
@ -11,20 +11,24 @@
|
|||
|
||||
{form_errors}
|
||||
|
||||
<form method="post" action="{$self_url}">
|
||||
<form method="post" action="{$self_url}" enctype="multipart/form-data">
|
||||
<fieldset>
|
||||
{*
|
||||
<legend>Objet (but) de l'association</legend>
|
||||
<dl>
|
||||
<dt><label>Objet</label><b title="Champ obligatoire">obligatoire</b></dt>
|
||||
{input type="text" name="objet_asso" source=$plugin.config label="" maxlength=300}
|
||||
*}
|
||||
<dl class="config">
|
||||
<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>
|
||||
{*
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<legend>Droit à la réduction d'impôt</legend>
|
||||
<dl>
|
||||
<dt><label>Articles concernés par l'association : </label>
|
||||
<b title="Champ obligatoire">obligatoire</b>
|
||||
*}
|
||||
<dl class="config">
|
||||
<dt><label>Articles du code général des impôts concernés par l'association : </label>
|
||||
<b title="Champ obligatoire">(obligatoire)</b>
|
||||
</dt>
|
||||
{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}"
|
||||
{if $article.valeur == 1}checked{/if}><label>{$article.titre}</label>
|
||||
{if $article.valeur == 1}checked{/if}><label>Article {$article.titre}</label>
|
||||
{/foreach}
|
||||
</dl>
|
||||
{*
|
||||
</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">
|
||||
{csrf_field key="recusfiscaux_config"}
|
||||
{button type="submit" name="save" label="Enregistrer" shape="right" class="main"}
|
||||
|
|
|
@ -1,14 +1,23 @@
|
|||
<?php
|
||||
|
||||
namespace Garradin;
|
||||
use Garradin\Files\Files;
|
||||
use Garradin\Entities\Files\File;
|
||||
|
||||
$session->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');
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
);
|
||||
|
||||
|
|
|
@ -30,3 +30,11 @@ h3.personne {
|
|||
input[type="text"] {
|
||||
width: 50em;
|
||||
}
|
||||
#signature
|
||||
{
|
||||
width:300px;
|
||||
}
|
||||
dl.config
|
||||
{
|
||||
padding : 1ex 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue