From 61fadfd0e1a3c0c984a5624ce8ab41f0a5f67fb0 Mon Sep 17 00:00:00 2001 From: Maxime Kohlhaas Date: Sun, 27 Aug 2017 10:48:58 +0200 Subject: [PATCH] New numbering module for expense report + admin setup --- htdocs/admin/expensereport.php | 52 +++---- htdocs/core/modules/expensereport/index.html | 0 .../expensereport/mod_expensereport_jade.php | 134 ++++++++++++++++++ .../expensereport/mod_expensereport_sand.php | 126 ++++++++++++++++ .../expensereport/modules_expensereport.php | 84 +++++++++++ .../class/expensereport.class.php | 65 +++++---- 6 files changed, 411 insertions(+), 50 deletions(-) create mode 100644 htdocs/core/modules/expensereport/index.html create mode 100644 htdocs/core/modules/expensereport/mod_expensereport_jade.php create mode 100644 htdocs/core/modules/expensereport/mod_expensereport_sand.php diff --git a/htdocs/admin/expensereport.php b/htdocs/admin/expensereport.php index cd14d472057..fb4651be817 100644 --- a/htdocs/admin/expensereport.php +++ b/htdocs/admin/expensereport.php @@ -207,24 +207,26 @@ $head=expensereport_admin_prepare_head(); dol_fiche_head($head, 'expensereport', $langs->trans("ExpenseReports"), -1, 'trip'); -// Interventions numbering model /* -print load_fiche_titre($langs->trans("FicheinterNumberingModules"),'',''); + * Expense report numbering model + */ + +print load_fiche_titre($langs->trans("ExpenseReportNumberingModules"),'',''); print ''; print ''; -print ''; +print ''; print ''; -print ''; +print ''; print ''; -print ''; -print "\n"; +print ''; +print ''."\n"; clearstatcache(); foreach ($dirmodels as $reldir) { - $dir = dol_buildpath($reldir."core/modules/fichinter/"); + $dir = dol_buildpath($reldir."core/modules/expensereport/"); if (is_dir($dir)) { @@ -235,21 +237,20 @@ foreach ($dirmodels as $reldir) while (($file = readdir($handle))!==false) { - if (preg_match('/^(mod_.*)\.php$/i',$file,$reg)) + if (substr($file, 0, 18) == 'mod_expensereport_' && substr($file, dol_strlen($file)-3, 3) == 'php') { - $file = $reg[1]; - $classname = substr($file,4); + $file = substr($file, 0, dol_strlen($file)-4); require_once $dir.$file.'.php'; - $module = new $file; + $module = new $file($db); + + // Show modules according to features level + if ($module->version == 'development' && $conf->global->MAIN_FEATURES_LEVEL < 2) continue; + if ($module->version == 'experimental' && $conf->global->MAIN_FEATURES_LEVEL < 1) continue; if ($module->isEnabled()) { - // Show modules according to features level - if ($module->version == 'development' && $conf->global->MAIN_FEATURES_LEVEL < 2) continue; - if ($module->version == 'experimental' && $conf->global->MAIN_FEATURES_LEVEL < 1) continue; - print ''."\n"; print ''; - $ficheinter=new Fichinter($db); - $ficheinter->initAsSpecimen(); + $exp=new ExpenseReport($db); + $exp->initAsSpecimen(); // Info $htmltooltip=''; $htmltooltip.=''.$langs->trans("Version").': '.$module->getVersion().'
'; - $nextval=$module->getNextValue($mysoc,$ficheinter); - if ("$nextval" != $langs->trans("NotAvailable")) { // Keep " on nextval + $nextval=$module->getNextValue($exp); + if ("$nextval" != $langs->trans("NotAvailable")) { // Keep " on nextval $htmltooltip.=''.$langs->trans("NextValue").': '; if ($nextval) { if (preg_match('/^Error/',$nextval) || $nextval=='NotConfigured') @@ -291,11 +294,12 @@ foreach ($dirmodels as $reldir) $htmltooltip.=$langs->trans($module->error).'
'; } } + print ''; - print ''; + print "\n"; } } } @@ -303,9 +307,7 @@ foreach ($dirmodels as $reldir) } } } - -print '
'.$langs->trans("Name").''.$langs->trans("Name").''.$langs->trans("Description").''.$langs->trans("Example").''.$langs->trans("Example").''.$langs->trans("Status").''.$langs->trans("ShortInfo").'
'.$langs->trans("ShortInfo").'
'.$module->nom."\n"; print $module->info(); @@ -264,24 +265,26 @@ foreach ($dirmodels as $reldir) print ''; - if ($conf->global->FICHEINTER_ADDON == $classname) + if ($conf->global->EXPENSEREPORT_ADDON == $file) { print img_picto($langs->trans("Activated"),'switch_on'); } else { - print ''.img_picto($langs->trans("Disabled"),'switch_off').''; + print ''; + print img_picto($langs->trans("Disabled"),'switch_off'); + print ''; } print ''; print $form->textwithpicto('',$htmltooltip,1,0); print '

