diff --git a/accounts/utils.py b/accounts/utils.py
new file mode 100644
index 0000000..8ad1899
--- /dev/null
+++ b/accounts/utils.py
@@ -0,0 +1,99 @@
+# ERPNext - web based ERP (http://erpnext.com)
+# Copyright (C) 2012 Web Notes Technologies Pvt Ltd
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+from __future__ import unicode_literals
+
+import webnotes
+from webnotes.utils import nowdate
+
+class FiscalYearError(webnotes.ValidationError): pass
+
+def get_fiscal_year(date, verbose=1):
+	from webnotes.utils import formatdate
+	# if year start date is 2012-04-01, year end date should be 2013-03-31 (hence subdate)
+	fy = webnotes.conn.sql("""select name, year_start_date, 
+		subdate(adddate(year_start_date, interval 1 year), interval 1 day) 
+			as year_end_date
+		from `tabFiscal Year`
+		where %s >= year_start_date and %s < adddate(year_start_date, interval 1 year)
+		order by year_start_date desc""", (date, date))
+	
+	if not fy:
+		error_msg = """%s not in any Fiscal Year""" % formatdate(date)
+		if verbose: webnotes.msgprint(error_msg)
+		raise FiscalYearError, error_msg
+	
+	return fy[0]
+
+@webnotes.whitelist()
+def get_balance_on(account=None, date=None):
+	if not account and webnotes.form_dict.get("account"):
+		account = webnotes.form_dict.get("account")
+		date = webnotes.form_dict.get("date")
+	
+	cond = []
+	if date:
+		cond.append("posting_date <= '%s'" % date)
+	else:
+		# get balance of all entries that exist
+		date = nowdate()
+		
+	try:
+		year_start_date = get_fiscal_year(date, verbose=0)[1]
+	except FiscalYearError, e:
+		from webnotes.utils import getdate
+		if getdate(date) > getdate(nowdate()):
+			# if fiscal year not found and the date is greater than today
+			# get fiscal year for today's date and its corresponding year start date
+			year_start_date = get_fiscal_year(nowdate(), verbose=1)[1]
+		else:
+			# this indicates that it is a date older than any existing fiscal year.
+			# hence, assuming balance as 0.0
+			return 0.0
+		
+	acc = webnotes.conn.get_value('Account', account, \
+		['lft', 'rgt', 'debit_or_credit', 'is_pl_account', 'group_or_ledger'], as_dict=1)
+	
+	# for pl accounts, get balance within a fiscal year
+	if acc.is_pl_account == 'Yes':
+		cond.append("posting_date >= '%s' and voucher_type != 'Period Closing Voucher'" \
+			% year_start_date)
+	
+	# different filter for group and ledger - improved performance
+	if acc.group_or_ledger=="Group":
+		cond.append("""exists (
+			select * from `tabAccount` ac where ac.name = gle.account
+			and ac.lft >= %s and ac.rgt <= %s
+		)""" % (acc.lft, acc.rgt))
+	else:
+		cond.append("""gle.account = "%s" """ % (account, ))
+	
+	# join conditional conditions
+	cond = " and ".join(cond)
+	if cond:
+		cond += " and "
+	
+	bal = webnotes.conn.sql("""
+		SELECT sum(ifnull(debit, 0)) - sum(ifnull(credit, 0)) 
+		FROM `tabGL Entry` gle
+		WHERE %s ifnull(is_cancelled, 'No') = 'No' """ % (cond, ))[0][0]
+
+	# if credit account, it should calculate credit - debit
+	if bal and acc.debit_or_credit == 'Credit':
+		bal = -bal
+
+	# if bal is None, return 0
+	return bal or 0
\ No newline at end of file
