diff --git a/admin/_facture_common.php b/admin/_facture_common.php
index 0d53054..10b10a4 100644
--- a/admin/_facture_common.php
+++ b/admin/_facture_common.php
@@ -43,10 +43,14 @@ $db = DB::getInstance();
$step = false;
$radio = $liste = $designations = $prix = [];
+$fields = $facture->recu_fields;
+
$moyens_paiement = $facture->listMoyensPaiement(true);
$tpl->assign('moyens_paiement', $moyens_paiement);
$tpl->assign('moyen_paiement', f('moyen_paiement') ?: 'ES');
+$tpl->assign('moyen_paiement_cerfa', f('moyen_paiement_cerfa') ?: 'ES');
+
$tpl->assign('formes_don', array('1' => 'Acte authentique',
'2' => 'Acte sous seing privé',
'3' => 'Don manuel',
@@ -54,6 +58,7 @@ $tpl->assign('formes_don', array('1' => 'Acte authentique',
$tpl->assign('natures_don', array('1' => 'Numéraire',
'2' => 'Chèque',
'3' => 'Virement, CB; ...'));
+$tpl->assign('textes_don', $facture->listTextesCerfa());
if ( !$target ) {
f(['id' => 'required|numeric']);
@@ -102,6 +107,16 @@ $form->runIf(f('save') && !$form->hasErrors(),
$data['total'] = $data['toto'];
unset($data['toto']);
}
+ elseif ( f('type') == CERFA )
+ {
+ $data['moyen_paiement'] = f('moyen_paiement_cerfa');
+ $data['contenu'] = [
+ 'forme' => f('forme_don'),
+ 'nature' => f('nature_don'),
+ 'texte' => f('texte_don')];
+ $data['total'] = Utils::moneyToInteger(f('total'));
+ unset($data['toto']);
+ }
if (f('base_receveur') == 'client')
{
$data['receveur_membre'] = 0;
@@ -125,9 +140,62 @@ $form->runIf(f('save') && !$form->hasErrors(),
}, $csrf_key);
+$form->runIf(f('select_cotis') && !$form->hasErrors(),
+ function () use ($step)
+ {
+ $step = true;
+ }, 'add_cotis_1');
+
+$form->runIf(f('add_cotis') && !$form->hasErrors(),
+ function () use ($radio, $fields, $facture, $form)
+ {
+ $radio['type'] = f('cotisation');
+ try
+ {
+ $num = (int) str_replace('cotis_', '', $radio['type']);
+ foreach($fields as $field)
+ {
+ $cotis[$field] = f($field.'_'.$num);
+ }
+
+ $r = $facture->getCotis(f('membre_cotis'), $cotis['id']);
+ $r = $r[0];
+
+ $data = [
+ 'type_facture' => COTIS,
+ 'numero' => f('numero_facture'),
+ 'receveur_membre' => 1,
+ 'receveur_id' => f('membre_cotis'),
+ 'date_emission' => f('date_emission'),
+ 'moyen_paiement' => 'AU',
+ 'total' => $r->paid_amount ?? $r->amount,
+ 'contenu' => ['id' => $cotis['id'],
+ 'intitule' => $cotis['label'],
+ 'souscription' => $cotis['date'],
+ 'expiration' => $cotis['expiry'] ]
+ ];
+
+ }
+ catch (UserException $e)
+ {
+ $form->addError($e->getMessage());
+ }
+ }, 'add_cotis_2');
+
if (! $form->hasErrors())
{
- if (count($data) > 0)
+ if ($step)
+ {
+ try
+ {
+ $liste = $facture->getCotis((int)f('membre_cotis'));
+ }
+ catch (UserException $e)
+ {
+ $form->addError($e->getMessage());
+ }
+ }
+ elseif (count($data) > 0)
{
if ($target)
{
@@ -159,13 +227,19 @@ if ($target)
$doc['base_receveur'] = $f->receveur_membre ? 'membre' : 'client';
$doc['client'] = $f->receveur_id;
$doc['membre'] = $f->receveur_id;
+
+ if ( $f->type_facture == CERFA ) {
+ $doc['forme_don'] = $f->contenu['forme'];
+ $doc['nature_don'] = $f->contenu['nature'];
+ $doc['texte_don'] = $f->contenu['texte'];
+ }
}
// Type du document:
$type = qg('t') ? (int) qg('t') : null;
// Si le type est défini dans l'URL
- if (in_array($type, [DEVIS, FACT], true))
+ if (in_array($type, [DEVIS, FACT, CERFA, COTIS], true))
{
$radio['type'] = $type;
} // ... s'il a été rempli dans le formulaire envoyé
@@ -194,6 +268,14 @@ else
$doc['date_emission'] = f('date_emission') ?: $f->date_emission;
$doc['date_echeance'] = f('date_echeance')?: $f->date_echeance; // Smarty m'a saoulé pour utiliser form_field|date_fr:---
+ /* modif DD -- CERFA -------------------------------------- */
+ if ( $f->type_facture == CERFA ) {
+ $doc['total'] = $f->total;
+ $doc['forme_don'] = $f->contenu['forme'];
+ $doc['nature_don'] = $f->contenu['nature'];
+ $doc['texte_don'] = $f->contenu['texte'];
+ }
+
$radio['type'] = f('type')??$doc['type'];
}
$tpl->assign('types_details', $facture->types);
diff --git a/admin/_inc.php b/admin/_inc.php
index da3cd9d..582e462 100644
--- a/admin/_inc.php
+++ b/admin/_inc.php
@@ -7,6 +7,8 @@ use Paheko\Utils;
define('DEVIS', 0);
define('FACT', 1);
+define('CERFA', 2);
+define('COTIS', 3);
const PATTERNS_LIST = [
null => 'Aucun, le numéro sera à spécifier manuellement pour chaque document',
@@ -46,11 +48,11 @@ $tpl->register_function('money_fac', function (array $params)
if (!isset($user)) {
$user = false;
- }
+ }
if (!isset($name))
{
- $name = 'prix[]';
+ $name = 'prix[]';
}
if (null !== $current_value && !$user) {
@@ -60,7 +62,7 @@ $tpl->register_function('money_fac', function (array $params)
if (null !== $current_value) {
$current_value = htmlspecialchars($current_value, ENT_QUOTES, 'UTF-8');
}
-
+
$currency = Config::getInstance()->get('monnaie');
return sprintf('
%s ', $name, $current_value, $currency);
}
diff --git a/admin/pdf.php b/admin/pdf.php
index a76f653..926c543 100644
--- a/admin/pdf.php
+++ b/admin/pdf.php
@@ -71,52 +71,59 @@ if (isset($f->date_echeance))
// -- Création du PDF
-// Génération factures, devis
-switch ($f->type_facture)
+// Génération factures, devis et cotisation
+if ($f->type_facture != CERFA)
{
- case FACT:
- $doc = 'Facture n° '. $f->numero;
- $txtemis = $doc . " - Émise le " . $emission;
- $txtdest = "Adressée à :";
- break;
- case DEVIS:
- $doc = 'Devis n° '. $f->numero;
- $txtemis = $doc . " - Émis le " . $emission;
- $txtdest = "Adressé à :";
- break;
-}
+ switch ($f->type_facture)
+ {
+ case FACT:
+ $doc = 'Facture n° '. $f->numero;
+ $txtemis = $doc . " - Émise le " . $emission;
+ $txtdest = "Adressée à :";
+ break;
+ case DEVIS:
+ $doc = 'Devis n° '. $f->numero;
+ $txtemis = $doc . " - Émis le " . $emission;
+ $txtdest = "Adressé à :";
+ break;
+ case COTIS:
+ $doc = 'Reçu de cotisation n° '. $f->numero;
+ $txtemis = $doc . " - Émis le " . $emission;
+ $txtdest = "Adressé à :";
+ break;
+ }
-// utiliser l'adresse configurée dans le plugin sinon celle de l'asso sinon rien !
-if ($plugin->getConfig('rue_asso') != null &&
- $plugin->getConfig('cp_asso') != null &&
- $plugin->getConfig('ville_asso') != null)
-{
- $adresse =
- (($plugin->getConfig('numero_rue_asso') != null) ? $plugin->getConfig('numero_rue_asso') . " " : "") .
- $plugin->getConfig('rue_asso') . " " .
- $plugin->getConfig('cp_asso') . " " .
- $plugin->getConfig('ville_asso');
-}
-else if ($config->get('org_address') != null)
-{
- $adresse = str_replace("\n", ' ', $config->get('org_address'));
-}
-else {
- $adresse = "";
-}
+ // utiliser l'adresse configurée dans le plugin sinon celle de l'asso sinon rien !
+ if ($plugin->getConfig('rue_asso') != null &&
+ $plugin->getConfig('cp_asso') != null &&
+ $plugin->getConfig('ville_asso') != null)
+ {
+ $adresse =
+ (($plugin->getConfig('numero_rue_asso') != null) ? $plugin->getConfig('numero_rue_asso') . " " : "") .
+ $plugin->getConfig('rue_asso') . " " .
+ $plugin->getConfig('cp_asso') . " " .
+ $plugin->getConfig('ville_asso');
+ }
+ else if ($config->get('org_address') != null)
+ {
+ $adresse = str_replace("\n", ' ', $config->get('org_address'));
+ }
+ else {
+ $adresse = "";
+ }
-$logo='';
-if ($plugin->getConfig('logo')) {
- $logo = ' ';
-}
-$asso =
- // 'Émis par : '.
- ''.$config->get('org_name')." ".
- $adresse ." ".
- (($t = $plugin->getConfig('rna_asso'))?"RNA : $t ":'').
- (($t = $plugin->getConfig('siret_asso'))?"SIRET : " . implode(' ', str_split($t, 3)) . " ":'').
- (($t = $config->get('email_asso'))?"Email : $t ":'').
- (($t = $config->get('site_asso'))?"Site web : $t ":'');
+ $logo='';
+ if ($plugin->getConfig('logo')) {
+ $logo = ' ';
+ }
+ $asso =
+ // 'Émis par : '.
+ ''.$config->get('org_name')." ".
+ $adresse ." ".
+ (($t = $plugin->getConfig('rna_asso'))?"RNA : $t ":'').
+ (($t = $plugin->getConfig('siret_asso'))?"SIRET : " . implode(' ', str_split($t, 3)) . " ":'').
+ (($t = $config->get('email_asso'))?"Email : $t ":'').
+ (($t = $config->get('site_asso'))?"Site web : $t ":'');
$receveur =
$txtdest.' '.
@@ -127,22 +134,23 @@ $asso =
(($t = $c->email)?"Email : $t ":'').
(($t = $c->telephone)?"Tel : $t ":'');
-$total = Utils::money_format($f->total, ',', ' ');
+ $total = Utils::money_format($f->total, ',', ' ');
-// Devis et facture
-{
- $echeance = ($f->type_facture?'Échéance de paiement':'Échéance du devis')." : ".$echeance;
- if ($f->type_facture == FACT) {
- $reglee = !$f->reglee?'Cette facture est en attente de règlement.':'Cette facture a été réglée.';
- } else {
- $reglee = "";
- }
- $footer = str_replace("\n", ' ', $plugin->getConfig('footer') ?? '[Pied de page à configurer]');
- $ttc = $plugin->getConfig('ttc') ? 'TTC':'HT';
+ // Devis et facture
+ if ($f->type_facture != COTIS)
+ {
+ $echeance = ($f->type_facture?'Échéance de paiement':'Échéance du devis')." : ".$echeance;
+ if ($f->type_facture == FACT) {
+ $reglee = !$f->reglee?'Cette facture est en attente de règlement.':'Cette facture a été réglée.';
+ } else {
+ $reglee = "";
+ }
+ $footer = str_replace("\n", ' ', $plugin->getConfig('footer') ?? '[Pied de page à configurer]');
+ $ttc = $plugin->getConfig('ttc') ? 'TTC':'HT';
- // Génération du contenu de la facture
- ob_start();
- echo <<
Contenu - $doc
@@ -162,18 +170,18 @@ $total = Utils::money_format($f->total, ',', ' ');
EOF;
- $i = 1;
- foreach($f->contenu as $k=>$v)
- {
- echo '';
- echo str_replace("\n", ' ', $v['designation']);
- echo ' ';
- echo Utils::money_format($v['prix'], ',', ' ') .' €';
- echo ' ';
- $i++;
- }
+ $i = 1;
+ foreach($f->contenu as $k=>$v)
+ {
+ echo '';
+ echo str_replace("\n", ' ', $v['designation']);
+ echo ' ';
+ echo Utils::money_format($v['prix'], ',', ' ') .' €';
+ echo ' ';
+ $i++;
+ }
- echo <<
@@ -201,14 +209,52 @@ EOF;
EOF;
}
- $content = ob_get_clean();
+ $content = ob_get_clean();
-}
+ }
+ else // Reçu de cotisation
+ {
+ $lieu = $plugin->getConfig('ville_asso');
+ $intitule = $f->contenu['intitule'];
-//-- Layout du document
+ $souscription = date('d/m/Y', strtotime($f->contenu['souscription']));
-ob_start();
-echo <<contenu['expiration'] == '1970-01-01')
+ {
+ $expiration = "jour même, s'agissant d'une cotisation ponctuelle.";
+ }
+ else {
+ $expiration = date('d/m/Y', strtotime($f->contenu['expiration']));
+ }
+
+ // Génération du contenu du reçu de cotisation
+ $content = <<
+ Reçu de votre cotisation - $doc
+
+
+
+
À $lieu, le $emission,
+
Bonjour,
+
+
Nous accusons réception de votre cotisation « $intitule » reçue le $emission et nous vous en remercions.
+
Nous reconnaissons que vous avez acquitté la somme de {$total} €. 111
+ Votre adhésion sera donc effective à compter du $souscription jusqu’au $expiration.
+
+
+
Nous vous prions de recevoir, chère adhérente, cher adhérent, nos meilleures salutations,
+
+
-représentant·e de l'asso-
+
+
Nous vous rappelons que la cotisation n’est pas soumise à la TVA et qu’elle ne donne pas lieu à la délivrance d’une facture. Elle n’ouvre pas droit au bénéfice des dispositions des articles 200, 238 bis et 885-0 V bis A du code général des impôts.
+
+EOF;
+ }
+
+ //-- Layout du document
+
+ ob_start();
+ echo <<
@@ -322,7 +368,192 @@ echo <<
EOF;
-$html = ob_get_clean();
+ $html = ob_get_clean();
+
+} // Génération du CERFA
+elseif ($f->type_facture == CERFA)
+{
+
+ $doc = 'Reçu de don n°'. $f->numero;
+ $url = WWW_URL;
+ $libelles = $facture->listTextesCerfa(false);
+
+ $t['numero'] = $f->numero;
+ $t['org_name'] = $config->get('org_name');
+ $t['n_rue_asso'] = $plugin->getConfig('numero_rue_asso');
+ $t['rue_asso'] = $plugin->getConfig('rue_asso');
+ $t['cp_asso'] = $plugin->getConfig('cp_asso');
+ $t['ville_asso'] = $plugin->getConfig('ville_asso');
+ $t['objet0'] = $plugin->getConfig('objet_0');
+ $t['objet1'] = $plugin->getConfig('objet_1');
+ $t['objet2'] = $plugin->getConfig('objet_2');
+
+ $t['nom'] = $nom_client;
+ $t['adresse'] = $c->adresse;
+ $t['cp'] = $c->code_postal;
+ $t['ville'] = $c->ville;
+ $t['total'] = '***'.Utils::money_format($f->total).'***';
+ $t['total_lettre'] = numfmt_create('fr_FR', \NumberFormatter::SPELLOUT)->format($f->total/100). ' euros';
+
+
+ $t['d'] = ($f->date_emission->format('d'));
+ $t['m'] = ($f->date_emission->format('m'));
+ $t['Y'] = ($f->date_emission->format('Y'));
+
+ $t['forme'] = $f->contenu['forme'];
+ $t['nature'] = $f->contenu['nature'];
+ $t['texte'] = $libelles[$f->contenu['texte']];
+
+ $t['art200'] = $t['art238'] = $t['art885'] = '';
+ if($plugin->getConfig('droit_art200')){
+ $t['art200'] = 'X';
+ }
+ if($plugin->getConfig('droit_art238bis')){
+ $t['art238'] = 'X';
+ }
+ if($plugin->getConfig('droit_art885-0VbisA')){
+ $t['art885'] = 'X';
+ }
+
+ // forme du don
+ switch ($t['forme']){
+ case '1':
+ $t['frm'] = 'left: 15mm;';
+ break;
+ case '2':
+ $t['frm'] = 'left: 57.3mm;';
+ break;
+ case '3':
+ $t['frm'] = 'left: 115.2mm;';
+ break;
+ case '4':
+ $t['frm'] = 'left: 175.2mm;';
+ }
+ // nature du don
+ switch ($t['nature']){
+ case '1':
+ $t['nat'] = 'left: 15mm;';
+ break;
+ case '2':
+ $t['nat'] = 'left: 57.3mm;';
+ break;
+ case '3':
+ $t['nat'] = 'left: 115.2mm;';
+ }
+ // moyen de paiement
+ switch ($f->moyen_paiement){
+ case 'ES':
+ $t['pos'] = 'left: 15mm;';
+ break;
+ case 'CH':
+ $t['pos'] = 'left: 57.3mm;';
+ break;
+ default:
+ $t['pos'] = 'left: 115.2mm;';
+ }
+
+ $t['d2'] = ($f->date_echeance->format('d'));
+ $t['m2'] = ($f->date_echeance->format('m'));
+ $t['Y2'] = ($f->date_echeance->format('Y'));
+
+ ob_start();
+ echo <<
+
+
+
+ {$doc}_{$emission}
+
+
+
+
+
{$t['numero']}
+
+
{$t['org_name']}
+
{$t['n_rue_asso']}
+
{$t['rue_asso']}
+
{$t['cp_asso']}
+
{$t['ville_asso']}
+
+
{$t['objet0']}
+
{$t['objet1']}
+
{$t['objet2']}
+
+
X
+
+
+
{$t['nom']}
+
{$t['adresse']}
+
{$t['cp']}
+
{$t['ville']}
+
+
{$t['total']}
+
{$t['total_lettre']}
+
+
{$t['d']}
+
{$t['m']}
+
{$t['Y']}
+
+
{$t['art200']}
+
{$t['art238']}
+
{$t['art885']}
+
X
+
X
+
{$t['texte']}
+
X
+
+
{$t['d2']}
+
{$t['m2']}
+
{$t['Y2']}
+
+
{$sign_tag}
+
+
+
+EOF;
+
+ $html = ob_get_clean();
+
+} // End if cerfa
+
if(qg('d') !== null)
{
diff --git a/lib/Facture.php b/lib/Facture.php
index 9433be3..9baabf8 100644
--- a/lib/Facture.php
+++ b/lib/Facture.php
@@ -15,15 +15,17 @@ class Facture
const TYPES_NAMES = [
DEVIS => 'Devis',
FACT => 'Facture',
+ CERFA => 'Reçu fiscal',
+ COTIS => 'Reçu de cotisation',
];
private $keys = [
- 'type_facture', // 0 : devis, 1 : facture
+ 'type_facture', // 0 : devis, 1 : facture, 2 : reçu cerfa, 3 : reçu cotis
'numero',
'receveur_membre',
'receveur_id',
- 'date_emission',
- 'date_echeance',
+ 'date_emission', // Reçus : date du don
+ 'date_echeance', // Reçus : date d'édition du reçu
'reglee',
'archivee',
'moyen_paiement',
@@ -42,6 +44,16 @@ class Facture
'accounts' => [],
'label' => 'Facture',
'help' => ''],
+ CERFA => [
+ 'id' => CERFA,
+ 'accounts' => [],
+ 'label' => 'Reçu fiscal',
+ 'help' => 'Reçu fiscal pour un don (membre ou client)'],
+ COTIS => [
+ 'id' => COTIS,
+ 'accounts' => [],
+ 'label' => 'Reçu de cotisation',
+ 'help' => 'Reçu pour une cotisation payée par un·e membre'],
];
public function __construct()
@@ -76,12 +88,18 @@ class Facture
}
if ($datas[$k] < 2) {
$fac = true;
+ $cerfa = false;
+ $recu = false;
}
elseif ($datas[$k] == 2) {
$fac = false;
+ $cerfa = true;
+ $recu = false;
}
elseif ($datas[$k] == 3) {
$fac = false;
+ $cerfa = false;
+ $recu = true;
}
break;
case 'receveur_membre':
@@ -144,9 +162,21 @@ class Facture
throw new UserException("Toutes les désignations/prix sont vides.");
}
}
+ elseif ($cerfa)
+ {
+
+ }
+ elseif ($recu)
+ {
+ // $fields = ['id', 'intitule', 'date', 'expiration'];
+ // foreach ($datas[$k]as $)
+ }
$datas[$k] = json_encode($datas[$k]);
break;
case 'total':
+ if ($cerfa && $datas[$k] < 1) {
+ throw new UserException('Le total ne peut être inférieur à 1€ pour les reçus (bug encore non résolu).');
+ }
if ($fac && !isset($datas['contenu'])) {
throw new UserException("Pas de contenu fourni pour vérifier le total.");
}
@@ -200,6 +230,15 @@ class Facture
$type = 'FACT';
$t = 'F';
}
+ elseif ($type == CERFA) {
+ $type = 'CERFA';
+ $t = 'RF';
+ }
+ else {
+ $type = 'COTIS';
+ $t = 'RC';
+ }
+
$year = $date->format('Y');
$y = $date->format('y');
@@ -376,9 +415,21 @@ class Facture
// Remplir le contenu
$content = json_decode((string)$row->contenu);
- $row->contenu = implode("\n", array_map(function ($row) use ($currency) {
- return sprintf('%s : %s %s', $row->designation, Utils::money_format($row->prix), $currency);
- }, (array)$content));
+ if ($row->type_facture == COTIS && isset($content->intitule, $content->souscription)) {
+ $row->contenu = sprintf("Cotisation %s\nSouscrite le %s",
+ $content->intitule,
+ Utils::date_fr($content->souscription, 'd/m/Y')
+ );
+ }
+ elseif ($row->type_facture != CERFA) {
+ $row->contenu = implode("\n", array_map(function ($row) use ($currency) {
+ return sprintf('%s : %s %s', $row->designation, Utils::money_format($row->prix), $currency);
+ }, (array)$content));
+ }
+ else
+ {
+ $row->contenu = '';
+ }
});
return $list;
@@ -448,6 +499,31 @@ class Facture
return DB::getInstance()->test('plugin_facturation_factures', 'receveur_membre = ? AND receveur_id = ?', $base, $id);
}
+ // ** Pour type reçu **
+
+ public $recu_fields = ['id', 'label', 'amount', 'date', 'expiry', 'paid', 'paid_amount'];
+
+ public function getCotis(int $user_id, int $su_id = null)
+ {
+ $where = 'WHERE su.id_user = ?';
+ if (null !== $su_id)
+ {
+ $where .= ' AND su.id = '.$su_id;
+ }
+
+ $sql = 'SELECT su.id, s.label, su.date, MAX(su.expiry_date) as expiry, sf.label as fee, sf.amount as amount, su.paid, SUM(tl.debit) as paid_amount
+ FROM services_users su
+ INNER JOIN services s ON s.id = su.id_service
+ LEFT JOIN services_fees sf ON sf.id = su.id_fee
+ LEFT JOIN acc_transactions_users tu ON tu.id_service_user = su.id
+ LEFT JOIN acc_transactions_lines tl ON tl.id_transaction = tu.id_transaction
+ '.$where.'
+ GROUP BY su.id
+ ORDER BY su.date;';
+
+ return DB::getInstance()->get($sql, $user_id);
+ }
+
public function listMoyensPaiement($assoc = false)
{
$db = DB::getInstance();
@@ -462,6 +538,17 @@ class Facture
}
}
+ /* modif DD -- lecture et retour des textes de CERFA -- */
+ public function listTextesCerfa($menu = true)
+ {
+ $db = DB::getInstance();
+
+ $sel = ($menu) ? 'id, menu' : 'id, texte';
+ $query = 'SELECT '.$sel.' FROM "plugin_facturation_txt_cerfa" WHERE 1 ORDER BY id ;';
+
+ return $db->getAssoc($query);
+ }
+
public function getMoyenPaiement($code)
{
$db = DB::getInstance();
diff --git a/public/cerfa-1.png b/public/cerfa-1.png
new file mode 100644
index 0000000..5ae8163
Binary files /dev/null and b/public/cerfa-1.png differ
diff --git a/public/cerfa-2.png b/public/cerfa-2.png
new file mode 100644
index 0000000..1af01a6
Binary files /dev/null and b/public/cerfa-2.png differ
diff --git a/templates/_form.tpl b/templates/_form.tpl
index 8f78d7e..3e6029d 100644
--- a/templates/_form.tpl
+++ b/templates/_form.tpl
@@ -24,6 +24,8 @@
Créer un devis
Créer une facture
+ Créer un reçu fiscal
+ Créer un reçu de cotisation
{input type="text" name="numero_facture" maxlength=18 label="Numéro du document" required=$require_number source=$doc}
@@ -36,21 +38,27 @@
{/if}
{input type="date" name="date_emission" default=$date label="Date d'émission" required=1 source=$doc}
-
+
+ Date du versemen du don
+
+
{input type="date" name="date_echeance" default=$date label="Date d'échéance" required=1 source=$doc}
+
+ Date d'établissement du document
+
Statut
-
+
{input type="checkbox" name="reglee" value="1" label="Réglée" source=$doc data-types="t1"}
-
+
{input type="checkbox" name="archivee" value="1" label="Archivée" source=$doc disabled="disabled"}
-
+
Client
@@ -105,14 +113,14 @@
{button label="Enlever" title="Enlever la ligne" shape="minus" min="2" name="remove_line"}
- {foreach from=$designations item=designation key=key}
+ {foreach from=$designations item=designation key=key}
{money_fac value=$prix[$key] user=$from_user}
{button label="Enlever" title="Enlever la ligne" shape="minus" min="2" name="remove_line"}
{/foreach}
- {else}
+ {else}
{money_fac name="prix_tpl[]"}
@@ -131,12 +139,102 @@
+
+
+ Contenu
+
+ {input type="money" name="total" label="Montant du don" required=1 source=$doc default="0,0"}
+ {input type="select" name="forme_don" required=1 label="Forme du don" source=$doc options=$formes_don default=$doc.forme_don}
+ {input type="select" name="nature_don" required=1 label="Nature du don" source=$doc options=$natures_don default=$doc.nature_don}
+ {input type="select" name="texte_don" required=1 label="Texte explicatif" source=$doc options=$textes_don default=$doc.texte_don}
+ {input type="select" name="moyen_paiement_cerfa" required=1 label="Moyen de paiement" source=$doc options=$moyens_paiement default=$doc.moyen_paiement_cerfa}
+
-
+
+
+
{csrf_field key=$csrf_key}
{button type="submit" name="save" label="Enregistrer" shape="right" class="main"}
+
+ Membre
+
+ Reçu adressée à :
+
+ {input type="select" name="membre_cotis" label="Membre" options=$users required=1 default=$doc.membre}
+
+
+
+
+
+ {csrf_field key="add_cotis_1"}
+ {button type="submit" name="select_cotis" label="Sélectionner" shape="right" class="main"}
+
+
+
+{if $step}
+
+ Cotisation
+ {if count($liste)}
+
+ Sélectionnez la cotisation concernée :
+
+
+
+
+ Id
+ Intitulé
+ Date d'inscription
+ Expiration d'expiration
+ Tarif
+ Montant
+ Somme payée
+
+
+ {foreach from=$liste item=cotis key=i}
+ {if !$cotis.paid}
+ {continue}
+ {/if}
+
+
+ {input type="radio" name="cotisation" value="%s"|args:$i}
+
+ {foreach from=$cotis item=element key=key}
+ {if $key == 'paid'}
+ {continue}
+ {/if}
+
+
+ {if ($key == 'date' || $key == 'expiry') && $element > 0}
+ {$element|date_short}
+ {elseif $key == 'amount' OR $key == 'paid_amount'}
+ {$element|raw|money_currency}
+ {else}
+ {$element}
+ {/if}
+
+
+
+
+ {/foreach}
+
+ {/foreach}
+
+
+
+
+
+
+ {csrf_field key="add_cotis_2"}
+ {button type="submit" name="add_cotis" label="Enregistrer" shape="right" class="main"}
+
+ {else}
+ Ce membre n'a aucune cotisation payée.
+
+ {/if}
+{/if}
+
{include file="%s/templates/_js.tpl"|args:$plugin_root}
diff --git a/templates/_js.tpl b/templates/_js.tpl
index bf382d3..301ddae 100644
--- a/templates/_js.tpl
+++ b/templates/_js.tpl
@@ -19,8 +19,8 @@
function plus(){
var newdiv = document.createElement('tr');
newdiv.innerHTML = document.getElementById('Line1').innerHTML;
- newdiv.getElementsByTagName('textarea')[0].setAttribute('name', 'designation[]');
- newdiv.getElementsByTagName('input')[0].setAttribute('name', 'prix[]');
+ newdiv.getElementsByTagName('textarea')[0].setAttribute('name', 'designation[]');
+ newdiv.getElementsByTagName('input')[0].setAttribute('name', 'prix[]');
newdiv.querySelector('.fact_rm_line button').onclick = function(){
this.parentNode.parentNode.parentNode.removeChild(this.parentNode.parentNode);
updateSum();
@@ -33,12 +33,12 @@
$('#ajouter_ligne').onclick = plus;
- a = document.querySelectorAll('[name="remove_line"]');
+ a = document.querySelectorAll('[name="remove_line"]');
l = a.length;
for(i = 0; i < l; i++) {
a[i].onclick = function(){
this.parentNode.parentNode.parentNode.removeChild(this.parentNode.parentNode);
- updateSum();
+ updateSum();
};
}
diff --git a/templates/aide.tpl b/templates/aide.tpl
index a66b7c2..6f8c672 100644
--- a/templates/aide.tpl
+++ b/templates/aide.tpl
@@ -17,6 +17,8 @@
+ Pensez à mettre une image en signature (cela sert pour les reçus fiscaux), cela se passe dans la {link href="!config/custom.php" label="configuration de Paheko, onglet personnalisation"}. Il est préférable d'avoir un fond transparent.
+
Pour créer un reçu sur une cotisation, il vaut mieux utiliser le module {link href="!config/ext" label="Reçu de paiement"} intégré à Paheko.
Pour créer un reçu fiscal, il vaut mieux utiliser le module {link href="!config/ext" label="Reçus fiscaux"} intégré à Paheko.
diff --git a/templates/clients.tpl b/templates/clients.tpl
index 9c40f2c..f0b037b 100644
--- a/templates/clients.tpl
+++ b/templates/clients.tpl
@@ -14,7 +14,7 @@
{/if}
{if $key == 'siret'}
-
diff --git a/templates/config.tpl b/templates/config.tpl
index eab9225..f2da195 100644
--- a/templates/config.tpl
+++ b/templates/config.tpl
@@ -27,6 +27,25 @@
{input type="text" name="ville_asso" source=$conf label="Ville"}
+
+ Objet
+
+ L'objet (but) de l'association doit tenir sur 3 lignes, chaque ligne pouvant accueillir un maximum de 100 caractères. obligatoire pour reçus fiscaux
+ {input type="text" name="objet_0" source=$conf label="Ligne 1" maxlength=95}
+ {input type="text" name="objet_1" source=$conf label="Ligne 2" maxlength=95}
+ {input type="text" name="objet_2" source=$conf label="Ligne 3" maxlength=95}
+
+
+
+
+ Droit à la réduction d'impôt
+
+ Articles concernés par l'association : obligatoire pour reçus fiscaux
+ {input type="checkbox" name="droit_art200" value="1" source=$conf label="Article 200"}
+ {input type="checkbox" name="droit_art238bis" value="1" source=$conf label="Article 238 bis"}
+ {input type="checkbox" name="droit_art885_0VbisA" value="1" source=$conf label="Article 885-0V bis A"}
+
+
@@ -55,7 +74,7 @@
{input type="checkbox" name="unique_client_name" value="1" source=$conf label="Noms des clients uniques"}
{input type="select" name="pattern" label="Format de numéro de document" required=false options=$patterns source=$conf}
- F = Facture, D = Devis
+ F = Facture, D = Devis, RF = Reçu fiscal, RC = Reçu cotisation
Pour personnaliser l'apparence de la facture, il faut pour l'instant se retrousser les manches et éditer soi-même le fichier www/admin/pdf.php du plugin !