Browse Source

[8.0.2.0.0] partner_financial_risk

Various improvement:
1. Fix error when risk_total includes draft_invoices
2. Include Refund
3. Compute partner hierarchy
4. Add track visibility to credit limit

Improvement from:
* ee89a30f1f
* f2237b71bc
* 63abcfb519
* 1e038ee748
* 158bc9a051
pull/540/head
Andhitia Rama 7 years ago
parent
commit
c088caf5d7
  1. 2
      partner_financial_risk/__openerp__.py
  2. 6
      partner_financial_risk/models/account_invoice.py
  3. 4
      partner_financial_risk/models/res_company.py
  4. 70
      partner_financial_risk/models/res_partner.py

2
partner_financial_risk/__openerp__.py

@ -5,7 +5,7 @@
{ {
'name': 'Partner Financial Risk', 'name': 'Partner Financial Risk',
'summary': 'Manage partner risk', 'summary': 'Manage partner risk',
'version': '8.0.1.1.0',
'version': '8.0.2.0.0',
'category': 'Sales Management', 'category': 'Sales Management',
'license': 'AGPL-3', 'license': 'AGPL-3',
'author': 'Tecnativa, ' 'author': 'Tecnativa, '

6
partner_financial_risk/models/account_invoice.py

@ -13,7 +13,7 @@ class AccountInvoice(models.Model):
if self.env.context.get('bypass_risk', False): if self.env.context.get('bypass_risk', False):
return self.signal_workflow('invoice_open') return self.signal_workflow('invoice_open')
for invoice in self: for invoice in self:
partner = invoice.partner_id
partner = invoice.partner_id.commercial_partner_id
exception_msg = "" exception_msg = ""
if partner.risk_exception: if partner.risk_exception:
exception_msg = _("Financial risk exceeded.\n") exception_msg = _("Financial risk exceeded.\n")
@ -22,7 +22,9 @@ class AccountInvoice(models.Model):
partner.risk_invoice_open_limit): partner.risk_invoice_open_limit):
exception_msg = _( exception_msg = _(
"This invoice exceeds the open invoices risk.\n") "This invoice exceeds the open invoices risk.\n")
elif partner.risk_invoice_open_include and (
# If risk_invoice_draft_include this invoice included in risk_total
elif not partner.risk_invoice_draft_include and (
partner.risk_invoice_open_include and
(partner.risk_total + invoice.amount_total) > (partner.risk_total + invoice.amount_total) >
partner.credit_limit): partner.credit_limit):
exception_msg = _( exception_msg = _(

4
partner_financial_risk/models/res_company.py

@ -10,4 +10,6 @@ class ResCompany(models.Model):
invoice_unpaid_margin = fields.Integer( invoice_unpaid_margin = fields.Integer(
string="Maturity Margin", string="Maturity Margin",
help="Days after due date to set an invoice as unpaid")
help="Days after due date to set an invoice as unpaid."
"The change of this field recompute all partners risk,"
"be patient.")

70
partner_financial_risk/models/res_partner.py

@ -56,38 +56,61 @@ class ResPartner(models.Model):
help='It Indicate if partner risk exceeded') help='It Indicate if partner risk exceeded')
credit_policy = fields.Char() credit_policy = fields.Char()
risk_allow_edit = fields.Boolean(compute='_compute_risk_allow_edit') risk_allow_edit = fields.Boolean(compute='_compute_risk_allow_edit')
credit_limit = fields.Float(track_visibility='onchange')
@api.multi @api.multi
def _compute_risk_allow_edit(self): def _compute_risk_allow_edit(self):
is_editable = self.env.user.has_group( is_editable = self.env.user.has_group(
'base.group_sale_manager') or self.env.user.has_group( 'base.group_sale_manager') or self.env.user.has_group(
'account.group_account_manager') 'account.group_account_manager')
for partner in self:
for partner in self.filtered('customer'):
partner.risk_allow_edit = is_editable partner.risk_allow_edit = is_editable
@api.multi @api.multi
@api.depends('invoice_ids', 'invoice_ids.state', @api.depends('invoice_ids', 'invoice_ids.state',
'invoice_ids.amount_total', 'invoice_ids.residual', 'invoice_ids.amount_total', 'invoice_ids.residual',
'invoice_ids.company_id.invoice_unpaid_margin')
'invoice_ids.company_id.invoice_unpaid_margin',
'child_ids.invoice_ids', 'child_ids.invoice_ids.state',
'child_ids.invoice_ids.amount_total',
'child_ids.invoice_ids.residual',
'child_ids.invoice_ids.company_id.invoice_unpaid_margin')
def _compute_risk_invoice(self): def _compute_risk_invoice(self):
def sum_group(group, field):
return sum([x[field] for x in group if
x['partner_id'][0] in partner_ids])
customers = self.filtered('customer')
if not customers:
return # pragma: no cover
max_date = self._max_risk_date_due() max_date = self._max_risk_date_due()
for partner in self:
invoices_out = partner.invoice_ids.filtered(
lambda x: x.type == 'out_invoice')
invoices = invoices_out.filtered(
lambda x: x.state in ['draft', 'proforma', 'proforma2'])
partner.risk_invoice_draft = sum(invoices.mapped('amount_total'))
invoices = invoices_out.filtered(
lambda x: x.state == 'open' and x.date_due >= max_date)
partner.risk_invoice_open = sum(invoices.mapped('residual'))
invoices = invoices_out.filtered(
lambda x: x.state == 'open' and x.date_due < max_date)
partner.risk_invoice_unpaid = sum(invoices.mapped('residual'))
AccountInvoice = self.env['account.invoice']
partners = customers | customers.mapped('child_ids')
domain = [('type', 'in', ['out_invoice', 'out_refund']),
('partner_id', 'in', partners.ids)]
draft_group = AccountInvoice.read_group(
domain + [('state', 'in', ['draft', 'proforma', 'proforma2'])],
['partner_id', 'amount_total'],
['partner_id'])
open_group = AccountInvoice.read_group(
domain + [('state', '=', 'open'), ('date_due', '>=', max_date)],
['partner_id', 'residual'],
['partner_id'])
unpaid_group = AccountInvoice.read_group(
domain + [('state', '=', 'open'), '|',
('date_due', '=', False), ('date_due', '<', max_date)],
['partner_id', 'residual'],
['partner_id'])
for partner in customers:
partner_ids = (partner | partner.child_ids).ids
partner.risk_invoice_draft = sum_group(draft_group, 'amount_total')
partner.risk_invoice_open = sum_group(open_group, 'residual')
partner.risk_invoice_unpaid = sum_group(unpaid_group, 'residual')
@api.multi @api.multi
@api.depends('credit', 'risk_invoice_open', 'risk_invoice_unpaid')
@api.depends('credit', 'risk_invoice_open', 'risk_invoice_unpaid',
'child_ids.credit', 'child_ids.risk_invoice_open',
'child_ids.risk_invoice_unpaid')
def _compute_risk_account_amount(self): def _compute_risk_account_amount(self):
for partner in self:
for partner in self.filtered('customer'):
partner.risk_account_amount = ( partner.risk_account_amount = (
partner.credit - partner.risk_invoice_open - partner.credit - partner.risk_invoice_open -
partner.risk_invoice_unpaid) partner.risk_invoice_unpaid)
@ -96,7 +119,7 @@ class ResPartner(models.Model):
@api.depends(lambda x: x._get_depends_compute_risk_exception()) @api.depends(lambda x: x._get_depends_compute_risk_exception())
def _compute_risk_exception(self): def _compute_risk_exception(self):
risk_field_list = self._risk_field_list() risk_field_list = self._risk_field_list()
for partner in self:
for partner in self.filtered('customer'):
amount = 0.0 amount = 0.0
for risk_field in risk_field_list: for risk_field in risk_field_list:
field_value = getattr(partner, risk_field[0], 0.0) field_value = getattr(partner, risk_field[0], 0.0)
@ -106,7 +129,7 @@ class ResPartner(models.Model):
if getattr(partner, risk_field[2], False): if getattr(partner, risk_field[2], False):
amount += field_value amount += field_value
partner.risk_total = amount partner.risk_total = amount
if amount > partner.credit_limit:
if partner.credit_limit and amount > partner.credit_limit:
partner.risk_exception = True partner.risk_exception = True
@api.model @api.model
@ -129,12 +152,11 @@ class ResPartner(models.Model):
@api.model @api.model
def _get_depends_compute_risk_exception(self): def _get_depends_compute_risk_exception(self):
# TODO: Improve code without performance loss
tuple_list = self._risk_field_list()
res = [x[0] for x in tuple_list]
res.extend([x[1] for x in tuple_list])
res.extend([x[2] for x in tuple_list])
res.append('credit_limit')
res = []
for x in self._risk_field_list():
res.extend((x[0], x[1], x[2], 'child_ids.%s' % x[0],
'child_ids.%s' % x[1], 'child_ids.%s' % x[2]))
res.extend(('credit_limit', 'child_ids.credit_limit'))
return res return res
@api.model @api.model

Loading…
Cancel
Save