Update order reference in return entries and repost reserved / ordered qty
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index 21656c6..ea10054 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -193,3 +193,4 @@
 erpnext.patches.v5_7.item_template_attributes
 erpnext.patches.v4_2.repost_reserved_qty #2015-08-20
 erpnext.patches.v5_4.update_purchase_cost_against_project
+erpnext.patches.v5_7.update_order_reference_in_return_entries
\ No newline at end of file
diff --git a/erpnext/patches/v5_7/update_order_reference_in_return_entries.py b/erpnext/patches/v5_7/update_order_reference_in_return_entries.py
new file mode 100644
index 0000000..c957242
--- /dev/null
+++ b/erpnext/patches/v5_7/update_order_reference_in_return_entries.py
@@ -0,0 +1,76 @@
+# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
+# License: GNU General Public License v3. See license.txt
+
+from __future__ import unicode_literals
+import frappe
+
+def execute():
+	# sales return
+	return_entries = list(frappe.db.sql("""
+		select dn.name as name, dn_item.name as row_id, dn.return_against, 
+			dn_item.item_code, "Delivery Note" as doctype
+		from `tabDelivery Note Item` dn_item, `tabDelivery Note` dn
+		where dn_item.parent=dn.name and dn.is_return=1 and dn.docstatus < 2
+	""", as_dict=1))
+	
+	return_entries += list(frappe.db.sql("""
+		select si.name as name, si_item.name as row_id, si.return_against, 
+			si_item.item_code, "Sales Invoice" as doctype
+		from `tabSales Invoice Item` si_item, `tabSales Invoice` si
+		where si_item.parent=si.name and si.is_return=1 and si.update_stock=1 and si.docstatus < 2
+	""", as_dict=1))
+	
+	for d in return_entries:
+		ref_field = "against_sales_order" if d.doctype == "Delivery Note" else "sales_order"
+		order_details = frappe.db.sql("""
+			select {0} as sales_order, so_detail 
+			from `tab{1} Item` item
+			where 
+				parent=%s and item_code=%s 
+				and ifnull(so_detail, '') !=''
+			order by
+				(select transaction_date from `tabSales Order` where name=item.{3}) DESC
+		""".format(ref_field, d.doctype, ref_field, ref_field), (d.return_against, d.item_code), as_dict=1)
+		
+		if order_details:
+			frappe.db.sql("""
+				update `tab{0} Item`
+				set {1}=%s, so_detail=%s
+				where name=%s
+			""".format(d.doctype, ref_field), 
+			(order_details[0].sales_order, order_details[0].so_detail, d.row_id))
+			
+			doc = frappe.get_doc(d.doctype, d.name)
+			doc.update_reserved_qty()
+			
+	
+	#--------------------------
+	# purchase return
+	return_entries = frappe.db.sql("""
+		select pr.name as name, pr_item.name as row_id, pr.return_against, pr_item.item_code
+		from `tabPurchase Receipt Item` pr_item, `tabPurchase Receipt` pr
+		where pr_item.parent=pr.name and pr.is_return=1 and pr.docstatus < 2
+	""", as_dict=1)
+	
+	for d in return_entries:
+		order_details = frappe.db.sql("""
+			select prevdoc_docname as purchase_order, prevdoc_detail_docname as po_detail 
+			from `tabPurchase Receipt Item` item
+			where 
+				parent=%s and item_code=%s 
+				and ifnull(prevdoc_detail_docname, '') !='' 
+				and ifnull(prevdoc_doctype, '') = 'Purchase Order' and ifnull(prevdoc_detail_docname, '') != ''
+			order by
+				(select transaction_date from `tabPurchase Order` where name=item.prevdoc_detail_docname) DESC
+		""", (d.return_against, d.item_code), as_dict=1)
+		
+		if order_details:
+			frappe.db.sql("""
+				update `tabPurchase Receipt Item`
+				set prevdoc_doctype='Purchase Order', prevdoc_docname=%s, prevdoc_detail_docname=%s
+				where name=%s
+			""", (order_details[0].purchase_order, order_details[0].po_detail, d.row_id))
+			
+			pr = frappe.get_doc("Purchase Receipt", d.name)
+			pr.update_ordered_qty()
+	
\ No newline at end of file
diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py
index 2e57a11..4f9d54d 100644
--- a/erpnext/selling/doctype/sales_order/sales_order.py
+++ b/erpnext/selling/doctype/sales_order/sales_order.py
@@ -214,15 +214,15 @@
 
 	def stop_sales_order(self):
 		self.check_modified_date()
-		self.update_reserved_qty()
 		frappe.db.set(self, 'status', 'Stopped')
+		self.update_reserved_qty()
 		frappe.msgprint(_("{0} {1} status is Stopped").format(self.doctype, self.name))
 		self.notify_modified()
 
 	def unstop_sales_order(self):
 		self.check_modified_date()
-		self.update_reserved_qty()
 		frappe.db.set(self, 'status', 'Submitted')
+		self.update_reserved_qty()
 		frappe.msgprint(_("{0} {1} status is Unstopped").format(self.doctype, self.name))
 				
 	def update_reserved_qty(self, so_item_rows=None):