Browse Source

[MIG] contract_payment_mode: Migration to 9.0

pull/56/head
cubells 8 years ago
committed by Pedro M. Baeza
parent
commit
a0efa907a2
  1. 38
      contract_payment_mode/README.rst
  2. 2
      contract_payment_mode/__init__.py
  3. 36
      contract_payment_mode/__openerp__.py
  4. 5
      contract_payment_mode/hooks.py
  5. 27
      contract_payment_mode/i18n/contract_payment_mode.pot
  6. 28
      contract_payment_mode/models/contract.py
  7. 49
      contract_payment_mode/test/contract_payment_mode.yml
  8. 4
      contract_payment_mode/tests/__init__.py
  9. 83
      contract_payment_mode/tests/test_contract_payment.py
  10. 40
      contract_payment_mode/tests/test_contract_payment_init.py
  11. 67
      contract_payment_mode/views/contract_view.xml
  12. 1
      oca_dependencies.txt

38
contract_payment_mode/README.rst

@ -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
===== =====
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
:alt: Try me on Runbot
:target: https://runbot.odoo-community.org/runbot/110/8.0
#. 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.
For further information, please visit:
* https://www.odoo.com/forum/help-1
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
:alt: Try me on Runbot
:target: https://runbot.odoo-community.org/runbot/110/9.0
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.
If you spotted it first, help us smashing it by providing a detailed and welcomed feedback
`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**>`_.
In case of trouble, please
check there if your issue has already been reported. If you spotted it first,
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.

2
contract_payment_mode/__init__.py

@ -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

36
contract_payment_mode/__openerp__.py

@ -1,40 +1,26 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
###############################################################################
#
# OpenERP, Open Source Management Solution
# 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/>.
#
###############################################################################
# Copyright 2015 Domatix (<www.domatix.com>)
# Copyright 2016 Antiun Ingenieria S.L. - Antonio Espinosa
# Copyright 2017 Tecnativa - Vicent Cubells
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
{ {
'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',
'author': 'Domatix, Odoo Community Association (OCA)',
'version': '9.0.1.0.0',
'author': 'Domatix, '
'Tecnativa, '
'Odoo Community Association (OCA)',
'website': 'http://www.domatix.com', 'website': 'http://www.domatix.com',
'depends': [ 'depends': [
'account_analytic_analysis',
'account_payment_partner'],
'contract',
'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,

5
contract_payment_mode/hooks.py

@ -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')

27
contract_payment_mode/i18n/contract_payment_mode.pot

@ -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 ""

28
contract_payment_mode/models/contract.py

@ -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
def on_change_partner_id(self, partner_id, name):
res = super(AccountAnalyticAccount, self).on_change_partner_id(
partner_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.onchange('partner_id')
def on_change_partner_id(self):
if self.partner_id.customer_payment_mode_id:
self.payment_mode_id = self.partner_id.customer_payment_mode_id.id
@api.model @api.model
def _prepare_invoice_data(self, contract): def _prepare_invoice_data(self, contract):
invoice_vals = super(AccountAnalyticAccount, self).\
_prepare_invoice_data(contract)
invoice_vals = super(AccountAnalyticAccount, self)._prepare_invoice()
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.payment_mode_id.bank_id.id)
contract.partner_id.bank_ids[:1].id
)
return invoice_vals return invoice_vals

49
contract_payment_mode/test/contract_payment_mode.yml

@ -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"

4
contract_payment_mode/tests/__init__.py

@ -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

83
contract_payment_mode/tests/test_contract_payment.py

@ -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)

40
contract_payment_mode/tests/test_contract_payment_init.py

@ -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)

67
contract_payment_mode/views/contract_view.xml

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

1
oca_dependencies.txt

@ -15,3 +15,4 @@
# sale-workflow https://github.com/OCA/sale-workflow branchname # sale-workflow https://github.com/OCA/sale-workflow branchname
account-invoicing account-invoicing
bank-payment
Loading…
Cancel
Save