Browse Source

[9.0][FIX] partner_financial_risk: Invoice refunds add risk. (#476)

* [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
pull/588/head
Carlos Dauden 7 years ago
parent
commit
5fbf1e3068
  1. 2
      partner_payment_return_risk/README.rst
  2. 30
      partner_payment_return_risk/i18n/es.po
  3. 50
      partner_payment_return_risk/models/res_partner.py
  4. 83
      partner_payment_return_risk/tests/test_payment_return_risk.py
  5. 2
      partner_payment_return_risk/views/res_partner_view.xml

2
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.
To contribute to this module, please visit https://odoo-community.org.

30
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 <carlos.dauden@tecnativa.com>\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 <carlos.dauden@tecnativa.com>\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"

50
partner_payment_return_risk/models/res_partner.py

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
# © 2016 Carlos Dauden <carlos.dauden@tecnativa.com>
# Copyright 2016 Carlos Dauden <carlos.dauden@tecnativa.com>
# 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):

83
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)

2
partner_payment_return_risk/views/res_partner_view.xml

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- © 2016 Carlos Dauden <carlos.dauden@tecnativa.com>
<!-- Copyright 2016 Carlos Dauden <carlos.dauden@tecnativa.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl-3). -->
<odoo>
<record id="res_partner_view_risk" model="ir.ui.view">

Loading…
Cancel
Save