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";
772 $moline->fk_product = $line->fk_product;
773 $moline->role = $role;
774 $moline->position = $line->position;
775 $moline->qty_frozen = $line->qty_frozen;
776 $moline->disable_stock_change = $line->disable_stock_change;
777 if (!empty($line->fk_default_workstation)) {
778 $moline->fk_default_workstation = $line->fk_default_workstation;
781 $resultline = $moline->create($user,
false);
782 if ($resultline <= 0) {
784 $this->error = $moline->error;
785 $this->errors = $moline->errors;
800 $this->db->rollback();
816 if ($this->
status != self::STATUS_DRAFT) {
822 $oldQty = $this->oldQty;
823 $newQty = $this->qty;
824 if ($newQty != $oldQty && !empty($this->oldQty)) {
825 $sql =
"SELECT rowid FROM " . MAIN_DB_PREFIX .
"mrp_production WHERE fk_mo = " . (int) $this->
id;
826 $resql = $this->db->query($sql);
828 while ($obj = $this->db->fetch_object($resql)) {
829 $moLine =
new MoLine($this->db);
830 $res = $moLine->fetch($obj->rowid);
835 if ($moLine->role ==
'toconsume' || $moLine->role ==
'toproduce') {
836 if (empty($moLine->qty_frozen)) {
837 $qty = $newQty * $moLine->qty / $oldQty;
838 $moLine->qty = (float)
price2num($qty,
'MS');
839 $res = $moLine->update($user);
852 $this->db->rollback();
866 public function delete(
User $user, $notrigger = 0, $also_cancel_consumed_and_produced_lines =
false)
871 if ($also_cancel_consumed_and_produced_lines) {
886 $this->db->rollback();
903 public function deleteLine(
User $user, $idline, $notrigger = 0, $fk_movement = 0)
906 $langs->loadLangs(array(
'stocks',
'mrp'));
909 $this->error =
'ErrorDeleteLineNotAllowedByObjectStatus';
912 $productstatic =
new Product($this->db);
920 if (!empty($arrayoflines)) {
923 $stockmove->setOrigin($this->element, $this->
id);
925 if (!empty($fk_movement)) {
927 $moline =
new MoLine($this->db);
928 $TArrayMoLine = $moline->fetchAll(
'',
'', 1, 0,
'(fk_stock_movement:=:'.((
int) $fk_movement).
')');
929 $moline = array_shift($TArrayMoLine);
932 $movement->fetch($fk_movement);
933 $productstatic->fetch($movement->product_id);
934 $qtytoprocess = $movement->qty;
937 $labelmovementCancel = $langs->trans(
"CancelProductionForRef", $productstatic->ref);
938 $codemovementCancel = $langs->trans(
"StockIncrease");
940 if (($qtytoprocess >= 0)) {
941 $idstockmove = $stockmove->reception($user, $movement->product_id, $movement->warehouse_id, $qtytoprocess, 0, $labelmovementCancel,
'',
'', $movement->batch,
dol_now(), 0, $codemovementCancel);
943 $idstockmove = $stockmove->livraison($user, $movement->product_id, $movement->warehouse_id, $qtytoprocess, 0, $labelmovementCancel,
dol_now(),
'',
'', $movement->batch, 0, $codemovementCancel);
945 if ($idstockmove < 0) {
949 $result = $moline->delete($user, $notrigger);
953 foreach ($arrayoflines as $key => $arrayofline) {
954 $lineDetails = $arrayoflines[$key];
955 $productstatic->fetch($lineDetails[
'fk_product']);
956 $qtytoprocess = $lineDetails[
'qty'];
959 $labelmovementCancel = $langs->trans(
"CancelProductionForRef", $productstatic->ref);
960 $codemovementCancel = $langs->trans(
"StockIncrease");
963 if ($qtytoprocess >= 0) {
964 $idstockmove = $stockmove->reception($user, $lineDetails[
'fk_product'], $lineDetails[
'fk_warehouse'], $qtytoprocess, 0, $labelmovementCancel,
'',
'', $lineDetails[
'batch'],
dol_now(), 0, $codemovementCancel);
966 $idstockmove = $stockmove->livraison($user, $lineDetails[
'fk_product'], $lineDetails[
'fk_warehouse'], $qtytoprocess, 0, $labelmovementCancel,
dol_now(),
'',
'', $lineDetails[
'batch'], 0, $codemovementCancel);
968 if ($idstockmove < 0) {
972 $moline =
new MoLine($this->db);
973 $moline->fetch($lineDetails[
'rowid']);
975 $resdel = $moline->delete($user, $notrigger);
983 if (empty($this->error)) {
992 if (!empty($this->error) || $result <= 0) {
993 $this->db->rollback();
1011 global $langs, $conf;
1012 $langs->load(
"mrp");
1021 $dirmodels = array_merge(array(
'/'), (array) $conf->modules_parts[
'models']);
1022 foreach ($dirmodels as $reldir) {
1026 $mybool = ((bool) @include_once $dir.$file) || $mybool;
1029 if ($mybool ===
false) {
1034 $obj =
new $classname();
1035 $numref = $obj->getNextValue($prod, $this);
1037 if ($numref !=
"") {
1040 $this->error = $obj->error;
1045 print $langs->trans(
"Error").
" ".$langs->trans(
"Error_MRP_MO_ADDON_NotDefined");
1061 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1066 if ($this->
status == self::STATUS_VALIDATED) {
1067 dol_syslog(get_class($this).
"::validate action abandoned: already validated", LOG_WARNING);
1084 if (!$error && (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref))) {
1090 $this->newref = $num;
1093 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
1094 $sql .=
" SET ref = '".$this->db->escape($num).
"',";
1095 $sql .=
" status = ".self::STATUS_VALIDATED.
",";
1096 $sql .=
" date_valid='".$this->db->idate($now).
"',";
1097 $sql .=
" fk_user_valid = ".$user->id;
1098 $sql .=
" WHERE rowid = ".((int) $this->
id);
1100 dol_syslog(get_class($this).
"::validate()", LOG_DEBUG);
1101 $resql = $this->db->query($sql);
1104 $this->error = $this->db->lasterror();
1108 if (!$error && !$notrigger) {
1110 $result = $this->
call_trigger(
'MRP_MO_VALIDATE', $user);
1118 $this->oldref = $this->ref;
1121 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
1123 $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).
"'";
1124 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'mrp/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
1125 $resql = $this->db->query($sql);
1128 $this->error = $this->db->lasterror();
1130 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filepath = 'mrp/".$this->db->escape($this->newref).
"'";
1131 $sql .=
" WHERE filepath = 'mrp/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
1132 $resql = $this->db->query($sql);
1135 $this->error = $this->db->lasterror();
1141 $dirsource = $conf->mrp->dir_output.
'/'.$oldref;
1142 $dirdest = $conf->mrp->dir_output.
'/'.$newref;
1143 if (!$error && file_exists($dirsource)) {
1144 dol_syslog(get_class($this).
"::validate() rename dir ".$dirsource.
" into ".$dirdest);
1146 if (@rename($dirsource, $dirdest)) {
1149 $listoffiles =
dol_dir_list($conf->mrp->dir_output.
'/'.$newref,
'files', 1,
'^'.preg_quote($oldref,
'/'));
1150 foreach ($listoffiles as $fileentry) {
1151 $dirsource = $fileentry[
'name'];
1152 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
1153 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
1154 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
1155 @rename($dirsource, $dirdest);
1165 $this->
status = self::STATUS_VALIDATED;
1169 $this->db->commit();
1172 $this->db->rollback();
1187 if ($this->
status <= self::STATUS_DRAFT) {
1198 return $this->
setStatusCommon($user, self::STATUS_DRAFT, $notrigger,
'MRP_MO_UNVALIDATE');
1209 public function cancel($user, $notrigger = 0, $also_cancel_consumed_and_produced_lines =
false)
1212 if ($this->
status != self::STATUS_VALIDATED && $this->
status != self::STATUS_INPROGRESS) {
1226 if ($also_cancel_consumed_and_produced_lines) {
1234 $result = $this->
setStatusCommon($user, self::STATUS_CANCELED, $notrigger,
'MRP_MO_CANCEL');
1241 $this->db->rollback();
1244 $this->db->commit();
1256 public function reopen($user, $notrigger = 0)
1259 if ($this->
status != self::STATUS_PRODUCED && $this->
status != self::STATUS_CANCELED) {
1270 return $this->
setStatusCommon($user, self::STATUS_VALIDATED, $notrigger,
'MRP_MO_REOPEN');
1286 if (!isModEnabled(
'stock')) {
1290 require_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
1291 require_once DOL_DOCUMENT_ROOT .
'/product/stock/class/mouvementstock.class.php';
1293 $langs->load(
'stocks');
1298 if (empty($mode) || $mode == 1) {
1300 if (!empty($arrayoflines)) {
1301 foreach ($arrayoflines as $key => $lineDetails) {
1302 $productstatic =
new Product($this->db);
1303 $productstatic->fetch($lineDetails[
'fk_product']);
1304 $qtytoprocess = $lineDetails[
'qty'];
1307 $labelmovementCancel = $langs->trans(
"CancelProductionForRef", $productstatic->ref);
1308 $codemovementCancel = $langs->trans(
"StockIncrease");
1311 $stockmove->setOrigin($this->element, $this->
id);
1312 if ($qtytoprocess >= 0) {
1313 $idstockmove = $stockmove->reception($user, $lineDetails[
'fk_product'], $lineDetails[
'fk_warehouse'], $qtytoprocess, 0, $labelmovementCancel,
'',
'', $lineDetails[
'batch'],
dol_now(), 0, $codemovementCancel);
1315 $idstockmove = $stockmove->livraison($user, $lineDetails[
'fk_product'], $lineDetails[
'fk_warehouse'], $qtytoprocess, 0, $labelmovementCancel,
dol_now(),
'',
'', $lineDetails[
'batch'], 0, $codemovementCancel);
1317 if ($idstockmove < 0) {
1318 $this->error = $stockmove->error;
1319 $this->errors = $stockmove->errors;
1324 if ($also_delete_lines) {
1325 $result = $this->
deleteLineCommon($user, $lineDetails[
'rowid'], $notrigger);
1336 if (empty($mode) || $mode == 2) {
1338 if (!empty($arrayoflines)) {
1339 foreach ($arrayoflines as $key => $lineDetails) {
1340 $productstatic =
new Product($this->db);
1341 $productstatic->fetch($lineDetails[
'fk_product']);
1342 $qtytoprocess = $lineDetails[
'qty'];
1345 $labelmovementCancel = $langs->trans(
"CancelProductionForRef", $productstatic->ref);
1346 $codemovementCancel = $langs->trans(
"StockDecrease");
1349 $stockmove->setOrigin($this->element, $this->
id);
1350 if ($qtytoprocess >= 0) {
1351 $idstockmove = $stockmove->livraison($user, $lineDetails[
'fk_product'], $lineDetails[
'fk_warehouse'], $qtytoprocess, 0, $labelmovementCancel,
dol_now(),
'',
'', $lineDetails[
'batch'], 0, $codemovementCancel);
1353 $idstockmove = $stockmove->reception($user, $lineDetails[
'fk_product'], $lineDetails[
'fk_warehouse'], $qtytoprocess, 0, $labelmovementCancel,
'',
'', $lineDetails[
'batch'],
dol_now(), 0, $codemovementCancel);
1355 if ($idstockmove < 0) {
1356 $this->error = $stockmove->error;
1357 $this->errors = $stockmove->errors;
1362 if ($also_delete_lines) {
1363 $result = $this->
deleteLineCommon($user, $lineDetails[
'rowid'], $notrigger);
1374 $this->db->rollback();
1377 $this->db->commit();
1393 $langs->loadLangs([
'mrp',
'products']);
1394 $nofetch = isset($params[
'nofetch']) ? true :
false;
1398 $datas[
'picto'] =
img_picto(
'', $this->picto).
' <u class="paddingrightonly">'.$langs->trans(
"ManufacturingOrder").
'</u>';
1399 if (isset($this->
status)) {
1400 $datas[
'picto'] .=
' '.$this->getLibStatut(5);
1402 $datas[
'ref'] =
'<br><b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
1403 if (isset($this->label)) {
1404 $datas[
'label'] =
'<br><b>'.$langs->trans(
'Label').
':</b> '.$this->label;
1406 if (isset($this->mrptype)) {
1407 $datas[
'type'] =
'<br><b>'.$langs->trans(
'Type').
':</b> '.$this->fields[
'mrptype'][
'arrayofkeyval'][$this->mrptype];
1409 if (isset($this->qty)) {
1410 $datas[
'qty'] =
'<br><b>'.$langs->trans(
'QtyToProduce').
':</b> '.$this->qty;
1412 if (!$nofetch && isset($this->fk_product)) {
1413 require_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
1414 $product =
new Product($this->db);
1415 $product->fetch($this->fk_product);
1416 $datas[
'product'] =
'<br><b>'.$langs->trans(
'Product').
':</b> '.$product->getNomUrl(1,
'', 0, -1, 1);
1418 if (!$nofetch && isset($this->fk_warehouse)) {
1419 require_once DOL_DOCUMENT_ROOT .
'/product/stock/class/entrepot.class.php';
1420 $warehouse =
new Entrepot($this->db);
1421 $warehouse->fetch($this->fk_warehouse);
1422 $datas[
'warehouse'] =
'<br><b>'.$langs->trans(
'WarehouseForProduction').
':</b> '.$warehouse->getNomUrl(1,
'', 0, 1);
1438 public function getNomUrl($withpicto = 0, $option =
'', $notooltip = 0, $morecss =
'', $save_lastsearch_value = -1)
1440 global $conf, $langs, $action, $hookmanager;
1442 if (!empty($conf->dol_no_mouse_hover)) {
1449 'objecttype' => $this->element,
1450 'option' => $option,
1453 $classfortooltip =
'classfortooltip';
1456 $classfortooltip =
'classforajaxtooltip';
1457 $dataparams =
' data-params="'.dol_escape_htmltag(json_encode($params)).
'"';
1463 $url = DOL_URL_ROOT.
'/mrp/mo_card.php?id='.$this->id;
1464 if ($option ==
'production') {
1465 $url = DOL_URL_ROOT.
'/mrp/mo_production.php?id='.$this->id;
1468 if ($option !=
'nolink') {
1470 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
1471 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
1472 $add_save_lastsearch_values = 1;
1474 if ($add_save_lastsearch_values) {
1475 $url .=
'&save_lastsearch_values=1';
1480 if (empty($notooltip)) {
1482 $label = $langs->trans(
"ShowMo");
1483 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
1485 $linkclose .= ($label ?
' title="'.dol_escape_htmltag($label, 1).
'"' :
' title="tocomplete"');
1486 $linkclose .= $dataparams.
' class="'.$classfortooltip.($morecss ?
' '.$morecss :
'').
'"';
1488 $linkclose = ($morecss ?
' class="'.$morecss.
'"' :
'');
1491 $linkstart =
'<a href="'.$url.
'"';
1492 $linkstart .= $linkclose.
'>';
1495 $result .= $linkstart;
1497 $result .=
img_object(($notooltip ?
'' : $label), ($this->picto ? $this->picto :
'generic'), (($withpicto != 2) ?
'class="paddingright"' :
''), 0, 0, $notooltip ? 0 : 1);
1499 if ($withpicto != 2) {
1500 $result .= $this->ref;
1502 $result .= $linkend;
1505 $hookmanager->initHooks(array(
'modao'));
1506 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
1507 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
1509 $result = $hookmanager->resPrint;
1511 $result .= $hookmanager->resPrint;
1539 if (empty($this->labelStatus)) {
1542 $this->labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
'Draft');
1543 $this->labelStatus[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
'ValidatedToProduce');
1544 $this->labelStatus[self::STATUS_INPROGRESS] = $langs->transnoentitiesnoconv(
'InProgress');
1545 $this->labelStatus[self::STATUS_PRODUCED] = $langs->transnoentitiesnoconv(
'StatusMOProduced');
1546 $this->labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv(
'Canceled');
1548 $this->labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
'Draft');
1549 $this->labelStatusShort[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
'Validated');
1550 $this->labelStatusShort[self::STATUS_INPROGRESS] = $langs->transnoentitiesnoconv(
'InProgress');
1551 $this->labelStatusShort[self::STATUS_PRODUCED] = $langs->transnoentitiesnoconv(
'StatusMOProduced');
1552 $this->labelStatusShort[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv(
'Canceled');
1555 $statusType =
'status'.$status;
1556 if ($status == self::STATUS_VALIDATED) {
1557 $statusType =
'status1';
1559 if ($status == self::STATUS_INPROGRESS) {
1560 $statusType =
'status4';
1562 if ($status == self::STATUS_PRODUCED) {
1563 $statusType =
'status6';
1565 if ($status == self::STATUS_CANCELED) {
1566 $statusType =
'status9';
1569 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status],
'', $statusType, $mode);
1580 $sql =
'SELECT rowid, date_creation as datec, tms as datem,';
1581 $sql .=
' fk_user_creat, fk_user_modif';
1582 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as t';
1583 $sql .=
' WHERE t.rowid = '.((int) $id);
1584 $result = $this->db->query($sql);
1586 if ($this->db->num_rows($result)) {
1587 $obj = $this->db->fetch_object($result);
1589 $this->
id = $obj->rowid;
1591 $this->user_creation_id = $obj->fk_user_creat;
1592 $this->user_modification_id = $obj->fk_user_modif;
1593 $this->date_creation = $this->db->jdate($obj->datec);
1594 $this->date_modification = empty($obj->datem) ?
'' : $this->db->jdate($obj->datem);
1597 $this->db->free($result);
1613 $this->lines = array();
1626 $this->lines = array();
1628 $objectline =
new MoLine($this->db);
1630 $filter =
'(fk_mo:=:'.((int) $this->
id).
')';
1631 if (!empty($rolefilter)) {
1632 $filter .=
" AND (role:=:'".$this->db->escape($rolefilter).
"')";
1634 $result = $objectline->fetchAll(
'ASC',
'position', 0, 0, $filter);
1636 if (is_numeric($result)) {
1637 $this->error = $objectline->error;
1638 $this->errors = $objectline->errors;
1641 $this->lines = $result;
1642 return $this->lines;
1657 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
1661 $langs->load(
"mrp");
1667 if ($this->model_pdf) {
1668 $modele = $this->model_pdf;
1674 $modelpath =
"core/modules/mrp/doc/";
1676 if (empty($modele)) {
1680 return $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
1695 global $langs, $hookmanager, $form, $action;
1697 $langs->load(
'stocks');
1698 $text_stock_options = $langs->trans(
"RealStockDesc").
'<br>';
1699 $text_stock_options .= $langs->trans(
"RealStockWillAutomaticallyWhen").
'<br>';
1700 $text_stock_options .= (
getDolGlobalString(
'STOCK_CALCULATE_ON_SHIPMENT') ||
getDolGlobalString(
'STOCK_CALCULATE_ON_SHIPMENT_CLOSE') ?
'- '.$langs->trans(
"DeStockOnShipment").
'<br>' :
'');
1701 $text_stock_options .= (
getDolGlobalString(
'STOCK_CALCULATE_ON_VALIDATE_ORDER') ?
'- '.$langs->trans(
"DeStockOnValidateOrder").
'<br>' :
'');
1702 $text_stock_options .= (
getDolGlobalString(
'STOCK_CALCULATE_ON_BILL') ?
'- '.$langs->trans(
"DeStockOnBill").
'<br>' :
'');
1703 $text_stock_options .= (
getDolGlobalString(
'STOCK_CALCULATE_ON_SUPPLIER_BILL') ?
'- '.$langs->trans(
"ReStockOnBill").
'<br>' :
'');
1704 $text_stock_options .= (
getDolGlobalString(
'STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER') ?
'- '.$langs->trans(
"ReStockOnValidateOrder").
'<br>' :
'');
1705 $text_stock_options .= (
getDolGlobalString(
'STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER') ?
'- '.$langs->trans(
"ReStockOnDispatchOrder").
'<br>' :
'');
1706 $text_stock_options .= (
getDolGlobalString(
'STOCK_CALCULATE_ON_RECEPTION') ||
getDolGlobalString(
'STOCK_CALCULATE_ON_RECEPTION_CLOSE') ?
'- '.$langs->trans(
"StockOnReception").
'<br>' :
'');
1708 print
'<tr class="liste_titre">';
1710 print
'<td class="linecoldescription">'.$langs->trans(
'Ref');
1712 print
' <a id="show_all" href="#">'.img_picto(
'',
'folder-open',
'class="paddingright"').$langs->trans(
"ExpandAll").
'</a> ';
1713 print
'<a id="hide_all" href="#">'.img_picto(
'',
'folder',
'class="paddingright"').$langs->trans(
"UndoExpandAll").
'</a> ';
1717 print
'<td class="right">'.$langs->trans(
'Qty');
1718 if ($this->bom->bomtype == 0) {
1719 print
' <span class="opacitymedium">('.$langs->trans(
"ForAQuantityOf", $this->bom->qty).
')</span>';
1721 print
' <span class="opacitymedium">('.$langs->trans(
"ForAQuantityToConsumeOf", $this->bom->qty).
')</span>';
1724 print
'<td class="right">'.$langs->trans(
'Unit');
1727 print
'<td class="center">'.$form->textwithpicto($langs->trans(
"PhysicalStock"), $text_stock_options, 1).
'</td>';
1728 print
'<td class="center">'.$form->textwithpicto($langs->trans(
"VirtualStock"), $langs->trans(
"VirtualStockDesc")).
'</td>';
1729 print
'<td class="center">'.$langs->trans(
'QtyFrozen').
'</td>';
1730 print
'<td class="center">'.$langs->trans(
'DisableStockChange').
'</td>';
1731 print
'<td class="center">'.$langs->trans(
'MoChildGenerate').
'</td>';
1737 if (!empty($this->lines)) {
1738 foreach ($this->lines as $line) {
1740 if (is_object($hookmanager)) {
1741 $parameters = array(
'line' => $line,
'i' => $i,
'restrictlist' => $restrictlist,
'selectedLines' => $selectedLines);
1742 if (!empty($line->fk_parent_line)) {
1743 $parameters[
'fk_parent_line'] = $line->fk_parent_line;
1745 $reshook = $hookmanager->executeHooks(
'printOriginObjectLine', $parameters, $this, $action);
1747 if (empty($reshook)) {
1748 $this->
printOriginLine($line,
'', $restrictlist,
'/core/tpl', $selectedLines);
1770 public function printOriginLine($line, $var, $restrictlist =
'', $defaulttpldir =
'/core/tpl', $selectedLines = array())
1772 $productstatic =
new Product($this->db);
1774 $this->tpl[
'id'] = $line->id;
1776 $this->tpl[
'label'] =
'';
1777 if (!empty($line->fk_product) && $line->fk_product > 0) {
1778 $productstatic->fetch($line->fk_product);
1779 $productstatic->load_virtual_stock();
1780 $this->tpl[
'label'] .= $productstatic->getNomUrl(1);
1787 $this->tpl[
'qty_bom'] = 1;
1788 if (is_object($this->bom) && $this->bom->qty > 1) {
1789 $this->tpl[
'qty_bom'] = $this->bom->qty;
1792 $this->tpl[
'stock'] = $productstatic->stock_reel;
1793 $this->tpl[
'seuil_stock_alerte'] = $productstatic->seuil_stock_alerte;
1794 $this->tpl[
'virtual_stock'] = $productstatic->stock_theorique;
1795 $this->tpl[
'qty'] = $line->qty;
1796 $this->tpl[
'fk_unit'] = $line->fk_unit;
1797 $this->tpl[
'qty_frozen'] = $line->qty_frozen;
1798 $this->tpl[
'disable_stock_change'] = $line->disable_stock_change;
1799 $this->tpl[
'efficiency'] = $line->efficiency;
1802 $res = include DOL_DOCUMENT_ROOT.
'/mrp/tpl/originproductline.tpl.php';
1815 $tables = array(
'mrp_mo');
1828 $TMoChilds = array();
1831 $sql =
"SELECT rowid FROM ".MAIN_DB_PREFIX.
"mrp_mo as mo_child";
1832 $sql .=
" WHERE fk_parent_line IN ";
1833 $sql .=
" (SELECT rowid FROM ".MAIN_DB_PREFIX.
"mrp_production as line_parent";
1834 $sql .=
" WHERE fk_mo=".((int) $this->
id).
")";
1836 $resql = $this->db->query($sql);
1839 if ($this->db->num_rows($resql) > 0) {
1840 while ($obj = $this->db->fetch_object($resql)) {
1841 $MoChild =
new Mo($this->db);
1842 $res = $MoChild->fetch($obj->rowid);
1844 $TMoChilds[$MoChild->id] = $MoChild;
1869 if ($depth > 1000) {
1873 $TMoChilds = array();
1878 if ($childMoList == -1) {
1882 foreach ($childMoList as $childMo) {
1883 $TMoChilds[$childMo->id] = $childMo;
1886 foreach ($childMoList as $childMo) {
1887 $childMoChildren = $childMo->getAllMoChilds($depth + 1);
1889 if ($childMoChildren == -1) {
1892 foreach ($childMoChildren as $child) {
1893 $TMoChilds[$child->id] = $child;
1914 $MoParent =
new Mo($this->db);
1917 $sql =
"SELECT lineparent.fk_mo as id_moparent FROM ".MAIN_DB_PREFIX.
"mrp_mo as mo";
1918 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"mrp_production lineparent ON mo.fk_parent_line = lineparent.rowid";
1919 $sql .=
" WHERE mo.rowid = ".((int) $this->
id);
1921 $resql = $this->db->query($sql);
1924 if ($this->db->num_rows($resql) > 0) {
1925 $obj = $this->db->fetch_object($resql);
1926 $res = $MoParent->fetch($obj->id_moparent);
1955 $selected = (empty($arraydata[
'selected']) ? 0 : $arraydata[
'selected']);
1957 $return =
'<div class="box-flex-item box-flex-grow-zero">';
1958 $return .=
'<div class="info-box info-box-sm">';
1959 $return .=
'<span class="info-box-icon bg-infobox-action">';
1962 $return .=
'</span>';
1963 $return .=
'<div class="info-box-content">';
1964 $return .=
'<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">'.(method_exists($this,
'getNomUrl') ? $this->
getNomUrl() : $this->ref).
'</span>';
1965 if ($selected >= 0) {
1966 $return .=
'<input id="cb'.$this->id.
'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->
id.
'"'.($selected ?
' checked="checked"' :
'').
'>';
1968 if (!empty($arraydata[
'bom'])) {
1969 $return .=
'<br><span class="info-box-label">'.$arraydata[
'bom']->getNomUrl(1).
'</span>';
1971 if (!empty($arraydata[
'product'])) {
1972 $return .=
'<br><span class="info-box-label">'.$arraydata[
'product']->getNomUrl(1).
'</span>';
1973 if (property_exists($this,
'qty')) {
1974 $return .=
' <span class="info-box-label">('.$langs->trans(
"Qty").
' '.$this->qty.
')</span>';
1977 if (property_exists($this,
'qty')) {
1978 $return .=
'<br><span class="info-box-label">'.$langs->trans(
'Quantity').
' : '.$this->qty.
'</span>';
1981 if (method_exists($this,
'getLibStatut')) {
1982 $return .=
'<br><div class="info-box-status">'.$this->getLibStatut(3).
'</div>';
1984 $return .=
'</div>';
1985 $return .=
'</div>';
1986 $return .=
'</div>';
2000 public $element =
'mrp_production';
2005 public $table_element =
'mrp_production';
2058 'rowid' => array(
'type' =>
'integer',
'label' =>
'ID',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 10),
2059 'fk_mo' => array(
'type' =>
'integer',
'label' =>
'Mo',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 15),
2060 'origin_id' => array(
'type' =>
'integer',
'label' =>
'Origin',
'enabled' => 1,
'visible' => -1,
'notnull' => 0,
'position' => 17),
2061 'origin_type' => array(
'type' =>
'varchar(10)',
'label' =>
'Origin type',
'enabled' => 1,
'visible' => -1,
'notnull' => 0,
'position' => 18),
2062 'position' => array(
'type' =>
'integer',
'label' =>
'Position',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 20),
2063 'fk_product' => array(
'type' =>
'integer',
'label' =>
'Product',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 25),
2064 'fk_warehouse' => array(
'type' =>
'integer',
'label' =>
'Warehouse',
'enabled' => 1,
'visible' => -1,
'position' => 30),
2065 'qty' => array(
'type' =>
'real',
'label' =>
'Qty',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 35),
2066 'qty_frozen' => array(
'type' =>
'smallint',
'label' =>
'QuantityFrozen',
'enabled' => 1,
'visible' => 1,
'default' =>
'0',
'notnull' => 1,
'position' => 105,
'css' =>
'maxwidth50imp',
'help' =>
'QuantityConsumedInvariable'),
2067 'disable_stock_change' => array(
'type' =>
'smallint',
'label' =>
'DisableStockChange',
'enabled' => 1,
'visible' => 1,
'default' =>
'0',
'notnull' => 1,
'position' => 108,
'css' =>
'maxwidth50imp',
'help' =>
'DisableStockChangeHelp'),
2068 'batch' => array(
'type' =>
'varchar(30)',
'label' =>
'Batch',
'enabled' => 1,
'visible' => -1,
'position' => 140),
2069 'role' => array(
'type' =>
'varchar(10)',
'label' =>
'Role',
'enabled' => 1,
'visible' => -1,
'position' => 145),
2070 'fk_mrp_production' => array(
'type' =>
'integer',
'label' =>
'Fk mrp production',
'enabled' => 1,
'visible' => -1,
'position' => 150),
2071 'fk_stock_movement' => array(
'type' =>
'integer',
'label' =>
'StockMovement',
'enabled' => 1,
'visible' => -1,
'position' => 155),
2072 'date_creation' => array(
'type' =>
'datetime',
'label' =>
'DateCreation',
'enabled' => 1,
'visible' => -2,
'notnull' => 1,
'position' => 160),
2073 'tms' => array(
'type' =>
'timestamp',
'label' =>
'Tms',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 165),
2074 'fk_user_creat' => array(
'type' =>
'integer',
'label' =>
'UserCreation',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 170),
2075 'fk_user_modif' => array(
'type' =>
'integer',
'label' =>
'UserModification',
'enabled' => 1,
'visible' => -1,
'position' => 175),
2076 'import_key' => array(
'type' =>
'varchar(14)',
'label' =>
'ImportId',
'enabled' => 1,
'visible' => -1,
'position' => 180),
2077 'fk_default_workstation' => array(
'type' =>
'integer',
'label' =>
'DefaultWorkstation',
'enabled' => 1,
'visible' => 1,
'notnull' => 0,
'position' => 185),
2078 'fk_unit' => array(
'type' =>
'int',
'label' =>
'Unit',
'enabled' => 1,
'visible' => 1,
'notnull' => 0,
'position' => 186)
2084 public $origin_type;
2087 public $fk_warehouse;
2098 public $disable_stock_change;
2102 public $fk_mrp_production;
2103 public $fk_stock_movement;
2104 public $date_creation;
2105 public $fk_user_creat;
2106 public $fk_user_modif;
2108 public $fk_parent_line;
2114 public $fk_default_workstation;
2127 $this->ismultientitymanaged = 0;
2128 $this->isextrafieldmanaged = 1;
2130 if (!
getDolGlobalString(
'MAIN_SHOW_TECHNICAL_ID') && isset($this->fields[
'rowid'])) {
2131 $this->fields[
'rowid'][
'visible'] = 0;
2133 if (!isModEnabled(
'multicompany') && isset($this->fields[
'entity'])) {
2134 $this->fields[
'entity'][
'enabled'] = 0;
2138 foreach ($this->fields as $key => $val) {
2139 if (isset($val[
'enabled']) && empty($val[
'enabled'])) {
2140 unset($this->fields[$key]);
2145 if (is_object($langs)) {
2146 foreach ($this->fields as $key => $val) {
2147 if (!empty($val[
'arrayofkeyval']) && is_array($val[
'arrayofkeyval'])) {
2148 foreach ($val[
'arrayofkeyval'] as $key2 => $val2) {
2149 $this->fields[$key][
'arrayofkeyval'][$key2] = $langs->trans($val2);
2165 if (empty($this->qty)) {
2166 $this->error =
'ErrorEmptyValueForQty';
2197 public function fetchAll($sortorder =
'', $sortfield =
'', $limit = 0, $offset = 0, $filter =
'', $filtermode =
'AND')
2205 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as t';
2206 if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
2207 $sql .=
' WHERE t.entity IN ('.getEntity($this->element).
')';
2209 $sql .=
' WHERE 1 = 1';
2213 if (is_array($filter)) {
2214 $sqlwhere = array();
2215 if (count($filter) > 0) {
2216 foreach ($filter as $key => $value) {
2217 if ($key ==
't.rowid') {
2218 $sqlwhere[] = $key.
" = ".((int) $value);
2219 } elseif (strpos($key,
'date') !==
false) {
2220 $sqlwhere[] = $key.
" = '".$this->db->idate($value).
"'";
2222 $sqlwhere[] = $key.
" LIKE '%".$this->db->escape($this->db->escapeforlike($value)).
"%'";
2226 if (count($sqlwhere) > 0) {
2227 $sql .=
' AND ('.implode(
' '.$this->db->escape($filtermode).
' ', $sqlwhere).
')';
2236 if ($errormessage) {
2237 $this->errors[] = $errormessage;
2238 dol_syslog(__METHOD__.
' '.implode(
',', $this->errors), LOG_ERR);
2242 if (!empty($sortfield)) {
2243 $sql .= $this->db->order($sortfield, $sortorder);
2245 if (!empty($limit)) {
2246 $sql .= $this->db->plimit($limit, $offset);
2249 $resql = $this->db->query($sql);
2251 $num = $this->db->num_rows($resql);
2253 while ($i < ($limit ? min($limit, $num) : $num)) {
2254 $obj = $this->db->fetch_object($resql);
2256 $record =
new self($this->db);
2257 $record->setVarsFromFetchObj($obj);
2259 $records[$record->id] = $record;
2263 $this->db->free($resql);
2267 $this->errors[] =
'Error '.$this->db->lasterror();
2268 dol_syslog(__METHOD__.
' '.implode(
',', $this->errors), LOG_ERR);
2293 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.