28require_once DOL_DOCUMENT_ROOT.
'/core/class/commonobject.class.php';
29require_once DOL_DOCUMENT_ROOT.
'/core/class/commonobjectline.class.php';
40 public $element =
'mo';
45 public $table_element =
'mrp_mo';
50 public $picto =
'mrp';
53 const STATUS_DRAFT = 0;
54 const STATUS_VALIDATED = 1;
55 const STATUS_INPROGRESS = 2;
56 const STATUS_PRODUCED = 3;
57 const STATUS_CANCELED = 9;
89 public $fields = array(
90 'rowid' => array(
'type' =>
'integer',
'label' =>
'TechnicalID',
'enabled' => 1,
'visible' => -2,
'position' => 1,
'notnull' => 1,
'index' => 1,
'comment' =>
"Id",),
91 'entity' => array(
'type' =>
'integer',
'label' =>
'Entity',
'enabled' => 1,
'visible' => 0,
'position' => 5,
'notnull' => 1,
'default' =>
'1',
'index' => 1),
92 'ref' => array(
'type' =>
'varchar(128)',
'label' =>
'Ref',
'enabled' => 1,
'visible' => 4,
'position' => 10,
'notnull' => 1,
'default' =>
'(PROV)',
'index' => 1,
'searchall' => 1,
'comment' =>
"Reference of object",
'showoncombobox' => 1,
'noteditable' => 1),
93 'fk_bom' => array(
'type' =>
'integer:Bom:bom/class/bom.class.php:0:(t.status:=:1)',
'filter' =>
'active=1',
'label' =>
'BOM',
'enabled' =>
'$conf->bom->enabled',
'visible' => 1,
'position' => 33,
'notnull' => -1,
'index' => 1,
'comment' =>
"Original BOM",
'css' =>
'minwidth100 maxwidth500',
'csslist' =>
'tdoverflowmax150',
'picto' =>
'bom'),
94 'mrptype' => array(
'type' =>
'integer',
'label' =>
'Type',
'enabled' => 1,
'visible' => 1,
'position' => 34,
'notnull' => 1,
'default' =>
'0',
'arrayofkeyval' => array(0 =>
'Manufacturing', 1 =>
'Disassemble'),
'css' =>
'minwidth150',
'csslist' =>
'minwidth150 center'),
95 'fk_product' => array(
'type' =>
'integer:Product:product/class/product.class.php:0',
'label' =>
'Product',
'enabled' =>
'isModEnabled("product")',
'visible' => 1,
'position' => 35,
'notnull' => 1,
'index' => 1,
'comment' =>
"Product to produce",
'css' =>
'maxwidth300',
'csslist' =>
'tdoverflowmax100',
'picto' =>
'product'),
96 'qty' => array(
'type' =>
'real',
'label' =>
'QtyToProduce',
'enabled' => 1,
'visible' => 1,
'position' => 40,
'notnull' => 1,
'comment' =>
"Qty to produce",
'css' =>
'width75',
'default' =>
'1',
'isameasure' => 1),
97 'label' => array(
'type' =>
'varchar(255)',
'label' =>
'Label',
'enabled' => 1,
'visible' => 1,
'position' => 42,
'notnull' => -1,
'searchall' => 1,
'showoncombobox' => 2,
'css' =>
'maxwidth300',
'csslist' =>
'tdoverflowmax200',
'alwayseditable' => 1),
98 'fk_soc' => array(
'type' =>
'integer:Societe:societe/class/societe.class.php:1',
'label' =>
'ThirdParty',
'picto' =>
'company',
'enabled' =>
'isModEnabled("societe")',
'visible' => -1,
'position' => 50,
'notnull' => -1,
'index' => 1,
'css' =>
'maxwidth400',
'csslist' =>
'tdoverflowmax150'),
99 'fk_project' => array(
'type' =>
'integer:Project:projet/class/project.class.php:1:(fk_statut:=:1)',
'label' =>
'Project',
'picto' =>
'project',
'enabled' =>
'$conf->project->enabled',
'visible' => -1,
'position' => 51,
'notnull' => -1,
'index' => 1,
'css' =>
'minwidth200 maxwidth400',
'csslist' =>
'tdoverflowmax100'),
100 'fk_warehouse' => array(
'type' =>
'integer:Entrepot:product/stock/class/entrepot.class.php:0',
'label' =>
'WarehouseForProduction',
'picto' =>
'stock',
'enabled' =>
'isModEnabled("stock")',
'visible' => 1,
'position' => 52,
'css' =>
'maxwidth400',
'csslist' =>
'tdoverflowmax200'),
101 'note_public' => array(
'type' =>
'html',
'label' =>
'NotePublic',
'enabled' => 1,
'visible' => 0,
'position' => 61,
'notnull' => -1,),
102 'note_private' => array(
'type' =>
'html',
'label' =>
'NotePrivate',
'enabled' => 1,
'visible' => 0,
'position' => 62,
'notnull' => -1,),
103 'date_creation' => array(
'type' =>
'datetime',
'label' =>
'DateCreation',
'enabled' => 1,
'visible' => -2,
'position' => 500,
'notnull' => 1,),
104 'tms' => array(
'type' =>
'timestamp',
'label' =>
'DateModification',
'enabled' => 1,
'visible' => -2,
'position' => 501,
'notnull' => 1,),
105 'date_valid' => array(
'type' =>
'datetime',
'label' =>
'DateValidation',
'enabled' => 1,
'visible' => -2,
'position' => 502,),
106 'fk_user_creat' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'UserAuthor',
'enabled' => 1,
'visible' => -2,
'position' => 510,
'notnull' => 1,
'foreignkey' =>
'user.rowid',
'csslist' =>
'tdoverflowmax100'),
107 'fk_user_modif' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'UserModif',
'enabled' => 1,
'visible' => -2,
'position' => 511,
'notnull' => -1,
'csslist' =>
'tdoverflowmax100'),
108 'date_start_planned' => array(
'type' =>
'datetime',
'label' =>
'DateStartPlannedMo',
'enabled' => 1,
'visible' => 1,
'position' => 55,
'notnull' => -1,
'index' => 1,
'help' =>
'KeepEmptyForAsap',
'alwayseditable' => 1,
'csslist' =>
'nowraponall'),
109 'date_end_planned' => array(
'type' =>
'datetime',
'label' =>
'DateEndPlannedMo',
'enabled' => 1,
'visible' => 1,
'position' => 56,
'notnull' => -1,
'index' => 1,
'alwayseditable' => 1,
'csslist' =>
'nowraponall'),
110 'import_key' => array(
'type' =>
'varchar(14)',
'label' =>
'ImportId',
'enabled' => 1,
'visible' => -2,
'position' => 1000,
'notnull' => -1,),
111 'model_pdf' => array(
'type' =>
'varchar(255)',
'label' =>
'Model pdf',
'enabled' => 1,
'visible' => 0,
'position' => 1010),
112 'status' => array(
'type' =>
'integer',
'label' =>
'Status',
'enabled' => 1,
'visible' => 2,
'position' => 1000,
'default' =>
'0',
'notnull' => 1,
'index' => 1,
'arrayofkeyval' => array(
'0' =>
'Draft',
'1' =>
'Validated',
'2' =>
'InProgress',
'3' =>
'StatusMOProduced',
'9' =>
'Canceled')),
113 'fk_parent_line' => array(
'type' =>
'integer:MoLine:mrp/class/mo.class.php',
'label' =>
'ParentMo',
'enabled' => 1,
'visible' => 0,
'position' => 1020,
'default' =>
'0',
'notnull' => 0,
'index' => 1,
'showoncombobox' => 0),
129 public $fk_warehouse;
141 public $note_private;
146 public $date_creation;
153 public $fk_user_creat;
154 public $fk_user_modif;
171 public $date_start_planned;
176 public $date_end_planned;
205 public $table_element_line =
'mrp_production';
210 public $fk_element =
'fk_mo';
215 public $class_element_line =
'MoLine';
220 protected $childtables = array();
225 protected $childtablesoncascade = array(
'mrp_production');
230 public $lines = array();
240 public $fk_parent_line;
245 public $tpl = array();
259 $this->ismultientitymanaged = 1;
260 $this->isextrafieldmanaged = 1;
263 $this->fields[
'rowid'][
'visible'] = 0;
265 if (!isModEnabled(
'multicompany') && isset($this->fields[
'entity'])) {
266 $this->fields[
'entity'][
'enabled'] = 0;
270 foreach ($this->fields as $key => $val) {
271 if (isset($val[
'enabled']) && empty($val[
'enabled'])) {
272 unset($this->fields[$key]);
277 foreach ($this->fields as $key => $val) {
278 if (!empty($val[
'arrayofkeyval']) && is_array($val[
'arrayofkeyval'])) {
279 foreach ($val[
'arrayofkeyval'] as $key2 => $val2) {
280 $this->fields[$key][
'arrayofkeyval'][$key2] = $langs->trans($val2);
300 include_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
301 $tmpproduct =
new Product($this->db);
302 $tmpproduct->fetch($this->fk_product);
303 if ($tmpproduct->hasFatherOrChild(1) > 0) {
304 $this->error =
'ErrorAVirtualProductCantBeUsedIntoABomOrMo';
305 $this->errors[] = $this->error;
312 if ($this->fk_bom > 0) {
314 include_once DOL_DOCUMENT_ROOT.
'/bom/class/bom.class.php';
315 $tmpbom =
new BOM($this->db);
316 $tmpbom->fetch($this->fk_bom);
318 $this->mrptype = $tmpbom->bomtype;
323 if ($idcreated <= 0) {
339 $this->db->rollback();
353 global $langs, $extrafields;
363 $result =
$object->fetchCommon($fromid);
364 if ($result > 0 && !empty(
$object->table_element_line)) {
382 foreach ($TLines as $key => $line) {
383 if (in_array($line->role, array(
'consumed',
'produced'))) {
392 $object->ref = empty($this->fields[
'ref'][
'default']) ?
"copy_of_".$object->ref : $this->fields[
'ref'][
'default'];
393 $object->label = empty($this->fields[
'label'][
'default']) ? $langs->trans(
"CopyOf").
" ".
$object->label : $this->fields[
'label'][
'default'];
394 $object->status = self::STATUS_DRAFT;
397 if (is_array(
$object->array_options) && count(
$object->array_options) > 0) {
398 $extrafields->fetch_name_optionals_label($this->table_element);
399 foreach (
$object->array_options as $key => $option) {
400 $shortkey = preg_replace(
'/options_/',
'', $key);
401 if (!empty($extrafields->attributes[$this->element][
'unique'][$shortkey])) {
404 unset(
$object->array_options[$key]);
410 $object->context[
'createfromclone'] =
'createfromclone';
411 $result =
$object->createCommon($user);
415 $this->errors =
$object->errors;
427 if (property_exists($this,
'socid') && $this->socid ==
$object->socid) {
434 unset(
$object->context[
'createfromclone']);
441 $this->db->rollback();
453 public function fetch($id, $ref =
null)
456 if ($result > 0 && !empty($this->table_element_line)) {
460 $this->socid = $this->fk_soc;
472 $this->lines = array();
490 public function fetchAll($sortorder =
'', $sortfield =
'', $limit = 0, $offset = 0, $filter =
'', $filtermode =
'AND')
498 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as t';
499 if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
500 $sql .=
' WHERE t.entity IN ('.getEntity($this->element).
')';
502 $sql .=
' WHERE 1 = 1';
506 if (is_array($filter)) {
508 if (count($filter) > 0) {
509 foreach ($filter as $key => $value) {
510 if ($key ==
't.rowid') {
511 $sqlwhere[] = $this->db->sanitize($key).
" = ".((int) $value);
512 } elseif (strpos($key,
'date') !==
false) {
513 $sqlwhere[] = $this->db->sanitize($key).
" = '".$this->db->idate($value).
"'";
515 $sqlwhere[] = $this->db->sanitize($key).
" LIKE '%".$this->db->escape($this->db->escapeforlike($value)).
"%'";
519 if (count($sqlwhere) > 0) {
520 $sql .=
' AND ('.implode(
' '.$this->db->escape($filtermode).
' ', $sqlwhere).
')';
530 $this->errors[] = $errormessage;
531 dol_syslog(__METHOD__.
' '.implode(
',', $this->errors), LOG_ERR);
535 if (!empty($sortfield)) {
536 $sql .= $this->db->order($sortfield, $sortorder);
538 if (!empty($limit)) {
539 $sql .= $this->db->plimit($limit, $offset);
542 $resql = $this->db->query($sql);
544 $num = $this->db->num_rows($resql);
546 while ($i < min($limit, $num)) {
547 $obj = $this->db->fetch_object($resql);
549 $record =
new self($this->db);
550 $record->setVarsFromFetchObj($obj);
552 $records[$record->id] = $record;
556 $this->db->free($resql);
560 $this->errors[] =
'Error '.$this->db->lasterror();
561 dol_syslog(__METHOD__.
' '.implode(
',', $this->errors), LOG_ERR);
577 $mostatic =
new MoLine($this->db);
580 $sql .= $mostatic->getFieldList();
581 $sql .=
' FROM '.MAIN_DB_PREFIX.$mostatic->table_element.
' as t';
582 $sql .=
" WHERE t.role = '".$this->db->escape($role).
"'";
584 $sql .=
' AND t.fk_mrp_production = '.((int) $lineid);
586 $sql .=
'AND t.fk_mo = '.((int) $this->
id);
589 $resql = $this->db->query($sql);
591 $num = $this->db->num_rows($resql);
595 $obj = $this->db->fetch_object($resql);
598 'rowid' => $obj->rowid,
599 'date' => $this->db->jdate($obj->date_creation),
601 'role' => $obj->role,
602 'fk_product' => $obj->fk_product,
603 'fk_warehouse' => $obj->fk_warehouse,
604 'batch' => $obj->batch,
605 'fk_stock_movement' => $obj->fk_stock_movement,
606 'fk_unit' => $obj->fk_unit
615 $this->error = $this->db->lasterror();
630 $sql =
'SELECT COUNT(rowid) as nb FROM '.MAIN_DB_PREFIX.
'stock_mouvement as sm';
631 $sql .=
" WHERE sm.origintype = 'mo' and sm.fk_origin = ".((int) $this->
id);
633 $resql = $this->db->query($sql);
635 $num = $this->db->num_rows($resql);
639 $obj = $this->db->fetch_object($resql);
647 $this->error = $this->db->lasterror();
682 $this->db->rollback();
700 if ($this->
status != self::STATUS_DRAFT) {
708 $sql =
'DELETE FROM '.MAIN_DB_PREFIX.
'mrp_production WHERE fk_mo = '.((int) $this->
id);
709 $this->db->query($sql);
711 $moline =
new MoLine($this->db);
714 $moline->fk_mo = $this->id;
715 $moline->qty = $this->qty;
716 $moline->fk_product = $this->fk_product;
717 $moline->position = 1;
718 include_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
719 $tmpproduct =
new Product($this->db);
720 $tmpproduct->fetch($this->fk_product);
721 $moline->fk_unit = $tmpproduct->fk_unit;
723 if ($this->fk_bom > 0) {
724 include_once DOL_DOCUMENT_ROOT.
'/bom/class/bom.class.php';
725 $bom =
new BOM($this->db);
726 $bom->fetch($this->fk_bom);
727 if ($bom->bomtype == 1) {
729 $moline->role =
'toconsume';
732 $moline->role =
'toproduce';
735 if ($this->mrptype == 1) {
736 $moline->role =
'toconsume';
738 $moline->role =
'toproduce';
742 $resultline = $moline->create($user,
false);
743 if ($resultline <= 0) {
745 $this->error = $moline->error;
746 $this->errors = $moline->errors;
749 if ($this->fk_bom > 0) {
753 foreach ($bom->lines as $line) {
754 $moline =
new MoLine($this->db);
756 $moline->fk_mo = $this->id;
757 $moline->origin_id = $line->id;
758 $moline->origin_type =
'bomline';
759 if (!empty($line->fk_unit)) {
760 $moline->fk_unit = $line->fk_unit;
762 if ($line->qty_frozen) {
763 $moline->qty = $line->qty;
765 $moline->qty = (float)
price2num(($line->qty / (!empty($bom->qty) ? $bom->qty : 1)) * $this->qty / (!empty($line->efficiency) ? $line->efficiency : 1),
'MS');
767 if ($moline->qty <= 0) {
769 $this->error =
"BadValueForquantityToConsume";
770 $this->errors[] = $this->error;
773 $moline->fk_product = $line->fk_product;
774 $moline->role = $role;
775 $moline->position = $line->position;
776 $moline->qty_frozen = $line->qty_frozen;
777 $moline->disable_stock_change = $line->disable_stock_change;
778 if (!empty($line->fk_default_workstation)) {
779 $moline->fk_default_workstation = $line->fk_default_workstation;
782 $resultline = $moline->create($user,
false);
783 if ($resultline <= 0) {
785 $this->error = $moline->error;
786 $this->errors[] = $moline->error;
787 $this->errors = array_merge($this->errors, $moline->errors);
802 $this->db->rollback();
818 if ($this->
status != self::STATUS_DRAFT) {
824 $oldQty = $this->oldQty;
825 $newQty = $this->qty;
826 if ($newQty != $oldQty && !empty($this->oldQty)) {
827 $sql =
"SELECT rowid FROM " . MAIN_DB_PREFIX .
"mrp_production WHERE fk_mo = " . (int) $this->
id;
828 $resql = $this->db->query($sql);
830 while ($obj = $this->db->fetch_object($resql)) {
831 $moLine =
new MoLine($this->db);
832 $res = $moLine->fetch($obj->rowid);
837 if ($moLine->role ==
'toconsume' || $moLine->role ==
'toproduce') {
838 if (empty($moLine->qty_frozen)) {
839 $qty = $newQty * $moLine->qty / $oldQty;
840 $moLine->qty = (float)
price2num($qty,
'MS');
841 $res = $moLine->update($user);
854 $this->db->rollback();
868 public function delete(
User $user, $notrigger = 0, $also_cancel_consumed_and_produced_lines =
false)
873 if ($also_cancel_consumed_and_produced_lines) {
888 $this->db->rollback();
905 public function deleteLine(
User $user, $idline, $notrigger = 0, $fk_movement = 0)
908 $langs->loadLangs(array(
'stocks',
'mrp'));
911 $this->error =
'ErrorDeleteLineNotAllowedByObjectStatus';
914 $productstatic =
new Product($this->db);
922 if (!empty($arrayoflines)) {
925 $stockmove->setOrigin($this->element, $this->
id);
927 if (!empty($fk_movement)) {
929 $moline =
new MoLine($this->db);
930 $TArrayMoLine = $moline->fetchAll(
'',
'', 1, 0,
'(fk_stock_movement:=:'.((
int) $fk_movement).
')');
931 $moline = array_shift($TArrayMoLine);
934 $movement->fetch($fk_movement);
935 $productstatic->fetch($movement->product_id);
936 $qtytoprocess = $movement->qty;
939 $labelmovementCancel = $langs->trans(
"CancelProductionForRef", $productstatic->ref);
940 $codemovementCancel = $langs->trans(
"StockIncrease");
942 if (($qtytoprocess >= 0)) {
943 $idstockmove = $stockmove->reception($user, $movement->product_id, $movement->warehouse_id, $qtytoprocess, 0, $labelmovementCancel,
'',
'', $movement->batch,
dol_now(), 0, $codemovementCancel);
945 $idstockmove = $stockmove->livraison($user, $movement->product_id, $movement->warehouse_id, $qtytoprocess, 0, $labelmovementCancel,
dol_now(),
'',
'', $movement->batch, 0, $codemovementCancel);
947 if ($idstockmove < 0) {
951 $result = $moline->delete($user, $notrigger);
955 foreach ($arrayoflines as $key => $arrayofline) {
956 $lineDetails = $arrayoflines[$key];
957 $productstatic->fetch($lineDetails[
'fk_product']);
958 $qtytoprocess = $lineDetails[
'qty'];
961 $labelmovementCancel = $langs->trans(
"CancelProductionForRef", $productstatic->ref);
962 $codemovementCancel = $langs->trans(
"StockIncrease");
965 if ($qtytoprocess >= 0) {
966 $idstockmove = $stockmove->reception($user, $lineDetails[
'fk_product'], $lineDetails[
'fk_warehouse'], $qtytoprocess, 0, $labelmovementCancel,
'',
'', $lineDetails[
'batch'],
dol_now(), 0, $codemovementCancel);
968 $idstockmove = $stockmove->livraison($user, $lineDetails[
'fk_product'], $lineDetails[
'fk_warehouse'], $qtytoprocess, 0, $labelmovementCancel,
dol_now(),
'',
'', $lineDetails[
'batch'], 0, $codemovementCancel);
970 if ($idstockmove < 0) {
974 $moline =
new MoLine($this->db);
975 $moline->fetch($lineDetails[
'rowid']);
977 $resdel = $moline->delete($user, $notrigger);
985 if (empty($this->error)) {
994 if (!empty($this->error) || $result <= 0) {
995 $this->db->rollback();
1013 global $langs, $conf;
1014 $langs->load(
"mrp");
1023 $dirmodels = array_merge(array(
'/'), (array) $conf->modules_parts[
'models']);
1024 foreach ($dirmodels as $reldir) {
1028 $mybool = ((bool) @include_once $dir.$file) || $mybool;
1031 if ($mybool ===
false) {
1036 $obj =
new $classname();
1037 $numref = $obj->getNextValue($prod, $this);
1039 if ($numref !=
"") {
1042 $this->error = $obj->error;
1047 print $langs->trans(
"Error").
" ".$langs->trans(
"Error_MRP_MO_ADDON_NotDefined");
1063 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1068 if ($this->
status == self::STATUS_VALIDATED) {
1069 dol_syslog(get_class($this).
"::validate action abandoned: already validated", LOG_WARNING);
1086 if (!$error && (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref))) {
1092 $this->newref = $num;
1095 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
1096 $sql .=
" SET ref = '".$this->db->escape($num).
"',";
1097 $sql .=
" status = ".self::STATUS_VALIDATED.
",";
1098 $sql .=
" date_valid='".$this->db->idate($now).
"',";
1099 $sql .=
" fk_user_valid = ".$user->id;
1100 $sql .=
" WHERE rowid = ".((int) $this->
id);
1102 dol_syslog(get_class($this).
"::validate()", LOG_DEBUG);
1103 $resql = $this->db->query($sql);
1106 $this->error = $this->db->lasterror();
1110 if (!$error && !$notrigger) {
1112 $result = $this->
call_trigger(
'MRP_MO_VALIDATE', $user);
1120 $this->oldref = $this->ref;
1123 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
1125 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filename = CONCAT('".$this->db->escape($this->newref).
"', SUBSTR(filename, ".(strlen($this->
ref) + 1).
")), filepath = 'mrp/".$this->db->escape($this->newref).
"'";
1126 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'mrp/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
1127 $resql = $this->db->query($sql);
1130 $this->error = $this->db->lasterror();
1132 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filepath = 'mrp/".$this->db->escape($this->newref).
"'";
1133 $sql .=
" WHERE filepath = 'mrp/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
1134 $resql = $this->db->query($sql);
1137 $this->error = $this->db->lasterror();
1143 $dirsource = $conf->mrp->dir_output.
'/'.$oldref;
1144 $dirdest = $conf->mrp->dir_output.
'/'.$newref;
1145 if (!$error && file_exists($dirsource)) {
1146 dol_syslog(get_class($this).
"::validate() rename dir ".$dirsource.
" into ".$dirdest);
1148 if (@rename($dirsource, $dirdest)) {
1151 $listoffiles =
dol_dir_list($conf->mrp->dir_output.
'/'.$newref,
'files', 1,
'^'.preg_quote($oldref,
'/'));
1152 foreach ($listoffiles as $fileentry) {
1153 $dirsource = $fileentry[
'name'];
1154 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
1155 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
1156 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
1157 @rename($dirsource, $dirdest);
1167 $this->
status = self::STATUS_VALIDATED;
1171 $this->db->commit();
1174 $this->db->rollback();
1189 if ($this->
status <= self::STATUS_DRAFT) {
1200 return $this->
setStatusCommon($user, self::STATUS_DRAFT, $notrigger,
'MRP_MO_UNVALIDATE');
1211 public function cancel($user, $notrigger = 0, $also_cancel_consumed_and_produced_lines =
false)
1214 if ($this->
status != self::STATUS_VALIDATED && $this->
status != self::STATUS_INPROGRESS) {
1228 if ($also_cancel_consumed_and_produced_lines) {
1236 $result = $this->
setStatusCommon($user, self::STATUS_CANCELED, $notrigger,
'MRP_MO_CANCEL');
1243 $this->db->rollback();
1246 $this->db->commit();
1258 public function reopen($user, $notrigger = 0)
1261 if ($this->
status != self::STATUS_PRODUCED && $this->
status != self::STATUS_CANCELED) {
1272 return $this->
setStatusCommon($user, self::STATUS_VALIDATED, $notrigger,
'MRP_MO_REOPEN');
1288 if (!isModEnabled(
'stock')) {
1292 require_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
1293 require_once DOL_DOCUMENT_ROOT .
'/product/stock/class/mouvementstock.class.php';
1295 $langs->load(
'stocks');
1300 if (empty($mode) || $mode == 1) {
1302 if (!empty($arrayoflines)) {
1303 foreach ($arrayoflines as $key => $lineDetails) {
1304 $productstatic =
new Product($this->db);
1305 $productstatic->fetch($lineDetails[
'fk_product']);
1306 $qtytoprocess = $lineDetails[
'qty'];
1309 $labelmovementCancel = $langs->trans(
"CancelProductionForRef", $productstatic->ref);
1310 $codemovementCancel = $langs->trans(
"StockIncrease");
1313 $stockmove->setOrigin($this->element, $this->
id);
1314 if ($qtytoprocess >= 0) {
1315 $idstockmove = $stockmove->reception($user, $lineDetails[
'fk_product'], $lineDetails[
'fk_warehouse'], $qtytoprocess, 0, $labelmovementCancel,
'',
'', $lineDetails[
'batch'],
dol_now(), 0, $codemovementCancel);
1317 $idstockmove = $stockmove->livraison($user, $lineDetails[
'fk_product'], $lineDetails[
'fk_warehouse'], $qtytoprocess, 0, $labelmovementCancel,
dol_now(),
'',
'', $lineDetails[
'batch'], 0, $codemovementCancel);
1319 if ($idstockmove < 0) {
1320 $this->error = $stockmove->error;
1321 $this->errors = $stockmove->errors;
1326 if ($also_delete_lines) {
1327 $result = $this->
deleteLineCommon($user, $lineDetails[
'rowid'], $notrigger);
1338 if (empty($mode) || $mode == 2) {
1340 if (!empty($arrayoflines)) {
1341 foreach ($arrayoflines as $key => $lineDetails) {
1342 $productstatic =
new Product($this->db);
1343 $productstatic->fetch($lineDetails[
'fk_product']);
1344 $qtytoprocess = $lineDetails[
'qty'];
1347 $labelmovementCancel = $langs->trans(
"CancelProductionForRef", $productstatic->ref);
1348 $codemovementCancel = $langs->trans(
"StockDecrease");
1351 $stockmove->setOrigin($this->element, $this->
id);
1352 if ($qtytoprocess >= 0) {
1353 $idstockmove = $stockmove->livraison($user, $lineDetails[
'fk_product'], $lineDetails[
'fk_warehouse'], $qtytoprocess, 0, $labelmovementCancel,
dol_now(),
'',
'', $lineDetails[
'batch'], 0, $codemovementCancel);
1355 $idstockmove = $stockmove->reception($user, $lineDetails[
'fk_product'], $lineDetails[
'fk_warehouse'], $qtytoprocess, 0, $labelmovementCancel,
'',
'', $lineDetails[
'batch'],
dol_now(), 0, $codemovementCancel);
1357 if ($idstockmove < 0) {
1358 $this->error = $stockmove->error;
1359 $this->errors = $stockmove->errors;
1364 if ($also_delete_lines) {
1365 $result = $this->
deleteLineCommon($user, $lineDetails[
'rowid'], $notrigger);
1376 $this->db->rollback();
1379 $this->db->commit();
1395 $langs->loadLangs([
'mrp',
'products']);
1396 $nofetch = isset($params[
'nofetch']) ? true :
false;
1400 $datas[
'picto'] =
img_picto(
'', $this->picto).
' <u class="paddingrightonly">'.$langs->trans(
"ManufacturingOrder").
'</u>';
1401 if (isset($this->
status)) {
1402 $datas[
'picto'] .=
' '.$this->getLibStatut(5);
1404 $datas[
'ref'] =
'<br><b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
1405 if (isset($this->label)) {
1406 $datas[
'label'] =
'<br><b>'.$langs->trans(
'Label').
':</b> '.$this->label;
1408 if (isset($this->mrptype)) {
1409 $datas[
'type'] =
'<br><b>'.$langs->trans(
'Type').
':</b> '.$this->fields[
'mrptype'][
'arrayofkeyval'][$this->mrptype];
1411 if (isset($this->qty)) {
1412 $datas[
'qty'] =
'<br><b>'.$langs->trans(
'QtyToProduce').
':</b> '.$this->qty;
1414 if (!$nofetch && isset($this->fk_product)) {
1415 require_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
1416 $product =
new Product($this->db);
1417 $product->fetch($this->fk_product);
1418 $datas[
'product'] =
'<br><b>'.$langs->trans(
'Product').
':</b> '.$product->getNomUrl(1,
'', 0, -1, 1);
1420 if (!$nofetch && isset($this->fk_warehouse)) {
1421 require_once DOL_DOCUMENT_ROOT .
'/product/stock/class/entrepot.class.php';
1422 $warehouse =
new Entrepot($this->db);
1423 $warehouse->fetch($this->fk_warehouse);
1424 $datas[
'warehouse'] =
'<br><b>'.$langs->trans(
'WarehouseForProduction').
':</b> '.$warehouse->getNomUrl(1,
'', 0, 1);
1440 public function getNomUrl($withpicto = 0, $option =
'', $notooltip = 0, $morecss =
'', $save_lastsearch_value = -1)
1442 global $conf, $langs, $action, $hookmanager;
1444 if (!empty($conf->dol_no_mouse_hover)) {
1451 'objecttype' => $this->element,
1452 'option' => $option,
1455 $classfortooltip =
'classfortooltip';
1458 $classfortooltip =
'classforajaxtooltip';
1459 $dataparams =
' data-params="'.dol_escape_htmltag(json_encode($params)).
'"';
1465 $url = DOL_URL_ROOT.
'/mrp/mo_card.php?id='.$this->id;
1466 if ($option ==
'production') {
1467 $url = DOL_URL_ROOT.
'/mrp/mo_production.php?id='.$this->id;
1470 if ($option !=
'nolink') {
1472 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
1473 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
1474 $add_save_lastsearch_values = 1;
1476 if ($add_save_lastsearch_values) {
1477 $url .=
'&save_lastsearch_values=1';
1482 if (empty($notooltip)) {
1484 $label = $langs->trans(
"ShowMo");
1485 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
1487 $linkclose .= ($label ?
' title="'.dol_escape_htmltag($label, 1).
'"' :
' title="tocomplete"');
1488 $linkclose .= $dataparams.
' class="'.$classfortooltip.($morecss ?
' '.$morecss :
'').
'"';
1490 $linkclose = ($morecss ?
' class="'.$morecss.
'"' :
'');
1493 $linkstart =
'<a href="'.$url.
'"';
1494 $linkstart .= $linkclose.
'>';
1497 $result .= $linkstart;
1499 $result .=
img_object(($notooltip ?
'' : $label), ($this->picto ? $this->picto :
'generic'), (($withpicto != 2) ?
'class="paddingright"' :
''), 0, 0, $notooltip ? 0 : 1);
1501 if ($withpicto != 2) {
1502 $result .= $this->ref;
1504 $result .= $linkend;
1507 $hookmanager->initHooks(array(
'modao'));
1508 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
1509 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
1511 $result = $hookmanager->resPrint;
1513 $result .= $hookmanager->resPrint;
1541 if (empty($this->labelStatus)) {
1544 $this->labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
'Draft');
1545 $this->labelStatus[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
'ValidatedToProduce');
1546 $this->labelStatus[self::STATUS_INPROGRESS] = $langs->transnoentitiesnoconv(
'InProgress');
1547 $this->labelStatus[self::STATUS_PRODUCED] = $langs->transnoentitiesnoconv(
'StatusMOProduced');
1548 $this->labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv(
'Canceled');
1550 $this->labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
'Draft');
1551 $this->labelStatusShort[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
'Validated');
1552 $this->labelStatusShort[self::STATUS_INPROGRESS] = $langs->transnoentitiesnoconv(
'InProgress');
1553 $this->labelStatusShort[self::STATUS_PRODUCED] = $langs->transnoentitiesnoconv(
'StatusMOProduced');
1554 $this->labelStatusShort[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv(
'Canceled');
1557 $statusType =
'status'.$status;
1558 if ($status == self::STATUS_VALIDATED) {
1559 $statusType =
'status1';
1561 if ($status == self::STATUS_INPROGRESS) {
1562 $statusType =
'status4';
1564 if ($status == self::STATUS_PRODUCED) {
1565 $statusType =
'status6';
1567 if ($status == self::STATUS_CANCELED) {
1568 $statusType =
'status9';
1571 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status],
'', $statusType, $mode);
1582 $sql =
'SELECT rowid, date_creation as datec, tms as datem,';
1583 $sql .=
' fk_user_creat, fk_user_modif';
1584 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as t';
1585 $sql .=
' WHERE t.rowid = '.((int) $id);
1586 $result = $this->db->query($sql);
1588 if ($this->db->num_rows($result)) {
1589 $obj = $this->db->fetch_object($result);
1591 $this->
id = $obj->rowid;
1593 $this->user_creation_id = $obj->fk_user_creat;
1594 $this->user_modification_id = $obj->fk_user_modif;
1595 $this->date_creation = $this->db->jdate($obj->datec);
1596 $this->date_modification = empty($obj->datem) ?
'' : $this->db->jdate($obj->datem);
1599 $this->db->free($result);
1615 $this->lines = array();
1628 $this->lines = array();
1630 $objectline =
new MoLine($this->db);
1632 $filter =
'(fk_mo:=:'.((int) $this->
id).
')';
1633 if (!empty($rolefilter)) {
1634 $filter .=
" AND (role:=:'".$this->db->escape($rolefilter).
"')";
1636 $result = $objectline->fetchAll(
'ASC',
'position', 0, 0, $filter);
1638 if (is_numeric($result)) {
1639 $this->error = $objectline->error;
1640 $this->errors = $objectline->errors;
1643 $this->lines = $result;
1644 return $this->lines;
1659 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
1663 $langs->load(
"mrp");
1669 if ($this->model_pdf) {
1670 $modele = $this->model_pdf;
1676 $modelpath =
"core/modules/mrp/doc/";
1678 if (empty($modele)) {
1682 return $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
1697 global $langs, $hookmanager, $form, $action;
1699 $langs->load(
'stocks');
1700 $text_stock_options = $langs->trans(
"RealStockDesc").
'<br>';
1701 $text_stock_options .= $langs->trans(
"RealStockWillAutomaticallyWhen").
'<br>';
1702 $text_stock_options .= (
getDolGlobalString(
'STOCK_CALCULATE_ON_SHIPMENT') ||
getDolGlobalString(
'STOCK_CALCULATE_ON_SHIPMENT_CLOSE') ?
'- '.$langs->trans(
"DeStockOnShipment").
'<br>' :
'');
1703 $text_stock_options .= (
getDolGlobalString(
'STOCK_CALCULATE_ON_VALIDATE_ORDER') ?
'- '.$langs->trans(
"DeStockOnValidateOrder").
'<br>' :
'');
1704 $text_stock_options .= (
getDolGlobalString(
'STOCK_CALCULATE_ON_BILL') ?
'- '.$langs->trans(
"DeStockOnBill").
'<br>' :
'');
1705 $text_stock_options .= (
getDolGlobalString(
'STOCK_CALCULATE_ON_SUPPLIER_BILL') ?
'- '.$langs->trans(
"ReStockOnBill").
'<br>' :
'');
1706 $text_stock_options .= (
getDolGlobalString(
'STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER') ?
'- '.$langs->trans(
"ReStockOnValidateOrder").
'<br>' :
'');
1707 $text_stock_options .= (
getDolGlobalString(
'STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER') ?
'- '.$langs->trans(
"ReStockOnDispatchOrder").
'<br>' :
'');
1708 $text_stock_options .= (
getDolGlobalString(
'STOCK_CALCULATE_ON_RECEPTION') ||
getDolGlobalString(
'STOCK_CALCULATE_ON_RECEPTION_CLOSE') ?
'- '.$langs->trans(
"StockOnReception").
'<br>' :
'');
1710 print
'<tr class="liste_titre">';
1712 print
'<td class="linecoldescription">'.$langs->trans(
'Ref');
1714 print
' <a id="show_all" href="#">'.img_picto(
'',
'folder-open',
'class="paddingright"').$langs->trans(
"ExpandAll").
'</a> ';
1715 print
'<a id="hide_all" href="#">'.img_picto(
'',
'folder',
'class="paddingright"').$langs->trans(
"UndoExpandAll").
'</a> ';
1719 print
'<td class="right">'.$langs->trans(
'Qty');
1720 if ($this->bom->bomtype == 0) {
1721 print
' <span class="opacitymedium">('.$langs->trans(
"ForAQuantityOf", $this->bom->qty).
')</span>';
1723 print
' <span class="opacitymedium">('.$langs->trans(
"ForAQuantityToConsumeOf", $this->bom->qty).
')</span>';
1726 print
'<td class="right">'.$langs->trans(
'Unit');
1729 print
'<td class="center">'.$form->textwithpicto($langs->trans(
"PhysicalStock"), $text_stock_options, 1).
'</td>';
1730 print
'<td class="center">'.$form->textwithpicto($langs->trans(
"VirtualStock"), $langs->trans(
"VirtualStockDesc")).
'</td>';
1731 print
'<td class="center">'.$langs->trans(
'QtyFrozen').
'</td>';
1732 print
'<td class="center">'.$langs->trans(
'DisableStockChange').
'</td>';
1733 print
'<td class="center">'.$langs->trans(
'MoChildGenerate').
'</td>';
1739 if (!empty($this->lines)) {
1740 foreach ($this->lines as $line) {
1742 if (is_object($hookmanager)) {
1743 $parameters = array(
'line' => $line,
'i' => $i,
'restrictlist' => $restrictlist,
'selectedLines' => $selectedLines);
1744 if (!empty($line->fk_parent_line)) {
1745 $parameters[
'fk_parent_line'] = $line->fk_parent_line;
1747 $reshook = $hookmanager->executeHooks(
'printOriginObjectLine', $parameters, $this, $action);
1749 if (empty($reshook)) {
1750 $this->
printOriginLine($line,
'', $restrictlist,
'/core/tpl', $selectedLines);
1772 public function printOriginLine($line, $var, $restrictlist =
'', $defaulttpldir =
'/core/tpl', $selectedLines = array())
1774 $productstatic =
new Product($this->db);
1776 $this->tpl[
'id'] = $line->id;
1778 $this->tpl[
'label'] =
'';
1779 if (!empty($line->fk_product) && $line->fk_product > 0) {
1780 $productstatic->fetch($line->fk_product);
1781 $productstatic->load_virtual_stock();
1782 $this->tpl[
'label'] .= $productstatic->getNomUrl(1);
1789 $this->tpl[
'qty_bom'] = 1;
1790 if (is_object($this->bom) && $this->bom->qty > 1) {
1791 $this->tpl[
'qty_bom'] = $this->bom->qty;
1794 $this->tpl[
'stock'] = $productstatic->stock_reel;
1795 $this->tpl[
'seuil_stock_alerte'] = $productstatic->seuil_stock_alerte;
1796 $this->tpl[
'virtual_stock'] = $productstatic->stock_theorique;
1797 $this->tpl[
'qty'] = $line->qty;
1798 $this->tpl[
'fk_unit'] = $line->fk_unit;
1799 $this->tpl[
'qty_frozen'] = $line->qty_frozen;
1800 $this->tpl[
'disable_stock_change'] = $line->disable_stock_change;
1801 $this->tpl[
'efficiency'] = $line->efficiency;
1804 $res = include DOL_DOCUMENT_ROOT.
'/mrp/tpl/originproductline.tpl.php';
1817 $tables = array(
'mrp_mo');
1830 $TMoChilds = array();
1833 $sql =
"SELECT rowid FROM ".MAIN_DB_PREFIX.
"mrp_mo as mo_child";
1834 $sql .=
" WHERE fk_parent_line IN ";
1835 $sql .=
" (SELECT rowid FROM ".MAIN_DB_PREFIX.
"mrp_production as line_parent";
1836 $sql .=
" WHERE fk_mo=".((int) $this->
id).
")";
1838 $resql = $this->db->query($sql);
1841 if ($this->db->num_rows($resql) > 0) {
1842 while ($obj = $this->db->fetch_object($resql)) {
1843 $MoChild =
new Mo($this->db);
1844 $res = $MoChild->fetch($obj->rowid);
1846 $TMoChilds[$MoChild->id] = $MoChild;
1871 if ($depth > 1000) {
1875 $TMoChilds = array();
1880 if ($childMoList == -1) {
1884 foreach ($childMoList as $childMo) {
1885 $TMoChilds[$childMo->id] = $childMo;
1888 foreach ($childMoList as $childMo) {
1889 $childMoChildren = $childMo->getAllMoChilds($depth + 1);
1891 if ($childMoChildren == -1) {
1894 foreach ($childMoChildren as $child) {
1895 $TMoChilds[$child->id] = $child;
1916 $MoParent =
new Mo($this->db);
1919 $sql =
"SELECT lineparent.fk_mo as id_moparent FROM ".MAIN_DB_PREFIX.
"mrp_mo as mo";
1920 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"mrp_production lineparent ON mo.fk_parent_line = lineparent.rowid";
1921 $sql .=
" WHERE mo.rowid = ".((int) $this->
id);
1923 $resql = $this->db->query($sql);
1926 if ($this->db->num_rows($resql) > 0) {
1927 $obj = $this->db->fetch_object($resql);
1928 $res = $MoParent->fetch($obj->id_moparent);
1957 $selected = (empty($arraydata[
'selected']) ? 0 : $arraydata[
'selected']);
1959 $return =
'<div class="box-flex-item box-flex-grow-zero">';
1960 $return .=
'<div class="info-box info-box-sm">';
1961 $return .=
'<span class="info-box-icon bg-infobox-action">';
1964 $return .=
'</span>';
1965 $return .=
'<div class="info-box-content">';
1966 $return .=
'<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">'.(method_exists($this,
'getNomUrl') ? $this->
getNomUrl() : $this->ref).
'</span>';
1967 if ($selected >= 0) {
1968 $return .=
'<input id="cb'.$this->id.
'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->
id.
'"'.($selected ?
' checked="checked"' :
'').
'>';
1970 if (!empty($arraydata[
'bom'])) {
1971 $return .=
'<br><span class="info-box-label">'.$arraydata[
'bom']->getNomUrl(1).
'</span>';
1973 if (!empty($arraydata[
'product'])) {
1974 $return .=
'<br><span class="info-box-label">'.$arraydata[
'product']->getNomUrl(1).
'</span>';
1975 if (property_exists($this,
'qty')) {
1976 $return .=
' <span class="info-box-label">('.$langs->trans(
"Qty").
' '.$this->qty.
')</span>';
1979 if (property_exists($this,
'qty')) {
1980 $return .=
'<br><span class="info-box-label">'.$langs->trans(
'Quantity').
' : '.$this->qty.
'</span>';
1983 if (method_exists($this,
'getLibStatut')) {
1984 $return .=
'<br><div class="info-box-status">'.$this->getLibStatut(3).
'</div>';
1986 $return .=
'</div>';
1987 $return .=
'</div>';
1988 $return .=
'</div>';
2002 public $element =
'mrp_production';
2007 public $table_element =
'mrp_production';
2060 'rowid' => array(
'type' =>
'integer',
'label' =>
'ID',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 10),
2061 'fk_mo' => array(
'type' =>
'integer',
'label' =>
'Mo',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 15),
2062 'origin_id' => array(
'type' =>
'integer',
'label' =>
'Origin',
'enabled' => 1,
'visible' => -1,
'notnull' => 0,
'position' => 17),
2063 'origin_type' => array(
'type' =>
'varchar(10)',
'label' =>
'Origin type',
'enabled' => 1,
'visible' => -1,
'notnull' => 0,
'position' => 18),
2064 'position' => array(
'type' =>
'integer',
'label' =>
'Position',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 20),
2065 'fk_product' => array(
'type' =>
'integer',
'label' =>
'Product',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 25),
2066 'fk_warehouse' => array(
'type' =>
'integer',
'label' =>
'Warehouse',
'enabled' => 1,
'visible' => -1,
'position' => 30),
2067 'qty' => array(
'type' =>
'real',
'label' =>
'Qty',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 35),
2068 'qty_frozen' => array(
'type' =>
'smallint',
'label' =>
'QuantityFrozen',
'enabled' => 1,
'visible' => 1,
'default' =>
'0',
'notnull' => 1,
'position' => 105,
'css' =>
'maxwidth50imp',
'help' =>
'QuantityConsumedInvariable'),
2069 'disable_stock_change' => array(
'type' =>
'smallint',
'label' =>
'DisableStockChange',
'enabled' => 1,
'visible' => 1,
'default' =>
'0',
'notnull' => 1,
'position' => 108,
'css' =>
'maxwidth50imp',
'help' =>
'DisableStockChangeHelp'),
2070 'batch' => array(
'type' =>
'varchar(30)',
'label' =>
'Batch',
'enabled' => 1,
'visible' => -1,
'position' => 140),
2071 'role' => array(
'type' =>
'varchar(10)',
'label' =>
'Role',
'enabled' => 1,
'visible' => -1,
'position' => 145),
2072 'fk_mrp_production' => array(
'type' =>
'integer',
'label' =>
'Fk mrp production',
'enabled' => 1,
'visible' => -1,
'position' => 150),
2073 'fk_stock_movement' => array(
'type' =>
'integer',
'label' =>
'StockMovement',
'enabled' => 1,
'visible' => -1,
'position' => 155),
2074 'date_creation' => array(
'type' =>
'datetime',
'label' =>
'DateCreation',
'enabled' => 1,
'visible' => -2,
'notnull' => 1,
'position' => 160),
2075 'tms' => array(
'type' =>
'timestamp',
'label' =>
'Tms',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 165),
2076 'fk_user_creat' => array(
'type' =>
'integer',
'label' =>
'UserCreation',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 170),
2077 'fk_user_modif' => array(
'type' =>
'integer',
'label' =>
'UserModification',
'enabled' => 1,
'visible' => -1,
'position' => 175),
2078 'import_key' => array(
'type' =>
'varchar(14)',
'label' =>
'ImportId',
'enabled' => 1,
'visible' => -1,
'position' => 180),
2079 'fk_default_workstation' => array(
'type' =>
'integer',
'label' =>
'DefaultWorkstation',
'enabled' => 1,
'visible' => 1,
'notnull' => 0,
'position' => 185),
2080 'fk_unit' => array(
'type' =>
'int',
'label' =>
'Unit',
'enabled' => 1,
'visible' => 1,
'notnull' => 0,
'position' => 186)
2086 public $origin_type;
2089 public $fk_warehouse;
2100 public $disable_stock_change;
2104 public $fk_mrp_production;
2105 public $fk_stock_movement;
2106 public $date_creation;
2107 public $fk_user_creat;
2108 public $fk_user_modif;
2110 public $fk_parent_line;
2116 public $fk_default_workstation;
2129 $this->ismultientitymanaged = 0;
2130 $this->isextrafieldmanaged = 1;
2132 if (!
getDolGlobalString(
'MAIN_SHOW_TECHNICAL_ID') && isset($this->fields[
'rowid'])) {
2133 $this->fields[
'rowid'][
'visible'] = 0;
2135 if (!isModEnabled(
'multicompany') && isset($this->fields[
'entity'])) {
2136 $this->fields[
'entity'][
'enabled'] = 0;
2140 foreach ($this->fields as $key => $val) {
2141 if (isset($val[
'enabled']) && empty($val[
'enabled'])) {
2142 unset($this->fields[$key]);
2147 if (is_object($langs)) {
2148 foreach ($this->fields as $key => $val) {
2149 if (!empty($val[
'arrayofkeyval']) && is_array($val[
'arrayofkeyval'])) {
2150 foreach ($val[
'arrayofkeyval'] as $key2 => $val2) {
2151 $this->fields[$key][
'arrayofkeyval'][$key2] = $langs->trans($val2);
2167 if (empty($this->qty)) {
2168 $this->error =
'ErrorEmptyValueForQty';
2199 public function fetchAll($sortorder =
'', $sortfield =
'', $limit = 0, $offset = 0, $filter =
'', $filtermode =
'AND')
2207 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as t';
2208 if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
2209 $sql .=
' WHERE t.entity IN ('.getEntity($this->element).
')';
2211 $sql .=
' WHERE 1 = 1';
2215 if (is_array($filter)) {
2216 $sqlwhere = array();
2217 if (count($filter) > 0) {
2218 foreach ($filter as $key => $value) {
2219 if ($key ==
't.rowid') {
2220 $sqlwhere[] = $key.
" = ".((int) $value);
2221 } elseif (strpos($key,
'date') !==
false) {
2222 $sqlwhere[] = $key.
" = '".$this->db->idate($value).
"'";
2224 $sqlwhere[] = $key.
" LIKE '%".$this->db->escape($this->db->escapeforlike($value)).
"%'";
2228 if (count($sqlwhere) > 0) {
2229 $sql .=
' AND ('.implode(
' '.$this->db->escape($filtermode).
' ', $sqlwhere).
')';
2238 if ($errormessage) {
2239 $this->errors[] = $errormessage;
2240 dol_syslog(__METHOD__.
' '.implode(
',', $this->errors), LOG_ERR);
2244 if (!empty($sortfield)) {
2245 $sql .= $this->db->order($sortfield, $sortorder);
2247 if (!empty($limit)) {
2248 $sql .= $this->db->plimit($limit, $offset);
2251 $resql = $this->db->query($sql);
2253 $num = $this->db->num_rows($resql);
2255 while ($i < ($limit ? min($limit, $num) : $num)) {
2256 $obj = $this->db->fetch_object($resql);
2258 $record =
new self($this->db);
2259 $record->setVarsFromFetchObj($obj);
2261 $records[$record->id] = $record;
2265 $this->db->free($resql);
2269 $this->errors[] =
'Error '.$this->db->lasterror();
2270 dol_syslog(__METHOD__.
' '.implode(
',', $this->errors), LOG_ERR);
2295 public function delete(
User $user, $notrigger = 0)
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...
Parent class of all other business classes (invoices, contracts, proposals, orders,...
deleteLineCommon(User $user, $idline, $notrigger=0)
Delete a line of object in database.
commonGenerateDocument($modelspath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams=null)
Common function for all objects extending CommonObject for generating documents.
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.
static commonReplaceThirdparty(DoliDB $dbs, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
Function used to replace a thirdparty id with another one.
fetch_product()
Load the product with id $this->fk_product into this->product.
fetchLinesCommon($morewhere='', $noextrafields=0)
Load object in memory from the database.
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 warehouses.
__construct(DoliDB $db)
Constructor.
fetchLinesLinked($role, $lineid=0)
Get list of lines linked to current line for a defined role.
getMoChilds()
Function used to return children of Mo.
static replaceThirdparty($db, $origin_id, $dest_id)
Function used to replace a thirdparty id with another one.
printOriginLinesList($restrictlist='', $selectedLines=array())
Return HTML table table of source object lines TODO Move this and previous function into output html ...
fetchLines()
Load object lines in memory from the database.
getNextNumRef($prod)
Returns the reference to the following non used MO depending on the active numbering module defined i...
create(User $user, $notrigger=0)
Create object into database.
fetch($id, $ref=null)
Load object in memory from the database.
fetchAll($sortorder='', $sortfield='', $limit=0, $offset=0, $filter='', $filtermode='AND')
Load list of objects in memory from the database.
initAsSpecimen()
Initialise object with example values Id must be 0 if object instance is a specimen.
reopen($user, $notrigger=0)
Set back to validated status.
getMoParent()
Function used to return children of Mo.
getLinesArray($rolefilter='')
Create an array of lines.
updateProduction(User $user, $notrigger=0)
Update quantities in lines to consume and/or lines to produce.
LibStatut($status, $mode=0)
Return the status.
cancel($user, $notrigger=0, $also_cancel_consumed_and_produced_lines=false)
Set cancel status.
setDraft($user, $notrigger=0)
Set draft status.
printOriginLine($line, $var, $restrictlist='', $defaulttpldir='/core/tpl', $selectedLines=array())
Return HTML with a line of table array of source object lines TODO Move this and previous function in...
update(User $user, $notrigger=0)
Update object into database.
getAllMoChilds($depth=0)
Function used to return all child MOs recursively.
createProduction(User $user, $notrigger=0)
Erase and update the line to consume and to produce.
deleteLine(User $user, $idline, $notrigger=0, $fk_movement=0)
Delete a line of object in database.
getKanbanView($option='', $arraydata=null)
Return clicable link of object (with eventually picto)
validate($user, $notrigger=0)
Validate Mo.
cancelConsumedAndProducedLines($user, $mode=0, $also_delete_lines=false, $notrigger=0)
Cancel consumed and produced lines (movement stocks)
generateDocument($modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0, $moreparams=null)
Create a document onto disk according to template module.
getTooltipContentArray($params)
getTooltipContentArray
getNomUrl($withpicto=0, $option='', $notooltip=0, $morecss='', $save_lastsearch_value=-1)
Return a link to the object card (with optionally the picto)
getLibStatut($mode=0)
Return label of the status.
info($id)
Load the info information in the object.
countMovements()
Count number of movement with origin of MO.
createFromClone(User $user, $fromid)
Clone an object into another one.
update(User $user, $notrigger=0)
Update object into database.
create(User $user, $notrigger=0)
Create object into database.
fetchAll($sortorder='', $sortfield='', $limit=0, $offset=0, $filter='', $filtermode='AND')
Load list of objects in memory from the database.
__construct(DoliDB $db)
Constructor.
fetch($id, $ref=null)
Load object in memory from the database.
$fields
'type' field format: 'integer', 'integer:ObjectClass:PathToClass[:AddCreateButtonOrNot[:Filter[:Sortf...
Class to manage stock movements.
Class to manage products or services.
Class to manage Dolibarr users.
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)
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.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
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.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.