Merge branch '4.0.0-wip' of github.com:webnotes/erpnext into 4.0-hotfix
diff --git a/erpnext/accounts/doctype/sales_invoice/pos.js b/erpnext/accounts/doctype/sales_invoice/pos.js
index 8909d85..991dad8 100644
--- a/erpnext/accounts/doctype/sales_invoice/pos.js
+++ b/erpnext/accounts/doctype/sales_invoice/pos.js
@@ -127,6 +127,7 @@
 		this.party = party;
 		this.price_list = (party == "Customer" ? 
 			this.frm.doc.selling_price_list : this.frm.doc.buying_price_list);
+		this.price_list_field = (party == "Customer" ? "selling_price_list" : "buying_price_list");
 		this.sales_or_purchase = (party == "Customer" ? "Sales" : "Purchase");
 		this.net_total = "net_total_" + export_or_import;
 		this.grand_total = "grand_total_" + export_or_import;
@@ -287,22 +288,17 @@
 				this.frm.cscript.fname,	this.frm.doctype), function(i, d) {
 				if (d.item_code == item_code) {
 					caught = true;
-					if (serial_no) {
-						d.serial_no += '\n' + serial_no;
-						me.frm.script_manager.trigger("serial_no", d.doctype, d.name);
-					}
-					else {
-						d.qty += 1;
-						me.frm.script_manager.trigger("qty", d.doctype, d.name);
-					}
+					if (serial_no)
+						wn.model.set_value(d.doctype, d.name, "serial_no", d.serial_no + '\n' + serial_no);
+					else
+						wn.model.set_value(d.doctype, d.name, "qty", d.qty + 1);
 				}
 			});
 		}
 		
 		// if item not found then add new item
-		if (!caught) {
+		if (!caught)
 			this.add_new_item_to_grid(item_code, serial_no);
-		}
 
 		this.refresh();
 		this.refresh_search_box();
@@ -337,15 +333,16 @@
 					wn.model.clear_doc(d.doctype, d.name);
 					me.refresh_grid();
 				} else {
-					d.qty = qty;
-					me.frm.script_manager.trigger("qty", d.doctype, d.name);
+					wn.model.set_value(d.doctype, d.name, "qty", qty);
 				}
 			}
 		});
-		me.refresh();
+		this.refresh();
 	},
 	refresh: function() {
 		var me = this;
+
+		this.refresh_item_list();
 		this.party_field.set_input(this.frm.doc[this.party.toLowerCase()]);
 		this.wrapper.find('input.discount-amount').val(this.frm.doc.discount_amount);
 		this.barcode.set_input("");
@@ -369,6 +366,14 @@
 				this.make_party();
 		}
 	},
+	refresh_item_list: function() {
+		var me = this;
+		// refresh item list on change of price list
+		if (this.frm.doc[this.price_list_field] != this.price_list) {
+			this.price_list = this.frm.doc[this.price_list_field];
+			this.make_item_list();
+		}
+	},
 	show_items_in_item_cart: function() {
 		var me = this;
 		var $items = this.wrapper.find("#cart tbody").empty();
@@ -402,9 +407,8 @@
 			)).appendTo($items);
 		});
 
