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

+
- + {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 +
+
+
+ {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 :
+ + + + + + + + + + + + + + {foreach from=$liste item=cotis key=i} + {if !$cotis.paid} + {continue} + {/if} + + + {foreach from=$cotis item=element key=key} + {if $key == 'paid'} + {continue} + {/if} + + {/foreach} + + {/foreach} +
IdIntituléDate d'inscriptionExpiration d'expirationTarifMontantSomme payée
+ {input type="radio" name="cotisation" value="%s"|args:$i} + + +
+ +
+
+ +

+ {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 +
    +
    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 +
    +
    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 !