From c0ece2d255fc2cdfb4fb7d9a6662469d90dc64f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Tue, 27 Sep 2016 12:16:22 +0200 Subject: [PATCH] Ask payment journal for each currency issue5888 review26671002 --- CHANGELOG | 1 + __init__.py | 2 +- account.py | 88 +++++++++++++++---- account.xml | 6 +- tests/scenario_account_payment.rst | 4 +- ...xml => move_line_pay_ask_journal_form.xml} | 7 +- 6 files changed, 80 insertions(+), 28 deletions(-) rename view/{move_line_pay_start_form.xml => move_line_pay_ask_journal_form.xml} (63%) diff --git a/CHANGELOG b/CHANGELOG index d8815d9fd1..3fd5710bf7 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,4 @@ +* Ask payment journal for each currency * Decrease amount to pay of invoice * Add group Payment Approval diff --git a/__init__.py b/__init__.py index 189b0053e0..9d79360a91 100644 --- a/__init__.py +++ b/__init__.py @@ -12,7 +12,7 @@ def register(): Payment, MoveLine, ProcessPaymentStart, - PayLineStart, + PayLineAskJournal, Configuration, Invoice, module='account_payment', type_='model') diff --git a/account.py b/account.py index 63e2b9bbbb..8d4cccd3dd 100644 --- a/account.py +++ b/account.py @@ -10,12 +10,14 @@ from sql.functions import Abs from trytond.pool import Pool, PoolMeta from trytond.model import ModelView, fields from trytond.pyson import Eval, If, Bool -from trytond.wizard import Wizard, StateView, StateAction, Button +from trytond.wizard import (Wizard, StateView, StateAction, StateTransition, + Button) from trytond.transaction import Transaction from .payment import KINDS -__all__ = ['MoveLine', 'PayLine', 'PayLineStart', 'Configuration', 'Invoice'] +__all__ = ['MoveLine', 'PayLine', 'PayLineAskJournal', 'Configuration', + 'Invoice'] class MoveLine: @@ -121,33 +123,80 @@ class MoveLine: pass -class PayLineStart(ModelView): +class PayLineAskJournal(ModelView): 'Pay Line' - __name__ = 'account.move.line.pay.start' + __name__ = 'account.move.line.pay.ask_journal' + company = fields.Many2One('company.company', 'Company', readonly=True) + currency = fields.Many2One('currency.currency', 'Currency', readonly=True) journal = fields.Many2One('account.payment.journal', 'Journal', required=True, domain=[ - ('company', '=', Eval('context', {}).get('company', -1)), - ]) - date = fields.Date('Date', required=True) + ('company', '=', Eval('company', -1)), + ('currency', '=', Eval('currency', -1)), + ], + depends=['company', 'currency']) - @staticmethod - def default_date(): - pool = Pool() - Payment = pool.get('account.payment') - return Payment.default_date() + journals = fields.One2Many( + 'account.payment.journal', None, 'Journals', readonly=True) class PayLine(Wizard): 'Pay Line' __name__ = 'account.move.line.pay' - start = StateView('account.move.line.pay.start', - 'account_payment.move_line_pay_start_view_form', [ + start = StateTransition() + ask_journal = StateView('account.move.line.pay.ask_journal', + 'account_payment.move_line_pay_ask_journal_view_form', [ Button('Cancel', 'end', 'tryton-cancel'), - Button('Pay', 'pay', 'tryton-ok', default=True), + Button('Pay', 'start', 'tryton-ok', default=True), ]) pay = StateAction('account_payment.act_payment_form') - def get_payment(self, line): + def _get_journals(self): + journals = {} + for journal in getattr(self.ask_journal, 'journals', []): + journals[self._get_journal_key(journal)] = journal + if getattr(self.ask_journal, 'journal', None): + journal = self.ask_journal.journal + journals[self._get_journal_key(journal)] = journal + return journals + + def _get_journal_key(self, record): + pool = Pool() + Journal = pool.get('account.payment.journal') + Line = pool.get('account.move.line') + if isinstance(record, Journal): + return (record.company, record.currency) + elif isinstance(record, Line): + company = record.move.company + currency = record.second_currency or company.currency + return (company, currency) + + def _missing_journal(self): + pool = Pool() + Line = pool.get('account.move.line') + + lines = Line.browse(Transaction().context['active_ids']) + journals = self._get_journals() + + for line in lines: + key = self._get_journal_key(line) + if key not in journals: + return key + + def transition_start(self): + if self._missing_journal(): + return 'ask_journal' + else: + return 'pay' + + def default_ask_journal(self, fields): + values = {} + company, currency = self._missing_journal()[:2] + values['company'] = company.id + values['currency'] = currency.id + values['journals'] = [j.id for j in self._get_journals().itervalues()] + return values + + def get_payment(self, line, journals): pool = Pool() Payment = pool.get('account.payment') @@ -155,13 +204,13 @@ class PayLine(Wizard): kind = 'receivable' else: kind = 'payable' + journal = journals[self._get_journal_key(line)] return Payment( company=line.move.company, - journal=self.start.journal, + journal=journal, party=line.party, kind=kind, - date=self.start.date, amount=line.payment_amount, line=line, ) @@ -172,10 +221,11 @@ class PayLine(Wizard): Payment = pool.get('account.payment') lines = Line.browse(Transaction().context['active_ids']) + journals = self._get_journals() payments = [] for line in lines: - payments.append(self.get_payment(line)) + payments.append(self.get_payment(line, journals)) Payment.save(payments) return action, { 'res_id': [p.id for p in payments], diff --git a/account.xml b/account.xml index 43b6937423..1c18d49683 100644 --- a/account.xml +++ b/account.xml @@ -56,10 +56,10 @@ this repository contains the full copyright notices and license terms. --> - - account.move.line.pay.start + + account.move.line.pay.ask_journal form - move_line_pay_start_form + move_line_pay_ask_journal_form diff --git a/tests/scenario_account_payment.rst b/tests/scenario_account_payment.rst index 0f3881f926..3e92180df8 100644 --- a/tests/scenario_account_payment.rst +++ b/tests/scenario_account_payment.rst @@ -66,7 +66,7 @@ Partially pay line:: >>> line, = [l for l in move.lines if l.account == payable] >>> pay_line = Wizard('account.move.line.pay', [line]) >>> pay_line.form.journal = payment_journal - >>> pay_line.execute('pay') + >>> pay_line.execute('start') >>> payment, = Payment.find() >>> payment.party == supplier True @@ -89,7 +89,7 @@ Partially fail to pay the remaining:: >>> pay_line = Wizard('account.move.line.pay', [line]) >>> pay_line.form.journal = payment_journal - >>> pay_line.execute('pay') + >>> pay_line.execute('start') >>> payment, = Payment.find([('state', '=', 'draft')]) >>> payment.amount Decimal('30.00') diff --git a/view/move_line_pay_start_form.xml b/view/move_line_pay_ask_journal_form.xml similarity index 63% rename from view/move_line_pay_start_form.xml rename to view/move_line_pay_ask_journal_form.xml index c5b3ccddb8..fea8aafd01 100644 --- a/view/move_line_pay_start_form.xml +++ b/view/move_line_pay_ask_journal_form.xml @@ -1,9 +1,10 @@ -
+ +