From 2102948a49339dd7a7bf18d619d7b8689e558eac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20=C3=89vrard?= Date: Tue, 20 Jan 2015 18:49:53 +0100 Subject: [PATCH] Report API refactorization review8831002 --- dunning.py | 14 +- letter.odt | Bin 11315 -> 12309 bytes tests/scenario_account_dunning_letter.rst | 181 ++++++++++++++++++++++ tests/test_account_dunning_letter.py | 7 +- 4 files changed, 195 insertions(+), 7 deletions(-) create mode 100644 tests/scenario_account_dunning_letter.rst diff --git a/dunning.py b/dunning.py index 09fa74289f..d0e48d04c8 100644 --- a/dunning.py +++ b/dunning.py @@ -45,7 +45,9 @@ class Letter(CompanyReport): __name__ = 'account.dunning.letter' @classmethod - def parse(cls, report, records, data, localcontext): + def get_context(cls, records, data): + report_context = super(Letter, cls).get_context(records, data) + pool = Pool() Date = pool.get('ir.date') @@ -72,11 +74,11 @@ class Letter(CompanyReport): continue letters[party] = PartyLetter(dunnings=current_dunnings, payments=current_payments) - localcontext['letters'] = letters - localcontext['today'] = Date.today() - localcontext['get_payment_amount'] = cls.get_payment_amount - localcontext['get_payment_currency'] = cls.get_payment_currency - return super(Letter, cls).parse(report, records, data, localcontext) + report_context['letters'] = letters + report_context['today'] = Date.today() + report_context['get_payment_amount'] = cls.get_payment_amount + report_context['get_payment_currency'] = cls.get_payment_currency + return report_context @staticmethod def get_party_letter(): diff --git a/letter.odt b/letter.odt index 313b03a8464659ddef98b2355582fa0b4b38b8b6..5f5f83fd67cd8556f618a4ded1725c55187e82b5 100644 GIT binary patch literal 12309 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 literal 11315 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 qAorlZQuPhJ$_@Nor{ipCgazXyMiT?w|3{6S^ diff --git a/tests/scenario_account_dunning_letter.rst b/tests/scenario_account_dunning_letter.rst new file mode 100644 index 0000000000..b014f3f50a --- /dev/null +++ b/tests/scenario_account_dunning_letter.rst @@ -0,0 +1,181 @@ +======================== +Account Dunning Scenario +======================== + +Imports:: + + >>> import datetime + >>> from dateutil.relativedelta import relativedelta + >>> from decimal import Decimal + >>> from proteus import config, Model, Wizard + >>> from trytond.modules.company.tests.tools import create_company, \ + ... get_company + >>> from trytond.modules.account.tests.tools import create_fiscalyear, \ + ... create_chart, get_accounts + >>> today = datetime.date.today() + +Create database:: + + >>> config = config.set_trytond() + >>> config.pool.test = True + +Install account_dunning_letter:: + + >>> Module = Model.get('ir.module.module') + >>> module, = Module.find([ + ... ('name', '=', 'account_dunning_letter'), + ... ]) + >>> module.click('install') + >>> Wizard('ir.module.module.install_upgrade').execute('upgrade') + +Create company:: + + >>> _ = create_company() + >>> company = get_company() + +Reload the context:: + + >>> User = Model.get('res.user') + >>> Group = Model.get('res.group') + >>> config._context = User.get_preferences(True, config.context) + +Create account admin user:: + + >>> account_admin_user = User() + >>> account_admin_user.name = 'Account Admin' + >>> account_admin_user.login = 'account_admin' + >>> account_admin_group, = Group.find([ + ... ('name', '=', 'Account Administration'), + ... ]) + >>> account_admin_user.groups.append(account_admin_group) + >>> account_admin_user.save() + +Create account user:: + + >>> account_user = User() + >>> account_user.name = 'Account' + >>> account_user.login = 'account' + >>> account_group, = Group.find([ + ... ('name', '=', 'Account'), + ... ]) + >>> account_user.groups.append(account_group) + >>> account_user.save() + +Create dunning user:: + + >>> dunning_user = User() + >>> dunning_user.name = 'Dunning' + >>> dunning_user.login = 'dunning' + >>> dunning_group, = Group.find([('name', '=', 'Dunning')]) + >>> dunning_user.groups.append(dunning_group) + >>> dunning_user.save() + +Create fiscal year:: + + >>> fiscalyear = create_fiscalyear(company) + >>> fiscalyear.click('create_period') + >>> period = fiscalyear.periods[0] + +Create chart of accounts:: + + >>> _ = create_chart(company) + >>> accounts = get_accounts(company) + >>> receivable = accounts['receivable'] + >>> revenue = accounts['revenue'] + >>> cash = accounts['cash'] + +Create dunning procedure:: + + >>> config.user = account_admin_user.id + >>> Procedure = Model.get('account.dunning.procedure') + >>> procedure = Procedure(name='Procedure') + >>> level = procedure.levels.new() + >>> level.sequence = 1 + >>> level.days = 5 + >>> level = procedure.levels.new() + >>> level.sequence = 2 + >>> level.days = 20 + >>> level = procedure.levels.new() + >>> level.sequence = 3 + >>> level.days = 40 + >>> procedure.save() + +Create parties:: + + >>> Party = Model.get('party.party') + >>> customer = Party(name='Customer') + >>> customer.dunning_procedure = procedure + >>> customer.save() + +Create some moves:: + + >>> config.user = account_user.id + >>> Journal = Model.get('account.journal') + >>> Move = Model.get('account.move') + >>> journal_revenue, = Journal.find([ + ... ('code', '=', 'REV'), + ... ]) + >>> journal_cash, = Journal.find([ + ... ('code', '=', 'CASH'), + ... ]) + >>> move = Move() + >>> move.period = period + >>> move.journal = journal_revenue + >>> move.date = period.start_date + >>> line = move.lines.new() + >>> line.account = revenue + >>> line.credit = Decimal(100) + >>> line = move.lines.new() + >>> line.account = receivable + >>> line.debit = Decimal(100) + >>> line.party = customer + >>> line.maturity_date = period.start_date + >>> move.save() + >>> reconcile1, = [l for l in move.lines if l.account == receivable] + >>> move = Move() + >>> move.period = period + >>> move.journal = journal_cash + >>> move.date = period.start_date + >>> line = move.lines.new() + >>> line.account = cash + >>> line.debit = Decimal(100) + >>> line = move.lines.new() + >>> line.account = receivable + >>> line.credit = Decimal(100) + >>> line.party = customer + >>> move.save() + >>> reconcile2, = [l for l in move.lines if l.account == receivable] + >>> reconcile_lines = Wizard('account.move.reconcile_lines', + ... [reconcile1, reconcile2]) + >>> move = Move() + >>> move.period = period + >>> move.journal = journal_revenue + >>> move.date = period.start_date + >>> line = move.lines.new() + >>> line.account = revenue + >>> line.credit = Decimal(100) + >>> line = move.lines.new() + >>> line.account = receivable + >>> line.debit = Decimal(100) + >>> line.party = customer + >>> line.maturity_date = period.start_date + >>> move.save() + >>> dunning_line, = [l for l in move.lines if l.account == receivable] + +Create dunnings:: + + >>> Dunning = Model.get('account.dunning') + >>> create_dunning = Wizard('account.dunning.create') + >>> create_dunning.form.date = period.start_date + relativedelta(days=5) + >>> create_dunning.execute('create_') + >>> dunning, = Dunning.find([]) + +Process dunning:: + + >>> process_dunning = Wizard('account.dunning.process', + ... [dunning]) + >>> process_dunning.execute('process') + >>> dunning.reload() + >>> dunning.state + u'done' + diff --git a/tests/test_account_dunning_letter.py b/tests/test_account_dunning_letter.py index b676646cb1..8d8da575b1 100644 --- a/tests/test_account_dunning_letter.py +++ b/tests/test_account_dunning_letter.py @@ -1,8 +1,10 @@ # This file is part of Tryton. The COPYRIGHT file at the top level of # this repository contains the full copyright notices and license terms. import unittest +import doctest import trytond.tests.test_tryton -from trytond.tests.test_tryton import test_view, test_depends, test_menu_action +from trytond.tests.test_tryton import (test_view, test_depends, + test_menu_action, doctest_setup, doctest_teardown) class AccountDunningLetterTestCase(unittest.TestCase): @@ -28,4 +30,7 @@ def suite(): suite = trytond.tests.test_tryton.suite() suite.addTests(unittest.TestLoader().loadTestsFromTestCase( AccountDunningLetterTestCase)) + suite.addTests(doctest.DocFileSuite('scenario_account_dunning_letter.rst', + setUp=doctest_setup, tearDown=doctest_teardown, encoding='utf-8', + optionflags=doctest.REPORT_ONLY_FIRST_FAILURE)) return suite