From b6fa9fb3287c739c95eefe9a9190381c8753b3fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Tue, 11 Sep 2018 00:18:55 +0200 Subject: [PATCH] Update reconcile wizard to use write off method issue7450 review60331002 --- move.py | 35 +++++---- tests/scenario_account_reconcile.rst | 112 +++++++++++++++++++++++++++ tests/test_account.py | 5 ++ view/reconcile_show_form.xml | 8 +- 4 files changed, 140 insertions(+), 20 deletions(-) create mode 100644 tests/scenario_account_reconcile.rst diff --git a/move.py b/move.py index bb29ba9e60..76a3a942be 100644 --- a/move.py +++ b/move.py @@ -1610,7 +1610,7 @@ class Reconcile(Wizard): defaults['party'] = self.show.party.id if self.show.party else None defaults['currency_digits'] = self.show.account.company.currency.digits defaults['lines'] = self._default_lines() - defaults['write_off'] = Decimal(0) + defaults['write_off_amount'] = Decimal(0) defaults['date'] = Date.today() return defaults @@ -1666,8 +1666,8 @@ class Reconcile(Wizard): if self.show.lines: Line.reconcile(self.show.lines, - journal=self.show.journal, date=self.show.date, + writeoff=self.show.write_off, description=self.show.description) return 'next_' @@ -1690,31 +1690,34 @@ class ReconcileShow(ModelView): depends=['account', 'party']) _write_off_states = { - 'required': Bool(Eval('write_off', 0)), - 'invisible': ~Eval('write_off', 0), + 'required': Bool(Eval('write_off_amount', 0)), + 'invisible': ~Eval('write_off_amount', 0), } - _write_off_depends = ['write_off'] + _write_off_depends = ['write_off_amount'] - write_off = fields.Function(fields.Numeric('Write-Off', + write_off_amount = fields.Function(fields.Numeric('Amount', digits=(16, Eval('currency_digits', 2)), states=_write_off_states, depends=_write_off_depends + ['currency_digits']), - 'on_change_with_write_off') + 'on_change_with_write_off_amount') currency_digits = fields.Function(fields.Integer('Currency Digits'), 'on_change_with_currency_digits') - journal = fields.Many2One('account.journal', 'Journal', - states=_write_off_states, depends=_write_off_depends, - domain=[ - ('type', '=', 'write-off'), - ]) + write_off = fields.Many2One( + 'account.move.reconcile.write_off', "Write Off", + states=_write_off_states, depends=_write_off_depends) date = fields.Date('Date', states=_write_off_states, depends=_write_off_depends) description = fields.Char('Description', - states=_write_off_states, depends=_write_off_depends) + states={ + 'invisible': _write_off_states['invisible'], + }, depends=_write_off_depends) - @fields.depends('lines') - def on_change_with_write_off(self, name=None): - return sum((l.debit - l.credit) for l in self.lines) + @fields.depends('lines', 'currency_digits') + def on_change_with_write_off_amount(self, name=None): + digits = self.currency_digits or 0 + exp = Decimal(str(10.0 ** -digits)) + amount = sum(((l.debit - l.credit) for l in self.lines), Decimal(0)) + return amount.quantize(exp) @fields.depends('account') def on_change_with_currency_digits(self, name=None): diff --git a/tests/scenario_account_reconcile.rst b/tests/scenario_account_reconcile.rst new file mode 100644 index 0000000000..7d949b46c7 --- /dev/null +++ b/tests/scenario_account_reconcile.rst @@ -0,0 +1,112 @@ +========================== +Account Reconcile Scenario +========================== + +Imports:: + + >>> from decimal import Decimal + >>> from proteus import Model, Wizard + >>> from trytond.tests.tools import activate_modules + >>> from trytond.modules.company.tests.tools import create_company, \ + ... get_company + >>> from trytond.modules.account.tests.tools import create_fiscalyear, \ + ... create_chart, get_accounts + +Install account:: + + >>> config = activate_modules('account') + +Create company:: + + >>> _ = create_company() + >>> company = get_company() + +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'] + >>> expense = accounts['expense'] + >>> cash = accounts['cash'] + +Create parties:: + + >>> Party = Model.get('party.party') + >>> customer = Party(name='Customer') + >>> customer.save() + +Create Moves to reconcile:: + + >>> 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(42) + >>> line = move.lines.new() + >>> line.account = receivable + >>> line.debit = Decimal(42) + >>> line.party = customer + >>> move.save() + + >>> move = Move() + >>> move.period = period + >>> move.journal = journal_cash + >>> move.date = period.start_date + >>> line = move.lines.new() + >>> line.account = cash + >>> line.debit = Decimal(40) + >>> line = move.lines.new() + >>> line.account = receivable + >>> line.credit = Decimal(40) + >>> line.party = customer + >>> move.save() + +Create a write off method:: + + >>> Sequence = Model.get('ir.sequence') + >>> sequence_journal, = Sequence.find([('code', '=', 'account.journal')]) + >>> journal_writeoff = Journal(name='Write-Off', type='write-off', + ... sequence=sequence_journal) + >>> journal_writeoff.save() + >>> WriteOff = Model.get('account.move.reconcile.write_off') + >>> writeoff_method = WriteOff() + >>> writeoff_method.name = 'Write Off' + >>> writeoff_method.journal = journal_writeoff + >>> writeoff_method.debit_account = expense + >>> writeoff_method.credit_account = expense + >>> writeoff_method.save() + +Run Reconcile wizard:: + + >>> reconcile = Wizard('account.reconcile') + >>> reconcile.form.party == customer + True + >>> reconcile.form.write_off_amount + Decimal('0.00') + >>> len(reconcile.form.lines) + 0 + >>> reconcile.form.lines.extend(reconcile.form.lines.find()) + >>> len(reconcile.form.lines) + 2 + >>> reconcile.form.write_off_amount + Decimal('2.00') + >>> reconcile.form.write_off = writeoff_method + >>> reconcile.execute('reconcile') diff --git a/tests/test_account.py b/tests/test_account.py index 37ccd8354b..8455b825a0 100644 --- a/tests/test_account.py +++ b/tests/test_account.py @@ -1072,6 +1072,11 @@ def suite(): tearDown=doctest_teardown, encoding='utf-8', checker=doctest_checker, optionflags=doctest.REPORT_ONLY_FIRST_FAILURE)) + suite.addTests(doctest.DocFileSuite( + 'scenario_account_reconcile.rst', + tearDown=doctest_teardown, encoding='utf-8', + checker=doctest_checker, + optionflags=doctest.REPORT_ONLY_FIRST_FAILURE)) suite.addTests(doctest.DocFileSuite( 'scenario_move_cancel.rst', tearDown=doctest_teardown, encoding='utf-8', diff --git a/view/reconcile_show_form.xml b/view/reconcile_show_form.xml index 3d878fe055..ea272fa56a 100644 --- a/view/reconcile_show_form.xml +++ b/view/reconcile_show_form.xml @@ -8,12 +8,12 @@ this repository contains the full copyright notices and license terms. --> -