[IMP] account_banking_madante: black, isort

This commit is contained in:
Marçal Isern
2020-03-26 20:58:31 +01:00
committed by Reyes4711
parent 6692f31401
commit a90b928c26
26 changed files with 1077 additions and 834 deletions

View File

@@ -1,2 +1 @@
from . import models

View File

@@ -5,31 +5,29 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
{
'name': 'Account Banking Mandate',
'summary': 'Banking mandates',
'version': '12.0.2.0.0',
'license': 'AGPL-3',
'author': "Compassion CH, "
"Tecnativa, "
"Akretion, "
"Odoo Community Association (OCA)",
'website': 'https://github.com/OCA/bank-payment',
'category': 'Banking addons',
'depends': [
'account_payment_order',
"name": "Account Banking Mandate",
"summary": "Banking mandates",
"version": "12.0.2.0.0",
"license": "AGPL-3",
"author": "Compassion CH, "
"Tecnativa, "
"Akretion, "
"Odoo Community Association (OCA)",
"website": "https://github.com/OCA/bank-payment",
"category": "Banking addons",
"depends": ["account_payment_order"],
"data": [
"views/account_banking_mandate_view.xml",
"views/account_payment_method.xml",
"views/account_invoice_view.xml",
"views/account_payment_line.xml",
"views/res_partner_bank_view.xml",
"views/res_partner.xml",
"views/bank_payment_line_view.xml",
"views/account_move_line.xml",
"data/mandate_reference_sequence.xml",
"security/mandate_security.xml",
"security/ir.model.access.csv",
],
'data': [
'views/account_banking_mandate_view.xml',
'views/account_payment_method.xml',
'views/account_invoice_view.xml',
'views/account_payment_line.xml',
'views/res_partner_bank_view.xml',
'views/res_partner.xml',
'views/bank_payment_line_view.xml',
'views/account_move_line.xml',
'data/mandate_reference_sequence.xml',
'security/mandate_security.xml',
'security/ir.model.access.csv',
],
'installable': True,
"installable": True,
}

View File

@@ -1,11 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8" ?>
<odoo noupdate="1">
<record id="dd_mandate_seq" model="ir.sequence">
<field name="name">DD Mandate Reference</field>
<field name="code">account.banking.mandate</field>
<field name="prefix">BM</field>
<field name="padding" eval="7"/>
</record>
<record id="dd_mandate_seq" model="ir.sequence">
<field name="name">DD Mandate Reference</field>
<field name="code">account.banking.mandate</field>
<field name="prefix">BM</field>
<field name="padding" eval="7" />
</record>
</odoo>

View File

@@ -1,14 +1,13 @@
# Copyright 2019 Tecnativa - Pedro M. Baeza
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
from openupgradelib import openupgrade
from openupgradelib import openupgrade_90
from openupgradelib import openupgrade, openupgrade_90
@openupgrade.migrate(use_env=True)
def migrate(env, version):
column = openupgrade.get_legacy_name('scan')
if openupgrade.column_exists(env.cr, 'account_banking_mandate', column):
column = openupgrade.get_legacy_name("scan")
if openupgrade.column_exists(env.cr, "account_banking_mandate", column):
openupgrade_90.convert_binary_field_to_attachment(
env, {'account.banking.mandate': [('scan', None)]},
env, {"account.banking.mandate": [("scan", None)]},
)

View File

@@ -4,13 +4,11 @@
from openupgradelib import openupgrade
column_renames = {
'account_banking_mandate': [
('scan', None),
],
"account_banking_mandate": [("scan", None)],
}
@openupgrade.migrate()
def migrate(env, version):
if openupgrade.column_exists(env.cr, 'account_banking_mandate', 'scan'):
if openupgrade.column_exists(env.cr, "account_banking_mandate", "scan"):
openupgrade.rename_columns(env.cr, column_renames)

View File

@@ -1,4 +1,3 @@
from . import account_banking_mandate
from . import account_payment_method
from . import account_invoice

View File

@@ -4,7 +4,7 @@
# Copyright 2020 Tecnativa - Carlos Dauden
# 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 UserError, ValidationError
@@ -13,71 +13,88 @@ class AccountBankingMandate(models.Model):
authorization that the bank account owner gives to a company for a
specific operation (such as direct debit)
"""
_name = 'account.banking.mandate'
_name = "account.banking.mandate"
_description = "A generic banking mandate"
_inherit = ['mail.thread']
_order = 'signature_date desc'
_inherit = ["mail.thread"]
_order = "signature_date desc"
def _get_default_partner_bank_id_domain(self):
if 'default_partner_id' in self.env.context:
return [('partner_id', '=', self.env.context.get(
'default_partner_id'))]
if "default_partner_id" in self.env.context:
return [("partner_id", "=", self.env.context.get("default_partner_id"))]
else:
return []
format = fields.Selection(
[('basic', 'Basic Mandate')], default='basic', required=True,
string='Mandate Format', track_visibility='onchange')
[("basic", "Basic Mandate")],
default="basic",
required=True,
string="Mandate Format",
track_visibility="onchange",
)
type = fields.Selection(
[('generic', 'Generic Mandate')],
string='Type of Mandate',
track_visibility='onchange'
[("generic", "Generic Mandate")],
string="Type of Mandate",
track_visibility="onchange",
)
partner_bank_id = fields.Many2one(
comodel_name='res.partner.bank', string='Bank Account',
track_visibility='onchange',
comodel_name="res.partner.bank",
string="Bank Account",
track_visibility="onchange",
domain=lambda self: self._get_default_partner_bank_id_domain(),
ondelete='restrict',
ondelete="restrict",
index=True,
)
partner_id = fields.Many2one(
comodel_name='res.partner', related='partner_bank_id.partner_id',
string='Partner', store=True, index=True)
comodel_name="res.partner",
related="partner_bank_id.partner_id",
string="Partner",
store=True,
index=True,
)
company_id = fields.Many2one(
comodel_name='res.company', string='Company', required=True,
default=lambda self: self.env['res.company']._company_default_get(
'account.banking.mandate'))
comodel_name="res.company",
string="Company",
required=True,
default=lambda self: self.env["res.company"]._company_default_get(
"account.banking.mandate"
),
)
unique_mandate_reference = fields.Char(
string='Unique Mandate Reference', track_visibility='onchange',
copy=False,
string="Unique Mandate Reference", track_visibility="onchange", copy=False,
)
signature_date = fields.Date(string='Date of Signature of the Mandate',
track_visibility='onchange')
scan = fields.Binary(
string='Scan of the Mandate',
attachment=True,
signature_date = fields.Date(
string="Date of Signature of the Mandate", track_visibility="onchange"
)
last_debit_date = fields.Date(string='Date of the Last Debit',
readonly=True)
state = fields.Selection([
('draft', 'Draft'),
('valid', 'Valid'),
('expired', 'Expired'),
('cancel', 'Cancelled'),
], string='Status', default='draft', track_visibility='onchange',
scan = fields.Binary(string="Scan of the Mandate", attachment=True,)
last_debit_date = fields.Date(string="Date of the Last Debit", readonly=True)
state = fields.Selection(
[
("draft", "Draft"),
("valid", "Valid"),
("expired", "Expired"),
("cancel", "Cancelled"),
],
string="Status",
default="draft",
track_visibility="onchange",
help="Only valid mandates can be used in a payment line. A cancelled "
"mandate is a mandate that has been cancelled by the customer.")
payment_line_ids = fields.One2many(
comodel_name='account.payment.line', inverse_name='mandate_id',
string="Related Payment Lines")
payment_line_ids_count = fields.Integer(
compute='_compute_payment_line_ids_count',
"mandate is a mandate that has been cancelled by the customer.",
)
payment_line_ids = fields.One2many(
comodel_name="account.payment.line",
inverse_name="mandate_id",
string="Related Payment Lines",
)
payment_line_ids_count = fields.Integer(compute="_compute_payment_line_ids_count",)
_sql_constraints = [(
'mandate_ref_company_uniq',
'unique(unique_mandate_reference, company_id)',
'A Mandate with the same reference already exists for this company!')]
_sql_constraints = [
(
"mandate_ref_company_uniq",
"unique(unique_mandate_reference, company_id)",
"A Mandate with the same reference already exists for this company!",
)
]
def name_get(self):
result = []
@@ -85,25 +102,23 @@ class AccountBankingMandate(models.Model):
name = mandate.unique_mandate_reference
acc_number = mandate.partner_bank_id.acc_number
if acc_number:
name = '{} [...{}]'.format(name, acc_number[-4:])
name = "{} [...{}]".format(name, acc_number[-4:])
result.append((mandate.id, name))
return result
@api.multi
@api.depends('payment_line_ids')
@api.depends("payment_line_ids")
def _compute_payment_line_ids_count(self):
payment_line_model = self.env['account.payment.line']
domain = [('mandate_id', 'in', self.ids)]
payment_line_model = self.env["account.payment.line"]
domain = [("mandate_id", "in", self.ids)]
res = payment_line_model.read_group(
domain=domain,
fields=['mandate_id'],
groupby=['mandate_id'],
domain=domain, fields=["mandate_id"], groupby=["mandate_id"],
)
payment_line_dict = {}
for dic in res:
mandate_id = dic['mandate_id'][0]
mandate_id = dic["mandate_id"][0]
payment_line_dict.setdefault(mandate_id, 0)
payment_line_dict[mandate_id] += dic['mandate_id_count']
payment_line_dict[mandate_id] += dic["mandate_id_count"]
for rec in self:
rec.payment_line_ids_count = payment_line_dict.get(rec.id, 0)
@@ -111,103 +126,166 @@ class AccountBankingMandate(models.Model):
def show_payment_lines(self):
self.ensure_one()
return {
'name': _("Payment lines"),
'type': 'ir.actions.act_window',
'view_mode': 'tree,form',
'res_model': 'account.payment.line',
'domain': [('mandate_id', '=', self.id)],
"name": _("Payment lines"),
"type": "ir.actions.act_window",
"view_mode": "tree,form",
"res_model": "account.payment.line",
"domain": [("mandate_id", "=", self.id)],
}
@api.multi
@api.constrains('signature_date', 'last_debit_date')
@api.constrains("signature_date", "last_debit_date")
def _check_dates(self):
for mandate in self:
if (mandate.signature_date and
mandate.signature_date > fields.Date.context_today(
mandate)):
if (
mandate.signature_date
and mandate.signature_date > fields.Date.context_today(mandate)
):
raise ValidationError(
_("The date of signature of mandate '%s' "
"is in the future!")
% mandate.unique_mandate_reference)
if (mandate.signature_date and mandate.last_debit_date and
mandate.signature_date > mandate.last_debit_date):
_("The date of signature of mandate '%s' " "is in the future!")
% mandate.unique_mandate_reference
)
if (
mandate.signature_date
and mandate.last_debit_date
and mandate.signature_date > mandate.last_debit_date
):
raise ValidationError(
_("The mandate '%s' can't have a date of last debit "
"before the date of signature."
) % mandate.unique_mandate_reference)
_(
"The mandate '%s' can't have a date of last debit "
"before the date of signature."
)
% mandate.unique_mandate_reference
)
@api.constrains('company_id', 'payment_line_ids', 'partner_bank_id')
@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:
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))
_(
"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'].sudo().search(
[('mandate_id', '=', mandate.id),
('company_id', '!=', mandate.company_id.id)], limit=1):
if (
self.env["account.payment.line"]
.sudo()
.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, ))
_(
"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'].sudo().search(
[('mandate_id', '=', mandate.id),
('company_id', '!=', mandate.company_id.id)], limit=1):
if (
self.env["account.invoice"]
.sudo()
.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, ))
_(
"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'].sudo().search(
[('mandate_id', '=', mandate.id),
('company_id', '!=', mandate.company_id.id)], limit=1):
if (
self.env["account.move.line"]
.sudo()
.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, ))
_(
"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'].sudo().search(
[('mandate_id', '=', mandate.id),
('company_id', '!=', mandate.company_id.id)], limit=1):
if (
self.env["bank.payment.line"]
.sudo()
.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, ))
_(
"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', 'signature_date')
@api.constrains("state", "partner_bank_id", "signature_date")
def _check_valid_state(self):
for mandate in self:
if mandate.state == 'valid':
if mandate.state == "valid":
if not mandate.signature_date:
raise ValidationError(
_("Cannot validate the mandate '%s' without a date of "
"signature.") % mandate.unique_mandate_reference)
_(
"Cannot validate the mandate '%s' without a date of "
"signature."
)
% mandate.unique_mandate_reference
)
if not mandate.partner_bank_id:
raise ValidationError(
_("Cannot validate the mandate '%s' because it is not "
"attached to a bank account.") %
mandate.unique_mandate_reference)
_(
"Cannot validate the mandate '%s' because it is not "
"attached to a bank account."
)
% mandate.unique_mandate_reference
)
@api.model
def create(self, vals=None):
unique_mandate_reference = vals.get('unique_mandate_reference')
if not unique_mandate_reference or unique_mandate_reference == 'New':
vals['unique_mandate_reference'] = \
self.env['ir.sequence'].next_by_code(
'account.banking.mandate') or 'New'
unique_mandate_reference = vals.get("unique_mandate_reference")
if not unique_mandate_reference or unique_mandate_reference == "New":
vals["unique_mandate_reference"] = (
self.env["ir.sequence"].next_by_code("account.banking.mandate") or "New"
)
return super(AccountBankingMandate, self).create(vals)
@api.multi
@api.onchange('partner_bank_id')
@api.onchange("partner_bank_id")
def mandate_partner_bank_change(self):
for mandate in self:
mandate.partner_id = mandate.partner_bank_id.partner_id
@@ -215,19 +293,17 @@ class AccountBankingMandate(models.Model):
@api.multi
def validate(self):
for mandate in self:
if mandate.state != 'draft':
raise UserError(
_('Mandate should be in draft state.'))
self.write({'state': 'valid'})
if mandate.state != "draft":
raise UserError(_("Mandate should be in draft state."))
self.write({"state": "valid"})
return True
@api.multi
def cancel(self):
for mandate in self:
if mandate.state not in ('draft', 'valid'):
raise UserError(
_('Mandate should be in draft or valid state.'))
self.write({'state': 'cancel'})
if mandate.state not in ("draft", "valid"):
raise UserError(_("Mandate should be in draft or valid state."))
self.write({"state": "cancel"})
return True
@api.multi
@@ -236,8 +312,7 @@ class AccountBankingMandate(models.Model):
This is for mandates cancelled by mistake.
"""
for mandate in self:
if mandate.state != 'cancel':
raise UserError(
_('Mandate should be in cancel state.'))
self.write({'state': 'draft'})
if mandate.state != "cancel":
raise UserError(_("Mandate should be in cancel state."))
self.write({"state": "draft"})
return True

View File

@@ -5,29 +5,32 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo import api, fields, models, _
from odoo import _, api, fields, models
from odoo.exceptions import ValidationError
class AccountInvoice(models.Model):
_inherit = 'account.invoice'
_inherit = "account.invoice"
mandate_id = fields.Many2one(
'account.banking.mandate', string='Direct Debit Mandate',
ondelete='restrict',
readonly=True, states={'draft': [('readonly', False)]})
"account.banking.mandate",
string="Direct Debit Mandate",
ondelete="restrict",
readonly=True,
states={"draft": [("readonly", False)]},
)
mandate_required = fields.Boolean(
related='payment_mode_id.payment_method_id.mandate_required',
readonly=True)
related="payment_mode_id.payment_method_id.mandate_required", readonly=True
)
@api.model
def line_get_convert(self, line, part):
"""Copy mandate from invoice to account move line"""
res = super(AccountInvoice, self).line_get_convert(line, part)
if line.get('type') == 'dest' and line.get('invoice_id'):
invoice = self.browse(line['invoice_id'])
if invoice.type in ('out_invoice', 'out_refund'):
res['mandate_id'] = invoice.mandate_id.id or False
if line.get("type") == "dest" and line.get("invoice_id"):
invoice = self.browse(line["invoice_id"])
if invoice.type in ("out_invoice", "out_refund"):
res["mandate_id"] = invoice.mandate_id.id or False
return res
@api.model
@@ -35,8 +38,8 @@ class AccountInvoice(models.Model):
"""Fill the mandate_id from the partner if none is provided on
creation, using same method as upstream."""
onchanges = {
'_onchange_partner_id': ['mandate_id'],
'_onchange_payment_mode_id': ['mandate_id'],
"_onchange_partner_id": ["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):
@@ -55,13 +58,17 @@ class AccountInvoice(models.Model):
# to refund, and we also need to copy mandate from invoice to refund
@api.model
def _prepare_refund(
self, invoice, date_invoice=None, date=None, description=None,
journal_id=None):
self, invoice, date_invoice=None, date=None, description=None, journal_id=None
):
vals = super(AccountInvoice, self)._prepare_refund(
invoice, date_invoice=date_invoice, date=date,
description=description, journal_id=journal_id)
if invoice.type == 'out_invoice':
vals['mandate_id'] = invoice.mandate_id.id
invoice,
date_invoice=date_invoice,
date=date,
description=description,
journal_id=journal_id,
)
if invoice.type == "out_invoice":
vals["mandate_id"] = invoice.mandate_id.id
return vals
def set_mandate(self):
@@ -70,24 +77,29 @@ class AccountInvoice(models.Model):
else:
self.mandate_id = False
@api.onchange('partner_id', 'company_id')
@api.onchange("partner_id", "company_id")
def _onchange_partner_id(self):
"""Select by default the first valid mandate of the partner"""
res = super(AccountInvoice, self)._onchange_partner_id()
self.set_mandate()
return res
@api.onchange('payment_mode_id')
@api.onchange("payment_mode_id")
def _onchange_payment_mode_id(self):
super(AccountInvoice, self)._onchange_payment_mode_id()
self.set_mandate()
@api.constrains('mandate_id', 'company_id')
@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))
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)
)

