Compare commits

...

3 Commits

3 changed files with 77 additions and 48 deletions

View File

@ -203,9 +203,9 @@ 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);
$id = $db->lastInsertRowId(); $id = $db->lastInsertRowId();
@ -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';
@ -488,36 +513,36 @@ class Facture
return DB::getInstance()->get($sql, $user_id); return DB::getInstance()->get($sql, $user_id);
} }
public function listMoyensPaiement($assoc = false) public function listMoyensPaiement($assoc = false)
{ {
$db = DB::getInstance(); $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) { if ($assoc) {
return $db->getAssoc($query); return $db->getAssoc($query);
} }
else { else {
return $db->getGrouped($query); return $db->getGrouped($query);
} }
} }
/* modif DD -- lecture et retour des textes de CERFA -- */ /* modif DD -- lecture et retour des textes de CERFA -- */
public function listTextesCerfa($menu = true) public function listTextesCerfa($menu = true)
{ {
$db = DB::getInstance(); $db = DB::getInstance();
$sel = ($menu) ? 'id, menu' : 'id, texte'; $sel = ($menu) ? 'id, menu' : 'id, texte';
$query = 'SELECT '.$sel.' FROM "plugin_facturation_txt_cerfa" WHERE 1 ORDER BY id ;'; $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) public function getMoyenPaiement($code)
{ {
$db = DB::getInstance(); $db = DB::getInstance();
return $db->firstColumn('SELECT nom FROM plugin_facturation_paiement WHERE code = ?;', $code); return $db->firstColumn('SELECT nom FROM plugin_facturation_paiement WHERE code = ?;', $code);
} }
public function delete($id) public function delete($id)
{ {

View File

@ -1,9 +1,9 @@
name="Facturation" name="Facturation"
description="Permet d'éditer des factures, devis et reçus à ses membres ainsi qu'à une base de clients supplémentaire." description="Permet d'éditer des factures, devis et reçus à ses membres ainsi qu'à une base de clients supplémentaire."
author="zou" author="zou"
url="https://gitlab.com/noizette/garradin-plugin-facturation/" url="https://git.roflcopter.fr/lesanges/paheko-plugin-facturation"
version="0.8.1" version="0.8.2"
menu=true menu=true
restrict_section="accounting" restrict_section="accounting"
restrict_level="read" restrict_level="read"
min_version="1.2.0" min_version="1.3.0"

View File

@ -4,18 +4,12 @@ namespace Paheko;
use Paheko\Plugin\Facturation\Facture; use Paheko\Plugin\Facturation\Facture;
use Paheko\Entities\Files\File; use Paheko\Entities\Files\File;
define('DEVIS', 0);
define('FACT', 1);
define('CERFA', 2);
define('COTIS', 3);
$db = DB::getInstance(); $db = DB::getInstance();
$facture = new Facture; $old_version = $plugin->oldVersion();
$version = $plugin->get('version'); error_log("upgrade::version = " . $old_version);
// 0.2.0 - Stock le contenu en json plutôt qu'en serialized // 0.2.0 - Stock le contenu en json plutôt qu'en serialized
if (version_compare($version, '0.2.0', '<')) if (version_compare($old_version, '0.2.0', '<'))
{ {
$r = (array) DB::getInstance()->get('SELECT * FROM plugin_facturation_factures'); $r = (array) DB::getInstance()->get('SELECT * FROM plugin_facturation_factures');
@ -26,7 +20,7 @@ if (version_compare($version, '0.2.0', '<'))
} }
// 0.3.0 - Migration Facturation\Config vers la table plugins // 0.3.0 - Migration Facturation\Config vers la table plugins
if (version_compare($version, '0.3.0', '<')) if (version_compare($old_version, '0.3.0', '<'))
{ {
$conf = $db->getAssoc('SELECT cle, valeur FROM plugin_facturation_config ORDER BY cle;'); $conf = $db->getAssoc('SELECT cle, valeur FROM plugin_facturation_config ORDER BY cle;');
foreach($conf as $k=>$v) foreach($conf as $k=>$v)
@ -40,7 +34,7 @@ if (version_compare($version, '0.3.0', '<'))
} }
// 0.4.0 - // 0.4.0 -
if (version_compare($version, '0.4.0', '<')) if (version_compare($old_version, '0.4.0', '<'))
{ {
$db->exec(<<<EOT $db->exec(<<<EOT
CREATE TABLE IF NOT EXISTS plugin_facturation_paiement CREATE TABLE IF NOT EXISTS plugin_facturation_paiement
@ -85,8 +79,13 @@ EOT
} }
// 0.6.0 - // 0.6.0 -
if (version_compare($version, '0.6.0', '<')) if (version_compare($old_version, '0.6.0', '<'))
{ {
define('DEVIS', 0);
define('FACT', 1);
define('CERFA', 2);
define('COTIS', 3);
$facture = new Facture;
$r = $db->first('SELECT id, total FROM plugin_facturation_factures;'); $r = $db->first('SELECT id, total FROM plugin_facturation_factures;');
if (strpos($r->total,'.')) if (strpos($r->total,'.'))
{ {
@ -145,8 +144,13 @@ EOT
} }
// 0.6.2 - // 0.6.2 -
if (version_compare($version, '0.6.2', '<')) if (version_compare($old_version, '0.6.2', '<'))
{ {
define('DEVIS', 0);
define('FACT', 1);
define('CERFA', 2);
define('COTIS', 3);
$facture = new Facture;
$db->exec(<<<EOT $db->exec(<<<EOT
INSERT OR IGNORE INTO plugin_facturation_paiement INSERT OR IGNORE INTO plugin_facturation_paiement
(code, nom) VALUES ('HA', 'HelloAsso'); (code, nom) VALUES ('HA', 'HelloAsso');
@ -195,13 +199,13 @@ EOT
} }
// 0.7.1 - Ajout clé config TTC/HT // 0.7.1 - Ajout clé config TTC/HT
if (version_compare($version, '0.7.1', '<')) if (version_compare($old_version, '0.7.1', '<'))
{ {
$plugin->setConfig('ttc', false); $plugin->setConfig('ttc', false);
} }
// 0.7.4 - Signal menu item // 0.8.1 - Signal menu item
if (version_compare($version, '0.8.1', '<')) if (version_compare($old_version, '0.8.1', '<'))
{ {
$plugin->unregisterSignal('menu.item'); $plugin->unregisterSignal('menu.item');
} }