diff --git a/config.json b/config.json
index 0e0dcd2..5b28698 100644
--- a/config.json
+++ b/config.json
@@ -1,3 +1,3 @@
{
-
+ 'pattern': '%{type}-%{year}-%{ynumber}'
}
\ No newline at end of file
diff --git a/lib/Facture.php b/lib/Facture.php
index b414394..6dc7b61 100644
--- a/lib/Facture.php
+++ b/lib/Facture.php
@@ -75,7 +75,7 @@ class Facture
if(!is_array($data)){
$datas[$k] = trim($data);
}
- if ($datas[$k] === '')
+ if ($datas[$k] === '' && $k != 'numero')
{
throw new UserException("La valeur de $k est vide");
}
@@ -189,18 +189,70 @@ class Facture
}
}
- public function add($data)
+ public function add($data, ?string $number_pattern = null)
{
$db = DB::getInstance();
$this->_checkFields($data);
+ $generate_number = false;
- if(isset($data['numero']) && $db->test('plugin_facturation_factures', 'numero = ? COLLATE NOCASE', $data['numero']))
+ if (empty($data['numero']) && $number_pattern) {
+ $generate_number = true;
+ $data['numero'] = sha1(random_bytes(10));
+ }
+
+ if ($db->test('plugin_facturation_factures', 'numero = ? COLLATE NOCASE', $data['numero']))
{
throw new UserException('Un document avec ce numéro existe déjà, hors le numéro doit être unique.');
}
+
$db->insert('plugin_facturation_factures', $data);
- return $db->lastInsertRowId();
+ $id = $db->lastInsertRowId();
+
+ if ($generate_number) {
+ $numero = $this->getNewNumber($number_pattern, $data['type_facture'], \DateTime::createFromFormat('!Y-m-d', $data['date_emission']), $id);
+ $db->update('plugin_facturation_factures', compact('numero'), 'id = ' . (int) $id);
+ }
+
+ return $id;
+ }
+
+ /**
+ * Renvoie un nouveau numéro de facture selon un motif défini et le type de document
+ */
+ public function getNewNumber(string $pattern, int $type, \DateTimeInterface $date, int $id)
+ {
+ if ($type == DEVIS) {
+ $type = 'DEVIS';
+ $t = 'D';
+ }
+ elseif ($type == FACT) {
+ $type = 'FACT';
+ $t = 'F';
+ }
+ elseif ($type == CERFA) {
+ $type = 'CERFA';
+ $t = 'RF';
+ }
+ else {
+ $type = 'COTIS';
+ $t = 'RC';
+ }
+
+ $year = $date->format('Y');
+ $y = $date->format('y');
+
+ // On récupère le nombre de documents pour cette année
+ // vu qu'on vient d'ajouter un document, celui-ci est bien le dernier numéro
+ $ynumber = DB::getInstance()->count('plugin_facturation_factures', 'strftime(\'%Y\', date_emission) = ?', (string) $year);
+
+ $data = compact('type', 't', 'year', 'y', 'ynumber', 'id');
+
+ return preg_replace_callback('/%(\d+)?\{([a-z]+)\}/', function ($match) use ($data) {
+ $v = $data[$match[2]];
+ $type = ctype_digit($data[$match[2]]) ? 'd' : 's';
+ return sprintf('%' . $match[1] . $type, $v);
+ }, $pattern);
}
public function get($id)
@@ -284,6 +336,7 @@ class Facture
],
'date_emission' => [
'label' => 'Émission',
+ 'order' => 'date_emission %s, id %1$s',
],
'date_echeance' => [
'label' => 'Échéance',
@@ -312,7 +365,7 @@ class Facture
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);
+ $list->orderBy('date_emission', true);
$currency = Config::getInstance()->monnaie;
diff --git a/templates/_form.tpl b/templates/_form.tpl
index 1b7b875..8a55b0c 100644
--- a/templates/_form.tpl
+++ b/templates/_form.tpl
@@ -28,7 +28,14 @@
- {input type="text" name="numero_facture" maxlength=12 label="Numéro du document" required=1 source=$doc help="Chaque document doit comporter un numéro unique délivré chronologiquement et de façon continue. Il faut que le système adopté par l'association garantisse que deux factures émises la même année ne peuvent pas porter le même numéro."}
+ {input type="text" name="numero_facture" maxlength=12 label="Numéro du document" required=$require_number source=$doc}
+
+
+ {if $require_number}
+ Chaque document doit comporter un numéro unique délivré chronologiquement et de façon continue. Il faut que le système adopté par l'association garantisse que deux factures émises la même année ne peuvent pas porter le même numéro.
+ {else}
+ Laisser vide pour qu'un numéro soit automatiquement affecté au format {$number_pattern}.
+ {/if}
{input type="date" name="date_emission" default=$date label="Date d'émission" required=1 source=$doc}