Merge branch 'master' into latest
diff --git a/erpnext/selling/doctype/sales_common/sales_common.js b/erpnext/selling/doctype/sales_common/sales_common.js
index fa0c255..d12c039 100644
--- a/erpnext/selling/doctype/sales_common/sales_common.js
+++ b/erpnext/selling/doctype/sales_common/sales_common.js
@@ -5,6 +5,10 @@
 // cur_frm.cscript.other_fname - Other Charges fieldname
 // cur_frm.cscript.sales_team_fname - Sales Team fieldname
 
+function roundNumber(num, dec) {
+	var result = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
+	return result;
+}
 
 // ============== Load Default Taxes ===================
 cur_frm.cscript.load_taxes = function(doc, cdt, cdn) {
@@ -153,7 +157,8 @@
 		var basic_rate = cur_frm.cscript.back_calc_basic_rate(
 			doc, cur_frm.cscript.tname, fname, d, cur_frm.cscript.other_fname
 		);
-		if (d.basic_rate != basic_rate.toFixed(2)) { 
+		// TODO: remove roundNumber for basic_rate comparison
+		if (d.basic_rate != roundNumber(basic_rate, 2)) { 
 			d.basic_rate = basic_rate;
 			refresh_field('basic_rate', d.name, fname); 
 			msgprint("You cannot change Basic Rate* (Base Currency) when \
@@ -238,7 +243,7 @@
 	var net_total_incl = 0
 	var cl = getchildren(tname, doc.name, fname);
 	for(var i = 0; i<cl.length; i++){
-		net_total += flt(cl[i].amount);
+		net_total += flt(cl[i].basic_rate) * flt(cl[i].qty);
 		net_total_incl += flt(cl[i].export_amount);
 	}
 
@@ -251,13 +256,15 @@
 		}
 	}
 
+	if(flt(doc.conversion_rate)>1) {
+		net_total_incl *= flt(doc.conversion_rate);
+	}
+
 	doc.net_total = inclusive_rate ? flt(net_total_incl) : flt(net_total);
-	doc.other_charges_total = flt(flt(other_charges_total).toFixed(2));
-	//doc.grand_total = flt(flt(net_total) + flt(other_charges_total));
-	doc.grand_total = flt((flt(net_total) + flt(other_charges_total)).toFixed(2));
+	doc.other_charges_total = roundNumber(flt(other_charges_total), 2);
+	doc.grand_total = roundNumber((flt(net_total) + flt(other_charges_total)), 2);
 	doc.rounded_total = Math.round(doc.grand_total);
-	//doc.grand_total_export = flt(flt(doc.grand_total) / flt(doc.conversion_rate));
-	doc.grand_total_export = flt((flt(doc.grand_total) / flt(doc.conversion_rate)).toFixed(2));
+	doc.grand_total_export = roundNumber((flt(doc.grand_total) / flt(doc.conversion_rate)), 2);
 	doc.rounded_total_export = Math.round(doc.grand_total_export);
 	doc.total_commission = flt(flt(net_total) * flt(doc.commission_rate) / 100);
 }
@@ -277,10 +284,9 @@
 	var otc = make_table(cur_frm.fields_dict['Other Charges Calculation'].disp_area,
 		cl.length + 1, tax.length + 1, '90%', [], { border:'1px solid #AAA', padding:'2px' });
 	$y(otc,{marginTop:'8px'});
-  
+
 	var tax_desc = {}; var tax_desc_rates = []; var net_total = 0;
   
-  
 	for(var i=0;i<cl.length;i++) {
 		net_total += flt(flt(cl[i].qty) * flt(cl[i].basic_rate));
 		var prev_total = flt(cl[i].amount);
@@ -290,13 +296,13 @@
 		// Add Item Code in new Row
 		$td(otc,i+1,0).innerHTML = cl[i].item_code ? cl[i].item_code : cl[i].description;
     
-		var tax = getchildren('RV Tax Detail', doc.name, other_fname,doc.doctype);
+		//var tax = getchildren('RV Tax Detail', doc.name, other_fname,doc.doctype);
 		var total = net_total;
     
+    
 		for(var t=0;t<tax.length;t++){
 			var account = tax[t].account_head;
 			$td(otc,0,t+1).innerHTML = account?account:'';
-      
 			//Check For Rate
 			if(cl[i].item_tax_rate && check_tax[account]!=null) {
 				var rate = flt(check_tax[account]);
@@ -307,16 +313,16 @@
 
 			//Check For Rate and get tax amount
 			var tax_amount = cur_frm.cscript.check_charge_type_and_get_tax_amount(doc,tax,t, cl[i], rate);
-      
+			
 			//enter item_wise_tax_detail i.e. tax rate on each item
 			var item_wise_tax_detail = cur_frm.cscript.get_item_wise_tax_detail(doc, rate, cl, i, tax, t);
 			if(tax[t].charge_type != "Actual") tax[t].item_wise_tax_detail += item_wise_tax_detail;
 			tax[t].total_amount = flt(tax_amount);     //stores actual tax amount in virtual field
 			tax[t].total_tax_amount = flt(prev_total);      //stores total amount in virtual field
-			tax[t].tax_amount += roundNumber(flt(tax_amount), 2);       
+			tax[t].tax_amount += flt(tax_amount);       
 			var total_amount = flt(tax[t].tax_amount);
 			total_tax_amount = flt(tax[t].total_tax_amount) + flt(total_amount);
-			set_multiple('RV Tax Detail', tax[t].name, { 'item_wise_tax_detail':tax[t].item_wise_tax_detail, 'amount':flt(total_amount.toFixed(2)), 'total':(flt(total)+flt(tax[t].tax_amount)).toFixed(2)/*_tax_amount)*/}, other_fname);
+			set_multiple('RV Tax Detail', tax[t].name, { 'item_wise_tax_detail':tax[t].item_wise_tax_detail, 'amount':roundNumber(flt(total_amount), 2), 'total':roundNumber(flt(total)+flt(tax[t].tax_amount), 2)}, other_fname);
 			prev_total += flt(tax[t].total_amount);   // for previous row total
 			total += flt(tax[t].tax_amount);     // for adding total to previous amount
 
@@ -327,10 +333,11 @@
 
 		}
 	}
+	
+	for(var t=0;t<tax.length;t++){
+		tax[t].tax_amount = roundNumber(tax[t].tax_amount, 2);
+	}
 }
-
-function roundNumber(num, dec) {	var result = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);	return result;}
-
 cur_frm.cscript.check_charge_type_and_get_tax_amount = function( doc, tax, t, cl, rate, print_amt) {
   doc = locals[doc.doctype][doc.name];
   if (! print_amt) print_amt = 0;
@@ -347,7 +354,6 @@
       refresh_field('total_excise_rate');
       return
     }
