[ADD] credit control dunning fees module

[ADD] docstring

[FIX] FeesComputer model specification to act as a abstract class without needing overriding

[IMP] fees column in report and mail

[FIX] dunning fees computer to register itself

[RM] unused import

[PEP8]

[IMP] module documentation

[ADD] dunniing fees translations

[FIX] name of level in tests

[TYPOS]

Set all addons to uninstallable

[ADD] credit control dunning fees module

[ADD] docstring

[FIX] FeesComputer model specification to act as a abstract class without needing overriding

[IMP] fees column in report and mail

[FIX] dunning fees computer to register itself

[RM] unused import

[PEP8]

[IMP] module documentation

[ADD] dunniing fees translations

[FIX] name of level in tests

[TYPOS]

Set all addons to uninstallable

Rename all addons to xxx_unported to be travis compliant
This commit is contained in:
Nicolas Bessi
2014-04-14 13:57:02 +02:00
committed by Akim Juillerat
parent 6c026d2e33
commit 44f33802cd
15 changed files with 0 additions and 933 deletions

View File

@@ -1,21 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Author: Nicolas Bessi
# Copyright 2014 Camptocamp SA
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from . import model

View File

@@ -1,71 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Author: Nicolas Bessi
# Copyright 2014 Camptocamp SA
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
{'name': 'Credit control dunning fees',
'version': '0.1.0',
'author': 'Camptocamp',
'maintainer': 'Camptocamp',
'category': 'Accounting',
'complexity': 'normal',
'depends': ['account_credit_control'],
'description': """
Dunning Fees for Credit Control
===============================
This extention of credit control adds the notion of dunning fees
on credit control lines.
Configuration
-------------
For release 0.1 only fixed fees are supported.
You can specifiy a fixed fees amount, a product and a currency
on the credit control level form.
The amount will be used as fees values the currency will determine
the currency of the fee. If the credit control line has not the
same currency as the fees currency, fees will be converted to
the credit control line currency.
The product is used to compute taxes in reconciliation process.
Run
---
Fees are automatically computed on credit run and saved
on the generated credit lines.
Fees can be manually edited as long credit line is draft
Credit control Summary report includes a new fees column.
-------
Support of fees price list
""",
'website': 'http://www.camptocamp.com',
'data': ['view/policy_view.xml',
'view/line_view.xml',
'report/report.xml'],
'demo': [],
'test': [],
'installable': False,
'auto_install': False,
'license': 'AGPL-3',
'application': False,
}

View File

@@ -1,81 +0,0 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * account_credit_control_dunning_fees
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 7.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-05-07 11:44+0000\n"
"PO-Revision-Date: 2014-05-07 11:44+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: account_credit_control_dunning_fees
#: code:_description:0
#: model:ir.model,name:account_credit_control_dunning_fees.model_credit_control_line
#, python-format
msgid "A credit control line"
msgstr ""
#. module: account_credit_control_dunning_fees
#: code:_description:0
#: model:ir.model,name:account_credit_control_dunning_fees.model_credit_control_policy_level
#, python-format
msgid "A credit control policy level"
msgstr ""
#. module: account_credit_control_dunning_fees
#: code:_description:0
#: model:ir.model,name:account_credit_control_dunning_fees.model_credit_control_run
#, python-format
msgid "Credit control line generator"
msgstr ""
#. module: account_credit_control_dunning_fees
#: field:credit.control.line,dunning_fees_amount:0
#: view:credit.control.policy:0
msgid "Fees"
msgstr ""
#. module: account_credit_control_dunning_fees
#: field:credit.control.policy.level,dunning_fixed_amount:0
msgid "Fees Fixed Amount"
msgstr ""
#. module: account_credit_control_dunning_fees
#: field:credit.control.policy.level,dunning_product_id:0
msgid "Fees Product"
msgstr ""
#. module: account_credit_control_dunning_fees
#: field:credit.control.policy.level,dunning_currency_id:0
msgid "Fees currency"
msgstr ""
#. module: account_credit_control_dunning_fees
#: selection:credit.control.policy.level,dunning_fees_type:0
msgid "Fixed"
msgstr ""
#. module: account_credit_control_dunning_fees
#: view:credit.control.policy:0
msgid "Mail and reporting"
msgstr ""
#. module: account_credit_control_dunning_fees
#: code:_description:0
#: model:ir.model,name:account_credit_control_dunning_fees.model_credit_control_dunning_fees_computer
#, python-format
msgid "credit.control.dunning.fees.computer"
msgstr ""
#. module: account_credit_control_dunning_fees
#: field:credit.control.policy.level,dunning_fees_type:0
msgid "unknown"
msgstr ""