View File

@@ -3,47 +3,51 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo import api, fields, models, _
from odoo import _, api, fields, models
from odoo.exceptions import ValidationError
class AccountMoveLine(models.Model):
_inherit = 'account.move.line'
_inherit = "account.move.line"
mandate_id = fields.Many2one(
'account.banking.mandate', string='Direct Debit Mandate',
ondelete='restrict')
"account.banking.mandate", string="Direct Debit Mandate", ondelete="restrict"
)
@api.multi
def _prepare_payment_line_vals(self, payment_order):
vals = super(AccountMoveLine, self)._prepare_payment_line_vals(
payment_order)
if payment_order.payment_type != 'inbound':
vals = super(AccountMoveLine, self)._prepare_payment_line_vals(payment_order)
if payment_order.payment_type != "inbound":
return vals
mandate = self.mandate_id
if not mandate and vals.get('mandate_id', False):
mandate = mandate.browse(vals['mandate_id'])
partner_bank_id = vals.get('partner_bank_id', False)
if not mandate and vals.get("mandate_id", False):
mandate = mandate.browse(vals["mandate_id"])
partner_bank_id = vals.get("partner_bank_id", False)
if not mandate:
if partner_bank_id:
domain = [('partner_bank_id', '=', partner_bank_id)]
domain = [("partner_bank_id", "=", partner_bank_id)]
else:
domain = [('partner_id', '=', self.partner_id.id)]
domain.append(('state', '=', 'valid'))
domain = [("partner_id", "=", self.partner_id.id)]
domain.append(("state", "=", "valid"))
mandate = mandate.search(domain, limit=1)
vals.update({
'mandate_id': mandate.id,
'partner_bank_id': mandate.partner_bank_id.id or partner_bank_id,
})
vals.update(
{
"mandate_id": mandate.id,
"partner_bank_id": mandate.partner_bank_id.id or partner_bank_id,
}
)
return vals
@api.multi
@api.constrains('mandate_id', 'company_id')
@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))
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)
)

