Browse Source

[IMP] partner_financial_risk: Split module to new partner_financial_risk_sale_order

pull/294/head
Carlos Incaser 9 years ago
parent
commit
d23eeec21b
  1. 1
      partner_financial_risk/__init__.py
  2. 6
      partner_financial_risk/__openerp__.py
  3. 1
      partner_financial_risk/models/__init__.py
  4. 60
      partner_financial_risk/models/res_partner.py
  5. 41
      partner_financial_risk/tests/test_partner_financial_risk.py
  6. 17
      partner_financial_risk/views/res_company_view.xml
  7. 25
      partner_financial_risk/views/res_partner_view.xml
  8. 3
      partner_financial_risk/wizard/__init__.py
  9. 19
      partner_financial_risk/wizard/sale_order_risk_exceeded.py
  10. 30
      partner_financial_risk/wizard/sale_order_risk_exceeded_view.xml

1
partner_financial_risk/__init__.py

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from . import models from . import models
from . import wizard

6
partner_financial_risk/__openerp__.py

@ -3,19 +3,17 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{ {
'name': 'Partner Risk',
'name': 'Partner Financial Risk',
'summary': 'Manage partner risk', 'summary': 'Manage partner risk',
'version': '9.0.1.0.0', 'version': '9.0.1.0.0',
'category': 'Sales Management', 'category': 'Sales Management',
'license': 'AGPL-3', 'license': 'AGPL-3',
'author': 'Tecnativa, Odoo Community Association (OCA)', 'author': 'Tecnativa, Odoo Community Association (OCA)',
'website': 'https://www.tecnativa.com', 'website': 'https://www.tecnativa.com',
'depends': ['sale'],
'depends': ['account'],
'data': [ 'data': [
'views/res_config_view.xml', 'views/res_config_view.xml',
'views/res_partner_view.xml', 'views/res_partner_view.xml',
'views/sale_view.xml',
'wizard/sale_order_risk_exceeded_view.xml',
], ],
'installable': True, 'installable': True,
} }

1
partner_financial_risk/models/__init__.py

@ -3,4 +3,3 @@
from . import res_company from . import res_company
from . import res_config from . import res_config
from . import res_partner from . import res_partner
from . import sale

60
partner_financial_risk/models/res_partner.py

