Élimination bug numérotation si suppression de document

This commit is contained in:
Jean-Christophe Engel 2024-01-10 17:35:38 +01:00
parent 6c3af00f16
commit 42e893f8d3

View File

@ -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)
{