Pricing Rule fixes and improvements. Fixes #1795
diff --git a/erpnext/public/js/transaction.js b/erpnext/public/js/transaction.js
index 2c37204..ea576d5 100644
--- a/erpnext/public/js/transaction.js
+++ b/erpnext/public/js/transaction.js
@@ -116,8 +116,8 @@
 							barcode: item.barcode,
 							serial_no: item.serial_no,
 							warehouse: item.warehouse,
-							doctype: me.frm.doc.doctype,
-							docname: me.frm.doc.name,
+							parenttype: me.frm.doc.doctype,
+							parent: me.frm.doc.name,
 							customer: me.frm.doc.customer,
 							supplier: me.frm.doc.supplier,
 							currency: me.frm.doc.currency,
@@ -130,7 +130,10 @@
 							order_type: me.frm.doc.order_type,
 							is_pos: cint(me.frm.doc.is_pos),
 							is_subcontracted: me.frm.doc.is_subcontracted,
-							transaction_date: me.frm.doc.transaction_date
+							transaction_date: me.frm.doc.transaction_date,
+							ignore_pricing_rule: me.frm.doc.ignore_pricing_rule,
+							doctype: item.doctype,
+							name: item.name
 						}
 					},
 					callback: function(r) {
@@ -196,7 +199,7 @@
 			}
 
 			this.frm.script_manager.trigger("currency");
-			this.apply_pricing_rule()
+			this.apply_pricing_rule();
 		}
 	},
 
@@ -229,7 +232,12 @@
 				this.frm.set_value("plc_conversion_rate", this.frm.doc.conversion_rate);
 		}
 		if(flt(this.frm.doc.conversion_rate)>0.0) {
-			this.apply_pricing_rule();
+			if(this.frm.doc.ignore_pricing_rule) {
+				this.calculate_taxes_and_totals();
+			} else {
+				this.apply_pricing_rule();
+			}
+
 		}
 	},
 
@@ -283,12 +291,11 @@
 		}
 		if(this.frm.doc.price_list_currency === this.frm.doc.currency) {
 			this.frm.set_value("conversion_rate", this.frm.doc.plc_conversion_rate);
-			this.apply_pricing_rule();
 		}
 	},
 
 	qty: function(doc, cdt, cdn) {
-		this.apply_pricing_rule(frappe.get_doc(cdt, cdn));
+		this.apply_pricing_rule(frappe.get_doc(cdt, cdn), true);
 	},
 
 	// tax rate
@@ -331,51 +338,71 @@
 		this.calculate_taxes_and_totals();
 	},
 
-	apply_pricing_rule: function(item) {
+	ignore_pricing_rule: function() {
+		this.apply_pricing_rule();
+	},
+
+	apply_pricing_rule: function(item, calculate_taxes_and_totals) {
 		var me = this;
-
-		var _apply_pricing_rule = function(item) {
-			return me.frm.call({
-				method: "erpnext.stock.get_item_details.apply_pricing_rule",
-				child: item,
-				args: {
-					args: {
-						item_code: item.item_code,
-						item_group: item.item_group,
-						brand: item.brand,
-						qty: item.qty,
-						customer: me.frm.doc.customer,
-						customer_group: me.frm.doc.customer_group,
-						territory: me.frm.doc.territory,
-						supplier: me.frm.doc.supplier,
-						supplier_type: me.frm.doc.supplier_type,
-						currency: me.frm.doc.currency,
-						conversion_rate: me.frm.doc.conversion_rate,
-						price_list: me.frm.doc.selling_price_list ||
-							 me.frm.doc.buying_price_list,
-						plc_conversion_rate: me.frm.doc.plc_conversion_rate,
-						company: me.frm.doc.company,
-						transaction_date: me.frm.doc.transaction_date || me.frm.doc.posting_date,
-						campaign: me.frm.doc.campaign,
-						sales_partner: me.frm.doc.sales_partner
-					}
-				},
-				callback: function(r) {
-					if(!r.exc) {
-						me.frm.script_manager.trigger("price_list_rate", item.doctype, item.name);
-					}
+		var item_list = this._get_item_list(item);
+		var args = {
+			"item_list": item_list,
+			"customer": me.frm.doc.customer,
+			"customer_group": me.frm.doc.customer_group,
+			"territory": me.frm.doc.territory,
+			"supplier": me.frm.doc.supplier,
+			"supplier_type": me.frm.doc.supplier_type,
+			"currency": me.frm.doc.currency,
+			"conversion_rate": me.frm.doc.conversion_rate,
+			"price_list": me.frm.doc.selling_price_list || me.frm.doc.buying_price_list,
+			"plc_conversion_rate": me.frm.doc.plc_conversion_rate,
+			"company": me.frm.doc.company,
+			"transaction_date": me.frm.doc.transaction_date || me.frm.doc.posting_date,
+			"campaign": me.frm.doc.campaign,
+			"sales_partner": me.frm.doc.sales_partner,
+			"ignore_pricing_rule": me.frm.doc.ignore_pricing_rule,
+			"parenttype": me.frm.doc.doctype,
+			"parent": me.frm.doc.name
+		};
+		return this.frm.call({
+			method: "erpnext.accounts.doctype.pricing_rule.pricing_rule.apply_pricing_rule",
+			args: {	args: args },
+			callback: function(r) {
+				if (!r.exc) {
+					$.each(r.message, function(i, d) {
+						$.each(d, function(k, v) {
+							if (["doctype", "name"].indexOf(k)===-1) {
+								frappe.model.set_value(d.doctype, d.name, k, v);
+							}
+						});
+					});
+					if(calculate_taxes_and_totals) me.calculate_taxes_and_totals();
 				}
+			}
+		});
+	},
+
+	_get_item_list: function(item) {
+		var item_list = [];
+		var append_item = function(d) {
+			item_list.push({
+				"doctype": d.doctype,
+				"name": d.name,
+				"item_code": d.item_code,
+				"item_group": d.item_group,
+				"brand": d.brand,
+				"qty": d.qty
 			});
-		}
+		};
 
-
-		if(item) {
-			_apply_pricing_rule(item);
+		if (item) {
+			append_item(item);
 		} else {
-			$.each(this.get_item_doclist(), function(n, item) {
-				_apply_pricing_rule(item);
+			$.each(this.get_item_doclist(), function(i, d) {
+				append_item(d);
 			});
 		}
+		return item_list;
 	},
 
 	included_in_print_rate: function(doc, cdt, cdn) {