View File

@@ -1,80 +0,0 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * account_credit_control_dunning_fees
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 7.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-04-16 07:11+0000\n"
"PO-Revision-Date: 2014-04-16 07:11+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: account_credit_control_dunning_fees
#: code:_description:0
#: model:ir.model,name:account_credit_control_dunning_fees.model_credit_control_line
#, python-format
msgid "A credit control line"
msgstr "Ligne de relance"
#. module: account_credit_control_dunning_fees
#: code:_description:0
#: model:ir.model,name:account_credit_control_dunning_fees.model_credit_control_policy_level
#, python-format
msgid "A credit control policy level"
msgstr "Une politique de relance"
#. module: account_credit_control_dunning_fees
#: code:_description:0
#: model:ir.model,name:account_credit_control_dunning_fees.model_credit_control_run
#, python-format
msgid "Credit control line generator"
msgstr "Générateur de relance"
#. module: account_credit_control_dunning_fees
#: field:credit.control.line,dunning_fees_amount:0
#: view:credit.control.policy:0
msgid "Fees"
msgstr "Frais de relance"
#. module: account_credit_control_dunning_fees
#: field:credit.control.policy.level,dunning_fixed_amount:0
msgid "Fees Fixed Amount"
msgstr "Montant des frais"
#. module: account_credit_control_dunning_fees
#: field:credit.control.policy.level,dunning_product_id:0
msgid "Fees Product"
msgstr "Article lié"
#. module: account_credit_control_dunning_fees
#: field:credit.control.policy.level,dunning_currency_id:0
msgid "Fees currency"
msgstr "Devises"
#. module: account_credit_control_dunning_fees
#: selection:credit.control.policy.level,dunning_fees_type:0
msgid "Fixed"
msgstr "Fixe"
#. module: account_credit_control_dunning_fees
#: view:credit.control.policy:0
msgid "Mail and reporting"
msgstr "Lettres et e-mails"
#. module: account_credit_control_dunning_fees
#: code:_description:0
#: model:ir.model,name:account_credit_control_dunning_fees.model_credit_control_dunning_fees_computer
#, python-format
msgid "credit.control.dunning.fees.computer"
msgstr "credit.control.dunning.fees.computer"
#. module: account_credit_control_dunning_fees
#: field:credit.control.policy.level,dunning_fees_type:0
msgid "unknown"
msgstr "inconnu"

View File

@@ -1,24 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Author: Nicolas Bessi
# Copyright 2014 Camptocamp SA
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from . import line
from . import policy
from . import run
from . import dunning

View File

@@ -1,120 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Author: Nicolas Bessi
# Copyright 2014 Camptocamp SA
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp.osv import orm
class FeesComputer(orm.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
Similar to AbstractModel but log access and actions
"""
_name = 'credit.control.dunning.fees.computer'
_auto = False
_log_access = True
_register = True
_transient = False
def _get_compute_fun(self, level_fees_type):
"""Retrieve function of class that should compute the fees based on type
:param level_fee_type: type exisiting 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
"""
if level_fees_type == 'fixed':
return self.compute_fixed_fees
else:
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
Fees amount is written on credit line in field dunning_fees_amount
:param credit_line_ids: list of `credit.control.line` ids
:returns: `credit_line_ids` list of `credit.control.line` ids
"""
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)
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
def _compute(self, cr, uid, credit_line, context=None):
"""Compute fees for a given credit line
Fees amount is written on credit line in field dunning_fees_amount
:param credit_line: credit line record
:returns: `credit_line` record
"""
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)
if fees:
credit_line.write({'dunning_fees_amount': fees},
context=context)
return credit_line
def compute_fixed_fees(self, cr, uid, credit_line, context=None):
"""Compute fees amount for fixed fees.
Correspond to the fixed dunning fees type
if currency of the fees is not the same as the currency
of the credit line, fees amount is converted to
currency of credit line.
:param credit_line: credit line record
: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
if not fees_amount:
return 0.0
fees_currency = level.dunning_currency_id
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)

View File

@@ -1,29 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Author: Nicolas Bessi
# Copyright 2014 Camptocamp SA
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp.osv import orm, fields
class credit_control_line(orm.Model):
"""Add dunning_fees_amount_fees field"""
_inherit = "credit.control.line"
_columns = {'dunning_fees_amount': fields.float('Fees')}

View File

@@ -1,36 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Author: Nicolas Bessi
# Copyright 2014 Camptocamp SA
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp.osv import orm, fields
class credit_control_policy(orm.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'}

View File

@@ -1,39 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Author: Nicolas Bessi
# Copyright 2014 Camptocamp SA
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp.osv import orm, fields
class credit_control_run(orm.Model):
"""Add computation of fees"""
_inherit = "credit.control.run"
def _generate_credit_lines(self, cr, uid, run_id, context=None):
"""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

