Port Dunning fees to the new API, activate the tests for 8.0

This commit is contained in:
Guewen Baconnier
2014-11-03 10:19:50 +01:00
parent 8ca3672ba8
commit d9f6644ba1
7 changed files with 65 additions and 84 deletions

View File

@@ -28,8 +28,9 @@
'website': 'http://www.camptocamp.com',
'data': ['view/policy_view.xml',
'view/line_view.xml',
'report/report.xml',
# 'report/report.xml',
'security/ir.model.access.csv'],
],
'demo': [],
'test': [],
'installable': True,

View File

@@ -18,16 +18,16 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp.osv import orm
from openerp import models, api
class FeesComputer(orm.BaseModel):
class FeesComputer(models.BaseModel):
"""Model that compute dunnig fees.
This class does not need any database storage as
it contains pure logic.
It inherits form ``orm.BaseModel`` to benefit of orm facility
It inherits form ``models.BaseModel`` to benefit of orm facility
Similar to AbstractModel but log access and actions
"""
@@ -38,16 +38,18 @@ class FeesComputer(orm.BaseModel):
_register = True
_transient = False
@api.model
def _get_compute_fun(self, level_fees_type):
"""Retrieve function of class that should compute the fees based on type
"""Retrieve function of class that should compute the fees based
on type
:param level_fee_type: type exisiting in model
:param level_fee_type: type existing in model
`credit.control.policy.level`
for field dunning_fees_type
:returns: a function of class :class:`FeesComputer`
with following signature
self, cr, uid, credit_line (record), context
self, credit_line (record)
"""
if level_fees_type == 'fixed':
@@ -56,33 +58,30 @@ class FeesComputer(orm.BaseModel):
raise NotImplementedError('fees type %s is not supported' %
level_fees_type)
def _compute_fees(self, cr, uid, credit_line_ids, context=None):
"""Compute fees for `credit_line_ids` parameter
@api.model
def _compute_fees(self, credit_lines):
"""Compute fees for `credit_lines` parameter
Fees amount is written on credit line in field dunning_fees_amount
Fees amount is written on credit lines in the field dunning_fees_amount
:param credit_line_ids: list of `credit.control.line` ids
:param credit_lines: recordset of `credit.control.line`
:returns: `credit_line_ids` list of `credit.control.line` ids
:returns: recordset of `credit.control.line`
"""
if context is None:
context = {}
if not credit_line_ids:
return credit_line_ids
c_model = self.pool['credit.control.line']
credit_lines = c_model.browse(cr, uid, credit_line_ids,
context=context)
if not credit_lines:
return credit_lines
for credit in credit_lines:
# if there is no dependence between generated credit lines
# this could be threaded
self._compute(cr, uid, credit, context=context),
return credit_line_ids
self._compute(credit)
return credit_lines
def _compute(self, cr, uid, credit_line, context=None):
@api.model
def _compute(self, credit_line):
"""Compute fees for a given credit line
Fees amount is written on credit line in field dunning_fees_amount
Fees amount is written on credit line in then field dunning_fees_amount
:param credit_line: credit line record
@@ -90,13 +89,13 @@ class FeesComputer(orm.BaseModel):
"""
fees_type = credit_line.policy_level_id.dunning_fees_type
compute = self._get_compute_fun(fees_type)
fees = compute(cr, uid, credit_line, context=context)
fees = compute(credit_line)
if fees:
credit_line.write({'dunning_fees_amount': fees},
context=context)
credit_line.write({'dunning_fees_amount': fees})
return credit_line
def compute_fixed_fees(self, cr, uid, credit_line, context=None):
@api.model
def compute_fixed_fees(self, credit_line):
"""Compute fees amount for fixed fees.
Correspond to the fixed dunning fees type
@@ -109,7 +108,6 @@ class FeesComputer(orm.BaseModel):
:return: fees amount float (in credit line currency)
"""
currency_model = self.pool['res.currency']
credit_currency = credit_line.currency_id
level = credit_line.policy_level_id
fees_amount = level.dunning_fixed_amount
@@ -119,6 +117,4 @@ class FeesComputer(orm.BaseModel):
if fees_currency == credit_currency:
return fees_amount
else:
return currency_model.compute(cr, uid, fees_currency.id,
credit_currency.id, fees_amount,
context=context)
return fees_currency.compute(fees_amount, credit_currency)

View File

@@ -18,12 +18,12 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp.osv import orm, fields
from openerp import models, fields
class credit_control_line(orm.Model):
class CreditControlLine(models.Model):
"""Add dunning_fees_amount_fees field"""
_inherit = "credit.control.line"
_columns = {'dunning_fees_amount': fields.float('Fees')}
dunning_fees_amount = fields.Float(string='Fees')

View File

