contract_payment_mode: Migration to 9.0

This commit is contained in:
cubells
2017-03-28 14:52:12 +02:00
committed by Carolina Fernandez
parent fd2938d244
commit d135cc2aa9
11 changed files with 169 additions and 212 deletions

View File

@@ -6,26 +6,39 @@
Contract Payment Mode Contract Payment Mode
===================== =====================
This module allows to set a payment mode on contract for creating the invoices with this payment mode. This module allows to set a payment mode on contract for creating the invoices
with this payment mode.
Configuration
=============
Your user should be a Sales Manager or Accountant.
Usage Usage
===== =====
#. Go to *Sales > Sales > Contracts*.
#. Create one.
#. Select a partner to which invoice.
#. If the partner has a payment mode, this payment mode is selected here.
#. If not, or if you want another payment mode, you can change it in the
corresponding field.
#. Click on **Generate recurring invoices automatically** checkbox.
#. Add a product to invoice.
#. If you create an invoice, new invoice will have the selected payment mode.
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas .. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
:alt: Try me on Runbot :alt: Try me on Runbot
:target: https://runbot.odoo-community.org/runbot/110/8.0 :target: https://runbot.odoo-community.org/runbot/110/9.0
For further information, please visit:
* https://www.odoo.com/forum/help-1
Bug Tracker Bug Tracker
=========== ===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/contract/issues>`_. Bugs are tracked on `GitHub Issues <https://github.com/OCA/contract/issues>`_.
In case of trouble, please check there if your issue has already been reported. In case of trouble, please
If you spotted it first, help us smashing it by providing a detailed and welcomed feedback check there if your issue has already been reported. If you spotted it first,
`here <https://github.com/OCA/contract/issues/new?body=module:%20contract_payment_mode%0Aversion:%208.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_. help us smash it by providing detailed and welcomed feedback.
Credits Credits
======= =======
@@ -35,14 +48,15 @@ Contributors
* Ángel Moya <angel.moya@domatix.com> * Ángel Moya <angel.moya@domatix.com>
* Antonio Espinosa <antonioea@antiun.com> * Antonio Espinosa <antonioea@antiun.com>
* Vicent Cubells <vicent.cubells@tecnativa.com>
Maintainer Maintainer
---------- ----------
.. image:: http://odoo-community.org/logo.png .. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association :alt: Odoo Community Association
:target: http://odoo-community.org :target: https://odoo-community.org
This module is maintained by the OCA. This module is maintained by the OCA.
@@ -50,4 +64,4 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and mission is to support the collaborative development of Odoo features and
promote its widespread use. promote its widespread use.
To contribute to this module, please visit http://odoo-community.org. To contribute to this module, please visit https://odoo-community.org.

View File

@@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# © 2016 Antiun Ingenieria S.L. - Antonio Espinosa # Copyright 2016 Antiun Ingenieria S.L. - Antonio Espinosa
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from . import models from . import models

View File

@@ -1,40 +1,26 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright 2015 Domatix (<www.domatix.com>)
############################################################################### # Copyright 2016 Antiun Ingenieria S.L. - Antonio Espinosa
# # Copyright 2017 Tecnativa - Vicent Cubells
# OpenERP, Open Source Management Solution # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
# Copyright (C) 2015 Domatix (<www.domatix.com>).
#
# 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': 'Contract Payment Mode', 'name': 'Contract Payment Mode',
'summary': 'Payment mode in contracts and their invoices', 'summary': 'Payment mode in contracts and their invoices',
'version': '8.0.1.0.0', 'version': '9.0.1.0.0',
'author': 'Domatix, Odoo Community Association (OCA)', 'author': 'Domatix, '
'Tecnativa, '
'Odoo Community Association (OCA)',
'website': 'http://www.domatix.com', 'website': 'http://www.domatix.com',
'depends': [ 'depends': [
'account_analytic_analysis', 'contract',
'account_payment_partner'], 'account_payment_partner'
],
'category': 'Sales Management', 'category': 'Sales Management',
'license': 'AGPL-3', 'license': 'AGPL-3',
'data': [ 'data': [
'views/contract_view.xml', 'views/contract_view.xml',
], ],
'test': ['test/contract_payment_mode.yml'],
'post_init_hook': 'post_init_hook', 'post_init_hook': 'post_init_hook',
'installable': True, 'installable': True,
'auto_install': True, 'auto_install': True,

View File

@@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# © 2016 Antiun Ingenieria S.L. - Antonio Espinosa # Copyright 2016 Antiun Ingenieria S.L. - Antonio Espinosa
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from openerp import api, SUPERUSER_ID from openerp import api, SUPERUSER_ID
@@ -14,14 +14,13 @@ def post_init_hook(cr, registry):
env = api.Environment(cr, SUPERUSER_ID, {}) env = api.Environment(cr, SUPERUSER_ID, {})
m_contract = env['account.analytic.account'] m_contract = env['account.analytic.account']
contracts = m_contract.search([ contracts = m_contract.search([
('type', '=', 'contract'),
('payment_mode_id', '=', False), ('payment_mode_id', '=', False),
]) ])
if contracts: if contracts:
_logger.info('Setting payment mode: %d contracts' % _logger.info('Setting payment mode: %d contracts' %
len(contracts)) len(contracts))
for contract in contracts: for contract in contracts:
payment_mode = contract.partner_id.customer_payment_mode payment_mode = contract.partner_id.customer_payment_mode_id
if payment_mode: if payment_mode:
contract.payment_mode_id = payment_mode.id contract.payment_mode_id = payment_mode.id
_logger.info('Setting payment mode: Done') _logger.info('Setting payment mode: Done')

View File

@@ -1,27 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * contract_payment_mode
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 8.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-10-16 08:32+0000\n"
"PO-Revision-Date: 2015-10-16 08:32+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: contract_payment_mode
#: model:ir.model,name:contract_payment_mode.model_account_analytic_account
msgid "Analytic Account"
msgstr ""
#. module: contract_payment_mode
#: field:account.analytic.account,payment_mode_id:0
msgid "Payment Mode"
msgstr ""

View File

@@ -1,33 +1,27 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from openerp import models, fields, api from openerp import api, fields, models
class AccountAnalyticAccount(models.Model): class AccountAnalyticAccount(models.Model):
_inherit = 'account.analytic.account' _inherit = 'account.analytic.account'
payment_mode_id = fields.Many2one( payment_mode_id = fields.Many2one(
'payment.mode', comodel_name='account.payment.mode',
string='Payment Mode', string='Payment Mode',
domain="[('sale_ok', '=', True)]") domain=[('payment_type', '=', 'inbound')],
)
@api.multi @api.onchange('partner_id')
def on_change_partner_id(self, partner_id, name): def on_change_partner_id(self):
res = super(AccountAnalyticAccount, self).on_change_partner_id( if self.partner_id.customer_payment_mode_id:
partner_id, self.payment_mode_id = self.partner_id.customer_payment_mode_id.id
name)
partner = self.env['res.partner'].browse(partner_id)
if partner and partner.customer_payment_mode:
res['value']['payment_mode_id'] = partner.customer_payment_mode.id
return res
@api.model @api.model
def _prepare_invoice_data(self, contract): def _prepare_invoice_data(self, contract):
invoice_vals = super(AccountAnalyticAccount, self).\ invoice_vals = super(AccountAnalyticAccount, self)._prepare_invoice()
_prepare_invoice_data(contract)
if contract.payment_mode_id: if contract.payment_mode_id:
invoice_vals['payment_mode_id'] = contract.payment_mode_id.id invoice_vals['payment_mode_id'] = contract.payment_mode_id.id
invoice_vals['partner_bank_id'] = ( invoice_vals['partner_bank_id'] = (
contract.partner_id.bank_ids[:1].id or contract.partner_id.bank_ids[:1].id
contract.payment_mode_id.bank_id.id) )
return invoice_vals return invoice_vals

View File

@@ -1,49 +0,0 @@
-
In order to test payment mode in contract, I create a contract with custom payment mode.
Then, I generate Invoices from contract and test this payment mode.
First create custom payment mode.
-
!record {model: payment.mode, id: custom_payment_mode}:
name: Custom Payment Mode
journal: account.bank_journal
bank_id: account_payment.partner_bank_1
company_id: base.main_company
type: account_banking_payment_export.manual_bank_tranfer
-
I create a contract with custom payment mode
-
!record {model: account.analytic.account, id: contract_custom_payment}:
name: Maintenance of Servers
company_id: base.main_company
partner_id: base.main_partner
payment_mode_id: custom_payment_mode
type: contract
recurring_invoices : 1
recurring_interval : 1
recurring_invoice_line_ids:
- quantity: 2.0
price_unit: 100.0
name: Database Administration 25
product_id: product.product_product_consultant
uom_id: product.product_uom_hour
-
I test the payment mode in contract
-
!python {model: account.analytic.account}: |
aid = ref('contract_payment_mode.contract_custom_payment')
contract = self.browse(cr, uid, aid,context=context)
assert contract.payment_mode_id.id == ref('contract_payment_mode.custom_payment_mode'), "Payment Mode is not correct in contract"
-
I generate all invoices from contracts having recurring invoicing
-
!python {model: account.analytic.account}: |
self.recurring_create_invoice(cr, uid, [])
-
I test the generated invoice for custom payment contract
-
!python {model: account.invoice}: |
aid = ref('contract_payment_mode.contract_custom_payment')
ids = self.search(cr, uid, [('invoice_line.account_analytic_id','=',aid)], context=context)
assert len(ids)>=1, 'No invoice created for the custom paymetn mode contract'
for invoice in self.browse(cr, uid, ids,context=context):
assert invoice.payment_mode_id.id == ref('contract_payment_mode.custom_payment_mode'), "Payment Mode is not correct in invoice"

View File

@@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# © 2016 Antiun Ingenieria S.L. - Antonio Espinosa # Copyright 2016 Antiun Ingenieria S.L. - Antonio Espinosa
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from . import test_contract_payment_init from . import test_contract_payment

View File

@@ -0,0 +1,83 @@
# -*- coding: utf-8 -*-
# Copyright 2015 Antiun Ingenieria S.L. - Antonio Espinosa
# Copyright 2017 Tecnativa - Vicent Cubells
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from openerp.tests import common
from ..hooks import post_init_hook
class TestContractPaymentInit(common.SavepointCase):
@classmethod
def setUpClass(cls):
super(TestContractPaymentInit, cls).setUpClass()
cls.payment_method = cls.env.ref(
'account.account_payment_method_manual_in')
cls.payment_mode = cls.env.ref(
'account_payment_mode.payment_mode_inbound_ct1')
cls.partner = cls.env['res.partner'].create({
'name': 'Test contract partner',
'customer_payment_mode_id': cls.payment_mode,
})
cls.product = cls.env['product.product'].create({
'name': 'Custom Service',
'type': 'service',
'uom_id': cls.env.ref('product.product_uom_hour').id,
'uom_po_id': cls.env.ref('product.product_uom_hour').id,
'sale_ok': True,
})
cls.contract = cls.env['account.analytic.account'].create({
'name': 'Maintenance of Servers',
})
def _contract_payment_mode_id(self, contract_id):
contract = self.env['account.analytic.account'].search([
('id', '=', contract_id),
])
return contract.payment_mode_id.id
def test_post_init_hook(self):
contract = self.env['account.analytic.account'].create({
'name': 'Test contract',
'partner_id': self.partner.id,
'payment_mode_id': self.payment_mode.id,
})
self.assertEqual(self._contract_payment_mode_id(contract.id),
self.payment_mode.id)
contract.payment_mode_id = False
self.assertEqual(self._contract_payment_mode_id(contract.id), False)
post_init_hook(self.cr, self.env)
self.assertEqual(self._contract_payment_mode_id(contract.id),
self.payment_mode.id)
def test_contract_and_invoices(self):
self.contract.write({'partner_id': self.partner.id})
self.contract.on_change_partner_id()
self.assertEqual(self.contract.payment_mode_id,
self.contract.partner_id.customer_payment_mode_id)
self.contract.write({
'recurring_invoices': True,
'recurring_interval': 1,
'recurring_invoice_line_ids': [(0, 0, {
'quantity': 2.0,
'price_unit': 200.0,
'name': 'Database Administration 25',
'product_id': self.product.id,
'uom_id': self.product.uom_id.id,
})]
})
res = self.contract._prepare_invoice_data(self.contract)
self.assertEqual(res.get('partner_id'), self.contract.partner_id.id)
self.assertEqual(res.get('payment_mode_id'),
self.contract.payment_mode_id.id)
self.contract.recurring_create_invoice()
new_invoice = self.env['account.invoice'].search([
('contract_id', '=', self.contract.id)
])
self.assertEqual(len(new_invoice.ids), 1)
self.contract.recurring_create_invoice()
self.assertEqual(self.contract.payment_mode_id,
new_invoice.payment_mode_id)

View File

@@ -1,40 +0,0 @@
# -*- coding: utf-8 -*-
# © 2015 Antiun Ingenieria S.L. - Antonio Espinosa
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from openerp.tests.common import TransactionCase
from ..hooks import post_init_hook
class TestContractPaymentInit(TransactionCase):
# Use case : Prepare some data for current test case
def setUp(self):
super(TestContractPaymentInit, self).setUp()
self.payment_mode = self.env.ref('account_payment.payment_mode_1')
self.partner = self.env['res.partner'].create({
'name': 'Test contract partner',
'customer_payment_mode': self.payment_mode.id,
})
def _contract_payment_mode_id(self, contract_id):
contract = self.env['account.analytic.account'].search([
('id', '=', contract_id),
])
return contract.payment_mode_id.id
def test_post_init_hook(self):
contract = self.env['account.analytic.account'].create({
'name': 'Test contract',
'type': 'contract',
'partner_id': self.partner.id,
'payment_mode_id': self.payment_mode.id,
})
self.assertEqual(self._contract_payment_mode_id(contract.id),
self.payment_mode.id)
contract.payment_mode_id = False
self.assertEqual(self._contract_payment_mode_id(contract.id), False)
post_init_hook(self.cr, self.env)
self.assertEqual(self._contract_payment_mode_id(contract.id),
self.payment_mode.id)

View File

@@ -1,42 +1,39 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<openerp> <odoo>
<data>
<record id="account_analytic_account_payment_form" model="ir.ui.view"> <record id="account_analytic_account_payment_form" model="ir.ui.view">
<field name="name">account.analytic.account.payment.form</field> <field name="name">account.analytic.account.payment.form</field>
<field name="model">account.analytic.account</field> <field name="model">account.analytic.account</field>
<field name="inherit_id" ref="analytic.view_account_analytic_account_form" /> <field name="inherit_id" ref="analytic.view_account_analytic_account_form" />
<field name="arch" type="xml"> <field name="arch" type="xml">
<xpath expr="//field[@name='template_id']" position="before"> <xpath expr="//field[@name='partner_id']" position="after">
<field name="payment_mode_id" /> <field name="payment_mode_id" />
</xpath> </xpath>
</field>
</record>
<!-- Inherited Analytic Account list for contracts -->
<record id="view_account_analytic_account_payment_tree" model="ir.ui.view">
<field name="name">account.analytic.account.payment.list</field>
<field name="model">account.analytic.account</field>
<field name="inherit_id" ref="analytic.view_account_analytic_account_list" />
<field name="arch" type="xml">
<field name="partner_id" position="after">
<field name="payment_mode_id" />
</field> </field>
</record> </field>
</record>
<!-- Inherited Analytic Account list for contracts --> <!-- Analytic Account search view for contract -->
<record id="view_account_analytic_account_payment_tree" model="ir.ui.view"> <record id="view_account_analytic_account_search" model="ir.ui.view">
<field name="name">account.analytic.account.payment.list</field> <field name="name">account.analytic.account.search</field>
<field name="model">account.analytic.account</field> <field name="model">account.analytic.account</field>
<field name="inherit_id" ref="account.view_account_analytic_account_list" /> <field name="inherit_id" ref="analytic.view_account_analytic_account_search" />
<field name="arch" type="xml"> <field name="arch" type="xml">
<field name="partner_id" position="after"> <field name="name" position="after">
<field name="payment_mode_id" /> <field name="payment_mode_id" />
</field>
</field> </field>
</record> </field>
</record>
<!-- Analytic Account search view for contract --> </odoo>
<record id="view_account_analytic_account_payment_search" model="ir.ui.view">
<field name="name">account.analytic.account.payment.search</field>
<field name="model">account.analytic.account</field>
<field name="inherit_id"
ref="account_analytic_analysis.view_account_analytic_account_overdue_search" />
<field name="arch" type="xml">
<field name="name" position="after">
<field name="payment_mode_id" />
</field>
</field>
</record>
</data>
</openerp>