317 if (!DolibarrApiAccess::$user->rights->mrp->write) {
318 throw new RestException(401,
'Not enough permission');
320 $result = $this->mo->fetch($id);
322 throw new RestException(404,
'MO not found');
325 if ($this->mo->status != Mo::STATUS_VALIDATED && $this->mo->status != Mo::STATUS_INPROGRESS) {
326 throw new RestException(401,
'Error bad status of MO');
332 $arraytoconsume = array();
333 $arraytoproduce = array();
335 foreach ($request_data as $field => $value) {
336 if ($field ==
'inventorylabel') {
337 $labelmovement = $value;
339 if ($field ==
'inventorycode') {
340 $codemovement = $value;
342 if ($field ==
'autoclose') {
345 if ($field ==
'arraytoconsume') {
346 $arraytoconsume = $value;
348 if ($field ==
'arraytoproduce') {
349 $arraytoproduce = $value;
353 if (empty($labelmovement)) {
354 throw new RestException(500,
"Field inventorylabel not provided");
356 if (empty($codemovement)) {
357 throw new RestException(500,
"Field inventorycode not provided");
361 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
362 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
367 $consumptioncomplete =
true;
368 $productioncomplete =
true;
370 if (!empty($arraytoconsume) && !empty($arraytoproduce)) {
372 $arrayofarrayname = array(
"arraytoconsume",
"arraytoproduce");
373 foreach ($arrayofarrayname as $arrayname) {
374 foreach ($arrayname as $value) {
375 $tmpproduct =
new Product($this->db);
376 if (empty($value[
"objectid"])) {
377 throw new RestException(500,
"Field objectid required in ".$arrayname);
379 $tmpproduct->fetch($value[
"qty"]);
380 if (empty($value[
"qty"])) {
381 throw new RestException(500,
"Field qty required in ".$arrayname);
383 if ($value[
"qty"]!=0) {
384 $qtytoprocess = $value[
"qty"];
385 if (isset($value[
"fk_warehouse"])) {
386 if (!($value[
"fk_warehouse"] > 0)) {
388 throw new RestException(500,
"Field fk_warehouse must be > 0 in ".$arrayname);
390 if ($tmpproduct->status_batch) {
392 throw new RestException(500,
"Product ".$tmpproduct->ref.
"must be in batch");
396 if (!$error && $value[
"fk_warehouse"] > 0) {
398 $id_product_batch = 0;
400 $stockmove->setOrigin($this->mo->element, $this->mo->id);
402 if ($qtytoprocess >= 0) {
403 $moline =
new MoLine($this->db);
404 $moline->fk_mo = $this->mo->id;
405 $moline->position = $pos;
406 $moline->fk_product = $value[
"objectid"];
407 $moline->fk_warehouse = $value[
"fk_warehouse"];
408 $moline->qty = $qtytoprocess;
409 $moline->batch = $tmpproduct->status_batch;
410 $moline->role =
'toproduce';
411 $moline->fk_mrp_production =
"";
412 $moline->fk_stock_movement = $idstockmove;
413 $moline->fk_user_creat = DolibarrApiAccess::$user->id;
415 $resultmoline = $moline->create(DolibarrApiAccess::$user);
416 if ($resultmoline <= 0) {
418 throw new RestException(500, $moline->error);
420 $idstockmove = $stockmove->livraison(DolibarrApiAccess::$user, $value[
"objectid"], $value[
"fk_warehouse"], $qtytoprocess, 0, $labelmovement,
dol_now(),
'',
'', $tmpproduct->status_batch, $id_product_batch, $codemovement);
422 $moline =
new MoLine($this->db);
423 $moline->fk_mo = $this->mo->id;
424 $moline->position = $pos;
425 $moline->fk_product = $value[
"objectid"];
426 $moline->fk_warehouse = $value[
"fk_warehouse"];
427 $moline->qty = $qtytoprocess;
428 $moline->batch = $tmpproduct->status_batch;
429 $moline->role =
'toconsume';
430 $moline->fk_mrp_production =
"";
431 $moline->fk_stock_movement = $idstockmove;
432 $moline->fk_user_creat = DolibarrApiAccess::$user->id;
434 $resultmoline = $moline->create(DolibarrApiAccess::$user);
435 if ($resultmoline <= 0) {
437 throw new RestException(500, $moline->error);
439 $idstockmove = $stockmove->reception(DolibarrApiAccess::$user, $value[
"objectid"], $value[
"fk_warehouse"], $qtytoprocess, 0, $labelmovement,
dol_now(),
'',
'', $tmpproduct->status_batch, $id_product_batch, $codemovement);
441 if ($idstockmove < 0) {
443 throw new RestException(500, $stockmove->error);
448 $moline =
new MoLine($this->db);
449 $moline->fk_mo = $this->mo->id;
450 $moline->position = $pos;
451 $moline->fk_product = $value[
"objectid"];
452 $moline->fk_warehouse = $value[
"fk_warehouse"];
453 $moline->qty = $qtytoprocess;
454 $moline->batch = $tmpproduct->status_batch;
455 if ($arrayname ==
"arraytoconsume") {
456 $moline->role =
'consumed';
458 $moline->role =
'produced';
460 $moline->fk_mrp_production =
"";
461 $moline->fk_stock_movement = $idstockmove;
462 $moline->fk_user_creat = DolibarrApiAccess::$user->id;
464 $resultmoline = $moline->create(DolibarrApiAccess::$user);
465 if ($resultmoline <= 0) {
467 throw new RestException(500, $moline->error);
476 if ($autoclose <= 0) {
477 $consumptioncomplete =
false;
478 $productioncomplete =
false;
483 foreach ($this->mo->lines as $line) {
484 if ($line->role ==
'toconsume') {
485 $tmpproduct =
new Product($this->db);
486 $tmpproduct->fetch($line->fk_product);
487 if ($line->qty != 0) {
488 $qtytoprocess = $line->qty;
489 if (isset($line->fk_warehouse)) {
490 if (!($line->fk_warehouse > 0)) {
491 $langs->load(
"errors");
493 throw new RestException(500, $langs->trans(
"ErrorFieldRequiredForProduct", $langs->transnoentitiesnoconv(
"Warehouse"), $tmpproduct->ref));
495 if ($tmpproduct->status_batch) {
496 $langs->load(
"errors");
498 throw new RestException(500, $langs->trans(
"ErrorFieldRequiredForProduct", $langs->transnoentitiesnoconv(
"Batch"), $tmpproduct->ref));
502 if (!$error && $line->fk_warehouse > 0) {
504 $id_product_batch = 0;
505 $stockmove->origin_type =
'mo';
506 $stockmove->origin_id = $this->mo->id;
507 if ($qtytoprocess >= 0) {
508 $idstockmove = $stockmove->livraison(DolibarrApiAccess::$user, $line->fk_product, $line->fk_warehouse, $qtytoprocess, 0, $labelmovement,
dol_now(),
'',
'', $tmpproduct->status_batch, $id_product_batch, $codemovement);
510 $idstockmove = $stockmove->reception(DolibarrApiAccess::$user, $line->fk_product, $line->fk_warehouse, $qtytoprocess, 0, $labelmovement,
dol_now(),
'',
'', $tmpproduct->status_batch, $id_product_batch, $codemovement);
512 if ($idstockmove < 0) {
514 throw new RestException(500, $stockmove->error);
519 $moline =
new MoLine($this->db);
520 $moline->fk_mo = $this->mo->id;
521 $moline->position = $pos;
522 $moline->fk_product = $line->fk_product;
523 $moline->fk_warehouse = $line->fk_warehouse;
524 $moline->qty = $qtytoprocess;
525 $moline->batch = $tmpproduct->status_batch;
526 $moline->role =
'consumed';
527 $moline->fk_mrp_production = $line->id;
528 $moline->fk_stock_movement = $idstockmove;
529 $moline->fk_user_creat = DolibarrApiAccess::$user->id;
531 $resultmoline = $moline->create(DolibarrApiAccess::$user);
532 if ($resultmoline <= 0) {
534 throw new RestException(500, $moline->error);
543 foreach ($this->mo->lines as $line) {
544 if ($line->role ==
'toproduce') {
545 $tmpproduct =
new Product($this->db);
546 $tmpproduct->fetch($line->fk_product);
547 if ($line->qty != 0) {
548 $qtytoprocess = $line->qty;
549 if (isset($line->fk_warehouse)) {
550 if (!($line->fk_warehouse > 0)) {
551 $langs->load(
"errors");
553 throw new RestException(500, $langs->trans(
"ErrorFieldRequiredForProduct", $langs->transnoentitiesnoconv(
"Warehouse"), $tmpproduct->ref));
555 if ($tmpproduct->status_batch) {
556 $langs->load(
"errors");
558 throw new RestException(500, $langs->trans(
"ErrorFieldRequiredForProduct", $langs->transnoentitiesnoconv(
"Batch"), $tmpproduct->ref));
562 if (!$error && $line->fk_warehouse > 0) {
564 $id_product_batch = 0;
565 $stockmove->origin_type =
'mo';
566 $stockmove->origin_id = $this->mo->id;
567 if ($qtytoprocess >= 0) {
568 $idstockmove = $stockmove->livraison(DolibarrApiAccess::$user, $line->fk_product, $line->fk_warehouse, $qtytoprocess, 0, $labelmovement,
dol_now(),
'',
'', $tmpproduct->status_batch, $id_product_batch, $codemovement);
570 $idstockmove = $stockmove->reception(DolibarrApiAccess::$user, $line->fk_product, $line->fk_warehouse, $qtytoprocess, 0, $labelmovement,
dol_now(),
'',
'', $tmpproduct->status_batch, $id_product_batch, $codemovement);
572 if ($idstockmove < 0) {
574 throw new RestException(500, $stockmove->error);
579 $moline =
new MoLine($this->db);
580 $moline->fk_mo = $this->mo->id;
581 $moline->position = $pos;
582 $moline->fk_product = $line->fk_product;
583 $moline->fk_warehouse = $line->fk_warehouse;
584 $moline->qty = $qtytoprocess;
585 $moline->batch = $tmpproduct->status_batch;
586 $moline->role =
'produced';
587 $moline->fk_mrp_production = $line->id;
588 $moline->fk_stock_movement = $idstockmove;
589 $moline->fk_user_creat = DolibarrApiAccess::$user->id;
591 $resultmoline = $moline->create(DolibarrApiAccess::$user);
592 if ($resultmoline <= 0) {
594 throw new RestException(500, $moline->error);
604 if ($autoclose > 0) {
605 foreach ($this->mo->lines as $line) {
606 if ($line->role ==
'toconsume') {
607 $arrayoflines = $this->mo->fetchLinesLinked(
'consumed', $line->id);
608 $alreadyconsumed = 0;
609 foreach ($arrayoflines as $line2) {
610 $alreadyconsumed += $line2[
'qty'];
613 if ($alreadyconsumed < $line->qty) {
614 $consumptioncomplete =
false;
617 if ($line->role ==
'toproduce') {
618 $arrayoflines = $this->mo->fetchLinesLinked(
'produced', $line->id);
619 $alreadyproduced = 0;
620 foreach ($arrayoflines as $line2) {
621 $alreadyproduced += $line2[
'qty'];
624 if ($alreadyproduced < $line->qty) {
625 $productioncomplete =
false;
630 $consumptioncomplete =
false;
631 $productioncomplete =
false;
637 dol_syslog(
"consumptioncomplete = ".$consumptioncomplete.
" productioncomplete = ".$productioncomplete);
639 if ($consumptioncomplete && $productioncomplete) {
640 $result = $this->mo->setStatut(Mo::STATUS_PRODUCED, 0,
'',
'MRP_MO_PRODUCED');
642 $result = $this->mo->setStatut(Mo::STATUS_INPROGRESS, 0,
'',
'MRP_MO_PRODUCED');
645 throw new RestException(500, $this->mo->error);
648 return $this->mo->id;
662 $object = parent::_cleanObjectDatas($object);
664 unset($object->rowid);
665 unset($object->canvas);
667 unset($object->name);
668 unset($object->lastname);
669 unset($object->firstname);
670 unset($object->civility_id);
671 unset($object->statut);
672 unset($object->state);
673 unset($object->state_id);
674 unset($object->state_code);
675 unset($object->region);
676 unset($object->region_code);
677 unset($object->country);
678 unset($object->country_id);
679 unset($object->country_code);
680 unset($object->barcode_type);
681 unset($object->barcode_type_code);
682 unset($object->barcode_type_label);
683 unset($object->barcode_type_coder);
684 unset($object->total_ht);
685 unset($object->total_tva);
686 unset($object->total_localtax1);
687 unset($object->total_localtax2);
688 unset($object->total_ttc);
689 unset($object->fk_account);
690 unset($object->comments);
691 unset($object->note);
692 unset($object->mode_reglement_id);
693 unset($object->cond_reglement_id);
694 unset($object->cond_reglement);
695 unset($object->shipping_method_id);
696 unset($object->fk_incoterms);
697 unset($object->label_incoterms);
698 unset($object->location_incoterms);
701 if (isset($object->lines) && is_array($object->lines) && count($object->lines) > 0) {
702 $nboflines = count($object->lines);
703 for ($i = 0; $i < $nboflines; $i++) {
706 unset($object->lines[$i]->lines);
707 unset($object->lines[$i]->note);