From 197bf8fbec45c9856d8bf120210cd01605cb5ebd Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Wed, 9 Feb 2022 11:26:03 +0530 Subject: [PATCH] refactor: move reserve quantity computation to work order (cherry picked from commit a8bf3a3f0d21ba8b841b69b2185c9d2bd46cd3f2) # Conflicts: # erpnext/stock/doctype/bin/bin.py --- .../doctype/work_order/work_order.py | 26 +++++++++++++++++++ erpnext/stock/doctype/bin/bin.py | 6 +++++ 2 files changed, 32 insertions(+) diff --git a/erpnext/manufacturing/doctype/work_order/work_order.py b/erpnext/manufacturing/doctype/work_order/work_order.py index c5daba58c3d..46e02b0cdd4 100644 --- a/erpnext/manufacturing/doctype/work_order/work_order.py +++ b/erpnext/manufacturing/doctype/work_order/work_order.py @@ -8,6 +8,8 @@ from dateutil.relativedelta import relativedelta from frappe import _ from frappe.model.document import Document from frappe.model.mapper import get_mapped_doc +from frappe.query_builder import Case +from frappe.query_builder.functions import Sum from frappe.utils import ( cint, date_diff, @@ -1171,3 +1173,27 @@ def create_pick_list(source_name, target_doc=None, for_qty=None): doc.set_item_locations() return doc + +def get_reserved_qty_for_production(item_code: str, warehouse: str) -> float: + """Get total reserved quantity for any item in specified warehouse""" + wo = frappe.qb.DocType("Work Order") + wo_item = frappe.qb.DocType("Work Order Item") + + return ( + frappe.qb + .from_(wo) + .from_(wo_item) + .select(Sum(Case() + .when(wo.skip_transfer == 0, wo_item.required_qty - wo_item.transferred_qty) + .else_(wo_item.required_qty - wo_item.consumed_qty)) + ) + .where( + (wo_item.item_code == item_code) + & (wo_item.parent == wo.name) + & (wo.docstatus == 1) + & (wo_item.source_warehouse == warehouse) + & (wo.status.notin(["Stopped", "Completed", "Closed"])) + & ((wo_item.required_qty > wo_item.transferred_qty) + | (wo_item.required_qty > wo_item.consumed_qty)) + ) + ).run()[0][0] or 0.0 diff --git a/erpnext/stock/doctype/bin/bin.py b/erpnext/stock/doctype/bin/bin.py index e6412e9426c..fe897bc0168 100644 --- a/erpnext/stock/doctype/bin/bin.py +++ b/erpnext/stock/doctype/bin/bin.py @@ -31,6 +31,7 @@ class Bin(Document): def update_reserved_qty_for_production(self): '''Update qty reserved for production from Production Item tables in open work orders''' +<<<<<<< HEAD <<<<<<< HEAD self.reserved_qty_for_production = frappe.db.sql(''' SELECT @@ -72,6 +73,11 @@ class Bin(Document): ) ).run()[0][0] or 0.0 >>>>>>> 6a8b7eeffe (fix: Reserved for Production calculation considered closed work orders) +======= + from erpnext.manufacturing.doctype.work_order.work_order import get_reserved_qty_for_production + + self.reserved_qty_for_production = get_reserved_qty_for_production(self.item_code, self.warehouse) +>>>>>>> a8bf3a3f0d (refactor: move reserve quantity computation to work order) self.set_projected_qty()