Merge branch 'develop'
diff --git a/erpnext/__version__.py b/erpnext/__version__.py
index 6c387e4..efbed2e 100644
--- a/erpnext/__version__.py
+++ b/erpnext/__version__.py
@@ -1 +1 @@
-__version__ = '4.11.0'
+__version__ = '4.11.1'
diff --git a/erpnext/accounts/doctype/journal_voucher/journal_voucher.py b/erpnext/accounts/doctype/journal_voucher/journal_voucher.py
index 7a833f7..825a8dd 100644
--- a/erpnext/accounts/doctype/journal_voucher/journal_voucher.py
+++ b/erpnext/accounts/doctype/journal_voucher/journal_voucher.py
@@ -310,22 +310,19 @@
 		self.total_amount_in_words = money_in_words(amt, company_currency)
 
 	def check_credit_days(self):
-		date_diff = 0
 		if self.cheque_date:
-			date_diff = (getdate(self.cheque_date)-getdate(self.posting_date)).days
-
-		if date_diff <= 0: return
-
-		# Get List of Customer Account
-		acc_list = filter(lambda d: frappe.db.get_value("Account", d.account,
-		 	"master_type")=='Customer', self.get('entries'))
-
-		for d in acc_list:
-			credit_days = self.get_credit_days_for(d.account)
-			# Check credit days
-			if credit_days > 0 and not self.get_authorized_user() and cint(date_diff) > credit_days:
-				msgprint(_("Maximum allowed credit is {0} days after posting date").format(credit_days),
-					raise_exception=1)
+			for d in self.get("entries"):
+				if flt(d.credit) > 0 and d.against_invoice \
+					and frappe.db.get_value("Account", d.account, "master_type")=='Customer':
+						posting_date = frappe.db.get_value("Sales Invoice", d.against_invoice, "posting_date")
+						credit_days = self.get_credit_days_for(d.account)
+						if credit_days:
+							date_diff = (getdate(self.cheque_date) - getdate(posting_date)).days
+							if date_diff > flt(credit_days):
+								msgprint(_("Note: Reference Date exceeds allowed credit days by {0} days for {1}")
+									.format(date_diff - flt(credit_days), d.account))
+								if not self.get_authorized_user():
+									raise frappe.ValidationError
 
 	def get_credit_days_for(self, ac):
 		if not self.credit_days_for.has_key(ac):
@@ -333,8 +330,7 @@
 
 		if not self.credit_days_for[ac]:
 			if self.credit_days_global==-1:
-				self.credit_days_global = cint(frappe.db.get_value("Company",
-					self.company, "credit_days"))
+				self.credit_days_global = cint(frappe.db.get_value("Company", self.company, "credit_days"))
 
 			return self.credit_days_global
 		else:
@@ -343,10 +339,7 @@
 	def get_authorized_user(self):
 		if self.is_approving_authority==-1:
 			self.is_approving_authority = 0
-
-			# Fetch credit controller role
-			approving_authority = frappe.db.get_value("Accounts Settings", None,
-				"credit_controller")
+			approving_authority = frappe.db.get_value("Accounts Settings", None, "credit_controller")
 
 			# Check logged-in user is authorized
 			if approving_authority in frappe.user.get_roles():
diff --git a/erpnext/accounts/doctype/payment_tool/payment_tool.py b/erpnext/accounts/doctype/payment_tool/payment_tool.py
index 578a316..4d4d8e8 100644
--- a/erpnext/accounts/doctype/payment_tool/payment_tool.py
+++ b/erpnext/accounts/doctype/payment_tool/payment_tool.py
@@ -3,7 +3,7 @@
 
 from __future__ import unicode_literals
 import frappe
-from frappe import _, scrub
+from frappe import _
 from frappe.utils import flt
 from frappe.model.document import Document
 import json
@@ -93,7 +93,7 @@
 			and docstatus = 1
 			and ifnull(status, "") != "Stopped"
 			and ifnull(grand_total, 0) > ifnull(advance_paid, 0)