View File

@@ -1,246 +0,0 @@
## -*- coding: utf-8 -*-
<html>
<head>
<style type="text/css">
${css}
body {
font-family: helvetica;
font-size: 12px;
}
.custom_text {
font-family: helvetica;
font-size: 12px;
}
table {
font-family: helvetica;
font-size: 12px;
}
.header {
margin-left: 0px;
text-align: left;
width: 300px;
font-size: 12px;
}
.title {
font-size: 16px;
font-weight: bold;
}
.basic_table{
text-align: center;
border: 1px solid lightGrey;
border-collapse: collapse;
font-family: helvetica;
font-size: 12px;
}
.basic_table th {
border: 1px solid lightGrey;
font-size: 11px;
font-weight: bold;
}
.basic_table td {
border: 1px solid lightGrey;
font-size: 12px;
}
.list_table {
border-color: black;
text-align: center;
border-collapse: collapse;
}
.list_table td {
border-color: gray;
border-top: 1px solid gray;
text-align: left;
font-size: 12px;
padding-right: 3px;
padding-left: 3px;
padding-top: 3px;
padding-bottom:3px;
}
.list_table th {
border-bottom: 2px solid black;
text-align: left;
font-size: 11px;
font-weight: bold;
padding-right: 3px
padding-left: 3px
}
.list_table thead {
display: table-header-group;
}
.address table {
font-size: 11px;
border-collapse: collapse;
margin: 0px;
padding: 0px;
}
.address .shipping {
}
.address .invoice {
margin-top: 10px;
}
.address .recipient {
font-size: 13px;
margin-right: 120px;
margin-left: 350px;
float: right;
}
table .address_title {
font-weight: bold;
}
.address td.name {
font-weight: bold;
}
td.amount, th.amount {
text-align: right;
padding-right:2px;
}
h1 {
font-size: 16px;
font-weight: bold;
}
tr.line .note {
border-style: none;
font-size: 9px;
padding-left: 10px;
}
tr.line {
margin-bottom: 10px;
}
</style>
</head>
<body>
%for comm in objects :
<% setLang(comm.get_contact_address().lang) %>
<div class="address">
<table class="recipient">
<%
add = comm.get_contact_address()
%>
%if comm.partner_id.id == add.id:
<tr><td class="name">${comm.partner_id.title and comm.partner_id.title.name or ''} ${comm.partner_id.name }</td></tr>
<% address_lines = comm.partner_id.contact_address.split("\n") %>
%else:
<tr><td class="name">${comm.partner_id.name or ''}</td></tr>
<tr><td>${add.title and add.title.name or ''} ${add.name}</td></tr>
<% address_lines = add.contact_address.split("\n")[1:] %>
%endif
%for part in address_lines:
%if part:
<tr><td>${part}</td></tr>
%endif
%endfor
</table>
<br/>
<br/>
<br/>
<br/>
</div>
<br/>
<br/>
<br/>
<div>
<h3 style="clear: both; padding-top: 20px;">
${_('Reminder')}: ${comm.current_policy_level.name or '' }
</h3>
<p>${_('Dear')},</p>
<p class="custom_text" width="95%">${comm.current_policy_level.custom_text.replace('\n', '<br />')}</p>
<br/>
<br/>
<p><b>${_('Summary')}<br/></b></p>
<table class="basic_table" style="width: 100%;">
<tr>
<th width="200">${_('Invoice number')}</th>
<th>${_('Invoice date')}</th>
<th>${_('Date due')}</th>
<th>${_('Invoiced amount')}</th>
<th>${_('Open amount')}</th>
<th>${_('Fees')}</th>
<th>${_('Currency')}</th>
</tr>
%for line in comm.credit_control_line_ids:
<tr>
%if line.invoice_id:
<td width="200">${line.invoice_id.number}
%if line.invoice_id.name:
<br/>
${line.invoice_id.name}
%endif
</td>
%else:
<td width="200">${line.move_line_id.name}</td>
%endif
<td class="date">${line.date_entry}</td>
<td class="date">${line.date_due}</td>
<td class="amount">${line.amount_due}</td>
<td class="amount">${line.balance_due}</td>
<td class="amount">${line.dunning_fees_amount}</td>
<td class="amount">${line.currency_id.name or comm.company_id.currency_id.name}</td>
</tr>
%endfor
</table>
<br/>
<br/>
<%doc>
<!-- uncomment to have info after summary -->
<p>${_('If you have any question, do not hesitate to contact us.')}</p>
<p>${comm.user_id.name} ${comm.user_id.email and '<%s>'%(comm.user_id.email) or ''}<br/>
${comm.company_id.name}<br/>
% if comm.company_id.street:
${comm.company_id.street or ''}<br/>
% endif
% if comm.company_id.street2:
${comm.company_id.street2}<br/>
% endif
% if comm.company_id.city or comm.company_id.zip:
${comm.company_id.zip or ''} ${comm.company_id.city or ''}<br/>
% endif
% if comm.company_id.country_id:
${comm.company_id.state_id and ('%s, ' % comm.company_id.state_id.name) or ''} ${comm.company_id.country_id.name or ''}<br/>
% endif
% if comm.company_id.phone:
Phone: ${comm.company_id.phone}<br/>
% endif
% if comm.company_id.website:
${comm.company_id.website or ''}<br/>
% endif
</%doc>
<p style="page-break-after:always"></p>
%endfor
</body>
</html>