@ -10,15 +10,6 @@ from openerp import api, fields, models
class ResPartner(models.Model): class ResPartner(models.Model):
_inherit = 'res.partner' _inherit = 'res.partner'
risk_sale_order_include = fields.Boolean(
string='Include Sales Orders', help='Full risk computation')
risk_sale_order_limit = fields.Monetary(
string='Limit Sales Orders', help='Set 0 if it is not locked')
risk_sale_order = fields.Monetary(
compute='_compute_risk_sale_order', store=True,
string='Total Sales Orders Not Invoiced',
help='Total not invoiced of sales orders in Sale Order state')
risk_invoice_draft_include = fields.Boolean( risk_invoice_draft_include = fields.Boolean(
string='Include Draft Invoices', help='Full risk computation') string='Include Draft Invoices', help='Full risk computation')
risk_invoice_draft_limit = fields.Monetary( risk_invoice_draft_limit = fields.Monetary(
@ -64,13 +55,6 @@ class ResPartner(models.Model):
string='Risk Exception', string='Risk Exception',
help='It Indicate if partner risk exceeded') help='It Indicate if partner risk exceeded')
@api.multi
@api.depends('sale_order_ids', 'sale_order_ids.invoice_pending_amount')
def _compute_risk_sale_order(self):
for partner in self:
partner.risk_sale_order = sum(
partner.sale_order_ids.mapped('invoice_pending_amount'))
@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',
@ -78,13 +62,15 @@ class ResPartner(models.Model):
def _compute_risk_invoice(self): def _compute_risk_invoice(self):
max_date = self._max_risk_date_due() max_date = self._max_risk_date_due()
for partner in self: for partner in self:
invoices = partner.invoice_ids.filtered(
invoices_out = partner.invoice_ids.filtered(
lambda x: x.type == 'out_invoice')
invoices = invoices_out.filtered(
lambda x: x.state in ['draft', 'proforma', 'proforma2']) lambda x: x.state in ['draft', 'proforma', 'proforma2'])
partner.risk_invoice_draft = sum(invoices.mapped('amount_total')) partner.risk_invoice_draft = sum(invoices.mapped('amount_total'))
invoices = partner.invoice_ids.filtered(
invoices = invoices_out.filtered(
lambda x: x.state == 'open' and x.date_due >= max_date) lambda x: x.state == 'open' and x.date_due >= max_date)
partner.risk_invoice_open = sum(invoices.mapped('residual')) partner.risk_invoice_open = sum(invoices.mapped('residual'))
invoices = partner.invoice_ids.filtered(
invoices = invoices_out.filtered(
lambda x: x.state == 'open' and x.date_due < max_date) lambda x: x.state == 'open' and x.date_due < max_date)
partner.risk_invoice_unpaid = sum(invoices.mapped('residual')) partner.risk_invoice_unpaid = sum(invoices.mapped('residual'))
@ -97,16 +83,7 @@ class ResPartner(models.Model):
partner.risk_invoice_unpaid) partner.risk_invoice_unpaid)
@api.multi @api.multi
@api.depends('risk_sale_order', 'risk_sale_order_include',
'risk_sale_order_limit',
'risk_invoice_draft', 'risk_invoice_draft_include',
'risk_invoice_draft_limit', 'risk_invoice_open',
'risk_invoice_open_include', 'risk_invoice_open_limit',
'risk_invoice_unpaid', 'risk_invoice_unpaid_include',
'risk_invoice_unpaid_limit', 'risk_account_amount',
'risk_account_amount_include', 'risk_account_amount_limit',
'credit_limit')
# @api.depends(lambda x: x._depends_list)
@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:
@ -130,27 +107,22 @@ class ResPartner(models.Model):
@api.model @api.model
def _risk_field_list(self): def _risk_field_list(self):
return [ return [
('risk_sale_order', 'risk_sale_order_limit',
'risk_sale_order_include'),
('risk_invoice_draft', 'risk_invoice_draft_limit', ('risk_invoice_draft', 'risk_invoice_draft_limit',
'risk_invoice_draft_include'),
'risk_invoice_draft_include'),
('risk_invoice_open', 'risk_invoice_open_limit', ('risk_invoice_open', 'risk_invoice_open_limit',
'risk_invoice_open_include'), 'risk_invoice_open_include'),
('risk_invoice_unpaid', 'risk_invoice_unpaid_limit', ('risk_invoice_unpaid', 'risk_invoice_unpaid_limit',
'risk_invoice_unpaid_include'),
'risk_invoice_unpaid_include'),
('risk_account_amount', 'risk_account_amount_limit', ('risk_account_amount', 'risk_account_amount_limit',
'risk_account_amount_include'), 'risk_account_amount_include'),
] ]
@api.model @api.model
def _depends_list(self):
ss = (
'risk_sale_order', 'risk_sale_order_include', 'risk_sale_order_limit',
'risk_invoice_draft', 'risk_invoice_draft_include',
'risk_invoice_draft_limit', 'risk_invoice_open',
'risk_invoice_open_include', 'risk_invoice_open_limit',
'risk_invoice_unpaid', 'risk_invoice_unpaid_include',
'risk_invoice_unpaid_limit', 'risk_account_amount',
'risk_account_amount_include', 'risk_account_amount_limit',
'credit_limit')
return ss
def _get_depends_compute_risk_exception(self):
# TODO: Improve code without lose performance
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')
return res

41
partner_financial_risk/tests/test_partner_financial_risk.py

