mirror of
https://github.com/OCA/account-financial-tools.git
synced 2025-02-02 12:47:26 +02:00
[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:
committed by
Akim Juillerat
parent
6c026d2e33
commit
44f33802cd
@@ -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
|
||||
@@ -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,
|
||||
}
|
||||
@@ -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 ""
|
||||
|
||||
@@ -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"
|
||||
@@ -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
|
||||
@@ -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)
|
||||
@@ -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')}
|
||||
@@ -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'}
|
||||
@@ -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
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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]
|
||||
@@ -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)
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user