[cleanup] [minor] budget code cleaned up with testcases
This commit is contained in:
parent
2b06aaa291
commit
a391606a8f
@ -6,6 +6,21 @@ test_records = [
|
|||||||
"doctype": "Budget Distribution",
|
"doctype": "Budget Distribution",
|
||||||
"distribution_id": "_Test Distribution",
|
"distribution_id": "_Test Distribution",
|
||||||
"fiscal_year": "_Test Fiscal Year 2013",
|
"fiscal_year": "_Test Fiscal Year 2013",
|
||||||
|
}, {
|
||||||
|
"doctype": "Budget Distribution Detail",
|
||||||
|
"parentfield": "budget_distribution_details",
|
||||||
|
"month": "January",
|
||||||
|
"percentage_allocation": "8"
|
||||||
|
}, {
|
||||||
|
"doctype": "Budget Distribution Detail",
|
||||||
|
"parentfield": "budget_distribution_details",
|
||||||
|
"month": "February",
|
||||||
|
"percentage_allocation": "8"
|
||||||
|
}, {
|
||||||
|
"doctype": "Budget Distribution Detail",
|
||||||
|
"parentfield": "budget_distribution_details",
|
||||||
|
"month": "March",
|
||||||
|
"percentage_allocation": "8"
|
||||||
}, {
|
}, {
|
||||||
"doctype": "Budget Distribution Detail",
|
"doctype": "Budget Distribution Detail",
|
||||||
"parentfield": "budget_distribution_details",
|
"parentfield": "budget_distribution_details",
|
||||||
@ -45,26 +60,11 @@ test_records = [
|
|||||||
"doctype": "Budget Distribution Detail",
|
"doctype": "Budget Distribution Detail",
|
||||||
"parentfield": "budget_distribution_details",
|
"parentfield": "budget_distribution_details",
|
||||||
"month": "November",
|
"month": "November",
|
||||||
"percentage_allocation": "8"
|
"percentage_allocation": "10"
|
||||||
}, {
|
}, {
|
||||||
"doctype": "Budget Distribution Detail",
|
"doctype": "Budget Distribution Detail",
|
||||||
"parentfield": "budget_distribution_details",
|
"parentfield": "budget_distribution_details",
|
||||||
"month": "December",
|
"month": "December",
|
||||||
"percentage_allocation": "8"
|
|
||||||
}, {
|
|
||||||
"doctype": "Budget Distribution Detail",
|
|
||||||
"parentfield": "budget_distribution_details",
|
|
||||||
"month": "January",
|
|
||||||
"percentage_allocation": "8"
|
|
||||||
}, {
|
|
||||||
"doctype": "Budget Distribution Detail",
|
|
||||||
"parentfield": "budget_distribution_details",
|
|
||||||
"month": "February",
|
|
||||||
"percentage_allocation": "10"
|
|
||||||
}, {
|
|
||||||
"doctype": "Budget Distribution Detail",
|
|
||||||
"parentfield": "budget_distribution_details",
|
|
||||||
"month": "March",
|
|
||||||
"percentage_allocation": "10"
|
"percentage_allocation": "10"
|
||||||
}]
|
}]
|
||||||
]
|
]
|
@ -8,6 +8,7 @@ import webnotes
|
|||||||
|
|
||||||
class TestJournalVoucher(unittest.TestCase):
|
class TestJournalVoucher(unittest.TestCase):
|
||||||
def test_journal_voucher_with_against_jv(self):
|
def test_journal_voucher_with_against_jv(self):
|
||||||
|
self.clear_account_balance()
|
||||||
jv_invoice = webnotes.bean(copy=test_records[2])
|
jv_invoice = webnotes.bean(copy=test_records[2])
|
||||||
jv_invoice.insert()
|
jv_invoice.insert()
|
||||||
jv_invoice.submit()
|
jv_invoice.submit()
|
||||||
@ -32,20 +33,87 @@ class TestJournalVoucher(unittest.TestCase):
|
|||||||
self.assertTrue(not webnotes.conn.sql("""select name from `tabJournal Voucher Detail`
|
self.assertTrue(not webnotes.conn.sql("""select name from `tabJournal Voucher Detail`
|
||||||
where against_jv=%s""", jv_invoice.doc.name))
|
where against_jv=%s""", jv_invoice.doc.name))
|
||||||
|
|
||||||
def test_budget(self):
|
def test_monthly_budget_crossed_ignore(self):
|
||||||
|
webnotes.conn.set_value("Company", "_Test Company", "monthly_bgt_flag", "Ignore")
|
||||||
|
self.clear_account_balance()
|
||||||
|
|
||||||
|
jv = webnotes.bean(copy=test_records[0])
|
||||||
|
jv.doclist[2].account = "_Test Account Cost for Goods Sold - _TC"
|
||||||
|
jv.doclist[2].cost_center = "_Test Cost Center - _TC"
|
||||||
|
jv.doclist[2].debit = 20000.0
|
||||||
|
jv.doclist[1].credit = 20000.0
|
||||||
|
jv.insert()
|
||||||
|
jv.submit()
|
||||||
|
self.assertTrue(webnotes.conn.get_value("GL Entry",
|
||||||
|
{"voucher_type": "Journal Voucher", "voucher_no": jv.doc.name}))
|
||||||
|
|
||||||
|
def test_monthly_budget_crossed_stop(self):
|
||||||
from accounts.utils import BudgetError
|
from accounts.utils import BudgetError
|
||||||
webnotes.conn.set_value("Company", "_Test Company", "monthly_bgt_flag", "Stop")
|
webnotes.conn.set_value("Company", "_Test Company", "monthly_bgt_flag", "Stop")
|
||||||
|
self.clear_account_balance()
|
||||||
|
|
||||||
|
jv = webnotes.bean(copy=test_records[0])
|
||||||
|
jv.doclist[2].account = "_Test Account Cost for Goods Sold - _TC"
|
||||||
|
jv.doclist[2].cost_center = "_Test Cost Center - _TC"
|
||||||
|
jv.doclist[2].debit = 20000.0
|
||||||
|
jv.doclist[1].credit = 20000.0
|
||||||
|
jv.insert()
|
||||||
|
|
||||||
|
self.assertRaises(BudgetError, jv.submit)
|
||||||
|
|
||||||
|
webnotes.conn.set_value("Company", "_Test Company", "monthly_bgt_flag", "Ignore")
|
||||||
|
|
||||||
|
def test_yearly_budget_crossed_stop(self):
|
||||||
|
from accounts.utils import BudgetError
|
||||||
|
self.clear_account_balance()
|
||||||
|
self.test_monthly_budget_crossed_ignore()
|
||||||
|
|
||||||
|
webnotes.conn.set_value("Company", "_Test Company", "yearly_bgt_flag", "Stop")
|
||||||
|
|
||||||
|
jv = webnotes.bean(copy=test_records[0])
|
||||||
|
jv.doc.posting_date = "2013-08-12"
|
||||||
|
jv.doclist[2].account = "_Test Account Cost for Goods Sold - _TC"
|
||||||
|
jv.doclist[2].cost_center = "_Test Cost Center - _TC"
|
||||||
|
jv.doclist[2].debit = 150000.0
|
||||||
|
jv.doclist[1].credit = 150000.0
|
||||||
|
jv.insert()
|
||||||
|
|
||||||
|
self.assertRaises(BudgetError, jv.submit)
|
||||||
|
|
||||||
|
webnotes.conn.set_value("Company", "_Test Company", "yearly_bgt_flag", "Ignore")
|
||||||
|
|
||||||
|
def test_monthly_budget_on_cancellation(self):
|
||||||
|
from accounts.utils import BudgetError
|
||||||
|
webnotes.conn.set_value("Company", "_Test Company", "monthly_bgt_flag", "Stop")
|
||||||
|
self.clear_account_balance()
|
||||||
|
|
||||||
|
jv = webnotes.bean(copy=test_records[0])
|
||||||
|
jv.doclist[1].account = "_Test Account Cost for Goods Sold - _TC"
|
||||||
|
jv.doclist[1].cost_center = "_Test Cost Center - _TC"
|
||||||
|
jv.doclist[1].credit = 30000.0
|
||||||
|
jv.doclist[2].debit = 30000.0
|
||||||
|
jv.submit()
|
||||||
|
|
||||||
|
self.assertTrue(webnotes.conn.get_value("GL Entry",
|
||||||
|
{"voucher_type": "Journal Voucher", "voucher_no": jv.doc.name}))
|
||||||
|
|
||||||
jv1 = webnotes.bean(copy=test_records[0])
|
jv1 = webnotes.bean(copy=test_records[0])
|
||||||
jv1.doc.posting_date = "2013-02-12"
|
|
||||||
jv1.doclist[2].account = "_Test Account Cost for Goods Sold - _TC"
|
jv1.doclist[2].account = "_Test Account Cost for Goods Sold - _TC"
|
||||||
jv1.doclist[2].cost_center = "_Test Cost Center - _TC"
|
jv1.doclist[2].cost_center = "_Test Cost Center - _TC"
|
||||||
jv1.doclist[2].debit = 20000.0
|
jv1.doclist[2].debit = 40000.0
|
||||||
jv1.doclist[1].credit = 20000.0
|
jv1.doclist[1].credit = 40000.0
|
||||||
jv1.insert()
|
jv1.submit()
|
||||||
|
|
||||||
|
self.assertTrue(webnotes.conn.get_value("GL Entry",
|
||||||
|
{"voucher_type": "Journal Voucher", "voucher_no": jv1.doc.name}))
|
||||||
|
|
||||||
|
self.assertRaises(BudgetError, jv.cancel)
|
||||||
|
|
||||||
|
webnotes.conn.set_value("Company", "_Test Company", "monthly_bgt_flag", "Ignore")
|
||||||
|
|
||||||
|
def clear_account_balance(self):
|
||||||
|
webnotes.conn.sql("""delete from `tabGL Entry`""")
|
||||||
|
|
||||||
self.assertRaises(BudgetError, jv1.submit)
|
|
||||||
|
|
||||||
|
|
||||||
test_records = [
|
test_records = [
|
||||||
[{
|
[{
|
||||||
|
@ -65,14 +65,14 @@ def save_entries(gl_map, adv_adj, update_outstanding):
|
|||||||
# toggle debit, credit if negative entry
|
# toggle debit, credit if negative entry
|
||||||
if flt(entry["debit"]) < 0 or flt(entry["credit"]) < 0:
|
if flt(entry["debit"]) < 0 or flt(entry["credit"]) < 0:
|
||||||
_swap(entry)
|
_swap(entry)
|
||||||
|
|
||||||
validate_expense_against_budget(entry)
|
|
||||||
|
|
||||||
gle = Document('GL Entry', fielddata=entry)
|
gle = Document('GL Entry', fielddata=entry)
|
||||||
gle_obj = webnotes.get_obj(doc=gle)
|
gle_obj = webnotes.get_obj(doc=gle)
|
||||||
gle_obj.validate()
|
gle_obj.validate()
|
||||||
gle.save(1)
|
gle.save(1)
|
||||||
gle_obj.on_update(adv_adj, update_outstanding)
|
gle_obj.on_update(adv_adj, update_outstanding)
|
||||||
|
|
||||||
|
validate_expense_against_budget(entry)
|
||||||
|
|
||||||
# update total debit / credit
|
# update total debit / credit
|
||||||
total_debit += flt(gle.debit)
|
total_debit += flt(gle.debit)
|
||||||
|
@ -394,17 +394,16 @@ def validate_expense_against_budget(args):
|
|||||||
budget_amount = get_allocated_budget(budget[0].distribution_id,
|
budget_amount = get_allocated_budget(budget[0].distribution_id,
|
||||||
args.posting_date, args.fiscal_year, budget[0].budget_allocated)
|
args.posting_date, args.fiscal_year, budget[0].budget_allocated)
|
||||||
|
|
||||||
month_end_date = webnotes.conn.sql("select LAST_DAY(%s)", args.posting_date)
|
args["month_end_date"] = webnotes.conn.sql("select LAST_DAY(%s)",
|
||||||
args["condition"] = " and posting_date<='%s'" % month_end_date
|
args.posting_date)[0][0]
|
||||||
action_for, action = "Monthly", monthly_action
|
action_for, action = "Monthly", monthly_action
|
||||||
|
|
||||||
elif yearly_action in ["Stop", "Warn"]:
|
elif yearly_action in ["Stop", "Warn"]:
|
||||||
budget_amount = budget[0].budget_allocated
|
budget_amount = budget[0].budget_allocated
|
||||||
action_for, action = "Monthly", yearly_action
|
action_for, action = "Monthly", yearly_action
|
||||||
print budget_amount
|
|
||||||
if action_for:
|
if action_for:
|
||||||
actual_expense = get_actual_expense(args)
|
actual_expense = get_actual_expense(args)
|
||||||
print actual_expense
|
|
||||||
if actual_expense > budget_amount:
|
if actual_expense > budget_amount:
|
||||||
webnotes.msgprint(action_for + _(" budget ") + cstr(budget_amount) +
|
webnotes.msgprint(action_for + _(" budget ") + cstr(budget_amount) +
|
||||||
_(" for account ") + args.account + _(" against cost center ") +
|
_(" for account ") + args.account + _(" against cost center ") +
|
||||||
@ -419,16 +418,13 @@ def get_allocated_budget(distribution_id, posting_date, fiscal_year, yearly_budg
|
|||||||
from `tabBudget Distribution Detail` bdd, `tabBudget Distribution` bd
|
from `tabBudget Distribution Detail` bdd, `tabBudget Distribution` bd
|
||||||
where bdd.parent=bd.name and bd.fiscal_year=%s""", fiscal_year, as_dict=1):
|
where bdd.parent=bd.name and bd.fiscal_year=%s""", fiscal_year, as_dict=1):
|
||||||
distribution.setdefault(d.month, d.percentage_allocation)
|
distribution.setdefault(d.month, d.percentage_allocation)
|
||||||
print distribution
|
|
||||||
dt = webnotes.conn.get_value("Fiscal Year", fiscal_year, "year_start_date")
|
dt = webnotes.conn.get_value("Fiscal Year", fiscal_year, "year_start_date")
|
||||||
budget_percentage = 0.0
|
budget_percentage = 0.0
|
||||||
|
|
||||||
while(dt <= getdate(posting_date)):
|
while(dt <= getdate(posting_date)):
|
||||||
print dt, posting_date
|
|
||||||
if distribution_id:
|
if distribution_id:
|
||||||
print getdate(dt).month
|
budget_percentage += distribution.get(getdate(dt).strftime("%B"), 0)
|
||||||
print distribution.get(getdate(dt).month)
|
|
||||||
budget_percentage += distribution.get(getdate(dt).month, 0)
|
|
||||||
else:
|
else:
|
||||||
budget_percentage += 100.0/12
|
budget_percentage += 100.0/12
|
||||||
|
|
||||||
@ -437,9 +433,12 @@ def get_allocated_budget(distribution_id, posting_date, fiscal_year, yearly_budg
|
|||||||
return yearly_budget * budget_percentage / 100
|
return yearly_budget * budget_percentage / 100
|
||||||
|
|
||||||
def get_actual_expense(args):
|
def get_actual_expense(args):
|
||||||
|
args["condition"] = " and posting_date<='%s'" % args.month_end_date \
|
||||||
|
if args.get("month_end_date") else ""
|
||||||
|
|
||||||
return webnotes.conn.sql("""
|
return webnotes.conn.sql("""
|
||||||
select sum(ifnull(debit, 0)) - sum(ifnull(credit, 0))
|
select sum(ifnull(debit, 0)) - sum(ifnull(credit, 0))
|
||||||
from `tabGL Entry`
|
from `tabGL Entry`
|
||||||
where account=%(account)s and cost_center=%(cost_center)s
|
where account='%(account)s' and cost_center='%(cost_center)s'
|
||||||
and fiscal_year=%(fiscal_year)s and company=%(company)s %(condition)s
|
and fiscal_year='%(fiscal_year)s' and company='%(company)s' %(condition)s
|
||||||
""", (args))[0][0]
|
""" % (args))[0][0]
|
Loading…
x
Reference in New Issue
Block a user