dolibarr 18.0.6
mod_expensereport_jade.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2017 Maxime Kohlhaas <support@atm-consulting.fr>
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 3 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <https://www.gnu.org/licenses/>.
16 * or see https://www.gnu.org/
17 */
18
24require_once DOL_DOCUMENT_ROOT.'/core/modules/expensereport/modules_expensereport.php';
25
30{
35 public $version = 'dolibarr'; // 'development', 'experimental', 'dolibarr'
36
37 public $prefix = 'ER';
38
42 public $error = '';
43
49 public $nom = 'Jade';
50
54 public $name = 'Jade';
55
56
62 public function info()
63 {
64 global $langs;
65 return $langs->trans("SimpleNumRefModelDesc", $this->prefix);
66 }
67
68
74 public function getExample()
75 {
76 return $this->prefix."0501-0001";
77 }
78
79
86 public function canBeActivated()
87 {
88 global $conf, $langs, $db;
89
90 $coyymm = '';
91 $max = '';
92
93 $posindice = strlen($this->prefix) + 6;
94 $sql = "SELECT MAX(CAST(SUBSTRING(ref FROM ".$posindice.") AS SIGNED)) as max";
95 $sql .= " FROM ".MAIN_DB_PREFIX."expensereport";
96 $sql .= " WHERE ref LIKE '".$db->escape($this->prefix)."____-%'";
97 $sql .= " AND entity = ".$conf->entity;
98
99 $resql = $db->query($sql);
100 if ($resql) {
101 $row = $db->fetch_row($resql);
102 if ($row) {
103 $coyymm = substr($row[0], 0, 6);
104 $max = $row[0];
105 }
106 }
107 if ($coyymm && !preg_match('/'.$this->prefix.'[0-9][0-9][0-9][0-9]/i', $coyymm)) {
108 $langs->load("errors");
109 $this->error = $langs->trans('ErrorNumRefModel', $max);
110 return false;
111 }
112
113 return true;
114 }
115
122 public function getNextValue($object)
123 {
124 global $db, $conf;
125
126 // For backward compatibility and restore old behavior to get ref of expense report
127 if (!empty($conf->global->EXPENSEREPORT_USE_OLD_NUMBERING_RULE)) {
128 $fuser = null;
129 if ($object->fk_user_author > 0) {
130 $fuser = new User($db);
131 $fuser->fetch($object->fk_user_author);
132 }
133
134 $expld_car = (empty($conf->global->NDF_EXPLODE_CHAR)) ? "-" : $conf->global->NDF_EXPLODE_CHAR;
135 $num_car = (empty($conf->global->NDF_NUM_CAR_REF)) ? "5" : $conf->global->NDF_NUM_CAR_REF;
136
137 $sql = 'SELECT MAX(de.ref_number_int) as max';
138 $sql .= ' FROM '.MAIN_DB_PREFIX.'expensereport de';
139
140 $result = $db->query($sql);
141
142 if ($db->num_rows($result) > 0) {
143 $objp = $db->fetch_object($result);
144 $newref = $objp->max;
145 $newref++;
146 while (strlen($newref) < $num_car) {
147 $newref = "0".$newref;
148 }
149 } else {
150 $newref = 1;
151 while (strlen($newref) < $num_car) {
152 $newref = "0".$newref;
153 }
154 }
155
156 $ref_number_int = ($newref + 1) - 1;
157
158 $user_author_infos = dolGetFirstLastname($fuser->firstname, $fuser->lastname);
159
160 $prefix = "ER";
161 if (!empty($conf->global->EXPENSE_REPORT_PREFIX)) {
162 $prefix = $conf->global->EXPENSE_REPORT_PREFIX;
163 }
164 $newref = str_replace(' ', '_', $user_author_infos).$expld_car.$prefix.$newref.$expld_car.dol_print_date($object->date_debut, '%y%m%d');
165
166 $sqlbis = 'UPDATE '.MAIN_DB_PREFIX.'expensereport SET ref_number_int = '.((int) $ref_number_int).' WHERE rowid = '.((int) $object->id);
167 $resqlbis = $db->query($sqlbis);
168 if (!$resqlbis) {
169 dol_print_error($resqlbis);
170 exit;
171 }
172
173 dol_syslog("mod_expensereport_jade::getNextValue return ".$newref);
174 return $newref;
175 }
176
177 // First we get the max value
178 $posindice = strlen($this->prefix) + 6;
179 $sql = "SELECT MAX(CAST(SUBSTRING(ref FROM ".$posindice.") AS SIGNED)) as max";
180 $sql .= " FROM ".MAIN_DB_PREFIX."expensereport";
181 $sql .= " WHERE ref LIKE '".$db->escape($this->prefix)."____-%'";
182 $sql .= " AND entity = ".$conf->entity;
183
184 $resql = $db->query($sql);
185 if ($resql) {
186 $obj = $db->fetch_object($resql);
187 if ($obj) {
188 $max = intval($obj->max);
189 } else {
190 $max = 0;
191 }
192 } else {
193 dol_syslog("mod_expensereport_jade::getNextValue", LOG_DEBUG);
194 return 0;
195 }
196
197 $date = $object->date_valid; // $object->date does not exists
198 if (empty($date)) {
199 $this->error = 'Date valid not defined';
200 return 0;
201 }
202
203 $yymm = strftime("%y%m", $date);
204
205 if ($max >= (pow(10, 4) - 1)) {
206 $num = $max + 1; // If counter > 9999, we do not format on 4 chars, we take number as it is
207 } else {
208 $num = sprintf("%04s", $max + 1);
209 }
210
211 dol_syslog("mod_expensereport_jade::getNextValue return ".$this->prefix.$yymm."-".$num);
212 return $this->prefix.$yymm."-".$num;
213 }
214}
Parent class for numbering masks of expense reports.
Class to manage Dolibarr users.
Class to manage expensereport numbering rules Jade.
canBeActivated()
Checks if the numbers already in the database do not cause conflicts that would prevent this numberin...
info()
Return description of numbering model.
getExample()
Returns an example of numbering.
getNextValue($object)
Return next free value.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dolGetFirstLastname($firstname, $lastname, $nameorder=-1)
Return firstname and lastname in correct order.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.