diff --git a/lib/Client.php b/lib/Client.php index 1bd92b6..d914047 100644 --- a/lib/Client.php +++ b/lib/Client.php @@ -3,6 +3,7 @@ namespace Garradin\Plugin\Facturation; use Garradin\DB; +use Garradin\DynamicList; use Garradin\Plugin; use Garradin\UserException; use Garradin\Utils; @@ -103,6 +104,44 @@ class Client return DB::getInstance()->get('SELECT *, strftime(\'%s\', date_creation) AS date_creation FROM plugin_facturation_clients'); } + public function list(): DynamicList + { + $columns = [ + 'id' => [ + 'label' => 'Numéro', + ], + 'nom' => [ + 'label' => 'Nom', + ], + 'adresse' => [ + 'label' => 'Adresse', + ], + 'code_postal' => [ + 'label' => 'Code postal', + ], + 'ville' => [ + 'label' => 'Ville', + ], + 'telephone' => [ + 'label' => 'Téléphone', + ], + 'email' => [ + 'label' => 'E-Mail', + ], + 'nb_documents' => [ + 'label' => 'Nombre de documents', + 'select' => '(SELECT COUNT(*) FROM plugin_facturation_factures WHERE receveur_id = c.id)', + ], + ]; + + $tables = 'plugin_facturation_clients AS c'; + + $list = new DynamicList($columns, $tables); + $list->orderBy('id', false); + $list->setPageSize(1000); + return $list; + } + public function edit($id, $data = []) { $db = DB::getInstance(); @@ -117,15 +156,15 @@ class Client return $db->update('plugin_facturation_clients', $data, $db->where('id', (int)$id)); } - public function isDeletable($id) + public function isDeletable($id): bool { $f = new Facture; - return $f->hasDocs(0, $id); + return !$f->hasDocs(0, $id); } public function delete($id) { - if($this->isDeletable($id)) + if(!$this->isDeletable($id)) { return false; } diff --git a/lib/Facture.php b/lib/Facture.php index dedf83b..017db78 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 == COTIS && 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(); @@ -296,7 +403,7 @@ class Facture throw new UserException("Woopsie, g pô encore implémenté l'usage des membres de l'asso comme clients"); } - return DB::getInstance()->test('plugin_facturation_factures', 'receveur_membre = '. $base .' AND receveur_id = '. $id); + return DB::getInstance()->test('plugin_facturation_factures', 'receveur_membre = ? AND receveur_id = ?', $base, $id); } // ** Pour type reçu ** @@ -348,5 +455,4 @@ class Facture { return DB::getInstance()->delete('plugin_facturation_factures', 'id = '. (int)$id); } - } diff --git a/templates/_js.tpl b/templates/_js.tpl index 53b96d5..301ddae 100644 --- a/templates/_js.tpl +++ b/templates/_js.tpl @@ -4,10 +4,14 @@ function updateSum(){ var total = 0; e = document.querySelectorAll('input[name="prix[]"]'); - e.forEach( function sum(item, index){ - total = total + Number(item.value); + e.forEach((item) => { + if (!item.value) { + return; + } + + total += g.getMoneyAsInt(item.value); }); - document.getElementById('total').innerHTML = total.toFixed(2); + document.getElementById('total').innerHTML = g.formatMoney(total); } (function () { @@ -21,6 +25,7 @@ this.parentNode.parentNode.parentNode.removeChild(this.parentNode.parentNode); updateSum(); }; + newdiv.getElementsByTagName('input')[0].onkeyup = updateSum; document.getElementById('Lines').appendChild(newdiv); } plus(); @@ -40,10 +45,14 @@ function changeTypeSaisie(type) { g.toggle(['.type_client', '.type_membre'], false); - g.toggle('.type_' + type, true); + + if (type) { + g.toggle('.type_' + type, true); + } } - changeTypeSaisie(document.forms[0].base_receveur.value); + const form = document.querySelector('#f_numero_facture').form; + changeTypeSaisie(form.base_receveur.value); var inputs = $('input[name="base_receveur"]'); @@ -83,7 +92,6 @@ g.toggle(e, true); g.toggle('p.submit', true); }); - console.log(e.value); selectType(e.value); }; }); diff --git a/templates/client.tpl b/templates/client.tpl index e30dc2b..fbf2dd1 100644 --- a/templates/client.tpl +++ b/templates/client.tpl @@ -1,22 +1,22 @@ {include file="admin/_head.tpl" title="Client — %s"|args:$plugin.nom current="plugin_%s"|args:$plugin.id js=0} {include file="%s/templates/_menu_client.tpl"|args:$plugin_root current="client"} -
+
Numéro de client
-