View File

@@ -3,51 +3,64 @@
# 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.exceptions import ValidationError, UserError
from odoo import _, api, fields, models
from odoo.exceptions import UserError, ValidationError
class AccountPaymentLine(models.Model):
_inherit = 'account.payment.line'
_inherit = "account.payment.line"
mandate_id = fields.Many2one(
comodel_name='account.banking.mandate', string='Direct Debit Mandate',
domain=[('state', '=', 'valid')])
comodel_name="account.banking.mandate",
string="Direct Debit Mandate",
domain=[("state", "=", "valid")],
)
mandate_required = fields.Boolean(
related='order_id.payment_method_id.mandate_required', readonly=True)
related="order_id.payment_method_id.mandate_required", readonly=True
)
@api.multi
@api.constrains('mandate_id', 'partner_bank_id')
@api.constrains("mandate_id", "partner_bank_id")
def _check_mandate_bank_link(self):
for pline in self:
if (pline.mandate_id and pline.partner_bank_id and
pline.mandate_id.partner_bank_id !=
pline.partner_bank_id):
raise ValidationError(_(
"The payment line number %s has the bank account "
"'%s' which is not attached to the mandate '%s' (this "
"mandate is attached to the bank account '%s').") %
(pline.name,
pline.partner_bank_id.acc_number,
pline.mandate_id.unique_mandate_reference,
pline.mandate_id.partner_bank_id.acc_number))
if (
pline.mandate_id
and pline.partner_bank_id
and pline.mandate_id.partner_bank_id != pline.partner_bank_id
):
raise ValidationError(
_(
"The payment line number %s has the bank account "
"'%s' which is not attached to the mandate '%s' (this "
"mandate is attached to the bank account '%s')."
)
% (
pline.name,
pline.partner_bank_id.acc_number,
pline.mandate_id.unique_mandate_reference,
pline.mandate_id.partner_bank_id.acc_number,
)
)
@api.multi
@api.constrains('mandate_id', 'company_id')
@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))
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()
if self.mandate_required and not self.mandate_id:
raise UserError(_(
'Missing Mandate on payment line %s') % self.name)
raise UserError(_("Missing Mandate on payment line %s") % self.name)
return res

