Élimination bug numérotation si suppression de document
This commit is contained in:
parent
6c3af00f16
commit
42e893f8d3
|
@ -203,7 +203,7 @@ class Facture
|
||||||
|
|
||||||
if ($db->test('plugin_facturation_factures', 'numero = ? COLLATE NOCASE', $data['numero']))
|
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);
|
$db->insert('plugin_facturation_factures', $data);
|
||||||
|
@ -242,12 +242,37 @@ class Facture
|
||||||
$year = $date->format('Y');
|
$year = $date->format('Y');
|
||||||
$y = $date->format('y');
|
$y = $date->format('y');
|
||||||
|
|
||||||
// On récupère le nombre de documents pour cette année
|
// Garantir l'unicité du numéro
|
||||||
// vu qu'on vient d'ajouter un document, celui-ci est bien le dernier numéro
|
$db = DB::getInstance();
|
||||||
$ynumber = DB::getInstance()->count('plugin_facturation_factures', 'strftime(\'%Y\', date_emission) = ?', (string) $year);
|
$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');
|
$data = compact('type', 't', 'year', 'y', 'ynumber', 'id');
|
||||||
|
|
||||||
return preg_replace_callback('/%(\d+)?\{([a-z]+)\}/', function ($match) use ($data) {
|
return preg_replace_callback('/%(\d+)?\{([a-z]+)\}/', function ($match) use ($data) {
|
||||||
$v = (string) $data[$match[2]];
|
$v = (string) $data[$match[2]];
|
||||||
$type = ctype_digit($v) ? 'd' : 's';
|
$type = ctype_digit($v) ? 'd' : 's';
|
||||||
|
|
Loading…
Reference in New Issue