-    
 	return tax_amount = (flt(rate) * flt(cl.amount) / 100);
   }
   else if(tax[t].charge_type == 'On Previous Row Amount'){
@@ -470,37 +476,27 @@
 
 // ********************** Update values in table ******************************
 cur_frm.cscript.update_fname_table = function(doc , tname , fname , n, other_fname) {
-  doc = locals[doc.doctype][doc.name] 
-  var net_total = 0
-  var cl = getchildren(tname, doc.name, fname);
-  var consider_incl_rate = cur_frm.cscript.consider_incl_rate(doc, other_fname);
-  for(var i=0;i<cl.length;i++) {
-    if(n == 1){
-		if(!consider_incl_rate) {
-			if(flt(cl[i].ref_rate) > 0) {
+	doc = locals[doc.doctype][doc.name] 
+	var net_total = 0
+	var cl = getchildren(tname, doc.name, fname);
+	var consider_incl_rate = cur_frm.cscript.consider_incl_rate(doc, other_fname);
+	for(var i=0;i<cl.length;i++) {
+		if(n == 1){
+			if(!consider_incl_rate) {
+				if(flt(cl[i].ref_rate) > 0) {
+					set_multiple(tname, cl[i].name, {
+						'export_rate': flt(flt(cl[i].ref_rate) * (100 - flt(cl[i].adj_rate)) / 100)
+					}, fname);
+				}
 				set_multiple(tname, cl[i].name, {
-					'export_rate': flt(flt(cl[i].ref_rate) * (100 - flt(cl[i].adj_rate)) / 100)
-				}, fname); 
-				
-			} 
-			// Commenting this part because ref_rate backcalculation injects floating point issues
-			/*else if(flt(cl[i].export_rate) > 0) {
-				var ref_rate = flt(cl[i].adj_rate)!=flt(100) ?
-					flt((100 * flt(cl[i].export_rate))/flt(100 - flt(cl[i].adj_rate))) :
-					flt(0)
-				set_multiple(tname, cl[i].name, { 'ref_rate': flt(ref_rate) }, fname);
-			} */
-
-			set_multiple(tname, cl[i].name, {
-				'export_amount': flt(flt(cl[i].qty) * flt(cl[i].export_rate)),
-				'basic_rate': flt(flt(cl[i].export_rate) * flt(doc.conversion_rate)),
-				'amount': flt((flt(cl[i].export_rate) * flt(doc.conversion_rate)) * flt(cl[i].qty))
-			}, fname);
-
-			var base_ref_rate = flt(cl[i].basic_rate) + flt(flt(cl[i].basic_rate) * flt(cl[i].adj_rate) / 100);
-			set_multiple(tname, cl[i].name, {
-				'base_ref_rate': flt(base_ref_rate)
-			}, fname);
+					'export_amount': flt(flt(cl[i].qty) * flt(cl[i].export_rate)),
+					'basic_rate': flt(flt(cl[i].export_rate) * flt(doc.conversion_rate)),
+					'amount': roundNumber(flt((flt(cl[i].export_rate) * flt(doc.conversion_rate)) * flt(cl[i].qty)), 2)
+				}, fname);
+				var base_ref_rate = flt(cl[i].basic_rate) + flt(flt(cl[i].basic_rate) * flt(cl[i].adj_rate) / 100);
+				set_multiple(tname, cl[i].name, {
+					'base_ref_rate': flt(base_ref_rate)
+				}, fname);
 
 		} else if(consider_incl_rate) {
 			if(flt(cl[i].export_rate) > 0) {
@@ -520,7 +516,7 @@
 			var base_ref_rate = basic_rate + flt(basic_rate * flt(cl[i].adj_rate) / 100);
 			set_multiple(tname, cl[i].name, {
 				'basic_rate': flt(basic_rate),
-				'amount': flt(basic_rate * flt(cl[i].qty)),
+				'amount': roundNumber(flt(basic_rate * flt(cl[i].qty)), 2),
 				'export_amount': flt(flt(cl[i].qty) * flt(cl[i].export_rate)),
 				'base_ref_rate': flt(base_ref_rate)
 			}, fname);
@@ -655,4 +651,3 @@
     validated = false;
   }
 }
-
diff --git a/erpnext/setup/doctype/notification_control/notification_control.js b/erpnext/setup/doctype/notification_control/notification_control.js
index 112395e..13c3087 100644
--- a/erpnext/setup/doctype/notification_control/notification_control.js
+++ b/erpnext/setup/doctype/notification_control/notification_control.js
@@ -32,7 +32,7 @@
 						args['send_to'] || doc.contact_email,
 						send_from,
 						send_from,
-						doc.company + " - " + print_heading,
+						doc.company + " - " + print_heading + " - " + doc.name,
 						res.message,
 						res.print_format
 					);