diff --git a/lib/Facture.php b/lib/Facture.php index 5ad987e..fdf3a4f 100644 --- a/lib/Facture.php +++ b/lib/Facture.php @@ -203,9 +203,9 @@ class Facture 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.'); + throw new UserException('Le numéro de document doit être unique, or il existe déjà un document avec le numéro ' . $data['numero']); } - + $db->insert('plugin_facturation_factures', $data); $id = $db->lastInsertRowId(); @@ -242,12 +242,37 @@ class Facture $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); + // Garantir l'unicité du numéro + $db = DB::getInstance(); + $sql = sprintf('SELECT numero FROM plugin_facturation_factures'); + $numeros = array_column($db->get($sql), 'numero'); + //sélectionner les numéros qui correspondent au pattern + $selpattern = preg_replace('/%(\d+)?\{(ynumber|id)\}/', '', $pattern); + $data = compact('type', 't', 'year', 'y'); + $prefixe = preg_replace_callback('/%(\d+)?\{([a-z]+)\}/', function ($match) use ($data) { + $v = (string) $data[$match[2]]; + $type = ctype_digit($v) ? 'd' : 's'; + return sprintf('%' . $match[1] . $type, $v); + }, $selpattern); + $modele = '/^' . $prefixe . '\d+$/'; + $numeros_filtres = array_filter($numeros, function($elem) use ($modele) { + return preg_match($modele, $elem); + }, 0); + + // extraire le numéro d'ordre + $rangs = array_map(function($elem) use($prefixe) { + return (int) substr($elem, strlen($prefixe)); + }, array_values($numeros_filtres)); + sort($rangs); + if (empty($rangs)) { + $ynumber = 1; + } else { + $ynumber = end($rangs) + 1; + } + + // fabriquer le numéro selon le pattern $data = compact('type', 't', 'year', 'y', 'ynumber', 'id'); - return preg_replace_callback('/%(\d+)?\{([a-z]+)\}/', function ($match) use ($data) { $v = (string) $data[$match[2]]; $type = ctype_digit($v) ? 'd' : 's'; @@ -488,36 +513,36 @@ class Facture return DB::getInstance()->get($sql, $user_id); } - public function listMoyensPaiement($assoc = false) - { - $db = DB::getInstance(); + public function listMoyensPaiement($assoc = false) + { + $db = DB::getInstance(); - $query = 'SELECT code, nom FROM plugin_facturation_paiement ORDER BY nom COLLATE NOCASE;'; + $query = 'SELECT code, nom FROM plugin_facturation_paiement ORDER BY nom COLLATE NOCASE;'; - if ($assoc) { - return $db->getAssoc($query); - } - else { - return $db->getGrouped($query); - } + if ($assoc) { + return $db->getAssoc($query); + } + else { + return $db->getGrouped($query); + } } /* 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 ;'; + 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); + return $db->getAssoc($query); } - public function getMoyenPaiement($code) - { - $db = DB::getInstance(); - return $db->firstColumn('SELECT nom FROM plugin_facturation_paiement WHERE code = ?;', $code); - } + public function getMoyenPaiement($code) + { + $db = DB::getInstance(); + return $db->firstColumn('SELECT nom FROM plugin_facturation_paiement WHERE code = ?;', $code); + } public function delete($id) {