From 8be5cccb4ef0a6c4352d9b4903e4f09dae8e6d38 Mon Sep 17 00:00:00 2001 From: kevin Date: Wed, 6 Apr 2022 12:32:10 +0200 Subject: [PATCH 1/4] Reverse stock movements on mo consumed product --- htdocs/langs/en_US/mrp.lang | 1 + htdocs/mrp/class/mo.class.php | 72 ++++++++++++++++++++++++++++++++++- htdocs/mrp/mo_production.php | 10 ++++- 3 files changed, 80 insertions(+), 3 deletions(-) diff --git a/htdocs/langs/en_US/mrp.lang b/htdocs/langs/en_US/mrp.lang index 4dc74122ea9..525c0f4c150 100644 --- a/htdocs/langs/en_US/mrp.lang +++ b/htdocs/langs/en_US/mrp.lang @@ -69,6 +69,7 @@ ForAQuantityToConsumeOf=For a quantity to disassemble of %s ConfirmValidateMo=Are you sure you want to validate this Manufacturing Order? ConfirmProductionDesc=By clicking on '%s', you will validate the consumption and/or production for the quantities set. This will also update the stock and record stock movements. ProductionForRef=Production of %s +CancelProductionForRef=Cancellation of product stock decrementation for product %s AutoCloseMO=Close automatically the Manufacturing Order if quantities to consume and to produce are reached NoStockChangeOnServices=No stock change on services ProductQtyToConsumeByMO=Product quantity still to consume by open MO diff --git a/htdocs/mrp/class/mo.class.php b/htdocs/mrp/class/mo.class.php index de9913fdb9f..f3600960706 100644 --- a/htdocs/mrp/class/mo.class.php +++ b/htdocs/mrp/class/mo.class.php @@ -750,12 +750,82 @@ class Mo extends CommonObject */ public function deleteLine(User $user, $idline, $notrigger = false) { + global $langs; + $langs->load('stocks'); + if ($this->status < 0) { $this->error = 'ErrorDeleteLineNotAllowedByObjectStatus'; return -2; } - return $this->deleteLineCommon($user, $idline, $notrigger); + $productstatic = new Product($this->db); + $fk_movement = GETPOST('fk_movement', 'int'); + $arrayoflines = $this->fetchLinesLinked('consumed', $idline); + + if (! empty($arrayoflines)) { + $this->db->begin(); + + $stockmove = new MouvementStock($this->db); + $stockmove->setOrigin($this->element, $this->id); + + if (! empty($fk_movement)) { + $moline = new MoLine($this->db); + $TArrayMoLine = $moline->fetchAll('', '', 1, 0, array('customsql' => 'fk_stock_movement ='.$fk_movement)); + $moline = array_shift($TArrayMoLine); + + $movement = new MouvementStock($this->db); + $movement->fetch($fk_movement); + $productstatic->fetch($movement->product_id); + $qtytoprocess = $movement->qty; + + // Reverse stock movement + $labelmovementCancel = $langs->trans("CancelProductionForRef", $productstatic->ref); + $codemovementCancel = $langs->trans("StockIncrease"); + + if (($qtytoprocess >= 0)) { + $idstockmove = $stockmove->reception($user, $movement->product_id, $movement->warehouse_id, $qtytoprocess, 0, $labelmovementCancel, '', '', '', dol_now(), $movement->batch, $codemovementCancel); + } else { + $idstockmove = $stockmove->livraison($user, $movement->product_id, $movement->warehouse_id, $qtytoprocess, 0, $labelmovementCancel, dol_now(), '', '', '', $movement->batch, $codemovementCancel); + } + if ($idstockmove < 0) { + $this->error++; + $this->db->rollback(); + setEventMessages($stockmove->error, $stockmove->errors, 'errors'); + } else { + $this->db->commit(); + } + return $moline->delete($user, $notrigger); + } + else { + foreach ($arrayoflines as $key => $arrayofline) { + $lineDetails = $arrayoflines[$key]; + $productstatic->fetch($lineDetails['fk_product']); + $qtytoprocess = $lineDetails['qty']; + $id_product_batch = (! empty($lineDetails['batch']) ? $lineDetails['batch'] : 0); + + // Reverse stock movement + $labelmovementCancel = $langs->trans("CancelProductionForRef", $productstatic->ref); + $codemovementCancel = $langs->trans("StockIncrease"); + + if ($qtytoprocess >= 0) { + $idstockmove = $stockmove->reception($user, $lineDetails['fk_product'], $lineDetails['fk_warehouse'], $qtytoprocess, 0, $labelmovementCancel, '', '', '', dol_now(), $id_product_batch, $codemovementCancel); + } else { + $idstockmove = $stockmove->livraison($user, $lineDetails['fk_product'], $lineDetails['fk_warehouse'], $qtytoprocess, 0, $labelmovementCancel, dol_now(), '', '', '', $id_product_batch, $codemovementCancel); + } + if ($idstockmove < 0) { + $this->error++; + $this->db->rollback(); + setEventMessages($stockmove->error, $stockmove->errors, 'errors'); + } else { + $this->db->commit(); + } + } + return $this->deleteLineCommon($user, $idline, $notrigger); + } + } + else { + return $this->deleteLineCommon($user, $idline, $notrigger); + } } diff --git a/htdocs/mrp/mo_production.php b/htdocs/mrp/mo_production.php index 545a7aaf202..ba04152bd7d 100644 --- a/htdocs/mrp/mo_production.php +++ b/htdocs/mrp/mo_production.php @@ -49,6 +49,7 @@ $cancel = GETPOST('cancel', 'aZ09'); $contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'mocard'; // To manage different context of search $backtopage = GETPOST('backtopage', 'alpha'); $lineid = GETPOST('lineid', 'int'); +$fk_movement = GETPOST('fk_movement', 'int'); $collapse = GETPOST('collapse', 'aZ09comma'); @@ -445,7 +446,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea } // Confirmation to delete line if ($action == 'deleteline') { - $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id.'&lineid='.$lineid, $langs->trans('DeleteLine'), $langs->trans('ConfirmDeleteLine'), 'confirm_deleteline', '', 0, 1); + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id.'&lineid='.$lineid.'&fk_movement='.$fk_movement, $langs->trans('DeleteLine'), $langs->trans('ConfirmDeleteLine'), 'confirm_deleteline', '', 0, 1); } // Clone confirmation if ($action == 'clone') { @@ -969,7 +970,12 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea // Action delete line if ($permissiontodelete) { - print ''; + $href = $_SERVER["PHP_SELF"].'?id='.((int) $object->id).'&action=deleteline&token='.newToken().'&lineid='.((int) $line->id).'&fk_movement='.((int) $line2['fk_stock_movement']); + print ''; + print ''; + print img_picto('', 'delete'); + print ''; + print ''; } print ''; From 69eaf1e708867db595f32182b8fd731dfb53ab5d Mon Sep 17 00:00:00 2001 From: kevin Date: Wed, 6 Apr 2022 14:59:18 +0200 Subject: [PATCH 2/4] Rework some code --- htdocs/mrp/class/mo.class.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/htdocs/mrp/class/mo.class.php b/htdocs/mrp/class/mo.class.php index f3600960706..147a600cbc2 100644 --- a/htdocs/mrp/class/mo.class.php +++ b/htdocs/mrp/class/mo.class.php @@ -783,9 +783,9 @@ class Mo extends CommonObject $codemovementCancel = $langs->trans("StockIncrease"); if (($qtytoprocess >= 0)) { - $idstockmove = $stockmove->reception($user, $movement->product_id, $movement->warehouse_id, $qtytoprocess, 0, $labelmovementCancel, '', '', '', dol_now(), $movement->batch, $codemovementCancel); + $idstockmove = $stockmove->reception($user, $movement->product_id, $movement->warehouse_id, $qtytoprocess, 0, $labelmovementCancel, '', '', $movement->batch, dol_now(), 0, $codemovementCancel); } else { - $idstockmove = $stockmove->livraison($user, $movement->product_id, $movement->warehouse_id, $qtytoprocess, 0, $labelmovementCancel, dol_now(), '', '', '', $movement->batch, $codemovementCancel); + $idstockmove = $stockmove->livraison($user, $movement->product_id, $movement->warehouse_id, $qtytoprocess, 0, $labelmovementCancel, dol_now(), '', '', $movement->batch, 0, $codemovementCancel); } if ($idstockmove < 0) { $this->error++; @@ -801,16 +801,15 @@ class Mo extends CommonObject $lineDetails = $arrayoflines[$key]; $productstatic->fetch($lineDetails['fk_product']); $qtytoprocess = $lineDetails['qty']; - $id_product_batch = (! empty($lineDetails['batch']) ? $lineDetails['batch'] : 0); // Reverse stock movement $labelmovementCancel = $langs->trans("CancelProductionForRef", $productstatic->ref); $codemovementCancel = $langs->trans("StockIncrease"); if ($qtytoprocess >= 0) { - $idstockmove = $stockmove->reception($user, $lineDetails['fk_product'], $lineDetails['fk_warehouse'], $qtytoprocess, 0, $labelmovementCancel, '', '', '', dol_now(), $id_product_batch, $codemovementCancel); + $idstockmove = $stockmove->reception($user, $lineDetails['fk_product'], $lineDetails['fk_warehouse'], $qtytoprocess, 0, $labelmovementCancel, '', '', $lineDetails['batch'], dol_now(), 0, $codemovementCancel); } else { - $idstockmove = $stockmove->livraison($user, $lineDetails['fk_product'], $lineDetails['fk_warehouse'], $qtytoprocess, 0, $labelmovementCancel, dol_now(), '', '', '', $id_product_batch, $codemovementCancel); + $idstockmove = $stockmove->livraison($user, $lineDetails['fk_product'], $lineDetails['fk_warehouse'], $qtytoprocess, 0, $labelmovementCancel, dol_now(), '', '', $lineDetails['batch'], 0, $codemovementCancel); } if ($idstockmove < 0) { $this->error++; From de6e3c6d5513a1255d50124e2f7e6779e47510f5 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Wed, 6 Apr 2022 13:19:34 +0000 Subject: [PATCH 3/4] Fixing style errors. --- htdocs/mrp/class/mo.class.php | 120 +++++++++++++++++----------------- htdocs/mrp/mo_production.php | 12 ++-- 2 files changed, 65 insertions(+), 67 deletions(-) diff --git a/htdocs/mrp/class/mo.class.php b/htdocs/mrp/class/mo.class.php index 147a600cbc2..2c0773dd9be 100644 --- a/htdocs/mrp/class/mo.class.php +++ b/htdocs/mrp/class/mo.class.php @@ -750,81 +750,79 @@ class Mo extends CommonObject */ public function deleteLine(User $user, $idline, $notrigger = false) { - global $langs; - $langs->load('stocks'); + global $langs; + $langs->load('stocks'); if ($this->status < 0) { $this->error = 'ErrorDeleteLineNotAllowedByObjectStatus'; return -2; } - $productstatic = new Product($this->db); - $fk_movement = GETPOST('fk_movement', 'int'); - $arrayoflines = $this->fetchLinesLinked('consumed', $idline); + $productstatic = new Product($this->db); + $fk_movement = GETPOST('fk_movement', 'int'); + $arrayoflines = $this->fetchLinesLinked('consumed', $idline); - if (! empty($arrayoflines)) { - $this->db->begin(); + if (! empty($arrayoflines)) { + $this->db->begin(); - $stockmove = new MouvementStock($this->db); - $stockmove->setOrigin($this->element, $this->id); + $stockmove = new MouvementStock($this->db); + $stockmove->setOrigin($this->element, $this->id); - if (! empty($fk_movement)) { - $moline = new MoLine($this->db); - $TArrayMoLine = $moline->fetchAll('', '', 1, 0, array('customsql' => 'fk_stock_movement ='.$fk_movement)); - $moline = array_shift($TArrayMoLine); + if (! empty($fk_movement)) { + $moline = new MoLine($this->db); + $TArrayMoLine = $moline->fetchAll('', '', 1, 0, array('customsql' => 'fk_stock_movement ='.$fk_movement)); + $moline = array_shift($TArrayMoLine); - $movement = new MouvementStock($this->db); - $movement->fetch($fk_movement); - $productstatic->fetch($movement->product_id); - $qtytoprocess = $movement->qty; + $movement = new MouvementStock($this->db); + $movement->fetch($fk_movement); + $productstatic->fetch($movement->product_id); + $qtytoprocess = $movement->qty; - // Reverse stock movement - $labelmovementCancel = $langs->trans("CancelProductionForRef", $productstatic->ref); - $codemovementCancel = $langs->trans("StockIncrease"); + // Reverse stock movement + $labelmovementCancel = $langs->trans("CancelProductionForRef", $productstatic->ref); + $codemovementCancel = $langs->trans("StockIncrease"); - if (($qtytoprocess >= 0)) { - $idstockmove = $stockmove->reception($user, $movement->product_id, $movement->warehouse_id, $qtytoprocess, 0, $labelmovementCancel, '', '', $movement->batch, dol_now(), 0, $codemovementCancel); - } else { - $idstockmove = $stockmove->livraison($user, $movement->product_id, $movement->warehouse_id, $qtytoprocess, 0, $labelmovementCancel, dol_now(), '', '', $movement->batch, 0, $codemovementCancel); - } - if ($idstockmove < 0) { - $this->error++; - $this->db->rollback(); - setEventMessages($stockmove->error, $stockmove->errors, 'errors'); - } else { - $this->db->commit(); - } - return $moline->delete($user, $notrigger); - } - else { - foreach ($arrayoflines as $key => $arrayofline) { - $lineDetails = $arrayoflines[$key]; - $productstatic->fetch($lineDetails['fk_product']); - $qtytoprocess = $lineDetails['qty']; + if (($qtytoprocess >= 0)) { + $idstockmove = $stockmove->reception($user, $movement->product_id, $movement->warehouse_id, $qtytoprocess, 0, $labelmovementCancel, '', '', $movement->batch, dol_now(), 0, $codemovementCancel); + } else { + $idstockmove = $stockmove->livraison($user, $movement->product_id, $movement->warehouse_id, $qtytoprocess, 0, $labelmovementCancel, dol_now(), '', '', $movement->batch, 0, $codemovementCancel); + } + if ($idstockmove < 0) { + $this->error++; + $this->db->rollback(); + setEventMessages($stockmove->error, $stockmove->errors, 'errors'); + } else { + $this->db->commit(); + } + return $moline->delete($user, $notrigger); + } else { + foreach ($arrayoflines as $key => $arrayofline) { + $lineDetails = $arrayoflines[$key]; + $productstatic->fetch($lineDetails['fk_product']); + $qtytoprocess = $lineDetails['qty']; - // Reverse stock movement - $labelmovementCancel = $langs->trans("CancelProductionForRef", $productstatic->ref); - $codemovementCancel = $langs->trans("StockIncrease"); + // Reverse stock movement + $labelmovementCancel = $langs->trans("CancelProductionForRef", $productstatic->ref); + $codemovementCancel = $langs->trans("StockIncrease"); - if ($qtytoprocess >= 0) { - $idstockmove = $stockmove->reception($user, $lineDetails['fk_product'], $lineDetails['fk_warehouse'], $qtytoprocess, 0, $labelmovementCancel, '', '', $lineDetails['batch'], dol_now(), 0, $codemovementCancel); - } else { - $idstockmove = $stockmove->livraison($user, $lineDetails['fk_product'], $lineDetails['fk_warehouse'], $qtytoprocess, 0, $labelmovementCancel, dol_now(), '', '', $lineDetails['batch'], 0, $codemovementCancel); - } - if ($idstockmove < 0) { - $this->error++; - $this->db->rollback(); - setEventMessages($stockmove->error, $stockmove->errors, 'errors'); - } else { - $this->db->commit(); - } - } - return $this->deleteLineCommon($user, $idline, $notrigger); - } - } - else { - return $this->deleteLineCommon($user, $idline, $notrigger); - } + if ($qtytoprocess >= 0) { + $idstockmove = $stockmove->reception($user, $lineDetails['fk_product'], $lineDetails['fk_warehouse'], $qtytoprocess, 0, $labelmovementCancel, '', '', $lineDetails['batch'], dol_now(), 0, $codemovementCancel); + } else { + $idstockmove = $stockmove->livraison($user, $lineDetails['fk_product'], $lineDetails['fk_warehouse'], $qtytoprocess, 0, $labelmovementCancel, dol_now(), '', '', $lineDetails['batch'], 0, $codemovementCancel); + } + if ($idstockmove < 0) { + $this->error++; + $this->db->rollback(); + setEventMessages($stockmove->error, $stockmove->errors, 'errors'); + } else { + $this->db->commit(); + } + } + return $this->deleteLineCommon($user, $idline, $notrigger); + } + } else { + return $this->deleteLineCommon($user, $idline, $notrigger); + } } diff --git a/htdocs/mrp/mo_production.php b/htdocs/mrp/mo_production.php index ba04152bd7d..fc9f5ee1a11 100644 --- a/htdocs/mrp/mo_production.php +++ b/htdocs/mrp/mo_production.php @@ -970,12 +970,12 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea // Action delete line if ($permissiontodelete) { - $href = $_SERVER["PHP_SELF"].'?id='.((int) $object->id).'&action=deleteline&token='.newToken().'&lineid='.((int) $line->id).'&fk_movement='.((int) $line2['fk_stock_movement']); - print ''; - print ''; - print img_picto('', 'delete'); - print ''; - print ''; + $href = $_SERVER["PHP_SELF"].'?id='.((int) $object->id).'&action=deleteline&token='.newToken().'&lineid='.((int) $line->id).'&fk_movement='.((int) $line2['fk_stock_movement']); + print ''; + print ''; + print img_picto('', 'delete'); + print ''; + print ''; } print ''; From 135e4f1768690e9a7f27ae562533a51fd258897e Mon Sep 17 00:00:00 2001 From: kevin Date: Fri, 8 Apr 2022 09:50:40 +0200 Subject: [PATCH 4/4] Add tooltip to explain the trash action --- htdocs/langs/en_US/mrp.lang | 1 + htdocs/mrp/mo_production.php | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/htdocs/langs/en_US/mrp.lang b/htdocs/langs/en_US/mrp.lang index 525c0f4c150..224273d84e6 100644 --- a/htdocs/langs/en_US/mrp.lang +++ b/htdocs/langs/en_US/mrp.lang @@ -70,6 +70,7 @@ ConfirmValidateMo=Are you sure you want to validate this Manufacturing Order? ConfirmProductionDesc=By clicking on '%s', you will validate the consumption and/or production for the quantities set. This will also update the stock and record stock movements. ProductionForRef=Production of %s CancelProductionForRef=Cancellation of product stock decrementation for product %s +TooltipDeleteAndRevertStockMovement=Delete line and revert stock movement AutoCloseMO=Close automatically the Manufacturing Order if quantities to consume and to produce are reached NoStockChangeOnServices=No stock change on services ProductQtyToConsumeByMO=Product quantity still to consume by open MO diff --git a/htdocs/mrp/mo_production.php b/htdocs/mrp/mo_production.php index ba04152bd7d..c9d171a0300 100644 --- a/htdocs/mrp/mo_production.php +++ b/htdocs/mrp/mo_production.php @@ -915,7 +915,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea $href = $_SERVER["PHP_SELF"].'?id='.((int) $object->id).'&action=deleteline&token='.newToken().'&lineid='.((int) $line->id); print ''; print ''; - print img_picto('', 'delete'); + print img_picto($langs->trans('TooltipDeleteAndRevertStockMovement'), 'delete'); print ''; print ''; } @@ -973,7 +973,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea $href = $_SERVER["PHP_SELF"].'?id='.((int) $object->id).'&action=deleteline&token='.newToken().'&lineid='.((int) $line->id).'&fk_movement='.((int) $line2['fk_stock_movement']); print ''; print ''; - print img_picto('', 'delete'); + print img_picto($langs->trans('TooltipDeleteAndRevertStockMovement'), 'delete'); print ''; print ''; } @@ -1226,7 +1226,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea $href .= '&lineid='.$line->id; print ''; print ''; - print img_picto('', "delete"); + print img_picto($langs->trans('TooltipDeleteAndRevertStockMovement'), "delete"); print ''; print ''; }