{$client.id}

+
{$client.id}
+ -
Nom
-

{$client.nom|escape|rtrim|nl2br}

- +
{$client.nom|escape|rtrim|nl2br} +
Adresse
-

{$client.adresse|escape|rtrim|nl2br}

- +
{$client.adresse|escape|rtrim|nl2br}
+
Ville
-

{$client.ville|escape|rtrim|nl2br}

- +
{$client.ville|escape|rtrim|nl2br}
+
Code postal
-

{$client.code_postal|escape|rtrim|nl2br}

+
{$client.code_postal|escape|rtrim|nl2br}
Adresse électronique
@@ -68,10 +68,10 @@ {$facture.moyen_paiement} {foreach from=$facture.contenu item=contenu} -

{$contenu.designation} : {$contenu.prix|escape|money} {$config.monnaie}

+ {$contenu.designation} : {$contenu.prix|escape|money_currency} {/foreach} - {$facture.total|escape|money} {$config.monnaie} + {$facture.total|escape|money_currency} {/foreach} @@ -79,7 +79,7 @@ {else} -

Cet utilisateur n'a pas de document associé.

+

Ce client n'a pas de document associé.

{/if} {include file="admin/_foot.tpl"} \ No newline at end of file diff --git a/templates/client_modifier.tpl b/templates/client_modifier.tpl index 60c84a7..42dac42 100644 --- a/templates/client_modifier.tpl +++ b/templates/client_modifier.tpl @@ -7,24 +7,18 @@
Modifier un client
-
obligatoire
-
-
obligatoire
-
-
obligatoire
-
-
obligatoire
-
-
-
-
-
+ {input type="text" name="nom" label="Nom" required=true source=$client} + {input type="text" name="adresse" label="Adresse" required=true source=$client} + {input type="text" name="code_postal" label="Code postal" required=true source=$client} + {input type="text" name="ville" label="Ville" required=true source=$client} + {input type="tel" name="telephone" label="Téléphone" source=$client} + {input type="email" name="email" label="Adresse e-mail" source=$client}

{csrf_field key="edit_client"} - + {button type="submit" name="save" label="Enregistrer" shape="right" class="main"}

diff --git a/templates/client_supprimer.tpl b/templates/client_supprimer.tpl index 75dbfea..991ccf7 100644 --- a/templates/client_supprimer.tpl +++ b/templates/client_supprimer.tpl @@ -1,30 +1,15 @@ {include file="admin/_head.tpl" title="Supprimer un client — %s"|args:$plugin.nom current="plugin_%s"|args:$plugin.id js=0} {include file="%s/templates/_menu_client.tpl"|args:$plugin_root current="client_supprimer"} - -{form_errors} - {if !$deletable} -
- -
- Supprimer ce client ? -

- Êtes-vous sûr de vouloir supprimer le membre « {$client.nom} » ? -

-

- Attention : cette action est irréversible. -

-
- -

- {csrf_field key="delete_client_"|cat:$client.id} - -

- -
+

Ce/cette client·e ne peut pas être supprimé·e car des documents lui y sont liés.

{else} -

Ce/cette client·e ne peut pas être supprimé·e car des documents lui y sont liés.

+ + {include file="common/delete_form.tpl" + legend="Supprimer ce client ?" + warning="Êtes-vous sûr de vouloir supprimer le client « %s » ?"|args:$client.nom + alert="Attention, cette action est irréversible."} + {/if} {include file="admin/_foot.tpl"} \ No newline at end of file diff --git a/templates/clients.tpl b/templates/clients.tpl index 3cf12cb..af1e1ce 100644 --- a/templates/clients.tpl +++ b/templates/clients.tpl @@ -1,77 +1,65 @@ {include file="admin/_head.tpl" title="Clients — %s"|args:$plugin.nom current="plugin_%s"|args:$plugin.id js=1} {include file="%s/templates/_menu.tpl"|args:$plugin_root current="clients"} -{form_errors} +{if $list->count()} + {include file="common/dynamic_list_head.tpl"} - -
- -{if !empty($clients)} - - + {foreach from=$list->iterate() item="row"} - {if $session->canAccess($session::SECTION_USERS, $session::ACCESS_ADMIN)}{/if} - {foreach from=$champs key="c" item="champ"} - + + + + {foreach from=$row item="value" key="key"} + {if $key == 'id' || $key == 'nom'} + + {/if} + {/foreach} - + - - - {foreach from=$clients item="membre"} - - {if $session->canAccess($session::SECTION_USERS, $session::ACCESS_ADMIN)} - {/if} - {foreach from=$champs key="c" item="cfg"} - - {/foreach} - - - {/foreach} + {/foreach} + - {if $session->canAccess($session::SECTION_USERS, $session::ACCESS_ADMIN)} - {include file="%s/templates/_list_actions.tpl"|args:$plugin_root colspan=count((array)$champs)} - {/if}
{if $c == "numero"}#{else}{$champ.title}{/if} {$row.id}{$row.nom}{$value} + {if $session->canAccess($session::SECTION_ACCOUNTING, $session::ACCESS_ADMIN)} + {linkbutton shape="delete" href="client_supprimer.php?id=%d"|args:$row.id label="Supprimer"} + {/if} + {if $session->canAccess($session::SECTION_USERS, $session::ACCESS_ADMIN)} + {linkbutton shape="edit" href="client_modifier.php?id=%d"|args:$row.id label="Modifier"} + {/if} + {linkbutton shape="user" href="client.php?id=%d"|args:$row.id label="Fiche client"} +
- {input type="checkbox" name="selected" value=$membre.id default=0} - - {if $c == 'nom'}{/if} - {$membre->$c} - {if $c == 'nom'}{/if} - - 👤 - {if $session->canAccess($session::SECTION_USERS, $session::ACCESS_WRITE)}{/if} -
+ +