@ -2,8 +2,6 @@
# © 2016 Carlos Dauden <carlos.dauden@tecnativa.com> # © 2016 Carlos Dauden <carlos.dauden@tecnativa.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from openerp import fields
from openerp.exceptions import UserError
from openerp.tests.common import TransactionCase from openerp.tests.common import TransactionCase
@ -14,8 +12,6 @@ class TestPartnerFinancialRisk(TransactionCase):
'name': 'Partner test', 'name': 'Partner test',
'customer': True, 'customer': True,
}) })
self.product = self.env.ref('product.product_product_2')
self.product.invoice_policy = 'order'
self.journal = self.env['account.journal'].create({ self.journal = self.env['account.journal'].create({
'type': 'sale', 'type': 'sale',
'name': 'Test Sales', 'name': 'Test Sales',
@ -23,19 +19,8 @@ class TestPartnerFinancialRisk(TransactionCase):
}) })
self.prod_account = self.env.ref('account.demo_coffee_machine_account') self.prod_account = self.env.ref('account.demo_coffee_machine_account')
self.inv_account = self.env.ref('account.demo_sale_of_land_account') self.inv_account = self.env.ref('account.demo_sale_of_land_account')
self.sale_order = self.env['sale.order'].create({
'partner_id': self.partner.id,
'pricelist_id': self.env.ref('product.list0').id,
'order_line': [(0, 0, {
'name': self.product.name,
'product_id': self.product.id,
'product_uom_qty': 1,
'product_uom': self.product.uom_id.id,
'price_unit': 100.0})],
})
self.invoice = self.env['account.invoice'].create({ self.invoice = self.env['account.invoice'].create({
'journal_id': self.journal.id, 'journal_id': self.journal.id,
# 'account_id': self.inv_account.id,
'company_id': self.env.user.company_id.id, 'company_id': self.env.user.company_id.id,
'currency_id': self.env.user.company_id.currency_id.id, 'currency_id': self.env.user.company_id.currency_id.id,
'partner_id': self.partner.id, 'partner_id': self.partner.id,
@ -47,23 +32,6 @@ class TestPartnerFinancialRisk(TransactionCase):
})] })]
}) })
def test_sale_order(self):
self.sale_order.action_confirm()
self.assertAlmostEqual(self.partner.risk_sale_order, 100.0)
invoice_so_id = self.sale_order.action_invoice_create()
self.assertAlmostEqual(self.partner.risk_invoice_draft, 600.0)
invoice_so = self.invoice.browse(invoice_so_id)
invoice_so.date_due = fields.Date.today()
invoice_so.signal_workflow('invoice_open')
self.assertAlmostEqual(self.partner.risk_invoice_open, 100.0)
self.partner.risk_invoice_open_include = True
self.assertAlmostEqual(self.partner.risk_total, 100.0)
self.assertTrue(self.partner.risk_exception)
self.partner.credit_limit = 100.0
self.assertFalse(self.partner.risk_exception)
def test_invoices(self): def test_invoices(self):
self.partner.risk_invoice_draft_include = True self.partner.risk_invoice_draft_include = True
self.assertAlmostEqual(self.partner.risk_invoice_draft, 500.0) self.assertAlmostEqual(self.partner.risk_invoice_draft, 500.0)
@ -73,6 +41,9 @@ class TestPartnerFinancialRisk(TransactionCase):
self.assertFalse(self.invoice.date_due) self.assertFalse(self.invoice.date_due)
self.partner.risk_invoice_unpaid_include = True self.partner.risk_invoice_unpaid_include = True
self.assertAlmostEqual(self.partner.risk_total, 500.0) self.assertAlmostEqual(self.partner.risk_total, 500.0)
self.partner.risk_total = 100.0
with self.assertRaises(UserError):
self.sale_order.action_confirm()
self.partner.credit_limit = 100.0
self.assertTrue(self.partner.risk_exception)
self.partner.credit_limit = 1000.0
self.assertFalse(self.partner.risk_exception)
self.partner.risk_invoice_unpaid_limit = 499.0
self.assertTrue(self.partner.risk_exception)

17
partner_financial_risk/views/res_company_view.xml

@ -1,17 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- © 2016 Carlos Dauden <carlos.dauden@tecnativa.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl-3). -->
<odoo>
<record model="ir.ui.view" id="view_company_partner_risk_form">
<field name="name">res.company.form.partner.risk</field>
<field name="inherit_id" ref="base.view_company_form"/>
<field name="model">res.company</field>
<field name="arch" type="xml">
<field name="overdue_msg" position="before">
<field name="invoice_due_margin"/>
</field>
</field>
</record>
</odoo>

25
partner_financial_risk/views/res_partner_view.xml

