200 lines
5.7 KiB
ReStructuredText
200 lines
5.7 KiB
ReStructuredText
=======================
|
|
Account Budget Scenario
|
|
=======================
|
|
|
|
Imports::
|
|
|
|
>>> from decimal import Decimal
|
|
|
|
>>> from proteus import Model, Wizard
|
|
>>> from trytond.modules.account.tests.tools import (
|
|
... create_chart, create_fiscalyear, get_accounts)
|
|
>>> from trytond.modules.company.tests.tools import create_company
|
|
>>> from trytond.tests.tools import activate_modules, assertEqual
|
|
|
|
Activate modules::
|
|
|
|
>>> config = activate_modules('account_budget', create_company, create_chart)
|
|
|
|
>>> Account = Model.get('account.account')
|
|
>>> Budget = Model.get('account.budget')
|
|
>>> BudgetLine = Model.get('account.budget.line')
|
|
>>> Journal = Model.get('account.journal')
|
|
>>> Move = Model.get('account.move')
|
|
>>> Party = Model.get('party.party')
|
|
|
|
Create a fiscal year::
|
|
|
|
>>> fiscalyear = create_fiscalyear()
|
|
>>> fiscalyear.click('create_period')
|
|
>>> period = fiscalyear.periods[0]
|
|
|
|
>>> renew_fiscalyear = Wizard('account.fiscalyear.renew')
|
|
>>> renew_fiscalyear.execute('create_')
|
|
>>> next_fiscalyear, = renew_fiscalyear.actions[0]
|
|
|
|
Get accounts::
|
|
|
|
>>> accounts = get_accounts()
|
|
|
|
Create the parties::
|
|
|
|
>>> customer = Party(name='Customer')
|
|
>>> customer.save()
|
|
>>> supplier = Party(name='Supplier')
|
|
>>> supplier.save()
|
|
|
|
Create a budget::
|
|
|
|
>>> budget = Budget()
|
|
>>> budget.name = 'Budget'
|
|
>>> budget.fiscalyear = fiscalyear
|
|
>>> budget.click('update_lines')
|
|
>>> bool(budget.lines)
|
|
True
|
|
>>> line_count = len(budget.lines)
|
|
|
|
>>> revenue_budget, = BudgetLine.find(
|
|
... [('account', '=', accounts['revenue'].id)])
|
|
>>> revenue_budget.amount = Decimal(150)
|
|
>>> revenue_budget.save()
|
|
>>> expense_budget, = BudgetLine.find(
|
|
... [('account', '=', accounts['expense'].id)])
|
|
>>> expense_budget.amount = Decimal(-50)
|
|
>>> expense_budget.save()
|
|
|
|
>>> budget.click('update_lines')
|
|
>>> assertEqual(len(budget.lines), line_count)
|
|
|
|
Create moves to test the budget::
|
|
|
|
>>> journal_revenue, = Journal.find([
|
|
... ('code', '=', 'REV'),
|
|
... ])
|
|
>>> journal_expense, = Journal.find([
|
|
... ('code', '=', 'EXP'),
|
|
... ])
|
|
>>> move = Move()
|
|
>>> move.period = period
|
|
>>> move.journal = journal_revenue
|
|
>>> move.date = period.start_date
|
|
>>> line = move.lines.new()
|
|
>>> line.account = accounts['revenue']
|
|
>>> line.credit = Decimal(130)
|
|
>>> line = move.lines.new()
|
|
>>> line.account = accounts['receivable']
|
|
>>> line.debit = Decimal(130)
|
|
>>> line.party = customer
|
|
>>> move.click('post')
|
|
>>> move = Move()
|
|
>>> move.period = period
|
|
>>> move.journal = journal_expense
|
|
>>> move.date = period.start_date
|
|
>>> line = move.lines.new()
|
|
>>> line.account = accounts['expense']
|
|
>>> line.debit = Decimal(60)
|
|
>>> line = move.lines.new()
|
|
>>> line.account = accounts['receivable']
|
|
>>> line.credit = Decimal(60)
|
|
>>> line.party = supplier
|
|
>>> move.click('post')
|
|
|
|
Check actual amount of the budget::
|
|
|
|
>>> pl_budget, = budget.root_lines
|
|
>>> pl_budget.total_amount
|
|
Decimal('100.00')
|
|
>>> pl_budget.actual_amount
|
|
Decimal('70.00')
|
|
>>> pl_budget.percentage
|
|
Decimal('0.7000')
|
|
>>> revenue_budget.total_amount
|
|
Decimal('150.00')
|
|
>>> revenue_budget.actual_amount
|
|
Decimal('130.00')
|
|
>>> revenue_budget.percentage
|
|
Decimal('0.8667')
|
|
>>> expense_budget.total_amount
|
|
Decimal('-50.00')
|
|
>>> expense_budget.actual_amount
|
|
Decimal('-60.00')
|
|
>>> expense_budget.percentage
|
|
Decimal('1.2000')
|
|
|
|
Create periods::
|
|
|
|
>>> create_periods = pl_budget.click('create_periods')
|
|
>>> create_periods.execute('create_periods')
|
|
>>> revenue_budget, expense_budget = pl_budget.children[:2]
|
|
>>> len(pl_budget.periods)
|
|
12
|
|
>>> {p.total_amount for p in pl_budget.periods}
|
|
{Decimal('8.33')}
|
|
>>> len(revenue_budget.periods)
|
|
12
|
|
>>> {p.total_amount for p in revenue_budget.periods}
|
|
{Decimal('12.50')}
|
|
>>> len(expense_budget.periods)
|
|
12
|
|
>>> {p.total_amount for p in expense_budget.periods}
|
|
{Decimal('-4.16')}
|
|
|
|
Check the budget's periods::
|
|
|
|
>>> pl_budget.periods[0].actual_amount
|
|
Decimal('70.00')
|
|
>>> pl_budget.periods[0].percentage
|
|
Decimal('8.4034')
|
|
>>> pl_budget.periods[1].actual_amount
|
|
Decimal('0.00')
|
|
>>> pl_budget.periods[1].percentage
|
|
Decimal('0.0000')
|
|
>>> revenue_budget.periods[0].actual_amount
|
|
Decimal('130.00')
|
|
>>> revenue_budget.periods[0].percentage
|
|
Decimal('10.4000')
|
|
>>> revenue_budget.periods[1].actual_amount
|
|
Decimal('0.00')
|
|
>>> revenue_budget.periods[1].percentage
|
|
Decimal('0.0000')
|
|
>>> expense_budget.periods[0].actual_amount
|
|
Decimal('-60.00')
|
|
>>> expense_budget.periods[0].percentage
|
|
Decimal('14.4231')
|
|
>>> expense_budget.periods[1].actual_amount
|
|
Decimal('0.00')
|
|
>>> expense_budget.periods[1].percentage
|
|
Decimal('0.0000')
|
|
|
|
Try to set invalid ratio::
|
|
|
|
>>> period = pl_budget.periods[0]
|
|
>>> period.ratio = Decimal('0.1')
|
|
>>> budget.save()
|
|
Traceback (most recent call last):
|
|
...
|
|
BudgetValidationError: ...
|
|
>>> budget.reload()
|
|
|
|
Copy the budget without amounts::
|
|
|
|
>>> copy_budget = Wizard('account.budget.copy', [budget])
|
|
>>> copy_budget.form.name
|
|
'Budget'
|
|
>>> copy_budget.form.name = 'New Budget'
|
|
>>> copy_budget.form.fiscalyear = next_fiscalyear
|
|
>>> copy_budget.form.factor = Decimal('1.25')
|
|
>>> copy_budget.execute('copy')
|
|
>>> new_budget, = copy_budget.actions[0]
|
|
>>> new_budget.name
|
|
'New Budget'
|
|
>>> new_pl_budget, = new_budget.root_lines
|
|
>>> new_pl_budget.total_amount
|
|
Decimal('125.00')
|
|
>>> new_pl_budget.actual_amount
|
|
Decimal('0.00')
|
|
>>> new_pl_budget.percentage
|
|
Decimal('0.0000')
|
|
>>> len(new_pl_budget.periods)
|
|
0
|