From 647191221633c9ec7cc5b47616fee7a73573a977 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Mon, 12 Oct 2020 14:54:54 +0530 Subject: [PATCH 1/3] fix: not able to do overproduction --- erpnext/manufacturing/doctype/work_order/work_order.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/manufacturing/doctype/work_order/work_order.js b/erpnext/manufacturing/doctype/work_order/work_order.js index a244f582c4..9ce465ccaf 100644 --- a/erpnext/manufacturing/doctype/work_order/work_order.js +++ b/erpnext/manufacturing/doctype/work_order/work_order.js @@ -636,7 +636,7 @@ erpnext.work_order = { description: __('Max: {0}', [max]), default: max }, data => { - max += (max * (frm.doc.__onload.overproduction_percentage || 0.0)) / 100; + max += (frm.doc.qty * (frm.doc.__onload.overproduction_percentage || 0.0)) / 100; if (data.qty > max) { frappe.msgprint(__('Quantity must not be more than {0}', [max])); From 09572f10f8a1334e7dfe4f2a0c56e649703f9e50 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Thu, 15 Oct 2020 15:47:21 +0530 Subject: [PATCH 2/3] fix: overproduction, not allowed to transfer extra materials --- .../stock/doctype/stock_entry/stock_entry.py | 35 +++++++++++++------ 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py index a92d04ff8c..d456f986ea 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/stock_entry.py @@ -96,7 +96,7 @@ class StockEntry(StockController): self.update_quality_inspection() if self.work_order and self.purpose == "Manufacture": self.update_so_in_serial_number() - + if self.purpose == 'Material Transfer' and self.add_to_transit: self.set_material_request_transfer_status('In Transit') if self.purpose == 'Material Transfer' and self.outgoing_stock_entry: @@ -849,6 +849,8 @@ class StockEntry(StockController): frappe.throw(_("Posting date and posting time is mandatory")) self.set_work_order_details() + self.flags.backflush_based_on = frappe.db.get_single_value("Manufacturing Settings", + "backflush_raw_materials_based_on") if self.bom_no: @@ -865,14 +867,16 @@ class StockEntry(StockController): item["to_warehouse"] = self.pro_doc.wip_warehouse self.add_to_stock_entry_detail(item_dict) - elif (self.work_order and (self.purpose == "Manufacture" or self.purpose == "Material Consumption for Manufacture") - and not self.pro_doc.skip_transfer and backflush_based_on == "Material Transferred for Manufacture"): + elif (self.work_order and (self.purpose == "Manufacture" + or self.purpose == "Material Consumption for Manufacture") and not self.pro_doc.skip_transfer + and self.flags.backflush_based_on == "Material Transferred for Manufacture"): self.get_transfered_raw_materials() - elif (self.work_order and backflush_based_on== "BOM" and - (self.purpose == "Manufacture" or self.purpose == "Material Consumption for Manufacture") + elif (self.work_order and (self.purpose == "Manufacture" or + self.purpose == "Material Consumption for Manufacture") and self.flags.backflush_based_on== "BOM" and frappe.db.get_single_value("Manufacturing Settings", "material_consumption")== 1): self.get_unconsumed_raw_materials() + else: if not self.fg_completed_qty: frappe.throw(_("Manufacturing Quantity is mandatory")) @@ -1111,7 +1115,6 @@ class StockEntry(StockController): for d in backflushed_materials.get(item.item_code): if d.get(item.warehouse): if (qty > req_qty): - qty = req_qty qty-= d.get(item.warehouse) if qty > 0: @@ -1137,12 +1140,24 @@ class StockEntry(StockController): item_dict = self.get_pro_order_required_items(backflush_based_on) max_qty = flt(self.pro_doc.qty) + + allow_overproduction = False + overproduction_percentage = flt(frappe.db.get_single_value("Manufacturing Settings", + "overproduction_percentage_for_work_order")) + + to_transfer_qty = flt(self.pro_doc.material_transferred_for_manufacturing) + flt(self.fg_completed_qty) + transfer_limit_qty = max_qty + ((max_qty * overproduction_percentage) / 100) + + if transfer_limit_qty >= to_transfer_qty: + allow_overproduction = True + for item, item_details in iteritems(item_dict): pending_to_issue = flt(item_details.required_qty) - flt(item_details.transferred_qty) desire_to_transfer = flt(self.fg_completed_qty) * flt(item_details.required_qty) / max_qty - if (desire_to_transfer <= pending_to_issue or - (desire_to_transfer > 0 and backflush_based_on == "Material Transferred for Manufacture")): + if (desire_to_transfer <= pending_to_issue + or (desire_to_transfer > 0 and backflush_based_on == "Material Transferred for Manufacture") + or allow_overproduction): item_dict[item]["qty"] = desire_to_transfer elif pending_to_issue > 0: item_dict[item]["qty"] = pending_to_issue @@ -1370,7 +1385,7 @@ class StockEntry(StockController): if self.outgoing_stock_entry: parent_se = frappe.get_value("Stock Entry", self.outgoing_stock_entry, 'add_to_transit') - for item in self.items: + for item in self.items: material_request = item.material_request or None if self.purpose == "Material Transfer" and material_request not in material_requests: if self.outgoing_stock_entry and parent_se: @@ -1430,7 +1445,7 @@ def make_stock_in_entry(source_name, target_doc=None): if add_to_transit: warehouse = frappe.get_value('Material Request Item', source_doc.material_request_item, 'warehouse') target_doc.t_warehouse = warehouse - + target_doc.s_warehouse = source_doc.t_warehouse target_doc.qty = source_doc.qty - source_doc.transferred_qty From 903055b7b62e0f39ce096cb7f1a036a780325c7a Mon Sep 17 00:00:00 2001 From: Saqib Ansari Date: Tue, 20 Oct 2020 11:59:06 +0530 Subject: [PATCH 3/3] fix: '>' not supported between instances of 'str' and 'int' --- erpnext/controllers/stock_controller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py index 394883d239..f743d707f7 100644 --- a/erpnext/controllers/stock_controller.py +++ b/erpnext/controllers/stock_controller.py @@ -52,7 +52,7 @@ class StockController(AccountsController): frappe.throw(_("Row #{0}: Serial No {1} does not belong to Batch {2}") .format(d.idx, serial_no_data.name, d.batch_no)) - if d.qty > 0 and d.get("batch_no") and self.get("posting_date") and self.docstatus < 2: + if flt(d.qty) > 0.0 and d.get("batch_no") and self.get("posting_date") and self.docstatus < 2: expiry_date = frappe.get_cached_value("Batch", d.get("batch_no"), "expiry_date") if expiry_date and getdate(expiry_date) < getdate(self.posting_date):