@ -12,14 +12,12 @@
<page name="sales_purchases" position="after"> <page name="sales_purchases" position="after">
<page name="financial_risk" string="Financial Risk" attrs="{'invisible': [('customer','=',False)]}"> <page name="financial_risk" string="Financial Risk" attrs="{'invisible': [('customer','=',False)]}">
<div> <div>
<group name="risk_misc" col="3">
<group name="risk_general" col="3">
<group name="risk_include" col="3" colspan="2" class="oe_subtotal_footer"> <group name="risk_include" col="3" colspan="2" class="oe_subtotal_footer">
<div colspan="3"> <div colspan="3">
<h2>General Limits</h2> <h2>General Limits</h2>
<br/> <br/>
</div> </div>
<field name="risk_sale_order_include"/>
<field name="risk_sale_order" nolabel="1"/>
<field name="risk_invoice_draft_include"/> <field name="risk_invoice_draft_include"/>
<field name="risk_invoice_draft" nolabel="1"/> <field name="risk_invoice_draft" nolabel="1"/>
<field name="risk_invoice_open_include"/> <field name="risk_invoice_open_include"/>
@ -34,12 +32,11 @@
<field name="credit_limit" colspan="2" groups="account.group_account_invoice"/> <field name="credit_limit" colspan="2" groups="account.group_account_invoice"/>
</group> </group>
</group> </group>
<group name="risk_sale_orders" colspan="1" class="oe_subtotal_footer">
<group name="risk_limits" colspan="1" class="oe_subtotal_footer">
<div colspan="2"> <div colspan="2">
<h2>Specific Limits</h2> <h2>Specific Limits</h2>
<br/> <br/>
</div> </div>
<field name="risk_sale_order_limit"/>
<field name="risk_invoice_draft_limit"/> <field name="risk_invoice_draft_limit"/>
<field name="risk_invoice_open_limit"/> <field name="risk_invoice_open_limit"/>
<field name="risk_invoice_unpaid_limit"/> <field name="risk_invoice_unpaid_limit"/>
@ -47,24 +44,6 @@
</group> </group>
</group> </group>
</div> </div>
<!--<group name="risk_sale_orders" string="Sales Order">-->
<!--</group>-->
<!--<group name="risk_draft_invoices" string="Not Validate Invoices">-->
<!--<field name="risk_invoice_draft_limit"/>-->
<!--<field name="risk_invoice_draft"/>-->
<!--</group>-->
<!--<group name="risk_open_invoices" string="Open Invoices">-->
<!--<field name="risk_invoice_open_limit"/>-->
<!--<field name="risk_invoice_open"/>-->
<!--</group>-->
<!--<group name="risk_unpaid_invoices" string="Unpaid Invoices">-->
<!--<field name="risk_invoice_unpaid_limit"/>-->
<!--<field name="risk_invoice_unpaid"/>-->
<!--</group>-->
<!--<group name="risk_other_account" string="Other Account">-->
<!--<field name="risk_account_amount_limit"/>-->
<!--<field name="risk_account_amount"/>-->
<!--</group>-->
</page> </page>
</page> </page>
</field> </field>

3
partner_financial_risk/wizard/__init__.py

@ -1,3 +0,0 @@
# -*- coding: utf-8 -*-
from . import sale_order_risk_exceeded

19
partner_financial_risk/wizard/sale_order_risk_exceeded.py

@ -1,19 +0,0 @@
# -*- coding: utf-8 -*-
# © 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
class SaleOrderRiskExceeded(models.TransientModel):
_name = 'sale.order.risk.exceeded'
partner_id = fields.Many2one(
comodel_name='res.partner', readonly=True, string='Customer')
exception_msg = fields.Text(readonly=True)
@api.multi
def button_continue(self):
self.ensure_one()
so = self.env['sale.order'].browse(self.env.context['active_id'])
return so.with_context(bypass_risk=True).action_confirm()

30
partner_financial_risk/wizard/sale_order_risk_exceeded_view.xml

@ -1,30 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- © 2016 Carlos Dauden <carlos.dauden@tecnativa.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl-3). -->
<odoo>
<record id="sale_order_risk_exceeded_view" model="ir.ui.view">
<field name="name">Partner risk exceeded</field>
<field name="model">sale.order.risk.exceeded</field>
<field name="arch" type="xml">
<form string="">
<p>The partner has exceeded his risk</p>
<field name="exception_msg" colspan="2" nolabel="1"/>
<group>
<field name="partner_id"/>
</group>
<footer>
<button string="Continue"
class="oe_highlight"
name="button_continue"
type="object"
groups=""
/>
<button string="Cancel"
class="oe_link"
special="cancel"
/>
</footer>
</form>
</field>
</record>
</odoo>
Loading…
Cancel
Save