dolibarr 21.0.3
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;
142 public $date_inventory;
146 public $title;
147
151 public $status;
152
156 public $fk_user_creat;
157
161 public $fk_user_modif;
162
166 public $fk_user_valid;
167
171 public $import_key;
172 // END MODULEBUILDER PROPERTIES
173
174
175
176 // If this object has a subtable with lines
177
181 public $table_element_line = 'inventorydet';
182
186 public $fk_element = 'fk_inventory';
187
191 public $class_element_line = 'Inventoryline';
192
196 protected $childtables = array();
200 protected $childtablesoncascade = array('inventorydet');
201
205 public $lines = array();
206
207
208
214 public function __construct(DoliDB $db)
215 {
216 global $conf;
217
218 $this->db = $db;
219
220 $this->ismultientitymanaged = 1;
221 $this->isextrafieldmanaged = 0;
222
223 if (!getDolGlobalString('MAIN_SHOW_TECHNICAL_ID')) {
224 $this->fields['rowid']['visible'] = 0;
225 }
226 if (!isModEnabled('multicompany')) {
227 $this->fields['entity']['enabled'] = 0;
228 }
229 }
230
231
239 public function create(User $user, $notrigger = 0)
240 {
241 $result = $this->createCommon($user, $notrigger);
242
243 return $result;
244 }
245
254 public function validate(User $user, $notrigger = 0, $include_sub_warehouse = 0)
255 {
256 $this->db->begin();
257
258 $result = 0;
259
260 if ($this->status == self::STATUS_DRAFT) {
261 // Delete inventory
262 $sql = 'DELETE FROM '.$this->db->prefix().'inventorydet WHERE fk_inventory = '.((int) $this->id);
263 $resql = $this->db->query($sql);
264 if (!$resql) {
265 $this->error = $this->db->lasterror();
266 $this->db->rollback();
267 return -1;
268 }
269
270 // Scan existing stock to prefill the inventory
271 $sql = "SELECT ps.rowid, ps.fk_entrepot as fk_warehouse, ps.fk_product, ps.reel,";
272 if (isModEnabled('productbatch')) {
273 $sql .= " COALESCE(pb.batch, '') as batch, pb.qty as qty,";
274 } else {
275 $sql .= " '' as batch, 0 as qty,";
276 }
277 $sql .= " p.ref, p.tobatch";
278 $sql .= " FROM ".$this->db->prefix()."product_stock as ps";
279 if (isModEnabled('productbatch')) {
280 $sql .= " LEFT JOIN ".$this->db->prefix()."product_batch as pb ON pb.fk_product_stock = ps.rowid";
281 }
282 $sql .= ", ".$this->db->prefix()."product as p, ".$this->db->prefix()."entrepot as e";
283 $sql .= " WHERE p.entity IN (".getEntity('product').")";
284 $sql .= " AND ps.fk_product = p.rowid AND ps.fk_entrepot = e.rowid";
285 if (!getDolGlobalString('STOCK_SUPPORTS_SERVICES')) {
286 $sql .= " AND p.fk_product_type = 0";
287 }
288 if ($this->fk_product > 0) {
289 $sql .= " AND ps.fk_product = ".((int) $this->fk_product);
290 }
291 if ($this->fk_warehouse > 0) {
292 $sql .= " AND (ps.fk_entrepot = ".((int) $this->fk_warehouse);
293 if (!empty($include_sub_warehouse) && getDolGlobalInt('INVENTORY_INCLUDE_SUB_WAREHOUSE')) {
294 $TChildWarehouses = array();
295 $this->getChildWarehouse($this->fk_warehouse, $TChildWarehouses);
296 if (!empty($TChildWarehouses)) {
297 $sql .= " OR ps.fk_entrepot IN (" . $this->db->sanitize(implode(',', $TChildWarehouses)) . ")";
298 }
299 }
300 $sql .= ')';
301 }
302 if (!empty($this->categories_product)) {
303 $sql .= " AND EXISTS (";
304 $sql .= " SELECT cp.fk_product";
305 $sql .= " FROM ".$this->db->prefix()."categorie_product AS cp";
306 $sql .= " WHERE cp.fk_product = ps.fk_product";
307 $sql .= " AND cp.fk_categorie IN (".$this->db->sanitize($this->categories_product).")";
308 $sql .= ")";
309 }
310 if (getDolGlobalInt('PRODUIT_SOUSPRODUITS')) {
311 $sql .= " AND NOT EXISTS (";
312 $sql .= " SELECT pa.rowid";
313 $sql .= " FROM ".$this->db->prefix()."product_association as pa";
314 $sql .= " WHERE pa.fk_product_pere = ps.fk_product";
315 $sql .= ")";
316 }
317 $sql .= " ORDER BY p.rowid";
318
319 $inventoryline = new InventoryLine($this->db);
320
321 $resql = $this->db->query($sql);
322 if ($resql) {
323 $num = $this->db->num_rows($resql);
324
325 $i = 0;
326 while ($i < $num) {
327 $obj = $this->db->fetch_object($resql);
328
329 $inventoryline->fk_inventory = $this->id;
330 $inventoryline->fk_warehouse = $obj->fk_warehouse;
331 $inventoryline->fk_product = $obj->fk_product;
332 $inventoryline->batch = $obj->batch;
333 $inventoryline->datec = dol_now();
334
335 if (isModEnabled('productbatch')) {
336 if ($obj->batch && empty($obj->tobatch)) {
337 // Bad consistency of data. The product is not a product with lot/serial but we found a stock for some lot/serial.
338 $result = -2;
339 $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";
340 break;
341 }
342
343 $inventoryline->qty_stock = ($obj->batch ? $obj->qty : $obj->reel); // If there is batch detail, we take qty for batch, else global qty
344 } else {
345 $inventoryline->qty_stock = $obj->reel;
346 }
347 //var_dump($obj->batch.' '.$obj->qty.' '.$obj->reel.' '.$this->error);exit;
348
349 $resultline = $inventoryline->create($user);
350 if ($resultline <= 0) {
351 $this->error = $inventoryline->error;
352 $this->errors = $inventoryline->errors;
353 $result = -1;
354 break;
355 }
356
357 $i++;
358 }
359 } else {
360 $result = -1;
361 $this->error = $this->db->lasterror();
362 }
363 }
364
365 if ($result >= 0) {
366 $result = $this->setStatut($this::STATUS_VALIDATED, null, '', 'INVENTORY_VALIDATED');
367 }
368
369 if ($result > 0) {
370 $this->db->commit();
371 } else {
372 $this->db->rollback();
373 }
374 return $result;
375 }
376
384 public function setDraft(User $user, $notrigger = 0)
385 {
386 $this->db->begin();
387
388 // Delete inventory
389 $sql = 'DELETE FROM '.$this->db->prefix().'inventorydet WHERE fk_inventory = '.((int) $this->id);
390 $resql = $this->db->query($sql);
391 if (!$resql) {
392 $this->error = $this->db->lasterror();
393 $this->db->rollback();
394 return -1;
395 }
396
397 $result = $this->setStatut($this::STATUS_DRAFT, null, '', 'INVENTORY_DRAFT');
398
399 if ($result > 0) {
400 $this->db->commit();
401 } else {
402 $this->db->rollback();
403 }
404 return $result;
405 }
406
414 public function setRecorded(User $user, $notrigger = 0)
415 {
416 $this->db->begin();
417
418 $result = $this->setStatut($this::STATUS_RECORDED, null, '', 'INVENTORY_RECORDED');
419
420 if ($result > 0) {
421 $this->db->commit();
422 } else {
423 $this->db->rollback();
424 return -1;
425 }
426 return $result;
427 }
428
436 public function setCanceled(User $user, $notrigger = 0)
437 {
438 $this->db->begin();
439
440 $result = $this->setStatut($this::STATUS_CANCELED, null, '', 'INVENTORY_CANCELED');
441
442 if ($result > 0) {
443 $this->db->commit();
444 } else {
445 $this->db->rollback();
446 return -1;
447 }
448 return $result;
449 }
450
458 public function createFromClone(User $user, $fromid)
459 {
460 global $hookmanager, $langs;
461 $error = 0;
462
463 dol_syslog(__METHOD__, LOG_DEBUG);
464
465 $object = new self($this->db);
466
467 $this->db->begin();
468
469 // Load source object
470 $object->fetchCommon($fromid);
471 // Reset some properties
472 unset($object->id);
473 unset($object->fk_user_creat);
474 unset($object->import_key);
475
476 // Clear fields
477 $object->ref = "copy_of_".$object->ref;
478 $object->title = $langs->trans("CopyOf")." ".$object->title;
479 // ...
480
481 // Create clone
482 $object->context['createfromclone'] = 'createfromclone';
483 $result = $object->createCommon($user);
484 if ($result < 0) {
485 $error++;
486 $this->error = $object->error;
487 $this->errors = $object->errors;
488 }
489
490 unset($object->context['createfromclone']);
491
492 // End
493 if (!$error) {
494 $this->db->commit();
495 return $object;
496 } else {
497 $this->db->rollback();
498 return -1;
499 }
500 }
501
509 public function fetch($id, $ref = null)
510 {
511 $result = $this->fetchCommon($id, $ref);
512 //if ($result > 0 && !empty($this->table_element_line)) $this->fetchLines();
513 return $result;
514 }
515
521 /*public function fetchLines()
522 {
523 $this->lines=array();
524
525 // Load lines with object MyObjectLine
526
527 return count($this->lines)?1:0;
528 }*/
529
537 public function update(User $user, $notrigger = 0)
538 {
539 return $this->updateCommon($user, $notrigger);
540 }
541
549 public function delete(User $user, $notrigger = 0)
550 {
551 return $this->deleteCommon($user, $notrigger);
552 }
553
562 public function deleteLine(User $user, $idline, $notrigger = 0)
563 {
564 if ($this->status < 0) {
565 $this->error = 'ErrorDeleteLineNotAllowedByObjectStatus';
566 return -2;
567 }
568
569 return $this->deleteLineCommon($user, $idline, $notrigger);
570 }
571
582 public function getNomUrl($withpicto = 0, $option = '', $notooltip = 0, $morecss = '', $save_lastsearch_value = -1)
583 {
584 global $db, $conf, $langs;
585 global $dolibarr_main_authentication, $dolibarr_main_demo;
586 global $menumanager;
587
588 if (!empty($conf->dol_no_mouse_hover)) {
589 $notooltip = 1; // Force disable tooltips
590 }
591
592 $result = '';
593 $companylink = '';
594
595 $label = '<u>'.$langs->trans("Inventory").'</u>';
596 $label .= '<br>';
597 $label .= '<b>'.$langs->trans('Ref').':</b> '.$this->ref;
598
599 $url = dol_buildpath('/product/inventory/card.php', 1).'?id='.$this->id;
600
601 $linkclose = '';
602 if (empty($notooltip)) {
603 if (getDolGlobalString('MAIN_OPTIMIZEFORTEXTBROWSER')) {
604 $label = $langs->trans("ShowInventory");
605 $linkclose .= ' alt="'.dolPrintHTMLForAttribute($label).'"';
606 }
607 $linkclose .= ' title="'.dolPrintHTMLForAttribute($label).'"';
608 $linkclose .= ' class="classfortooltip'.($morecss ? ' '.$morecss : '').'"';
609 } else {
610 $linkclose = ($morecss ? ' class="'.$morecss.'"' : '');
611 }
612
613 $linkstart = '<a href="'.$url.'"';
614 $linkstart .= $linkclose.'>';
615 $linkend = '</a>';
616
617 $result .= $linkstart;
618 if ($withpicto) {
619 $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);
620 }
621 if ($withpicto != 2) {
622 $result .= $this->ref;
623 }
624 $result .= $linkend;
625 //if ($withpicto != 2) $result.=(($addlabel && $this->label) ? $sep . dol_trunc($this->label, ($addlabel > 1 ? $addlabel : 0)) : '');
626
627 return $result;
628 }
629
636 public function getLibStatut($mode = 0)
637 {
638 return $this->LibStatut($this->status, $mode);
639 }
640
641 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
649 public function LibStatut($status, $mode = 0)
650 {
651 // phpcs:enable
652 global $langs, $hookmanager;
653
654 $labelStatus = array();
655 $labelStatusShort = array();
656 $labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
657 $labelStatus[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Validated').' ('.$langs->transnoentitiesnoconv('InventoryStartedShort').')';
658 $labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Canceled');
659 $labelStatus[self::STATUS_RECORDED] = $langs->transnoentitiesnoconv('Closed');
660 $labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
661 $labelStatusShort[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('InventoryStartedShort');
662 $labelStatusShort[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Canceled');
663 $labelStatusShort[self::STATUS_RECORDED] = $langs->transnoentitiesnoconv('Closed');
664
665 $statusType = 'status'.$status;
666 if ($status == self::STATUS_RECORDED) {
667 $statusType = 'status6';
668 }
669
670 $parameters = array('status' => $status, 'mode' => $mode);
671 $reshook = $hookmanager->executeHooks('LibStatut', $parameters, $this); // Note that $action and $object may have been modified by hook
672 if ($reshook > 0) {
673 return $hookmanager->resPrint;
674 }
675 return dolGetStatus($labelStatus[$status], $labelStatusShort[$status], '', $statusType, $mode);
676 }
677
685 public function getKanbanView($option = '', $arraydata = null)
686 {
687 global $conf, $langs;
688
689 $selected = (empty($arraydata['selected']) ? 0 : $arraydata['selected']);
690
691 $return = '<div class="box-flex-item box-flex-grow-zero">';
692 $return .= '<div class="info-box info-box-sm">';
693 $return .= '<span class="info-box-icon bg-infobox-action">';
694 $return .= img_picto('', $this->picto);
695 $return .= '</span>';
696 $return .= '<div class="info-box-content">';
697 $return .= '<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">'.(method_exists($this, 'getNomUrl') ? $this->getNomUrl() : $this->ref).'</span>';
698 if ($selected >= 0) {
699 $return .= '<input id="cb'.$this->id.'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->id.'"'.($selected ? ' checked="checked"' : '').'>';
700 }
701 if (property_exists($this, 'label')) {
702 $return .= ' <div class="inline-block opacitymedium valignmiddle tdoverflowmax100">'.$this->label.'</div>';
703 }
704 if (property_exists($this, 'amount')) {
705 $return .= '<br>';
706 $return .= '<span class="info-box-label amount">'.price($this->amount, 0, $langs, 1, -1, -1, $conf->currency).'</span>';
707 }
708 if (method_exists($this, 'getLibStatut')) {
709 $return .= '<br><div class="info-box-status">'.$this->getLibStatut(3).'</div>';
710 }
711 $return .= '</div>';
712 $return .= '</div>';
713 $return .= '</div>';
714
715 return $return;
716 }
717
724 public function info($id)
725 {
726 $sql = "SELECT rowid, date_creation as datec, tms as datem, date_validation as datev,";
727 $sql .= " fk_user_creat, fk_user_modif, fk_user_valid";
728 $sql .= " FROM ".$this->db->prefix().$this->table_element." as t";
729 $sql .= " WHERE t.rowid = ".((int) $id);
730 $result = $this->db->query($sql);
731 if ($result) {
732 if ($this->db->num_rows($result)) {
733 $obj = $this->db->fetch_object($result);
734
735 $this->id = $obj->rowid;
736
737 $this->user_creation_id = $obj->fk_user_creat;
738 $this->user_modification_id = $obj->fk_user_modif;
739 $this->user_validation_id = $obj->fk_user_valid;
740
741 $this->date_creation = $this->db->jdate($obj->datec);
742 $this->date_modification = $this->db->jdate($obj->datem);
743 $this->date_validation = $this->db->jdate($obj->datev);
744 }
745
746 $this->db->free($result);
747 } else {
748 dol_print_error($this->db);
749 }
750 }
751
758 public function initAsSpecimen()
759 {
760 $ret = $this->initAsSpecimenCommon();
761 $this->title = '';
762
763 return $ret;
764 }
765
773 public function getChildWarehouse($id, &$TChildWarehouse)
774 {
775 $sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.'entrepot';
776 $sql .= ' WHERE fk_parent='.(int) $id;
777 $sql .= ' ORDER BY rowid';
778 $resql = $this->db->query($sql);
779 if ($resql && $this->db->num_rows($resql) > 0) {
780 while ($obj = $this->db->fetch_object($resql)) {
781 $TChildWarehouse[] = $obj->rowid;
782 $this->getChildWarehouse($obj->rowid, $TChildWarehouse);
783 }
784 return 1;
785 } else {
786 return -1;
787 }
788 }
789}
790
795{
799 public $element = 'inventoryline';
800
804 public $table_element = 'inventorydet';
805
809 public $parent_element = 'inventory';
810
814 public $fk_parent_attribute = 'fk_inventory';
815
819 public $picto = 'stock';
820
838 // BEGIN MODULEBUILDER PROPERTIES
842 public $fields = array(
843 'rowid' => array('type' => 'integer', 'label' => 'TechnicalID', 'visible' => -1, 'enabled' => 1, 'position' => 1, 'notnull' => 1, 'index' => 1, 'comment' => 'Id',),
844 'fk_inventory' => array('type' => 'integer:Inventory:product/inventory/class/inventory.class.php', 'label' => 'Inventory', 'visible' => 1, 'enabled' => 1, 'position' => 30, 'index' => 1, 'help' => 'LinkToInventory'),
845 'fk_warehouse' => array('type' => 'integer:Entrepot:product/stock/class/entrepot.class.php', 'label' => 'Warehouse', 'visible' => 1, 'enabled' => 1, 'position' => 30, 'index' => 1, 'help' => 'LinkToThirdparty'),
846 'fk_product' => array('type' => 'integer:Product:product/class/product.class.php', 'label' => 'Product', 'visible' => 1, 'enabled' => 1, 'position' => 32, 'index' => 1, 'help' => 'LinkToProduct'),
847 'batch' => array('type' => 'string', 'label' => 'Batch', 'visible' => 1, 'enabled' => 1, 'position' => 32, 'index' => 1, 'help' => 'LinkToProduct'),
848 'datec' => array('type' => 'datetime', 'label' => 'DateCreation', 'enabled' => 1, 'visible' => -2, 'notnull' => 1, 'position' => 500),
849 'tms' => array('type' => 'timestamp', 'label' => 'DateModification', 'enabled' => 1, 'visible' => -2, 'notnull' => 1, 'position' => 501),
850 '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)'),
851 'qty_view' => array('type' => 'double', 'label' => 'QtyBefore', 'visible' => 1, 'enabled' => 1, 'position' => 33, 'index' => 1, 'help' => 'Qty before (filled once movements are validated)'),
852 '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)'),
853 'pmp_real' => array('type' => 'double', 'label' => 'PMPReal', 'visible' => 1, 'enabled' => 1, 'position' => 35),
854 'pmp_expected' => array('type' => 'double', 'label' => 'PMPExpected', 'visible' => 1, 'enabled' => 1, 'position' => 36),
855 );
856
860 public $rowid;
861
865 public $fk_inventory;
869 public $fk_warehouse;
873 public $fk_product;
877 public $batch;
881 public $datec;
882
886 public $qty_stock;
887
891 public $qty_view;
892
896 public $qty_regulated;
897
901 public $pmp_real;
905 public $pmp_expected;
906
912 public function __construct($db)
913 {
914 $this->db = $db;
915 $this->ismultientitymanaged = 0;
916
917 $this->isextrafieldmanaged = 0;
918 }
926 public function create(User $user, $notrigger = 0)
927 {
928 return $this->createCommon($user, $notrigger);
929 }
930
938 public function fetch($id, $ref = null)
939 {
940 $result = $this->fetchCommon($id, $ref);
941 //if ($result > 0 && !empty($this->table_element_line)) $this->fetchLines();
942 return $result;
943 }
944
952 public function update(User $user, $notrigger = 0)
953 {
954 return $this->updateCommon($user, $notrigger);
955 }
956
964 public function delete(User $user, $notrigger = 0)
965 {
966 return $this->deleteCommon($user, $notrigger);
967 //return $this->deleteCommon($user, $notrigger, 1);
968 }
969}
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:66
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:171
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (generic function)
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dolGetStatus($statusLabel='', $statusLabelShort='', $html='', $statusType='status0', $displayMode=0, $url='', $params=array())
Output the badge of a status.
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.
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
Definition member.php:79