-			and ifnull(per_billed, 0) < 100.0
+			and abs(100 - ifnull(per_billed, 0)) > 0.01
 		""" % (voucher_type, 'customer' if party_type == "Customer" else 'supplier', '%s'),
 		party_name, as_dict = True)
 
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index 05e7625..75795af 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -4,7 +4,7 @@
 app_description = "Open Source Enterprise Resource Planning for Small and Midsized Organizations"
 app_icon = "icon-th"
 app_color = "#e74c3c"
-app_version = "4.11.0"
+app_version = "4.11.1"
 
 error_report_email = "support@erpnext.com"
 
diff --git a/erpnext/hr/doctype/leave_application/leave_application.js b/erpnext/hr/doctype/leave_application/leave_application.js
index 0d8b37e..ecaac4a 100755
--- a/erpnext/hr/doctype/leave_application/leave_application.js
+++ b/erpnext/hr/doctype/leave_application/leave_application.js
@@ -104,7 +104,15 @@
 		if(cint(doc.half_day) == 1) set_multiple(dt,dn,{total_leave_days:0.5});
 		else{
 			// server call is done to include holidays in leave days calculations
-			return get_server_fields('get_total_leave_days', '', '', doc, dt, dn, 1);
+			return frappe.call({
+				method: 'erpnext.hr.doctype.leave_application.leave_application.get_total_leave_days',
+				args: {leave_app: doc},
+				callback: function(response) {
+					if (response && response.message) {
+						cur_frm.set_value('total_leave_days', response.message.total_leave_days);
+					}
+				}
+			});
 		}
 	}
 }
diff --git a/erpnext/hr/doctype/leave_application/leave_application.py b/erpnext/hr/doctype/leave_application/leave_application.py
index 1751eb1..50d1d6f 100755
--- a/erpnext/hr/doctype/leave_application/leave_application.py
+++ b/erpnext/hr/doctype/leave_application/leave_application.py
@@ -2,7 +2,7 @@
 # License: GNU General Public License v3. See license.txt
 
 from __future__ import unicode_literals
-import frappe
+import frappe, json
 from frappe import _
 
 from frappe.utils import cint, cstr, date_diff, flt, formatdate, getdate, get_url_to_form, \
@@ -77,26 +77,10 @@
 					LeaveDayBlockedError)
 
 	def get_holidays(self):
-		tot_hol = frappe.db.sql("""select count(*) from `tabHoliday` h1, `tabHoliday List` h2, `tabEmployee` e1
-			where e1.name = %s and h1.parent = h2.name and e1.holiday_list = h2.name
-			and h1.holiday_date between %s and %s""", (self.employee, self.from_date, self.to_date))
-		if not tot_hol:
-			tot_hol = frappe.db.sql("""select count(*) from `tabHoliday` h1, `tabHoliday List` h2
-				where h1.parent = h2.name and h1.holiday_date between %s and %s
-				and ifnull(h2.is_default,0) = 1 and h2.fiscal_year = %s""",
-				(self.from_date, self.to_date, self.fiscal_year))
-		return tot_hol and flt(tot_hol[0][0]) or 0
+		return get_holidays(self)
 
 	def get_total_leave_days(self):
-		"""Calculates total leave days based on input and holidays"""
-		ret = {'total_leave_days' : 0.5}
-		if not self.half_day:
-			tot_days = date_diff(self.to_date, self.from_date) + 1
-			holidays = self.get_holidays()
-			ret = {
-				'total_leave_days' : flt(tot_days)-flt(holidays)
-			}
-		return ret
+		return get_total_leave_days(self)
 
 	def validate_to_date(self):
 		if self.from_date and self.to_date and \
@@ -216,6 +200,33 @@
 		post(**{"txt": args.message, "contact": args.message_to, "subject": args.subject,
 			"notify": cint(self.follow_via_email)})
 
+def get_holidays(leave_app):
+	tot_hol = frappe.db.sql("""select count(*) from `tabHoliday` h1, `tabHoliday List` h2, `tabEmployee` e1
+		where e1.name = %s and h1.parent = h2.name and e1.holiday_list = h2.name
+		and h1.holiday_date between %s and %s""", (leave_app.employee, leave_app.from_date, leave_app.to_date))
+	if not tot_hol:
+		tot_hol = frappe.db.sql("""select count(*) from `tabHoliday` h1, `tabHoliday List` h2
+			where h1.parent = h2.name and h1.holiday_date between %s and %s
+			and ifnull(h2.is_default,0) = 1 and h2.fiscal_year = %s""",
+			(leave_app.from_date, leave_app.to_date, leave_app.fiscal_year))
+	return tot_hol and flt(tot_hol[0][0]) or 0
+
+@frappe.whitelist()
+def get_total_leave_days(leave_app):
+	# Parse Leave Application if neccessary
+	if isinstance(leave_app, str) or isinstance(leave_app, unicode):
+		leave_app = frappe.get_doc(json.loads(leave_app))
+
+	"""Calculates total leave days based on input and holidays"""
+	ret = {'total_leave_days' : 0.5}
+	if not leave_app.half_day:
+		tot_days = date_diff(leave_app.to_date, leave_app.from_date) + 1
+		holidays = leave_app.get_holidays()
+		ret = {
+			'total_leave_days' : flt(tot_days)-flt(holidays)
+		}
+	return ret
+
 @frappe.whitelist()
 def get_leave_balance(employee, leave_type, fiscal_year):
 	leave_all = frappe.db.sql("""select total_leaves_allocated
diff --git a/setup.py b/setup.py
index 924331f..1ca99c0 100644
--- a/setup.py
+++ b/setup.py
@@ -1,7 +1,7 @@
 from setuptools import setup, find_packages
 import os
 
-version = "4.11.0"
+version = "4.11.1"
 
 with open("requirements.txt", "r") as f:
 	install_requires = f.readlines()