mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-25 07:54:46 +00:00
Merge pull request #33501 from frappe/mergify/bp/version-13-hotfix/pr-33444
fix: consider child nodes while getting bin details (backport #33444)
This commit is contained in:
@@ -26,7 +26,7 @@ class SellingController(StockController):
|
|||||||
super(SellingController, self).onload()
|
super(SellingController, self).onload()
|
||||||
if self.doctype in ("Sales Order", "Delivery Note", "Sales Invoice"):
|
if self.doctype in ("Sales Order", "Delivery Note", "Sales Invoice"):
|
||||||
for item in self.get("items"):
|
for item in self.get("items"):
|
||||||
item.update(get_bin_details(item.item_code, item.warehouse))
|
item.update(get_bin_details(item.item_code, item.warehouse, include_child_warehouses=True))
|
||||||
|
|
||||||
def validate(self):
|
def validate(self):
|
||||||
super(SellingController, self).validate()
|
super(SellingController, self).validate()
|
||||||
|
|||||||
@@ -217,7 +217,8 @@ erpnext.buying.BuyingController = erpnext.TransactionController.extend({
|
|||||||
args: {
|
args: {
|
||||||
item_code: item.item_code,
|
item_code: item.item_code,
|
||||||
warehouse: item.warehouse,
|
warehouse: item.warehouse,
|
||||||
company: doc.company
|
company: doc.company,
|
||||||
|
include_child_warehouses: true
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -102,9 +102,11 @@ def get_item_details(args, doc=None, for_validate=False, overwrite_warehouse=Tru
|
|||||||
elif out.get("warehouse"):
|
elif out.get("warehouse"):
|
||||||
if doc and doc.get("doctype") == "Purchase Order":
|
if doc and doc.get("doctype") == "Purchase Order":
|
||||||
# calculate company_total_stock only for po
|
# calculate company_total_stock only for po
|
||||||
bin_details = get_bin_details(args.item_code, out.warehouse, args.company)
|
bin_details = get_bin_details(
|
||||||
|
args.item_code, out.warehouse, args.company, include_child_warehouses=True
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
bin_details = get_bin_details(args.item_code, out.warehouse)
|
bin_details = get_bin_details(args.item_code, out.warehouse, include_child_warehouses=True)
|
||||||
|
|
||||||
out.update(bin_details)
|
out.update(bin_details)
|
||||||
|
|
||||||
@@ -1045,7 +1047,9 @@ def get_pos_profile_item_details(company, args, pos_profile=None, update_data=Fa
|
|||||||
res[fieldname] = pos_profile.get(fieldname)
|
res[fieldname] = pos_profile.get(fieldname)
|
||||||
|
|
||||||
if res.get("warehouse"):
|
if res.get("warehouse"):
|
||||||
res.actual_qty = get_bin_details(args.item_code, res.warehouse).get("actual_qty")
|
res.actual_qty = get_bin_details(
|
||||||
|
args.item_code, res.warehouse, include_child_warehouses=True
|
||||||
|
).get("actual_qty")
|
||||||
|
|
||||||
return res
|
return res
|
||||||
|
|
||||||
@@ -1156,16 +1160,31 @@ def get_projected_qty(item_code, warehouse):
|
|||||||
|
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def get_bin_details(item_code, warehouse, company=None):
|
def get_bin_details(item_code, warehouse, company=None, include_child_warehouses=False):
|
||||||
bin_details = frappe.db.get_value(
|
bin_details = {"projected_qty": 0, "actual_qty": 0, "reserved_qty": 0, "ordered_qty": 0}
|
||||||
"Bin",
|
|
||||||
{"item_code": item_code, "warehouse": warehouse},
|
if warehouse:
|
||||||
["projected_qty", "actual_qty", "reserved_qty", "ordered_qty"],
|
from frappe.query_builder.functions import Coalesce, Sum
|
||||||
as_dict=True,
|
|
||||||
cache=True,
|
from erpnext.stock.doctype.warehouse.warehouse import get_child_warehouses
|
||||||
) or {"projected_qty": 0, "actual_qty": 0, "reserved_qty": 0, "ordered_qty": 0}
|
|
||||||
|
warehouses = get_child_warehouses(warehouse) if include_child_warehouses else [warehouse]
|
||||||
|
|
||||||
|
bin = frappe.qb.DocType("Bin")
|
||||||
|
bin_details = (
|
||||||
|
frappe.qb.from_(bin)
|
||||||
|
.select(
|
||||||
|
Coalesce(Sum(bin.projected_qty), 0).as_("projected_qty"),
|
||||||
|
Coalesce(Sum(bin.actual_qty), 0).as_("actual_qty"),
|
||||||
|
Coalesce(Sum(bin.reserved_qty), 0).as_("reserved_qty"),
|
||||||
|
Coalesce(Sum(bin.ordered_qty), 0).as_("ordered_qty"),
|
||||||
|
)
|
||||||
|
.where((bin.item_code == item_code) & (bin.warehouse.isin(warehouses)))
|
||||||
|
).run(as_dict=True)[0]
|
||||||
|
|
||||||
if company:
|
if company:
|
||||||
bin_details["company_total_stock"] = get_company_total_stock(item_code, company)
|
bin_details["company_total_stock"] = get_company_total_stock(item_code, company)
|
||||||
|
|
||||||
return bin_details
|
return bin_details
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user