From fa35d7479d0268322a80a11eee0f4d83c110d8ee Mon Sep 17 00:00:00 2001 From: bohwaz Date: Fri, 17 Dec 2021 13:47:23 +0100 Subject: [PATCH] Liste dynamique des documents --- lib/Facture.php | 108 +++++++++++++++++++++++++++++++++++++++++++- templates/index.tpl | 97 ++++++++++++++------------------------- www/admin/index.php | 14 ++---- 3 files changed, 144 insertions(+), 75 deletions(-) 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)} - - - - - - - - - - - - - - - - - -{foreach from=$factures item=facture} - - - - {if $facture.receveur_membre} - - {else} - - {/if} - - - - - - - - - - {* *} - -{/foreach} - +{if $list->count()} + {include file="common/dynamic_list_head.tpl"} + {foreach from=$list->iterate() item="facture"} + + + + {if $facture.receveur_membre} + + {else} + + {/if} + + + + + + + + + + + + {/foreach} + +
TypeNuméroReceveurSon adresseSa villeEmissionEchéanceRégléeArchivéeMoyen paiementContenuTotal
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}{$facture.receveur->$identite}{$facture.receveur.nom}{$facture.receveur.adresse}{$facture.receveur.ville}{$facture.date_emission|date:'d/m/Y'}{$facture.date_echeance|date:'d/m/Y'}reglee?'Réglée':'Non' ?>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}{link href="!membres/fiche.php?id=%d"|args:$facture.receveur_id label=$facture.receveur}{link href="client.php?id=%d"|args:$facture.receveur_id label=$facture.receveur}{$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');