Merge pull request #5325 from nabinhait/return_fix_2

In Purchase Return entry, make sle and gle as per actual inward entry's valuation rate
diff --git a/erpnext/controllers/sales_and_purchase_return.py b/erpnext/controllers/sales_and_purchase_return.py
index e76cf98..a48d7b7 100644
--- a/erpnext/controllers/sales_and_purchase_return.py
+++ b/erpnext/controllers/sales_and_purchase_return.py
@@ -62,8 +62,8 @@
 			
 
 	if doc.doctype in ("Delivery Note", "Sales Invoice"):
-		for d in frappe.db.sql("""select item_code, sum(qty) as qty, serial_no, batch_no from `tabPacked Item`
-			where parent = %s group by item_code""".format(doc.doctype), doc.return_against, as_dict=1):
+		for d in frappe.db.sql("""select item_code, qty, serial_no, batch_no from `tabPacked Item`
+			where parent = %s""".format(doc.doctype), doc.return_against, as_dict=1):
 				valid_items = get_ref_item_dict(valid_items, d)
 
 	already_returned_items = get_already_returned_items(doc)
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
index 8ee6de9..0ce3cd1 100644
--- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
+++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
@@ -139,19 +139,24 @@
 				pr_qty = flt(d.qty) * flt(d.conversion_factor)
 
 				if pr_qty:
-					val_rate_db_precision = 6 if cint(self.precision("valuation_rate", d)) <= 6 else 9
-					rate = flt(d.valuation_rate, val_rate_db_precision)
+					
 					sle = self.get_sl_entries(d, {
 						"actual_qty": flt(pr_qty),
 						"serial_no": cstr(d.serial_no).strip()
 					})
 					if self.is_return:
+						original_incoming_rate = frappe.db.get_value("Stock Ledger Entry", 
+							{"voucher_type": "Purchase Receipt", "voucher_no": self.return_against, 
+							"item_code": d.item_code}, "incoming_rate")
+							
 						sle.update({
-							"outgoing_rate": rate
+							"outgoing_rate": original_incoming_rate
 						})
 					else:
+						val_rate_db_precision = 6 if cint(self.precision("valuation_rate", d)) <= 6 else 9
+						incoming_rate = flt(d.valuation_rate, val_rate_db_precision)
 						sle.update({
-							"incoming_rate": rate
+							"incoming_rate": incoming_rate
 						})
 					sl_entries.append(sle)
 
@@ -302,12 +307,9 @@
 		for d in self.get("items"):
 			if d.item_code in stock_items and flt(d.valuation_rate) and flt(d.qty):
 				if warehouse_account.get(d.warehouse):
-
-					val_rate_db_precision = 6 if cint(d.precision("valuation_rate")) <= 6 else 9
-
-					# warehouse account
-					stock_value_diff = flt(flt(d.valuation_rate, val_rate_db_precision) * flt(d.qty)
-						* flt(d.conversion_factor),	d.precision("base_net_amount"))
+					stock_value_diff = frappe.db.get_value("Stock Ledger Entry", 
+						{"voucher_type": "Purchase Receipt", "voucher_no": self.name, 
+						"voucher_detail_no": d.name}, "stock_value_difference")
 
 					gl_entries.append(self.get_gl_dict({
 						"account": warehouse_account[d.warehouse]["name"],
@@ -352,16 +354,20 @@
 						}, warehouse_account[self.supplier_warehouse]["account_currency"]))
 
 					# divisional loss adjustment
-					sle_valuation_amount = flt(flt(d.valuation_rate, val_rate_db_precision) * flt(d.qty) * flt(d.conversion_factor),
-							self.precision("base_net_amount", d))
-
-					distributed_amount = flt(flt(d.base_net_amount, self.precision("base_net_amount", d))) + \
+					valuation_amount_as_per_doc = flt(d.base_net_amount, d.precision("base_net_amount")) + \
 						flt(d.landed_cost_voucher_amount) + flt(d.rm_supp_cost) + flt(d.item_tax_amount)
 
-					divisional_loss = flt(distributed_amount - sle_valuation_amount, self.precision("base_net_amount", d))
+					divisional_loss = flt(valuation_amount_as_per_doc - stock_value_diff, 
+						d.precision("base_net_amount"))
+						
 					if divisional_loss:
+						if self.is_return or flt(d.item_tax_amount):
+							loss_account = expenses_included_in_valuation
+						else:
+							loss_account = stock_rbnb
+							
 						gl_entries.append(self.get_gl_dict({
-							"account": stock_rbnb,
+							"account": loss_account,
 							"against": warehouse_account[d.warehouse]["name"],
 							"cost_center": d.cost_center,
 							"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py
index ed67322..d3fa482 100644
--- a/erpnext/stock/stock_ledger.py
+++ b/erpnext/stock/stock_ledger.py
@@ -215,8 +215,6 @@
 		stock_value_change = 0
 		if incoming_rate:
 			stock_value_change = actual_qty * incoming_rate
-		elif flt(sle.outgoing_rate):
-			stock_value_change = actual_qty * flt(sle.outgoing_rate)
 		elif actual_qty < 0:
 			# In case of delivery/stock issue, get average purchase rate
 			# of serial nos of current entry