fix: multiple stock entry issues for the work order (#18686)

* fix: multiple stock entry issues for the work order

* Update work_order.py

* Update work_order.py

Co-authored-by: Nabin Hait <nabinhait@gmail.com>
This commit is contained in:
rohitwaghchaure 2019-12-24 18:53:32 +05:30 committed by Nabin Hait
parent 7372672044
commit 6e8a9286c2
2 changed files with 17 additions and 16 deletions

View File

@ -808,24 +808,26 @@ class StockEntry(StockController):
if self.bom_no: if self.bom_no:
backflush_based_on = frappe.db.get_single_value("Manufacturing Settings",
"backflush_raw_materials_based_on")
if self.purpose in ["Material Issue", "Material Transfer", "Manufacture", "Repack", if self.purpose in ["Material Issue", "Material Transfer", "Manufacture", "Repack",
"Send to Subcontractor", "Material Transfer for Manufacture", "Material Consumption for Manufacture"]: "Send to Subcontractor", "Material Transfer for Manufacture", "Material Consumption for Manufacture"]:
if self.work_order and self.purpose == "Material Transfer for Manufacture": if self.work_order and self.purpose == "Material Transfer for Manufacture":
item_dict = self.get_pending_raw_materials() item_dict = self.get_pending_raw_materials(backflush_based_on)
if self.to_warehouse and self.pro_doc: if self.to_warehouse and self.pro_doc:
for item in itervalues(item_dict): for item in itervalues(item_dict):
item["to_warehouse"] = self.pro_doc.wip_warehouse item["to_warehouse"] = self.pro_doc.wip_warehouse
self.add_to_stock_entry_detail(item_dict) self.add_to_stock_entry_detail(item_dict)
elif (self.work_order 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 not self.pro_doc.skip_transfer and frappe.db.get_single_value("Manufacturing Settings", and not self.pro_doc.skip_transfer and backflush_based_on == "Material Transferred for Manufacture"):
"backflush_raw_materials_based_on")== "Material Transferred for Manufacture"):
self.get_transfered_raw_materials() self.get_transfered_raw_materials()
elif self.work_order and (self.purpose == "Manufacture" or self.purpose == "Material Consumption for Manufacture") and \ elif (self.work_order and backflush_based_on== "BOM" and
frappe.db.get_single_value("Manufacturing Settings", "backflush_raw_materials_based_on")== "BOM" and \ (self.purpose == "Manufacture" or self.purpose == "Material Consumption for Manufacture")
frappe.db.get_single_value("Manufacturing Settings", "material_consumption")== 1: and frappe.db.get_single_value("Manufacturing Settings", "material_consumption")== 1):
self.get_unconsumed_raw_materials() self.get_unconsumed_raw_materials()
else: else:
@ -1034,10 +1036,6 @@ class StockEntry(StockController):
filters={'parent': self.work_order, 'item_code': item_code}, filters={'parent': self.work_order, 'item_code': item_code},
fields=["required_qty", "consumed_qty"] fields=["required_qty", "consumed_qty"]
) )
if not req_items:
frappe.msgprint(_("Did not found transfered item {0} in Work Order {1}, the item not added in Stock Entry")
.format(item_code, self.work_order))
continue
req_qty = flt(req_items[0].required_qty) req_qty = flt(req_items[0].required_qty)
req_qty_each = flt(req_qty / manufacturing_qty) req_qty_each = flt(req_qty / manufacturing_qty)
@ -1085,18 +1083,20 @@ class StockEntry(StockController):
} }
}) })
def get_pending_raw_materials(self): def get_pending_raw_materials(self, backflush_based_on=None):
""" """
issue (item quantity) that is pending to issue or desire to transfer, issue (item quantity) that is pending to issue or desire to transfer,
whichever is less whichever is less
""" """
item_dict = self.get_pro_order_required_items() item_dict = self.get_pro_order_required_items(backflush_based_on)
max_qty = flt(self.pro_doc.qty) max_qty = flt(self.pro_doc.qty)
for item, item_details in iteritems(item_dict): for item, item_details in iteritems(item_dict):
pending_to_issue = flt(item_details.required_qty) - flt(item_details.transferred_qty) 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 desire_to_transfer = flt(self.fg_completed_qty) * flt(item_details.required_qty) / max_qty
if desire_to_transfer <= pending_to_issue: if (desire_to_transfer <= pending_to_issue or
(desire_to_transfer > 0 and backflush_based_on == "Material Transferred for Manufacture")):
item_dict[item]["qty"] = desire_to_transfer item_dict[item]["qty"] = desire_to_transfer
elif pending_to_issue > 0: elif pending_to_issue > 0:
item_dict[item]["qty"] = pending_to_issue item_dict[item]["qty"] = pending_to_issue
@ -1114,7 +1114,7 @@ class StockEntry(StockController):
return item_dict return item_dict
def get_pro_order_required_items(self): def get_pro_order_required_items(self, backflush_based_on=None):
item_dict = frappe._dict() item_dict = frappe._dict()
pro_order = frappe.get_doc("Work Order", self.work_order) pro_order = frappe.get_doc("Work Order", self.work_order)
if not frappe.db.get_value("Warehouse", pro_order.wip_warehouse, "is_group"): if not frappe.db.get_value("Warehouse", pro_order.wip_warehouse, "is_group"):
@ -1123,7 +1123,8 @@ class StockEntry(StockController):
wip_warehouse = None wip_warehouse = None
for d in pro_order.get("required_items"): for d in pro_order.get("required_items"):
if (flt(d.required_qty) > flt(d.transferred_qty) and if ( ((flt(d.required_qty) > flt(d.transferred_qty)) or
(backflush_based_on == "Material Transferred for Manufacture")) and
(d.include_item_in_manufacturing or self.purpose != "Material Transfer for Manufacture")): (d.include_item_in_manufacturing or self.purpose != "Material Transfer for Manufacture")):
item_row = d.as_dict() item_row = d.as_dict()
if d.source_warehouse and not frappe.db.get_value("Warehouse", d.source_warehouse, "is_group"): if d.source_warehouse and not frappe.db.get_value("Warehouse", d.source_warehouse, "is_group"):