From 0f75e914f0361cc4044ab63bebb3e8f9bff27d42 Mon Sep 17 00:00:00 2001 From: Jordi Ballester Date: Tue, 7 Nov 2017 11:59:47 +0100 Subject: [PATCH] add rests. Add better multicompany support add tests and constrains --- account_banking_mandate/README.rst | 6 +- account_banking_mandate/__init__.py | 1 - account_banking_mandate/__manifest__.py | 4 +- account_banking_mandate/models/__init__.py | 1 - .../models/account_banking_mandate.py | 53 ++++- .../models/account_invoice.py | 20 +- .../models/account_move_line.py | 17 +- .../models/account_payment_line.py | 19 +- .../models/account_payment_method.py | 3 +- .../models/bank_payment_line.py | 20 +- account_banking_mandate/models/res_partner.py | 17 +- .../models/res_partner_bank.py | 20 +- .../security/mandate_security.xml | 2 +- account_banking_mandate/tests/__init__.py | 1 - .../tests/test_invoice_mandate.py | 197 ++++++++++++++++-- account_banking_mandate/tests/test_mandate.py | 117 ++++++++++- .../account_banking_mandate/odoo/__init__.py | 1 + .../odoo/addons/__init__.py | 1 + .../odoo/addons/account_banking_mandate | 1 + setup/account_banking_mandate/setup.py | 6 + 20 files changed, 446 insertions(+), 61 deletions(-) create mode 100644 setup/account_banking_mandate/odoo/__init__.py create mode 100644 setup/account_banking_mandate/odoo/addons/__init__.py create mode 120000 setup/account_banking_mandate/odoo/addons/account_banking_mandate create mode 100644 setup/account_banking_mandate/setup.py diff --git a/account_banking_mandate/README.rst b/account_banking_mandate/README.rst index 6dbfee105..715edacb2 100644 --- a/account_banking_mandate/README.rst +++ b/account_banking_mandate/README.rst @@ -30,16 +30,12 @@ TODO Usage ===== -To use this module, see menu "Accounting > payment > SEPA direct debit mandates" +To use this module, see menu "Invoicing/Accounting > Payments > Debit Orders" .. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas :alt: Try me on Runbot :target: https://runbot.odoo-community.org/runbot/173/11.0 -Known issues / Roadmap -====================== - - * no known issues Bug Tracker =========== diff --git a/account_banking_mandate/__init__.py b/account_banking_mandate/__init__.py index cde864bae..a9e337226 100644 --- a/account_banking_mandate/__init__.py +++ b/account_banking_mandate/__init__.py @@ -1,3 +1,2 @@ -# -*- coding: utf-8 -*- from . import models diff --git a/account_banking_mandate/__manifest__.py b/account_banking_mandate/__manifest__.py index 77a3a6023..292e2242c 100644 --- a/account_banking_mandate/__manifest__.py +++ b/account_banking_mandate/__manifest__.py @@ -1,15 +1,13 @@ -# -*- coding: utf-8 -*- # Copyright 2014 Compassion CH - Cyril Sester # Copyright 2014 Tecnativa - Pedro M. Baeza # Copyright 2015-16 Akretion - Alexis de Lattre # Copyright 2017 Tecnativa - Carlos Dauden -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). { 'name': 'Account Banking Mandate', 'summary': 'Banking mandates', 'version': '11.0.1.0.0', - 'version': '10.0.1.1.3', 'license': 'AGPL-3', 'author': "Compassion CH, " "Tecnativa, " diff --git a/account_banking_mandate/models/__init__.py b/account_banking_mandate/models/__init__.py index 145c8921a..d7b014c69 100644 --- a/account_banking_mandate/models/__init__.py +++ b/account_banking_mandate/models/__init__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- from . import account_banking_mandate from . import account_payment_method diff --git a/account_banking_mandate/models/account_banking_mandate.py b/account_banking_mandate/models/account_banking_mandate.py index 8224c0d1a..2c4550036 100644 --- a/account_banking_mandate/models/account_banking_mandate.py +++ b/account_banking_mandate/models/account_banking_mandate.py @@ -1,7 +1,6 @@ -# -*- coding: utf-8 -*- -# © 2014 Compassion CH - Cyril Sester -# © 2014 Serv. Tecnol. Avanzados - Pedro M. Baeza -# © 2015-2016 Akretion - Alexis de Lattre +# Copyright 2014 Compassion CH - Cyril Sester +# Copyright 2014 Tecnativa - Pedro M. Baeza +# Copyright 2015-16 Akretion - Alexis de Lattre # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). from odoo import models, fields, api, _ @@ -79,6 +78,52 @@ class AccountBankingMandate(models.Model): "before the date of signature." ) % mandate.unique_mandate_reference) + @api.constrains('company_id', 'payment_line_ids', 'partner_bank_id') + def _company_constrains(self): + for mandate in self: + if mandate.partner_bank_id.company_id and \ + mandate.partner_bank_id.company_id != mandate.company_id: + raise ValidationError( + _("The company of the mandate %s differs from the " + "company of partner %s.") % + (mandate.display_name, mandate.partner_id.name)) + + if self.env['account.payment.line'].search( + [('mandate_id', '=', mandate.id), + ('company_id', '=', mandate.company_id.id)], limit=1): + raise ValidationError( + _("You cannot change the company of mandate %s, " + "as there exists payment lines referencing it that " + "belong to another company.") % + (mandate.display_name, )) + + if self.env['account.invoice'].search( + [('mandate_id', '=', mandate.id), + ('company_id', '=', mandate.company_id.id)], limit=1): + raise ValidationError( + _("You cannot change the company of mandate %s, " + "as there exists invoices referencing it that belong to " + "another company.") % + (mandate.display_name, )) + + if self.env['account.move.line'].search( + [('mandate_id', '=', mandate.id), + ('company_id', '=', mandate.company_id.id)], limit=1): + raise ValidationError( + _("You cannot change the company of mandate %s, " + "as there exists journal items referencing it that " + "belong to another company.") % + (mandate.display_name, )) + + if self.env['bank.payment.line'].search( + [('mandate_id', '=', mandate.id), + ('company_id', '=', mandate.company_id.id)], limit=1): + raise ValidationError( + _("You cannot change the company of mandate %s, " + "as there exists bank payment lines referencing it that " + "belong to another company.") % + (mandate.display_name, )) + @api.multi @api.constrains('state', 'partner_bank_id') def _check_valid_state(self): diff --git a/account_banking_mandate/models/account_invoice.py b/account_banking_mandate/models/account_invoice.py index 455f90804..18184a769 100644 --- a/account_banking_mandate/models/account_invoice.py +++ b/account_banking_mandate/models/account_invoice.py @@ -1,12 +1,12 @@ -# -*- coding: utf-8 -*- # Copyright 2014 Compassion CH - Cyril Sester # Copyright 2014 Serv. Tecnol. Avanzados - Pedro M. Baeza # Copyright 2016 Akretion (Alexis de Lattre ) # Copyright 2017 Carlos Dauden -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -from odoo import models, fields, api +from odoo import api, fields, models, _ +from odoo.exceptions import ValidationError class AccountInvoice(models.Model): @@ -36,7 +36,7 @@ class AccountInvoice(models.Model): creation, using same method as upstream.""" onchanges = { '_onchange_partner_id': ['mandate_id'], - 'payment_mode_id_change': ['mandate_id'], + '_onchange_payment_mode_id': ['mandate_id'], } for onchange_method, changed_fields in list(onchanges.items()): if any(f not in vals for f in changed_fields): @@ -45,7 +45,7 @@ class AccountInvoice(models.Model): for field in changed_fields: if field not in vals and invoice[field]: vals[field] = invoice._fields[field].convert_to_write( - invoice[field], + invoice[field], invoice, ) return super(AccountInvoice, self).create(vals) @@ -80,3 +80,13 @@ class AccountInvoice(models.Model): def _onchange_payment_mode_id(self): super(AccountInvoice, self)._onchange_payment_mode_id() self.set_mandate() + + @api.constrains('mandate_id', 'company_id') + def _check_company_constrains(self): + for inv in self: + if inv.mandate_id.company_id and inv.mandate_id.company_id != \ + inv.company_id: + raise ValidationError(_( + "The invoice %s has a different company than " + "that of the linked mandate %s).") % + (inv.name, inv.mandate_id.display_name)) diff --git a/account_banking_mandate/models/account_move_line.py b/account_banking_mandate/models/account_move_line.py index 98e792633..e5e385d47 100644 --- a/account_banking_mandate/models/account_move_line.py +++ b/account_banking_mandate/models/account_move_line.py @@ -1,10 +1,10 @@ -# -*- coding: utf-8 -*- # Copyright Akretion (http://www.akretion.com/) # Copyright 2017 Carlos Dauden -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -from odoo import models, fields, api +from odoo import api, fields, models, _ +from odoo.exceptions import ValidationError class AccountMoveLine(models.Model): @@ -36,3 +36,14 @@ class AccountMoveLine(models.Model): 'partner_bank_id': mandate.partner_bank_id.id or partner_bank_id, }) return vals + + @api.multi + @api.constrains('mandate_id', 'company_id') + def _check_company_constrains(self): + for ml in self: + mandate = ml.mandate_id + if mandate.company_id and mandate.company_id != ml.company_id: + raise ValidationError(_( + "The item %s of journal %s has a different company than " + "that of the linked mandate %s).") % + (ml.name, ml.move_id.name, ml.mandate_id.display_name)) diff --git a/account_banking_mandate/models/account_payment_line.py b/account_banking_mandate/models/account_payment_line.py index d4677ac6d..2177b1c5c 100644 --- a/account_banking_mandate/models/account_payment_line.py +++ b/account_banking_mandate/models/account_payment_line.py @@ -1,7 +1,6 @@ -# -*- coding: utf-8 -*- -# © 2014 Compassion CH - Cyril Sester -# © 2014 Serv. Tecnol. Avanzados - Pedro M. Baeza -# © 2015-2016 Akretion - Alexis de Lattre +# Copyright 2014 Compassion CH - Cyril Sester +# Copyright 2014 Tecnativa - Pedro M. Baeza +# Copyright 2015-16 Akretion - Alexis de Lattre # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). from odoo import models, fields, api, _ @@ -33,6 +32,18 @@ class AccountPaymentLine(models.Model): pline.mandate_id.unique_mandate_reference, pline.mandate_id.partner_bank_id.acc_number)) + @api.multi + @api.constrains('mandate_id', 'company_id') + def _check_company_constrains(self): + for pline in self: + if pline.mandate_id.company_id and pline.mandate_id.company_id != \ + pline.company_id: + raise ValidationError(_( + "The payment line number %s a different company than " + "that of the linked mandate %s).") % + (pline.name, + pline.mandate_id.display_name)) + @api.multi def draft2open_payment_line_check(self): res = super(AccountPaymentLine, self).draft2open_payment_line_check() diff --git a/account_banking_mandate/models/account_payment_method.py b/account_banking_mandate/models/account_payment_method.py index 66a10e2af..a453a0eb4 100644 --- a/account_banking_mandate/models/account_payment_method.py +++ b/account_banking_mandate/models/account_payment_method.py @@ -1,5 +1,4 @@ -# -*- coding: utf-8 -*- -# © 2016 Akretion (Alexis de Lattre ) +# Copyright 2016 Akretion (Alexis de Lattre ) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). from odoo import models, fields diff --git a/account_banking_mandate/models/bank_payment_line.py b/account_banking_mandate/models/bank_payment_line.py index 4b583a71c..b4be429cb 100644 --- a/account_banking_mandate/models/bank_payment_line.py +++ b/account_banking_mandate/models/bank_payment_line.py @@ -1,10 +1,10 @@ -# -*- coding: utf-8 -*- -# © 2014 Compassion CH - Cyril Sester -# © 2014 Serv. Tecnol. Avanzados - Pedro M. Baeza -# © 2015-2016 Akretion - Alexis de Lattre +# Copyright 2014 Compassion CH - Cyril Sester +# Copyright 2014 Serv. Tecnol. Avanzados - Pedro M. Baeza +# Copyright 2015-16 Akretion - Alexis de Lattre # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -from odoo import models, fields, api +from odoo import api, fields, models, _ +from odoo.exceptions import ValidationError class BankPaymentLine(models.Model): @@ -20,3 +20,13 @@ class BankPaymentLine(models.Model): same_fields_payment_line_and_bank_payment_line() res.append('mandate_id') return res + + @api.constrains('mandate_id', 'company_id') + def _check_company_constrains(self): + for line in self: + if line.mandate_id.company_id and line.mandate_id.company_id != \ + line.company_id: + raise ValidationError(_( + "The bank payment line %s has a different company than " + "that of the linked mandate %s).") % + (line.name, line.mandate_id.display_name)) diff --git a/account_banking_mandate/models/res_partner.py b/account_banking_mandate/models/res_partner.py index f59a7ea73..8bfa022a0 100644 --- a/account_banking_mandate/models/res_partner.py +++ b/account_banking_mandate/models/res_partner.py @@ -1,7 +1,6 @@ -# -*- coding: utf-8 -*- # Copyright 2016 Akretion (Alexis de Lattre ) # Copyright 2017 Carlos Dauden -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). from odoo import models, fields, api @@ -14,7 +13,7 @@ class ResPartner(models.Model): readonly=True) valid_mandate_id = fields.Many2one( comodel_name='account.banking.mandate', - compute='compute_valid_mandate_id', + compute='_compute_valid_mandate_id', string='First Valid Mandate') @api.multi @@ -28,8 +27,15 @@ class ResPartner(models.Model): partner.mandate_count = mapped_data.get(partner.id, 0) @api.multi - def compute_valid_mandate_id(self): + def _compute_valid_mandate_id(self): # Dict for reducing the duplicated searches on parent/child partners + company_id = self.env.context.get('force_company', False) + if company_id: + company = self.env['res.company'].browse(company_id) + else: + company = self.env['res.company']._company_default_get( + 'account.banking.mandate') + mandates_dic = {} for partner in self: commercial_partner_id = partner.commercial_partner_id.id @@ -37,7 +43,8 @@ class ResPartner(models.Model): partner.valid_mandate_id = mandates_dic[commercial_partner_id] else: mandates = partner.commercial_partner_id.bank_ids.mapped( - 'mandate_ids').filtered(lambda x: x.state == 'valid') + 'mandate_ids').filtered( + lambda x: x.state == 'valid' and x.company_id == company) first_valid_mandate_id = mandates[:1].id partner.valid_mandate_id = first_valid_mandate_id mandates_dic[commercial_partner_id] = first_valid_mandate_id diff --git a/account_banking_mandate/models/res_partner_bank.py b/account_banking_mandate/models/res_partner_bank.py index 01263410e..b1b662e33 100644 --- a/account_banking_mandate/models/res_partner_bank.py +++ b/account_banking_mandate/models/res_partner_bank.py @@ -1,9 +1,9 @@ -# -*- coding: utf-8 -*- -# © 2014 Compassion CH - Cyril Sester -# © 2014 Serv. Tecnol. Avanzados - Pedro M. Baeza +# Copyright 2014 Compassion CH - Cyril Sester +# Copyright 2014 Tecnativa - Pedro M. Baeza # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -from odoo import models, fields +from odoo import api, fields, models, _ +from odoo.exceptions import ValidationError class ResPartnerBank(models.Model): @@ -14,3 +14,15 @@ class ResPartnerBank(models.Model): string='Direct Debit Mandates', help='Banking mandates represent an authorization that the bank ' 'account owner gives to a company for a specific operation.') + + @api.constrains('company_id', 'mandate_ids') + def _company_constrains(self): + for rpb in self: + if self.env['account.banking.mandate'].search( + [('partner_bank_id', '=', rpb.id), + ('company_id', '=', rpb.company_id.id)], limit=1): + raise ValidationError( + _("You cannot change the company of Partner Bank %s, " + "as there exists mandates referencing it that " + "belong to another company.") % + (rpb.name,)) diff --git a/account_banking_mandate/security/mandate_security.xml b/account_banking_mandate/security/mandate_security.xml index bff46c5e5..4dd34b7dd 100644 --- a/account_banking_mandate/security/mandate_security.xml +++ b/account_banking_mandate/security/mandate_security.xml @@ -1,6 +1,6 @@ diff --git a/account_banking_mandate/tests/__init__.py b/account_banking_mandate/tests/__init__.py index 15cf9fc57..fe40c01c2 100644 --- a/account_banking_mandate/tests/__init__.py +++ b/account_banking_mandate/tests/__init__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- from . import test_mandate from . import test_invoice_mandate diff --git a/account_banking_mandate/tests/test_invoice_mandate.py b/account_banking_mandate/tests/test_invoice_mandate.py index 485e2507f..c05bce6c3 100644 --- a/account_banking_mandate/tests/test_invoice_mandate.py +++ b/account_banking_mandate/tests/test_invoice_mandate.py @@ -1,15 +1,25 @@ -# -*- coding: utf-8 -*- -# © 2017 Creu Blanca + +# Copyright 2017 Creu Blanca # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). from odoo.tests.common import TransactionCase +from odoo.exceptions import ValidationError class TestInvoiceMandate(TransactionCase): - def test_post_invoice_and_refund(self): + def test_post_invoice_01(self): self.invoice._onchange_partner_id() + + self.assertEqual(self.invoice.mandate_id, self.mandate) + self.invoice.action_invoice_open() + + payable_move_lines = self.invoice.move_id.line_ids.filtered( + lambda s: s.account_id == self.invoice_account) + if payable_move_lines: + self.assertEqual(payable_move_lines[0].mandate_id, self.mandate) + self.env['account.invoice.payment.line.multi'].with_context( active_model='account.invoice', active_ids=self.invoice.ids @@ -17,41 +27,198 @@ class TestInvoiceMandate(TransactionCase): payment_order = self.env['account.payment.order'].search([]) self.assertEqual(len(payment_order.ids), 1) + payment_order.payment_mode_id_change() payment_order.draft2open() payment_order.open2generated() payment_order.generated2uploaded() - def test_post_invoice_and_refund(self): + def test_post_invoice_02(self): + partner_2 = self._create_res_partner('Jane with ACME Bank') + partner_2.customer_payment_mode_id = self.mode_inbound_acme + bank_account = self.env['res.partner.bank'].create({ + 'acc_number': '0023032234211', + 'partner_id': partner_2.id, + 'bank_id': self.acme_bank.id, + 'company_id': self.company_2.id + }) + + mandate_2 = self.env['account.banking.mandate'].create({ + 'partner_bank_id': bank_account.id, + 'signature_date': '2015-01-01', + 'company_id': self.company_2.id, + }) + mandate_2.validate() + + self.invoice._onchange_partner_id() + self.assertEqual(self.invoice.mandate_id, self.mandate) + self.invoice.action_invoice_open() + + payable_move_lines = self.invoice.move_id.line_ids.filtered( + lambda s: s.account_id == self.invoice_account) + if payable_move_lines: + with self.assertRaises(ValidationError): + payable_move_lines[0].mandate_id = mandate_2 + + def test_post_invoice_and_refund_02(self): self.invoice._onchange_partner_id() self.invoice.action_invoice_open() self.assertEqual(self.invoice.mandate_id, self.mandate) self.invoice.refund() + def test_onchange_partner(self): + partner_2 = self._create_res_partner('Jane with ACME Bank') + partner_2.customer_payment_mode_id = self.mode_inbound_acme + bank_account = self.env['res.partner.bank'].create({ + 'acc_number': '0023032234211', + 'partner_id': partner_2.id, + 'bank_id': self.acme_bank.id, + 'company_id': self.company.id + }) + + mandate_2 = self.env['account.banking.mandate'].create({ + 'partner_bank_id': bank_account.id, + 'signature_date': '2015-01-01', + 'company_id': self.company.id, + }) + mandate_2.validate() + + invoice = self.env['account.invoice'].new({ + 'partner_id': self.partner.id, + 'account_id': self.invoice_account.id, + 'type': 'out_invoice', + 'company_id': self.company.id, + }) + + invoice.partner_id = partner_2 + invoice._onchange_partner_id() + self.assertEqual(invoice.mandate_id, mandate_2) + + def test_onchange_payment_mode(self): + invoice = self.env['account.invoice'].new({ + 'partner_id': self.partner.id, + 'account_id': self.invoice_account.id, + 'type': 'out_invoice', + 'company_id': self.company.id, + }) + invoice._onchange_partner_id() + + pay_method_test = self.env['account.payment.method'].create({ + 'name': 'Test', + 'code': 'test', + 'payment_type': 'inbound', + 'mandate_required': False + }) + mode_inbound_acme_2 = self.env['account.payment.mode'].create({ + 'name': 'Inbound Credit ACME Bank 2', + 'company_id': self.company.id, + 'bank_account_link': 'variable', + 'payment_method_id': pay_method_test.id, + }) + + invoice.payment_mode_id = mode_inbound_acme_2 + invoice._onchange_payment_mode_id() + self.assertEqual(invoice.mandate_id, self.env[ + 'account.banking.mandate']) + + def test_invoice_constrains(self): + partner_2 = self._create_res_partner('Jane with ACME Bank') + partner_2.customer_payment_mode_id = self.mode_inbound_acme + bank_account = self.env['res.partner.bank'].create({ + 'acc_number': '0023032234211', + 'partner_id': partner_2.id, + 'bank_id': self.acme_bank.id, + 'company_id': self.company_2.id + }) + + mandate_2 = self.env['account.banking.mandate'].create({ + 'partner_bank_id': bank_account.id, + 'signature_date': '2015-01-01', + 'company_id': self.company_2.id, + }) + mandate_2.validate() + + invoice = self.env['account.invoice'].create({ + 'partner_id': self.partner.id, + 'account_id': self.invoice_account.id, + 'type': 'out_invoice', + 'company_id': self.company.id, + }) + + with self.assertRaises(ValidationError): + invoice.mandate_id = mandate_2 + + def _create_res_partner(self, name): + return self.env['res.partner'].create({ + 'name': name + }) + + def _create_res_bank(self, name, bic, city, country): + return self.env['res.bank'].create({ + 'name': name, + 'bic': bic, + 'city': city, + 'country': country.id, + }) + def setUp(self): res = super(TestInvoiceMandate, self).setUp() - self.partner = self.env.ref('base.res_partner_12') - bank_account = self.env.ref('account_payment_mode.res_partner_12_iban') + self.company = self.env.ref('base.main_company') + + self.partner = self._create_res_partner('Peter with ACME Bank') + self.acme_bank = self._create_res_bank('ACME Bank', 'GEBABEBB03B', + 'Charleroi', + self.env.ref('base.be')) + + bank_account = self.env['res.partner.bank'].create({ + 'acc_number': '0023032234211123', + 'partner_id': self.partner.id, + 'bank_id': self.acme_bank.id, + 'company_id': self.company.id + }) + + self.company_2 = self.env['res.company'].create({ + 'name': 'Company 2', + }) + self.mandate = self.env['account.banking.mandate'].create({ 'partner_bank_id': bank_account.id, 'signature_date': '2015-01-01', + 'company_id': self.company.id, }) + self.mandate.validate() - mode = self.env.ref('account_payment_mode.payment_mode_inbound_ct1') - self.partner.customer_payment_mode_id = mode - mode.payment_method_id.mandate_required = True - invoice_account = self.env['account.account'].search( + + self.mode_inbound_acme = self.env['account.payment.mode'].create({ + 'name': 'Inbound Credit ACME Bank', + 'company_id': self.company.id, + 'bank_account_link': 'variable', + 'payment_method_id': + self.env.ref('account.account_payment_method_manual_in').id, + }) + bank_journal = self.env['account.journal'].search( + [('type', '=', 'bank')], limit=1) + self.mode_inbound_acme.variable_journal_ids = bank_journal + self.mode_inbound_acme.payment_method_id.mandate_required = True + self.mode_inbound_acme.payment_order_ok = True + + self.partner.customer_payment_mode_id = self.mode_inbound_acme + + self.invoice_account = self.env['account.account'].search( [('user_type_id', '=', self.env.ref( - 'account.data_account_type_payable').id)], - limit=1).id + 'account.data_account_type_receivable').id), + ('company_id', '=', self.company.id)], + limit=1) invoice_line_account = self.env['account.account'].search( [('user_type_id', '=', self.env.ref( - 'account.data_account_type_expenses').id)], + 'account.data_account_type_expenses').id), + ('company_id', '=', self.company.id)], limit=1).id self.invoice = self.env['account.invoice'].create({ 'partner_id': self.partner.id, - 'account_id': invoice_account, - 'type': 'out_invoice' + 'account_id': self.invoice_account.id, + 'type': 'out_invoice', + 'company_id': self.company.id, }) self.env['account.invoice.line'].create({ diff --git a/account_banking_mandate/tests/test_mandate.py b/account_banking_mandate/tests/test_mandate.py index db14316ce..b113ba7e5 100644 --- a/account_banking_mandate/tests/test_mandate.py +++ b/account_banking_mandate/tests/test_mandate.py @@ -1,17 +1,20 @@ -# -*- coding: utf-8 -*- # © 2016 Akretion (Alexis de Lattre ) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). from odoo.tests.common import TransactionCase +from odoo import fields +from odoo.exceptions import UserError, ValidationError +from datetime import timedelta class TestMandate(TransactionCase): - def test_mandate(self): + def test_mandate_01(self): bank_account = self.env.ref('account_payment_mode.res_partner_12_iban') mandate = self.env['account.banking.mandate'].create({ 'partner_bank_id': bank_account.id, 'signature_date': '2015-01-01', + 'company_id': self.company.id, }) self.assertEqual(mandate.state, 'draft') mandate.validate() @@ -21,3 +24,113 @@ class TestMandate(TransactionCase): self.assertEqual(mandate.state, 'cancel') mandate.back2draft() self.assertEqual(mandate.state, 'draft') + + def test_mandate_02(self): + bank_account = self.env.ref('account_payment_mode.res_partner_12_iban') + mandate = self.env['account.banking.mandate'].create({ + 'partner_bank_id': bank_account.id, + 'signature_date': '2015-01-01', + 'company_id': self.company.id, + }) + with self.assertRaises(UserError): + mandate.back2draft() + + def test_mandate_03(self): + bank_account = self.env.ref( + 'account_payment_mode.res_partner_12_iban') + mandate = self.env['account.banking.mandate'].create({ + 'partner_bank_id': bank_account.id, + 'signature_date': '2015-01-01', + 'company_id': self.company.id, + }) + mandate.validate() + + with self.assertRaises(UserError): + mandate.validate() + + def test_mandate_04(self): + bank_account = self.env.ref( + 'account_payment_mode.res_partner_12_iban') + mandate = self.env['account.banking.mandate'].create({ + 'partner_bank_id': bank_account.id, + 'signature_date': '2015-01-01', + 'company_id': self.company.id, + }) + mandate.validate() + mandate.cancel() + with self.assertRaises(UserError): + mandate.cancel() + + def test_onchange_methods(self): + bank_account = self.env.ref('account_payment_mode.res_partner_12_iban') + mandate = self.env['account.banking.mandate'].new({ + 'partner_bank_id': bank_account.id, + 'signature_date': '2015-01-01', + 'company_id': self.company.id, + }) + bank_account_2 = self.env.ref( + 'account_payment_mode.res_partner_2_iban') + mandate.partner_bank_id = bank_account_2 + mandate.mandate_partner_bank_change() + self.assertEquals(mandate.partner_id, bank_account_2.partner_id) + + def test_constrains_01(self): + bank_account = self.env.ref('account_payment_mode.res_partner_12_iban') + mandate = self.env['account.banking.mandate'].create({ + 'partner_bank_id': bank_account.id, + 'signature_date': '2015-01-01', + 'company_id': self.company.id, + }) + mandate.validate() + with self.assertRaises(ValidationError): + mandate.signature_date = fields.Date.to_string( + fields.Date.from_string( + fields.Date.context_today(mandate)) + timedelta(days=1)) + + def test_constrains_02(self): + bank_account = self.env.ref('account_payment_mode.res_partner_12_iban') + mandate = self.env['account.banking.mandate'].create({ + 'partner_bank_id': bank_account.id, + 'signature_date': '2015-01-01', + 'company_id': self.company.id, + }) + + with self.assertRaises(ValidationError): + mandate.company_id = self.company_2 + + def test_constrains_03(self): + bank_account = self.env.ref('account_payment_mode.res_partner_12_iban') + mandate = self.env['account.banking.mandate'].create({ + 'partner_bank_id': bank_account.id, + 'signature_date': '2015-01-01', + 'company_id': self.company.id, + }) + bank_account_2 = self.env.ref( + 'account_payment_mode.res_partner_2_iban') + bank_account_2.company_id = self.company_2 + + with self.assertRaises(ValidationError): + mandate.partner_bank_id = bank_account_2 + + def test_constrains_04(self): + mandate = self.env['account.banking.mandate'].create({ + 'signature_date': '2015-01-01', + 'company_id': self.company.id, + }) + bank_account_2 = self.env.ref( + 'account_payment_mode.res_partner_2_iban') + bank_account_2.company_id = self.company_2 + + with self.assertRaises(ValidationError): + bank_account_2.mandate_ids += mandate + + def setUp(self): + res = super(TestMandate, self).setUp() + # Company + self.company = self.env.ref('base.main_company') + + # Company 2 + self.company_2 = self.env['res.company'].create({ + 'name': 'Company 2', + }) + return res diff --git a/setup/account_banking_mandate/odoo/__init__.py b/setup/account_banking_mandate/odoo/__init__.py new file mode 100644 index 000000000..de40ea7ca --- /dev/null +++ b/setup/account_banking_mandate/odoo/__init__.py @@ -0,0 +1 @@ +__import__('pkg_resources').declare_namespace(__name__) diff --git a/setup/account_banking_mandate/odoo/addons/__init__.py b/setup/account_banking_mandate/odoo/addons/__init__.py new file mode 100644 index 000000000..de40ea7ca --- /dev/null +++ b/setup/account_banking_mandate/odoo/addons/__init__.py @@ -0,0 +1 @@ +__import__('pkg_resources').declare_namespace(__name__) diff --git a/setup/account_banking_mandate/odoo/addons/account_banking_mandate b/setup/account_banking_mandate/odoo/addons/account_banking_mandate new file mode 120000 index 000000000..0e535383d --- /dev/null +++ b/setup/account_banking_mandate/odoo/addons/account_banking_mandate @@ -0,0 +1 @@ +../../../../account_banking_mandate \ No newline at end of file diff --git a/setup/account_banking_mandate/setup.py b/setup/account_banking_mandate/setup.py new file mode 100644 index 000000000..999b290c8 --- /dev/null +++ b/setup/account_banking_mandate/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) \ No newline at end of file