Outgoing rate in Purchase Return based on reference/original Purchase Receipt rate
diff --git a/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.json b/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.json
index 780bcc9..bb6f409 100644
--- a/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.json
+++ b/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.json
@@ -151,6 +151,15 @@
    "read_only": 1
   }, 
   {
+   "fieldname": "outgoing_rate", 
+   "fieldtype": "Currency", 
+   "label": "Outgoing Rate", 
+   "options": "Company:company:default_currency", 
+   "permlevel": 0, 
+   "precision": "", 
+   "read_only": 1
+  }, 
+  {
    "fieldname": "stock_uom", 
    "fieldtype": "Link", 
    "label": "Stock UOM", 
@@ -266,7 +275,7 @@
  "icon": "icon-list", 
  "idx": 1, 
  "in_create": 1, 
- "modified": "2015-07-13 05:28:27.826340", 
+ "modified": "2015-07-16 16:37:54.452944", 
  "modified_by": "Administrator", 
  "module": "Stock", 
  "name": "Stock Ledger Entry", 
diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py
index 954a03b..a5deb30 100644
--- a/erpnext/stock/stock_ledger.py
+++ b/erpnext/stock/stock_ledger.py
@@ -109,7 +109,7 @@
 	def build(self):
 		# includes current entry!
 		entries_to_fix = self.get_sle_after_datetime()
-
+		
 		for sle in entries_to_fix:
 			self.process_sle(sle)
 
@@ -230,19 +230,21 @@
 					self.valuation_rate = new_stock_value / new_stock_qty
 
 	def get_moving_average_values(self, sle):
-		incoming_rate = flt(sle.incoming_rate)
 		actual_qty = flt(sle.actual_qty)
-
-		if flt(sle.actual_qty) > 0:
+		
+		if actual_qty > 0 or flt(sle.outgoing_rate) > 0:
+			rate = flt(sle.incoming_rate) if actual_qty > 0 else flt(sle.outgoing_rate)
+			
 			if self.qty_after_transaction < 0 and not self.valuation_rate:
 				# if negative stock, take current valuation rate as incoming rate
-				self.valuation_rate = incoming_rate
+				self.valuation_rate = rate
 
 			new_stock_qty = abs(self.qty_after_transaction) + actual_qty
-			new_stock_value = (abs(self.qty_after_transaction) * self.valuation_rate) + (actual_qty * incoming_rate)
+			new_stock_value = (abs(self.qty_after_transaction) * self.valuation_rate) + (actual_qty * rate)
 
 			if new_stock_qty:
 				self.valuation_rate = new_stock_value / flt(new_stock_qty)
+							
 		elif not self.valuation_rate and self.qty_after_transaction <= 0:
 			self.valuation_rate = get_valuation_rate(sle.item_code, sle.warehouse, self.allow_zero_rate)
 
@@ -251,6 +253,7 @@
 	def get_fifo_values(self, sle):
 		incoming_rate = flt(sle.incoming_rate)
 		actual_qty = flt(sle.actual_qty)
+		outgoing_rate = flt(sle.outgoing_rate)
 
 		if actual_qty > 0:
 			if not self.stock_queue:
@@ -278,16 +281,34 @@
 						_rate = 0
 					self.stock_queue.append([0, _rate])
 
-				batch = self.stock_queue[0]
+				index = None
+				if outgoing_rate > 0:
+					# Find the entry where rate matched with outgoing rate
+					for i, v in enumerate(self.stock_queue):
+						if v[1] == outgoing_rate:
+							index = i
+							break
+							
+					# If no entry found with outgoing rate, collapse stack
+					if index == None:
+						new_stock_value = sum((d[0]*d[1] for d in self.stock_queue)) - qty_to_pop*outgoing_rate
+						new_stock_qty = sum((d[0] for d in self.stock_queue)) - qty_to_pop
+						self.stock_queue = [[new_stock_qty, new_stock_value/new_stock_qty if new_stock_qty > 0 else outgoing_rate]]
+						break
+				else:
+					index = 0
+
+				# select first batch or the batch with same rate
+				batch = self.stock_queue[index]
 
 				if qty_to_pop >= batch[0]:
 					# consume current batch
 					qty_to_pop = qty_to_pop - batch[0]
-					self.stock_queue.pop(0)
+					self.stock_queue.pop(index)
 					if not self.stock_queue and qty_to_pop:
 						# stock finished, qty still remains to be withdrawn
 						# negative stock, keep in as a negative batch
-						self.stock_queue.append([-qty_to_pop, batch[1]])
+						self.stock_queue.append([-qty_to_pop, outgoing_rate or batch[1]])
 						break
 
 				else: