From 5fbf1e30682235f6e666729422159a88d9fabd50 Mon Sep 17 00:00:00 2001 From: Carlos Dauden Date: Mon, 9 Oct 2017 00:50:24 +0200 Subject: [PATCH] [9.0][FIX] partner_financial_risk: Invoice refunds add risk. (#476) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [9.0][FIX] partner_financial_risk: Invoice refunds add risk. Date_maturity change * [9.0][FIX] partner_financial_risk: Recompute when invoice_unpaid_margin change * [9.0][IMP] partner_financial_risk: Improve heritability * [9.0][IMP] partner_payment_return_risk: Unify with base method and split amount * [9.0][IMP] partner_financial_risk: Improve code. Include archived contacts * [9.0][WIP] partner_financial_risk: Different model in read_group list * [9.0][WIP] partner_financial_risk: Invoices amount from account.move.line * [9.0][WIP] partner_financial_risk: Change "©" to Copyright * [9.0][IMP] partner_financial_risk: invoice_unpaid_margin in depends * [9.0][IMP] partner_financial_risk: Descriptions and translation --- partner_payment_return_risk/README.rst | 2 +- partner_payment_return_risk/i18n/es.po | 30 ++++--- .../models/res_partner.py | 50 +++++++---- .../tests/test_payment_return_risk.py | 83 +++++++++++++++---- .../views/res_partner_view.xml | 2 +- 5 files changed, 117 insertions(+), 50 deletions(-) diff --git a/partner_payment_return_risk/README.rst b/partner_payment_return_risk/README.rst index 1b376a392..b3c689351 100644 --- a/partner_payment_return_risk/README.rst +++ b/partner_payment_return_risk/README.rst @@ -63,4 +63,4 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -To contribute to this module, please visit https://odoo-community.org. \ No newline at end of file +To contribute to this module, please visit https://odoo-community.org. diff --git a/partner_payment_return_risk/i18n/es.po b/partner_payment_return_risk/i18n/es.po index f10d66e0f..88962ce06 100644 --- a/partner_payment_return_risk/i18n/es.po +++ b/partner_payment_return_risk/i18n/es.po @@ -6,21 +6,25 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 9.0c\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-10 18:34+0100\n" -"PO-Revision-Date: 2017-01-10 18:40+0100\n" +"POT-Creation-Date: 2017-10-08 23:50+0200\n" +"PO-Revision-Date: 2017-10-08 23:53+0200\n" +"Last-Translator: Carlos Dauden \n" "Language-Team: \n" +"Language: es_ES\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.8.7.1\n" -"Last-Translator: Carlos Dauden \n" -"Language: es_ES\n" #. module: partner_payment_return_risk #: model:ir.model.fields,help:partner_payment_return_risk.field_res_partner_risk_payment_return_include -msgid "Full risk computation" -msgstr "Cálculo de riesgo completo" +msgid "" +"Full risk computation.\n" +"Residual amount of move lines not reconciled with returned lines related." +msgstr "" +"Computar en riesgo total.\n" +"Importe residual de apuntes no conciliados relacionados con apuntes devueltos." #. module: partner_payment_return_risk #: model:ir.model.fields,field_description:partner_payment_return_risk.field_res_partner_risk_payment_return_include @@ -37,6 +41,11 @@ msgstr "Límite en pagos devueltos" msgid "Partner" msgstr "Empresa" +#. module: partner_payment_return_risk +#: model:ir.model.fields,help:partner_payment_return_risk.field_res_partner_risk_payment_return +msgid "Residual amount of move lines not reconciled with returned lines related." +msgstr "Importe residual de apuntes no conciliados relacionados con apuntes devueltos." + #. module: partner_payment_return_risk #: model:ir.model.fields,help:partner_payment_return_risk.field_res_partner_risk_payment_return_limit msgid "Set 0 if it is not locked" @@ -44,10 +53,5 @@ msgstr "Establece 0 si no está bloqueado" #. module: partner_payment_return_risk #: model:ir.model.fields,field_description:partner_payment_return_risk.field_res_partner_risk_payment_return -msgid "Total Returned Invoices" -msgstr "Total facturas devueltas" - -#. module: partner_payment_return_risk -#: model:ir.model.fields,help:partner_payment_return_risk.field_res_partner_risk_payment_return -msgid "Total returned invoices in Open state" -msgstr "Total facturas devueltas en estado abierto" +msgid "Total Payments Returns" +msgstr "Total pagos devueltos" diff --git a/partner_payment_return_risk/models/res_partner.py b/partner_payment_return_risk/models/res_partner.py index dc2481fec..16ccba941 100644 --- a/partner_payment_return_risk/models/res_partner.py +++ b/partner_payment_return_risk/models/res_partner.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# © 2016 Carlos Dauden +# Copyright 2016 Carlos Dauden # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from openerp import api, fields, models @@ -9,27 +9,43 @@ class ResPartner(models.Model): _inherit = 'res.partner' risk_payment_return_include = fields.Boolean( - string='Include Payments Returns', help='Full risk computation') + string='Include Payments Returns', + help='Full risk computation.\n' + 'Residual amount of move lines not reconciled with returned ' + 'lines related.') risk_payment_return_limit = fields.Monetary( string='Limit Payments Returns', help='Set 0 if it is not locked') risk_payment_return = fields.Monetary( - compute='_compute_risk_payment_return', store=True, - string='Total Returned Invoices', - help='Total returned invoices in Open state') + compute='_compute_risk_account_amount', store=True, + string='Total Payments Returns', + help='Residual amount of move lines not reconciled with returned ' + 'lines related.') + + @api.model + def _risk_account_groups(self): + res = super(ResPartner, self)._risk_account_groups() + res['open']['domain'] += [ + ('partial_reconcile_returned_ids', '=', False), + ] + res['unpaid']['domain'] += [ + ('partial_reconcile_returned_ids', '=', False), + ] + res['returned'] = { + 'domain': [('reconciled', '=', False), + ('account_id.internal_type', '=', 'receivable'), + ('partial_reconcile_returned_ids', '!=', False)], + 'fields': ['partner_id', 'account_id', 'amount_residual'], + 'group_by': ['partner_id', 'account_id'] + } + return res @api.multi - @api.depends('invoice_ids.state', 'invoice_ids.returned_payment') - def _compute_risk_payment_return(self): - AccountInvoice = self.env['account.invoice'] - for partner in self: - partner.risk_payment_return = AccountInvoice.read_group( - [('partner_id', '=', partner.id), - ('returned_payment', '=', True), - ('state', '=', 'open'), - ], - ['residual'], - [] - )[0]['residual'] + def _prepare_risk_account_vals(self, groups): + vals = super(ResPartner, self)._prepare_risk_account_vals(groups) + vals['risk_payment_return'] = sum( + reg['amount_residual'] for reg in groups['returned']['read_group'] + if reg['partner_id'][0] == self.id) + return vals @api.model def _risk_field_list(self): diff --git a/partner_payment_return_risk/tests/test_payment_return_risk.py b/partner_payment_return_risk/tests/test_payment_return_risk.py index 70dcae599..9385191f0 100644 --- a/partner_payment_return_risk/tests/test_payment_return_risk.py +++ b/partner_payment_return_risk/tests/test_payment_return_risk.py @@ -6,33 +6,80 @@ from openerp.tests import common class TestPartnerPaymentReturnRisk(common.SavepointCase): - @classmethod def setUpClass(cls): super(TestPartnerPaymentReturnRisk, cls).setUpClass() - cls.partner = cls.env['res.partner'].create({ - 'name': 'Test partner', - 'risk_payment_return_include': True, - 'risk_payment_return_limit': 50.0, + cls.journal = cls.env['account.journal'].create({ + 'name': 'Test Sales Journal', + 'code': 'tVEN', + 'type': 'sale', + 'update_posted': True, + }) + cls.bank_journal = cls.env['account.journal'].create({ + 'name': 'Test Bank Journal', + 'code': 'BANK', + 'type': 'bank', + 'update_posted': True, + }) + cls.account_type = cls.env['account.account.type'].create({ + 'name': 'Test', + 'type': 'receivable', + }) + cls.account = cls.env['account.account'].create({ + 'name': 'Test account', + 'code': 'TEST', + 'user_type_id': cls.account_type.id, + 'reconcile': True, }) - cls.user_type = cls.env.ref('account.data_account_type_revenue') + cls.account_income = cls.env['account.account'].create({ + 'name': 'Test income account', + 'code': 'INCOME', + 'user_type_id': cls.env['account.account.type'].create( + {'name': 'Test income'}).id, + }) + cls.partner = cls.env['res.partner'].create({'name': 'Test'}) cls.invoice = cls.env['account.invoice'].create({ + 'journal_id': cls.journal.id, + 'account_id': cls.account.id, + 'company_id': cls.env.user.company_id.id, + 'currency_id': cls.env.user.company_id.currency_id.id, 'partner_id': cls.partner.id, 'invoice_line_ids': [(0, 0, { - 'name': 'Product Test', - 'quantity': 1.0, - 'uom_id': cls.env.ref('product.product_uom_unit').id, - 'price_unit': 100.0, - 'account_id': cls.env['account.account'].search([ - ('user_type_id', '=', cls.user_type.id)], limit=1).id, + 'account_id': cls.account_income.id, + 'name': 'Test line', + 'price_unit': 50, + 'quantity': 10, })] }) + cls.reason = cls.env['payment.return.reason'].create({ + 'code': 'RTEST', + 'name': 'Reason Test' + }) + cls.invoice.signal_workflow('invoice_open') + cls.receivable_line = cls.invoice.move_id.line_ids.filtered( + lambda x: x.account_id.internal_type == 'receivable') + # Invert the move to simulate the payment + cls.payment_move = cls.invoice.move_id.copy({ + 'journal_id': cls.bank_journal.id + }) + for move_line in cls.payment_move.line_ids: + move_line.with_context(check_move_validity=False).write({ + 'debit': move_line.credit, 'credit': move_line.debit}) + cls.payment_line = cls.payment_move.line_ids.filtered( + lambda x: x.account_id.internal_type == 'receivable') + # Reconcile both + (cls.receivable_line | cls.payment_line).reconcile() + # Create payment return + cls.payment_return = cls.env['payment.return'].create( + {'journal_id': cls.bank_journal.id, + 'line_ids': [ + (0, 0, {'partner_id': cls.partner.id, + 'move_line_ids': [(6, 0, cls.payment_line.ids)], + 'amount': cls.payment_line.credit})]}) def test_payment_return_risk(self): - self.invoice.signal_workflow('invoice_open') - # Partner risk is zero because invoice is not returned self.assertAlmostEqual(self.partner.risk_payment_return, 0.0) - # We simulate that the invoice is returned - self.invoice.returned_payment = True - # Partner risk has increased - self.assertAlmostEqual(self.partner.risk_payment_return, 100.0) + self.payment_return.action_confirm() + self.assertAlmostEqual(self.partner.risk_payment_return, 500.0) + self.payment_return.action_cancel() + self.assertAlmostEqual(self.partner.risk_payment_return, 0.0) diff --git a/partner_payment_return_risk/views/res_partner_view.xml b/partner_payment_return_risk/views/res_partner_view.xml index 1349f131c..64fd72985 100644 --- a/partner_payment_return_risk/views/res_partner_view.xml +++ b/partner_payment_return_risk/views/res_partner_view.xml @@ -1,5 +1,5 @@ -