diff --git a/htdocs/mrp/class/api_mos.class.php b/htdocs/mrp/class/api_mos.class.php index 33d4a108f17..22420733a45 100644 --- a/htdocs/mrp/class/api_mos.class.php +++ b/htdocs/mrp/class/api_mos.class.php @@ -327,6 +327,12 @@ class Mos extends DolibarrApi if ($field == 'autoclose') { $autoclose = $value; } + if ($field == 'arraytoconsume') { + $arraytoconsume = $value; + } + if ($field == 'arraytoproduce') { + $arraytoproduce = $value; + } } if (empty($labelmovement)) { @@ -337,7 +343,289 @@ class Mos extends DolibarrApi } // TODO Add code for consume and produce... - throw new RestException(500, "Feature not yet available"); + require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; + require_once DOL_DOCUMENT_ROOT.'/product/stock/class/mouvementstock.class.php'; + dol_include_once('/mrp/lib/mrp_mo.lib.php'); + $stockmove = new MouvementStock($this->db); + if (!empty($arraytoconsume) && !empty($arraytoproduce)) { + $pos = 0; + $arrayofarrayname = array("arraytoconsume","arraytoproduce"); + foreach ($arrayofarrayname as $arrayname) { + foreach ($$arrayname as $value) { + $tmpproduct = new Product($this->db); + if (empty($value["objectid"])) { + throw new RestException(500, "Field objectid required in ".$arrayname); + } + $tmpproduct->fetch($value["qty"]); + if (empty($value["qty"])) { + throw new RestException(500, "Field qty required in ".$arrayname); + } + if ($value["qty"]!=0) { + $qtytoprocess = $value["qty"]; + if (isset($value["fk_warehouse"])) { // If there is a warehouse to set + if (!($value["fk_warehouse"] > 0)) { // If there is no warehouse set. + throw new RestException(500, "Field fk_warehouse must be > 0 in ".$arrayname); + $error++; + } + if ($tmpproduct->status_batch) { + throw new RestException(500, "Product ".$tmpproduct->ref."must be in batch"); + $error++; + } + } + $idstockmove = 0; + if (!$error && $value["fk_warehouse"] > 0) { + // Record stock movement + $id_product_batch = 0; + $stockmove->origin = $this->mo; + if ($qtytoprocess >= 0) { + $moline = new MoLine($this->db); + $moline->fk_mo = $this->mo->id; + $moline->position = $pos; + $moline->fk_product = $value["objectid"]; + $moline->fk_warehouse = $value["fk_warehouse"]; + $moline->qty = $qtytoprocess; + $moline->batch = $tmpproduct->status_batch; + $moline->role = 'toproduce'; + $moline->fk_mrp_production = ""; + $moline->fk_stock_movement = $idstockmove; + $moline->fk_user_creat = DolibarrApiAccess::$user->id; + + $resultmoline = $moline->create(DolibarrApiAccess::$user); + if ($resultmoline <= 0) { + $error++; + throw new RestException(500, $moline->error); + } + $idstockmove = $stockmove->livraison(DolibarrApiAccess::$user, $value["objectid"], $value["fk_warehouse"], $qtytoprocess, 0, $labelmovement, dol_now(), '', '', $tmpproduct->status_batch, $id_product_batch, $codemovement); + } else { + $moline = new MoLine($this->db); + $moline->fk_mo = $this->mo->id; + $moline->position = $pos; + $moline->fk_product = $value["objectid"]; + $moline->fk_warehouse = $value["fk_warehouse"]; + $moline->qty = $qtytoprocess; + $moline->batch = $tmpproduct->status_batch; + $moline->role = 'toconsume'; + $moline->fk_mrp_production = ""; + $moline->fk_stock_movement = $idstockmove; + $moline->fk_user_creat = DolibarrApiAccess::$user->id; + + $resultmoline = $moline->create(DolibarrApiAccess::$user); + if ($resultmoline <= 0) { + $error++; + throw new RestException(500, $moline->error); + } + $idstockmove = $stockmove->reception(DolibarrApiAccess::$user, $value["objectid"], $value["fk_warehouse"], $qtytoprocess, 0, $labelmovement, dol_now(), '', '', $tmpproduct->status_batch, $id_product_batch, $codemovement); + } + if ($idstockmove < 0) { + $error++; + throw new RestException(500, $stockmove->error); + } + } + if (!$error) { + // Record consumption + $moline = new MoLine($this->db); + $moline->fk_mo = $this->mo->id; + $moline->position = $pos; + $moline->fk_product = $value["objectid"]; + $moline->fk_warehouse = $value["fk_warehouse"]; + $moline->qty = $qtytoprocess; + $moline->batch = $tmpproduct->status_batch; + if ($arrayname == "arraytoconsume") { + $moline->role = 'consumed'; + } else { + $moline->role = 'produced'; + } + $moline->fk_mrp_production = ""; + $moline->fk_stock_movement = $idstockmove; + $moline->fk_user_creat = DolibarrApiAccess::$user->id; + + $resultmoline = $moline->create(DolibarrApiAccess::$user); + if ($resultmoline <= 0) { + $error++; + throw new RestException(500, $moline->error); + } + + $pos++; + } + } + } + } + if (!$error) { + $consumptioncomplete = true; + $productioncomplete = true; + + if ($autoclose <= 0) { + $consumptioncomplete = false; + $productioncomplete = false; + } + } + } else { + $pos = 0; + foreach ($this->mo->lines as $line) { + if ($line->role == 'toconsume') { + $tmpproduct = new Product($this->db); + $tmpproduct->fetch($line->fk_product); + if ($line->qty != 0) { + $qtytoprocess = $line->qty; + if (isset($line->fk_warehouse)) { // If there is a warehouse to set + if (!($line->fk_warehouse > 0)) { // If there is no warehouse set. + $langs->load("errors"); + throw new RestException(500, $langs->trans("ErrorFieldRequiredForProduct", $langs->transnoentitiesnoconv("Warehouse"), $tmpproduct->ref)); + $error++; + } + if ($tmpproduct->status_batch) { + $langs->load("errors"); + throw new RestException(500, $langs->trans("ErrorFieldRequiredForProduct", $langs->transnoentitiesnoconv("Batch"), $tmpproduct->ref)); + $error++; + } + } + $idstockmove = 0; + if (!$error && $line->fk_warehouse > 0) { + // Record stock movement + $id_product_batch = 0; + $stockmove->origin = $this->mo; + if ($qtytoprocess >= 0) { + $idstockmove = $stockmove->livraison(DolibarrApiAccess::$user, $line->fk_product, $line->fk_warehouse, $qtytoprocess, 0, $labelmovement, dol_now(), '', '', $tmpproduct->status_batch, $id_product_batch, $codemovement); + } else { + $idstockmove = $stockmove->reception(DolibarrApiAccess::$user, $line->fk_product, $line->fk_warehouse, $qtytoprocess, 0, $labelmovement, dol_now(), '', '', $tmpproduct->status_batch, $id_product_batch, $codemovement); + } + if ($idstockmove < 0) { + $error++; + throw new RestException(500, $stockmove->error); + } + } + if (!$error) { + // Record consumption + $moline = new MoLine($this->db); + $moline->fk_mo = $this->mo->id; + $moline->position = $pos; + $moline->fk_product = $line->fk_product; + $moline->fk_warehouse = $line->fk_warehouse; + $moline->qty = $qtytoprocess; + $moline->batch = $tmpproduct->status_batch; + $moline->role = 'consumed'; + $moline->fk_mrp_production = $line->id; + $moline->fk_stock_movement = $idstockmove; + $moline->fk_user_creat = DolibarrApiAccess::$user->id; + + $resultmoline = $moline->create(DolibarrApiAccess::$user); + if ($resultmoline <= 0) { + $error++; + throw new RestException(500, $moline->error); + } + + $pos++; + } + } + } + } + $pos = 0; + foreach ($this->mo->lines as $line) { + if ($line->role == 'toproduce') { + $tmpproduct = new Product($this->db); + $tmpproduct->fetch($line->fk_product); + if ($line->qty != 0) { + $qtytoprocess = $line->qty; + if (isset($line->fk_warehouse)) { // If there is a warehouse to set + if (!($line->fk_warehouse > 0)) { // If there is no warehouse set. + $langs->load("errors"); + throw new RestException(500, $langs->trans("ErrorFieldRequiredForProduct", $langs->transnoentitiesnoconv("Warehouse"), $tmpproduct->ref)); + $error++; + } + if ($tmpproduct->status_batch) { + $langs->load("errors"); + throw new RestException(500, $langs->trans("ErrorFieldRequiredForProduct", $langs->transnoentitiesnoconv("Batch"), $tmpproduct->ref)); + $error++; + } + } + $idstockmove = 0; + if (!$error && $line->fk_warehouse > 0) { + // Record stock movement + $id_product_batch = 0; + $stockmove->origin = $this->mo; + if ($qtytoprocess >= 0) { + $idstockmove = $stockmove->livraison(DolibarrApiAccess::$user, $line->fk_product, $line->fk_warehouse, $qtytoprocess, 0, $labelmovement, dol_now(), '', '', $tmpproduct->status_batch, $id_product_batch, $codemovement); + } else { + $idstockmove = $stockmove->reception(DolibarrApiAccess::$user, $line->fk_product, $line->fk_warehouse, $qtytoprocess, 0, $labelmovement, dol_now(), '', '', $tmpproduct->status_batch, $id_product_batch, $codemovement); + } + if ($idstockmove < 0) { + $error++; + throw new RestException(500, $stockmove->error); + } + } + if (!$error) { + // Record consumption + $moline = new MoLine($this->db); + $moline->fk_mo = $this->mo->id; + $moline->position = $pos; + $moline->fk_product = $line->fk_product; + $moline->fk_warehouse = $line->fk_warehouse; + $moline->qty = $qtytoprocess; + $moline->batch = $tmpproduct->status_batch; + $moline->role = 'produced'; + $moline->fk_mrp_production = $line->id; + $moline->fk_stock_movement = $idstockmove; + $moline->fk_user_creat = DolibarrApiAccess::$user->id; + + $resultmoline = $moline->create(DolibarrApiAccess::$user); + if ($resultmoline <= 0) { + $error++; + throw new RestException(500, $moline->error); + } + + $pos++; + } + } + } + } + + if (!$error) { + $consumptioncomplete = true; + $productioncomplete = true; + + if ($autoclose > 0) { + foreach ($this->mo->lines as $line) { + if ($line->role == 'toconsume') { + $arrayoflines = $this->mo->fetchLinesLinked('consumed', $line->id); + $alreadyconsumed = 0; + foreach ($arrayoflines as $line2) { + $alreadyconsumed += $line2['qty']; + } + + if ($alreadyconsumed < $line->qty) { + $consumptioncomplete = false; + } + } + if ($line->role == 'toproduce') { + $arrayoflines = $this->mo->fetchLinesLinked('produced', $line->id); + $alreadyproduced = 0; + foreach ($arrayoflines as $line2) { + $alreadyproduced += $line2['qty']; + } + + if ($alreadyproduced < $line->qty) { + $productioncomplete = false; + } + } + } + } else { + $consumptioncomplete = false; + $productioncomplete = false; + } + } + } + // Update status of MO + dol_syslog("consumptioncomplete = ".$consumptioncomplete." productioncomplete = ".$productioncomplete); + //var_dump("consumptioncomplete = ".$consumptioncomplete." productioncomplete = ".$productioncomplete); + if ($consumptioncomplete && $productioncomplete) { + $result = $this->mo->setStatut($this->mo::STATUS_PRODUCED, 0, '', 'MRP_MO_PRODUCED'); + } else { + $result = $this->mo->setStatut($this->mo::STATUS_INPROGRESS, 0, '', 'MRP_MO_PRODUCED'); + } + if ($result <= 0) { + $error++; + throw new RestException(500, $this->mo->error); + } return $this->mo->id; }