View File

@@ -1,13 +1,14 @@
# 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
from odoo import fields, models
class AccountPaymentMethod(models.Model):
_inherit = "account.payment.method"
mandate_required = fields.Boolean(
string='Mandate Required',
string="Mandate Required",
help="Activate this option if this payment method requires your "
"customer to sign a direct debit mandate with your company.")
"customer to sign a direct debit mandate with your company.",
)

View File

@@ -7,15 +7,18 @@ from odoo import api, fields, models
class BankPaymentLine(models.Model):
_inherit = 'bank.payment.line'
_inherit = "bank.payment.line"
mandate_id = fields.Many2one(
comodel_name='account.banking.mandate', string='Direct Debit Mandate',
related='payment_line_ids.mandate_id')
comodel_name="account.banking.mandate",
string="Direct Debit Mandate",
related="payment_line_ids.mandate_id",
)
@api.model
def same_fields_payment_line_and_bank_payment_line(self):
res = super(BankPaymentLine, self).\
same_fields_payment_line_and_bank_payment_line()
res.append('mandate_id')
res = super(
BankPaymentLine, self
).same_fields_payment_line_and_bank_payment_line()
res.append("mandate_id")
return res

View File

@@ -2,39 +2,43 @@
# Copyright 2017 Carlos Dauden <carlos.dauden@tecnativa.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
class ResPartner(models.Model):
_inherit = 'res.partner'
_inherit = "res.partner"
mandate_count = fields.Integer(
compute='_compute_mandate_count', string="Number of Mandates",
readonly=True)
compute="_compute_mandate_count", string="Number of Mandates", readonly=True
)
valid_mandate_id = fields.Many2one(
comodel_name='account.banking.mandate',
compute='_compute_valid_mandate_id',
string='First Valid Mandate')
comodel_name="account.banking.mandate",
compute="_compute_valid_mandate_id",
string="First Valid Mandate",
)
@api.multi
def _compute_mandate_count(self):
mandate_data = self.env['account.banking.mandate'].read_group(
[('partner_id', 'in', self.ids)], ['partner_id'], ['partner_id'])
mapped_data = dict([
(mandate['partner_id'][0], mandate['partner_id_count'])
for mandate in mandate_data])
mandate_data = self.env["account.banking.mandate"].read_group(
[("partner_id", "in", self.ids)], ["partner_id"], ["partner_id"]
)
mapped_data = {
mandate["partner_id"][0]: mandate["partner_id_count"]
for mandate in mandate_data
}
for partner in self:
partner.mandate_count = mapped_data.get(partner.id, 0)
@api.multi
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)
company_id = self.env.context.get("force_company", False)
if company_id:
company = self.env['res.company'].browse(company_id)
company = self.env["res.company"].browse(company_id)
else:
company = self.env['res.company']._company_default_get(
'account.banking.mandate')
company = self.env["res.company"]._company_default_get(
"account.banking.mandate"
)
mandates_dic = {}
for partner in self:
@@ -43,8 +47,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' and x.company_id == company)
"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

View File

@@ -2,26 +2,40 @@
# Copyright 2014 Tecnativa - Pedro M. Baeza
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo import api, fields, models, _
from odoo import _, api, fields, models
from odoo.exceptions import ValidationError
class ResPartnerBank(models.Model):
_inherit = 'res.partner.bank'
_inherit = "res.partner.bank"
mandate_ids = fields.One2many(
comodel_name='account.banking.mandate', inverse_name='partner_bank_id',
string='Direct Debit Mandates',
help='Banking mandates represent an authorization that the bank '
'account owner gives to a company for a specific operation.')
comodel_name="account.banking.mandate",
inverse_name="partner_bank_id",
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')
@api.constrains("company_id")
def _company_constrains(self):
for rpb in self:
if self.env['account.banking.mandate'].sudo().search(
[('partner_bank_id', '=', rpb.id),
('company_id', '!=', rpb.company_id.id)], limit=1):
if (
self.env["account.banking.mandate"]
.sudo()
.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.display_name,))
_(
"You cannot change the company of Partner Bank %s, "
"as there exists mandates referencing it that "
"belong to another company."
)
% (rpb.display_name,)
)

View File

@@ -1,21 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8" ?>
<!--
Copyright 2015-2016 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
-->
<odoo noupdate="1">
<record id="account_banking_mandate_rule" model="ir.rule">
<field name="name">Banking Mandate multi-company</field>
<field name="model_id" ref="model_account_banking_mandate"/>
<field name="domain_force">['|', ('company_id', '=', False), ('company_id', 'child_of', [user.company_id.id])]</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_unlink" eval="True"/>
<field name="perm_create" eval="True"/>
</record>
<record id="account_banking_mandate_rule" model="ir.rule">
<field name="name">Banking Mandate multi-company</field>
<field name="model_id" ref="model_account_banking_mandate" />
<field
name="domain_force"
>['|', ('company_id', '=', False), ('company_id', 'child_of', [user.company_id.id])]</field>
<field name="perm_read" eval="True" />
<field name="perm_write" eval="False" />
<field name="perm_unlink" eval="True" />
<field name="perm_create" eval="True" />
</record>
</odoo>