+ Export de la liste : + {linkbutton href="?export=csv" label="Export CSV" shape="download"} + {linkbutton href="?export=ods" label="Export tableur" shape="download"} +

+ {else} -

+

Aucun client trouvé.

{/if} -
+{form_errors}
Ajouter un client
-
obligatoire
-
-
obligatoire
-
-
obligatoire
-
-
obligatoire
-
-
-
-
-
+ {input type="text" name="nom" label="Nom" required=true} + {input type="text" name="adresse" label="Adresse" required=true} + {input type="text" name="code_postal" label="Code postal" required=true} + {input type="text" name="ville" label="Ville" required=true} + {input type="tel" name="telephone" label="Téléphone"} + {input type="email" name="email" label="Adresse e-mail"}

{csrf_field key="add_client"} - + {button type="submit" name="add" label="Enregistrer" shape="right" class="main"}

diff --git a/templates/config.tpl b/templates/config.tpl index 4ec6e20..286582c 100644 --- a/templates/config.tpl +++ b/templates/config.tpl @@ -51,9 +51,7 @@
Factures
-
-
- + {input type="textarea" class="full-width" rows="10" name="footer" source=$plugin.config label="Pied de document — informations légales" required=true}
diff --git a/templates/facture.tpl b/templates/facture.tpl index 4c29ed8..5c26840 100644 --- a/templates/facture.tpl +++ b/templates/facture.tpl @@ -9,9 +9,11 @@ {linkbutton shape="download" href="%spdf.php?d&id=%d"|args:$plugin_url,$facture.id label="Télécharger ce document"} +{if $session->canAccess($session::SECTION_ACCOUNTING, $session::ACCESS_ADMIN)} {linkbutton shape="delete" href="%sfacture_supprimer.php?id=%d"|args:$plugin_url,$facture.id label="Supprimer ce document"} +{/if}
- +
{include file="admin/_foot.tpl"} diff --git a/templates/facture_ajouter.tpl b/templates/facture_ajouter.tpl index dfa4f4c..9aa9471 100644 --- a/templates/facture_ajouter.tpl +++ b/templates/facture_ajouter.tpl @@ -58,24 +58,26 @@ Client
-
+
{if !empty($clients)}
{input type="radio" name="base_receveur" value="membre" label="Un·e membre" default=1} {input type="radio" name="base_receveur" value="client" label="Un·e client·e"}
{/if} - -
- {input type="select" name="membre" label="Membre" options=$membres required=1} -
- - {if !empty($clients)} -
- {input type="select" name="client" label="Client" options=$clients required=1 class="type_client"} -
- {/if}
+ +
+ {input type="select" name="membre" label="Membre" options=$membres required=1} +
+ + {if !empty($clients)} +
+ {input type="select" name="client" label="Client" options=$clients required=1 class="type_client"} +
+ {else} + + {/if}
diff --git a/templates/facture_modifier.tpl b/templates/facture_modifier.tpl index 34ef178..195753d 100644 --- a/templates/facture_modifier.tpl +++ b/templates/facture_modifier.tpl @@ -58,24 +58,26 @@ Client
-
+
{if !empty($clients)}
- {input type="radio" name="base_receveur" value="membre" source=$doc label="Un·e membre"} - {input type="radio" name="base_receveur" value="client" source=$doc label="Un·e client·e"} + {input type="radio" name="base_receveur" value="membre" label="Un·e membre" default=1 source=$doc} + {input type="radio" name="base_receveur" value="client" label="Un·e client·e" source=$doc}
- {/if} -
- {input type="select" name="membre" label="Membre" options=$membres required=1 source=$doc} -
- - {if !empty($clients)} -
- {input type="select" name="client" label="Client" options=$clients required=1 source=$doc class="type_client"} -
- {/if}
+ +
+ {input type="select" name="membre" label="Membre" options=$membres required=1 source=$doc} +
+ + {if !empty($clients)} +
+ {input type="select" name="client" label="Client" options=$clients required=1 class="type_client" source=$doc} +
+ {else} + + {/if}
diff --git a/templates/index.tpl b/templates/index.tpl index 11c20c6..5e30624 100644 --- a/templates/index.tpl +++ b/templates/index.tpl @@ -3,69 +3,44 @@ {form_errors} - - - - - - - - - - - - - - - - - -{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} + {include file="admin/_foot.tpl"} diff --git a/www/admin/client_supprimer.php b/www/admin/client_supprimer.php index a66f135..d810142 100644 --- a/www/admin/client_supprimer.php +++ b/www/admin/client_supprimer.php @@ -17,24 +17,13 @@ if (!$client) throw new UserException("Ce client n'existe pas."); } -if (f('delete')) -{ - $form->check('delete_client_'.$c->id); - - if (!$form->hasErrors()) - { - try { - $client->delete($c->id); - Utils::redirect(PLUGIN_URL . 'clients.php'); - } - catch (UserException $e) - { - $form->addError($e->getMessage()); - } - } -} +$csrf_key = 'delete_client_'.$c->id; +$form->runIf('delete', function () use ($client, $c) { + $client->delete($c->id); +}, $csrf_key, PLUGIN_URL . 'clients.php'); $tpl->assign('deletable', $client->isDeletable($id)); $tpl->assign('client', $c); +$tpl->assign(compact('csrf_key')); $tpl->display(PLUGIN_ROOT . '/templates/client_supprimer.tpl'); diff --git a/www/admin/clients.php b/www/admin/clients.php index 8dcd5f2..a470ee7 100644 --- a/www/admin/clients.php +++ b/www/admin/clients.php @@ -40,17 +40,9 @@ if(f('add')) } -$tpl->assign('clients', $client->listAll()); -$tpl->assign('champs', - [ - 'id' => 'id', - 'nom' => 'Nom', - 'adresse' => 'Adresse', - 'code_postal' => 'Code postal', - 'ville' => 'Ville', - 'telephone' => 'Numéro de téléphone', - 'email' => 'Adresse mail' - ] -); +$list = $client->list(); +$list->loadFromQueryString(); + +$tpl->assign(compact('list')); $tpl->display(PLUGIN_ROOT . '/templates/clients.tpl'); diff --git a/www/admin/facture_modifier.php b/www/admin/facture_modifier.php index a9c352d..013be9e 100644 --- a/www/admin/facture_modifier.php +++ b/www/admin/facture_modifier.php @@ -119,7 +119,7 @@ if (f('select_cotis')) { $form->check('add_cotis_1',[ 'numero_facture' => 'required|string', - 'date_emission' => 'required|date', + 'date_emission' => 'required|date_format:d/m/Y', 'membre_cotis' => 'required|numeric', ]); @@ -129,7 +129,7 @@ elseif (f('add_cotis')) { $form->check('add_cotis_2',[ 'numero_facture' => 'required|string', - 'date_emission' => 'required|date', + 'date_emission' => 'required|date_format:d/m/Y', 'membre_cotis' => 'required|numeric', 'cotisation' => 'required', ]); @@ -216,6 +216,9 @@ $tpl->assign('membre_id', f('membre') ?: -1); $tpl->assign(compact('liste', 'radio', 'step')); +$designations = []; +$prix = []; + // C'est un peu l'équivalent de form_field, mais j'avais écrit ça avant // et oulala, c'est un peu complexe, faudrait réfléchir keskivomieux $from_user = false; 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'); diff --git a/www/public/cerfa-1.png b/www/public/cerfa-1.png index 8fcdb13..5ae8163 100644 Binary files a/www/public/cerfa-1.png and b/www/public/cerfa-1.png differ diff --git a/www/public/cerfa-2.png b/www/public/cerfa-2.png index 318e3a9..1af01a6 100644 Binary files a/www/public/cerfa-2.png and b/www/public/cerfa-2.png differ