net_total and grand_total mismatch issue
diff --git a/erpnext/buying/doctype/purchase_common/purchase_common.js b/erpnext/buying/doctype/purchase_common/purchase_common.js
index 3011160..265f7d4 100644
--- a/erpnext/buying/doctype/purchase_common/purchase_common.js
+++ b/erpnext/buying/doctype/purchase_common/purchase_common.js
@@ -209,26 +209,17 @@
 
 	calculate_totals: function() {
 		var tax_count = this.frm.tax_doclist.length;
-		this.frm.doc.grand_total = flt(tax_count ?
-			this.frm.tax_doclist[tax_count - 1].total : this.frm.doc.net_total);
-		this.frm.doc.grand_total_import = flt(tax_count ?
-			flt(this.frm.doc.grand_total / this.frm.doc.conversion_rate) : this.frm.doc.net_total_import);
+		this.frm.doc.grand_total = flt(tax_count ? this.frm.tax_doclist[tax_count - 1].total : this.frm.doc.net_total);
 
-		this.frm.doc.total_tax = flt(this.frm.doc.grand_total - this.frm.doc.net_total,
-			precision("total_tax"));
+		this.frm.doc.total_tax = flt(this.frm.doc.grand_total - this.frm.doc.net_total, precision("total_tax"));
 
 		this.frm.doc.grand_total = flt(this.frm.doc.grand_total, precision("grand_total"));
-		this.frm.doc.grand_total_import = flt(this.frm.doc.grand_total_import, precision("grand_total_import"));
 
 		// rounded totals
 		if(frappe.meta.get_docfield(this.frm.doc.doctype, "rounded_total", this.frm.doc.name)) {
 			this.frm.doc.rounded_total = Math.round(this.frm.doc.grand_total);
 		}
 
-		if(frappe.meta.get_docfield(this.frm.doc.doctype, "rounded_total_import", this.frm.doc.name)) {
-			this.frm.doc.rounded_total_import = Math.round(this.frm.doc.grand_total_import);
-		}
-
 		// other charges added/deducted
 		this.frm.doc.other_charges_added = 0.0
 		this.frm.doc.other_charges_deducted = 0.0
@@ -246,6 +237,16 @@
 			frappe.model.round_floats_in(this.frm.doc,
 				["other_charges_added", "other_charges_deducted"]);
 		}
+
+		this.frm.doc.grand_total_import = flt((this.frm.doc.other_charges_added || this.frm.doc.other_charges_deducted) ?
+			flt(this.frm.doc.grand_total / this.frm.doc.conversion_rate) : this.frm.doc.net_total_import);
+
+		this.frm.doc.grand_total_import = flt(this.frm.doc.grand_total_import, precision("grand_total_import"));
+
+		if(frappe.meta.get_docfield(this.frm.doc.doctype, "rounded_total_import", this.frm.doc.name)) {
+			this.frm.doc.rounded_total_import = Math.round(this.frm.doc.grand_total_import);
+		}
+
 		this.frm.doc.other_charges_added_import = flt(this.frm.doc.other_charges_added /
 			this.frm.doc.conversion_rate, precision("other_charges_added_import"));
 		this.frm.doc.other_charges_deducted_import = flt(this.frm.doc.other_charges_deducted /
diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py
index f7b5a87..b4ca94d 100644
--- a/erpnext/controllers/buying_controller.py
+++ b/erpnext/controllers/buying_controller.py
@@ -91,8 +91,7 @@
 				item.rate = flt(item.price_list_rate * (1.0 - (item.discount_percentage / 100.0)),
 					self.precision("rate", item))
 
-			item.amount = flt(item.rate * item.qty,
-				self.precision("amount", item))
+			item.amount = flt(item.rate * item.qty, self.precision("amount", item))
 			item.item_tax_amount = 0.0;
 
 			self._set_in_company_currency(item, "amount", "base_amount")
@@ -111,20 +110,14 @@
 
 	def calculate_totals(self):
 		self.grand_total = flt(self.tax_doclist[-1].total if self.tax_doclist else self.net_total)
-		self.grand_total_import = flt(self.grand_total / self.conversion_rate) \
-			if self.tax_doclist else self.net_total_import
 
 		self.total_tax = flt(self.grand_total - self.net_total, self.precision("total_tax"))
 
 		self.grand_total = flt(self.grand_total, self.precision("grand_total"))
-		self.grand_total_import = flt(self.grand_total_import, self.precision("grand_total_import"))
 
 		if self.meta.get_field("rounded_total"):
 			self.rounded_total = rounded(self.grand_total)
 
-		if self.meta.get_field("rounded_total_import"):
-			self.rounded_total_import = rounded(self.grand_total_import)
-
 		if self.meta.get_field("other_charges_added"):
 			self.other_charges_added = flt(sum([flt(d.tax_amount) for d in self.tax_doclist
 				if d.add_deduct_tax=="Add" and d.category in ["Valuation and Total", "Total"]]),
@@ -135,6 +128,14 @@
 				if d.add_deduct_tax=="Deduct" and d.category in ["Valuation and Total", "Total"]]),
 				self.precision("other_charges_deducted"))
 