View File

@@ -1,3 +1,2 @@
from . import test_mandate
from . import test_invoice_mandate

View File

@@ -1,13 +1,11 @@
# 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
from odoo.tests.common import TransactionCase
class TestInvoiceMandate(TransactionCase):
def test_post_invoice_01(self):
self.invoice._onchange_partner_id()
@@ -16,16 +14,16 @@ class TestInvoiceMandate(TransactionCase):
self.invoice.action_invoice_open()
payable_move_lines = self.invoice.move_id.line_ids.filtered(
lambda s: s.account_id == self.invoice_account)
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
self.env["account.invoice.payment.line.multi"].with_context(
active_model="account.invoice", active_ids=self.invoice.ids
).create({}).run()
payment_order = self.env['account.payment.order'].search([])
payment_order = self.env["account.payment.order"].search([])
self.assertEqual(len(payment_order.ids), 1)
payment_order.payment_mode_id_change()
payment_order.draft2open()
@@ -34,20 +32,24 @@ class TestInvoiceMandate(TransactionCase):
self.assertEqual(self.mandate.payment_line_ids_count, 1)
def test_post_invoice_02(self):
partner_2 = self._create_res_partner('Jane with ACME Bank')
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
})
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 = 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()
@@ -55,7 +57,8 @@ class TestInvoiceMandate(TransactionCase):
self.invoice.action_invoice_open()
payable_move_lines = self.invoice.move_id.line_ids.filtered(
lambda s: s.account_id == self.invoice_account)
lambda s: s.account_id == self.invoice_account
)
if payable_move_lines:
with self.assertRaises(ValidationError):
payable_move_lines[0].mandate_id = mandate_2
@@ -67,167 +70,205 @@ class TestInvoiceMandate(TransactionCase):
self.invoice.refund()
def test_onchange_partner(self):
partner_2 = self._create_res_partner('Jane with ACME Bank')
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
})
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 = 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 = 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 = 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,
})
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'])
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 = 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
})
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 = 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,
})
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
})
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,
})
return self.env["res.bank"].create(
{"name": name, "bic": bic, "city": city, "country": country.id}
)
def setUp(self):
res = super(TestInvoiceMandate, self).setUp()
self.company = self.env.ref('base.main_company')
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'))
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
})
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.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 = 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()
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 = 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_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),
('company_id', '=', self.company.id)],
limit=1).id
self.invoice_account = self.env["account.account"].search(
[
(
"user_type_id",
"=",
self.env.ref("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,
),
("company_id", "=", self.company.id),
],
limit=1,
)
.id
)
self.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,
})
self.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,
}
)
self.env['account.invoice.line'].create({
'product_id': self.env.ref('product.product_product_4').id,
'quantity': 1.0,
'price_unit': 100.0,
'invoice_id': self.invoice.id,
'name': 'product that cost 100',
'account_id': invoice_line_account,
})
self.env["account.invoice.line"].create(
{
"product_id": self.env.ref("product.product_product_4").id,
"quantity": 1.0,
"price_unit": 100.0,
"invoice_id": self.invoice.id,
"name": "product that cost 100",
"account_id": invoice_line_account,
}
)
return res

View File

