import frappe from erpnext.stock.utils import get_bin def execute(): wo = frappe.qb.DocType("Work Order") wo_item = frappe.qb.DocType("Work Order Item") incorrect_item_wh = ( frappe.qb.from_(wo) .join(wo_item) .on(wo.name == wo_item.parent) .select(wo_item.item_code, wo.source_warehouse) .distinct() .where((wo.status == "Closed") & (wo.docstatus == 1) & (wo.source_warehouse.notnull())) ).run() for item_code, warehouse in incorrect_item_wh: if not (item_code and warehouse): continue bin = get_bin(item_code, warehouse) bin.update_reserved_qty_for_production()