You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

120 lines
5.3 KiB

  1. # -*- coding: utf-8 -*-
  2. # © 2016 Carlos Dauden <carlos.dauden@tecnativa.com>
  3. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
  4. from datetime import datetime
  5. from dateutil.relativedelta import relativedelta
  6. from openerp import api, fields, models
  7. class ResPartner(models.Model):
  8. _inherit = 'res.partner'
  9. risk_sale_order_include = fields.Boolean(
  10. string='Include Sale Orders', help='Compute in total risk')
  11. risk_sale_order_limit = fields.Monetary(
  12. string='Limit Sale Orders', help='Set 0 if it not lock')
  13. risk_sale_order = fields.Monetary(
  14. compute='_compute_risk_sale_order', store=True,
  15. string='Sale Order Not Invoiced')
  16. risk_invoice_draft_include = fields.Boolean(
  17. string='Include Draft Invoices', help='Compute in total risk')
  18. risk_invoice_draft_limit = fields.Monetary(
  19. string='Limit In Draft Invoices', help='Set 0 if it not lock')
  20. risk_invoice_draft = fields.Monetary(
  21. compute='_compute_risk_invoice', store=True,
  22. string='Not Validated Invoice')
  23. risk_invoice_open_include = fields.Boolean(
  24. string='Include Open Invoices', help='Compute in total risk')
  25. risk_invoice_open_limit = fields.Monetary(
  26. string='Limit In Open Invoices', help='Set 0 if it not lock')
  27. risk_invoice_open = fields.Monetary(
  28. compute='_compute_risk_invoice', store=True,
  29. string='Open Invoice')
  30. risk_invoice_unpaid_include = fields.Boolean(
  31. string='Include Unpaid Invoices', help='Compute in total risk')
  32. risk_invoice_unpaid_limit = fields.Monetary(
  33. string='Limit In Unpaid Invoices', help='Set 0 if it not lock')
  34. risk_invoice_unpaid = fields.Monetary(
  35. compute='_compute_risk_invoice', store=True,
  36. string='Unpaid Invoice')
  37. risk_account_amount_include = fields.Boolean(
  38. string='Include Other Account Amount', help='Compute in total risk')
  39. risk_account_amount_limit = fields.Monetary(
  40. string='Limit Other Account Amount', help='Set 0 if it not lock')
  41. risk_account_amount = fields.Monetary(
  42. compute='_compute_risk_account_amount',
  43. string='Other Account Amount')
  44. risk_total = fields.Monetary(
  45. string='Total Risk', compute='_compute_risk_exception')
  46. risk_exception = fields.Boolean(compute='_compute_risk_exception')
  47. @api.multi
  48. @api.depends('sale_order_ids', 'sale_order_ids.invoice_pending_amount')
  49. def _compute_risk_sale_order(self):
  50. for partner in self:
  51. partner.risk_sale_order = sum(
  52. partner.sale_order_ids.mapped('invoice_pending_amount'))
  53. @api.multi
  54. @api.depends('invoice_ids', 'invoice_ids.state',
  55. 'invoice_ids.amount_total', 'invoice_ids.residual',
  56. 'invoice_ids.company_id.invoice_maturity_margin')
  57. def _compute_risk_invoice(self):
  58. max_date = self._max_risk_date_due()
  59. for partner in self:
  60. invoices = partner.invoice_ids.filtered(
  61. lambda x: x.state in ['draft', 'proforma', 'proforma2'])
  62. partner.risk_invoice_draft = sum(invoices.mapped('amount_total'))
  63. invoices = partner.invoice_ids.filtered(
  64. lambda x: x.state == 'open' and x.date_due >= max_date)
  65. partner.risk_invoice_open = sum(invoices.mapped('residual'))
  66. invoices = partner.invoice_ids.filtered(
  67. lambda x: x.state == 'open' and x.date_due < max_date)
  68. partner.risk_invoice_unpaid = sum(invoices.mapped('residual'))
  69. @api.multi
  70. @api.depends('credit', 'risk_invoice_open', 'risk_invoice_unpaid')
  71. def _compute_risk_account_amount(self):
  72. for partner in self:
  73. partner.risk_account_amount = (
  74. partner.credit - partner.risk_invoice_open -
  75. partner.risk_invoice_unpaid)
  76. @api.multi
  77. @api.depends(
  78. 'risk_sale_order', 'risk_sale_order_include', 'risk_sale_order_limit',
  79. 'risk_invoice_draft', 'risk_invoice_draft_include',
  80. 'risk_invoice_draft_limit',
  81. 'risk_invoice_open', 'risk_invoice_open_include', 'risk_invoice_open_limit',
  82. 'risk_invoice_unpaid', 'risk_invoice_unpaid_include',
  83. 'risk_invoice_unpaid_limit',
  84. 'risk_account_amount', 'risk_account_amount_include',
  85. 'risk_account_amount_limit')
  86. def _compute_risk_exception(self):
  87. risk_field_list = self._risk_field_list()
  88. for partner in self:
  89. amount = 0.0
  90. for risk_field in risk_field_list:
  91. field_value = getattr(partner, risk_field, 0.0)
  92. max_value = getattr(partner, '%s_limit' % risk_field, 0.0)
  93. if max_value and field_value > max_value:
  94. partner.risk_exception = True
  95. if getattr(partner, '%s_include' % risk_field, False):
  96. amount += field_value
  97. partner.risk_total = amount
  98. if amount > partner.credit_limit:
  99. partner.risk_exception = True
  100. @api.model
  101. def _max_risk_date_due(self):
  102. return fields.Date.to_string(datetime.today().date() - relativedelta(
  103. days=self.env.user.company_id.invoice_maturity_margin))
  104. @api.model
  105. def _risk_field_list(self):
  106. return ['risk_sale_order', 'risk_invoice_draft', 'risk_invoice_open',
  107. 'risk_invoice_unpaid', 'risk_account_amount']