29require_once DOL_DOCUMENT_ROOT.
'/core/class/commonobject.class.php';
30require_once DOL_DOCUMENT_ROOT.
'/core/class/commonobjectline.class.php';
31require_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
33if (isModEnabled(
'workstation')) {
34 require_once DOL_DOCUMENT_ROOT.
'/workstation/class/workstation.class.php';
49 public $module =
'bom';
54 public $element =
'bom';
59 public $table_element =
'bom_bom';
64 public $picto =
'bom';
71 const STATUS_DRAFT = 0;
72 const STATUS_VALIDATED = 1;
73 const STATUS_CANCELED = 9;
106 public $fields = array(
107 'rowid' => array(
'type' =>
'integer',
'label' =>
'TechnicalID',
'enabled' => 1,
'visible' => -2,
'position' => 1,
'notnull' => 1,
'index' => 1,
'comment' =>
"Id",),
108 'entity' => array(
'type' =>
'integer',
'label' =>
'Entity',
'enabled' => 1,
'visible' => 0,
'notnull' => 1,
'default' => 1,
'index' => 1,
'position' => 5),
109 'ref' => array(
'type' =>
'varchar(128)',
'label' =>
'Ref',
'enabled' => 1,
'noteditable' => 1,
'visible' => 4,
'position' => 10,
'notnull' => 1,
'default' =>
'(PROV)',
'index' => 1,
'searchall' => 1,
'comment' =>
"Reference of BOM",
'showoncombobox' => 1,
'csslist' =>
'nowraponall'),
110 'label' => array(
'type' =>
'varchar(255)',
'label' =>
'Label',
'enabled' => 1,
'visible' => 1,
'position' => 30,
'notnull' => 1,
'searchall' => 1,
'showoncombobox' =>
'2',
'autofocusoncreate' => 1,
'css' =>
'minwidth300 maxwidth400',
'csslist' =>
'tdoverflowmax200'),
111 'bomtype' => array(
'type' =>
'integer',
'label' =>
'Type',
'enabled' => 1,
'visible' => 1,
'position' => 33,
'notnull' => 1,
'default' =>
'0',
'arrayofkeyval' => array(0 =>
'Manufacturing', 1 =>
'Disassemble'),
'css' =>
'minwidth175',
'csslist' =>
'minwidth175 center'),
113 'fk_product' => array(
'type' =>
'integer:Product:product/class/product.class.php:1:((finished:is:null) or (finished:!=:0))',
'label' =>
'Product',
'picto' =>
'product',
'enabled' => 1,
'visible' => 1,
'position' => 35,
'notnull' => 1,
'index' => 1,
'help' =>
'ProductBOMHelp',
'css' =>
'maxwidth500',
'csslist' =>
'tdoverflowmax100'),
114 'description' => array(
'type' =>
'text',
'label' =>
'Description',
'enabled' => 1,
'visible' => -1,
'position' => 60,
'notnull' => -1,),
115 'qty' => array(
'type' =>
'real',
'label' =>
'Quantity',
'enabled' => 1,
'visible' => 1,
'default' => 1,
'position' => 55,
'notnull' => 1,
'isameasure' => 1,
'css' =>
'maxwidth50imp right'),
117 'duration' => array(
'type' =>
'duration',
'label' =>
'EstimatedDuration',
'enabled' => 1,
'visible' => -1,
'position' => 101,
'notnull' => -1,
'css' =>
'maxwidth50imp',
'help' =>
'EstimatedDurationDesc'),
118 'fk_warehouse' => array(
'type' =>
'integer:Entrepot:product/stock/class/entrepot.class.php:0',
'label' =>
'WarehouseForProduction',
'picto' =>
'stock',
'enabled' => 1,
'visible' => -1,
'position' => 102,
'css' =>
'maxwidth500',
'csslist' =>
'tdoverflowmax100'),
119 'note_public' => array(
'type' =>
'html',
'label' =>
'NotePublic',
'enabled' => 1,
'visible' => -2,
'position' => 161,
'notnull' => -1,),
120 'note_private' => array(
'type' =>
'html',
'label' =>
'NotePrivate',
'enabled' => 1,
'visible' => -2,
'position' => 162,
'notnull' => -1,),
121 'date_creation' => array(
'type' =>
'datetime',
'label' =>
'DateCreation',
'enabled' => 1,
'visible' => -2,
'position' => 300,
'notnull' => 1,),
122 'tms' => array(
'type' =>
'timestamp',
'label' =>
'DateModification',
'enabled' => 1,
'visible' => -2,
'position' => 501,
'notnull' => 1,),
123 'date_valid' => array(
'type' =>
'datetime',
'label' =>
'DateValidation',
'enabled' => 1,
'visible' => -2,
'position' => 502,
'notnull' => 0,),
124 'fk_user_creat' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'UserCreation',
'picto' =>
'user',
'enabled' => 1,
'visible' => -2,
'position' => 510,
'notnull' => 1,
'foreignkey' =>
'user.rowid',
'csslist' =>
'tdoverflowmax100'),
125 'fk_user_modif' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'UserModif',
'picto' =>
'user',
'enabled' => 1,
'visible' => -2,
'position' => 511,
'notnull' => -1,
'csslist' =>
'tdoverflowmax100'),
126 'fk_user_valid' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'UserValidation',
'picto' =>
'user',
'enabled' => 1,
'visible' => -2,
'position' => 512,
'notnull' => 0,
'csslist' =>
'tdoverflowmax100'),
127 'import_key' => array(
'type' =>
'varchar(14)',
'label' =>
'ImportId',
'enabled' => 1,
'visible' => -2,
'position' => 1000,
'notnull' => -1,),
128 'model_pdf' => array(
'type' =>
'varchar(255)',
'label' =>
'Model pdf',
'enabled' => 1,
'visible' => 0,
'position' => 1010),
129 'status' => array(
'type' =>
'integer',
'label' =>
'Status',
'enabled' => 1,
'visible' => 2,
'position' => 1000,
'notnull' => 1,
'default' => 0,
'index' => 1,
'arrayofkeyval' => array(0 =>
'Draft', 1 =>
'Enabled', 9 =>
'Disabled')),
165 public $fk_user_creat;
170 public $fk_user_modif;
175 public $fk_user_valid;
180 public $fk_warehouse;
207 public $table_element_line =
'bom_bomline';
212 public $fk_element =
'fk_bom';
217 public $class_element_line =
'BOMLine';
227 protected $childtablesoncascade = array(
'bom_bomline');
232 public $lines = array();
237 public $total_cost = 0;
242 public $unit_cost = 0;
252 global $conf, $langs;
256 $this->ismultientitymanaged = 1;
257 $this->isextrafieldmanaged = 1;
260 $this->fields[
'rowid'][
'visible'] = 0;
262 if (!isModEnabled(
'multicompany') && isset($this->fields[
'entity'])) {
263 $this->fields[
'entity'][
'enabled'] = 0;
267 foreach ($this->fields as $key => $val) {
268 if (isset($val[
'enabled']) && empty($val[
'enabled'])) {
269 unset($this->fields[$key]);
274 foreach ($this->fields as $key => $val) {
275 if (!empty($val[
'arrayofkeyval']) && is_array($val[
'arrayofkeyval'])) {
276 foreach ($val[
'arrayofkeyval'] as $key2 => $val2) {
277 $this->fields[$key][
'arrayofkeyval'][$key2] = $langs->trans($val2);
292 if ($this->efficiency <= 0 || $this->efficiency > 1) {
293 $this->efficiency = 1;
308 global $langs, $hookmanager, $extrafields;
318 $result =
$object->fetchCommon($fromid);
319 if ($result > 0 && !empty(
$object->table_element_line)) {
333 $object->ref = empty($this->fields[
'ref'][
'default']) ? $langs->trans(
"copy_of_").$object->ref : $this->fields[
'ref'][
'default'];
334 $object->label = empty($this->fields[
'label'][
'default']) ? $langs->trans(
"CopyOf").
" ".
$object->label : $this->fields[
'label'][
'default'];
335 $object->status = self::STATUS_DRAFT;
338 if (is_array(
$object->array_options) && count(
$object->array_options) > 0) {
339 $extrafields->fetch_name_optionals_label(
$object->table_element);
340 foreach (
$object->array_options as $key => $option) {
341 $shortkey = preg_replace(
'/options_/',
'', $key);
342 if (!empty($extrafields->attributes[$this->element][
'unique'][$shortkey])) {
344 unset(
$object->array_options[$key]);
350 $object->context[
'createfromclone'] =
'createfromclone';
351 $result =
$object->createCommon($user);
355 $this->errors =
$object->errors;
367 if (property_exists($this,
'socid') && $this->socid ==
$object->socid) {
378 unset(
$object->context[
'createfromclone']);
385 $this->db->rollback();
397 public function fetch($id, $ref =
null)
401 if ($result > 0 && !empty($this->table_element_line)) {
416 $this->lines = array();
431 $this->lines = array();
433 $objectlineclassname = get_class($this).
'Line';
434 if (!class_exists($objectlineclassname)) {
435 $this->error =
'Error, class '.$objectlineclassname.
' not found during call of fetchLinesCommon';
439 $objectline =
new $objectlineclassname($this->db);
441 $sql =
"SELECT ".$objectline->getFieldList(
'l');
442 $sql .=
" FROM ".$this->db->prefix().$objectline->table_element.
" as l";
443 $sql .=
" LEFT JOIN ".$this->db->prefix().
"product as p ON p.rowid = l.fk_product";
444 $sql .=
" WHERE l.fk_".$this->db->escape($this->element).
" = ".((int) $this->
id);
445 $sql .=
" AND p.fk_product_type = ". ((int) $typeproduct);
446 if (isset($objectline->fields[
'position'])) {
447 $sql .= $this->db->order(
'position',
'ASC');
450 $resql = $this->db->query($sql);
452 $num_rows = $this->db->num_rows($resql);
454 while ($i < $num_rows) {
455 $obj = $this->db->fetch_object($resql);
457 $newline =
new $objectlineclassname($this->db);
458 $newline->setVarsFromFetchObj($obj);
460 $this->lines[] = $newline;
467 $this->error = $this->db->lasterror();
468 $this->errors[] = $this->error;
485 public function fetchAll($sortorder =
'', $sortfield =
'', $limit = 0, $offset = 0, $filter =
'', $filtermode =
'AND')
493 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as t';
494 if ($this->ismultientitymanaged) {
495 $sql .=
' WHERE t.entity IN ('.getEntity($this->element).
')';
497 $sql .=
' WHERE 1 = 1';
504 $this->errors[] = $errormessage;
505 dol_syslog(__METHOD__.
' '.implode(
',', $this->errors), LOG_ERR);
509 if (!empty($sortfield)) {
510 $sql .= $this->db->order($sortfield, $sortorder);
512 if (!empty($limit)) {
513 $sql .= $this->db->plimit($limit, $offset);
516 $resql = $this->db->query($sql);
518 $num = $this->db->num_rows($resql);
520 while ($obj = $this->db->fetch_object($resql)) {
521 $record =
new self($this->db);
522 $record->setVarsFromFetchObj($obj);
524 $records[$record->id] = $record;
526 $this->db->free($resql);
530 $this->errors[] =
'Error '.$this->db->lasterror();
531 dol_syslog(__METHOD__.
' '.implode(
',', $this->errors), LOG_ERR);
546 if ($this->efficiency <= 0 || $this->efficiency > 1) {
547 $this->efficiency = 1;
560 public function delete(
User $user, $notrigger = 1)
582 public function addLine($fk_product, $qty, $qty_frozen = 0, $disable_stock_change = 0, $efficiency = 1.0, $position = -1, $fk_bom_child =
null, $import_key =
null, $fk_unit = 0, $array_options = array(), $fk_default_workstation =
null)
584 global $mysoc, $conf, $langs, $user;
586 $logtext =
"::addLine bomid=$this->id, qty=$qty, fk_product=$fk_product, qty_frozen=$qty_frozen, disable_stock_change=$disable_stock_change, efficiency=$efficiency";
587 $logtext .=
", fk_bom_child=$fk_bom_child, import_key=$import_key";
588 dol_syslog(get_class($this).$logtext, LOG_DEBUG);
590 if ($this->
statut == self::STATUS_DRAFT) {
591 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
597 if (empty($qty_frozen)) {
600 if (empty($disable_stock_change)) {
601 $disable_stock_change = 0;
603 if (empty($efficiency)) {
606 if (empty($fk_bom_child)) {
607 $fk_bom_child =
null;
609 if (empty($import_key)) {
612 if (empty($position)) {
617 $efficiency = (float)
price2num($efficiency);
618 $position = (float)
price2num($position);
624 $rankToUse = $position;
625 if ($rankToUse <= 0 or $rankToUse > $rangMax) {
626 $rankToUse = $rangMax + 1;
628 foreach ($this->lines as $bl) {
629 if ($bl->position >= $rankToUse) {
637 $line =
new BOMLine($this->db);
639 $line->context = $this->context;
641 $line->fk_bom = $this->id;
642 $line->fk_product = $fk_product;
644 $line->qty_frozen = $qty_frozen;
645 $line->disable_stock_change = $disable_stock_change;
646 $line->efficiency = $efficiency;
647 $line->fk_bom_child = $fk_bom_child;
648 $line->import_key = $import_key;
649 $line->position = $rankToUse;
650 $line->fk_unit = $fk_unit;
651 $line->fk_default_workstation = $fk_default_workstation;
653 if (is_array($array_options) && count($array_options) > 0) {
654 $line->array_options = $array_options;
657 $result = $line->create($user);
665 dol_syslog(get_class($this).
"::addLine error=".$this->error, LOG_ERR);
666 $this->db->rollback();
670 dol_syslog(get_class($this).
"::addLine status of BOM must be Draft to allow use of ->addLine()", LOG_ERR);
690 public function updateLine($rowid, $qty, $qty_frozen = 0, $disable_stock_change = 0, $efficiency = 1.0, $position = -1, $import_key =
null, $fk_unit = 0, $array_options = array(), $fk_default_workstation =
null)
694 $logtext =
"::updateLine bomid=$this->id, qty=$qty, qty_frozen=$qty_frozen, disable_stock_change=$disable_stock_change, efficiency=$efficiency";
695 $logtext .=
", import_key=$import_key";
696 dol_syslog(get_class($this).$logtext, LOG_DEBUG);
698 if ($this->
statut == self::STATUS_DRAFT) {
699 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
705 if (empty($qty_frozen)) {
708 if (empty($disable_stock_change)) {
709 $disable_stock_change = 0;
711 if (empty($efficiency)) {
714 if (empty($import_key)) {
717 if (empty($position)) {
722 $efficiency = (float)
price2num($efficiency);
723 $position = (float)
price2num($position);
728 $line =
new BOMLine($this->db);
729 $line->fetch($rowid);
730 $line->fetch_optionals();
732 $staticLine = clone $line;
733 $line->oldcopy = $staticLine;
734 $line->context = $this->context;
737 $rankToUse = (int) $position;
738 if ($rankToUse != $line->oldcopy->position) {
739 foreach ($this->lines as $bl) {
740 if ($bl->position >= $rankToUse and $bl->position < ($line->oldcopy->position + 1)) {
744 if ($bl->position <= $rankToUse and $bl->position > ($line->oldcopy->position)) {
752 $line->fk_bom = $this->id;
754 $line->qty_frozen = $qty_frozen;
755 $line->disable_stock_change = $disable_stock_change;
756 $line->efficiency = $efficiency;
757 $line->import_key = $import_key;
758 $line->position = $rankToUse;
761 if (!empty($fk_unit)) {
762 $line->fk_unit = $fk_unit;
766 if (is_array($array_options) && count($array_options) > 0) {
768 foreach ($array_options as $key => $value) {
769 $line->array_options[$key] = $array_options[$key];
772 if ($line->fk_default_workstation != $fk_default_workstation) {
773 $line->fk_default_workstation = ($fk_default_workstation > 0 ? $fk_default_workstation : 0);
776 $result = $line->update($user);
784 dol_syslog(get_class($this).
"::addLine error=".$this->error, LOG_ERR);
785 $this->db->rollback();
789 dol_syslog(get_class($this).
"::addLine status of BOM must be Draft to allow use of ->addLine()", LOG_ERR);
805 $this->error =
'ErrorDeleteLineNotAllowedByObjectStatus';
812 $line =
new BOMLine($this->db);
813 $line->fetch($idline);
814 $line->fetch_optionals();
816 $staticLine = clone $line;
817 $line->oldcopy = $staticLine;
818 $line->context = $this->context;
820 $result = $line->delete($user, $notrigger);
823 foreach ($this->lines as $bl) {
824 if ($bl->position > ($line->oldcopy->position)) {
836 dol_syslog(get_class($this).
"::addLine error=".$this->error, LOG_ERR);
837 $this->db->rollback();
851 global $langs, $conf;
861 $dirmodels = array_merge(array(
'/'), (array) $conf->modules_parts[
'models']);
862 foreach ($dirmodels as $reldir) {
866 $mybool = ((bool) @include_once $dir.$file) || $mybool;
869 if ($mybool ===
false) {
874 $obj =
new $classname();
875 $numref = $obj->getNextValue($prod, $this);
880 $this->error = $obj->error;
885 print $langs->trans(
"Error").
" ".$langs->trans(
"Error_BOM_ADDON_NotDefined");
901 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
906 if ($this->
status == self::STATUS_VALIDATED) {
907 dol_syslog(get_class($this).
"::validate action abandoned: already validated", LOG_WARNING);
916 if (!$error && (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref))) {
925 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
926 $sql .=
" SET ref = '".$this->db->escape($num).
"',";
927 $sql .=
" status = ".self::STATUS_VALIDATED.
",";
928 $sql .=
" date_valid='".$this->db->idate($now).
"',";
929 $sql .=
" fk_user_valid = ".((int) $user->id);
930 $sql .=
" WHERE rowid = ".((int) $this->
id);
932 dol_syslog(get_class($this).
"::validate()", LOG_DEBUG);
933 $resql = $this->db->query($sql);
936 $this->error = $this->db->lasterror();
940 if (!$error && !$notrigger) {
950 $this->oldref = $this->ref;
953 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
955 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filename = CONCAT('".$this->db->escape($this->newref).
"', SUBSTR(filename, ".(strlen($this->
ref) + 1).
")), filepath = 'bom/".$this->db->escape($this->newref).
"'";
956 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'bom/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
957 $resql = $this->db->query($sql);
960 $this->error = $this->db->lasterror();
962 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filepath = 'bom/".$this->db->escape($this->newref).
"'";
963 $sql .=
" WHERE filepath = 'bom/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
964 $resql = $this->db->query($sql);
967 $this->error = $this->db->lasterror();
973 $dirsource = $conf->bom->dir_output.
'/'.$oldref;
974 $dirdest = $conf->bom->dir_output.
'/'.$newref;
975 if (!$error && file_exists($dirsource)) {
976 dol_syslog(get_class($this).
"::validate() rename dir ".$dirsource.
" into ".$dirdest);
978 if (@rename($dirsource, $dirdest)) {
981 $listoffiles =
dol_dir_list($conf->bom->dir_output.
'/'.$newref,
'files', 1,
'^'.preg_quote($oldref,
'/'));
982 foreach ($listoffiles as $fileentry) {
983 $dirsource = $fileentry[
'name'];
984 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
985 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
986 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
987 @rename($dirsource, $dirdest);
997 $this->
status = self::STATUS_VALIDATED;
1001 $this->db->commit();
1004 $this->db->rollback();
1019 if ($this->
status <= self::STATUS_DRAFT) {
1023 return $this->
setStatusCommon($user, self::STATUS_DRAFT, $notrigger,
'BOM_UNVALIDATE');
1033 public function cancel($user, $notrigger = 0)
1036 if ($this->
status != self::STATUS_VALIDATED) {
1040 return $this->
setStatusCommon($user, self::STATUS_CANCELED, $notrigger,
'BOM_CLOSE');
1050 public function reopen($user, $notrigger = 0)
1053 if ($this->
status != self::STATUS_CANCELED) {
1057 return $this->
setStatusCommon($user, self::STATUS_VALIDATED, $notrigger,
'BOM_REOPEN');
1068 global $conf, $langs, $user;
1070 $langs->loadLangs([
'product',
'mrp']);
1075 return [
'optimize' => $langs->trans(
"ShowBillOfMaterials")];
1077 $picto =
img_picto(
'', $this->picto).
' <u class="paddingrightonly">'.$langs->trans(
"BillOfMaterials").
'</u>';
1078 if (isset($this->
status)) {
1079 $picto .=
' '.$this->getLibStatut(5);
1081 $datas[
'picto'] = $picto;
1082 $datas[
'ref'] =
'<br><b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
1083 if (isset($this->label)) {
1084 $datas[
'label'] =
'<br><b>'.$langs->trans(
'Label').
':</b> '.$this->label;
1086 if (!empty($this->fk_product) && $this->fk_product > 0) {
1087 include_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
1088 $product =
new Product($this->db);
1089 $resultFetch = $product->fetch($this->fk_product);
1090 if ($resultFetch > 0) {
1091 $datas[
'product'] =
"<br><b>".$langs->trans(
"Product").
'</b>: '.$product->ref.
' - '.$product->label;
1108 public function getNomUrl($withpicto = 0, $option =
'', $notooltip = 0, $morecss =
'', $save_lastsearch_value = -1)
1110 global $db, $conf, $langs, $hookmanager;
1112 if (!empty($conf->dol_no_mouse_hover)) {
1119 'objecttype' => $this->element,
1120 'option' => $option,
1122 $classfortooltip =
'classfortooltip';
1125 $classfortooltip =
'classforajaxtooltip';
1126 $dataparams =
' data-params="'.dol_escape_htmltag(json_encode($params)).
'"';
1132 $url = DOL_URL_ROOT.
'/bom/bom_card.php?id='.$this->id;
1134 if ($option !=
'nolink') {
1136 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
1137 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
1138 $add_save_lastsearch_values = 1;
1140 if ($add_save_lastsearch_values) {
1141 $url .=
'&save_lastsearch_values=1';
1146 if (empty($notooltip)) {
1148 $label = $langs->trans(
"ShowBillOfMaterials");
1149 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
1151 $linkclose .= ($label ?
' title="'.dol_escape_htmltag($label, 1).
'"' :
' title="tocomplete"');
1152 $linkclose .= $dataparams.
' class="'.$classfortooltip.($morecss ?
' '.$morecss :
'').
'"';
1154 $linkclose = ($morecss ?
' class="'.$morecss.
'"' :
'');
1157 $linkstart =
'<a href="'.$url.
'"';
1158 $linkstart .= $linkclose.
'>';
1161 $result .= $linkstart;
1163 $result .=
img_object(($notooltip ?
'' : $label), ($this->picto ? $this->picto :
'generic'), (($withpicto != 2) ?
'class="paddingright"' :
''), 0, 0, $notooltip ? 0 : 1);
1165 if ($withpicto != 2) {
1166 $result .= $this->ref;
1168 $result .= $linkend;
1171 global $action, $hookmanager;
1172 $hookmanager->initHooks(array(
'bomdao'));
1173 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
1174 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
1176 $result = $hookmanager->resPrint;
1178 $result .= $hookmanager->resPrint;
1206 if (empty($this->labelStatus)) {
1209 $this->labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
'Draft');
1210 $this->labelStatus[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
'Enabled');
1211 $this->labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv(
'Disabled');
1214 $statusType =
'status'.$status;
1215 if ($status == self::STATUS_VALIDATED) {
1216 $statusType =
'status4';
1218 if ($status == self::STATUS_CANCELED) {
1219 $statusType =
'status6';
1222 return dolGetStatus($this->labelStatus[$status], $this->labelStatus[$status],
'', $statusType, $mode);
1233 $sql =
'SELECT rowid, date_creation as datec, tms as datem,';
1234 $sql .=
' fk_user_creat, fk_user_modif';
1235 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as t';
1236 $sql .=
' WHERE t.rowid = '.((int) $id);
1237 $result = $this->db->query($sql);
1239 if ($this->db->num_rows($result)) {
1240 $obj = $this->db->fetch_object($result);
1242 $this->
id = $obj->rowid;
1244 $this->user_creation_id = $obj->fk_user_creat;
1245 $this->user_modification_id = $obj->fk_user_modif;
1246 $this->date_creation = $this->db->jdate($obj->datec);
1247 $this->date_modification = empty($obj->datem) ?
'' : $this->db->jdate($obj->datem);
1250 $this->db->free($result);
1263 $this->lines = array();
1265 $objectline =
new BOMLine($this->db);
1266 $result = $objectline->fetchAll(
'ASC',
'position', 0, 0,
'(fk_bom:=:'.((
int) $this->
id).
')');
1268 if (is_numeric($result)) {
1269 $this->error = $objectline->error;
1270 $this->errors = $objectline->errors;
1273 $this->lines = $result;
1274 return $this->lines;
1289 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
1291 global $conf, $langs;
1293 $langs->load(
"mrp");
1294 $outputlangs->load(
"products");
1299 if ($this->model_pdf) {
1300 $modele = $this->model_pdf;
1306 $modelpath =
"core/modules/bom/doc/";
1307 if (!empty($modele)) {
1308 return $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
1324 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1325 include_once DOL_DOCUMENT_ROOT.
'/core/lib/images.lib.php';
1327 $sdir .=
'/'.get_exdir(0, 0, 0, 0, $this,
'bom');
1330 if (file_exists($dir_osencoded)) {
1331 $handle = opendir($dir_osencoded);
1332 if (is_resource($handle)) {
1333 while (($file = readdir($handle)) !==
false) {
1335 $file = mb_convert_encoding($file,
'UTF-8',
'ISO-8859-1');
1355 $this->
ref =
'BOM-123';
1356 $this->date_creation =
dol_now() - 20000;
1370 global $conf, $langs;
1386 $this->db->commit();
1399 global $conf, $hookmanager;
1401 include_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
1402 $this->unit_cost = 0;
1403 $this->total_cost = 0;
1405 $parameters = array();
1406 $reshook = $hookmanager->executeHooks(
'calculateCostsBom', $parameters, $this);
1409 return $hookmanager->resPrint;
1412 if (is_array($this->lines) && count($this->lines)) {
1413 require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
1415 $tmpproduct =
new Product($this->db);
1417 foreach ($this->lines as &$line) {
1418 $tmpproduct->cost_price = 0;
1419 $tmpproduct->pmp = 0;
1420 $result = $tmpproduct->fetch($line->fk_product,
'',
'',
'', 0, 1, 1);
1422 if ($tmpproduct->type == $tmpproduct::TYPE_PRODUCT) {
1423 if (empty($line->fk_bom_child)) {
1425 $this->error = $tmpproduct->error;
1428 $unit_cost = (!empty($tmpproduct->cost_price)) ? $tmpproduct->cost_price : $tmpproduct->pmp;
1429 $line->unit_cost = (float)
price2num($unit_cost);
1430 if (empty($line->unit_cost)) {
1431 if ($productFournisseur->find_min_price_product_fournisseur($line->fk_product) > 0) {
1432 if ($productFournisseur->fourn_remise_percent !=
"0") {
1433 $line->unit_cost = $productFournisseur->fourn_unitprice_with_discount;
1435 $line->unit_cost = $productFournisseur->fourn_unitprice;
1440 $line->total_cost = (float)
price2num($line->qty * $line->unit_cost,
'MT');
1442 $this->total_cost += $line->total_cost;
1444 $bom_child =
new BOM($this->db);
1445 $res = $bom_child->fetch($line->fk_bom_child);
1447 $bom_child->calculateCosts();
1448 $line->childBom[] = $bom_child;
1449 $this->total_cost += (float)
price2num($bom_child->total_cost * $line->qty,
'MT');
1450 $this->total_cost += $line->total_cost;
1452 $this->error = $bom_child->error;
1461 if (isModEnabled(
'workstation') && !empty($line->fk_default_workstation)) {
1463 $res = $workstation->fetch($line->fk_default_workstation);
1466 $line->total_cost = (float)
price2num($qtyhourforline * ($workstation->thm_operator_estimated + $workstation->thm_machine_estimated),
'MT');
1468 $this->error = $workstation->error;
1472 $defaultdurationofservice = $tmpproduct->duration;
1474 $qtyhourservice = 0;
1475 if (preg_match(
'/^(\d+)([a-z]+)$/', $defaultdurationofservice, $reg)) {
1479 if ($qtyhourservice) {
1480 $line->total_cost = (float)
price2num($qtyhourforline / $qtyhourservice * $tmpproduct->cost_price,
'MT');
1482 $line->total_cost = (float)
price2num($line->qty * $tmpproduct->cost_price,
'MT');
1486 $this->total_cost += $line->total_cost;
1490 $this->total_cost = (float)
price2num($this->total_cost,
'MT');
1492 if ($this->qty > 0) {
1493 $this->unit_cost = (float)
price2num($this->total_cost / $this->qty,
'MU');
1494 } elseif ($this->qty < 0) {
1495 $this->unit_cost = (float)
price2num($this->total_cost * $this->qty,
'MU');
1528 if (!empty($this->lines)) {
1529 foreach ($this->lines as $line) {
1530 if (!empty($line->childBom)) {
1531 foreach ($line->childBom as $childBom) {
1532 $childBom->getNetNeeds($TNetNeeds, $line->qty * $qty);
1535 if (empty($TNetNeeds[$line->fk_product][
'qty'])) {
1536 $TNetNeeds[$line->fk_product][
'qty'] = 0.0;
1540 $TNetNeeds[$line->fk_product][
'fk_unit'] = $line->fk_unit;
1541 $TNetNeeds[$line->fk_product][
'qty'] += $line->qty * $qty;
1557 if (!empty($this->lines)) {
1558 foreach ($this->lines as $line) {
1559 if (!empty($line->childBom)) {
1560 foreach ($line->childBom as $childBom) {
1561 $TNetNeeds[$childBom->id][
'bom'] = $childBom;
1562 $TNetNeeds[$childBom->id][
'parentid'] = $this->id;
1566 $TNetNeeds[$childBom->id][
'qty'] = $line->qty * $qty;
1567 $TNetNeeds[$childBom->id][
'level'] = $level;
1568 $childBom->getNetNeedsTree($TNetNeeds, $line->qty * $qty, $level + 1);
1573 if (!isset($TNetNeeds[$this->
id][
'product'])) {
1574 $TNetNeeds[$this->id][
'product'] = array();
1576 if (!isset($TNetNeeds[$this->
id][
'product'][$line->fk_product])) {
1577 $TNetNeeds[$this->id][
'product'][$line->fk_product] = array();
1579 $TNetNeeds[$this->id][
'product'][$line->fk_product][
'fk_unit'] = $line->fk_unit;
1580 if (!isset($TNetNeeds[$this->
id][
'product'][$line->fk_product][
'qty'])) {
1581 $TNetNeeds[$this->id][
'product'][$line->fk_product][
'qty'] = 0.0;
1583 $TNetNeeds[$this->id][
'product'][$line->fk_product][
'qty'] += $line->qty * $qty;
1584 $TNetNeeds[$this->id][
'product'][$line->fk_product][
'level'] = $level;
1602 if ($level > 1000) {
1606 if (empty($bom_id)) {
1607 $bom_id = $this->id;
1610 $sql =
'SELECT l.fk_bom, b.label
1611 FROM '.MAIN_DB_PREFIX.
'bom_bomline l
1612 INNER JOIN '.MAIN_DB_PREFIX.$this->table_element.
' b ON b.rowid = l.fk_bom
1613 WHERE fk_bom_child = '.((int) $bom_id);
1615 $resql = $this->db->query($sql);
1616 if (!empty($resql)) {
1617 while ($res = $this->db->fetch_object($resql)) {
1618 $TParentBom[$res->fk_bom] = $res->fk_bom;
1635 $selected = (empty($arraydata[
'selected']) ? 0 : $arraydata[
'selected']);
1637 $return =
'<div class="box-flex-item box-flex-grow-zero">';
1638 $return .=
'<div class="info-box info-box-sm">';
1639 $return .=
'<span class="info-box-icon bg-infobox-action">';
1641 $return .=
'</span>';
1642 $return .=
'<div class="info-box-content">';
1643 $return .=
'<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">'.(method_exists($this,
'getNomUrl') ? $this->
getNomUrl() :
'').
'</span>';
1644 if ($selected >= 0) {
1645 $return .=
'<input id="cb'.$this->id.
'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->
id.
'"'.($selected ?
' checked="checked"' :
'').
'>';
1647 if (property_exists($this,
'fields') && !empty($this->fields[
'bomtype'][
'arrayofkeyval'])) {
1648 $return .=
'<br><span class="info-box-label opacitymedium">'.$langs->trans(
"Type").
' : </span>';
1649 if ($this->bomtype == 0) {
1650 $return .=
'<span class="info-box-label">'.$this->fields[
'bomtype'][
'arrayofkeyval'][0].
'</span>';
1652 $return .=
'<span class="info-box-label">'.$this->fields[
'bomtype'][
'arrayofkeyval'][1].
'</span>';
1655 if (!empty($arraydata[
'prod'])) {
1656 $prod = $arraydata[
'prod'];
1657 $return .=
'<br><span class="info-box-label">'.$prod->getNomUrl(1).
'</span>';
1659 if (method_exists($this,
'getLibStatut')) {
1660 $return .=
'<br><div class="info-box-status">'.$this->getLibStatut(3).
'</div>';
1663 $return .=
'</div>';
1664 $return .=
'</div>';
1665 $return .=
'</div>';
1679 public $element =
'bomline';
1684 public $table_element =
'bom_bomline';
1699 public $picto =
'bomline';
1725 public $fields = array(
1726 'rowid' => array(
'type' =>
'integer',
'label' =>
'LineID',
'enabled' => 1,
'visible' => -1,
'position' => 1,
'notnull' => 1,
'index' => 1,
'comment' =>
"Id",),
1727 'fk_bom' => array(
'type' =>
'integer:BillOfMaterials:societe/class/bom.class.php',
'label' =>
'BillOfMaterials',
'enabled' => 1,
'visible' => 1,
'position' => 10,
'notnull' => 1,
'index' => 1,),
1728 'fk_product' => array(
'type' =>
'integer:Product:product/class/product.class.php',
'label' =>
'Product',
'enabled' => 1,
'visible' => 1,
'position' => 20,
'notnull' => 1,
'index' => 1,),
1729 'fk_bom_child' => array(
'type' =>
'integer:BOM:bom/class/bom.class.php',
'label' =>
'BillOfMaterials',
'enabled' => 1,
'visible' => -1,
'position' => 40,
'notnull' => -1,),
1730 'description' => array(
'type' =>
'text',
'label' =>
'Description',
'enabled' => 1,
'visible' => -1,
'position' => 60,
'notnull' => -1,),
1731 'qty' => array(
'type' =>
'double(24,8)',
'label' =>
'Quantity',
'enabled' => 1,
'visible' => 1,
'position' => 100,
'notnull' => 1,
'isameasure' => 1,),
1732 'qty_frozen' => array(
'type' =>
'smallint',
'label' =>
'QuantityFrozen',
'enabled' => 1,
'visible' => 1,
'default' =>
'0',
'position' => 105,
'css' =>
'maxwidth50imp',
'help' =>
'QuantityConsumedInvariable'),
1733 'disable_stock_change' => array(
'type' =>
'smallint',
'label' =>
'DisableStockChange',
'enabled' => 1,
'visible' => 1,
'default' =>
'0',
'position' => 108,
'css' =>
'maxwidth50imp',
'help' =>
'DisableStockChangeHelp'),
1734 'efficiency' => array(
'type' =>
'double(24,8)',
'label' =>
'ManufacturingEfficiency',
'enabled' => 1,
'visible' => 0,
'default' =>
'1',
'position' => 110,
'notnull' => 1,
'css' =>
'maxwidth50imp',
'help' =>
'ValueOfEfficiencyConsumedMeans'),
1735 'fk_unit' => array(
'type' =>
'integer',
'label' =>
'Unit',
'enabled' => 1,
'visible' => 1,
'position' => 120,
'notnull' => -1,),
1736 'position' => array(
'type' =>
'integer',
'label' =>
'Rank',
'enabled' => 1,
'visible' => 0,
'default' =>
'0',
'position' => 200,
'notnull' => 1,),
1737 'import_key' => array(
'type' =>
'varchar(14)',
'label' =>
'ImportId',
'enabled' => 1,
'visible' => -2,
'position' => 1000,
'notnull' => -1,),
1738 'fk_default_workstation' => array(
'type' =>
'integer',
'label' =>
'DefaultWorkstation',
'enabled' => 1,
'visible' => 1,
'notnull' => 0,
'position' => 1050)
1759 public $fk_bom_child;
1764 public $description;
1779 public $disable_stock_change;
1796 public $fk_default_workstation;
1812 public $total_cost = 0;
1817 public $unit_cost = 0;
1822 public $childBom = array();
1837 $this->ismultientitymanaged = 0;
1839 $this->isextrafieldmanaged = 1;
1841 if (!
getDolGlobalString(
'MAIN_SHOW_TECHNICAL_ID') && isset($this->fields[
'rowid'])) {
1842 $this->fields[
'rowid'][
'visible'] = 0;
1844 if (!isModEnabled(
'multicompany') && isset($this->fields[
'entity'])) {
1845 $this->fields[
'entity'][
'enabled'] = 0;
1849 foreach ($this->fields as $key => $val) {
1850 if (isset($val[
'enabled']) && empty($val[
'enabled'])) {
1851 unset($this->fields[$key]);
1856 foreach ($this->fields as $key => $val) {
1857 if (!empty($val[
'arrayofkeyval']) && is_array($val[
'arrayofkeyval'])) {
1858 foreach ($val[
'arrayofkeyval'] as $key2 => $val2) {
1859 $this->fields[$key][
'arrayofkeyval'][$key2] = $langs->trans($val2);
1874 if ($this->efficiency < 0 || $this->efficiency > 1) {
1875 $this->efficiency = 1;
1907 public function fetchAll($sortorder =
'', $sortfield =
'', $limit = 0, $offset = 0, $filter =
'', $filtermode =
'AND')
1915 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as t';
1916 if ($this->ismultientitymanaged) {
1917 $sql .=
' WHERE t.entity IN ('.getEntity($this->element).
')';
1919 $sql .=
' WHERE 1 = 1';
1925 if ($errormessage) {
1926 $this->errors[] = $errormessage;
1927 dol_syslog(__METHOD__.
' '.implode(
',', $this->errors), LOG_ERR);
1931 if (!empty($sortfield)) {
1932 $sql .= $this->db->order($sortfield, $sortorder);
1934 if (!empty($limit)) {
1935 $sql .= $this->db->plimit($limit, $offset);
1938 $resql = $this->db->query($sql);
1940 $num = $this->db->num_rows($resql);
1942 while ($obj = $this->db->fetch_object($resql)) {
1943 $record =
new self($this->db);
1944 $record->setVarsFromFetchObj($obj);
1945 $record->fetch_optionals();
1947 $records[$record->id] = $record;
1949 $this->db->free($resql);
1953 $this->errors[] =
'Error '.$this->db->lasterror();
1954 dol_syslog(__METHOD__.
' '.implode(
',', $this->errors), LOG_ERR);
1969 if ($this->efficiency < 0 || $this->efficiency > 1) {
1970 $this->efficiency = 1;
1983 public function delete(
User $user, $notrigger = 0)
1999 public function getNomUrl($withpicto = 0, $option =
'', $notooltip = 0, $morecss =
'', $save_lastsearch_value = -1)
2001 global $db, $conf, $langs, $hookmanager;
2003 if (!empty($conf->dol_no_mouse_hover)) {
2009 $label =
'<u>'.$langs->trans(
"BillOfMaterialsLine").
'</u>';
2011 $label .=
'<b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
2013 $url = DOL_URL_ROOT.
'/bom/bomline_card.php?id='.$this->id;
2015 if ($option !=
'nolink') {
2017 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
2018 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
2019 $add_save_lastsearch_values = 1;
2021 if ($add_save_lastsearch_values) {
2022 $url .=
'&save_lastsearch_values=1';
2027 if (empty($notooltip)) {
2029 $label = $langs->trans(
"ShowBillOfMaterialsLine");
2030 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
2032 $linkclose .=
' title="'.dol_escape_htmltag($label, 1).
'"';
2033 $linkclose .=
' class="classfortooltip'.($morecss ?
' '.$morecss :
'').
'"';
2035 $linkclose = ($morecss ?
' class="'.$morecss.
'"' :
'');
2038 $linkstart =
'<a href="'.$url.
'"';
2039 $linkstart .= $linkclose.
'>';
2042 $result .= $linkstart;
2044 $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);
2046 if ($withpicto != 2) {
2047 $result .= $this->ref;
2049 $result .= $linkend;
2052 global $action, $hookmanager;
2053 $hookmanager->initHooks(array(
'bomlinedao'));
2054 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
2055 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
2057 $result = $hookmanager->resPrint;
2059 $result .= $hookmanager->resPrint;
2098 $sql =
'SELECT rowid, date_creation as datec, tms as datem,';
2099 $sql .=
' fk_user_creat, fk_user_modif';
2100 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as t';
2101 $sql .=
' WHERE t.rowid = '.((int) $id);
2102 $result = $this->db->query($sql);
2104 if ($this->db->num_rows($result)) {
2105 $obj = $this->db->fetch_object($result);
2107 $this->
id = $obj->rowid;
2109 $this->user_creation_id = $obj->fk_user_creat;
2110 $this->user_modification_id = $obj->fk_user_modif;
2111 $this->date_creation = $this->db->jdate($obj->datec);
2112 $this->date_modification = empty($obj->datem) ?
'' : $this->db->jdate($obj->datem);
2114 $this->db->free($result);
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
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...
static replaceProduct(DoliDB $db, $origin_id, $dest_id)
Function used to replace a product id with another one.
fetchLines()
Load object lines in memory from the database.
is_photo_available($sdir)
Return if at least one photo is available.
__construct(DoliDB $db)
Constructor.
calculateCosts()
BOM costs calculation based on cost_price or pmp of each BOM line.
info($id)
Load the info information in the object.
getLibStatut($mode=0)
Return label of the status.
initAsSpecimen()
Initialise object with example values Id must be 0 if object instance is a specimen.
validate($user, $notrigger=0)
Validate bom.
reopen($user, $notrigger=0)
Set cancel status.
cancel($user, $notrigger=0)
Set cancel status.
LibStatut($status, $mode=0)
Return the status.
doScheduledJob()
Action executed by scheduler CAN BE A CRON TASK.
getParentBomTreeRecursive(&$TParentBom, $bom_id=0, $level=1)
Recursively retrieves all parent bom in the tree that leads to the $bom_id bom.
getTooltipContentArray($params)
getTooltipContentArray
fetchLinesbytypeproduct($typeproduct=0)
Load object lines in memory from the database by type of product.
deleteLine(User $user, $idline, $notrigger=0)
Delete a line of object in database.
createFromClone(User $user, $fromid)
Clone an object into another one.
fetch($id, $ref=null)
Load object in memory from the database.
getNomUrl($withpicto=0, $option='', $notooltip=0, $morecss='', $save_lastsearch_value=-1)
Return a link to the object card (with optionally the picto)
updateLine($rowid, $qty, $qty_frozen=0, $disable_stock_change=0, $efficiency=1.0, $position=-1, $import_key=null, $fk_unit=0, $array_options=array(), $fk_default_workstation=null)
Update an BOM line into database.
getNetNeeds(&$TNetNeeds=array(), $qty=0)
Get Net needs by product.
create(User $user, $notrigger=1)
Create object into database.
getNextNumRef($prod)
Returns the reference to the following non used BOM depending on the active numbering module defined ...
generateDocument($modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0, $moreparams=null)
Create a document onto disk according to template module.
getLinesArray()
Create an array of lines.
setDraft($user, $notrigger=0)
Set draft status.
getKanbanView($option='', $arraydata=null)
Return clicable link of object (with eventually picto)
update(User $user, $notrigger=1)
Update object into database.
fetchAll($sortorder='', $sortfield='', $limit=0, $offset=0, $filter='', $filtermode='AND')
Load list of objects in memory from the database.
addLine($fk_product, $qty, $qty_frozen=0, $disable_stock_change=0, $efficiency=1.0, $position=-1, $fk_bom_child=null, $import_key=null, $fk_unit=0, $array_options=array(), $fk_default_workstation=null)
Add an BOM line into database (linked to BOM)
getNetNeedsTree(&$TNetNeeds=array(), $qty=0, $level=0)
Get/add Net needs Tree by product or bom.
fetch($id, $ref=null)
Load object in memory from the database.
getLibStatut($mode=0)
Return label of the status.
__construct(DoliDB $db)
Constructor.
update(User $user, $notrigger=0)
Update object into database.
fetchAll($sortorder='', $sortfield='', $limit=0, $offset=0, $filter='', $filtermode='AND')
Load list of objects in memory from the database.
getNomUrl($withpicto=0, $option='', $notooltip=0, $morecss='', $save_lastsearch_value=-1)
Return a link to the object card (with optionally the picto)
initAsSpecimen()
Initialise object with example values Id must be 0 if object instance is a specimen.
info($id)
Load the info information in the object.
LibStatut($status, $mode=0)
Return the status.
create(User $user, $notrigger=0)
Create object into database.
Parent class of all other business classes (invoices, contracts, proposals, orders,...
commonGenerateDocument($modelspath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams=null)
Common function for all objects extending CommonObject for generating documents.
setErrorsFromObject($object)
setErrorsFromObject
createCommon(User $user, $notrigger=0)
Create object in the database.
getFieldList($alias='', $excludefields=array())
Function to concat keys of fields.
updateCommon(User $user, $notrigger=0)
Update object into database.
setStatusCommon($user, $status, $notrigger=0, $triggercode='')
Set to a status.
initAsSpecimenCommon()
Initialise object with example values Id must be 0 if object instance is a specimen.
copy_linked_contact($objFrom, $source='internal')
Copy contact from one element to current.
fetch_product()
Load the product with id $this->fk_product into this->product.
fetchLinesCommon($morewhere='', $noextrafields=0)
Load object in memory from the database.
static commonReplaceProduct(DoliDB $dbs, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
Function used to replace a product id with another one.
line_max($fk_parent_line=0)
Get max value used for position of line (rang)
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.
call_trigger($triggerName, $user)
Call trigger based on this instance.
Parent class for class inheritance lines of business objects This class is useless for the moment so ...
Class to manage Dolibarr database access.
Class to manage predefined suppliers products.
Class to manage products or services.
Class to manage Dolibarr users.
convertDurationtoHour($duration_value, $duration_unit)
Convert duration to hour.
dol_is_file($pathoffile)
Return if path is a file.
dol_dir_list($utf8_path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0, $nbsecondsold=0)
Scan a directory and return a list of files/directories.
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_osencode($str)
Return a string encoded into OS filesystem encoding.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
forgeSQLFromUniversalSearchCriteria($filter, &$errorstr='', $noand=0, $nopar=0, $noerror=0)
forgeSQLFromUniversalSearchCriteria
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_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
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.
utf8_check($str)
Check if a string is in UTF8.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
image_format_supported($file, $acceptsvg=0)
Return if a filename is file name of a supported image format.
measuringUnitString($unit, $measuring_style='', $scale='', $use_short_label=0, $outputlangs=null)
Return translation label of a unit key.
publicphonebutton2 phonegreen basiclayout basiclayout TotalHT VATCode TotalVAT TotalLT1 TotalLT2 TotalTTC TotalHT clearboth nowraponall TAKEPOS_SHOW_SUBPRICE right right right takeposterminal SELECT e e e e e statut