code improvements
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py
index 15d9c05..dc66821 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.py
@@ -560,10 +560,18 @@
 						frappe.throw(_("Manufacturing Quantity is mandatory"))
 
 					item_dict = self.get_bom_raw_materials(self.fg_completed_qty)
+					#Get PO Supplied Items Details
+					if self.purchase_order and self.purpose == "Subcontract":
+						#Get PO Supplied Items Details
+						item_wh = frappe._dict(frappe.db.sql("""select rm_item_code, reserve_warehouse 
+															from `tabPurchase Order` po, `tabPurchase Order Item Supplied` poitemsup
+															where po.name = poitemsup.parent
+															and po.name = %s""",self.purchase_order))
 					for item in item_dict.values():
 						if self.pro_doc and not self.pro_doc.skip_transfer:
 							item["from_warehouse"] = self.pro_doc.wip_warehouse
-
+						#Get Reserve Warehouse from PO
+						item["from_warehouse"] = item_wh.get(item.item_code)
 						item["to_warehouse"] = self.to_warehouse if self.purpose=="Subcontract" else ""
 
 					self.add_to_stock_entry_detail(item_dict)
@@ -810,17 +818,18 @@
 
 	def update_purchase_order_supplied_items(self):
 		#Get PO Supplied Items Details
-		po_doc =  frappe.get_doc("Purchase Order",self.purchase_order)
-		po_supplied_items = po_doc.get("supplied_items")
+		item_wh = frappe._dict(frappe.db.sql("""select rm_item_code, reserve_warehouse 
+											from `tabPurchase Order` po, `tabPurchase Order Item Supplied` poitemsup
+											where po.name = poitemsup.parent
+											and po.name = %s""",self.purchase_order))
 		#Validate source warehouse is same as reserved warehouse
 		for item in self.get("items"):
-			if item.s_warehouse:
-				for d in po_supplied_items:
-					if item.item_code == d.rm_item_code and item.s_warehouse != d.reserve_warehouse:
-						frappe.throw(_("In case of Sub Contract Stock Entry, Source Warehouse: {0} should match with Reserved Warehouse: {1} on PO").format(item.s_warehouse,d.reserve_warehouse))
+			reserve_warehouse = item_wh.get(item.item_code)
+			if item.s_warehouse != reserve_warehouse:
+				frappe.throw(_("In case of Sub Contract Stock Entry, Source Warehouse: {0} should match with Reserved Warehouse: {1} entered on Purchase Order {2}").format(item.s_warehouse,reserve_warehouse,self.purchase_order))
 		#Update reserved sub contracted quantity in bin based on Supplied Item Details
-		for d in po_supplied_items:
-			stock_bin = get_bin(d.rm_item_code, d.reserve_warehouse)
+		for d in self.get("items"):
+			stock_bin = get_bin(d.item_code, d.s_warehouse)
 			stock_bin.update_reserved_qty_for_sub_contracting()
 
 @frappe.whitelist()