diff --git a/lib/Facture.php b/lib/Facture.php index dedf83b..9e86eb7 100644 --- a/lib/Facture.php +++ b/lib/Facture.php @@ -3,12 +3,22 @@ namespace Garradin\Plugin\Facturation; use DateTime; +use Garradin\Config; use Garradin\DB; +use Garradin\DynamicList; use Garradin\UserException; +use Garradin\Utils; use Garradin\Services\Services_User; 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, 2 : reçu cerfa, 3 : reçu cotis 'numero', @@ -235,6 +245,103 @@ class Facture return $r; } + public function list(): DynamicList + { + $id_field = Config::getInstance()->champ_identite; + + $columns = [ + // Sélectionner cette colonne, mais ne pas la mettre dans la liste des colonnes + // (absence de label) + 'id' => [ + 'select' => 'f.id', + ], + 'type_facture' => [ + ], + 'receveur_membre' => [ + ], + 'receveur_id' => [ + ], + // Créer une colonne virtuelle + 'type' => [ + 'label' => 'Type', + 'select' => null, + ], + 'numero' => [ + 'label' => 'Numéro', + 'select' => 'f.numero', + ], + 'receveur' => [ + 'label' => 'Receveur', + 'select' => sprintf('CASE WHEN receveur_membre THEN u.%s ELSE c.nom END', $id_field), + ], + 'receveur_adresse' => [ + 'label' => 'Son adresse', + 'select' => 'CASE WHEN receveur_membre THEN u.adresse ELSE c.adresse END', + ], + 'receveur_ville' => [ + 'label' => 'Sa ville', + 'select' => 'CASE WHEN receveur_membre THEN u.ville ELSE c.ville END', + ], + 'date_emission' => [ + 'label' => 'Émission', + ], + 'date_echeance' => [ + 'label' => 'Échéance', + ], + 'reglee' => [ + 'label' => 'Réglée', + ], + 'archivee' => [ + 'label' => 'Archivée', + ], + 'moyen_paiement' => [ + 'label' => 'Moyen de paiement', + 'select' => 'mp.nom', + ], + 'contenu' => [ + 'label' => 'Contenu', + ], + 'total' => [ + 'label' => 'Total', + ], + ]; + + $tables = 'plugin_facturation_factures AS f + INNER JOIN plugin_facturation_paiement AS mp ON mp.code = f.moyen_paiement + LEFT JOIN membres AS u ON f.receveur_membre = 1 AND u.id = f.receveur_id + LEFT JOIN plugin_facturation_clients AS c ON f.receveur_membre = 0 AND c.id = f.receveur_id'; + + $list = new DynamicList($columns, $tables); + $list->orderBy('numero', true); + + $currency = Config::getInstance()->monnaie; + + $list->setModifier(function ($row) use ($currency) { + // Remplir la colonne virtuelle + $row->type = self::TYPES_NAMES[$row->type_facture] ?? null; + $row->reglee = $row->reglee ? 'Réglée' : 'Non'; + $row->archivee = $row->archivee ? 'Archivée' : 'Non'; + + // Remplir le contenu + $content = json_decode((string)$row->contenu); + + if ($row->type_facture == FACT && isset($content->intitule, $content->souscription)) { + $row->contenu = sprintf("Cotisation %s\nSouscrite le %s", + $content->intitule, + Utils::date_fr($content->souscription, 'd/m/Y') + ); + } + else { + $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)); + } + }); + + $list->setPageSize(1000); + return $list; + } + public function edit($id, $data = []) { $db = DB::getInstance(); @@ -348,5 +455,4 @@ class Facture { return DB::getInstance()->delete('plugin_facturation_factures', 'id = '. (int)$id); } - } diff --git a/templates/index.tpl b/templates/index.tpl index a8f4596..5e30624 100644 --- a/templates/index.tpl +++ b/templates/index.tpl @@ -3,71 +3,42 @@ {form_errors} -{if count($factures)} -
Type | -Numéro | -Receveur | -Son adresse | -Sa ville | -Emission | -Echéance | -Réglée | -Archivée | -Moyen paiement | -Contenu | -Total | -- - -{foreach from=$factures item=facture} - | |
type_facture) { - case 0: - echo 'Devis'; - break; - case 1: - echo 'Facture'; - break; - case 2: - echo 'Reçu fiscal'; - break; - case 3: - echo 'Reçu cotisation'; - break; - } - ?> | -{$facture.numero} | - {if $facture.receveur_membre} -{$facture.receveur->$identite} | - {else} -{$facture.receveur.nom} | - {/if} -{$facture.receveur.adresse} | -{$facture.receveur.ville} | -{$facture.date_emission|date:'d/m/Y'} | -{$facture.date_echeance|date:'d/m/Y'} | -= $facture->reglee?'Réglée':'Non' ?> | -= $facture->archivee?'Archivée':'Non' ?> | -{$facture.moyen_paiement} | -
- {if $facture.type_facture == 3}
- Cotisation {$facture.contenu.intitule} -Souscrite le {$facture.contenu.souscription|date_short} - {else} - {foreach from=$facture.contenu item=contenu} -{$contenu.designation} : {$contenu.prix|escape|money:false} {$config.monnaie} - {/foreach} - {/if} - |
- {$facture.total|escape|money} {$config.monnaie} | - {*{linkbutton shape="delete" href="%sfacture_supprimer.php?id=%d"|args:$plugin_url,$facture.id label="Supprimer"} | *} -
{$facture.type} | +{$facture.numero} | + {if $facture.receveur_membre} +{link href="!membres/fiche.php?id=%d"|args:$facture.receveur_id label=$facture.receveur} | + {else} +{link href="client.php?id=%d"|args:$facture.receveur_id label=$facture.receveur} | + {/if} +{$facture.receveur_adresse} | +{$facture.receveur_ville} | +{$facture.date_emission|date:'d/m/Y'} | +{$facture.date_echeance|date:'d/m/Y'} | +{$facture.reglee} | +{$facture.archivee} | +{$facture.moyen_paiement} | +{$facture.contenu|escape|nl2br} | +{$facture.total|escape|money_currency} | ++ {linkbutton shape="download" href="pdf.php?id=%d&d"|args:$facture.id label="Télécharger"} + {linkbutton shape="menu" href="facture.php?id=%d"|args:$facture.id label="Voir"} + | +
---|
+ Export de la liste : + {linkbutton href="?export=csv" label="Export CSV" shape="download"} + {linkbutton href="?export=ods" label="Export tableur" shape="download"} +
{else}Aucun document, vous pouvez commencer par {link href="facture_ajouter.php" label="créer un nouveau document"}.
{/if} diff --git a/www/admin/index.php b/www/admin/index.php index 0793e32..8a6f7fe 100644 --- a/www/admin/index.php +++ b/www/admin/index.php @@ -6,18 +6,10 @@ require_once __DIR__ . '/_inc.php'; $session->requireAccess($session::SECTION_ACCOUNTING, $session::ACCESS_READ); -$membres = new Membres; -$tpl->assign('moyens_paiement', $facture->listMoyensPaiement()); +$list = $facture->list(); +$list->loadFromQueryString(); -foreach($factures = $facture->listAll() as $k=>$f) -{ - $factures[$k]->receveur = $f->receveur_membre? $membres->get($f->receveur_id) : $client->get($f->receveur_id); - $factures[$k]->moyen_paiement = $facture->getMoyenPaiement($f->moyen_paiement); -} - -$tpl->assign('identite', $identite); -$tpl->assign('factures', $factures); -$tpl->assign('clients', $client->listAll()); +$tpl->assign(compact('list')); $tpl->display(PLUGIN_ROOT . '/templates/index.tpl');