dolibarr 23.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-2025 Frédéric France <frederic.france@free.fr>
7 * Copyright (C) 2024-2025 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' => 'getDolGlobalInt("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 $fk_warehouse;
124
128 public $fk_product;
129
133 public $categories_product;
137 public $date_inventory;
141 public $title;
142
146 public $status;
147
151 public $fk_user_creat;
152
156 public $fk_user_modif;
157
161 public $fk_user_valid;
162
166 public $import_key;
167 // END MODULEBUILDER PROPERTIES
168
169
170
171 // If this object has a subtable with lines
172
176 public $table_element_line = 'inventorydet';
177
181 public $fk_element = 'fk_inventory';
182
186 public $class_element_line = 'Inventoryline';
187
191 protected $childtables = array();
195 protected $childtablesoncascade = array('inventorydet');
196
200 public $lines = array();
201
202
203
209 public function __construct(DoliDB $db)
210 {
211 $this->db = $db;
212
213 $this->ismultientitymanaged = 1;
214 $this->isextrafieldmanaged = 0;
215
216 if (!getDolGlobalString('MAIN_SHOW_TECHNICAL_ID')) {
217 $this->fields['rowid']['visible'] = 0;
218 }
219 if (!isModEnabled('multicompany')) {
220 $this->fields['entity']['enabled'] = 0;
221 }
222 }
223
224
232 public function create(User $user, $notrigger = 0)
233 {
234 $result = $this->createCommon($user, $notrigger);
235
236 return $result;
237 }
238
247 public function validate(User $user, $notrigger = 0, $include_sub_warehouse = 0)
248 {
249 $this->db->begin();
250
251 $result = 0;
252
253 if ($this->status == self::STATUS_DRAFT) {
254 // Delete inventory
255 $sql = 'DELETE FROM '.$this->db->prefix().'inventorydet WHERE fk_inventory = '.((int) $this->id);
256 $resql = $this->db->query($sql);
257 if (!$resql) {
258 $this->error = $this->db->lasterror();
259 $this->db->rollback();
260 return -1;
261 }
262
263 // Scan existing stock to prefill the inventory
264 $sql = "SELECT ps.rowid, ps.fk_entrepot as fk_warehouse, ps.fk_product, ps.reel,";
265 if (isModEnabled('productbatch')) {
266 $sql .= " COALESCE(pb.batch, '') as batch, pb.qty as qty,";
267 } else {
268 $sql .= " '' as batch, 0 as qty,";
269 }
270 $sql .= " p.ref, p.tobatch";
271 $sql .= " FROM ".$this->db->prefix()."product_stock as ps";
272 if (isModEnabled('productbatch')) {
273 $sql .= " LEFT JOIN ".$this->db->prefix()."product_batch as pb ON pb.fk_product_stock = ps.rowid";
274 }
275 $sql .= ", ".$this->db->prefix()."product as p, ".$this->db->prefix()."entrepot as e";
276 $sql .= " WHERE p.entity IN (".getEntity('product').")";
277 $sql .= " AND ps.fk_product = p.rowid AND ps.fk_entrepot = e.rowid";
278 if (!getDolGlobalString('STOCK_SUPPORTS_SERVICES')) {
279 $sql .= " AND p.fk_product_type = 0";
280 }
281 if ($this->fk_product > 0) {
282 $sql .= " AND ps.fk_product = ".((int) $this->fk_product);
283 }
284 if ($this->fk_warehouse > 0) {
285 $sql .= " AND (ps.fk_entrepot = ".((int) $this->fk_warehouse);
286 if (!empty($include_sub_warehouse) && getDolGlobalInt('INVENTORY_INCLUDE_SUB_WAREHOUSE')) {
287 $TChildWarehouses = array();
288 $this->getChildWarehouse($this->fk_warehouse, $TChildWarehouses);
289 if (!empty($TChildWarehouses)) {
290 $sql .= " OR ps.fk_entrepot IN (" . $this->db->sanitize(implode(',', $TChildWarehouses)) . ")";
291 }
292 }
293 $sql .= ')';
294 }
295 if (!empty($this->categories_product)) {
296 $sql .= " AND EXISTS (";
297 $sql .= " SELECT cp.fk_product";
298 $sql .= " FROM ".$this->db->prefix()."categorie_product AS cp";
299 $sql .= " WHERE cp.fk_product = ps.fk_product";
300 $sql .= " AND cp.fk_categorie IN (".$this->db->sanitize($this->categories_product).")";
301 $sql .= ")";
302 }
303 if (getDolGlobalInt('PRODUIT_SOUSPRODUITS')) {
304 $sql .= " AND NOT EXISTS (";
305 $sql .= " SELECT pa.rowid";
306 $sql .= " FROM ".$this->db->prefix()."product_association as pa";
307 $sql .= " WHERE pa.fk_product_pere = ps.fk_product";
308 $sql .= ")";
309 }
310 $sql .= " ORDER BY p.rowid";
311
312 $inventoryline = new InventoryLine($this->db);
313
314 $resql = $this->db->query($sql);
315 if ($resql) {
316 $num = $this->db->num_rows($resql);
317
318 $i = 0;
319 while ($i < $num) {
320 $obj = $this->db->fetch_object($resql);
321
322 $inventoryline->fk_inventory = $this->id;
323 $inventoryline->fk_warehouse = $obj->fk_warehouse;
324 $inventoryline->fk_product = $obj->fk_product;
325 $inventoryline->batch = $obj->batch;
326 $inventoryline->datec = dol_now();
327
328 if (isModEnabled('productbatch')) {
329 if ($obj->batch && empty($obj->tobatch)) {
330 // Bad consistency of data. The product is not a product with lot/serial but we found a stock for some lot/serial.
331 $result = -2;
332 $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";
333 break;
334 }
335
336 $inventoryline->qty_stock = ($obj->batch ? $obj->qty : $obj->reel); // If there is batch detail, we take qty for batch, else global qty
337 } else {
338 $inventoryline->qty_stock = $obj->reel;
339 }
340 //var_dump($obj->batch.' '.$obj->qty.' '.$obj->reel.' '.$this->error);exit;
341
342 $resultline = $inventoryline->create($user);
343 if ($resultline <= 0) {
344 $this->error = $inventoryline->error;
345 $this->errors = $inventoryline->errors;
346 $result = -1;
347 break;
348 }
349
350 $i++;
351 }
352 } else {
353 $result = -1;
354 $this->error = $this->db->lasterror();
355 }
356 }
357
358 if ($result >= 0) {
359 $result = $this->setStatut($this::STATUS_VALIDATED, null, '', 'INVENTORY_VALIDATED');
360 }
361
362 if ($result > 0) {
363 $this->db->commit();
364 } else {
365 $this->db->rollback();
366 }
367 return $result;
368 }
369
377 public function setDraft(User $user, $notrigger = 0)
378 {
379 $this->db->begin();
380
381 // Delete inventory
382 $sql = 'DELETE FROM '.$this->db->prefix().'inventorydet WHERE fk_inventory = '.((int) $this->id);
383 $resql = $this->db->query($sql);
384 if (!$resql) {
385 $this->error = $this->db->lasterror();
386 $this->db->rollback();
387 return -1;
388 }
389
390 $result = $this->setStatut($this::STATUS_DRAFT, null, '', 'INVENTORY_DRAFT');
391
392 if ($result > 0) {
393 $this->db->commit();
394 } else {
395 $this->db->rollback();
396 }
397 return $result;
398 }
399
407 public function setRecorded(User $user, $notrigger = 0)
408 {
409 $this->db->begin();
410
411 $result = $this->setStatut($this::STATUS_RECORDED, null, '', 'INVENTORY_RECORDED');
412
413 if ($result > 0) {
414 $this->db->commit();
415 } else {
416 $this->db->rollback();
417 return -1;
418 }
419 return $result;
420 }
421
429 public function setCanceled(User $user, $notrigger = 0)
430 {
431 $this->db->begin();
432
433 $result = $this->setStatut($this::STATUS_CANCELED, null, '', 'INVENTORY_CANCELED');
434
435 if ($result > 0) {
436 $this->db->commit();
437 } else {
438 $this->db->rollback();
439 return -1;
440 }
441 return $result;
442 }
443
451 public function createFromClone(User $user, $fromid)
452 {
453 global $langs;
454
455 $error = 0;
456
457 dol_syslog(__METHOD__, LOG_DEBUG);
458
459 $object = new self($this->db);
460
461 $this->db->begin();
462
463 // Load source object
464 $object->fetchCommon($fromid);
465 // Reset some properties
466 unset($object->id);
467 unset($object->fk_user_creat);
468 unset($object->import_key);
469
470 // Clear fields
471 $object->ref = "copy_of_".$object->ref;
472 $object->title = $langs->trans("CopyOf")." ".$object->title;
473 // ...
474
475 // Create clone
476 $object->context['createfromclone'] = 'createfromclone';
477 $result = $object->createCommon($user);
478 if ($result < 0) {
479 $error++;
481 }
482
483 unset($object->context['createfromclone']);
484
485 // End
486 if (!$error) {
487 $this->db->commit();
488 return $object;
489 } else {
490 $this->db->rollback();
491 return -1;
492 }
493 }
494
502 public function fetch($id, $ref = null)
503 {
504 $result = $this->fetchCommon($id, $ref);
505 //if ($result > 0 && !empty($this->table_element_line)) $this->fetchLines();
506 return $result;
507 }
508
514 /*public function fetchLines()
515 {
516 $this->lines=array();
517
518 // Load lines with object MyObjectLine
519
520 return count($this->lines)?1:0;
521 }*/
522
530 public function update(User $user, $notrigger = 0)
531 {
532 return $this->updateCommon($user, $notrigger);
533 }
534
542 public function delete(User $user, $notrigger = 0)
543 {
544 return $this->deleteCommon($user, $notrigger);
545 }
546
555 public function deleteLine(User $user, $idline, $notrigger = 0)
556 {
557 if ($this->status < 0) {
558 $this->error = 'ErrorDeleteLineNotAllowedByObjectStatus';
559 return -2;
560 }
561
562 return $this->deleteLineCommon($user, $idline, $notrigger);
563 }
564
575 public function getNomUrl($withpicto = 0, $option = '', $notooltip = 0, $morecss = '', $save_lastsearch_value = -1)
576 {
577 global $conf, $langs;
578
579 if (!empty($conf->dol_no_mouse_hover)) {
580 $notooltip = 1; // Force disable tooltips
581 }
582
583 $result = '';
584
585 $label = '<u>'.$langs->trans("Inventory").'</u>';
586 $label .= '<br>';
587 $label .= '<b>'.$langs->trans('Ref').':</b> '.$this->ref;
588
589 $url = dol_buildpath('/product/inventory/card.php', 1).'?id='.$this->id;
590
591 $linkclose = '';
592 if (empty($notooltip)) {
593 if (getDolGlobalString('MAIN_OPTIMIZEFORTEXTBROWSER')) {
594 $label = $langs->trans("ShowInventory");
595 $linkclose .= ' alt="'.dolPrintHTMLForAttribute($label).'"';
596 }
597 $linkclose .= ' title="'.dolPrintHTMLForAttribute($label).'"';
598 $linkclose .= ' class="classfortooltip'.($morecss ? ' '.$morecss : '').'"';
599 } else {
600 $linkclose = ($morecss ? ' class="'.$morecss.'"' : '');
601 }
602
603 $linkstart = '<a href="'.$url.'"';
604 $linkstart .= $linkclose.'>';
605 $linkend = '</a>';
606
607 $result .= $linkstart;
608 if ($withpicto) {
609 $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);
610 }
611 if ($withpicto != 2) {
612 $result .= $this->ref;
613 }
614 $result .= $linkend;
615 //if ($withpicto != 2) $result.=(($addlabel && $this->label) ? $sep . dol_trunc($this->label, ($addlabel > 1 ? $addlabel : 0)) : '');
616
617 return $result;
618 }
619
626 public function getLibStatut($mode = 0)
627 {
628 return $this->LibStatut($this->status, $mode);
629 }
630
631 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
639 public function LibStatut($status, $mode = 0)
640 {
641 // phpcs:enable
642 global $langs, $hookmanager;
643
644 $labelStatus = array();
645 $labelStatusShort = array();
646 $labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
647 $labelStatus[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Validated').' ('.$langs->transnoentitiesnoconv('InventoryStartedShort').')';
648 $labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Canceled');
649 $labelStatus[self::STATUS_RECORDED] = $langs->transnoentitiesnoconv('Closed');
650 $labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
651 $labelStatusShort[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('InventoryStartedShort');
652 $labelStatusShort[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Canceled');
653 $labelStatusShort[self::STATUS_RECORDED] = $langs->transnoentitiesnoconv('Closed');
654
655 $statusType = 'status'.$status;
656 if ($status == self::STATUS_RECORDED) {
657 $statusType = 'status6';
658 }
659
660 $parameters = array('status' => $status, 'mode' => $mode);
661 $reshook = $hookmanager->executeHooks('LibStatut', $parameters, $this); // Note that $action and $object may have been modified by hook
662 if ($reshook > 0) {
663 return $hookmanager->resPrint;
664 }
665 return dolGetStatus($labelStatus[$status], $labelStatusShort[$status], '', $statusType, $mode);
666 }
667
675 public function getKanbanView($option = '', $arraydata = null)
676 {
677 global $conf, $langs;
678
679 $selected = (empty($arraydata['selected']) ? 0 : $arraydata['selected']);
680
681 $return = '<div class="box-flex-item box-flex-grow-zero">';
682 $return .= '<div class="info-box info-box-sm">';
683 $return .= '<span class="info-box-icon bg-infobox-action">';
684 $return .= img_picto('', $this->picto);
685 $return .= '</span>';
686 $return .= '<div class="info-box-content">';
687 $return .= '<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">'.(method_exists($this, 'getNomUrl') ? $this->getNomUrl() : $this->ref).'</span>';
688 if ($selected >= 0) {
689 $return .= '<input id="cb'.$this->id.'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->id.'"'.($selected ? ' checked="checked"' : '').'>';
690 }
691 if (property_exists($this, 'label')) {
692 $return .= ' <div class="inline-block opacitymedium valignmiddle tdoverflowmax100">'.$this->label.'</div>';
693 }
694 if (property_exists($this, 'amount')) {
695 $return .= '<br>';
696 $return .= '<span class="info-box-label amount">'.price($this->amount, 0, $langs, 1, -1, -1, $conf->currency).'</span>';
697 }
698 if (method_exists($this, 'getLibStatut')) {
699 $return .= '<br><div class="info-box-status">'.$this->getLibStatut(3).'</div>';
700 }
701 $return .= '</div>';
702 $return .= '</div>';
703 $return .= '</div>';
704
705 return $return;
706 }
707
714 public function info($id)
715 {
716 $sql = "SELECT rowid, date_creation as datec, tms as datem, date_validation as datev,";
717 $sql .= " fk_user_creat, fk_user_modif, fk_user_valid";
718 $sql .= " FROM ".$this->db->prefix().$this->table_element." as t";
719 $sql .= " WHERE t.rowid = ".((int) $id);
720 $result = $this->db->query($sql);
721 if ($result) {
722 if ($this->db->num_rows($result)) {
723 $obj = $this->db->fetch_object($result);
724
725 $this->id = $obj->rowid;
726
727 $this->user_creation_id = $obj->fk_user_creat;
728 $this->user_modification_id = $obj->fk_user_modif;
729 $this->user_validation_id = $obj->fk_user_valid;
730
731 $this->date_creation = $this->db->jdate($obj->datec);
732 $this->date_modification = $this->db->jdate($obj->datem);
733 $this->date_validation = $this->db->jdate($obj->datev);
734 }
735
736 $this->db->free($result);
737 } else {
738 dol_print_error($this->db);
739 }
740 }
741
748 public function initAsSpecimen()
749 {
750 $ret = $this->initAsSpecimenCommon();
751 $this->title = '';
752
753 return $ret;
754 }
755
763 public function getChildWarehouse($id, &$TChildWarehouse)
764 {
765 $sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.'entrepot';
766 $sql .= ' WHERE fk_parent='.(int) $id;
767 $sql .= ' ORDER BY rowid';
768 $resql = $this->db->query($sql);
769 if ($resql && $this->db->num_rows($resql) > 0) {
770 while ($obj = $this->db->fetch_object($resql)) {
771 $TChildWarehouse[] = $obj->rowid;
772 $this->getChildWarehouse($obj->rowid, $TChildWarehouse);
773 }
774 return 1;
775 } else {
776 return -1;
777 }
778 }
779}
780
785{
789 public $element = 'inventoryline';
790
794 public $table_element = 'inventorydet';
795
799 public $parent_element = 'inventory';
800
804 public $fk_parent_attribute = 'fk_inventory';
805
809 public $picto = 'stock';
810
828 // BEGIN MODULEBUILDER PROPERTIES
832 public $fields = array(
833 'rowid' => array('type' => 'integer', 'label' => 'TechnicalID', 'visible' => -1, 'enabled' => 1, 'position' => 1, 'notnull' => 1, 'index' => 1, 'comment' => 'Id',),
834 'fk_inventory' => array('type' => 'integer:Inventory:product/inventory/class/inventory.class.php', 'label' => 'Inventory', 'visible' => 1, 'enabled' => 1, 'position' => 30, 'index' => 1, 'help' => 'LinkToInventory'),
835 'fk_warehouse' => array('type' => 'integer:Entrepot:product/stock/class/entrepot.class.php', 'label' => 'Warehouse', 'visible' => 1, 'enabled' => 1, 'position' => 30, 'index' => 1, 'help' => 'LinkToThirdparty'),
836 'fk_product' => array('type' => 'integer:Product:product/class/product.class.php', 'label' => 'Product', 'visible' => 1, 'enabled' => 1, 'position' => 32, 'index' => 1, 'help' => 'LinkToProduct'),
837 'batch' => array('type' => 'string', 'label' => 'Batch', 'visible' => 1, 'enabled' => 1, 'position' => 32, 'index' => 1, 'help' => 'LinkToProduct'),
838 'datec' => array('type' => 'datetime', 'label' => 'DateCreation', 'enabled' => 1, 'visible' => -2, 'notnull' => 1, 'position' => 500),
839 'tms' => array('type' => 'timestamp', 'label' => 'DateModification', 'enabled' => 1, 'visible' => -2, 'notnull' => 1, 'position' => 501),
840 '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)'),
841 'qty_view' => array('type' => 'double', 'label' => 'QtyBefore', 'visible' => 1, 'enabled' => 1, 'position' => 33, 'index' => 1, 'help' => 'Qty before (filled once movements are validated)'),
842 '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)'),
843 'pmp_real' => array('type' => 'double', 'label' => 'PMPReal', 'visible' => 1, 'enabled' => 1, 'position' => 35),
844 'pmp_expected' => array('type' => 'double', 'label' => 'PMPExpected', 'visible' => 1, 'enabled' => 1, 'position' => 36),
845 );
846
850 public $rowid;
851
855 public $fk_inventory;
859 public $fk_warehouse;
863 public $fk_product;
867 public $batch;
871 public $datec;
872
876 public $qty_stock;
877
881 public $qty_view;
882
886 public $qty_regulated;
887
891 public $pmp_real;
895 public $pmp_expected;
896
902 public function __construct($db)
903 {
904 $this->db = $db;
905 $this->ismultientitymanaged = 0;
906
907 $this->isextrafieldmanaged = 0;
908 }
916 public function create(User $user, $notrigger = 0)
917 {
918 return $this->createCommon($user, $notrigger);
919 }
920
928 public function fetch($id, $ref = null)
929 {
930 $result = $this->fetchCommon($id, $ref);
931 //if ($result > 0 && !empty($this->table_element_line)) $this->fetchLines();
932 return $result;
933 }
934
942 public function update(User $user, $notrigger = 0)
943 {
944 return $this->updateCommon($user, $notrigger);
945 }
946
954 public function delete(User $user, $notrigger = 0)
955 {
956 return $this->deleteCommon($user, $notrigger);
957 //return $this->deleteCommon($user, $notrigger, 1);
958 }
959}
if(! $sortfield) if(! $sortorder) $object
Definition account.php:100
Parent class of all other business classes (invoices, contracts, proposals, orders,...
deleteLineCommon(User $user, $idline, $notrigger=0)
Delete a line of object in database.
setStatut($status, $elementId=null, $elementType='', $trigkey='', $fieldstatus='')
Set status of an object.
setErrorsFromObject($object)
setErrorsFromObject
createCommon(User $user, $notrigger=0)
Create object in the database.
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
dol_now($mode='gmt')
Return date for now.
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)
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.
isModEnabled($module)
Is Dolibarr module enabled.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
if(getDolGlobalString( 'TAKEPOS_SHOW_CUSTOMER')) print $langs trans('Date')." left Label right Qty right Price right TotalHT right TotalTTC right right right right right right right right right centpercent right TotalHT right n right VAT right n right TotalVAT right n No sujeto a RE IRPF right TotalLT1 right n right TotalLT2 right n right TotalTTC right n takeposcustomercurrency takeposcustomercurrency takeposcustomercurrency takeposcustomercurrency right TotalTTC takeposcustomercurrency right takeposcustomercurrency n right PaymentTypeShortLIQ right SELECT p pos_change as p datep as p p num_paiement as f pf amount as amount
Definition receipt.php:466