'; -*/ +print "
\n"; /* * Documents models for Interventions diff --git a/htdocs/core/modules/expensereport/index.html b/htdocs/core/modules/expensereport/index.html new file mode 100644 index 00000000000..e69de29bb2d diff --git a/htdocs/core/modules/expensereport/mod_expensereport_jade.php b/htdocs/core/modules/expensereport/mod_expensereport_jade.php new file mode 100644 index 00000000000..3ccfc8748cb --- /dev/null +++ b/htdocs/core/modules/expensereport/mod_expensereport_jade.php @@ -0,0 +1,134 @@ + + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * or see http://www.gnu.org/ + */ + +/** + * \file htdocs/core/modules/expensereport/mod_expensereport_jade.php + * \ingroup expensereport + * \brief File of class to manage customer order numbering rules Jade + */ +require_once DOL_DOCUMENT_ROOT .'/core/modules/expensereport/modules_expensereport.php'; + +/** + * Class to manage customer order numbering rules Jade + */ +class mod_expensereport_jade extends ModeleNumRefExpenseReport +{ + var $version='dolibarr'; // 'development', 'experimental', 'dolibarr' + var $prefix='ER'; + var $error=''; + var $nom='Jade'; + + + /** + * Return description of numbering module + * + * @return string Text with description + */ + function info() + { + global $langs; + return $langs->trans("SimpleNumRefModelDesc",$this->prefix); + } + + + /** + * Renvoi un exemple de numerotation + * + * @return string Example + */ + function getExample() + { + return $this->prefix."0501-0001"; + } + + + /** + * Test si les numeros deje en vigueur dans la base ne provoquent pas de + * de conflits qui empechera cette numerotation de fonctionner. + * + * @return boolean false si conflit, true si ok + */ + function canBeActivated() + { + global $conf,$langs,$db; + + $coyymm=''; $max=''; + + $posindice=8; + $sql = "SELECT MAX(CAST(SUBSTRING(ref FROM ".$posindice.") AS SIGNED)) as max"; + $sql.= " FROM ".MAIN_DB_PREFIX."expensereport"; + $sql.= " WHERE ref LIKE '".$this->prefix."____-%'"; + $sql.= " AND entity = ".$conf->entity; + + $resql=$db->query($sql); + if ($resql) + { + $row = $db->fetch_row($resql); + if ($row) { $coyymm = substr($row[0],0,6); $max=$row[0]; } + } + if ($coyymm && ! preg_match('/'.$this->prefix.'[0-9][0-9][0-9][0-9]/i',$coyymm)) + { + $langs->load("errors"); + $this->error=$langs->trans('ErrorNumRefModel', $max); + return false; + } + + return true; + } + + /** + * Return next free value + * + * @param Object $object Object we need next value for + * @return string Value if KO, <0 if KO + */ + function getNextValue($object) + { + global $db,$conf; + + // D'abord on recupere la valeur max + $posindice=8; + $sql = "SELECT MAX(CAST(SUBSTRING(ref FROM ".$posindice.") AS SIGNED)) as max"; + $sql.= " FROM ".MAIN_DB_PREFIX."expensereport"; + $sql.= " WHERE ref like '".$this->prefix."____-%'"; + $sql.= " AND entity = ".$conf->entity; + + $resql=$db->query($sql); + if ($resql) + { + $obj = $db->fetch_object($resql); + if ($obj) $max = intval($obj->max); + else $max=0; + } + else + { + dol_syslog("mod_expensereport_jade::getNextValue", LOG_DEBUG); + return -1; + } + + //$date=time(); + $date=$object->date; + $yymm = strftime("%y%m",$date); + + if ($max >= (pow(10, 4) - 1)) $num=$max+1; // If counter > 9999, we do not format on 4 chars, we take number as it is + else $num = sprintf("%04s",$max+1); + + dol_syslog("mod_expensereport_jade::getNextValue return ".$this->prefix.$yymm."-".$num); + return $this->prefix.$yymm."-".$num; + } +} diff --git a/htdocs/core/modules/expensereport/mod_expensereport_sand.php b/htdocs/core/modules/expensereport/mod_expensereport_sand.php new file mode 100644 index 00000000000..cbc82bf17ae --- /dev/null +++ b/htdocs/core/modules/expensereport/mod_expensereport_sand.php @@ -0,0 +1,126 @@ + + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * or see http://www.gnu.org/ + */ + +/** + * \file htdocs/core/modules/expensereport/mod_expensereport_sand.php + * \ingroup expensereport + * \brief Fichier contenant la classe du modele de numerotation de reference de note de frais Sand + */ + +require_once DOL_DOCUMENT_ROOT .'/core/modules/expensereport/modules_expensereport.php'; + + +/** + * Class to manage customer order numbering rules Sand + */ +class mod_expensereport_sand extends ModeleNumRefExpenseReport +{ + var $version='dolibarr'; // 'development', 'experimental', 'dolibarr' + var $error = ''; + var $nom = 'Sand'; + + + /** + * Renvoi la description du modele de numerotation + * + * @return string Texte descripif + */ + function info() + { + global $conf,$langs; + + $langs->load("bills"); + + $form = new Form($this->db); + + $texte = $langs->trans('GenericNumRefModelDesc')."
\n"; + $texte.= '
'; + $texte.= ''; + $texte.= ''; + $texte.= ''; + $texte.= ''; + + $tooltip=$langs->trans("GenericMaskCodes",$langs->transnoentities("Order"),$langs->transnoentities("Order")); + $tooltip.=$langs->trans("GenericMaskCodes2"); + $tooltip.=$langs->trans("GenericMaskCodes3"); + $tooltip.=$langs->trans("GenericMaskCodes4a",$langs->transnoentities("Order"),$langs->transnoentities("Order")); + $tooltip.=$langs->trans("GenericMaskCodes5"); + + // Parametrage du prefix + $texte.= ''; + $texte.= ''; + + $texte.= ''; + + $texte.= ''; + + $texte.= '
'.$langs->trans("Mask").':'.$form->textwithpicto('',$tooltip,1,1).' 
'; + $texte.= '
'; + + return $texte; + } + + /** + * Renvoi un exemple de numerotation + * + * @return string Example + */ + function getExample() + { + global $conf,$langs,$mysoc; + + $old_code_client=$mysoc->code_client; + $mysoc->code_client='CCCCCCCCCC'; + $numExample = $this->getNextValue($mysoc,''); + $mysoc->code_client=$old_code_client; + + if (! $numExample) + { + $numExample = $langs->trans('NotConfigured'); + } + return $numExample; + } + + /** + * Return next free value + * + * @param Societe $objsoc Object thirdparty + * @param Object $object Object we need next value for + * @return string Value if KO, <0 if KO + */ + function getNextValue($objsoc,$object) + { + global $db,$conf; + + require_once DOL_DOCUMENT_ROOT .'/core/lib/functions2.lib.php'; + + // We get cursor rule + $mask=$conf->global->EXPENSEREPORT_SAND_MASK; + + if (! $mask) + { + $this->error='NotConfigured'; + return 0; + } + + $numFinal=get_next_value($db,$mask,'expensereport','ref','',$objsoc,$object->date); + + return $numFinal; + } +} + diff --git a/htdocs/core/modules/expensereport/modules_expensereport.php b/htdocs/core/modules/expensereport/modules_expensereport.php index 153dfb37007..e0adf1fb47e 100644 --- a/htdocs/core/modules/expensereport/modules_expensereport.php +++ b/htdocs/core/modules/expensereport/modules_expensereport.php @@ -65,3 +65,87 @@ function expensereport_pdf_create(DoliDB $db, ExpenseReport $object, $message, $ { return $object->generateDocument($modele, $outputlangs, $hidedetails, $hidedesc, $hideref); } + +/** + * \class ModeleNumRefExpenseReport + * \brief Parent class for numbering masks of expense reports + */ + +abstract class ModeleNumRefExpenseReport +{ + var $error=''; + + /** + * Return if a module can be used or not + * + * @return boolean true if module can be used + */ + function isEnabled() + { + return true; + } + + /** + * Renvoie la description par defaut du modele de numerotation + * + * @return string Texte descripif + */ + function info() + { + global $langs; + $langs->load("orders"); + return $langs->trans("NoDescription"); + } + + /** + * Renvoie un exemple de numerotation + * + * @return string Example + */ + function getExample() + { + global $langs; + $langs->load("trips"); + return $langs->trans("NoExample"); + } + + /** + * Test si les numeros deja en vigueur dans la base ne provoquent pas de conflits qui empecheraient cette numerotation de fonctionner. + * + * @return boolean false si conflit, true si ok + */ + function canBeActivated() + { + return true; + } + + /** + * Renvoie prochaine valeur attribuee + * + * @param Societe $objsoc Object thirdparty + * @param Object $object Object we need next value for + * @return string Valeur + */ + function getNextValue($objsoc,$object) + { + global $langs; + return $langs->trans("NotAvailable"); + } + + /** + * Renvoie version du module numerotation + * + * @return string Valeur + */ + function getVersion() + { + global $langs; + $langs->load("admin"); + + if ($this->version == 'development') return $langs->trans("VersionDevelopment"); + if ($this->version == 'experimental') return $langs->trans("VersionExperimental"); + if ($this->version == 'dolibarr') return DOL_VERSION; + if ($this->version) return $this->version; + return $langs->trans("NotAvailable"); + } +} \ No newline at end of file diff --git a/htdocs/expensereport/class/expensereport.class.php b/htdocs/expensereport/class/expensereport.class.php index e4ee53e174a..eb6116f4edf 100644 --- a/htdocs/expensereport/class/expensereport.class.php +++ b/htdocs/expensereport/class/expensereport.class.php @@ -1457,36 +1457,51 @@ class ExpenseReport extends CommonObject */ function getNextNumRef() { - global $conf; + global $langs, $conf; + $langs->load("trips"); - $expld_car = (empty($conf->global->NDF_EXPLODE_CHAR))?"-":$conf->global->NDF_EXPLODE_CHAR; - $num_car = (empty($conf->global->NDF_NUM_CAR_REF))?"5":$conf->global->NDF_NUM_CAR_REF; + if (! empty($conf->global->EXPENSEREPORT_ADDON)) + { + $mybool=false; - $sql = 'SELECT MAX(de.ref_number_int) as max'; - $sql.= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' de'; + $file = $conf->global->EXPENSEREPORT_ADDON.".php"; + $classname = $conf->global->EXPENSEREPORT_ADDON; - $result = $this->db->query($sql); + // Include file with class + $dirmodels=array_merge(array('/'),(array) $conf->modules_parts['models']); + foreach ($dirmodels as $reldir) + { + $dir = dol_buildpath($reldir."core/modules/expensereport/"); - if($this->db->num_rows($result) > 0): - $objp = $this->db->fetch_object($result); - $this->ref = $objp->max; - $this->ref++; - while(strlen($this->ref) < $num_car): - $this->ref = "0".$this->ref; - endwhile; - else: - $this->ref = 1; - while(strlen($this->ref) < $num_car): - $this->ref = "0".$this->ref; - endwhile; - endif; + // Load file with numbering class (if found) + $mybool|=@include_once $dir.$file; + } - if ($result): - return 1; - else: - $this->error=$this->db->error(); - return -1; - endif; + if (! $mybool) + { + dol_print_error('',"Failed to include file ".$file); + return ''; + } + + $obj = new $classname(); + $numref = $obj->getNextValue($this); + + if ($numref != "") + { + return $numref; + } + else + { + $this->error=$obj->error; + //dol_print_error($this->db,get_class($this)."::getNextNumRef ".$obj->error); + return ""; + } + } + else + { + print $langs->trans("Error")." ".$langs->trans("Error_COMMANDE_ADDON_NotDefined"); + return ""; + } } /**