dolibarr 20.0.0
inventory.class.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2007-2019 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) 2024 Frédéric France <frederic.france@free.fr>
7 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 3 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program. If not, see <https://www.gnu.org/licenses/>.
21 */
22
29// Put here all includes required by your class file
30require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php';
31require_once DOL_DOCUMENT_ROOT.'/core/class/commonobjectline.class.php';
32//require_once DOL_DOCUMENT_ROOT . '/societe/class/societe.class.php';
33//require_once DOL_DOCUMENT_ROOT . '/product/class/product.class.php';
34
40{
44 public $element = 'inventory';
45
49 public $table_element = 'inventory';
50
54 public $picto = 'inventory';
55
56 const STATUS_DRAFT = 0; // Draft
57 const STATUS_VALIDATED = 1; // Inventory is in process
58 const STATUS_RECORDED = 2; // Inventory is finisged. Stock movement has been recorded.
59 const STATUS_CANCELED = 9; // Canceled
60
87 // BEGIN MODULEBUILDER PROPERTIES
91 public $fields = array(
92 'rowid' => array('type' => 'integer', 'label' => 'TechnicalID', 'visible' => -1, 'enabled' => 1, 'position' => 1, 'notnull' => 1, 'index' => 1, 'comment' => 'Id',),
93 'ref' => array('type' => 'varchar(64)', 'label' => 'Ref', 'visible' => 1, 'enabled' => 1, 'position' => 10, 'notnull' => 1, 'index' => 1, 'searchall' => 1, 'comment' => 'Reference of object', 'css' => 'maxwidth150'),
94 'entity' => array('type' => 'integer', 'label' => 'Entity', 'visible' => 0, 'enabled' => 1, 'position' => 20, 'notnull' => 1, 'index' => 1,),
95 'title' => array('type' => 'varchar(255)', 'label' => 'Label', 'visible' => 1, 'enabled' => 1, 'position' => 25, 'css' => 'minwidth300', 'csslist' => 'tdoverflowmax150', 'alwayseditable' => 1),
96 'fk_warehouse' => array('type' => 'integer:Entrepot:product/stock/class/entrepot.class.php', 'label' => 'Warehouse', 'visible' => 1, 'enabled' => 1, 'position' => 30, 'index' => 1, 'help' => 'InventoryForASpecificWarehouse', 'picto' => 'stock', 'css' => 'minwidth300 maxwidth500 widthcentpercentminusx', 'csslist' => 'tdoverflowmax150'),
97 'fk_product' => array('type' => 'integer:Product:product/class/product.class.php', 'label' => 'Product', 'get_name_url_params' => '0::0:-1:0::1', 'visible' => 1, 'enabled' => 1, 'position' => 32, 'index' => 1, 'help' => 'InventoryForASpecificProduct', 'picto' => 'product', 'css' => 'minwidth300 maxwidth500 widthcentpercentminusx', 'csslist' => 'tdoverflowmax150'),
98 'categories_product' => array('type' => 'chkbxlst:categorie:label:rowid::type=0:0:', 'label' => 'OrProductsWithCategories', 'visible' => 3, 'enabled' => 1, 'position' => 33, 'help' => '', 'picto' => 'category', 'css' => 'minwidth300 maxwidth500 widthcentpercentminusx'),
99 'date_inventory' => array('type' => 'date', 'label' => 'DateValue', 'visible' => 1, 'enabled' => '$conf->global->STOCK_INVENTORY_ADD_A_VALUE_DATE', 'position' => 35, 'csslist' => 'nowraponall'), // This date is not used so disabled by default.
100 'date_creation' => array('type' => 'datetime', 'label' => 'DateCreation', 'enabled' => 1, 'visible' => -2, 'notnull' => 1, 'position' => 500, 'csslist' => 'nowraponall'),
101 'tms' => array('type' => 'timestamp', 'label' => 'DateModification', 'enabled' => 1, 'visible' => -2, 'notnull' => 1, 'position' => 501, 'csslist' => 'nowraponall'),
102 'date_validation' => array('type' => 'datetime', 'label' => 'DateValidation', 'visible' => -2, 'enabled' => 1, 'position' => 502, 'csslist' => 'nowraponall'),
103 'fk_user_creat' => array('type' => 'integer:User:user/class/user.class.php', 'label' => 'UserAuthor', 'enabled' => 1, 'visible' => -2, 'notnull' => 1, 'position' => 510, 'foreignkey' => 'user.rowid', 'csslist' => 'tdoverflowmax150'),
104 'fk_user_modif' => array('type' => 'integer:User:user/class/user.class.php', 'label' => 'UserModif', 'enabled' => 1, 'visible' => -2, 'notnull' => -1, 'position' => 511, 'csslist' => 'tdoverflowmax150'),
105 'fk_user_valid' => array('type' => 'integer:User:user/class/user.class.php', 'label' => 'UserValidation', 'visible' => -2, 'enabled' => 1, 'position' => 512, 'csslist' => 'tdoverflowmax150'),
106 'import_key' => array('type' => 'varchar(14)', 'label' => 'ImportId', 'enabled' => 1, 'visible' => -2, 'notnull' => -1, 'index' => 0, 'position' => 1000),
107 'status' => array('type' => 'integer', 'label' => 'Status', 'visible' => 4, 'enabled' => 1, 'position' => 1000, 'notnull' => 1, 'default' => '0', 'index' => 1, 'arrayofkeyval' => array(0 => 'Draft', 1 => 'Validated', 2 => 'Closed', 9 => 'Canceled'))
108 );
109
113 public $rowid;
114
118 public $ref;
119
123 public $entity;
124
128 public $fk_warehouse;
129
133 public $fk_product;
134
138 public $categories_product;
139 public $date_inventory;
140 public $title;
141
145 public $status;
146
150 public $date_creation;
151
155 public $date_validation;
156
160 public $fk_user_creat;
161
165 public $fk_user_modif;
166
170 public $fk_user_valid;
171
175 public $import_key;
176 // END MODULEBUILDER PROPERTIES
177
178
179
180 // If this object has a subtable with lines
181
185 public $table_element_line = 'inventorydet';
186
190 public $fk_element = 'fk_inventory';
191
195 public $class_element_line = 'Inventoryline';
196
200 protected $childtables = array();
204 protected $childtablesoncascade = array('inventorydet');
205
209 public $lines = array();
210
211
212
218 public function __construct(DoliDB $db)
219 {
220 global $conf;
221
222 $this->db = $db;
223
224 $this->ismultientitymanaged = 1;
225 $this->isextrafieldmanaged = 0;
226
227 if (!getDolGlobalString('MAIN_SHOW_TECHNICAL_ID')) {
228 $this->fields['rowid']['visible'] = 0;
229 }
230 if (!isModEnabled('multicompany')) {
231 $this->fields['entity']['enabled'] = 0;
232 }
233 }
234
235
243 public function create(User $user, $notrigger = 0)
244 {
245 $result = $this->createCommon($user, $notrigger);
246
247 return $result;
248 }
249
258 public function validate(User $user, $notrigger = 0, $include_sub_warehouse = 0)
259 {
260 $this->db->begin();
261
262 $result = 0;
263
264 if ($this->status == self::STATUS_DRAFT) {
265 // Delete inventory
266 $sql = 'DELETE FROM '.$this->db->prefix().'inventorydet WHERE fk_inventory = '.((int) $this->id);
267 $resql = $this->db->query($sql);
268 if (!$resql) {
269 $this->error = $this->db->lasterror();
270 $this->db->rollback();
271 return -1;
272 }
273
274 // Scan existing stock to prefill the inventory
275 $sql = "SELECT ps.rowid, ps.fk_entrepot as fk_warehouse, ps.fk_product, ps.reel,";
276 if (isModEnabled('productbatch')) {
277 $sql .= " pb.batch as batch, pb.qty as qty,";
278 } else {
279 $sql .= " '' as batch, 0 as qty,";
280 }
281 $sql .= " p.ref, p.tobatch";
282 $sql .= " FROM ".$this->db->prefix()."product_stock as ps";
283 if (isModEnabled('productbatch')) {
284 $sql .= " LEFT JOIN ".$this->db->prefix()."product_batch as pb ON pb.fk_product_stock = ps.rowid";
285 }
286 $sql .= ", ".$this->db->prefix()."product as p, ".$this->db->prefix()."entrepot as e";
287 $sql .= " WHERE p.entity IN (".getEntity('product').")";
288 $sql .= " AND ps.fk_product = p.rowid AND ps.fk_entrepot = e.rowid";
289 if (!getDolGlobalString('STOCK_SUPPORTS_SERVICES')) {
290 $sql .= " AND p.fk_product_type = 0";
291 }
292 if ($this->fk_product > 0) {
293 $sql .= " AND ps.fk_product = ".((int) $this->fk_product);
294 }
295 if ($this->fk_warehouse > 0) {
296 $sql .= " AND (ps.fk_entrepot = ".((int) $this->fk_warehouse);
297 if (!empty($include_sub_warehouse) && getDolGlobalInt('INVENTORY_INCLUDE_SUB_WAREHOUSE')) {
298 $TChildWarehouses = array();
299 $this->getChildWarehouse($this->fk_warehouse, $TChildWarehouses);
300 $sql .= " OR ps.fk_entrepot IN (".$this->db->sanitize(implode(',', $TChildWarehouses)).")";
301 }
302 $sql .= ')';
303 }
304 if (!empty($this->categories_product)) {
305 $sql .= " AND EXISTS (";
306 $sql .= " SELECT cp.fk_product";
307 $sql .= " FROM ".$this->db->prefix()."categorie_product AS cp";
308 $sql .= " WHERE cp.fk_product = ps.fk_product";
309 $sql .= " AND cp.fk_categorie IN (".$this->db->sanitize($this->categories_product).")";
310 $sql .= ")";
311 }
312 if (getDolGlobalInt('PRODUIT_SOUSPRODUITS')) {
313 $sql .= " AND NOT EXISTS (";
314 $sql .= " SELECT pa.rowid";
315 $sql .= " FROM ".$this->db->prefix()."product_association as pa";
316 $sql .= " WHERE pa.fk_product_pere = ps.fk_product";
317 $sql .= ")";
318 }
319 $sql .= " ORDER BY p.rowid";
320
321 $inventoryline = new InventoryLine($this->db);
322
323 $resql = $this->db->query($sql);
324 if ($resql) {
325 $num = $this->db->num_rows($resql);
326
327 $i = 0;
328 while ($i < $num) {
329 $obj = $this->db->fetch_object($resql);
330
331 $inventoryline->fk_inventory = $this->id;
332 $inventoryline->fk_warehouse = $obj->fk_warehouse;
333 $inventoryline->fk_product = $obj->fk_product;
334 $inventoryline->batch = $obj->batch;
335 $inventoryline->datec = dol_now();
336
337 if (isModEnabled('productbatch')) {
338 if ($obj->batch && empty($obj->tobatch)) {
339 // Bad consistency of data. The product is not a product with lot/serial but we found a stock for some lot/serial.
340 $result = -2;
341 $this->error = 'The product ID='.$obj->ref." has stock with lot/serial but is configured to not manage lot/serial. You must first fix this, this way: Set the product to have 'Management of Lot/Serial' to Yes, then set it back to 'Management of Lot/Serial to No";
342 break;
343 }
344
345 $inventoryline->qty_stock = ($obj->batch ? $obj->qty : $obj->reel); // If there is batch detail, we take qty for batch, else global qty
346 } else {
347 $inventoryline->qty_stock = $obj->reel;
348 }
349 //var_dump($obj->batch.' '.$obj->qty.' '.$obj->reel.' '.$this->error);exit;
350
351 $resultline = $inventoryline->create($user);
352 if ($resultline <= 0) {
353 $this->error = $inventoryline->error;
354 $this->errors = $inventoryline->errors;
355 $result = -1;
356 break;
357 }
358
359 $i++;
360 }
361 } else {
362 $result = -1;
363 $this->error = $this->db->lasterror();
364 }
365 }
366
367 if ($result >= 0) {
368 $result = $this->setStatut($this::STATUS_VALIDATED, null, '', 'INVENTORY_VALIDATED');
369 }
370
371 if ($result > 0) {
372 $this->db->commit();
373 } else {
374 $this->db->rollback();
375 }
376 return $result;
377 }
378
386 public function setDraft(User $user, $notrigger = 0)
387 {
388 $this->db->begin();
389
390 // Delete inventory
391 $sql = 'DELETE FROM '.$this->db->prefix().'inventorydet WHERE fk_inventory = '.((int) $this->id);
392 $resql = $this->db->query($sql);
393 if (!$resql) {
394 $this->error = $this->db->lasterror();
395 $this->db->rollback();
396 return -1;
397 }
398
399 $result = $this->setStatut($this::STATUS_DRAFT, null, '', 'INVENTORY_DRAFT');
400
401 if ($result > 0) {
402 $this->db->commit();
403 } else {
404 $this->db->rollback();
405 }
406 return $result;
407 }
408
416 public function setRecorded(User $user, $notrigger = 0)
417 {
418 $this->db->begin();
419
420 $result = $this->setStatut($this::STATUS_RECORDED, null, '', 'INVENTORY_RECORDED');
421
422 if ($result > 0) {
423 $this->db->commit();
424 } else {
425 $this->db->rollback();
426 return -1;
427 }
428 return $result;
429 }
430
438 public function setCanceled(User $user, $notrigger = 0)
439 {
440 $this->db->begin();
441
442 $result = $this->setStatut($this::STATUS_CANCELED, null, '', 'INVENTORY_CANCELED');
443
444 if ($result > 0) {
445 $this->db->commit();
446 } else {
447 $this->db->rollback();
448 return -1;
449 }
450 return $result;
451 }
452
460 public function createFromClone(User $user, $fromid)
461 {
462 global $hookmanager, $langs;
463 $error = 0;
464
465 dol_syslog(__METHOD__, LOG_DEBUG);
466
467 $object = new self($this->db);
468
469 $this->db->begin();
470
471 // Load source object
472 $object->fetchCommon($fromid);
473 // Reset some properties
474 unset($object->id);
475 unset($object->fk_user_creat);
476 unset($object->import_key);
477
478 // Clear fields
479 $object->ref = "copy_of_".$object->ref;
480 $object->title = $langs->trans("CopyOf")." ".$object->title;
481 // ...
482
483 // Create clone
484 $object->context['createfromclone'] = 'createfromclone';
485 $result = $object->createCommon($user);
486 if ($result < 0) {
487 $error++;
488 $this->error = $object->error;
489 $this->errors = $object->errors;
490 }
491
492 unset($object->context['createfromclone']);
493
494 // End
495 if (!$error) {
496 $this->db->commit();
497 return $object;
498 } else {
499 $this->db->rollback();
500 return -1;
501 }
502 }
503
511 public function fetch($id, $ref = null)
512 {
513 $result = $this->fetchCommon($id, $ref);
514 //if ($result > 0 && !empty($this->table_element_line)) $this->fetchLines();
515 return $result;
516 }
517
523 /*public function fetchLines()
524 {
525 $this->lines=array();
526
527 // Load lines with object MyObjectLine
528
529 return count($this->lines)?1:0;
530 }*/
531
539 public function update(User $user, $notrigger = 0)
540 {
541 return $this->updateCommon($user, $notrigger);
542 }
543
551 public function delete(User $user, $notrigger = 0)
552 {
553 return $this->deleteCommon($user, $notrigger);
554 }
555
564 public function deleteLine(User $user, $idline, $notrigger = 0)
565 {
566 if ($this->status < 0) {
567 $this->error = 'ErrorDeleteLineNotAllowedByObjectStatus';
568 return -2;
569 }
570
571 return $this->deleteLineCommon($user, $idline, $notrigger);
572 }
573
584 public function getNomUrl($withpicto = 0, $option = '', $notooltip = 0, $morecss = '', $save_lastsearch_value = -1)
585 {
586 global $db, $conf, $langs;
587 global $dolibarr_main_authentication, $dolibarr_main_demo;
588 global $menumanager;
589
590 if (!empty($conf->dol_no_mouse_hover)) {
591 $notooltip = 1; // Force disable tooltips
592 }
593
594 $result = '';
595 $companylink = '';
596
597 $label = '<u>'.$langs->trans("Inventory").'</u>';
598 $label .= '<br>';
599 $label .= '<b>'.$langs->trans('Ref').':</b> '.$this->ref;
600
601 $url = dol_buildpath('/product/inventory/card.php', 1).'?id='.$this->id;
602
603 $linkclose = '';
604 if (empty($notooltip)) {
605 if (getDolGlobalString('MAIN_OPTIMIZEFORTEXTBROWSER')) {
606 $label = $langs->trans("ShowInventory");
607 $linkclose .= ' alt="'.dol_escape_htmltag($label, 1).'"';
608 }
609 $linkclose .= ' title="'.dol_escape_htmltag($label, 1).'"';
610 $linkclose .= ' class="classfortooltip'.($morecss ? ' '.$morecss : '').'"';
611 } else {
612 $linkclose = ($morecss ? ' class="'.$morecss.'"' : '');
613 }
614
615 $linkstart = '<a href="'.$url.'"';
616 $linkstart .= $linkclose.'>';
617 $linkend = '</a>';
618
619 $result .= $linkstart;
620 if ($withpicto) {
621 $result .= img_object(($notooltip ? '' : $label), ($this->picto ? $this->picto : 'generic'), ($notooltip ? (($withpicto != 2) ? 'class="paddingright"' : '') : 'class="'.(($withpicto != 2) ? 'paddingright ' : '').'classfortooltip"'), 0, 0, $notooltip ? 0 : 1);
622 }
623 if ($withpicto != 2) {
624 $result .= $this->ref;
625 }
626 $result .= $linkend;
627 //if ($withpicto != 2) $result.=(($addlabel && $this->label) ? $sep . dol_trunc($this->label, ($addlabel > 1 ? $addlabel : 0)) : '');
628
629 return $result;
630 }
631
638 public function getLibStatut($mode = 0)
639 {
640 return $this->LibStatut($this->status, $mode);
641 }
642
643 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
651 public static function LibStatut($status, $mode = 0)
652 {
653 // phpcs:enable
654 global $langs;
655
656 $labelStatus = array();
657 $labelStatusShort = array();
658 $labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
659 $labelStatus[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Validated').' ('.$langs->transnoentitiesnoconv('InventoryStartedShort').')';
660 $labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Canceled');
661 $labelStatus[self::STATUS_RECORDED] = $langs->transnoentitiesnoconv('Closed');
662 $labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
663 $labelStatusShort[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('InventoryStartedShort');
664 $labelStatusShort[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Canceled');
665 $labelStatusShort[self::STATUS_RECORDED] = $langs->transnoentitiesnoconv('Closed');
666
667 $statusType = 'status'.$status;
668 if ($status == self::STATUS_RECORDED) {
669 $statusType = 'status6';
670 }
671
672 return dolGetStatus($labelStatus[$status], $labelStatusShort[$status], '', $statusType, $mode);
673 }
674
682 public function getKanbanView($option = '', $arraydata = null)
683 {
684 global $conf, $langs;
685
686 $selected = (empty($arraydata['selected']) ? 0 : $arraydata['selected']);
687
688 $return = '<div class="box-flex-item box-flex-grow-zero">';
689 $return .= '<div class="info-box info-box-sm">';
690 $return .= '<span class="info-box-icon bg-infobox-action">';
691 $return .= img_picto('', $this->picto);
692 $return .= '</span>';
693 $return .= '<div class="info-box-content">';
694 $return .= '<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">'.(method_exists($this, 'getNomUrl') ? $this->getNomUrl() : $this->ref).'</span>';
695 if ($selected >= 0) {
696 $return .= '<input id="cb'.$this->id.'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->id.'"'.($selected ? ' checked="checked"' : '').'>';
697 }
698 if (property_exists($this, 'label')) {
699 $return .= ' <div class="inline-block opacitymedium valignmiddle tdoverflowmax100">'.$this->label.'</div>';
700 }
701 if (property_exists($this, 'amount')) {
702 $return .= '<br>';
703 $return .= '<span class="info-box-label amount">'.price($this->amount, 0, $langs, 1, -1, -1, $conf->currency).'</span>';
704 }
705 if (method_exists($this, 'getLibStatut')) {
706 $return .= '<br><div class="info-box-status">'.$this->getLibStatut(3).'</div>';
707 }
708 $return .= '</div>';
709 $return .= '</div>';
710 $return .= '</div>';
711
712 return $return;
713 }
714
721 public function info($id)
722 {
723 $sql = "SELECT rowid, date_creation as datec, tms as datem, date_validation as datev,";
724 $sql .= " fk_user_creat, fk_user_modif, fk_user_valid";
725 $sql .= " FROM ".$this->db->prefix().$this->table_element." as t";
726 $sql .= " WHERE t.rowid = ".((int) $id);
727 $result = $this->db->query($sql);
728 if ($result) {
729 if ($this->db->num_rows($result)) {
730 $obj = $this->db->fetch_object($result);
731
732 $this->id = $obj->rowid;
733
734 $this->user_creation_id = $obj->fk_user_creat;
735 $this->user_modification_id = $obj->fk_user_modif;
736 $this->user_validation_id = $obj->fk_user_valid;
737
738 $this->date_creation = $this->db->jdate($obj->datec);
739 $this->date_modification = $this->db->jdate($obj->datem);
740 $this->date_validation = $this->db->jdate($obj->datev);
741 }
742
743 $this->db->free($result);
744 } else {
745 dol_print_error($this->db);
746 }
747 }
748
755 public function initAsSpecimen()
756 {
757 $ret = $this->initAsSpecimenCommon();
758 $this->title = '';
759
760 return $ret;
761 }
762
770 public function getChildWarehouse($id, &$TChildWarehouse)
771 {
772 $sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.'entrepot';
773 $sql .= ' WHERE fk_parent='.(int) $id;
774 $sql .= ' ORDER BY rowid';
775 $resql = $this->db->query($sql);
776 if ($resql && $this->db->num_rows($resql) > 0) {
777 while ($obj = $this->db->fetch_object($resql)) {
778 $TChildWarehouse[] = $obj->rowid;
779 $this->getChildWarehouse($obj->rowid, $TChildWarehouse);
780 }
781 return 1;
782 } else {
783 return -1;
784 }
785 }
786}
787
792{
796 public $element = 'inventoryline';
797
801 public $table_element = 'inventorydet';
802
806 public $parent_element = 'inventory';
807
811 public $fk_parent_attribute = 'fk_inventory';
812
816 public $picto = 'stock';
817
835 // BEGIN MODULEBUILDER PROPERTIES
839 public $fields = array(
840 'rowid' => array('type' => 'integer', 'label' => 'TechnicalID', 'visible' => -1, 'enabled' => 1, 'position' => 1, 'notnull' => 1, 'index' => 1, 'comment' => 'Id',),
841 'fk_inventory' => array('type' => 'integer:Inventory:product/inventory/class/inventory.class.php', 'label' => 'Inventory', 'visible' => 1, 'enabled' => 1, 'position' => 30, 'index' => 1, 'help' => 'LinkToInventory'),
842 'fk_warehouse' => array('type' => 'integer:Entrepot:product/stock/class/entrepot.class.php', 'label' => 'Warehouse', 'visible' => 1, 'enabled' => 1, 'position' => 30, 'index' => 1, 'help' => 'LinkToThirdparty'),
843 'fk_product' => array('type' => 'integer:Product:product/class/product.class.php', 'label' => 'Product', 'visible' => 1, 'enabled' => 1, 'position' => 32, 'index' => 1, 'help' => 'LinkToProduct'),
844 'batch' => array('type' => 'string', 'label' => 'Batch', 'visible' => 1, 'enabled' => 1, 'position' => 32, 'index' => 1, 'help' => 'LinkToProduct'),
845 'datec' => array('type' => 'datetime', 'label' => 'DateCreation', 'enabled' => 1, 'visible' => -2, 'notnull' => 1, 'position' => 500),
846 'tms' => array('type' => 'timestamp', 'label' => 'DateModification', 'enabled' => 1, 'visible' => -2, 'notnull' => 1, 'position' => 501),
847 'qty_stock' => array('type' => 'double', 'label' => 'QtyFound', 'visible' => 1, 'enabled' => 1, 'position' => 32, 'index' => 1, 'help' => 'Qty we found/want (to define during draft edition)'),
848 'qty_view' => array('type' => 'double', 'label' => 'QtyBefore', 'visible' => 1, 'enabled' => 1, 'position' => 33, 'index' => 1, 'help' => 'Qty before (filled once movements are validated)'),
849 'qty_regulated' => array('type' => 'double', 'label' => 'QtyDelta', 'visible' => 1, 'enabled' => 1, 'position' => 34, 'index' => 1, 'help' => 'Qty added or removed (filled once movements are validated)'),
850 'pmp_real' => array('type' => 'double', 'label' => 'PMPReal', 'visible' => 1, 'enabled' => 1, 'position' => 35),
851 'pmp_expected' => array('type' => 'double', 'label' => 'PMPExpected', 'visible' => 1, 'enabled' => 1, 'position' => 36),
852 );
853
857 public $rowid;
858
859 public $fk_inventory;
860 public $fk_warehouse;
861 public $fk_product;
862 public $batch;
863 public $datec;
864
868 public $qty_stock;
869
873 public $qty_view;
874
878 public $qty_regulated;
879
880 public $pmp_real;
881 public $pmp_expected;
882
888 public function __construct($db)
889 {
890 $this->db = $db;
891 $this->ismultientitymanaged = 0;
892
893 $this->isextrafieldmanaged = 0;
894 }
902 public function create(User $user, $notrigger = 0)
903 {
904 return $this->createCommon($user, $notrigger);
905 }
906
914 public function fetch($id, $ref = null)
915 {
916 $result = $this->fetchCommon($id, $ref);
917 //if ($result > 0 && !empty($this->table_element_line)) $this->fetchLines();
918 return $result;
919 }
920
928 public function update(User $user, $notrigger = 0)
929 {
930 return $this->updateCommon($user, $notrigger);
931 }
932
940 public function delete(User $user, $notrigger = 0)
941 {
942 return $this->deleteCommon($user, $notrigger);
943 //return $this->deleteCommon($user, $notrigger, 1);
944 }
945}
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:58
print $langs trans("AuditedSecurityEvents").'</strong >< span class="opacitymedium"></span >< br > status
Or an array listing all the potential status of the object: array: int of the status => translated la...
Definition security.php:636
Parent class of all other business classes (invoices, contracts, proposals, orders,...
deleteLineCommon(User $user, $idline, $notrigger=0)
Delete a line of object in database.
createCommon(User $user, $notrigger=0)
Create object in the database.
setStatut($status, $elementId=null, $elementType='', $trigkey='', $fieldstatus='fk_statut')
Set status of an object.
updateCommon(User $user, $notrigger=0)
Update object into database.
initAsSpecimenCommon()
Initialise object with example values Id must be 0 if object instance is a specimen.
fetchCommon($id, $ref=null, $morewhere='', $noextrafields=0)
Load object in memory from the database.
deleteCommon(User $user, $notrigger=0, $forcechilddeletion=0)
Delete object in database.
Parent class for class inheritance lines of business objects This class is useless for the moment so ...
Class to manage Dolibarr database access.
Class for Inventory.
getNomUrl($withpicto=0, $option='', $notooltip=0, $morecss='', $save_lastsearch_value=-1)
Return a link to the object card (with optionally the picto)
create(User $user, $notrigger=0)
Create object into database.
setRecorded(User $user, $notrigger=0)
Set to inventory to status "Closed".
getKanbanView($option='', $arraydata=null)
Return a thumb for kanban views.
__construct(DoliDB $db)
Constructor.
getLibStatut($mode=0)
Return the label of the status.
info($id)
Charge les information d'ordre info dans l'objet commande.
setDraft(User $user, $notrigger=0)
Go back to draft.
update(User $user, $notrigger=0)
Load object lines in memory from the database.
setCanceled(User $user, $notrigger=0)
Set to Canceled.
validate(User $user, $notrigger=0, $include_sub_warehouse=0)
Validate inventory (start it)
initAsSpecimen()
Initialise object with example values Id must be 0 if object instance is a specimen.
deleteLine(User $user, $idline, $notrigger=0)
Delete a line of object in database.
fetch($id, $ref=null)
Load object in memory from the database.
getChildWarehouse($id, &$TChildWarehouse)
Return the child warehouse of the current one.
static LibStatut($status, $mode=0)
Return the status.
createFromClone(User $user, $fromid)
Clone and object into another one.
Class InventoryLine.
update(User $user, $notrigger=0)
Update object into database.
__construct($db)
Constructor.
create(User $user, $notrigger=0)
Create object in database.
fetch($id, $ref=null)
Load object in memory from the database.
Class to manage Dolibarr users.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.