View File

@@ -1,12 +0,0 @@
<openerp>
<data>
<report auto="False"
id="account_credit_control.report_webkit_html"
model="credit.control.communication"
name="credit_control_summary"
file="account_credit_control_dunning_fees/report/credit_control_summary.html.mako"
string="Credit Summary"
report_type="webkit"
webkit_header="report_webkit.ir_header_webkit_basesample0"/>
</data>
</openerp>

View File

@@ -1,23 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Author: Nicolas Bessi
# Copyright 2014 Camptocamp SA
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from . import test_fees_generation
checks = [test_fees_generation]

View File

@@ -1,95 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Author: Nicolas Bessi
# Copyright 2014 Camptocamp SA
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from mock import MagicMock
import openerp.tests.common as test_common
class FixedFeesTester(test_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.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.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
self.euro_level.dunning_currency_id = self.euro
self.euro_level.dunning_type = 'fixed'
self.usd_level = MagicMock(name='USD policy level')
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')
def test_type_getter(self):
"""Test that correct compute function is returned for "fixed" type"""
c_fun = self.dunning_model._get_compute_fun('fixed')
self.assertEqual(c_fun, self.dunning_model.compute_fixed_fees)
def test_unknow_type(self):
"""Test that non implemented error is raised if invalide fees type"""
with self.assertRaises(NotImplementedError):
self.dunning_model._get_compute_fun('bang')
def test_computation_same_currency(self):
"""Test that fees are correctly computed with same currency"""
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,
{})
self.assertEqual(fees, self.euro_level.dunning_fixed_amount)
def test_computation_different_currency(self):
"""Test that fees are correctly computed with different currency"""
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,
{})
self.assertNotEqual(fees, self.euro_level.dunning_fixed_amount)
def test_no_fees(self):
"""Test that fees are not generated if no amount defined on level"""
credit_line = MagicMock(name='USD credit line')
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,
{})
self.assertEqual(fees, 0.0)

View File

@@ -1,30 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record id="add_fees_on_credit_control_line" model="ir.ui.view">
<field name="name">add fees on credit control line</field>
<field name="model">credit.control.line</field>
<field name="inherit_id" ref="account_credit_control.credit_control_line_tree" />
<field name="arch" type="xml">
<field name="balance_due" position="after">
<field name="dunning_fees_amount"
attrs="{'readonly': [('state', '!=', 'draft')]}"/>
</field>
</field>
</record>
<record id="add_fees_on_credit_control_line_from" model="ir.ui.view">
<field name="name">add fees on credit control line form</field>
<field name="model">credit.control.line</field>
<field name="inherit_id" ref="account_credit_control.credit_control_line_form"/>
<field name="arch" type="xml">
<field name="balance_due" position="after">
<field name="dunning_fees_amount"
attrs="{'readonly': [('state', '!=', 'draft')]}"/>
</field>
</field>
</record>
</data>
</openerp>

View File

@@ -1,26 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record id="add_dunning_fees_on_policy" model="ir.ui.view">
<field name="name">add dunning fees on policy</field>
<field name="model">credit.control.policy</field>
<field name="inherit_id" ref="account_credit_control.credit_control_policy_form" />
<field name="arch" type="xml">
<page string="Mail and reporting" position="after">
<page string="Fees">
<group>
<group>
<field name="dunning_fixed_amount"/>
<field name="dunning_product_id"
attrs="{'required': [('dunning_fixed_amount', '!=', False)]}"/>
<field name="dunning_currency_id"
attrs="{'required': [('dunning_fixed_amount', '!=', False)]}"/>
</group>
</group>
</page>
</page>
</field>
</record>
</data>
</openerp>