+		self.grand_total_import = flt(self.grand_total / self.conversion_rate) \
+			if (self.other_charges_added or self.other_charges_deducted) else self.net_total_import
+
+		self.grand_total_import = flt(self.grand_total_import, self.precision("grand_total_import"))
+
+		if self.meta.get_field("rounded_total_import"):
+			self.rounded_total_import = rounded(self.grand_total_import)
+
 		if self.meta.get_field("other_charges_added_import"):
 			self.other_charges_added_import = flt(self.other_charges_added /
 				self.conversion_rate, self.precision("other_charges_added_import"))
diff --git a/erpnext/controllers/selling_controller.py b/erpnext/controllers/selling_controller.py
index 4b0cd4e..91bf0ae 100644
--- a/erpnext/controllers/selling_controller.py
+++ b/erpnext/controllers/selling_controller.py
@@ -218,10 +218,11 @@
 	def calculate_totals(self):
 		self.grand_total = flt(self.tax_doclist[-1].total if self.tax_doclist else self.net_total)
 
-		self.grand_total_export = flt(self.grand_total / self.conversion_rate)
-
 		self.other_charges_total = flt(self.grand_total - self.net_total, self.precision("other_charges_total"))
 
+		self.grand_total_export = flt(self.grand_total / self.conversion_rate) \
+			if (self.other_charges_total or self.discount_amount) else self.net_total_export
+
 		self.other_charges_total_export = flt(self.grand_total_export - self.net_total_export +
 			flt(self.discount_amount), self.precision("other_charges_total_export"))
 
diff --git a/erpnext/selling/sales_common.js b/erpnext/selling/sales_common.js
index 3a01811..5a7ed08 100644
--- a/erpnext/selling/sales_common.js
+++ b/erpnext/selling/sales_common.js
@@ -342,10 +342,13 @@
 		var tax_count = this.frm.tax_doclist.length;
 
 		this.frm.doc.grand_total = flt(tax_count ? this.frm.tax_doclist[tax_count - 1].total : this.frm.doc.net_total);
-		this.frm.doc.grand_total_export = flt(this.frm.doc.grand_total / this.frm.doc.conversion_rate);
 
 		this.frm.doc.other_charges_total = flt(this.frm.doc.grand_total - this.frm.doc.net_total,
 			precision("other_charges_total"));
+
+		this.frm.doc.grand_total_export = (this.frm.doc.other_charges_total || this.frm.doc.discount_amount) ?
+			flt(this.frm.doc.grand_total / this.frm.doc.conversion_rate) : this.frm.doc.net_total_export;
+
 		this.frm.doc.other_charges_total_export = flt(this.frm.doc.grand_total_export -
 			this.frm.doc.net_total_export + flt(this.frm.doc.discount_amount),
 			precision("other_charges_total_export"));