mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-23 06:59:20 +00:00
Merge pull request #17562 from fproldan/fix_bundlestock
fix: Available Stock for Packing Items error
This commit is contained in:
@@ -11,7 +11,6 @@ def execute(filters=None):
|
|||||||
columns = get_columns()
|
columns = get_columns()
|
||||||
iwq_map = get_item_warehouse_quantity_map()
|
iwq_map = get_item_warehouse_quantity_map()
|
||||||
item_map = get_item_details()
|
item_map = get_item_details()
|
||||||
|
|
||||||
data = []
|
data = []
|
||||||
for sbom, warehouse in iwq_map.items():
|
for sbom, warehouse in iwq_map.items():
|
||||||
total = 0
|
total = 0
|
||||||
@@ -20,7 +19,7 @@ def execute(filters=None):
|
|||||||
for wh, item_qty in warehouse.items():
|
for wh, item_qty in warehouse.items():
|
||||||
total += 1
|
total += 1
|
||||||
row = [sbom, item_map.get(sbom).item_name, item_map.get(sbom).description,
|
row = [sbom, item_map.get(sbom).item_name, item_map.get(sbom).description,
|
||||||
item_map.get(sbom).stock_uom, wh]
|
item_map.get(sbom).stock_uom, wh]
|
||||||
available_qty = item_qty
|
available_qty = item_qty
|
||||||
total_qty += flt(available_qty)
|
total_qty += flt(available_qty)
|
||||||
row += [available_qty]
|
row += [available_qty]
|
||||||
@@ -30,54 +29,38 @@ def execute(filters=None):
|
|||||||
if (total == len(warehouse)):
|
if (total == len(warehouse)):
|
||||||
row = ["", "", "Total", "", "", total_qty]
|
row = ["", "", "Total", "", "", total_qty]
|
||||||
data.append(row)
|
data.append(row)
|
||||||
|
|
||||||
return columns, data
|
return columns, data
|
||||||
|
|
||||||
def get_columns():
|
def get_columns():
|
||||||
columns = ["Item Code:Link/Item:100", "Item Name::100", "Description::120", \
|
columns = ["Item Code:Link/Item:100", "Item Name::100", "Description::120", \
|
||||||
"UOM:Link/UOM:80", "Warehouse:Link/Warehouse:100", "Quantity::100"]
|
"UOM:Link/UOM:80", "Warehouse:Link/Warehouse:100", "Quantity::100"]
|
||||||
|
|
||||||
return columns
|
return columns
|
||||||
|
|
||||||
def get_product_bundle_items():
|
|
||||||
sbom_item_map = {}
|
|
||||||
for sbom in frappe.db.sql("""select pb.new_item_code as parent, pbi.item_code, pbi.qty
|
|
||||||
from `tabProduct Bundle Item` as pbi, `tabProduct Bundle` as pb
|
|
||||||
where pb.docstatus < 2 and pb.name = pbi.parent""", as_dict=1):
|
|
||||||
sbom_item_map.setdefault(sbom.parent, {}).setdefault(sbom.item_code, sbom.qty)
|
|
||||||
|
|
||||||
return sbom_item_map
|
|
||||||
|
|
||||||
def get_item_details():
|
def get_item_details():
|
||||||
item_map = {}
|
item_map = {}
|
||||||
for item in frappe.db.sql("""select name, item_name, description, stock_uom
|
for item in frappe.db.sql("""SELECT name, item_name, description, stock_uom
|
||||||
from `tabItem`""", as_dict=1):
|
from `tabItem`""", as_dict=1):
|
||||||
item_map.setdefault(item.name, item)
|
item_map.setdefault(item.name, item)
|
||||||
|
|
||||||
return item_map
|
return item_map
|
||||||
|
|
||||||
def get_item_warehouse_quantity():
|
|
||||||
iwq_map = {}
|
|
||||||
bin = frappe.db.sql("""select item_code, warehouse, actual_qty from `tabBin`
|
|
||||||
where actual_qty > 0""")
|
|
||||||
for item, wh, qty in bin:
|
|
||||||
iwq_map.setdefault(item, {}).setdefault(wh, qty)
|
|
||||||
|
|
||||||
return iwq_map
|
|
||||||
|
|
||||||
def get_item_warehouse_quantity_map():
|
def get_item_warehouse_quantity_map():
|
||||||
query = """SELECT parent, warehouse, MIN(qty) AS qty
|
query = """SELECT parent, warehouse, MIN(qty) AS qty
|
||||||
FROM (SELECT b.parent, bi.item_code, bi.warehouse,
|
FROM (SELECT b.parent, bi.item_code, bi.warehouse,
|
||||||
sum(bi.projected_qty) / b.qty AS qty
|
sum(bi.projected_qty) / b.qty AS qty
|
||||||
FROM tabBin AS bi, (SELECT b.parent, b.item_code, b.qty, w.name
|
FROM tabBin AS bi, (SELECT pb.new_item_code as parent, b.item_code, b.qty, w.name
|
||||||
FROM `tabProduct Bundle Item` b, `tabWarehouse` w) AS b
|
FROM `tabProduct Bundle Item` b, `tabWarehouse` w,
|
||||||
|
`tabProduct Bundle` pb
|
||||||
|
where b.parent = pb.name) AS b
|
||||||
WHERE bi.item_code = b.item_code
|
WHERE bi.item_code = b.item_code
|
||||||
AND bi.warehouse = b.name
|
AND bi.warehouse = b.name
|
||||||
GROUP BY b.parent, b.item_code, bi.warehouse
|
GROUP BY b.parent, b.item_code, bi.warehouse
|
||||||
UNION ALL
|
UNION ALL
|
||||||
SELECT b.parent, b.item_code, b.name, 0 AS qty
|
SELECT b.parent, b.item_code, b.name, 0 AS qty
|
||||||
FROM (SELECT b.parent, b.item_code, b.qty, w.name
|
FROM (SELECT pb.new_item_code as parent, b.item_code, b.qty, w.name
|
||||||
FROM `tabProduct Bundle Item` b, `tabWarehouse` w) AS b
|
FROM `tabProduct Bundle Item` b, `tabWarehouse` w,
|
||||||
|
`tabProduct Bundle` pb
|
||||||
|
where b.parent = pb.name) AS b
|
||||||
WHERE NOT EXISTS(SELECT *
|
WHERE NOT EXISTS(SELECT *
|
||||||
FROM `tabBin` AS bi
|
FROM `tabBin` AS bi
|
||||||
WHERE bi.item_code = b.item_code
|
WHERE bi.item_code = b.item_code
|
||||||
@@ -92,4 +75,4 @@ def get_item_warehouse_quantity_map():
|
|||||||
last_sbom = line.get("parent")
|
last_sbom = line.get("parent")
|
||||||
actual_dict = sbom_map.setdefault(last_sbom, {})
|
actual_dict = sbom_map.setdefault(last_sbom, {})
|
||||||
actual_dict.setdefault(line.get("warehouse"), line.get("qty"))
|
actual_dict.setdefault(line.get("warehouse"), line.get("qty"))
|
||||||
return sbom_map
|
return sbom_map
|
||||||
Reference in New Issue
Block a user