-		this.wrapper.find(".increase-qty, .decrease-qty").on("click", function() {
-			var item_code = $(this).closest("tr").attr("id");
-			me.selected_item_qty_operation(item_code, $(this).attr("class"));
+		this.wrapper.find("input.qty").on("focus", function() {
+			$(this).select();
 		});
 	},
 	show_taxes: function() {
@@ -441,10 +445,16 @@
 
 		// append quantity to the respective item after change from input box
 		$(this.wrapper).find("input.qty").on("change", function() {
-			var item_code = $(this).closest("tr")[0].id;
+			var item_code = $(this).closest("tr").attr("id");
 			me.update_qty(item_code, $(this).val());
 		});
 
+		// increase/decrease qty on plus/minus button
+		$(this.wrapper).find(".increase-qty, .decrease-qty").on("click", function() {
+			var tr = $(this).closest("tr");
+			me.increase_decrease_qty(tr, $(this).attr("class"));
+		});
+
 		// on td click toggle the highlighting of row
 		$(this.wrapper).find("#cart tbody tr td").on("click", function() {
 			var row = $(this).closest("tr");
@@ -462,6 +472,15 @@
 		me.refresh_delete_btn();
 		this.barcode.$input.focus();
 	},
+	increase_decrease_qty: function(tr, operation) {
+		var item_code = tr.attr("id");
+		var item_qty = cint(tr.find("input.qty").val());
+
+		if (operation == "increase-qty")
+			this.update_qty(item_code, item_qty + 1);
+		else if (operation == "decrease-qty" && item_qty != 1)
+			this.update_qty(item_code, item_qty - 1);
+	},
 	disable_text_box_and_button: function() {
 		var me = this;
 		// if form is submitted & cancelled then disable all input box & buttons
@@ -533,26 +552,11 @@
 		this.refresh_grid();
 	},
 	refresh_grid: function() {
+		this.frm.dirty();
 		this.frm.fields_dict[this.frm.cscript.fname].grid.refresh();
 		this.frm.script_manager.trigger("calculate_taxes_and_totals");
 		this.refresh();
 	},
-	selected_item_qty_operation: function(item_code, operation) {
-		var me = this;
-		var child = wn.model.get_children(this.frm.doctype + " Item", this.frm.doc.name, 
-			this.frm.cscript.fname, this.frm.doctype);
-
-		$.each(child, function(i, d) {
-			if (d.item_code == item_code) {
-				if (operation == "increase-qty")
-					d.qty += 1;
-				else if (operation == "decrease-qty")
-					d.qty != 1 ? d.qty -= 1 : d.qty = 1;
-
-				me.refresh();
-			}
-		});
-	},
 	make_payment: function() {
 		var me = this;
 		var no_of_items = $(this.wrapper).find("#cart tbody tr").length;
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
index 2259bbe..1292507 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
@@ -320,12 +320,9 @@
 			item = webnotes.conn.sql("select name,is_asset_item,is_sales_item from `tabItem` where name = '%s' and (ifnull(end_of_life,'')='' or end_of_life = '0000-00-00' or end_of_life >	now())"% d.item_code)
 			acc =	webnotes.conn.sql("select account_type from `tabAccount` where name = '%s' and docstatus != 2" % d.income_account)
 			if not acc:
-				msgprint("Account: "+d.income_account+" does not exist in the system")
-				raise Exception
+				msgprint("Account: "+d.income_account+" does not exist in the system", raise_exception=True)
 			elif item and item[0][1] == 'Yes' and not acc[0][0] == 'Fixed Asset Account':
-				msgprint("Please select income head with account type 'Fixed Asset Account' as Item %s is an asset item" % d.item_code)
-				raise Exception
-				
+				msgprint("Please select income head with account type 'Fixed Asset Account' as Item %s is an asset item" % d.item_code, raise_exception=True)				
 		
 	def validate_with_previous_doc(self):
 		super(DocType, self).validate_with_previous_doc(self.tname, {
diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
index de96abb..085595e 100644
--- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
+++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
@@ -37,12 +37,15 @@
 		return columns
 
 	def get_data(self, customer_naming_by):
+		from erpnext.accounts.utils import get_currency_precision
+		currency_precision = get_currency_precision() or 2
+
 		data = []
 		future_vouchers = self.get_entries_after(self.filters.report_date)
 		for gle in self.get_entries_till(self.filters.report_date):
 			if self.is_receivable(gle, future_vouchers):
 				outstanding_amount = self.get_outstanding_amount(gle, self.filters.report_date)
-				if abs(outstanding_amount) > 0.0:
+				if abs(outstanding_amount) > 0.1/10**currency_precision:
 					due_date = self.get_due_date(gle)
 					invoiced_amount = gle.debit if (gle.debit > 0) else 0
 					payment_received = invoiced_amount - outstanding_amount
diff --git a/erpnext/accounts/report/general_ledger/general_ledger.py b/erpnext/accounts/report/general_ledger/general_ledger.py
index a22a114..ccdba06 100644
--- a/erpnext/accounts/report/general_ledger/general_ledger.py
+++ b/erpnext/accounts/report/general_ledger/general_ledger.py
@@ -34,7 +34,7 @@
 def get_columns():
 	return ["Posting Date:Date:100", "Account:Link/Account:200", "Debit:Float:100", 
 		"Credit:Float:100", "Voucher Type::120", "Voucher No::160", "Link::20", 
-		"Against Account::120", "Cost Center:Link/Cost Center:100", "Remarks::200"]
+		"Against Account::120", "Cost Center:Link/Cost Center:100", "Remarks::400"]
 		
 def get_result(filters, account_details):	
 	gl_entries = get_gl_entries(filters)
@@ -51,7 +51,7 @@
 		
 	gl_entries = webnotes.conn.sql("""select posting_date, account, 
 			sum(ifnull(debit, 0)) as debit, sum(ifnull(credit, 0)) as credit, 
-			voucher_type, voucher_no, cost_center, remarks, is_advance, against 
+			voucher_type, voucher_no, cost_center, remarks, is_opening, against 
 		from `tabGL Entry`
 		where company=%(company)s {conditions}
 		{group_by_condition}
@@ -138,7 +138,7 @@
 	for gle in gl_entries:
 		amount = flt(gle.debit) - flt(gle.credit)
 		if filters.get("account") and (gle.posting_date < filters.from_date 
-				or cstr(gle.is_advance) == "Yes"):
+				or cstr(gle.is_opening) == "Yes"):
 			gle_map[gle.account].opening += amount
 			opening += amount
 		elif gle.posting_date <= filters.to_date:
diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py
index 5d9c09b..d9cb516 100644
--- a/erpnext/accounts/utils.py
+++ b/erpnext/accounts/utils.py
@@ -379,3 +379,12 @@
 		
 	return webnotes.conn.get_value("Account", {account_for_field: account_for_doctype, 
 		"master_name": account_for})
+		
+def get_currency_precision(currency=None):
+	if not currency:
+		currency = webnotes.conn.get_value("Company", 
+			webnotes.conn.get_default("company"), "default_currency")
+	currency_format = webnotes.conn.get_value("Currency", currency, "number_format")
+	
+	from webnotes.utils import get_number_format_info
+	return get_number_format_info(currency_format)[2]
diff --git a/erpnext/buying/doctype/supplier/supplier.js b/erpnext/buying/doctype/supplier/supplier.js
index b3dec80..4eb0479 100644
--- a/erpnext/buying/doctype/supplier/supplier.js
+++ b/erpnext/buying/doctype/supplier/supplier.js
@@ -3,7 +3,7 @@
 
 {% include 'setup/doctype/contact_control/contact_control.js' %};
 
-cur_frm.cscript.refresh = function(doc,dt,dn) {
+cur_frm.cscript.refresh = function(doc, dt, dn) {
 	cur_frm.cscript.make_dashboard(doc);
 	erpnext.hide_naming_series();
     
@@ -93,7 +93,7 @@
 	cur_frm.contact_list.run();
 }
 
-cur_frm.fields_dict['default_price_list'].get_query = function(doc,cdt,cdn) {
+cur_frm.fields_dict['default_price_list'].get_query = function(doc, cdt, cdn) {
 	return{
 		filters:{'buying': 1}
 	}
diff --git a/erpnext/buying/report/requested_items_to_be_ordered/requested_items_to_be_ordered.txt b/erpnext/buying/report/requested_items_to_be_ordered/requested_items_to_be_ordered.txt
index 49c7478..4d3558c 100644
--- a/erpnext/buying/report/requested_items_to_be_ordered/requested_items_to_be_ordered.txt
+++ b/erpnext/buying/report/requested_items_to_be_ordered/requested_items_to_be_ordered.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-05-13 16:10:02", 
   "docstatus": 0, 
-  "modified": "2013-05-13 16:21:07", 
+  "modified": "2014-01-24 18:19:11", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -11,7 +11,7 @@
   "doctype": "Report", 
   "is_standard": "Yes", 
   "name": "__common__", 
-  "query": "select \n    mr.name as \"Material Request:Link/Material Request:120\",\n\tmr.transaction_date as \"Date:Date:100\",\n\tmr_item.item_code as \"Item Code:Link/Item:120\",\n\tmr_item.qty as \"Qty:Float:100\",\n\tmr_item.ordered_qty as \"Ordered Qty:Float:100\", \n\t(mr_item.qty - ifnull(mr_item.ordered_qty, 0)) as \"Qty to Order:Float:100\",\n\tmr_item.item_name as \"Item Name::150\",\n\tmr_item.description as \"Description::200\"\nfrom\n\t`tabMaterial Request` mr, `tabMaterial Request Item` mr_item\nwhere\n\tmr_item.parent = mr.name\n\tand mr.material_request_type = \"Purchase\"\n\tand mr.docstatus = 1\n\tand mr.status != \"Stopped\"\n\tand ifnull(mr_item.ordered_qty, 0) < ifnull(mr_item.qty, 0)\norder by mr.transaction_date asc", 
+  "query": "select \n    mr.name as \"Material Request:Link/Material Request:120\",\n\tmr.transaction_date as \"Date:Date:100\",\n\tmr_item.item_code as \"Item Code:Link/Item:120\",\n\tsum(ifnull(mr_item.qty, 0)) as \"Qty:Float:100\",\n\tsum(ifnull(mr_item.ordered_qty, 0)) as \"Ordered Qty:Float:100\", \n\t(sum(mr_item.qty) - sum(ifnull(mr_item.ordered_qty, 0))) as \"Qty to Order:Float:100\",\n\tmr_item.item_name as \"Item Name::150\",\n\tmr_item.description as \"Description::200\"\nfrom\n\t`tabMaterial Request` mr, `tabMaterial Request Item` mr_item\nwhere\n\tmr_item.parent = mr.name\n\tand mr.material_request_type = \"Purchase\"\n\tand mr.docstatus = 1\n\tand mr.status != \"Stopped\"\ngroup by mr.name, mr_item.item_code\nhaving\n\tsum(ifnull(mr_item.ordered_qty, 0)) < sum(ifnull(mr_item.qty, 0))\norder by mr.transaction_date asc", 
   "ref_doctype": "Purchase Order", 
   "report_name": "Requested Items To Be Ordered", 
   "report_type": "Query Report"
diff --git a/erpnext/buying/utils.py b/erpnext/buying/utils.py
index d7e3d81..1bb3154 100644
--- a/erpnext/buying/utils.py
+++ b/erpnext/buying/utils.py
@@ -89,8 +89,10 @@
 	
 	# try fetching from price list
 	if args.buying_price_list and args.price_list_currency:
-		price_list_rate = webnotes.conn.sql("""select ref_rate from `tabItem Price` 
-			where price_list=%s and item_code=%s and buying=1""", 
+		price_list_rate = webnotes.conn.sql("""select ip.ref_rate from 
+			`tabItem Price` ip, `tabPrice List` pl 
+			where ip.price_list=pl.name and ip.price_list=%s and 
+			ip.item_code=%s and ip.buying=1 and pl.enabled=1""", 
 			(args.buying_price_list, args.item_code), as_dict=1)
 		
 		if price_list_rate:
diff --git a/erpnext/hr/doctype/appraisal/appraisal.txt b/erpnext/hr/doctype/appraisal/appraisal.txt
index c82f848..da57097 100644
--- a/erpnext/hr/doctype/appraisal/appraisal.txt
+++ b/erpnext/hr/doctype/appraisal/appraisal.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-01-10 16:34:12", 
   "docstatus": 0, 
-  "modified": "2014-01-20 17:48:22", 
+  "modified": "2014-01-22 16:05:34", 
   "modified_by": "Administrator", 
   "owner": "ashwini@webnotestech.com"
  }, 
@@ -233,7 +233,7 @@
   "cancel": 0, 
   "delete": 0, 
   "doctype": "DocPerm", 
-  "match": "owner", 
+  "restricted": 1, 
   "role": "Employee", 
   "submit": 0
  }, 
diff --git a/erpnext/hr/doctype/employee/employee.js b/erpnext/hr/doctype/employee/employee.js
index 23d5067..7ee88f7 100644
--- a/erpnext/hr/doctype/employee/employee.js
+++ b/erpnext/hr/doctype/employee/employee.js
@@ -4,10 +4,10 @@
 wn.provide("erpnext.hr");
 erpnext.hr.EmployeeController = wn.ui.form.Controller.extend({
 	setup: function() {
-		this.frm.fields_dict.user_id.get_query = function(doc,cdt,cdn) {
-				return { query:"webnotes.core.doctype.profile.profile.profile_query"} }
-		this.frm.fields_dict.reports_to.get_query = function(doc,cdt,cdn) {	
-			return{	query: "erpnext.controllers.queries.employee_query"}	}
+		this.frm.fields_dict.user_id.get_query = function(doc, cdt, cdn) {
+			return { query:"webnotes.core.doctype.profile.profile.profile_query"} }
+		this.frm.fields_dict.reports_to.get_query = function(doc, cdt, cdn) {
+			return { query: "erpnext.controllers.queries.employee_query"} }
 	},
 	
 	onload: function() {
@@ -93,4 +93,4 @@
 		});
 	},
 });
-cur_frm.cscript = new erpnext.hr.EmployeeController({frm: cur_frm});
\ No newline at end of file
+cur_frm.cscript = new erpnext.hr.EmployeeController({frm: cur_frm});
diff --git a/erpnext/hr/doctype/expense_claim/expense_claim.txt b/erpnext/hr/doctype/expense_claim/expense_claim.txt
index 98e1782..ac7f788 100644
--- a/erpnext/hr/doctype/expense_claim/expense_claim.txt
+++ b/erpnext/hr/doctype/expense_claim/expense_claim.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-01-10 16:34:14", 
   "docstatus": 0, 
-  "modified": "2014-01-20 17:48:44", 
+  "modified": "2014-01-22 16:05:34", 
   "modified_by": "Administrator", 
   "owner": "harshada@webnotestech.com"
  }, 
@@ -223,7 +223,7 @@
  {
   "delete": 0, 
   "doctype": "DocPerm", 
-  "match": "owner", 
+  "restricted": 1, 
   "role": "Employee"
  }, 
  {
diff --git a/erpnext/hr/doctype/holiday_list/holiday_list.py b/erpnext/hr/doctype/holiday_list/holiday_list.py
index 1045077..9f28e4c6 100644
--- a/erpnext/hr/doctype/holiday_list/holiday_list.py
+++ b/erpnext/hr/doctype/holiday_list/holiday_list.py
@@ -8,9 +8,7 @@
 from webnotes.model import db_exists
 from webnotes.model.doc import addchild, make_autoname
 from webnotes.model.bean import copy_doclist
-from webnotes import msgprint
-
-
+from webnotes import msgprint, throw, _
 import datetime
 
 class DocType:
@@ -19,7 +17,7 @@
 		self.doclist = doclist
 
 	def autoname(self):
-		self.doc.name = make_autoname(self.doc.fiscal_year +"/"+ self.doc.holiday_list_name+"/.###")
+		self.doc.name = make_autoname(self.doc.fiscal_year + "/" + self.doc.holiday_list_name + "/.###")
 		
 	def validate(self):
 		self.update_default_holiday_list()
@@ -38,11 +36,9 @@
 
 	def validate_values(self):
 		if not self.doc.fiscal_year:
-			msgprint("Please select Fiscal Year")
-			raise Exception
+			throw(_("Please select Fiscal Year"))
 		if not self.doc.weekly_off:
-			msgprint("Please select weekly off day")
-			raise Exception
+			throw(_("Please select weekly off day"))
 
 	def get_fy_start_end_dates(self):
 		return webnotes.conn.sql("""select year_start_date, year_end_date
diff --git a/erpnext/hr/doctype/leave_allocation/leave_allocation.txt b/erpnext/hr/doctype/leave_allocation/leave_allocation.txt
index 41584c9..60f2523 100644
--- a/erpnext/hr/doctype/leave_allocation/leave_allocation.txt
+++ b/erpnext/hr/doctype/leave_allocation/leave_allocation.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-02-20 19:10:38", 
   "docstatus": 0, 
-  "modified": "2014-01-20 17:48:54", 
+  "modified": "2014-01-22 16:05:35", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -171,7 +171,7 @@
  }, 
  {
   "doctype": "DocPerm", 
-  "match": "owner", 
+  "restricted": 1, 
   "role": "HR User"
  }, 
  {
diff --git a/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py b/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py
index 3b529cb..ac4b0fa 100644
--- a/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py
+++ b/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py
@@ -243,10 +243,10 @@
 				"item_code": [qty_required, description, stock_uom, min_order_qty]
 			}
 		"""
-		bom_wise_item_details = {}
 		item_list = []
-
+		
 		for bom, so_wise_qty in bom_dict.items():
+			bom_wise_item_details = {}
 			if self.doc.use_multi_level_bom:
 				# get all raw materials with sub assembly childs					
 				for d in webnotes.conn.sql("""select fb.item_code, 
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index f39e214..79644a8 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -1,7 +1,8 @@
+erpnext.patches.1401.enable_all_price_list
 erpnext.patches.4_0.update_user_properties
 erpnext.patches.4_0.move_warehouse_user_to_restrictions
 erpnext.patches.4_0.new_permissions
-
+erpnext.patches.4_0.update_incharge_name_to_sales_person_in_maintenance_schedule
 execute:webnotes.reload_doc('accounts', 'doctype', 'sales_invoice') # 2014-01-03
 execute:webnotes.reload_doc('selling', 'doctype', 'sales_order') # 2014-01-03
 execute:webnotes.reload_doc('selling', 'doctype', 'quotation') # 2014-01-03
diff --git a/erpnext/patches/1401/enable_all_price_list.py b/erpnext/patches/1401/enable_all_price_list.py
new file mode 100644
index 0000000..9cf141f
--- /dev/null
+++ b/erpnext/patches/1401/enable_all_price_list.py
@@ -0,0 +1,9 @@
+# Copyright (c) 2014, Web Notes Technologies Pvt. Ltd. and Contributors
+# License: GNU General Public License v3. See license.txt
+
+from __future__ import unicode_literals
+import webnotes
+
+def execute():
+	webnotes.reload_doc("stock", "doctype", "price_list")
+	webnotes.conn.sql("""update `tabPrice List` set enabled=1""")
\ No newline at end of file
diff --git a/erpnext/patches/4_0/update_incharge_name_to_sales_person_in_maintenance_schedule.py b/erpnext/patches/4_0/update_incharge_name_to_sales_person_in_maintenance_schedule.py
new file mode 100644
index 0000000..2a488f4
--- /dev/null
+++ b/erpnext/patches/4_0/update_incharge_name_to_sales_person_in_maintenance_schedule.py
@@ -0,0 +1,12 @@
+# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
+# License: GNU General Public License v3. See license.txt
+
+from __future__ import unicode_literals
+import webnotes
+
+def execute():
+	webnotes.reload_doc("support", "doctype", "maintenance_schedule_detail")
+	webnotes.reload_doc("support", "doctype", "maintenance_schedule_item")
+	
+	webnotes.conn.sql("""update `tabMaintenance Schedule Detail` set sales_person=incharge_name""")
+	webnotes.conn.sql("""update `tabMaintenance Schedule Item` set sales_person=incharge_name""")
\ No newline at end of file
diff --git a/erpnext/patches/4_0/update_user_properties.py b/erpnext/patches/4_0/update_user_properties.py
index 085f2c1..54aed64 100644
--- a/erpnext/patches/4_0/update_user_properties.py
+++ b/erpnext/patches/4_0/update_user_properties.py
@@ -45,7 +45,11 @@
 		for profile in webnotes.conn.sql_list("""select name from `tabProfile`
 			where enabled=1 and user_type='System User'"""):
 			
-			perms = webnotes.permissions.get_user_perms(meta, "read", profile)
+			user_roles = webnotes.get_roles(profile)
+			
+			perms = meta.get({"doctype": "DocPerm", "permlevel": 0, 
+				"role": ["in", [["All"] + user_roles]], "read": 1})
+
 			# user does not have required roles
 			if not perms:
 				continue
diff --git a/erpnext/patches/patch_list.py b/erpnext/patches/patch_list.py
index 789954b..6e27628 100644
--- a/erpnext/patches/patch_list.py
+++ b/erpnext/patches/patch_list.py
@@ -270,4 +270,5 @@
 	"execute:webnotes.reload_doc('selling', 'doctype', 'sales_order') # 2013-12-26",
 	"execute:webnotes.reload_doc('selling', 'doctype', 'quotation') # 2013-12-26",
 	"execute:webnotes.reload_doc('stock', 'doctype', 'delivery_note') # 2013-12-26",
+	"patches.1401.enable_all_price_list",
 ]
\ No newline at end of file
diff --git a/erpnext/projects/doctype/task/task.txt b/erpnext/projects/doctype/task/task.txt
index 670eaa1..2dce94f 100644
--- a/erpnext/projects/doctype/task/task.txt
+++ b/erpnext/projects/doctype/task/task.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-01-29 19:25:50", 
   "docstatus": 0, 
-  "modified": "2014-01-20 17:49:32", 
+  "modified": "2014-01-24 13:01:46", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -15,7 +15,9 @@
   "icon": "icon-check", 
   "max_attachments": 5, 
   "module": "Projects", 
-  "name": "__common__"
+  "name": "__common__", 
+  "search_fields": "subject", 
+  "title_field": "subject"
  }, 
  {
   "doctype": "DocField", 
diff --git a/erpnext/projects/doctype/time_log/time_log.txt b/erpnext/projects/doctype/time_log/time_log.txt
index 556597a..11fa7d6 100644
--- a/erpnext/projects/doctype/time_log/time_log.txt
+++ b/erpnext/projects/doctype/time_log/time_log.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-04-03 16:38:41", 
   "docstatus": 0, 
-  "modified": "2014-01-20 17:49:34", 
+  "modified": "2014-01-22 16:05:35", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -205,7 +205,7 @@
  {
   "create": 1, 
   "doctype": "DocPerm", 
-  "match": "owner", 
+  "restricted": 1, 
   "role": "Projects User"
  }, 
  {
diff --git a/erpnext/selling/doctype/customer/customer.js b/erpnext/selling/doctype/customer/customer.js
index 9578558..f2568d6 100644
--- a/erpnext/selling/doctype/customer/customer.js
+++ b/erpnext/selling/doctype/customer/customer.js
@@ -18,7 +18,7 @@
 cur_frm.add_fetch('lead_name', 'company_name', 'customer_name');
 cur_frm.add_fetch('default_sales_partner','commission_rate','default_commission_rate');
 
-cur_frm.cscript.refresh = function(doc,dt,dn) {
+cur_frm.cscript.refresh = function(doc, dt, dn) {
 	cur_frm.cscript.setup_dashboard(doc);
 	erpnext.hide_naming_series();
 
@@ -107,20 +107,20 @@
 
 }
 
-cur_frm.fields_dict['customer_group'].get_query = function(doc,dt,dn) {
+cur_frm.fields_dict['customer_group'].get_query = function(doc, dt, dn) {
 	return{
 		filters:{'is_group': 'No'}
 	}
 }
 
 
-cur_frm.fields_dict.lead_name.get_query = function(doc,cdt,cdn) {
+cur_frm.fields_dict.lead_name.get_query = function(doc, cdt, cdn) {
 	return{
 		query: "erpnext.controllers.queries.lead_query"
 	}
 }
 
-cur_frm.fields_dict['default_price_list'].get_query = function(doc,cdt,cdn) {
+cur_frm.fields_dict['default_price_list'].get_query = function(doc, cdt, cdn) {
 	return{
 		filters:{'selling': 1}
 	}
diff --git a/erpnext/selling/doctype/lead/lead.js b/erpnext/selling/doctype/lead/lead.js
index 41f679e..228d790 100644
--- a/erpnext/selling/doctype/lead/lead.js
+++ b/erpnext/selling/doctype/lead/lead.js
@@ -7,18 +7,18 @@
 wn.provide("erpnext");
 erpnext.LeadController = wn.ui.form.Controller.extend({
 	setup: function() {
-		this.frm.fields_dict.customer.get_query = function(doc,cdt,cdn) {
+		this.frm.fields_dict.customer.get_query = function(doc, cdt, cdn) {
 				return { query: "erpnext.controllers.queries.customer_query" } }
 	},
 	
 	onload: function() {
 		if(cur_frm.fields_dict.lead_owner.df.options.match(/^Profile/)) {
-			cur_frm.fields_dict.lead_owner.get_query = function(doc,cdt,cdn) {
+			cur_frm.fields_dict.lead_owner.get_query = function(doc, cdt, cdn) {
 				return { query:"webnotes.core.doctype.profile.profile.profile_query" } }
 		}
 
 		if(cur_frm.fields_dict.contact_by.df.options.match(/^Profile/)) {
-			cur_frm.fields_dict.contact_by.get_query = function(doc,cdt,cdn) {
+			cur_frm.fields_dict.contact_by.get_query = function(doc, cdt, cdn) {
 				return { query:"webnotes.core.doctype.profile.profile.profile_query" } }
 		}
 
@@ -90,4 +90,4 @@
 	}
 });
 
-$.extend(cur_frm.cscript, new erpnext.LeadController({frm: cur_frm}));
\ No newline at end of file
+$.extend(cur_frm.cscript, new erpnext.LeadController({frm: cur_frm}));
diff --git a/erpnext/selling/page/sales_browser/sales_browser.py b/erpnext/selling/page/sales_browser/sales_browser.py
index 6791ecf..bb1a094 100644
--- a/erpnext/selling/page/sales_browser/sales_browser.py
+++ b/erpnext/selling/page/sales_browser/sales_browser.py
@@ -7,17 +7,17 @@
 
 @webnotes.whitelist()
 def get_children():
-	ctype = webnotes.form_dict.get('ctype')
-	webnotes.form_dict['parent_field'] = 'parent_' + ctype.lower().replace(' ', '_')
+	ctype = webnotes.local.form_dict.get('ctype')
+	webnotes.local.form_dict['parent_field'] = 'parent_' + ctype.lower().replace(' ', '_')
 	if not webnotes.form_dict.get('parent'):
-		webnotes.form_dict['parent'] = ''
+		webnotes.local.form_dict['parent'] = ''
 		
 	return webnotes.conn.sql("""select name as value, 
 		if(is_group='Yes', 1, 0) as expandable
 		from `tab%(ctype)s`
 		where docstatus < 2
 		and ifnull(%(parent_field)s,'') = "%(parent)s"
-		order by name""" % webnotes.form_dict, as_dict=1)
+		order by name""" % webnotes.local.form_dict, as_dict=1)
 		
 @webnotes.whitelist()
 def add_node():
diff --git a/erpnext/selling/utils.py b/erpnext/selling/utils.py
index 118318f..ed3711d 100644
--- a/erpnext/selling/utils.py
+++ b/erpnext/selling/utils.py
@@ -150,8 +150,10 @@
 	return out
 	
 def _get_price_list_rate(args, item_bean, meta):
-	ref_rate = webnotes.conn.sql("""select ref_rate from `tabItem Price` 
-		where price_list=%s and item_code=%s and selling=1""", 
+	ref_rate = webnotes.conn.sql("""select ip.ref_rate from 
+		`tabItem Price` ip, `tabPrice List` pl 
+		where ip.price_list=pl.name and ip.price_list=%s and 
+		ip.item_code=%s and ip.selling=1 and pl.enabled=1""", 
 		(args.selling_price_list, args.item_code), as_dict=1)
 
 	if not ref_rate:
diff --git a/erpnext/setup/doctype/authorization_rule/authorization_rule.js b/erpnext/setup/doctype/authorization_rule/authorization_rule.js
index 66b14a8..b814965 100644
--- a/erpnext/setup/doctype/authorization_rule/authorization_rule.js
+++ b/erpnext/setup/doctype/authorization_rule/authorization_rule.js
@@ -1,114 +1,113 @@
 // Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
 // License: GNU General Public License v3. See license.txt
 
- 
-
-//--------- ONLOAD -------------
-cur_frm.cscript.onload = function(doc, cdt, cdn) {
-   
-}
-
 // Settings Module
+cur_frm.cscript.refresh = function(doc, cdt, cdn) {
+	if (doc.based_on == 'Grand Total' || doc.based_on == 'Average Discount' || doc.based_on == 'Not Applicable')
+		hide_field('master_name');
+	else
+		unhide_field('master_name');
 
-cur_frm.cscript.refresh = function(doc,cdt,cdn){
-   
+	if (doc.based_on == 'Not Applicable')
+		hide_field('value');
+	else
+		unhide_field('value');
 
-  if(doc.based_on == 'Grand Total' || doc.based_on == 'Average Discount' || doc.based_on == 'Not Applicable') hide_field('master_name');
-  else  unhide_field('master_name');
-  
-  if(doc.based_on == 'Not Applicable') hide_field('value');
-  else unhide_field('value');
-  
-  if(doc.transaction == 'Appraisal'){
-    hide_field(['master_name','system_role', 'system_user']);
-    unhide_field(['to_emp','to_designation']);
-    if(doc.transaction == 'Appraisal') hide_field('value');
-    else unhide_field('value');
-  }
-  else {
-    unhide_field(['master_name','system_role', 'system_user','value']);
-    hide_field(['to_emp','to_designation']);
-  }
+	if (doc.transaction == 'Appraisal') {
+		hide_field(['master_name','system_role', 'system_user']);
+		unhide_field(['to_emp','to_designation']);
+
+		if (doc.transaction == 'Appraisal')
+			hide_field('value');
+		else
+			unhide_field('value');
+	}
+	else {
+		unhide_field(['master_name','system_role', 'system_user','value']);
+		hide_field(['to_emp','to_designation']);
+	}
 }
 
-cur_frm.cscript.based_on = function(doc){
-  if(doc.based_on == 'Grand Total' || doc.based_on == 'Average Discount' || doc.based_on == 'Not Applicable'){
-    doc.master_name = '';
-    refresh_field('master_name');
-    hide_field('master_name');
-  }
-  else{
-    unhide_field('master_name');
-  }
-  
-  if(doc.based_on == 'Not Applicable') {
-      doc.value =0;
-      refresh_field('value');
-      hide_field('value');
-    }
-    else unhide_field('value');
+cur_frm.cscript.based_on = function(doc) {
+	if (doc.based_on == 'Grand Total' || doc.based_on == 'Average Discount' || doc.based_on == 'Not Applicable') {
+		doc.master_name = '';
+		refresh_field('master_name');
+		hide_field('master_name');
+	}
+	else
+		unhide_field('master_name');
+
+	if (doc.based_on == 'Not Applicable') {
+		doc.value =0;
+		refresh_field('value');
+		hide_field('value');
+	}
+	else
+		unhide_field('value');
 }
 
-cur_frm.cscript.transaction = function(doc,cdt,cdn){
-  if (doc.transaction == 'Appraisal'){
-    doc.master_name = doc.system_role = doc.system_user = '';
-    refresh_many(['master_name','system_role', 'system_user']);
-    hide_field(['master_name','system_role', 'system_user']);
-    unhide_field(['to_emp','to_designation']);
-	doc.value =0;
-    refresh_many('value');
-    hide_field('value');
-  }
-  else {
-    unhide_field(['master_name','system_role', 'system_user','value']);
-    hide_field(['to_emp','to_designation']);
-  }
-  
-  if(doc.transaction == 'Appraisal') doc.based_on == 'Not Applicable';
+cur_frm.cscript.transaction = function(doc, cdt, cdn){
+	if (doc.transaction == 'Appraisal') {
+		doc.based_on == 'Not Applicable';
+		doc.master_name = doc.system_role = doc.system_user = '';
+		refresh_many(['master_name','system_role', 'system_user', 'based_on']);
+		hide_field(['master_name','system_role', 'system_user']);
+		unhide_field(['to_emp','to_designation']);
+		doc.value = 0;
+		refresh_many('value');
+		hide_field('value');
+	}
+	else {
+		unhide_field(['master_name','system_role', 'system_user','value']);
+		hide_field(['to_emp','to_designation']);
+	}
+
 }
 
+cur_frm.fields_dict.system_user.get_query = function(doc, cdt, cdn) {
+	return { query:"webnotes.core.doctype.profile.profile.profile_query" }
+}
 
-cur_frm.fields_dict.system_user.get_query = function(doc,cdt,cdn) {
-  return{ query:"webnotes.core.doctype.profile.profile.profile_query" } }
-
-cur_frm.fields_dict.approving_user.get_query = function(doc,cdt,cdn) {
-  return{ query:"webnotes.core.doctype.profile.profile.profile_query" } }
+cur_frm.fields_dict.approving_user.get_query = function(doc, cdt, cdn) {
+	return { query:"webnotes.core.doctype.profile.profile.profile_query" }
+}
 
 cur_frm.fields_dict['approving_role'].get_query = cur_frm.fields_dict['system_role'].get_query;
 
 // System Role Trigger
 // -----------------------
 cur_frm.fields_dict['system_role'].get_query = function(doc) {
-  return{
-    filters:[
-      ['Role', 'name', 'not in', 'Administrator, Guest, All']
-    ]
-  }
+	return {
+		filters:[
+			['Role', 'name', 'not in', 'Administrator, Guest, All']
+		]
+	}
 }
 
 
 // Master Name Trigger
 // --------------------
-cur_frm.fields_dict['master_name'].get_query = function(doc){
-  if(doc.based_on == 'Customerwise Discount')
-    return {
-	  doctype: "Customer",
-      filters:[
-        ['Customer', 'docstatus', '!=', 2]
-      ]
-    }
-  else if(doc.based_on == 'Itemwise Discount')
-    return {
-	  doctype: "Item",
-      query: "erpnext.controllers.queries.item_query"
-    }
-  else
-    return {
-      filters: [
-        ['Item', 'name', '=', 'cheating done to avoid null']
-      ]
-    }
+cur_frm.fields_dict['master_name'].get_query = function(doc) {
+	if (doc.based_on == 'Customerwise Discount')
+		return {
+			doctype: "Customer",
+			filters:[
+				['Customer', 'docstatus', '!=', 2]
+			]
+		}
+	else if (doc.based_on == 'Itemwise Discount')
+		return {
+			doctype: "Item",
+			query: "erpnext.controllers.queries.item_query"
+		}
+	else
+		return {
+			filters: [
+				['Item', 'name', '=', 'cheating done to avoid null']
+			]
+		}
 }
 
-cur_frm.fields_dict.to_emp.get_query = function(doc,cdt,cdn) {
-  return{ query: "erpnext.controllers.queries.employee_query" } }
\ No newline at end of file
+cur_frm.fields_dict.to_emp.get_query = function(doc, cdt, cdn) {
+	return { query: "erpnext.controllers.queries.employee_query" }
+}
diff --git a/erpnext/setup/doctype/sales_person/sales_person.js b/erpnext/setup/doctype/sales_person/sales_person.js
index 19c13b1..22f3f98 100644
--- a/erpnext/setup/doctype/sales_person/sales_person.js
+++ b/erpnext/setup/doctype/sales_person/sales_person.js
@@ -15,15 +15,10 @@
 	}
 }
 
-
-cur_frm.cscript.onload = function(){
-
-}
-
 //get query select sales person
-cur_frm.fields_dict['parent_sales_person'].get_query = function(doc,cdt,cdn) {
+cur_frm.fields_dict['parent_sales_person'].get_query = function(doc, cdt, cdn) {
 	return{
-		filters:[
+		filters: [
 			['Sales Person', 'is_group', '=', 'Yes'],
 			['Sales Person', 'name', '!=', doc.sales_person_name]
 		]
@@ -31,10 +26,11 @@
 }
 
 cur_frm.fields_dict['target_details'].grid.get_field("item_group").get_query = function(doc, cdt, cdn) {
-	return{
-		filters:{ 'is_group': "No" }
+	return {
+		filters: { 'is_group': "No" }
 	}
 }
 
-cur_frm.fields_dict.employee.get_query = function(doc,cdt,cdn) {
-	return{	query: "erpnext.controllers.queries.employee_query" } }
+cur_frm.fields_dict.employee.get_query = function(doc, cdt, cdn) {
+	return { query: "erpnext.controllers.queries.employee_query" }
+}
\ No newline at end of file
diff --git a/erpnext/setup/doctype/sales_person/sales_person.py b/erpnext/setup/doctype/sales_person/sales_person.py
index cf20087..41f461b 100644
--- a/erpnext/setup/doctype/sales_person/sales_person.py
+++ b/erpnext/setup/doctype/sales_person/sales_person.py
@@ -3,10 +3,8 @@
 
 from __future__ import unicode_literals
 import webnotes
-
 from webnotes.model.bean import getlist
 from webnotes.utils import flt
-
 from webnotes.utils.nestedset import DocTypeNestedSet
 
 class DocType(DocTypeNestedSet):
@@ -18,8 +16,7 @@
 	def validate(self): 
 		for d in getlist(self.doclist, 'target_details'):
 			if not flt(d.target_qty) and not flt(d.target_amount):
-				webnotes.msgprint("Either target qty or target amount is mandatory.")
-				raise Exception
+				webnotes.throw(_("Either target qty or target amount is mandatory."))
 	
 	def on_update(self):
 		super(DocType, self).on_update()
@@ -28,8 +25,7 @@
 	def get_email_id(self):
 		profile = webnotes.conn.get_value("Employee", self.doc.employee, "user_id")
 		if not profile:
-			webnotes.msgprint("User ID (Profile) no set for Employee %s" % self.doc.employee, 
-				raise_exception=True)
+			webnotes.throw("User ID (Profile) not set for Employee %s" % self.doc.employee)
 		else:
 			return webnotes.conn.get_value("Profile", profile, "email") or profile
 		
\ No newline at end of file
diff --git a/erpnext/setup/page/setup_wizard/setup_wizard.py b/erpnext/setup/page/setup_wizard/setup_wizard.py
index eec92aa..47e22df 100644
--- a/erpnext/setup/page/setup_wizard/setup_wizard.py
+++ b/erpnext/setup/page/setup_wizard/setup_wizard.py
@@ -98,6 +98,7 @@
 			{
 				"doctype": "Price List",
 				"price_list_name": "Standard " + pl_type,
+				"enabled": 1,
 				"buying": 1 if pl_type == "Buying" else 0,
 				"selling": 1 if pl_type == "Selling" else 0,
 				"currency": args["currency"]
diff --git a/erpnext/setup/utils.py b/erpnext/setup/utils.py
index 0571c15..68a5a5a 100644
--- a/erpnext/setup/utils.py
+++ b/erpnext/setup/utils.py
@@ -3,7 +3,7 @@
 
 from __future__ import unicode_literals
 import webnotes
-from webnotes import _, msgprint
+from webnotes import _, msgprint, throw
 import json
 
 def get_company_currency(company):
@@ -11,8 +11,8 @@
 	if not currency:
 		currency = webnotes.conn.get_default("currency")
 	if not currency:
-		msgprint(_('Please specify Default Currency in Company Master \
-			and Global Defaults'), raise_exception=True)
+		throw(_('Please specify Default Currency in Company Master \
+			and Global Defaults'))
 		
 	return currency
 
@@ -32,5 +32,14 @@
 
 @webnotes.whitelist()
 def get_price_list_currency(price_list):
-	return {"price_list_currency": webnotes.conn.get_value("Price List", price_list, 
-		"currency")}
\ No newline at end of file
+	price_list_currency = webnotes.conn.get_value("Price List", {"name": price_list, 
+		"enabled": 1}, "currency")
+
+	if not price_list_currency:
+		throw("{message}: {price_list} {disabled}".format(**{
+			"message": _("Price List"),
+			"price_list": price_list,
+			"disabled": _("is disabled.")
+		}))
+	else:
+		return {"price_list_currency": price_list_currency}
\ No newline at end of file
diff --git a/erpnext/stock/doctype/item_price/item_price.py b/erpnext/stock/doctype/item_price/item_price.py
index 0886411..cb07e70 100644
--- a/erpnext/stock/doctype/item_price/item_price.py
+++ b/erpnext/stock/doctype/item_price/item_price.py
@@ -12,17 +12,19 @@
 		self.doc, self.doclist = d, dl
 
 	def validate(self):
+		self.validate_price_list()
 		self.check_duplicate_item()
 		self.update_price_list_details()
 		self.update_item_details()
 
-	def update_price_list_details(self):
-		self.doc.buying, self.doc.selling, self.doc.currency = webnotes.conn.get_value("Price List", 
-			self.doc.price_list, ["buying", "selling", "currency"])
-
-	def update_item_details(self):
-		self.doc.item_name, self.doc.item_description = webnotes.conn.get_value("Item", 
-			self.doc.item_code, ["item_name", "description"])
+	def validate_price_list(self):
+		enabled = webnotes.conn.get_value("Price List", self.doc.price_list, "enabled")
+		if not enabled:
+			throw("{message}: {price_list} {disabled}".format(**{
+				"message": _("Price List"),
+				"price_list": self.doc.price_list,
+				"disabled": _("is disabled.")
+			}))
 
 	def check_duplicate_item(self):
 		if webnotes.conn.sql("""select name from `tabItem Price` 
@@ -34,4 +36,12 @@
 					"already": _("already available in Price List"),
 					"price_list": self.doc.price_list
 				}), ItemPriceDuplicateItem)
+
+	def update_price_list_details(self):
+		self.doc.buying, self.doc.selling, self.doc.currency = webnotes.conn.get_value("Price List", 
+			{"name": self.doc.price_list, "enabled": 1}, ["buying", "selling", "currency"])
+
+	def update_item_details(self):
+		self.doc.item_name, self.doc.item_description = webnotes.conn.get_value("Item", 
+			self.doc.item_code, ["item_name", "description"])
 				
\ No newline at end of file
diff --git a/erpnext/stock/doctype/material_request/material_request.py b/erpnext/stock/doctype/material_request/material_request.py
index 28ec508..d3262c5 100644
--- a/erpnext/stock/doctype/material_request/material_request.py
+++ b/erpnext/stock/doctype/material_request/material_request.py
@@ -37,16 +37,16 @@
 		
 		for so_no in so_items.keys():
 			for item in so_items[so_no].keys():
-				already_indented = webnotes.conn.sql("""select sum(qty) from `tabMaterial Request Item` 
+				already_indented = webnotes.conn.sql("""select sum(ifnull(qty, 0)) 
+					from `tabMaterial Request Item` 
 					where item_code = %s and sales_order_no = %s and 
 					docstatus = 1 and parent != %s""", (item, so_no, self.doc.name))
 				already_indented = already_indented and flt(already_indented[0][0]) or 0
 				
-				actual_so_qty = webnotes.conn.sql("""select sum(qty) from `tabSales Order Item` 
-					where parent = %s and item_code = %s and docstatus = 1 
-					group by parent""", (so_no, item))
+				actual_so_qty = webnotes.conn.sql("""select sum(ifnull(qty, 0)) from `tabSales Order Item` 
+					where parent = %s and item_code = %s and docstatus = 1""", (so_no, item))
 				actual_so_qty = actual_so_qty and flt(actual_so_qty[0][0]) or 0
-
+				
 				if actual_so_qty and (flt(so_items[so_no][item]) + already_indented > actual_so_qty):
 					webnotes.throw("You can raise indent of maximum qty: %s for item: %s against sales order: %s\
 						\n Anyway, you can add more qty in new row for the same item."
diff --git a/erpnext/stock/doctype/price_list/price_list.txt b/erpnext/stock/doctype/price_list/price_list.txt
index 41d9c47..7f8b3a1 100644
--- a/erpnext/stock/doctype/price_list/price_list.txt
+++ b/erpnext/stock/doctype/price_list/price_list.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-01-25 11:35:09", 
   "docstatus": 0, 
-  "modified": "2014-01-20 17:48:59", 
+  "modified": "2014-01-20 17:50:00", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -42,6 +42,18 @@
   "name": "Price List"
  }, 
  {
+  "default": "1", 
+  "doctype": "DocField", 
+  "fieldname": "enabled", 
+  "fieldtype": "Check", 
+  "label": "Enabled"
+ }, 
+ {
+  "doctype": "DocField", 
+  "fieldname": "sb_1", 
+  "fieldtype": "Section Break"
+ }, 
+ {
   "doctype": "DocField", 
   "fieldname": "price_list_name", 
   "fieldtype": "Data", 
diff --git a/erpnext/stock/doctype/price_list/test_price_list.py b/erpnext/stock/doctype/price_list/test_price_list.py
index bdcacc3..803be27 100644
--- a/erpnext/stock/doctype/price_list/test_price_list.py
+++ b/erpnext/stock/doctype/price_list/test_price_list.py
@@ -11,6 +11,7 @@
 		{
 			"doctype": "Price List",
 			"price_list_name": "_Test Price List",
+			"enabled": 1,
 			"currency": "INR",
 			"selling": 1
 		},
@@ -24,6 +25,7 @@
 		{
 			"doctype": "Price List",
 			"price_list_name": "_Test Price List 2",
+			"enabled": 1,
 			"currency": "INR",
 			"selling": 1
 		},
@@ -37,6 +39,7 @@
 		{
 			"doctype": "Price List",
 			"price_list_name": "_Test Price List India",
+			"enabled": 1,
 			"currency": "INR",
 			"selling": 1
 		},
@@ -50,6 +53,7 @@
 		{
 			"doctype": "Price List",
 			"price_list_name": "_Test Price List Rest of the World",
+			"enabled": 1,
 			"currency": "USD",
 			"selling": 1
 		},
diff --git a/erpnext/stock/doctype/warehouse/warehouse.py b/erpnext/stock/doctype/warehouse/warehouse.py
index 7729b2e..0f2d138 100644
--- a/erpnext/stock/doctype/warehouse/warehouse.py
+++ b/erpnext/stock/doctype/warehouse/warehouse.py
@@ -4,7 +4,7 @@
 from __future__ import unicode_literals
 import webnotes
 from webnotes.utils import cint, validate_email_add
-from webnotes import msgprint, _
+from webnotes import throw, msgprint, _
 
 class DocType:
 	def __init__(self, doc, doclist=[]):
@@ -18,7 +18,7 @@
 
 	def validate(self):
 		if self.doc.email_id and not validate_email_add(self.doc.email_id):
-				msgprint("Please enter valid Email Id", raise_exception=1)
+				throw(_("Please enter valid Email Id"))
 				
 		self.update_parent_account()
 				
@@ -76,8 +76,8 @@
 		for d in bins:
 			if d['actual_qty'] or d['reserved_qty'] or d['ordered_qty'] or \
 					d['indented_qty'] or d['projected_qty'] or d['planned_qty']:
-				msgprint("""Warehouse: %s can not be deleted as qty exists for item: %s""" 
-					% (self.doc.name, d['item_code']), raise_exception=1)
+				throw("""Warehouse: %s can not be deleted as qty exists for item: %s""" 
+					% (self.doc.name, d['item_code']))
 			else:
 				webnotes.conn.sql("delete from `tabBin` where name = %s", d['name'])
 				
@@ -88,8 +88,8 @@
 				
 		if webnotes.conn.sql("""select name from `tabStock Ledger Entry` 
 				where warehouse = %s""", self.doc.name):
-			msgprint("""Warehouse can not be deleted as stock ledger entry 
-				exists for this warehouse.""", raise_exception=1)
+			throw(_("""Warehouse can not be deleted as stock ledger entry 
+				exists for this warehouse."""))
 			
 	def before_rename(self, olddn, newdn, merge=False):
 		# Add company abbr if not provided
@@ -97,8 +97,8 @@
 		new_warehouse = get_name_with_abbr(newdn, self.doc.company)
 
 		if merge:
-			if not webnotes.conn.exists("Warehouse", newdn):
-				webnotes.throw(_("Warehouse ") + newdn +_(" does not exists"))
+			if not webnotes.conn.exists("Warehouse", new_warehouse):
+				webnotes.throw(_("Warehouse ") + new_warehouse +_(" does not exists"))
 				
 			if self.doc.company != webnotes.conn.get_value("Warehouse", new_warehouse, "company"):
 				webnotes.throw(_("Both Warehouse must belong to same Company"))
diff --git a/erpnext/stock/report/item_prices/item_prices.py b/erpnext/stock/report/item_prices/item_prices.py
index 5eee7df..323277d 100644
--- a/erpnext/stock/report/item_prices/item_prices.py
+++ b/erpnext/stock/report/item_prices/item_prices.py
@@ -15,8 +15,8 @@
 	bom_rate = get_item_bom_rate()
 	val_rate_map = get_valuation_rate()
 
+	from erpnext.accounts.utils import get_currency_precision
 	precision = get_currency_precision() or 2
-		
 	data = []
 	for item in sorted(item_map):
 		data.append([item, item_map[item]["item_name"], 
@@ -30,14 +30,6 @@
 		])
 	
 	return columns, data
-	
-def get_currency_precision():
-	company_currency = webnotes.conn.get_value("Company", 
-		webnotes.conn.get_default("company"), "default_currency")
-	currency_format = webnotes.conn.get_value("Currency", company_currency, "number_format")
-	
-	from webnotes.utils import get_number_format_info
-	return get_number_format_info(currency_format)[2]
 
 def get_columns(filters):
 	"""return columns based on filters"""
@@ -65,9 +57,10 @@
 
 	rate = {}
 
-	price_list = webnotes.conn.sql("""select item_code, buying, selling, 
-		concat(price_list, " - ", currency, " ", ref_rate) as price 
-		from `tabItem Price`""", as_dict=1)
+	price_list = webnotes.conn.sql("""select ip.item_code, ip.buying, ip.selling, 
+		concat(ip.price_list, " - ", ip.currency, " ", ip.ref_rate) as price 
+		from `tabItem Price` ip, `tabPrice List` pl 
+		where ip.price_list=pl.name and pl.enabled=1""", as_dict=1)
 
 	for j in price_list:
 		if j.price:
diff --git a/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.js b/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.js
index 75773e0..2ee8b80 100644
--- a/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.js
+++ b/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.js
@@ -5,107 +5,117 @@
 // TODO commonify this code
 erpnext.support.MaintenanceSchedule = wn.ui.form.Controller.extend({
 	refresh: function() {
-		if (this.frm.doc.docstatus===0) {
-			cur_frm.add_custom_button(wn._('From Sales Order'), 
+		var me = this;
+
+		if (this.frm.doc.docstatus === 0) {
+			this.frm.add_custom_button(wn._('From Sales Order'), 
 				function() {
 					wn.model.map_current_doc({
 						method: "erpnext.selling.doctype.sales_order.sales_order.make_maintenance_schedule",
 						source_doctype: "Sales Order",
 						get_query_filters: {
 							docstatus: 1,
-							order_type: cur_frm.doc.order_type,
-							customer: cur_frm.doc.customer || undefined,
-							company: cur_frm.doc.company
+							order_type: me.frm.doc.order_type,
+							customer: me.frm.doc.customer || undefined,
+							company: me.frm.doc.company
 						}
-					})
+					});
 				});
-		} else if (this.frm.doc.docstatus===1) {
-			cur_frm.add_custom_button(wn._("Make Maintenance Visit"), function() {
+		} else if (this.frm.doc.docstatus === 1) {
+			this.frm.add_custom_button(wn._("Make Maintenance Visit"), function() {
 				wn.model.open_mapped_doc({
 					method: "erpnext.support.doctype.maintenance_schedule.maintenance_schedule.make_maintenance_visit",
-					source_name: cur_frm.doc.name
+					source_name: me.frm.doc.name
 				})
-			})
+			});
 		}
 	},
 	customer: function() {
 		var me = this;
 		if(this.frm.doc.customer) {
 			return this.frm.call({
-				doc: this.frm.doc,
+				doc: me.frm.doc,
 				method: "set_customer_defaults",
 			});
-		}		
-	}, 
+		}
+	},
 });
 
 $.extend(cur_frm.cscript, new erpnext.support.MaintenanceSchedule({frm: cur_frm}));
 
 cur_frm.cscript.onload = function(doc, dt, dn) {
-  if(!doc.status) set_multiple(dt,dn,{status:'Draft'});
-  
-  if(doc.__islocal){
-    set_multiple(dt,dn,{transaction_date:get_today()});
-    hide_field(['customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']);
-  }   
+	if (!doc.status)
+		set_multiple(dt, dn, { status:'Draft' });
+
+	if (doc.__islocal) {
+		set_multiple(dt, dn, { transaction_date:get_today() });
+		hide_field(['customer_address', 'contact_person', 'customer_name', 'address_display', 
+			'contact_display', 'contact_mobile', 'contact_email', 'territory', 'customer_group']);
+	}
 }
 
-cur_frm.cscript.customer_address = cur_frm.cscript.contact_person = function(doc,dt,dn) {    
-  if(doc.customer) return get_server_fields('get_customer_address', JSON.stringify({customer: doc.customer, address: doc.customer_address, contact: doc.contact_person}),'', doc, dt, dn, 1);
+cur_frm.cscript.customer_address = cur_frm.cscript.contact_person = function(doc, dt, dn) {    
+	if (doc.customer) {
+		return get_server_fields('get_customer_address', 
+			JSON.stringify({customer: doc.customer, address: doc.customer_address, 
+			contact: doc.contact_person}), '', doc, dt, dn, 1);
+	}
 }
 
 cur_frm.fields_dict['customer_address'].get_query = function(doc, cdt, cdn) {
-  return{
-    filters:{ 'customer': doc.customer}
-  }
+	return {
+		filters:{ 'customer': doc.customer }
+	}
 }
 
 cur_frm.fields_dict['contact_person'].get_query = function(doc, cdt, cdn) {
-  return{
-    filters:{ 'customer': doc.customer}
-  }
+	return {
+		filters:{ 'customer': doc.customer }
+	}
 }
 
 //
 cur_frm.fields_dict['item_maintenance_detail'].grid.get_field('item_code').get_query = function(doc, cdt, cdn) {
-  return{
-    filters:{ 'is_service_item': "Yes"}
-  }
+	return {
+		filters:{ 'is_service_item': "Yes" }
+	}
 }
 
 cur_frm.cscript.item_code = function(doc, cdt, cdn) {
-  var fname = cur_frm.cscript.fname;
-  var d = locals[cdt][cdn];
-  if (d.item_code) {
-    return get_server_fields('get_item_details',d.item_code, 'item_maintenance_detail',doc,cdt,cdn,1);
-  }
+	var fname = cur_frm.cscript.fname;
+	var d = locals[cdt][cdn];
+	if (d.item_code) {
+		return get_server_fields('get_item_details', d.item_code, 'item_maintenance_detail', 
+			doc, cdt, cdn, 1);
+	}
 }
 
 cur_frm.cscript.periodicity = function(doc, cdt, cdn){
-  var d = locals[cdt][cdn];
-  if(d.start_date && d.end_date){
-    arg = {}
-    arg.start_date = d.start_date;
-    arg.end_date = d.end_date;
-    arg.periodicity = d.periodicity;
-    return get_server_fields('get_no_of_visits',docstring(arg),'item_maintenance_detail',doc, cdt, cdn, 1);
-  }
-  else{
-    msgprint(wn._("Please enter Start Date and End Date"));
-  }
+	var d = locals[cdt][cdn];
+	if(d.start_date && d.end_date) {
+		arg = {}
+		arg.start_date = d.start_date;
+		arg.end_date = d.end_date;
+		arg.periodicity = d.periodicity;
+		return get_server_fields('get_no_of_visits', docstring(arg), 
+			'item_maintenance_detail', doc, cdt, cdn, 1);
+	} else {
+		msgprint(wn._("Please enter Start Date and End Date"));
+	}
 }
 
 cur_frm.cscript.generate_schedule = function(doc, cdt, cdn) {
-  if (!doc.__islocal) {
-    return $c('runserverobj', args={'method':'generate_schedule', 'docs':wn.model.compress(make_doclist(cdt,cdn))},
-      function(r,rt){
-        refresh_field('maintenance_schedule_detail');
-      }
-    );
-  } else {
-    alert(wn._("Please save the document before generating maintenance schedule"));
-  }  
+	if (!doc.__islocal) {
+		return $c('runserverobj', args={'method':'generate_schedule', 
+			'docs':wn.model.compress(make_doclist(cdt,cdn))},
+			function(r, rt) {
+				refresh_field('maintenance_schedule_detail');
+			});
+	} else {
+		msgprint(wn._("Please save the document before generating maintenance schedule"));
+	}
 }
 
 cur_frm.fields_dict.customer.get_query = function(doc,cdt,cdn) {
-  return{ query: "erpnext.controllers.queries.customer_query" } }
+	return { query: "erpnext.controllers.queries.customer_query" }
+}
diff --git a/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.py b/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.py
index 8263b19..8f75247 100644
--- a/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.py
+++ b/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.py
@@ -4,13 +4,10 @@
 from __future__ import unicode_literals
 import webnotes
 
-from webnotes.utils import add_days, cstr, getdate
+from webnotes.utils import add_days, cstr, getdate, cint
 from webnotes.model.doc import addchild
 from webnotes.model.bean import getlist
-from webnotes import msgprint
-
-	
-
+from webnotes import msgprint, throw, _
 from erpnext.utilities.transaction_base import TransactionBase, delete_events
 
 class DocType(TransactionBase):
@@ -19,7 +16,8 @@
 		self.doclist = doclist
 	
 	def get_item_details(self, item_code):
-		item = webnotes.conn.sql("select item_name, description from `tabItem` where name = '%s'" %(item_code), as_dict=1)
+		item = webnotes.conn.sql("""select item_name, description from `tabItem` 
+			where name=%s""", (item_code), as_dict=1)
 		ret = {
 			'item_name': item and item[0]['item_name'] or '',
 			'description' : item and item[0]['description'] or ''
@@ -28,13 +26,14 @@
 		
 	def generate_schedule(self):
 		self.doclist = self.doc.clear_table(self.doclist, 'maintenance_schedule_detail')
-		count = 0
-		webnotes.conn.sql("delete from `tabMaintenance Schedule Detail` where parent='%s'" %(self.doc.name))
+		webnotes.conn.sql("""delete from `tabMaintenance Schedule Detail` 
+			where parent=%s""", (self.doc.name))
+		count = 1
 		for d in getlist(self.doclist, 'item_maintenance_detail'):
 			self.validate_maintenance_detail()
-			s_list =[]	
-			s_list = self.create_schedule_list(d.start_date, d.end_date, d.no_of_visits)
-			for i in range(d.no_of_visits):				
+			s_list = []
+			s_list = self.create_schedule_list(d.start_date, d.end_date, d.no_of_visits, d.sales_person)
+			for i in range(d.no_of_visits):
 				child = addchild(self.doc, 'maintenance_schedule_detail',
 					'Maintenance Schedule Detail', self.doclist)
 				child.item_code = d.item_code
@@ -43,40 +42,39 @@
 				if d.serial_no:
 					child.serial_no = d.serial_no
 				child.idx = count
-				count = count+1
-				child.incharge_name = d.incharge_name
+				count = count + 1
+				child.sales_person = d.sales_person
 				child.save(1)
 				
 		self.on_update()
 
 	def on_submit(self):
 		if not getlist(self.doclist, 'maintenance_schedule_detail'):
-			msgprint("Please click on 'Generate Schedule' to get schedule")
-			raise Exception
+			throw("Please click on 'Generate Schedule' to get schedule")
 		self.check_serial_no_added()
 		self.validate_serial_no_warranty()
 		self.validate_schedule()
 
-		email_map ={}
+		email_map = {}
 		for d in getlist(self.doclist, 'item_maintenance_detail'):
 			if d.serial_no:
 				self.update_amc_date(d.serial_no, d.end_date)
 
-			if d.incharge_name not in email_map:
-				email_map[d.incharge_name] = webnotes.bean("Sales Person", 
-					d.incharge_name).run_method("get_email_id")
+			if d.sales_person not in email_map:
+				sp = webnotes.bean("Sales Person", d.sales_person).make_controller()
+				email_map[d.sales_person] = sp.get_email_id()
 
-			scheduled_date =webnotes.conn.sql("select scheduled_date from `tabMaintenance Schedule Detail` \
-				where incharge_name='%s' and item_code='%s' and parent='%s' " %(d.incharge_name, \
-				d.item_code, self.doc.name), as_dict=1)
+			scheduled_date = webnotes.conn.sql("""select scheduled_date from 
+				`tabMaintenance Schedule Detail` where sales_person=%s and item_code=%s and 
+				parent=%s""", (d.sales_person, d.item_code, self.doc.name), as_dict=1)
 
 			for key in scheduled_date:
-				if email_map[d.incharge_name]:
+				if email_map[d.sales_person]:
 					description = "Reference: %s, Item Code: %s and Customer: %s" % \
 						(self.doc.name, d.item_code, self.doc.customer)
 					webnotes.bean({
 						"doctype": "Event",
-						"owner": email_map[d.incharge_name] or self.doc.owner,
+						"owner": email_map[d.sales_person] or self.doc.owner,
 						"subject": description,
 						"description": description,
 						"starts_on": key["scheduled_date"] + " 10:00:00",
@@ -89,92 +87,121 @@
 		
 	#get schedule dates
 	#----------------------
-	def create_schedule_list(self, start_date, end_date, no_of_visit):
+	def create_schedule_list(self, start_date, end_date, no_of_visit, sales_person):
 		schedule_list = []		
-		start_date1 = start_date
+		start_date_copy = start_date
 		date_diff = (getdate(end_date) - getdate(start_date)).days
-		add_by = date_diff/no_of_visit
-		#schedule_list.append(start_date1)
-		while(getdate(start_date1) < getdate(end_date)):
-			start_date1 = add_days(start_date1, add_by)
-			if len(schedule_list) < no_of_visit:
-				schedule_list.append(getdate(start_date1))
+		add_by = date_diff / no_of_visit
+
+		for visit in range(cint(no_of_visit)):
+			if (getdate(start_date_copy) < getdate(end_date)):
+				start_date_copy = add_days(start_date_copy, add_by)
+				if len(schedule_list) < no_of_visit:
+					schedule_date = self.validate_schedule_date_for_holiday_list(getdate(start_date_copy), 
+						sales_person)
+					if schedule_date > getdate(end_date):
+						schedule_date = getdate(end_date)
+					schedule_list.append(schedule_date)
+
 		return schedule_list
-	
+
+	def validate_schedule_date_for_holiday_list(self, schedule_date, sales_person):
+		from erpnext.accounts.utils import get_fiscal_year
+		validated = False
+		fy_details = ""
+
+		try:
+			fy_details = get_fiscal_year(date=schedule_date, verbose=0)
+		except Exception:
+			pass
+
+		if fy_details and fy_details[0]:
+			# check holiday list in employee master
+			holiday_list = webnotes.conn.sql_list("""select h.holiday_date from `tabEmployee` emp, 
+				`tabSales Person` sp, `tabHoliday` h, `tabHoliday List` hl 
+				where sp.name=%s and emp.name=sp.employee 
+				and hl.name=emp.holiday_list and 
+				h.parent=hl.name and 
+				hl.fiscal_year=%s""", (sales_person, fy_details[0]))
+			if not holiday_list:
+				# check global holiday list
+				holiday_list = webnotes.conn.sql("""select h.holiday_date from 
+					`tabHoliday` h, `tabHoliday List` hl 
+					where h.parent=hl.name and ifnull(hl.is_default, 0) = 1 
+					and hl.fiscal_year=%s""", fy_details[0])
+
+			if not validated and holiday_list:
+				if schedule_date in holiday_list:
+					schedule_date = add_days(schedule_date, -1)
+				else:
+					validated = True
+
+		return schedule_date
+
 	#validate date range and periodicity selected
 	#-------------------------------------------------
 	def validate_period(self, arg):
-		arg1 = eval(arg)
-		if getdate(arg1['start_date']) >= getdate(arg1['end_date']):
-			msgprint("Start date should be less than end date ")
-			raise Exception
-		
-		period = (getdate(arg1['end_date'])-getdate(arg1['start_date'])).days+1
-		
-		if (arg1['periodicity']=='Yearly' or arg1['periodicity']=='Half Yearly' or arg1['periodicity']=='Quarterly') and period<365:
-			msgprint(cstr(arg1['periodicity'])+ " periodicity can be set for period of atleast 1 year or more only")
-			raise Exception
-		elif arg1['periodicity']=='Monthly' and period<30:
-			msgprint("Monthly periodicity can be set for period of atleast 1 month or more")
-			raise Exception
-		elif arg1['periodicity']=='Weekly' and period<7:
-			msgprint("Weekly periodicity can be set for period of atleast 1 week or more")
-			raise Exception
+		args = eval(arg)
+		if getdate(args['start_date']) >= getdate(args['end_date']):
+			throw(_("Start date should be less than end date."))
+
+		period = (getdate(args['end_date']) - getdate(args['start_date'])).days + 1
+
+		if (args['periodicity'] == 'Yearly' or args['periodicity'] == 'Half Yearly' or 
+			args['periodicity'] == 'Quarterly') and period < 365:
+			throw(cstr(args['periodicity']) + " periodicity can be set for period of atleast 1 year or more only")
+		elif args['periodicity'] == 'Monthly' and period < 30:
+			throw("Monthly periodicity can be set for period of atleast 1 month or more")
+		elif args['periodicity'] == 'Weekly' and period < 7:
+			throw("Weekly periodicity can be set for period of atleast 1 week or more")
 	
 	def get_no_of_visits(self, arg):
-		arg1 = eval(arg)		
+		args = eval(arg)
 		self.validate_period(arg)
-		period = (getdate(arg1['end_date'])-getdate(arg1['start_date'])).days+1
-		
-		count =0
-		if arg1['periodicity'] == 'Weekly':
+		period = (getdate(args['end_date']) - getdate(args['start_date'])).days + 1
+		count = 0
+
+		if args['periodicity'] == 'Weekly':
 			count = period/7
-		elif arg1['periodicity'] == 'Monthly':
+		elif args['periodicity'] == 'Monthly':
 			count = period/30
-		elif arg1['periodicity'] == 'Quarterly':
+		elif args['periodicity'] == 'Quarterly':
 			count = period/91	 
-		elif arg1['periodicity'] == 'Half Yearly':
+		elif args['periodicity'] == 'Half Yearly':
 			count = period/182
-		elif arg1['periodicity'] == 'Yearly':
+		elif args['periodicity'] == 'Yearly':
 			count = period/365
 		
-		ret = {'no_of_visits':count}
+		ret = {'no_of_visits' : count}
 		return ret
-	
-
 
 	def validate_maintenance_detail(self):
 		if not getlist(self.doclist, 'item_maintenance_detail'):
-			msgprint("Please enter Maintaince Details first")
-			raise Exception
+			throw(_("Please enter Maintaince Details first"))
 		
 		for d in getlist(self.doclist, 'item_maintenance_detail'):
 			if not d.item_code:
-				msgprint("Please select item code")
-				raise Exception
+				throw(_("Please select item code"))
 			elif not d.start_date or not d.end_date:
-				msgprint("Please select Start Date and End Date for item "+d.item_code)
-				raise Exception
+				throw(_("Please select Start Date and End Date for item") + " " + d.item_code)
 			elif not d.no_of_visits:
-				msgprint("Please mention no of visits required")
-				raise Exception
-			elif not d.incharge_name:
-				msgprint("Please select Incharge Person's name")
-				raise Exception
+				throw(_("Please mention no of visits required"))
+			elif not d.sales_person:
+				throw(_("Please select Incharge Person's name"))
 			
 			if getdate(d.start_date) >= getdate(d.end_date):
-				msgprint("Start date should be less than end date for item "+d.item_code)
-				raise Exception
+				throw(_("Start date should be less than end date for item") + " " + d.item_code)
 	
 	#check if maintenance schedule already created against same sales order
 	#-----------------------------------------------------------------------------------
 	def validate_sales_order(self):
 		for d in getlist(self.doclist, 'item_maintenance_detail'):
 			if d.prevdoc_docname:
-				chk = webnotes.conn.sql("select t1.name from `tabMaintenance Schedule` t1, `tabMaintenance Schedule Item` t2 where t2.parent=t1.name and t2.prevdoc_docname=%s and t1.docstatus=1", d.prevdoc_docname)
+				chk = webnotes.conn.sql("""select ms.name from `tabMaintenance Schedule` ms, 
+					`tabMaintenance Schedule Item` msi where msi.parent=ms.name and 
+					msi.prevdoc_docname=%s and ms.docstatus=1""", d.prevdoc_docname)
 				if chk:
-					msgprint("Maintenance Schedule against "+d.prevdoc_docname+" already exist")
-					raise Exception
+					throw("Maintenance Schedule against " + d.prevdoc_docname + " already exist")
 	
 
 	def validate_serial_no(self):
@@ -185,13 +212,13 @@
 				cur_s_no = cur_serial_no.split(',')
 				
 				for x in cur_s_no:
-					chk = webnotes.conn.sql("select name, status from `tabSerial No` where docstatus!=2 and name=%s", (x))
+					chk = webnotes.conn.sql("""select name, status from `tabSerial No` 
+						where docstatus!=2 and name=%s""", (x))
 					chk1 = chk and chk[0][0] or ''
 					status = chk and chk[0][1] or ''
 					
 					if not chk1:
-						msgprint("Serial no "+x+" does not exist in system.")
-						raise Exception
+						throw("Serial no " + x + " does not exist in system.")
 	
 	def validate(self):
 		self.validate_maintenance_detail()
@@ -208,13 +235,13 @@
 				cur_s_no = cur_serial_no.split(',')
 				
 				for x in cur_s_no:
-					dt = webnotes.conn.sql("select delivery_date from `tabSerial No` where name = %s", x)
+					dt = webnotes.conn.sql("""select delivery_date from `tabSerial No` 
+						where name=%s""", x)
 					dt = dt and dt[0][0] or ''
 					
 					if dt:
 						if dt > getdate(d.start_date):
-							msgprint("Maintenance start date can not be before delivery date "+dt.strftime('%Y-%m-%d')+" for serial no "+x)
-							raise Exception
+							throw("Maintenance start date can not be before delivery date " + dt.strftime('%Y-%m-%d') + " for serial no " + x)
 	
 	#update amc expiry date in serial no
 	#------------------------------------------
@@ -224,7 +251,8 @@
 		cur_s_no = cur_serial_no.split(',')
 		
 		for x in cur_s_no:
-			webnotes.conn.sql("update `tabSerial No` set amc_expiry_date = '%s', maintenance_status = 'Under AMC' where name = '%s'"% (amc_end_date,x))
+			webnotes.conn.sql("""update `tabSerial No` set amc_expiry_date=%s, 
+				maintenance_status='Under AMC' where name=%s""", (amc_end_date, x))
 	
 	def on_update(self):
 		webnotes.conn.set(self.doc, 'status', 'Draft')
@@ -233,16 +261,16 @@
 		for d in getlist(self.doclist, 'item_maintenance_detail'):
 			if cstr(d.serial_no).strip():
 				dt = webnotes.conn.sql("""select warranty_expiry_date, amc_expiry_date 
-					from `tabSerial No` where name = %s""", d.serial_no, as_dict=1)
+					from `tabSerial No` where name=%s""", d.serial_no, as_dict=1)
 				if dt[0]['warranty_expiry_date'] and dt[0]['warranty_expiry_date'] >= d.start_date:
-					webnotes.msgprint("""Serial No: %s is already under warranty upto %s. 
+					throw("""Serial No: %s is already under warranty upto %s. 
 						Please check AMC Start Date.""" % 
-						(d.serial_no, dt[0]["warranty_expiry_date"]), raise_exception=1)
+						(d.serial_no, dt[0]["warranty_expiry_date"]))
 						
 				if dt[0]['amc_expiry_date'] and dt[0]['amc_expiry_date'] >= d.start_date:
-					webnotes.msgprint("""Serial No: %s is already under AMC upto %s.
+					throw("""Serial No: %s is already under AMC upto %s.
 						Please check AMC Start Date.""" % 
-						(d.serial_no, dt[0]["amc_expiry_date"]), raise_exception=1)
+						(d.serial_no, dt[0]["amc_expiry_date"]))
 
 	def validate_schedule(self):
 		item_lst1 =[]
@@ -256,13 +284,11 @@
 				item_lst2.append(m.item_code)
 		
 		if len(item_lst1) != len(item_lst2):
-			msgprint("Maintenance Schedule is not generated for all the items. Please click on 'Generate Schedule'")
-			raise Exception
+			throw("Maintenance Schedule is not generated for all the items. Please click on 'Generate Schedule'")
 		else:
 			for x in item_lst1:
 				if x not in item_lst2:
-					msgprint("Maintenance Schedule is not generated for item "+x+". Please click on 'Generate Schedule'")
-					raise Exception
+					throw("Maintenance Schedule is not generated for item "+x+". Please click on 'Generate Schedule'")
 	
 	#check if serial no present in item maintenance table
 	#-----------------------------------------------------------
@@ -275,18 +301,15 @@
 		for m in getlist(self.doclist, 'maintenance_schedule_detail'):
 			if serial_present:
 				if m.item_code in serial_present and not m.serial_no:
-					msgprint("Please click on 'Generate Schedule' to fetch serial no added for item "+m.item_code)
-					raise Exception
-	
-	
-	
+					throw("Please click on 'Generate Schedule' to fetch serial no added for item "+m.item_code)
+
 	def on_cancel(self):
 		for d in getlist(self.doclist, 'item_maintenance_detail'):
 			if d.serial_no:
 				self.update_amc_date(d.serial_no, '')
 		webnotes.conn.set(self.doc, 'status', 'Cancelled')
 		delete_events(self.doc.doctype, self.doc.name)
-		
+
 	def on_trash(self):
 		delete_events(self.doc.doctype, self.doc.name)
 
@@ -313,7 +336,7 @@
 			"field_map": {
 				"parent": "prevdoc_docname", 
 				"parenttype": "prevdoc_doctype",
-				"incharge_name": "service_person"
+				"sales_person": "service_person"
 			}
 		}
 	}, target_doclist)
diff --git a/erpnext/support/doctype/maintenance_schedule_detail/maintenance_schedule_detail.txt b/erpnext/support/doctype/maintenance_schedule_detail/maintenance_schedule_detail.txt
index 8b52d8b..8ed6856 100644
--- a/erpnext/support/doctype/maintenance_schedule_detail/maintenance_schedule_detail.txt
+++ b/erpnext/support/doctype/maintenance_schedule_detail/maintenance_schedule_detail.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-02-22 01:28:05", 
   "docstatus": 0, 
-  "modified": "2013-12-20 19:23:20", 
+  "modified": "2013-12-31 12:13:38", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -52,6 +52,7 @@
   "search_index": 0
  }, 
  {
+  "allow_on_submit": 0, 
   "doctype": "DocField", 
   "fieldname": "scheduled_date", 
   "fieldtype": "Date", 
@@ -78,12 +79,13 @@
   "report_hide": 1
  }, 
  {
+  "allow_on_submit": 0, 
   "doctype": "DocField", 
-  "fieldname": "incharge_name", 
+  "fieldname": "sales_person", 
   "fieldtype": "Link", 
   "in_filter": 1, 
   "in_list_view": 1, 
-  "label": "Incharge Name", 
+  "label": "Sales Person", 
   "oldfieldname": "incharge_name", 
   "oldfieldtype": "Link", 
   "options": "Sales Person", 
diff --git a/erpnext/support/doctype/maintenance_schedule_item/maintenance_schedule_item.txt b/erpnext/support/doctype/maintenance_schedule_item/maintenance_schedule_item.txt
index f42b48b..43d281d 100644
--- a/erpnext/support/doctype/maintenance_schedule_item/maintenance_schedule_item.txt
+++ b/erpnext/support/doctype/maintenance_schedule_item/maintenance_schedule_item.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-02-22 01:28:05", 
   "docstatus": 0, 
-  "modified": "2013-12-20 19:23:20", 
+  "modified": "2013-12-31 12:08:32", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -112,10 +112,10 @@
  }, 
  {
   "doctype": "DocField", 
-  "fieldname": "incharge_name", 
+  "fieldname": "sales_person", 
   "fieldtype": "Link", 
   "in_filter": 1, 
-  "label": "Sales Person Incharge", 
+  "label": "Sales Person", 
   "oldfieldname": "incharge_name", 
   "oldfieldtype": "Link", 
   "options": "Sales Person", 
diff --git a/erpnext/support/doctype/newsletter/newsletter.txt b/erpnext/support/doctype/newsletter/newsletter.txt
index 9482ed7..0618394 100644
--- a/erpnext/support/doctype/newsletter/newsletter.txt
+++ b/erpnext/support/doctype/newsletter/newsletter.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-01-10 16:34:31", 
   "docstatus": 0, 
-  "modified": "2013-12-20 19:24:14", 
+  "modified": "2014-01-24 13:00:11", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -13,7 +13,8 @@
   "document_type": "Other", 
   "icon": "icon-envelope", 
   "module": "Support", 
-  "name": "__common__"
+  "name": "__common__", 
+  "title_field": "subject"
  }, 
  {
   "doctype": "DocField", 
@@ -26,6 +27,7 @@
  {
   "cancel": 0, 
   "create": 0, 
+  "delete": 0, 
   "doctype": "DocPerm", 
   "email": 1, 
   "name": "__common__", 
diff --git a/erpnext/support/report/maintenance_schedules/maintenance_schedules.txt b/erpnext/support/report/maintenance_schedules/maintenance_schedules.txt
index 766eb20..eec3d7f 100644
--- a/erpnext/support/report/maintenance_schedules/maintenance_schedules.txt
+++ b/erpnext/support/report/maintenance_schedules/maintenance_schedules.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-05-06 14:25:21", 
   "docstatus": 0, 
-  "modified": "2013-10-09 12:23:27", 
+  "modified": "2013-12-31 12:24:48", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -10,7 +10,7 @@
   "doctype": "Report", 
   "is_standard": "Yes", 
   "name": "__common__", 
-  "query": "SELECT\n    ms_sch.scheduled_date as \"Schedule Date:Date:120\",\n\tms_sch.item_code as \"Item Code:Link/Item:120\",\n\tms_sch.item_name as \"Item Name::120\",\n\tms_sch.serial_no as \"Serial No::120\",\n\tms_sch.incharge_name as \"Incharge::120\",\n\tms.customer_name as \"Customer:Link/Customer:120\",\n\tms.address_display as \"Customer Address::120\",\n\tms_item.prevdoc_docname as \"Sales Order:Link/Sales Order:120\",\n\tms.company as \"Company:Link/Company:120\"\n\t\nFROM\n\t`tabMaintenance Schedule` ms, \n    `tabMaintenance Schedule Detail` ms_sch, \n    `tabMaintenance Schedule Item` ms_item\nWHERE\n\tms.name = ms_sch.parent and ms.name = ms_item.parent and ms.docstatus = 1\nORDER BY\n\tms_sch.scheduled_date asc, ms_sch.item_code asc", 
+  "query": "SELECT\n    ms_sch.scheduled_date as \"Schedule Date:Date:120\",\n\tms_sch.item_code as \"Item Code:Link/Item:120\",\n\tms_sch.item_name as \"Item Name::120\",\n\tms_sch.serial_no as \"Serial No::120\",\n\tms_sch.sales_person as \"Sales Person::120\",\n\tms.customer_name as \"Customer:Link/Customer:120\",\n\tms.address_display as \"Customer Address::120\",\n\tms_item.prevdoc_docname as \"Sales Order:Link/Sales Order:120\",\n\tms.company as \"Company:Link/Company:120\"\n\t\nFROM\n\t`tabMaintenance Schedule` ms, \n    `tabMaintenance Schedule Detail` ms_sch, \n    `tabMaintenance Schedule Item` ms_item\nWHERE\n\tms.name = ms_sch.parent and ms.name = ms_item.parent and ms.docstatus = 1\nORDER BY\n\tms_sch.scheduled_date asc, ms_sch.item_code asc", 
   "ref_doctype": "Maintenance Schedule", 
   "report_name": "Maintenance Schedules", 
   "report_type": "Query Report"
diff --git a/erpnext/utilities/doctype/note/note.txt b/erpnext/utilities/doctype/note/note.txt
index b7c4f8b..94e5a0f 100644
--- a/erpnext/utilities/doctype/note/note.txt
+++ b/erpnext/utilities/doctype/note/note.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-05-24 13:41:00", 
   "docstatus": 0, 
-  "modified": "2014-01-20 17:48:58", 
+  "modified": "2014-01-22 16:05:35", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -25,7 +25,7 @@
   "permlevel": 0
  }, 
  {
-  "cancel": 1, 
+  "cancel": 0, 
   "create": 1, 
   "delete": 1, 
   "doctype": "DocPerm", 
@@ -37,6 +37,7 @@
   "permlevel": 0, 
   "print": 1, 
   "read": 1, 
+  "restricted": 1, 
   "role": "All", 
   "write": 1
  },