@@ -1,127 +1,144 @@
# © 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 datetime import timedelta
from odoo import fields
from odoo.exceptions import UserError, ValidationError
from datetime import timedelta
from odoo.tests.common import TransactionCase
class TestMandate(TransactionCase):
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')
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()
self.assertEqual(mandate.state, 'valid')
self.assertEqual(mandate.state, "valid")
mandate.cancel()
self.assertEqual(mandate.state, 'cancel')
self.assertEqual(mandate.state, "cancel")
mandate.back2draft()
self.assertEqual(mandate.state, 'draft')
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,
})
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,
})
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,
})
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')
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,
})
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))
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,
})
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['res.partner.bank'].create({
'acc_number': '1234',
'company_id': self.company_2.id,
'partner_id': self.company_2.partner_id.id,
})
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["res.partner.bank"].create(
{
"acc_number": "1234",
"company_id": self.company_2.id,
"partner_id": self.company_2.partner_id.id,
}
)
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 = self.env['res.partner.bank'].create({
'acc_number': '1234',
'company_id': self.company_2.id,
'partner_id': self.company_2.partner_id.id,
})
mandate = self.env["account.banking.mandate"].create(
{"signature_date": "2015-01-01", "company_id": self.company.id}
)
bank_account = self.env["res.partner.bank"].create(
{
"acc_number": "1234",
"company_id": self.company_2.id,
"partner_id": self.company_2.partner_id.id,
}
)
with self.assertRaises(ValidationError):
bank_account.mandate_ids += mandate
@@ -130,12 +147,14 @@ class TestMandate(TransactionCase):
Test case: create a mandate with no reference
Expected result: the reference of the created mandate is not empty
"""
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 = 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.assertTrue(mandate.unique_mandate_reference)
def test_mandate_reference_02(self):
@@ -143,13 +162,15 @@ class TestMandate(TransactionCase):
Test case: create a mandate with "ref01" as reference
Expected result: the reference of the created mandate is "ref01"
"""
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,
'unique_mandate_reference': "ref01",
})
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,
"unique_mandate_reference": "ref01",
}
)
self.assertEqual(mandate.unique_mandate_reference, "ref01")
def test_mandate_reference_03(self):
@@ -158,13 +179,15 @@ class TestMandate(TransactionCase):
Expected result: the reference of the created mandate is not empty and
is not "New"
"""
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,
'unique_mandate_reference': "New",
})
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,
"unique_mandate_reference": "New",
}
)
self.assertTrue(mandate.unique_mandate_reference)
self.assertNotEqual(mandate.unique_mandate_reference, "New")
@@ -173,13 +196,15 @@ class TestMandate(TransactionCase):
Test case: create a mandate with False as reference
Expected result: the reference of the created mandate is not empty
"""
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,
'unique_mandate_reference': False,
})
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,
"unique_mandate_reference": False,
}
)
self.assertTrue(mandate.unique_mandate_reference)
def test_mandate_reference_06(self):
@@ -187,22 +212,22 @@ class TestMandate(TransactionCase):
Test case: create a mandate with a empty string as reference
Expected result: the reference of the created mandate is not empty
"""
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,
'unique_mandate_reference': '',
})
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,
"unique_mandate_reference": "",
}
)
self.assertTrue(mandate.unique_mandate_reference)
def setUp(self):
res = super(TestMandate, self).setUp()
# Company
self.company = self.env.ref('base.main_company')
self.company = self.env.ref("base.main_company")
# Company 2
self.company_2 = self.env['res.company'].create({
'name': 'Company 2',
})
self.company_2 = self.env["res.company"].create({"name": "Company 2"})
return res

View File

@@ -1,149 +1,211 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8" ?>
<!--
© 2013-2016 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="view_mandate_form" model="ir.ui.view">
<field name="name">view.mandate.form</field>
<field name="model">account.banking.mandate</field>
<field name="arch" type="xml">
<form string="Banking Mandate">
<header>
<button name="validate" type="object" string="Validate" states="draft" class="oe_highlight"
invisible="context.get('mandate_bank_partner_view')"/>
<button name="cancel" type="object" string="Cancel" states="draft,valid"
invisible="context.get('mandate_bank_partner_view')"/>
<button name="back2draft" type="object" string="Back to Draft"
states="cancel" groups="account.group_account_manager"
confirm="You should set a mandate back to draft only if you cancelled it by mistake. Do you want to continue?"
invisible="context.get('mandate_bank_partner_view')"/>
<field name="state" widget="statusbar"/>
</header>
<sheet>
<div class="oe_button_box" name="button_box"/>
<div class="oe_title">
<h1>
<field name="unique_mandate_reference"
class="oe_inline"
readonly="1"/>
</h1>
</div>
<group name="main">
<field name="company_id" groups="base.group_multi_company"/>
<field name="format" string="Format"/>
<field name="type" string="Type"/>
<field name="partner_bank_id"
options="{'create_name_field': 'acc_number'}"
invisible="context.get('mandate_bank_partner_view')" />
<field name="partner_id"
<record id="view_mandate_form" model="ir.ui.view">
<field name="name">view.mandate.form</field>
<field name="model">account.banking.mandate</field>
<field name="arch" type="xml">
<form string="Banking Mandate">
<header>
<button
name="validate"
type="object"
string="Validate"
states="draft"
class="oe_highlight"
invisible="context.get('mandate_bank_partner_view')"
readonly="True"/>
<field name="signature_date"/>
<field name="scan"/>
<field name="last_debit_date"/>
</group>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
</field>
</record>
<record id="views_mandate_form_buttons" model="ir.ui.view">
<field name="name">view.mandate.form.buttons</field>
<field name="model">account.banking.mandate</field>
<field name="inherit_id" ref="account_banking_mandate.view_mandate_form"/>
<field name="groups_id" eval="[(6, 0, [ref('account_payment_order.group_account_payment')])]"/>
<field name="arch" type="xml">
<div name="button_box" position="inside">
<button name="show_payment_lines"
/>
<button
name="cancel"
type="object"
string="Cancel"
states="draft,valid"
invisible="context.get('mandate_bank_partner_view')"
/>
<button
name="back2draft"
type="object"
string="Back to Draft"
states="cancel"
groups="account.group_account_manager"
confirm="You should set a mandate back to draft only if you cancelled it by mistake. Do you want to continue?"
invisible="context.get('mandate_bank_partner_view')"
/>
<field name="state" widget="statusbar" />
</header>
<sheet>
<div class="oe_button_box" name="button_box" />
<div class="oe_title">
<h1>
<field
name="unique_mandate_reference"
class="oe_inline"
readonly="1"
/>
</h1>
</div>
<group name="main">
<field name="company_id" groups="base.group_multi_company" />
<field name="format" string="Format" />
<field name="type" string="Type" />
<field
name="partner_bank_id"
options="{'create_name_field': 'acc_number'}"
invisible="context.get('mandate_bank_partner_view')"
/>
<field
name="partner_id"
invisible="context.get('mandate_bank_partner_view')"
readonly="True"
/>
<field name="signature_date" />
<field name="scan" />
<field name="last_debit_date" />
</group>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers" />
<field name="message_ids" widget="mail_thread" />
</div>
</form>
</field>
</record>
<record id="views_mandate_form_buttons" model="ir.ui.view">
<field name="name">view.mandate.form.buttons</field>
<field name="model">account.banking.mandate</field>
<field name="inherit_id" ref="account_banking_mandate.view_mandate_form" />
<field
name="groups_id"
eval="[(6, 0, [ref('account_payment_order.group_account_payment')])]"
/>
<field name="arch" type="xml">
<div name="button_box" position="inside">
<button
name="show_payment_lines"
help="Payment lines"
class="oe_stat_button"
icon="fa-list"
type="object">
<field name="payment_line_ids_count"
widget="statinfo"
string="Payment lines"/>
</button>
</div>
</field>
</record>
<record id="view_mandate_tree" model="ir.ui.view">
<field name="name">view.mandate.tree</field>
<field name="model">account.banking.mandate</field>
<field name="arch" type="xml">
<tree string="Banking Mandate" colors="blue:state=='draft';black:state in ('expired', 'cancel')">
<field name="id" invisible="1"/>
<field name="company_id" groups="base.group_multi_company"/>
<field name="partner_id" invisible="context.get('mandate_bank_partner_view')"/>
<field name="format" string="Format"/>
<field name="unique_mandate_reference" string="Reference"/>
<field name="signature_date" string="Signature Date"/>
<field name="last_debit_date"/>
<button name="validate"
type="object"
>
<field
name="payment_line_ids_count"
widget="statinfo"
string="Payment lines"
/>
</button>
</div>
</field>
</record>
<record id="view_mandate_tree" model="ir.ui.view">
<field name="name">view.mandate.tree</field>
<field name="model">account.banking.mandate</field>
<field name="arch" type="xml">
<tree
string="Banking Mandate"
colors="blue:state=='draft';black:state in ('expired', 'cancel')"
>
<field name="id" invisible="1" />
<field name="company_id" groups="base.group_multi_company" />
<field
name="partner_id"
invisible="context.get('mandate_bank_partner_view')"
/>
<field name="format" string="Format" />
<field name="unique_mandate_reference" string="Reference" />
<field name="signature_date" string="Signature Date" />
<field name="last_debit_date" />
<button
name="validate"
type="object"
icon="fa-check"
string="Validate"
attrs="{'invisible': ['|', ('id', '=', False), ('state', '!=', 'draft')]}"/>
<button name="cancel"
attrs="{'invisible': ['|', ('id', '=', False), ('state', '!=', 'draft')]}"
/>
<button
name="cancel"
type="object"
icon="fa-times"
string="Cancel"
attrs="{'invisible': ['|', ('id', '=', False), ('state', '=', 'cancel')]}"/>
<button name="back2draft"
attrs="{'invisible': ['|', ('id', '=', False), ('state', '=', 'cancel')]}"
/>
<button
name="back2draft"
type="object"
icon="fa-undo"
string="Draft"
groups="account.group_account_manager"
attrs="{'invisible': ['|', ('id', '=', False), ('state', '!=', 'cancel')]}"/>
<field name="state"/>
</tree>
</field>
</record>
<record id="view_mandate_search" model="ir.ui.view">
<field name="name">view.mandate.search</field>
<field name="model">account.banking.mandate</field>
<field name="arch" type="xml">
<search string="Search Banking Mandates">
<field name="unique_mandate_reference" string="Reference or Partner" filter_domain="['|', ('unique_mandate_reference', 'ilike', self), ('partner_id', 'ilike', self)]"/>
<field name="partner_id"/>
<filter name="draft" string="Draft" domain="[('state', '=', 'draft')]" />
<filter name="valid" string="Valid" domain="[('state', '=', 'valid')]" />
<filter name="cancel" string="Cancelled" domain="[('state', '=', 'cancel')]" />
<filter name="expired" string="Expired" domain="[('state', '=', 'expired')]" />
<group string="Group By" name="groupby">
<filter name="state_groupby" string="State" context="{'group_by': 'state'}"/>
<filter name="signature_date_groupby" string="Signature Date" context="{'group_by': 'signature_date'}"/>
</group>
</search>
</field>
</record>
<record id="mandate_action" model="ir.actions.act_window">
<field name="name">Banking Mandates</field>
<field name="res_model">account.banking.mandate</field>
<field name="view_mode">tree,form</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
attrs="{'invisible': ['|', ('id', '=', False), ('state', '!=', 'cancel')]}"
/>
<field name="state" />
</tree>
</field>
</record>
<record id="view_mandate_search" model="ir.ui.view">
<field name="name">view.mandate.search</field>
<field name="model">account.banking.mandate</field>
<field name="arch" type="xml">
<search string="Search Banking Mandates">
<field
name="unique_mandate_reference"
string="Reference or Partner"
filter_domain="['|', ('unique_mandate_reference', 'ilike', self), ('partner_id', 'ilike', self)]"
/>
<field name="partner_id" />
<filter
name="draft"
string="Draft"
domain="[('state', '=', 'draft')]"
/>
<filter
name="valid"
string="Valid"
domain="[('state', '=', 'valid')]"
/>
<filter
name="cancel"
string="Cancelled"
domain="[('state', '=', 'cancel')]"
/>
<filter
name="expired"
string="Expired"
domain="[('state', '=', 'expired')]"
/>
<group string="Group By" name="groupby">
<filter
name="state_groupby"
string="State"
context="{'group_by': 'state'}"
/>
<filter
name="signature_date_groupby"
string="Signature Date"
context="{'group_by': 'signature_date'}"
/>
</group>
</search>
</field>
</record>
<record id="mandate_action" model="ir.actions.act_window">
<field name="name">Banking Mandates</field>
<field name="res_model">account.banking.mandate</field>
<field name="view_mode">tree,form</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Click to create a new Banking Mandate.
</p><p>
</p>
<p>
A Banking Mandate is a document signed by your customer that gives you the autorization to do one or several operations on his bank account.
</p>
</field>
</record>
<menuitem id="mandate_menu"
parent="account_payment_order.payment_root"
action="mandate_action"
sequence="30"
</field>
</record>
<menuitem
id="mandate_menu"
parent="account_payment_order.payment_root"
action="mandate_action"
sequence="30"
/>
</odoo>

View File

@@ -1,24 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8" ?>
<!--
© 2013-2016 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="invoice_form" model="ir.ui.view">
<field name="name">add.mandate.on.customer.invoice.form</field>
<field name="model">account.invoice</field>
<field name="inherit_id" ref="account_payment_partner.invoice_form"/>
<field name="arch" type="xml">
<field name="partner_bank_id" position="after">
<field name="mandate_id"
domain="[('partner_id', '=', commercial_partner_id), ('state', '=', 'valid')]"
attrs="{'required': [('mandate_required', '=', True)], 'invisible': [('mandate_required', '=', False)]}"/>
<field name="mandate_required" invisible="1"/>
<record id="invoice_form" model="ir.ui.view">
<field name="name">add.mandate.on.customer.invoice.form</field>
<field name="model">account.invoice</field>
<field name="inherit_id" ref="account_payment_partner.invoice_form" />
<field name="arch" type="xml">
<field name="partner_bank_id" position="after">
<field
name="mandate_id"
domain="[('partner_id', '=', commercial_partner_id), ('state', '=', 'valid')]"
attrs="{'required': [('mandate_required', '=', True)], 'invisible': [('mandate_required', '=', False)]}"
/>
<field name="mandate_required" invisible="1" />
</field>
</field>
</field>
</record>
</record>
</odoo>

View File

@@ -1,23 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8" ?>
<!--
© 2016 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="view_move_line_form" model="ir.ui.view">
<field name="name">account_banking_mandate.move_line_form</field>
<field name="model">account.move.line</field>
<field name="inherit_id" ref="account_payment_order.view_move_line_form" />
<field name="arch" type="xml">
<field name="partner_bank_id" position="after">
<field name="mandate_id"
domain="[('partner_id', '=', partner_id), ('state', '=', 'valid')]"/>
<record id="view_move_line_form" model="ir.ui.view">
<field name="name">account_banking_mandate.move_line_form</field>
<field name="model">account.move.line</field>
<field name="inherit_id" ref="account_payment_order.view_move_line_form" />
<field name="arch" type="xml">
<field name="partner_bank_id" position="after">
<field
name="mandate_id"
domain="[('partner_id', '=', partner_id), ('state', '=', 'valid')]"
/>
</field>
</field>
</field>
</record>
</record>
</odoo>

View File

@@ -1,37 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8" ?>
<!--
© 2013-2016 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="account_payment_line_form" model="ir.ui.view">
<field name="name">account_banking_mandate.account.payment.line.form</field>
<field name="model">account.payment.line</field>
<field name="inherit_id" ref="account_payment_order.account_payment_line_form"/>
<field name="arch" type="xml">
<field name="partner_bank_id" position="after">
<field name="mandate_required" invisible="1"/>
<field name="mandate_id"
domain="[('partner_bank_id', '=', partner_bank_id), ('state', '=', 'valid')]"
attrs="{'invisible': [('mandate_required', '=', False)], 'required': [('mandate_required', '=', True)]}"
context="{'default_partner_bank_id': partner_bank_id}"/>
<record id="account_payment_line_form" model="ir.ui.view">
<field name="name">account_banking_mandate.account.payment.line.form</field>
<field name="model">account.payment.line</field>
<field
name="inherit_id"
ref="account_payment_order.account_payment_line_form"
/>
<field name="arch" type="xml">
<field name="partner_bank_id" position="after">
<field name="mandate_required" invisible="1" />
<field
name="mandate_id"
domain="[('partner_bank_id', '=', partner_bank_id), ('state', '=', 'valid')]"
attrs="{'invisible': [('mandate_required', '=', False)], 'required': [('mandate_required', '=', True)]}"
context="{'default_partner_bank_id': partner_bank_id}"
/>
</field>
</field>
</field>
</record>
<record id="account_payment_line_tree" model="ir.ui.view">
<field name="name">account_banking_mandate.account.payment.line.tree</field>
<field name="model">account.payment.line</field>
<field name="inherit_id" ref="account_payment_order.account_payment_line_tree"/>
<field name="arch" type="xml">
<field name="partner_bank_id" position="after">
<field name="mandate_id"
invisible="context.get('default_payment_type') != 'inbound'"/>
</record>
<record id="account_payment_line_tree" model="ir.ui.view">
<field name="name">account_banking_mandate.account.payment.line.tree</field>
<field name="model">account.payment.line</field>
<field
name="inherit_id"
ref="account_payment_order.account_payment_line_tree"
/>
<field name="arch" type="xml">
<field name="partner_bank_id" position="after">
<field
name="mandate_id"
invisible="context.get('default_payment_type') != 'inbound'"
/>
</field>
</field>
</field>
</record>
</record>
</odoo>

View File

@@ -1,18 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="account_payment_method_form" model="ir.ui.view">
<field name="name">account_banking_mandate.account.payment.method.form</field>
<field name="model">account.payment.method</field>
<field name="inherit_id" ref="account_payment_mode.account_payment_method_form"/>
<field name="arch" type="xml">
<field name="bank_account_required" position="after">
<field name="mandate_required"
attrs="{'invisible': [('payment_type', '!=', 'inbound')]}"/>
<record id="account_payment_method_form" model="ir.ui.view">
<field name="name">account_banking_mandate.account.payment.method.form</field>
<field name="model">account.payment.method</field>
<field
name="inherit_id"
ref="account_payment_mode.account_payment_method_form"
/>
<field name="arch" type="xml">
<field name="bank_account_required" position="after">
<field
name="mandate_required"
attrs="{'invisible': [('payment_type', '!=', 'inbound')]}"
/>
</field>
</field>
</field>
</record>
</record>
</odoo>

View File

@@ -1,34 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8" ?>
<!--
© 2015-2016 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="bank_payment_line_form" model="ir.ui.view">
<field name="name">banking.mandate.bank.payment.line.form</field>
<field name="model">bank.payment.line</field>
<field name="inherit_id" ref="account_payment_order.bank_payment_line_form"/>
<field name="arch" type="xml">
<field name="partner_bank_id" position="after">
<field name="mandate_id"
invisible="context.get('default_payment_type')!='inbound'"/>
<record id="bank_payment_line_form" model="ir.ui.view">
<field name="name">banking.mandate.bank.payment.line.form</field>
<field name="model">bank.payment.line</field>
<field name="inherit_id" ref="account_payment_order.bank_payment_line_form" />
<field name="arch" type="xml">
<field name="partner_bank_id" position="after">
<field
name="mandate_id"
invisible="context.get('default_payment_type')!='inbound'"
/>
</field>
</field>
</field>
</record>
<record id="bank_payment_line_tree" model="ir.ui.view">
<field name="name">banking.mandate.bank.payment.line.tree</field>
<field name="model">bank.payment.line</field>
<field name="inherit_id" ref="account_payment_order.bank_payment_line_tree"/>
<field name="arch" type="xml">
<field name="partner_bank_id" position="after">
<field name="mandate_id" string="Mandate"
invisible="context.get('default_payment_type')!='inbound'"/>
</record>
<record id="bank_payment_line_tree" model="ir.ui.view">
<field name="name">banking.mandate.bank.payment.line.tree</field>
<field name="model">bank.payment.line</field>
<field name="inherit_id" ref="account_payment_order.bank_payment_line_tree" />
<field name="arch" type="xml">
<field name="partner_bank_id" position="after">
<field
name="mandate_id"
string="Mandate"
invisible="context.get('default_payment_type')!='inbound'"
/>
</field>
</field>
</field>
</record>
</record>
</odoo>

View File

@@ -1,25 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8" ?>
<!--
© 2016 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="partner_view_buttons" model="ir.ui.view">
<field name="name">mandate.res.partner.form</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="account.partner_view_buttons"/>
<field name="arch" type="xml">
<xpath expr="//button[@name='%(base.action_res_partner_bank_account_form)d']" position="after">
<button type="action" class="btn-link"
<record id="partner_view_buttons" model="ir.ui.view">
<field name="name">mandate.res.partner.form</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="account.partner_view_buttons" />
<field name="arch" type="xml">
<xpath
expr="//button[@name='%(base.action_res_partner_bank_account_form)d']"
position="after"
>
<button
type="action"
class="btn-link"
name="%(account_banking_mandate.mandate_action)d"
context="{'search_default_partner_id': active_id, 'default_partner_id': active_id}">
<field string="Mandate(s)" name="mandate_count" widget="statinfo"/>
</button>
</xpath>
</field>
</record>
context="{'search_default_partner_id': active_id, 'default_partner_id': active_id}"
>
<field string="Mandate(s)" name="mandate_count" widget="statinfo" />
</button>
</xpath>
</field>
</record>
</odoo>

View File

@@ -1,34 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8" ?>
<!--
© 2013-2016 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="mandate_partner_bank_form" model="ir.ui.view">
<field name="name">mandate.res.partner.bank.form</field>
<field name="model">res.partner.bank</field>
<field name="inherit_id" ref="base.view_partner_bank_form"/>
<field name="arch" type="xml">
<xpath expr="//form/group" position="inside">
<group name="mandates" string="Direct Debit Mandates">
<field name="mandate_ids" context="{'mandate_bank_partner_view': True}" nolabel="1"/>
</group>
</xpath>
</field>
</record>
<record id="mandate_partner_bank_tree" model="ir.ui.view">
<field name="name">mandate.res.partner.bank.tree</field>
<field name="model">res.partner.bank</field>
<field name="inherit_id" ref="base.view_partner_bank_tree"/>
<field name="arch" type="xml">
<field name="partner_id" position="after">
<field name="mandate_ids" string="Mandates"/>
<record id="mandate_partner_bank_form" model="ir.ui.view">
<field name="name">mandate.res.partner.bank.form</field>
<field name="model">res.partner.bank</field>
<field name="inherit_id" ref="base.view_partner_bank_form" />
<field name="arch" type="xml">
<xpath expr="//form/group" position="inside">
<group name="mandates" string="Direct Debit Mandates">
<field
name="mandate_ids"
context="{'mandate_bank_partner_view': True}"
nolabel="1"
/>
</group>
</xpath>
</field>
</field>
</record>
</record>
<record id="mandate_partner_bank_tree" model="ir.ui.view">
<field name="name">mandate.res.partner.bank.tree</field>
<field name="model">res.partner.bank</field>
<field name="inherit_id" ref="base.view_partner_bank_tree" />
<field name="arch" type="xml">
<field name="partner_id" position="after">
<field name="mandate_ids" string="Mandates" />
</field>
</field>
</record>
</odoo>