Skip to content

Commit de244e0

Browse files
Sudharsanan11mergify[bot]
authored andcommitted
fix(stock): include subcontracting order qty while calculating the bin qty
(cherry picked from commit de8f8ef)
1 parent 670fd79 commit de244e0

2 files changed

Lines changed: 62 additions & 35 deletions

File tree

erpnext/stock/stock_balance.py

Lines changed: 60 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44

55
import frappe
6+
from frappe.query_builder.functions import Coalesce, Sum
67
from frappe.utils import cstr, flt, now, nowdate, nowtime
78

89
from erpnext.controllers.stock_controller import create_repost_item_valuation_entry
@@ -182,18 +183,67 @@ def get_indented_qty(item_code, warehouse):
182183

183184

184185
def get_ordered_qty(item_code, warehouse):
185-
ordered_qty = frappe.db.sql(
186-
"""
187-
select sum((po_item.qty - po_item.received_qty)*po_item.conversion_factor)
188-
from `tabPurchase Order Item` po_item, `tabPurchase Order` po
189-
where po_item.item_code=%s and po_item.warehouse=%s
190-
and po_item.qty > po_item.received_qty and po_item.parent=po.name
191-
and po.status not in ('Closed', 'Delivered') and po.docstatus=1
192-
and po_item.delivered_by_supplier = 0""",
193-
(item_code, warehouse),
186+
"""Return total pending ordered quantity for an item in a warehouse.
187+
Includes outstanding quantities from Purchase Orders and Subcontracting Orders"""
188+
189+
purchase_order_qty = get_purchase_order_qty(item_code, warehouse)
190+
subcontracting_order_qty = get_subcontracting_order_qty(item_code, warehouse)
191+
192+
return flt(purchase_order_qty) + flt(subcontracting_order_qty)
193+
194+
195+
def get_purchase_order_qty(item_code, warehouse):
196+
PurchaseOrder = frappe.qb.DocType("Purchase Order")
197+
PurchaseOrderItem = frappe.qb.DocType("Purchase Order Item")
198+
199+
purchase_order_qty = (
200+
frappe.qb.from_(PurchaseOrderItem)
201+
.join(PurchaseOrder)
202+
.on(PurchaseOrderItem.parent == PurchaseOrder.name)
203+
.select(
204+
Sum(
205+
(PurchaseOrderItem.qty - PurchaseOrderItem.received_qty) * PurchaseOrderItem.conversion_factor
206+
)
207+
)
208+
.where(
209+
(PurchaseOrderItem.item_code == item_code)
210+
& (PurchaseOrderItem.warehouse == warehouse)
211+
& (PurchaseOrderItem.qty > PurchaseOrderItem.received_qty)
212+
& (PurchaseOrder.status.notin(["Closed", "Delivered"]))
213+
& (PurchaseOrder.docstatus == 1)
214+
& (Coalesce(PurchaseOrderItem.delivered_by_supplier, 0) == 0)
215+
)
216+
.run()
217+
)
218+
219+
return purchase_order_qty[0][0] if purchase_order_qty else 0
220+
221+
222+
def get_subcontracting_order_qty(item_code, warehouse):
223+
SubcontractingOrder = frappe.qb.DocType("Subcontracting Order")
224+
SubcontractingOrderItem = frappe.qb.DocType("Subcontracting Order Item")
225+
226+
subcontracting_order_qty = (
227+
frappe.qb.from_(SubcontractingOrderItem)
228+
.join(SubcontractingOrder)
229+
.on(SubcontractingOrderItem.parent == SubcontractingOrder.name)
230+
.select(
231+
Sum(
232+
(SubcontractingOrderItem.qty - SubcontractingOrderItem.received_qty)
233+
* SubcontractingOrderItem.conversion_factor
234+
)
235+
)
236+
.where(
237+
(SubcontractingOrderItem.item_code == item_code)
238+
& (SubcontractingOrderItem.warehouse == warehouse)
239+
& (SubcontractingOrderItem.qty > SubcontractingOrderItem.received_qty)
240+
& (SubcontractingOrder.status.notin(["Closed", "Completed"]))
241+
& (SubcontractingOrder.docstatus == 1)
242+
)
243+
.run()
194244
)
195245

196-
return flt(ordered_qty[0][0]) if ordered_qty else 0
246+
return subcontracting_order_qty[0][0] if subcontracting_order_qty else 0
197247

198248

199249
def get_planned_qty(item_code, warehouse):

erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.py

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
StockReservation,
1313
has_reserved_stock,
1414
)
15-
from erpnext.stock.stock_balance import update_bin_qty
15+
from erpnext.stock.stock_balance import get_ordered_qty, update_bin_qty
1616
from erpnext.stock.utils import get_bin
1717

1818

@@ -234,30 +234,7 @@ def update_ordered_qty_for_subcontracting(self, sco_item_rows=None):
234234
):
235235
item_wh_list.append([item.item_code, item.warehouse])
236236
for item_code, warehouse in item_wh_list:
237-
update_bin_qty(item_code, warehouse, {"ordered_qty": self.get_ordered_qty(item_code, warehouse)})
238-
239-
@staticmethod
240-
def get_ordered_qty(item_code, warehouse):
241-
table = frappe.qb.DocType("Subcontracting Order")
242-
child = frappe.qb.DocType("Subcontracting Order Item")
243-
244-
query = (
245-
frappe.qb.from_(table)
246-
.inner_join(child)
247-
.on(table.name == child.parent)
248-
.select((child.qty - child.received_qty) * child.conversion_factor)
249-
.where(
250-
(table.docstatus == 1)
251-
& (child.item_code == item_code)
252-
& (child.warehouse == warehouse)
253-
& (child.qty > child.received_qty)
254-
& (table.status != "Completed")
255-
)
256-
)
257-
258-
query = query.run()
259-
260-
return flt(query[0][0]) if query else 0
237+
update_bin_qty(item_code, warehouse, {"ordered_qty": get_ordered_qty(item_code, warehouse)})
261238

262239
def update_reserved_qty_for_subcontracting(self, sco_item_rows=None):
263240
for item in self.supplied_items:

0 commit comments

Comments
 (0)