dolibarr 18.0.6
productstockentrepot.class.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2007-2012 Laurent Destailleur <eldy@users.sourceforge.net>
3 * Copyright (C) 2014-2016 Juanjo Menent <jmenent@2byte.es>
4 * Copyright (C) 2015 Florian Henry <florian.henry@open-concept.pro>
5 * Copyright (C) 2015 Raphaël Doursenaud <rdoursenaud@gpcsolutions.fr>
6 * Copyright (C) 2018-2019 Frédéric France <frederic.france@netlogic.fr>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 3 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <https://www.gnu.org/licenses/>.
20 */
21
29// Put here all includes required by your class file
30require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php';
31//require_once DOL_DOCUMENT_ROOT . '/societe/class/societe.class.php';
32//require_once DOL_DOCUMENT_ROOT . '/product/class/product.class.php';
33
42{
46 public $element = 'ProductStockEntrepot';
47
51 public $table_element = 'product_warehouse_properties';
52
53 public $tms = '';
54
58 public $fk_product;
59
63 public $fk_entrepot;
64
65 public $seuil_stock_alerte;
66 public $desiredstock;
67 public $import_key;
68
69
75 public function __construct(DoliDB $db)
76 {
77 $this->db = $db;
78 }
79
88 public function create(User $user, $notrigger = false)
89 {
90 dol_syslog(__METHOD__, LOG_DEBUG);
91
92 $error = 0;
93
94 // Clean parameters
95
96 if (isset($this->fk_product)) {
97 $this->fk_product = (int) $this->fk_product;
98 }
99 if (isset($this->fk_entrepot)) {
100 $this->fk_entrepot = (int) $this->fk_entrepot;
101 }
102 if (isset($this->seuil_stock_alerte)) {
103 $this->seuil_stock_alerte = trim($this->seuil_stock_alerte);
104 }
105 if (isset($this->desiredstock)) {
106 $this->desiredstock = trim($this->desiredstock);
107 }
108 if (isset($this->import_key)) {
109 $this->import_key = trim($this->import_key);
110 }
111
112 // Check parameters
113 // Put here code to add control on parameters values
114
115 // Insert request
116 $sql = 'INSERT INTO '.$this->db->prefix().$this->table_element.'(';
117 $sql .= 'fk_product,';
118 $sql .= 'fk_entrepot,';
119 $sql .= 'seuil_stock_alerte,';
120 $sql .= 'desiredstock,';
121 $sql .= 'import_key';
122 $sql .= ') VALUES (';
123 $sql .= ' '.(!isset($this->fk_product) ? 'NULL' : $this->fk_product).',';
124 $sql .= ' '.(!isset($this->fk_entrepot) ? 'NULL' : $this->fk_entrepot).',';
125 $sql .= ' '.(!isset($this->seuil_stock_alerte) ? '0' : $this->seuil_stock_alerte).',';
126 $sql .= ' '.(!isset($this->desiredstock) ? '0' : $this->desiredstock).',';
127 $sql .= ' '.(!isset($this->import_key) ? 'NULL' : "'".$this->db->escape($this->import_key)."'");
128 $sql .= ')';
129
130 $this->db->begin();
131
132 $resql = $this->db->query($sql);
133 if (!$resql) {
134 $error++;
135 $this->errors[] = 'Error '.$this->db->lasterror();
136 dol_syslog(__METHOD__.' '.implode(',', $this->errors), LOG_ERR);
137 }
138
139 if (!$error) {
140 $this->id = $this->db->last_insert_id($this->db->prefix().$this->table_element);
141
142 //if (!$notrigger) {
143 // Uncomment this and change MYOBJECT to your own tag if you
144 // want this action to call a trigger.
145
147 //$result=$this->call_trigger('MYOBJECT_CREATE',$user);
148 //if ($result < 0) $error++;
150 //}
151 }
152
153 // Commit or rollback
154 if ($error) {
155 $this->db->rollback();
156
157 return -1 * $error;
158 } else {
159 $this->db->commit();
160
161 return $this->id;
162 }
163 }
164
173 public function fetch($id, $fk_product = 0, $fk_entrepot = 0)
174 {
175 if (empty($id) && (empty($fk_product) || empty($fk_entrepot))) {
176 return -1;
177 }
178
179 dol_syslog(__METHOD__, LOG_DEBUG);
180
181 $sql = "SELECT";
182 $sql .= " t.rowid,";
183 $sql .= " t.tms,";
184 $sql .= " t.fk_product,";
185 $sql .= " t.fk_entrepot,";
186 $sql .= " t.seuil_stock_alerte,";
187 $sql .= " t.desiredstock,";
188 $sql .= " t.import_key";
189 $sql .= " FROM ".$this->db->prefix().$this->table_element." as t";
190 if (!empty($id)) {
191 $sql .= " WHERE t.rowid = ".((int) $id);
192 } else {
193 $sql .= " WHERE t.fk_product = ".((int) $fk_product)." AND t.fk_entrepot = ".((int) $fk_entrepot);
194 }
195
196 $resql = $this->db->query($sql);
197 if ($resql) {
198 $numrows = $this->db->num_rows($resql);
199 if ($numrows) {
200 $obj = $this->db->fetch_object($resql);
201
202 $this->id = $obj->rowid;
203
204 $this->tms = $this->db->jdate($obj->tms);
205 $this->fk_product = $obj->fk_product;
206 $this->fk_entrepot = $obj->fk_entrepot;
207 $this->seuil_stock_alerte = $obj->seuil_stock_alerte;
208 $this->desiredstock = $obj->desiredstock;
209 $this->import_key = $obj->import_key;
210 }
211
212 // Retrieve all extrafield
213 // fetch optionals attributes and labels
214 $this->fetch_optionals();
215
216 // $this->fetch_lines();
217
218 $this->db->free($resql);
219
220 if ($numrows) {
221 return 1;
222 } else {
223 return 0;
224 }
225 } else {
226 $this->errors[] = 'Error '.$this->db->lasterror();
227 dol_syslog(__METHOD__.' '.implode(',', $this->errors), LOG_ERR);
228
229 return -1;
230 }
231 }
232
247 public function fetchAll($fk_product = '', $fk_entrepot = '', $sortorder = '', $sortfield = '', $limit = 0, $offset = 0, array $filter = array(), $filtermode = 'AND')
248 {
249 dol_syslog(__METHOD__, LOG_DEBUG);
250
251 $sql = "SELECT";
252 $sql .= " t.rowid,";
253
254 $sql .= " t.tms,";
255 $sql .= " t.fk_product,";
256 $sql .= " t.fk_entrepot,";
257 $sql .= " t.seuil_stock_alerte,";
258 $sql .= " t.desiredstock,";
259 $sql .= " t.import_key";
260
261
262 $sql .= " FROM ".$this->db->prefix().$this->table_element." as t";
263
264 $sql .= " WHERE 1=1";
265
266 // Manage filter
267 $sqlwhere = array();
268 if (count($filter) > 0) {
269 foreach ($filter as $key => $value) {
270 $sqlwhere [] = $key." LIKE '%".$this->db->escape($value)."%'";
271 }
272 }
273 if (count($sqlwhere) > 0) {
274 $sql .= " AND ".implode(' '.$this->db->escape($filtermode).' ', $sqlwhere);
275 }
276
277 if (!empty($fk_product) && $fk_product > 0) {
278 $sql .= " AND fk_product = ".((int) $fk_product);
279 } elseif (!empty($fk_entrepot) && $fk_entrepot > 0) {
280 $sql .= " AND fk_entrepot = ".((int) $fk_entrepot);
281 }
282 // "elseif" used instead of "if" because getting list with specified fk_product and specified fk_entrepot would be the same as doing a fetch
283
284 if (!empty($sortfield)) {
285 $sql .= $this->db->order($sortfield, $sortorder);
286 }
287 if (!empty($limit)) {
288 $sql .= $this->db->plimit($limit, $offset);
289 }
290
291 $lines = array();
292
293 $resql = $this->db->query($sql);
294 if ($resql) {
295 while ($obj = $this->db->fetch_object($resql)) {
296 $lines[$obj->rowid] = array(
297 'id'=>$obj->rowid
298 ,'fk_product'=>$obj->fk_product
299 ,'fk_entrepot'=>$obj->fk_entrepot
300 ,'seuil_stock_alerte'=>$obj->seuil_stock_alerte
301 ,'desiredstock'=>$obj->desiredstock
302 );
303 }
304 $this->db->free($resql);
305
306 return $lines;
307 } else {
308 $this->errors[] = 'Error '.$this->db->lasterror();
309 dol_syslog(__METHOD__.' '.implode(',', $this->errors), LOG_ERR);
310
311 return -1;
312 }
313 }
314
323 public function update(User $user, $notrigger = false)
324 {
325 $error = 0;
326
327 dol_syslog(__METHOD__, LOG_DEBUG);
328
329 // Clean parameters
330
331 if (isset($this->fk_product)) {
332 $this->fk_product = (int) $this->fk_product;
333 }
334 if (isset($this->fk_entrepot)) {
335 $this->fk_entrepot = (int) $this->fk_entrepot;
336 }
337 if (isset($this->seuil_stock_alerte)) {
338 $this->seuil_stock_alerte = trim($this->seuil_stock_alerte);
339 }
340 if (isset($this->desiredstock)) {
341 $this->desiredstock = trim($this->desiredstock);
342 }
343 if (isset($this->import_key)) {
344 $this->import_key = trim($this->import_key);
345 }
346
347
348 // Check parameters
349 // Put here code to add a control on parameters values
350
351 // Update request
352 $sql = 'UPDATE '.$this->db->prefix().$this->table_element.' SET';
353
354 $sql .= ' tms = '.(dol_strlen($this->tms) != 0 ? "'".$this->db->idate($this->tms)."'" : "'".$this->db->idate(dol_now())."'").',';
355 $sql .= ' fk_product = '.(isset($this->fk_product) ? $this->fk_product : "null").',';
356 $sql .= ' fk_entrepot = '.(isset($this->fk_entrepot) ? $this->fk_entrepot : "null").',';
357 $sql .= ' seuil_stock_alerte = '.(isset($this->seuil_stock_alerte) ? $this->seuil_stock_alerte : "null").',';
358 $sql .= ' desiredstock = '.(isset($this->desiredstock) ? $this->desiredstock : "null").',';
359 $sql .= ' import_key = '.(isset($this->import_key) ? "'".$this->db->escape($this->import_key)."'" : "null");
360
361
362 $sql .= ' WHERE rowid='.((int) $this->id);
363
364 $this->db->begin();
365
366 $resql = $this->db->query($sql);
367 if (!$resql) {
368 $error++;
369 $this->errors[] = 'Error '.$this->db->lasterror();
370 dol_syslog(__METHOD__.' '.implode(',', $this->errors), LOG_ERR);
371 }
372
373 //if (!$error && !$notrigger) {
374 // Uncomment this and change MYOBJECT to your own tag if you
375 // want this action calls a trigger.
376
378 //$result=$this->call_trigger('MYOBJECT_MODIFY',$user);
379 //if ($result < 0) { $error++; //Do also what you must do to rollback action if trigger fail}
381 //}
382
383 // Commit or rollback
384 if ($error) {
385 $this->db->rollback();
386
387 return -1 * $error;
388 } else {
389 $this->db->commit();
390
391 return 1;
392 }
393 }
394
403 public function delete(User $user, $notrigger = false)
404 {
405 dol_syslog(__METHOD__, LOG_DEBUG);
406
407 $error = 0;
408
409 $this->db->begin();
410
411 //if (!$error && !$notrigger) {
412 // Uncomment this and change MYOBJECT to your own tag if you
413 // want this action calls a trigger.
414
416 //$result=$this->call_trigger('MYOBJECT_DELETE',$user);
417 //if ($result < 0) { $error++; //Do also what you must do to rollback action if trigger fail}
419 //}
420
421 if (!$error) {
422 $sql = 'DELETE FROM '.$this->db->prefix().$this->table_element;
423 $sql .= ' WHERE rowid='.((int) $this->id);
424
425 $resql = $this->db->query($sql);
426 if (!$resql) {
427 $error++;
428 $this->errors[] = 'Error '.$this->db->lasterror();
429 dol_syslog(__METHOD__.' '.implode(',', $this->errors), LOG_ERR);
430 }
431 }
432
433 // Commit or rollback
434 if ($error) {
435 $this->db->rollback();
436
437 return -1 * $error;
438 } else {
439 $this->db->commit();
440
441 return 1;
442 }
443 }
444
452 public function createFromClone(User $user, $fromid)
453 {
454 dol_syslog(__METHOD__, LOG_DEBUG);
455
456 $error = 0;
457 $object = new ProductStockEntrepot($this->db);
458
459 $this->db->begin();
460
461 // Load source object
462 $object->fetch($fromid);
463 // Reset object
464 $object->id = 0;
465
466 // Clear fields
467 // ...
468
469 // Create clone
470 $object->context['createfromclone'] = 'createfromclone';
471 $result = $object->create($user);
472
473 // Other options
474 if ($result < 0) {
475 $error++;
476 $this->errors = $object->errors;
477 dol_syslog(__METHOD__.' '.implode(',', $this->errors), LOG_ERR);
478 }
479
480 unset($object->context['createfromclone']);
481
482 // End
483 if (!$error) {
484 $this->db->commit();
485
486 return $object->id;
487 } else {
488 $this->db->rollback();
489
490 return -1;
491 }
492 }
493
505 public function getNomUrl($withpicto = 0, $option = '', $notooltip = 0, $maxlen = 24, $morecss = '')
506 {
507 global $langs, $conf, $db;
508 global $dolibarr_main_authentication, $dolibarr_main_demo;
509 global $menumanager;
510
511
512 $result = '';
513 $companylink = '';
514
515 $label = '<u>'.$langs->trans("MyModule").'</u>';
516 $label .= '<div width="100%">';
517 $label .= '<b>'.$langs->trans('Ref').':</b> '.$this->ref;
518
519 $link = '<a href="'.DOL_URL_ROOT.'/ProductEntrepot/card.php?id='.$this->id.'"';
520 $link .= ($notooltip ? '' : ' title="'.dol_escape_htmltag($label, 1).'" class="classfortooltip'.($morecss ? ' '.$morecss : '').'"');
521 $link .= '>';
522 $linkend = '</a>';
523
524 if ($withpicto) {
525 $result .= ($link.img_object(($notooltip ? '' : $label), 'label', ($notooltip ? '' : 'class="classfortooltip"'), 0, 0, $notooltip ? 0 : 1).$linkend);
526 if ($withpicto != 2) {
527 $result .= ' ';
528 }
529 }
530 $result .= $link.$this->ref.$linkend;
531 return $result;
532 }
533
540 public function getLibStatut($mode = 0)
541 {
542 return $this->LibStatut($this->status, $mode);
543 }
544
545 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
553 public function LibStatut($status, $mode = 0)
554 {
555 // phpcs:enable
556 global $langs;
557
558 if ($mode == 0) {
559 if ($status == 1) {
560 return $langs->trans('Enabled');
561 } elseif ($status == 0) {
562 return $langs->trans('Disabled');
563 }
564 } elseif ($mode == 1) {
565 if ($status == 1) {
566 return $langs->trans('Enabled');
567 } elseif ($status == 0) {
568 return $langs->trans('Disabled');
569 }
570 } elseif ($mode == 2) {
571 if ($status == 1) {
572 return img_picto($langs->trans('Enabled'), 'statut4').' '.$langs->trans('Enabled');
573 } elseif ($status == 0) {
574 return img_picto($langs->trans('Disabled'), 'statut5').' '.$langs->trans('Disabled');
575 }
576 } elseif ($mode == 3) {
577 if ($status == 1) {
578 return img_picto($langs->trans('Enabled'), 'statut4');
579 } elseif ($status == 0) {
580 return img_picto($langs->trans('Disabled'), 'statut5');
581 }
582 } elseif ($mode == 4) {
583 if ($status == 1) {
584 return img_picto($langs->trans('Enabled'), 'statut4').' '.$langs->trans('Enabled');
585 } elseif ($status == 0) {
586 return img_picto($langs->trans('Disabled'), 'statut5').' '.$langs->trans('Disabled');
587 }
588 } elseif ($mode == 5) {
589 if ($status == 1) {
590 return $langs->trans('Enabled').' '.img_picto($langs->trans('Enabled'), 'statut4');
591 } elseif ($status == 0) {
592 return $langs->trans('Disabled').' '.img_picto($langs->trans('Disabled'), 'statut5');
593 }
594 }
595
596 return '';
597 }
598
599
606 public function initAsSpecimen()
607 {
608 $this->id = 0;
609
610 $this->tms = '';
611 $this->fk_product = null;
612 $this->fk_entrepot = null;
613 $this->seuil_stock_alerte = '';
614 $this->desiredstock = '';
615 $this->import_key = '';
616 }
617}
Parent class of all other business classes (invoices, contracts, proposals, orders,...
fetch_optionals($rowid=null, $optionsArray=null)
Function to get extra fields of an object into $this->array_options This method is in most cases call...
Class to manage Dolibarr database access.
Class ProductStockEntrepot.
create(User $user, $notrigger=false)
Create object into database.
fetch($id, $fk_product=0, $fk_entrepot=0)
Load object in memory from the database.
update(User $user, $notrigger=false)
Update object into database.
initAsSpecimen()
Initialise object with example values Id must be 0 if object instance is a specimen.
__construct(DoliDB $db)
Constructor.
getNomUrl($withpicto=0, $option='', $notooltip=0, $maxlen=24, $morecss='')
Return a link to the user card (with optionaly the picto) Use this->id,this->lastname,...
getLibStatut($mode=0)
Return the label of the status.
createFromClone(User $user, $fromid)
Load an object from its id and create a new one in database.
fetchAll($fk_product='', $fk_entrepot='', $sortorder='', $sortfield='', $limit=0, $offset=0, array $filter=array(), $filtermode='AND')
Load object in memory from the database.
LibStatut($status, $mode=0)
Renvoi le libelle d'un status donne.
Class to manage Dolibarr users.
dol_now($mode='auto')
Return date for now.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.