Merge pull request #1816 from nabinhait/v4-hotfix

Stock Entry incoming rate
diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py
index 9792da1..cd172f1 100644
--- a/erpnext/accounts/party.py
+++ b/erpnext/accounts/party.py
@@ -12,13 +12,14 @@
 
 @frappe.whitelist()
 def get_party_details(party=None, account=None, party_type="Customer", company=None,
-	posting_date=None, price_list=None, currency=None):
+	posting_date=None, price_list=None, currency=None, doctype=None):
 
-	return _get_party_details(party, account, party_type, company, posting_date, price_list, currency)
+	return _get_party_details(party, account, party_type,
+		company, posting_date, price_list, currency, doctype)
 
 def _get_party_details(party=None, account=None, party_type="Customer", company=None,
-	posting_date=None, price_list=None, currency=None, ignore_permissions=False):
-	out = frappe._dict(set_account_and_due_date(party, account, party_type, company, posting_date))
+	posting_date=None, price_list=None, currency=None, doctype=None, ignore_permissions=False):
+	out = frappe._dict(set_account_and_due_date(party, account, party_type, company, posting_date, doctype))
 
 	party = out[party_type.lower()]
 
@@ -106,8 +107,8 @@
 	out["selling_price_list" if party.doctype=="Customer" else "buying_price_list"] = price_list
 
 
-def set_account_and_due_date(party, account, party_type, company, posting_date):
-	if not posting_date:
+def set_account_and_due_date(party, account, party_type, company, posting_date, doctype):
+	if doctype not in ["Sales Invoice", "Purchase Invoice"]:
 		# not an invoice
 		return {
 			party_type.lower(): party
diff --git a/erpnext/public/js/utils/party.js b/erpnext/public/js/utils/party.js
index 40db97f..c9b1206 100644
--- a/erpnext/public/js/utils/party.js
+++ b/erpnext/public/js/utils/party.js
@@ -25,6 +25,7 @@
 
 	args.currency = frm.doc.currency;
 	args.company = frm.doc.company;
+	args.doctype = frm.doc.doctype;
 	frappe.call({
 		method: method,
 		args: args,
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js
index a42a865..9597392 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.js
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.js
@@ -241,14 +241,14 @@
 	customer: function() {
 		return this.frm.call({
 			method: "erpnext.accounts.party.get_party_details",
-			args: { party: this.frm.doc.customer, party_type:"Customer" }
+			args: { party: this.frm.doc.customer, party_type:"Customer", doctype: this.frm.doc.doctype }
 		});
 	},
 
 	supplier: function() {
 		return this.frm.call({
 			method: "erpnext.accounts.party.get_party_details",
-			args: { party: this.frm.doc.supplier, party_type:"Supplier" }
+			args: { party: this.frm.doc.supplier, party_type:"Supplier", doctype: this.frm.doc.doctype }
 		});
 	},
 
@@ -359,16 +359,17 @@
 
 cur_frm.cscript.s_warehouse = function(doc, cdt, cdn) {
 	var d = locals[cdt][cdn];
-	args = {
-		'item_code'		: d.item_code,
-		'warehouse'		: cstr(d.s_warehouse) || cstr(d.t_warehouse),
-		'transfer_qty'	: d.transfer_qty,
-		'serial_no'		: d.serial_no,
-		'bom_no'		: d.bom_no,
-		'qty'			: d.s_warehouse ? -1* d.qty : d.qty
+	if(!d.bom_no) {
+		args = {
+			'item_code'		: d.item_code,
+			'warehouse'		: cstr(d.s_warehouse) || cstr(d.t_warehouse),
+			'transfer_qty'	: d.transfer_qty,
+			'serial_no'		: d.serial_no,
+			'qty'			: d.s_warehouse ? -1* d.qty : d.qty
+		}
+		return get_server_fields('get_warehouse_details', JSON.stringify(args),
+			'mtn_details', doc, cdt, cdn, 1);
 	}
-	return get_server_fields('get_warehouse_details', JSON.stringify(args),
-		'mtn_details', doc, cdt, cdn, 1);
 }
 
 cur_frm.cscript.t_warehouse = cur_frm.cscript.s_warehouse;
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py
index 38c7521..297542b 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.py
@@ -239,29 +239,25 @@
 
 	def get_incoming_rate(self, args):
 		incoming_rate = 0
-		if self.purpose == "Sales Return" and \
-				(self.delivery_note_no or self.sales_invoice_no):
-			sle = frappe.db.sql("""select name, posting_date, posting_time,
-				actual_qty, stock_value, warehouse from `tabStock Ledger Entry`
-				where voucher_type = %s and voucher_no = %s and
-				item_code = %s limit 1""",
-				((self.delivery_note_no and "Delivery Note" or "Sales Invoice"),
-				self.delivery_note_no or self.sales_invoice_no, args.item_code), as_dict=1)
-			if sle:
-				args.update({
-					"posting_date": sle[0].posting_date,
-					"posting_time": sle[0].posting_time,
-					"sle": sle[0].name,
-					"warehouse": sle[0].warehouse,
-				})
-				previous_sle = get_previous_sle(args)
-				incoming_rate = (flt(sle[0].stock_value) - flt(previous_sle.get("stock_value"))) / \
-					flt(sle[0].actual_qty)
+		if self.purpose == "Sales Return":
+			incoming_rate = self.get_incoming_rate_for_sales_return(args)
 		else:
 			incoming_rate = get_incoming_rate(args)
 
 		return incoming_rate
 
+	def get_incoming_rate_for_sales_return(self, args):
+		incoming_rate = 0.0
+		if (self.delivery_note_no or self.sales_invoice_no) and args.get("item_code"):
+			incoming_rate = frappe.db.sql("""select abs(ifnull(stock_value_difference, 0) / actual_qty)
+				from `tabStock Ledger Entry`
+				where voucher_type = %s and voucher_no = %s and item_code = %s limit 1""",
+				((self.delivery_note_no and "Delivery Note" or "Sales Invoice"),
+				self.delivery_note_no or self.sales_invoice_no, args.item_code))
+			incoming_rate = incoming_rate[0][0] if incoming_rate else 0.0
+
+		return incoming_rate
+
 	def validate_incoming_rate(self):
 		for d in self.get('mtn_details'):
 			if d.t_warehouse: