Fixes and cleanups of reserve qty for subcontracting
diff --git a/erpnext/patches/v10_0/update_reserved_qty_for_purchase_order.py b/erpnext/patches/v10_0/update_reserved_qty_for_purchase_order.py
new file mode 100644
index 0000000..f0de423
--- /dev/null
+++ b/erpnext/patches/v10_0/update_reserved_qty_for_purchase_order.py
@@ -0,0 +1,48 @@
+import frappe
+from frappe import _
+from erpnext.stock.utils import get_bin
+
+def execute():
+ po_item = list(frappe.db.sql(("""
+ select distinct po.name as poname, poitem.rm_item_code as rm_item_code, po.company
+ from `tabPurchase Order` po, `tabPurchase Order Item Supplied` poitem
+ where po.name = poitem.parent
+ and po.is_subcontracted = "Yes"
+ and po.docstatus = 1"""), as_dict=1))
+ if not po_item:
+ return
+
+ company_warehouse = frappe._dict(frappe.db.sql("""select company, min(name) from `tabWarehouse`
+ where is_group = 0 group by company"""))
+
+ items = list(set([d.rm_item_code for d in po_item]))
+ item_wh = frappe._dict(frappe.db.sql("""select item_code, default_warehouse
+ from `tabItem` where name in ({0})""".format(", ".join(["%s"] * len(items))), items))
+
+ # Update reserved warehouse
+ for item in po_item:
+ reserve_warehouse = get_warehouse(item.rm_item_code, item.company, company_warehouse, item_wh)
+ update_res_warehouse = frappe.db.sql("""update `tabPurchase Order Item Supplied`
+ set reserve_warehouse = %s
+ where parent = %s and rm_item_code = %s
+ """, (reserve_warehouse, item["poname"], item["rm_item_code"]))
+
+ # Update bin
+ item_wh_bin = frappe.db.sql(("""
+ select distinct poitemsup.rm_item_code as rm_item_code,
+ poitemsup.reserve_warehouse as reserve_warehouse
+ from `tabPurchase Order` po, `tabPurchase Order Item Supplied` poitemsup
+ where po.name = poitemsup.parent
+ and po.is_subcontracted = "Yes"
+ and po.docstatus = 1"""), as_dict=1)
+ for d in item_wh_bin:
+ stock_bin = get_bin(d["rm_item_code"], d["reserve_warehouse"])
+ stock_bin.update_reserved_qty_for_sub_contracting()
+
+def get_warehouse(item_code, company, company_warehouse, item_wh):
+ reserve_warehouse = item_wh.get(item_code)
+ if frappe.db.get_value("Warehouse", reserve_warehouse, "company") != company:
+ reserve_warehouse = None
+ if not reserve_warehouse:
+ reserve_warehouse = company_warehouse.get(company)
+ return reserve_warehouse
\ No newline at end of file