From 23941aa8f2ee046bdb36692cc2f53b032351770f Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 29 Jan 2013 11:32:38 +0530 Subject: [PATCH] accounts utils file instead of utils directory --- accounts/utils.py | 99 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 accounts/utils.py diff --git a/accounts/utils.py b/accounts/utils.py new file mode 100644 index 0000000000..8ad18990e4 --- /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 . + +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