dolibarr 21.0.0-alpha
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 $fk_user_creat;
151
155 public $fk_user_modif;
156
160 public $fk_user_valid;
161
165 public $import_key;
166 // END MODULEBUILDER PROPERTIES
167
168
169
170 // If this object has a subtable with lines
171
175 public $table_element_line = 'inventorydet';
176
180 public $fk_element = 'fk_inventory';
181
185 public $class_element_line = 'Inventoryline';
186
190 protected $childtables = array();
194 protected $childtablesoncascade = array('inventorydet');
195
199 public $lines = array();
200
201
202
208 public function __construct(DoliDB $db)
209 {
210 global $conf;
211
212 $this->db = $db;
213
214 $this->ismultientitymanaged = 1;
215 $this->isextrafieldmanaged = 0;
216
217 if (!getDolGlobalString('MAIN_SHOW_TECHNICAL_ID')) {
218 $this->fields['rowid']['visible'] = 0;
219 }
220 if (!isModEnabled('multicompany')) {
221 $this->fields['entity']['enabled'] = 0;
222 }
223 }
224
225
233 public function create(User $user, $notrigger = 0)
234 {
235 $result = $this->createCommon($user, $notrigger);
236
237 return $result;
238 }
239
248 public function validate(User $user, $notrigger = 0, $include_sub_warehouse = 0)
249 {
250 $this->db->begin();
251
252 $result = 0;
253
254 if ($this->status == self::STATUS_DRAFT) {
255 // Delete inventory
256 $sql = 'DELETE FROM '.$this->db->prefix().'inventorydet WHERE fk_inventory = '.((int) $this->id);
257 $resql = $this->db->query($sql);
258 if (!$resql) {
259 $this->error = $this->db->lasterror();
260 $this->db->rollback();
261 return -1;
262 }
263
264 // Scan existing stock to prefill the inventory
265 $sql = "SELECT ps.rowid, ps.fk_entrepot as fk_warehouse, ps.fk_product, ps.reel,";
266 if (isModEnabled('productbatch')) {
267 $sql .= " pb.batch as batch, pb.qty as qty,";
268 } else {
269 $sql .= " '' as batch, 0 as qty,";
270 }
271 $sql .= " p.ref, p.tobatch";
272 $sql .= " FROM ".$this->db->prefix()."product_stock as ps";
273 if (isModEnabled('productbatch')) {
274 $sql .= " LEFT JOIN ".$this->db->prefix()."product_batch as pb ON pb.fk_product_stock = ps.rowid";
275 }
276 $sql .= ", ".$this->db->prefix()."product as p, ".$this->db->prefix()."entrepot as e";
277 $sql .= " WHERE p.entity IN (".getEntity('product').")";
278 $sql .= " AND ps.fk_product = p.rowid AND ps.fk_entrepot = e.rowid";
279 if (!getDolGlobalString('STOCK_SUPPORTS_SERVICES')) {
280 $sql .= " AND p.fk_product_type = 0";
281 }
282 if ($this->fk_product > 0) {
283 $sql .= " AND ps.fk_product = ".((int) $this->fk_product);
284 }
285 if ($this->fk_warehouse > 0) {
286 $sql .= " AND (ps.fk_entrepot = ".((int) $this->fk_warehouse);
287 if (!empty($include_sub_warehouse) && getDolGlobalInt('INVENTORY_INCLUDE_SUB_WAREHOUSE')) {
288 $TChildWarehouses = array();
289 $this->getChildWarehouse($this->fk_warehouse, $TChildWarehouses);
290 $sql .= " OR ps.fk_entrepot IN (".$this->db->sanitize(implode(',', $TChildWarehouses)).")";
291 }
292 $sql .= ')';
293 }
294 if (!empty($this->categories_product)) {
295 $sql .= " AND EXISTS (";
296 $sql .= " SELECT cp.fk_product";
297 $sql .= " FROM ".$this->db->prefix()."categorie_product AS cp";
298 $sql .= " WHERE cp.fk_product = ps.fk_product";
299 $sql .= " AND cp.fk_categorie IN (".$this->db->sanitize($this->categories_product).")";
300 $sql .= ")";
301 }
302 if (getDolGlobalInt('PRODUIT_SOUSPRODUITS')) {
303 $sql .= " AND NOT EXISTS (";
304 $sql .= " SELECT pa.rowid";
305 $sql .= " FROM ".$this->db->prefix()."product_association as pa";
306 $sql .= " WHERE pa.fk_product_pere = ps.fk_product";
307 $sql .= ")";
308 }
309 $sql .= " ORDER BY p.rowid";
310
311 $inventoryline = new InventoryLine($this->db);
312
313 $resql = $this->db->query($sql);
314 if ($resql) {
315 $num = $this->db->num_rows($resql);
316
317 $i = 0;
318 while ($i < $num) {
319 $obj = $this->db->fetch_object($resql);
320
321 $inventoryline->fk_inventory = $this->id;
322 $inventoryline->fk_warehouse = $obj->fk_warehouse;
323 $inventoryline->fk_product = $obj->fk_product;
324 $inventoryline->batch = $obj->batch;
325 $inventoryline->datec = dol_now();
326
327 if (isModEnabled('productbatch')) {
328 if ($obj->batch && empty($obj->tobatch)) {
329 // Bad consistency of data. The product is not a product with lot/serial but we found a stock for some lot/serial.
330 $result = -2;
331 $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";
332 break;
333 }
334
335 $inventoryline->qty_stock = ($obj->batch ? $obj->qty : $obj->reel); // If there is batch detail, we take qty for batch, else global qty
336 } else {
337 $inventoryline->qty_stock = $obj->reel;
338 }
339 //var_dump($obj->batch.' '.$obj->qty.' '.$obj->reel.' '.$this->error);exit;
340
341 $resultline = $inventoryline->create($user);
342 if ($resultline <= 0) {
343 $this->error = $inventoryline->error;
344 $this->errors = $inventoryline->errors;
345 $result = -1;
346 break;
347 }
348
349 $i++;
350 }
351 } else {
352 $result = -1;
353 $this->error = $this->db->lasterror();
354 }
355 }
356
357 if ($result >= 0) {
358 $result = $this->setStatut($this::STATUS_VALIDATED, null, '', 'INVENTORY_VALIDATED');
359 }
360
361 if ($result > 0) {
362 $this->db->commit();
363 } else {
364 $this->db->rollback();
365 }
366 return $result;
367 }
368
376 public function setDraft(User $user, $notrigger = 0)
377 {
378 $this->db->begin();
379
380 // Delete inventory
381 $sql = 'DELETE FROM '.$this->db->prefix().'inventorydet WHERE fk_inventory = '.((int) $this->id);
382 $resql = $this->db->query($sql);
383 if (!$resql) {
384 $this->error = $this->db->lasterror();
385 $this->db->rollback();
386 return -1;
387 }
388
389 $result = $this->setStatut($this::STATUS_DRAFT, null, '', 'INVENTORY_DRAFT');
390
391 if ($result > 0) {
392 $this->db->commit();
393 } else {
394 $this->db->rollback();
395 }
396 return $result;
397 }
398
406 public function setRecorded(User $user, $notrigger = 0)
407 {
408 $this->db->begin();
409
410 $result = $this->setStatut($this::STATUS_RECORDED, null, '', 'INVENTORY_RECORDED');
411
412 if ($result > 0) {
413 $this->db->commit();
414 } else {
415 $this->db->rollback();
416 return -1;
417 }
418 return $result;
419 }
420
428 public function setCanceled(User $user, $notrigger = 0)
429 {
430 $this->db->begin();
431
432 $result = $this->setStatut($this::STATUS_CANCELED, null, '', 'INVENTORY_CANCELED');
433
434 if ($result > 0) {
435 $this->db->commit();
436 } else {
437 $this->db->rollback();
438 return -1;
439 }
440 return $result;
441 }
442
450 public function createFromClone(User $user, $fromid)
451 {
452 global $hookmanager, $langs;
453 $error = 0;
454
455 dol_syslog(__METHOD__, LOG_DEBUG);
456
457 $object = new self($this->db);
458
459 $this->db->begin();
460
461 // Load source object
462 $object->fetchCommon($fromid);
463 // Reset some properties
464 unset($object->id);
465 unset($object->fk_user_creat);
466 unset($object->import_key);
467
468 // Clear fields
469 $object->ref = "copy_of_".$object->ref;
470 $object->title = $langs->trans("CopyOf")." ".$object->title;
471 // ...
472
473 // Create clone
474 $object->context['createfromclone'] = 'createfromclone';
475 $result = $object->createCommon($user);
476 if ($result < 0) {
477 $error++;
478 $this->error = $object->error;
479 $this->errors = $object->errors;
480 }
481
482 unset($object->context['createfromclone']);
483
484 // End
485 if (!$error) {
486 $this->db->commit();
487 return $object;
488 } else {
489 $this->db->rollback();
490 return -1;
491 }
492 }
493
501 public function fetch($id, $ref = null)
502 {
503 $result = $this->fetchCommon($id, $ref);
504 //if ($result > 0 && !empty($this->table_element_line)) $this->fetchLines();
505 return $result;
506 }
507
513 /*public function fetchLines()
514 {
515 $this->lines=array();
516
517 // Load lines with object MyObjectLine
518
519 return count($this->lines)?1:0;
520 }*/
521
529 public function update(User $user, $notrigger = 0)
530 {
531 return $this->updateCommon($user, $notrigger);
532 }
533
541 public function delete(User $user, $notrigger = 0)
542 {
543 return $this->deleteCommon($user, $notrigger);
544 }
545
554 public function deleteLine(User $user, $idline, $notrigger = 0)
555 {
556 if ($this->status < 0) {
557 $this->error = 'ErrorDeleteLineNotAllowedByObjectStatus';
558 return -2;
559 }
560
561 return $this->deleteLineCommon($user, $idline, $notrigger);
562 }
563
574 public function getNomUrl($withpicto = 0, $option = '', $notooltip = 0, $morecss = '', $save_lastsearch_value = -1)
575 {
576 global $db, $conf, $langs;
577 global $dolibarr_main_authentication, $dolibarr_main_demo;
578 global $menumanager;
579
580 if (!empty($conf->dol_no_mouse_hover)) {
581 $notooltip = 1; // Force disable tooltips
582 }
583
584 $result = '';
585 $companylink = '';
586
587 $label = '<u>'.$langs->trans("Inventory").'</u>';
588 $label .= '<br>';
589 $label .= '<b>'.$langs->trans('Ref').':</b> '.$this->ref;
590
591 $url = dol_buildpath('/product/inventory/card.php', 1).'?id='.$this->id;
592
593 $linkclose = '';
594 if (empty($notooltip)) {
595 if (getDolGlobalString('MAIN_OPTIMIZEFORTEXTBROWSER')) {
596 $label = $langs->trans("ShowInventory");
597 $linkclose .= ' alt="'.dol_escape_htmltag($label, 1).'"';
598 }
599 $linkclose .= ' title="'.dol_escape_htmltag($label, 1).'"';
600 $linkclose .= ' class="classfortooltip'.($morecss ? ' '.$morecss : '').'"';
601 } else {
602 $linkclose = ($morecss ? ' class="'.$morecss.'"' : '');
603 }
604
605 $linkstart = '<a href="'.$url.'"';
606 $linkstart .= $linkclose.'>';
607 $linkend = '</a>';
608
609 $result .= $linkstart;
610 if ($withpicto) {
611 $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);
612 }
613 if ($withpicto != 2) {
614 $result .= $this->ref;
615 }
616 $result .= $linkend;
617 //if ($withpicto != 2) $result.=(($addlabel && $this->label) ? $sep . dol_trunc($this->label, ($addlabel > 1 ? $addlabel : 0)) : '');
618
619 return $result;
620 }
621
628 public function getLibStatut($mode = 0)
629 {
630 return $this->LibStatut($this->status, $mode);
631 }
632
633 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
641 public function LibStatut($status, $mode = 0)
642 {
643 // phpcs:enable
644 global $langs, $hookmanager;
645
646 $labelStatus = array();
647 $labelStatusShort = array();
648 $labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
649 $labelStatus[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Validated').' ('.$langs->transnoentitiesnoconv('InventoryStartedShort').')';
650 $labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Canceled');
651 $labelStatus[self::STATUS_RECORDED] = $langs->transnoentitiesnoconv('Closed');
652 $labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
653 $labelStatusShort[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('InventoryStartedShort');
654 $labelStatusShort[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Canceled');
655 $labelStatusShort[self::STATUS_RECORDED] = $langs->transnoentitiesnoconv('Closed');
656
657 $statusType = 'status'.$status;
658 if ($status == self::STATUS_RECORDED) {
659 $statusType = 'status6';
660 }
661
662 $parameters = array('status' => $status, 'mode' => $mode);
663 $reshook = $hookmanager->executeHooks('LibStatut', $parameters, $this); // Note that $action and $object may have been modified by hook
664 if ($reshook > 0) {
665 return $hookmanager->resPrint;
666 }
667 return dolGetStatus($labelStatus[$status], $labelStatusShort[$status], '', $statusType, $mode);
668 }
669
677 public function getKanbanView($option = '', $arraydata = null)
678 {
679 global $conf, $langs;
680
681 $selected = (empty($arraydata['selected']) ? 0 : $arraydata['selected']);
682
683 $return = '<div class="box-flex-item box-flex-grow-zero">';
684 $return .= '<div class="info-box info-box-sm">';
685 $return .= '<span class="info-box-icon bg-infobox-action">';
686 $return .= img_picto('', $this->picto);
687 $return .= '</span>';
688 $return .= '<div class="info-box-content">';
689 $return .= '<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">'.(method_exists($this, 'getNomUrl') ? $this->getNomUrl() : $this->ref).'</span>';
690 if ($selected >= 0) {
691 $return .= '<input id="cb'.$this->id.'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->id.'"'.($selected ? ' checked="checked"' : '').'>';
692 }
693 if (property_exists($this, 'label')) {
694 $return .= ' <div class="inline-block opacitymedium valignmiddle tdoverflowmax100">'.$this->label.'</div>';
695 }
696 if (property_exists($this, 'amount')) {
697 $return .= '<br>';
698 $return .= '<span class="info-box-label amount">'.price($this->amount, 0, $langs, 1, -1, -1, $conf->currency).'</span>';
699 }
700 if (method_exists($this, 'getLibStatut')) {
701 $return .= '<br><div class="info-box-status">'.$this->getLibStatut(3).'</div>';
702 }
703 $return .= '</div>';
704 $return .= '</div>';
705 $return .= '</div>';
706
707 return $return;
708 }
709
716 public function info($id)
717 {
718 $sql = "SELECT rowid, date_creation as datec, tms as datem, date_validation as datev,";
719 $sql .= " fk_user_creat, fk_user_modif, fk_user_valid";
720 $sql .= " FROM ".$this->db->prefix().$this->table_element." as t";
721 $sql .= " WHERE t.rowid = ".((int) $id);
722 $result = $this->db->query($sql);
723 if ($result) {
724 if ($this->db->num_rows($result)) {
725 $obj = $this->db->fetch_object($result);
726
727 $this->id = $obj->rowid;
728
729 $this->user_creation_id = $obj->fk_user_creat;
730 $this->user_modification_id = $obj->fk_user_modif;
731 $this->user_validation_id = $obj->fk_user_valid;
732
733 $this->date_creation = $this->db->jdate($obj->datec);
734 $this->date_modification = $this->db->jdate($obj->datem);
735 $this->date_validation = $this->db->jdate($obj->datev);
736 }
737
738 $this->db->free($result);
739 } else {
740 dol_print_error($this->db);
741 }
742 }
743
750 public function initAsSpecimen()
751 {
752 $ret = $this->initAsSpecimenCommon();
753 $this->title = '';
754
755 return $ret;
756 }
757
765 public function getChildWarehouse($id, &$TChildWarehouse)
766 {
767 $sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.'entrepot';
768 $sql .= ' WHERE fk_parent='.(int) $id;
769 $sql .= ' ORDER BY rowid';
770 $resql = $this->db->query($sql);
771 if ($resql && $this->db->num_rows($resql) > 0) {
772 while ($obj = $this->db->fetch_object($resql)) {
773 $TChildWarehouse[] = $obj->rowid;
774 $this->getChildWarehouse($obj->rowid, $TChildWarehouse);
775 }
776 return 1;
777 } else {
778 return -1;
779 }
780 }
781}
782
787{
791 public $element = 'inventoryline';
792
796 public $table_element = 'inventorydet';
797
801 public $parent_element = 'inventory';
802
806 public $fk_parent_attribute = 'fk_inventory';
807
811 public $picto = 'stock';
812
830 // BEGIN MODULEBUILDER PROPERTIES
834 public $fields = array(
835 'rowid' => array('type' => 'integer', 'label' => 'TechnicalID', 'visible' => -1, 'enabled' => 1, 'position' => 1, 'notnull' => 1, 'index' => 1, 'comment' => 'Id',),
836 'fk_inventory' => array('type' => 'integer:Inventory:product/inventory/class/inventory.class.php', 'label' => 'Inventory', 'visible' => 1, 'enabled' => 1, 'position' => 30, 'index' => 1, 'help' => 'LinkToInventory'),
837 'fk_warehouse' => array('type' => 'integer:Entrepot:product/stock/class/entrepot.class.php', 'label' => 'Warehouse', 'visible' => 1, 'enabled' => 1, 'position' => 30, 'index' => 1, 'help' => 'LinkToThirdparty'),
838 'fk_product' => array('type' => 'integer:Product:product/class/product.class.php', 'label' => 'Product', 'visible' => 1, 'enabled' => 1, 'position' => 32, 'index' => 1, 'help' => 'LinkToProduct'),
839 'batch' => array('type' => 'string', 'label' => 'Batch', 'visible' => 1, 'enabled' => 1, 'position' => 32, 'index' => 1, 'help' => 'LinkToProduct'),
840 'datec' => array('type' => 'datetime', 'label' => 'DateCreation', 'enabled' => 1, 'visible' => -2, 'notnull' => 1, 'position' => 500),
841 'tms' => array('type' => 'timestamp', 'label' => 'DateModification', 'enabled' => 1, 'visible' => -2, 'notnull' => 1, 'position' => 501),
842 '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)'),
843 'qty_view' => array('type' => 'double', 'label' => 'QtyBefore', 'visible' => 1, 'enabled' => 1, 'position' => 33, 'index' => 1, 'help' => 'Qty before (filled once movements are validated)'),
844 '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)'),
845 'pmp_real' => array('type' => 'double', 'label' => 'PMPReal', 'visible' => 1, 'enabled' => 1, 'position' => 35),
846 'pmp_expected' => array('type' => 'double', 'label' => 'PMPExpected', 'visible' => 1, 'enabled' => 1, 'position' => 36),
847 );
848
852 public $rowid;
853
854 public $fk_inventory;
855 public $fk_warehouse;
856 public $fk_product;
857 public $batch;
858 public $datec;
859
863 public $qty_stock;
864
868 public $qty_view;
869
873 public $qty_regulated;
874
875 public $pmp_real;
876 public $pmp_expected;
877
883 public function __construct($db)
884 {
885 $this->db = $db;
886 $this->ismultientitymanaged = 0;
887
888 $this->isextrafieldmanaged = 0;
889 }
897 public function create(User $user, $notrigger = 0)
898 {
899 return $this->createCommon($user, $notrigger);
900 }
901
909 public function fetch($id, $ref = null)
910 {
911 $result = $this->fetchCommon($id, $ref);
912 //if ($result > 0 && !empty($this->table_element_line)) $this->fetchLines();
913 return $result;
914 }
915
923 public function update(User $user, $notrigger = 0)
924 {
925 return $this->updateCommon($user, $notrigger);
926 }
927
935 public function delete(User $user, $notrigger = 0)
936 {
937 return $this->deleteCommon($user, $notrigger);
938 //return $this->deleteCommon($user, $notrigger, 1);
939 }
940}
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:58
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".
LibStatut($status, $mode=0)
Return the status.
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.
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.
print $langs trans("Ref").' m titre as m m statut as status
Or an array listing all the potential status of the object: array: int of the status => translated la...
Definition index.php:162
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 a Dolibarr global constant string value.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.