mirror of
https://github.com/OCA/bank-payment.git
synced 2025-02-02 10:37:31 +02:00
add rests. Add better multicompany support
add tests and constrains
This commit is contained in:
committed by
Enric Tobella
parent
09041f1ab7
commit
0f75e914f0
@@ -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
|
||||
===========
|
||||
|
||||
@@ -1,3 +1,2 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import models
|
||||
|
||||
@@ -1,15 +1,13 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright 2014 Compassion CH - Cyril Sester <csester@compassion.ch>
|
||||
# Copyright 2014 Tecnativa - Pedro M. Baeza
|
||||
# Copyright 2015-16 Akretion - Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# Copyright 2017 Tecnativa - Carlos Dauden <carlos.dauden@tecnativa.com>
|
||||
# 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, "
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import account_banking_mandate
|
||||
from . import account_payment_method
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# © 2014 Compassion CH - Cyril Sester <csester@compassion.ch>
|
||||
# © 2014 Serv. Tecnol. Avanzados - Pedro M. Baeza
|
||||
# © 2015-2016 Akretion - Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# Copyright 2014 Compassion CH - Cyril Sester <csester@compassion.ch>
|
||||
# Copyright 2014 Tecnativa - Pedro M. Baeza
|
||||
# Copyright 2015-16 Akretion - Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# 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):
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright 2014 Compassion CH - Cyril Sester <csester@compassion.ch>
|
||||
# Copyright 2014 Serv. Tecnol. Avanzados - Pedro M. Baeza
|
||||
# Copyright 2016 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
|
||||
# Copyright 2017 Carlos Dauden <carlos.dauden@tecnativa.com>
|
||||
# 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))
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright Akretion (http://www.akretion.com/)
|
||||
# Copyright 2017 Carlos Dauden <carlos.dauden@tecnativa.com>
|
||||
# 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))
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# © 2014 Compassion CH - Cyril Sester <csester@compassion.ch>
|
||||
# © 2014 Serv. Tecnol. Avanzados - Pedro M. Baeza
|
||||
# © 2015-2016 Akretion - Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# Copyright 2014 Compassion CH - Cyril Sester <csester@compassion.ch>
|
||||
# Copyright 2014 Tecnativa - Pedro M. Baeza
|
||||
# Copyright 2015-16 Akretion - Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# 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()
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# © 2016 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
|
||||
# Copyright 2016 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
|
||||
|
||||
from odoo import models, fields
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# © 2014 Compassion CH - Cyril Sester <csester@compassion.ch>
|
||||
# © 2014 Serv. Tecnol. Avanzados - Pedro M. Baeza
|
||||
# © 2015-2016 Akretion - Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# Copyright 2014 Compassion CH - Cyril Sester <csester@compassion.ch>
|
||||
# Copyright 2014 Serv. Tecnol. Avanzados - Pedro M. Baeza
|
||||
# Copyright 2015-16 Akretion - Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# 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))
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright 2016 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
|
||||
# Copyright 2017 Carlos Dauden <carlos.dauden@tecnativa.com>
|
||||
# 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
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# © 2014 Compassion CH - Cyril Sester <csester@compassion.ch>
|
||||
# © 2014 Serv. Tecnol. Avanzados - Pedro M. Baeza
|
||||
# Copyright 2014 Compassion CH - Cyril Sester <csester@compassion.ch>
|
||||
# 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,))
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
© 2015-2016 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
|
||||
Copyright 2015-2016 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
|
||||
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
-->
|
||||
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import test_mandate
|
||||
from . import test_invoice_mandate
|
||||
|
||||
@@ -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({
|
||||
|
||||
@@ -1,17 +1,20 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# © 2016 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
|
||||
# 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
|
||||
|
||||
1
setup/account_banking_mandate/odoo/__init__.py
Normal file
1
setup/account_banking_mandate/odoo/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
__import__('pkg_resources').declare_namespace(__name__)
|
||||
1
setup/account_banking_mandate/odoo/addons/__init__.py
Normal file
1
setup/account_banking_mandate/odoo/addons/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
__import__('pkg_resources').declare_namespace(__name__)
|
||||
@@ -0,0 +1 @@
|
||||
../../../../account_banking_mandate
|
||||
6
setup/account_banking_mandate/setup.py
Normal file
6
setup/account_banking_mandate/setup.py
Normal file
@@ -0,0 +1,6 @@
|
||||
import setuptools
|
||||
|
||||
setuptools.setup(
|
||||
setup_requires=['setuptools-odoo'],
|
||||
odoo_addon=True,
|
||||
)
|
||||
Reference in New Issue
Block a user