@@ -18,19 +18,23 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp.osv import orm, fields
from openerp import models, fields
class credit_control_policy(orm.Model):
class CreditControlPolicy(models.Model):
"""ADD dunning fees fields"""
_inherit = "credit.control.policy.level"
_columns = {'dunning_product_id': fields.many2one('product.product',
'Fees Product'),
'dunning_fixed_amount': fields.float('Fees Fixed Amount'),
'dunning_currency_id': fields.many2one('res.currency',
'Fees currency'),
# planned type are fixed, percent, compound
'dunning_fees_type': fields.selection([('fixed', 'Fixed')])}
_defaults = {'dunning_fees_type': 'fixed'}
dunning_product_id = fields.Many2one('product.product',
string='Fees Product')
dunning_fixed_amount = fields.Float(string='Fees Fixed Amount')
dunning_currency_id = fields.Many2one('res.currency',
string='Fees currency')
# planned type are fixed, percent, compound
dunning_fees_type = fields.Selection([('fixed', 'Fixed')],
string='Type',
default='fixed')

View File

@@ -18,22 +18,19 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp.osv import orm
from openerp import models, api
class credit_control_run(orm.Model):
class CreditControlRun(models.Model):
"""Add computation of fees"""
_inherit = "credit.control.run"
def _generate_credit_lines(self, cr, uid, run_id, context=None):
@api.multi
@api.returns('credit.control.line')
def _generate_credit_lines(self):
"""Override method to add fees computation"""
credit_line_ids = super(credit_control_run,
self)._generate_credit_lines(
cr,
uid,
run_id,
context=context)
fees_model = self.pool['credit.control.dunning.fees.computer']
fees_model._compute_fees(cr, uid, credit_line_ids, context=context)
return credit_line_ids
credit_lines = super(CreditControlRun, self)._generate_credit_lines()
fees_model = self.env['credit.control.dunning.fees.computer']
fees_model._compute_fees(credit_lines)
return credit_lines

View File

@@ -19,5 +19,3 @@
#
##############################################################################
from . import test_fees_generation
checks = [test_fees_generation]

View File

@@ -19,28 +19,21 @@
#
##############################################################################
from mock import MagicMock
import openerp.tests.common as test_common
from openerp.tests import common
class FixedFeesTester(test_common.TransactionCase):
@common.at_install(True)
@common.post_install(True)
class FixedFeesTester(common.TransactionCase):
def setUp(self):
"""Initialize credit control level mock to test fees computations"""
super(FixedFeesTester, self).setUp()
self.currency_model = self.registry('res.currency')
self.euro = self.currency_model.search(self.cr, self.uid,
[('name', '=', 'EUR')])
self.currency_model = self.env['res.currency']
self.euro = self.currency_model.search([('name', '=', 'EUR')])
self.assertTrue(self.euro)
self.euro = self.registry('res.currency').browse(self.cr,
self.uid,
self.euro[0])
self.usd = self.currency_model.search(self.cr, self.uid,
[('name', '=', 'USD')])
self.usd = self.currency_model.search([('name', '=', 'USD')])
self.assertTrue(self.usd)
self.usd = self.registry('res.currency').browse(self.cr,
self.uid,
self.usd[0])
self.euro_level = MagicMock(name='Euro policy level')
self.euro_level.dunning_fixed_amount = 5.0
@@ -51,9 +44,7 @@ class FixedFeesTester(test_common.TransactionCase):
self.usd_level.dunning_fixed_amount = 5.0
self.usd_level.dunning_currency_id = self.usd
self.usd_level.dunning_type = 'fixed'
self.dunning_model = self.registry(
'credit.control.dunning.fees.computer'
)
self.dunning_model = self.env['credit.control.dunning.fees.computer']
def test_type_getter(self):
"""Test that correct compute function is returned for "fixed" type"""
@@ -70,9 +61,7 @@ class FixedFeesTester(test_common.TransactionCase):
credit_line = MagicMock(name='Euro credit line')
credit_line.policy_level_id = self.euro_level
credit_line.currency_id = self.euro
fees = self.dunning_model.compute_fixed_fees(self.cr, self.uid,
credit_line,
{})
fees = self.dunning_model.compute_fixed_fees(credit_line)
self.assertEqual(fees, self.euro_level.dunning_fixed_amount)
def test_computation_different_currency(self):
@@ -80,9 +69,7 @@ class FixedFeesTester(test_common.TransactionCase):
credit_line = MagicMock(name='USD credit line')
credit_line.policy_level_id = self.euro_level
credit_line.currency_id = self.usd
fees = self.dunning_model.compute_fixed_fees(self.cr, self.uid,
credit_line,
{})
fees = self.dunning_model.compute_fixed_fees(credit_line)
self.assertNotEqual(fees, self.euro_level.dunning_fixed_amount)
def test_no_fees(self):
@@ -91,7 +78,5 @@ class FixedFeesTester(test_common.TransactionCase):
credit_line.policy_level_id = self.euro_level
self.euro_level.dunning_fixed_amount = 0.0
credit_line.currency_id = self.usd
fees = self.dunning_model.compute_fixed_fees(self.cr, self.uid,
credit_line,
{})
fees = self.dunning_model.compute_fixed_fees(credit_line)
self.assertEqual(fees, 0.0)