mirror of
https://github.com/OCA/bank-payment.git
synced 2025-02-02 10:37:31 +02:00
[MIG] account_payment_partner: Migration to 13.0
This commit is contained in:
@@ -14,13 +14,13 @@ Account Payment Partner
|
||||
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
|
||||
:alt: License: AGPL-3
|
||||
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fbank--payment-lightgray.png?logo=github
|
||||
:target: https://github.com/OCA/bank-payment/tree/12.0/account_payment_partner
|
||||
:target: https://github.com/OCA/bank-payment/tree/13.0/account_payment_partner
|
||||
:alt: OCA/bank-payment
|
||||
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
|
||||
:target: https://translation.odoo-community.org/projects/bank-payment-12-0/bank-payment-12-0-account_payment_partner
|
||||
:target: https://translation.odoo-community.org/projects/bank-payment-13-0/bank-payment-13-0-account_payment_partner
|
||||
:alt: Translate me on Weblate
|
||||
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
|
||||
:target: https://runbot.odoo-community.org/runbot/173/12.0
|
||||
:target: https://runbot.odoo-community.org/runbot/173/13.0
|
||||
:alt: Try me on Runbot
|
||||
|
||||
|badge1| |badge2| |badge3| |badge4| |badge5|
|
||||
@@ -84,7 +84,7 @@ Bug Tracker
|
||||
Bugs are tracked on `GitHub Issues <https://github.com/OCA/bank-payment/issues>`_.
|
||||
In case of trouble, please check there if your issue has already been reported.
|
||||
If you spotted it first, help us smashing it by providing a detailed and welcomed
|
||||
`feedback <https://github.com/OCA/bank-payment/issues/new?body=module:%20account_payment_partner%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
|
||||
`feedback <https://github.com/OCA/bank-payment/issues/new?body=module:%20account_payment_partner%0Aversion:%2013.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
|
||||
|
||||
Do not contact contributors directly about support or help with technical issues.
|
||||
|
||||
@@ -128,6 +128,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose
|
||||
mission is to support the collaborative development of Odoo features and
|
||||
promote its widespread use.
|
||||
|
||||
This module is part of the `OCA/bank-payment <https://github.com/OCA/bank-payment/tree/12.0/account_payment_partner>`_ project on GitHub.
|
||||
This module is part of the `OCA/bank-payment <https://github.com/OCA/bank-payment/tree/13.0/account_payment_partner>`_ project on GitHub.
|
||||
|
||||
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
{
|
||||
"name": "Account Payment Partner",
|
||||
"version": "12.0.1.0.0",
|
||||
"version": "13.0.1.0.0",
|
||||
"category": "Banking addons",
|
||||
"license": "AGPL-3",
|
||||
"summary": "Adds payment mode on partners and invoices",
|
||||
@@ -14,7 +14,7 @@
|
||||
"depends": ["account_payment_mode"],
|
||||
"data": [
|
||||
"views/res_partner_view.xml",
|
||||
"views/account_invoice_view.xml",
|
||||
"views/account_move_view.xml",
|
||||
"views/account_move_line.xml",
|
||||
"views/account_payment_mode.xml",
|
||||
"views/report_invoice.xml",
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from . import res_partner
|
||||
from . import account_invoice
|
||||
from . import account_move
|
||||
from . import account_move_line
|
||||
from . import account_payment_mode
|
||||
|
||||
@@ -1,154 +0,0 @@
|
||||
# Copyright 2014-16 Akretion - Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# Copyright 2014 Serv. Tecnol. Avanzados - Pedro M. Baeza
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
||||
|
||||
from odoo import _, api, fields, models
|
||||
from odoo.exceptions import ValidationError
|
||||
|
||||
|
||||
class AccountInvoice(models.Model):
|
||||
_inherit = "account.invoice"
|
||||
|
||||
payment_mode_id = fields.Many2one(
|
||||
comodel_name="account.payment.mode",
|
||||
string="Payment Mode",
|
||||
ondelete="restrict",
|
||||
readonly=True,
|
||||
states={"draft": [("readonly", False)]},
|
||||
)
|
||||
bank_account_required = fields.Boolean(
|
||||
related="payment_mode_id.payment_method_id.bank_account_required", readonly=True
|
||||
)
|
||||
partner_bank_id = fields.Many2one(ondelete="restrict")
|
||||
|
||||
@api.onchange("partner_id", "company_id")
|
||||
def _onchange_partner_id(self):
|
||||
res = super(AccountInvoice, self)._onchange_partner_id()
|
||||
if self.partner_id:
|
||||
if self.type == "in_invoice":
|
||||
pay_mode = self.with_context(
|
||||
force_company=self.company_id.id
|
||||
).partner_id.supplier_payment_mode_id
|
||||
self.payment_mode_id = pay_mode
|
||||
if (
|
||||
pay_mode
|
||||
and pay_mode.payment_type == "outbound"
|
||||
and pay_mode.payment_method_id.bank_account_required
|
||||
and self.commercial_partner_id.bank_ids
|
||||
):
|
||||
self.partner_bank_id = self.commercial_partner_id.bank_ids.filtered(
|
||||
lambda b: b.company_id == self.company_id or not b.company_id
|
||||
)[:1]
|
||||
else:
|
||||
self.partner_bank_id = False
|
||||
|
||||
elif self.type == "out_invoice":
|
||||
# No bank account assignation is done here as this is only
|
||||
# needed for printing purposes and it can conflict with
|
||||
# SEPA direct debit payments. Current report prints it.
|
||||
self.payment_mode_id = self.with_context(
|
||||
force_company=self.company_id.id
|
||||
).partner_id.customer_payment_mode_id
|
||||
else:
|
||||
self.payment_mode_id = False
|
||||
if self.type == "in_invoice":
|
||||
self.partner_bank_id = False
|
||||
return res
|
||||
|
||||
@api.onchange("payment_mode_id")
|
||||
def _onchange_payment_mode_id(self):
|
||||
pay_mode = self.payment_mode_id
|
||||
if (
|
||||
pay_mode
|
||||
and pay_mode.payment_type == "outbound"
|
||||
and not pay_mode.payment_method_id.bank_account_required
|
||||
):
|
||||
self.partner_bank_id = False
|
||||
elif not self.payment_mode_id:
|
||||
self.partner_bank_id = False
|
||||
|
||||
@api.model
|
||||
def create(self, vals):
|
||||
"""Fill the payment_mode_id from the partner if none is provided on
|
||||
creation, using same method as upstream."""
|
||||
onchanges = {"_onchange_partner_id": ["payment_mode_id"]}
|
||||
for onchange_method, changed_fields in onchanges.items():
|
||||
if any(f not in vals for f in changed_fields):
|
||||
invoice = self.new(vals)
|
||||
getattr(invoice, onchange_method)()
|
||||
for field in changed_fields:
|
||||
if field not in vals and invoice[field]:
|
||||
vals[field] = invoice._fields[field].convert_to_write(
|
||||
invoice[field], invoice
|
||||
)
|
||||
return super(AccountInvoice, self).create(vals)
|
||||
|
||||
@api.model
|
||||
def line_get_convert(self, line, part):
|
||||
"""Copy payment mode 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"])
|
||||
res["payment_mode_id"] = invoice.payment_mode_id.id or False
|
||||
return res
|
||||
|
||||
# I think copying payment mode from invoice to refund by default
|
||||
# is a good idea because the most common way of "paying" a refund is to
|
||||
# deduct it on the payment of the next invoice (and OCA/bank-payment
|
||||
# allows to have negative payment lines since March 2016)
|
||||
@api.model
|
||||
def _prepare_refund(
|
||||
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,
|
||||
)
|
||||
vals["payment_mode_id"] = invoice.payment_mode_id.id
|
||||
if invoice.type == "in_invoice":
|
||||
vals["partner_bank_id"] = invoice.partner_bank_id.id
|
||||
return vals
|
||||
|
||||
@api.constrains("company_id", "payment_mode_id")
|
||||
def _check_payment_mode_company_constrains(self):
|
||||
for rec in self.sudo():
|
||||
if rec.payment_mode_id and rec.company_id != rec.payment_mode_id.company_id:
|
||||
raise ValidationError(
|
||||
_(
|
||||
"The company of the invoice %s does not match "
|
||||
"with that of the payment mode"
|
||||
)
|
||||
% rec.name
|
||||
)
|
||||
|
||||
@api.constrains("partner_id", "partner_bank_id")
|
||||
def validate_partner_bank_id(self):
|
||||
"""Inhibit the validation of the bank account by default, as core
|
||||
rules are not the expected one for the bank-payment suite.
|
||||
"""
|
||||
if self.env.context.get("use_old_partner_bank_id_check"):
|
||||
super().validate_partner_bank_id()
|
||||
|
||||
def partner_banks_to_show(self):
|
||||
self.ensure_one()
|
||||
if self.partner_bank_id:
|
||||
return self.partner_bank_id
|
||||
if self.payment_mode_id.show_bank_account_from_journal:
|
||||
if self.payment_mode_id.bank_account_link == "fixed":
|
||||
return self.payment_mode_id.fixed_journal_id.bank_account_id
|
||||
else:
|
||||
return self.payment_mode_id.variable_journal_ids.mapped(
|
||||
"bank_account_id"
|
||||
)
|
||||
if (
|
||||
self.payment_mode_id.payment_method_id.code == "sepa_direct_debit"
|
||||
): # pragma: no cover
|
||||
return (
|
||||
self.mandate_id.partner_bank_id
|
||||
or self.partner_id.valid_mandate_id.partner_bank_id
|
||||
)
|
||||
# Return this as empty recordset
|
||||
return self.partner_bank_id
|
||||
136
account_payment_partner/models/account_move.py
Normal file
136
account_payment_partner/models/account_move.py
Normal file
@@ -0,0 +1,136 @@
|
||||
# Copyright 2014-16 Akretion - Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# Copyright 2014 Serv. Tecnol. Avanzados - Pedro M. Baeza
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
||||
|
||||
from odoo import _, api, fields, models
|
||||
from odoo.exceptions import ValidationError
|
||||
|
||||
|
||||
class AccountMove(models.Model):
|
||||
_inherit = "account.move"
|
||||
|
||||
payment_mode_filter_type_domain = fields.Char(
|
||||
compute="_compute_payment_mode_filter_type_domain"
|
||||
)
|
||||
partner_bank_filter_type_domain = fields.Many2one(
|
||||
comodel_name="res.partner", compute="_compute_partner_bank_filter_type_domain"
|
||||
)
|
||||
payment_mode_id = fields.Many2one(
|
||||
comodel_name="account.payment.mode",
|
||||
compute="_compute_payment_mode",
|
||||
store=True,
|
||||
ondelete="restrict",
|
||||
states={"draft": [("readonly", False)]},
|
||||
)
|
||||
bank_account_required = fields.Boolean(
|
||||
related="payment_mode_id.payment_method_id.bank_account_required", readonly=True
|
||||
)
|
||||
invoice_partner_bank_id = fields.Many2one(
|
||||
compute="_compute_invoice_partner_bank",
|
||||
store=True,
|
||||
ondelete="restrict",
|
||||
states={"draft": [("readonly", False)]},
|
||||
)
|
||||
|
||||
@api.depends("type")
|
||||
def _compute_payment_mode_filter_type_domain(self):
|
||||
for move in self:
|
||||
if move.type in ("out_invoice", "in_refund"):
|
||||
move.payment_mode_filter_type_domain = "inbound"
|
||||
elif move.type in ("in_invoice", "out_refund"):
|
||||
move.payment_mode_filter_type_domain = "outbound"
|
||||
else:
|
||||
move.payment_mode_filter_type_domain = False
|
||||
|
||||
@api.depends("partner_id", "type")
|
||||
def _compute_partner_bank_filter_type_domain(self):
|
||||
for move in self:
|
||||
if move.type in ("out_invoice", "in_refund"):
|
||||
move.partner_bank_filter_type_domain = move.bank_partner_id
|
||||
elif move.type in ("in_invoice", "out_refund"):
|
||||
move.partner_bank_filter_type_domain = move.commercial_partner_id
|
||||
else:
|
||||
move.partner_bank_filter_type_domain = False
|
||||
|
||||
@api.depends("partner_id", "company_id")
|
||||
def _compute_payment_mode(self):
|
||||
for move in self:
|
||||
if move.partner_id:
|
||||
if move.type == "in_invoice":
|
||||
move.payment_mode_id = move.with_context(
|
||||
force_company=move.company_id.id
|
||||
).partner_id.supplier_payment_mode_id
|
||||
elif move.type == "out_invoice":
|
||||
move.payment_mode_id = move.with_context(
|
||||
force_company=move.company_id.id
|
||||
).partner_id.customer_payment_mode_id
|
||||
else:
|
||||
move.payment_mode_id = False
|
||||
|
||||
@api.depends("partner_id", "payment_mode_id")
|
||||
def _compute_invoice_partner_bank(self):
|
||||
for move in self:
|
||||
# No bank account assignation is done for out_invoice as this is only
|
||||
# needed for printing purposes and it can conflict with
|
||||
# SEPA direct debit payments. Current report prints it.
|
||||
def get_bank_id():
|
||||
return move.commercial_partner_id.bank_ids.filtered(
|
||||
lambda b: b.company_id == move.company_id or not b.company_id
|
||||
)[:1]
|
||||
|
||||
bank_id = False
|
||||
if move.partner_id:
|
||||
pay_mode = move.payment_mode_id
|
||||
if move.type == "in_invoice":
|
||||
if (
|
||||
pay_mode
|
||||
and pay_mode.payment_type == "outbound"
|
||||
and pay_mode.payment_method_id.bank_account_required
|
||||
and move.commercial_partner_id.bank_ids
|
||||
):
|
||||
bank_id = get_bank_id()
|
||||
move.invoice_partner_bank_id = bank_id
|
||||
|
||||
# I think copying payment mode from invoice to refund by default
|
||||
# is a good idea because the most common way of "paying" a refund is to
|
||||
# deduct it on the payment of the next invoice (and OCA/bank-payment
|
||||
# allows to have negative payment lines since March 2016)
|
||||
def _reverse_move_vals(self, default_values, cancel=True):
|
||||
move_vals = super()._reverse_move_vals(default_values, cancel=cancel)
|
||||
move_vals["payment_mode_id"] = self.payment_mode_id.id
|
||||
if self.type == "in_invoice":
|
||||
move_vals["invoice_partner_bank_id"] = self.invoice_partner_bank_id.id
|
||||
return move_vals
|
||||
|
||||
@api.constrains("company_id", "payment_mode_id")
|
||||
def _check_payment_mode_company_constrains(self):
|
||||
for rec in self.sudo():
|
||||
if rec.payment_mode_id and rec.company_id != rec.payment_mode_id.company_id:
|
||||
raise ValidationError(
|
||||
_(
|
||||
"The company of the invoice %s does not match "
|
||||
"with that of the payment mode"
|
||||
)
|
||||
% rec.name
|
||||
)
|
||||
|
||||
def partner_banks_to_show(self):
|
||||
self.ensure_one()
|
||||
if self.invoice_partner_bank_id:
|
||||
return self.invoice_partner_bank_id
|
||||
if self.payment_mode_id.show_bank_account_from_journal:
|
||||
if self.payment_mode_id.bank_account_link == "fixed":
|
||||
return self.payment_mode_id.fixed_journal_id.bank_account_id
|
||||
else:
|
||||
return self.payment_mode_id.variable_journal_ids.mapped(
|
||||
"bank_account_id"
|
||||
)
|
||||
if (
|
||||
self.payment_mode_id.payment_method_id.code == "sepa_direct_debit"
|
||||
): # pragma: no cover
|
||||
return (
|
||||
self.mandate_id.partner_bank_id
|
||||
or self.partner_id.valid_mandate_id.partner_bank_id
|
||||
)
|
||||
# Return this as empty recordset
|
||||
return self.invoice_partner_bank_id
|
||||
@@ -1,16 +1,27 @@
|
||||
# Copyright 2016 Akretion (http://www.akretion.com/)
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
||||
|
||||
from odoo import fields, models
|
||||
from odoo import api, fields, models
|
||||
|
||||
|
||||
class AccountMoveLine(models.Model):
|
||||
_inherit = "account.move.line"
|
||||
|
||||
payment_mode_id = fields.Many2one(
|
||||
"account.payment.mode",
|
||||
string="Payment Mode",
|
||||
domain="[('company_id', '=', company_id)]",
|
||||
comodel_name="account.payment.mode",
|
||||
compute="_compute_payment_mode",
|
||||
store=True,
|
||||
ondelete="restrict",
|
||||
index=True,
|
||||
)
|
||||
|
||||
@api.depends("move_id.payment_mode_id")
|
||||
def _compute_payment_mode(self):
|
||||
for line in self:
|
||||
if line.move_id.is_invoice() and line.account_internal_type in (
|
||||
"receivable",
|
||||
"payable",
|
||||
):
|
||||
line.payment_mode_id = line.move_id.payment_mode_id
|
||||
else:
|
||||
line.payment_mode_id = False
|
||||
|
||||
@@ -29,7 +29,7 @@ class AccountPaymentMode(models.Model):
|
||||
def account_invoice_company_constrains(self):
|
||||
for mode in self:
|
||||
if (
|
||||
self.env["account.invoice"]
|
||||
self.env["account.move"]
|
||||
.sudo()
|
||||
.search(
|
||||
[
|
||||
@@ -42,7 +42,7 @@ class AccountPaymentMode(models.Model):
|
||||
raise ValidationError(
|
||||
_(
|
||||
"You cannot change the Company. There exists "
|
||||
"at least one Invoice with this Payment Mode, "
|
||||
"at least one Journal Entry with this Payment Mode, "
|
||||
"already assigned to another Company."
|
||||
)
|
||||
)
|
||||
|
||||
@@ -8,17 +8,14 @@ from odoo import api, fields, models
|
||||
class ResPartner(models.Model):
|
||||
_inherit = "res.partner"
|
||||
|
||||
# v8 fields : same without the _id suffix
|
||||
supplier_payment_mode_id = fields.Many2one(
|
||||
"account.payment.mode",
|
||||
string="Supplier Payment Mode",
|
||||
company_dependent=True,
|
||||
domain="[('payment_type', '=', 'outbound')]",
|
||||
help="Select the default payment mode for this supplier.",
|
||||
)
|
||||
customer_payment_mode_id = fields.Many2one(
|
||||
"account.payment.mode",
|
||||
string="Customer Payment Mode",
|
||||
company_dependent=True,
|
||||
domain="[('payment_type', '=', 'inbound')]",
|
||||
help="Select the default payment mode for this customer.",
|
||||
@@ -26,6 +23,6 @@ class ResPartner(models.Model):
|
||||
|
||||
@api.model
|
||||
def _commercial_fields(self):
|
||||
res = super(ResPartner, self)._commercial_fields()
|
||||
res = super()._commercial_fields()
|
||||
res += ["supplier_payment_mode_id", "customer_payment_mode_id"]
|
||||
return res
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
There is nothing to configure.
|
||||
@@ -3,7 +3,7 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
|
||||
<meta name="generator" content="Docutils 0.14: http://docutils.sourceforge.net/" />
|
||||
<title>Account Payment Partner</title>
|
||||
<style type="text/css">
|
||||
|
||||
@@ -367,7 +367,7 @@ ul.auto-toc {
|
||||
!! This file is generated by oca-gen-addon-readme !!
|
||||
!! changes will be overwritten. !!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||||
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/bank-payment/tree/12.0/account_payment_partner"><img alt="OCA/bank-payment" src="https://img.shields.io/badge/github-OCA%2Fbank--payment-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/bank-payment-12-0/bank-payment-12-0-account_payment_partner"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/173/12.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
|
||||
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/bank-payment/tree/13.0/account_payment_partner"><img alt="OCA/bank-payment" src="https://img.shields.io/badge/github-OCA%2Fbank--payment-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/bank-payment-13-0/bank-payment-13-0-account_payment_partner"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/173/13.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
|
||||
<p>This module adds severals fields:</p>
|
||||
<ul class="simple">
|
||||
<li>the <em>Supplier Payment Mode</em> and <em>Customer Payment Mode</em> on Partners,</li>
|
||||
@@ -429,7 +429,7 @@ are displayed.</p>
|
||||
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/bank-payment/issues">GitHub Issues</a>.
|
||||
In case of trouble, please check there if your issue has already been reported.
|
||||
If you spotted it first, help us smashing it by providing a detailed and welcomed
|
||||
<a class="reference external" href="https://github.com/OCA/bank-payment/issues/new?body=module:%20account_payment_partner%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
|
||||
<a class="reference external" href="https://github.com/OCA/bank-payment/issues/new?body=module:%20account_payment_partner%0Aversion:%2013.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
|
||||
<p>Do not contact contributors directly about support or help with technical issues.</p>
|
||||
</div>
|
||||
<div class="section" id="credits">
|
||||
@@ -469,7 +469,7 @@ If you spotted it first, help us smashing it by providing a detailed and welcome
|
||||
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
|
||||
mission is to support the collaborative development of Odoo features and
|
||||
promote its widespread use.</p>
|
||||
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/bank-payment/tree/12.0/account_payment_partner">OCA/bank-payment</a> project on GitHub.</p>
|
||||
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/bank-payment/tree/13.0/account_payment_partner">OCA/bank-payment</a> project on GitHub.</p>
|
||||
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -9,9 +9,10 @@ from odoo.tests import common
|
||||
class TestAccountPaymentPartner(common.SavepointCase):
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
super(TestAccountPaymentPartner, cls).setUpClass()
|
||||
super().setUpClass()
|
||||
|
||||
cls.res_users_model = cls.env["res.users"]
|
||||
cls.move_model = cls.env["account.move"]
|
||||
cls.journal_model = cls.env["account.journal"]
|
||||
cls.payment_mode_model = cls.env["account.payment.mode"]
|
||||
cls.partner_bank_model = cls.env["res.partner.bank"]
|
||||
@@ -46,6 +47,15 @@ class TestAccountPaymentPartner(common.SavepointCase):
|
||||
}
|
||||
)
|
||||
|
||||
cls.journal_purchase = cls.env["account.journal"].create(
|
||||
{
|
||||
"name": "Test Purchases Journal",
|
||||
"code": "tPUR",
|
||||
"type": "purchase",
|
||||
"company_id": cls.company.id,
|
||||
}
|
||||
)
|
||||
|
||||
cls.journal_c1 = cls.journal_model.create(
|
||||
{
|
||||
"name": "J1",
|
||||
@@ -167,7 +177,7 @@ class TestAccountPaymentPartner(common.SavepointCase):
|
||||
"bank_account_id": cls.journal_bank.id,
|
||||
}
|
||||
)
|
||||
cls.supplier_invoice = cls.env["account.invoice"].create(
|
||||
cls.supplier_invoice = cls.move_model.create(
|
||||
{
|
||||
"partner_id": cls.supplier.id,
|
||||
"type": "in_invoice",
|
||||
@@ -176,28 +186,28 @@ class TestAccountPaymentPartner(common.SavepointCase):
|
||||
)
|
||||
|
||||
def _create_invoice(self):
|
||||
|
||||
invoice = self.env["account.invoice"].create(
|
||||
invoice = self.move_model.create(
|
||||
{
|
||||
"partner_id": self.supplier.id,
|
||||
"journal_id": self.journal_sale.id,
|
||||
"account_id": self.invoice_account.id,
|
||||
"journal_id": self.journal_purchase.id,
|
||||
"type": "in_invoice",
|
||||
"company_id": self.company.id,
|
||||
"payment_mode_id": self.env.ref(
|
||||
"account_payment_mode.payment_mode_outbound_ct1"
|
||||
).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": invoice.id,
|
||||
"name": "product that cost 100",
|
||||
"account_id": self.invoice_line_account.id,
|
||||
"invoice_line_ids": [
|
||||
(
|
||||
0,
|
||||
None,
|
||||
{
|
||||
"product_id": self.env.ref("product.product_product_4").id,
|
||||
"quantity": 1.0,
|
||||
"price_unit": 100.0,
|
||||
"name": "product that cost 100",
|
||||
"account_id": self.invoice_line_account.id,
|
||||
},
|
||||
)
|
||||
],
|
||||
}
|
||||
)
|
||||
return invoice
|
||||
@@ -229,73 +239,61 @@ class TestAccountPaymentPartner(common.SavepointCase):
|
||||
|
||||
def test_out_invoice_onchange(self):
|
||||
# Test the onchange methods in invoice
|
||||
invoice = self.env["account.invoice"].new(
|
||||
invoice = self.move_model.new(
|
||||
{
|
||||
"partner_id": self.customer.id,
|
||||
"type": "out_invoice",
|
||||
"company_id": self.company.id,
|
||||
}
|
||||
)
|
||||
|
||||
invoice._onchange_partner_id()
|
||||
|
||||
self.assertEquals(invoice.payment_mode_id, self.customer_payment_mode)
|
||||
|
||||
invoice.company_id = self.company_2
|
||||
invoice._onchange_partner_id()
|
||||
self.assertEquals(invoice.payment_mode_id, self.payment_mode_model)
|
||||
|
||||
invoice.payment_mode_id = False
|
||||
invoice._onchange_payment_mode_id()
|
||||
self.assertFalse(invoice.partner_bank_id)
|
||||
self.assertFalse(invoice.invoice_partner_bank_id)
|
||||
|
||||
def test_in_invoice_onchange(self):
|
||||
# Test the onchange methods in invoice
|
||||
self.manual_out.bank_account_required = True
|
||||
invoice = self.env["account.invoice"].new(
|
||||
invoice = self.move_model.new(
|
||||
{
|
||||
"partner_id": self.supplier.id,
|
||||
"type": "in_invoice",
|
||||
"company_id": self.company.id,
|
||||
}
|
||||
)
|
||||
|
||||
invoice._onchange_partner_id()
|
||||
|
||||
self.assertEquals(invoice.payment_mode_id, self.supplier_payment_mode)
|
||||
self.assertEquals(invoice.partner_bank_id, self.supplier_bank)
|
||||
self.assertEquals(invoice.invoice_partner_bank_id, self.supplier_bank)
|
||||
|
||||
invoice.company_id = self.company_2
|
||||
invoice._onchange_partner_id()
|
||||
self.assertEquals(invoice.payment_mode_id, self.supplier_payment_mode_c2)
|
||||
self.assertEquals(invoice.partner_bank_id, self.supplier_bank_2)
|
||||
self.assertEquals(invoice.invoice_partner_bank_id, self.supplier_bank_2)
|
||||
|
||||
invoice.payment_mode_id = self.supplier_payment_mode
|
||||
invoice._onchange_payment_mode_id()
|
||||
self.assertTrue(invoice.partner_bank_id)
|
||||
self.assertTrue(invoice.invoice_partner_bank_id)
|
||||
|
||||
self.manual_out.bank_account_required = False
|
||||
|
||||
invoice.payment_mode_id = self.supplier_payment_mode_c2
|
||||
invoice._onchange_payment_mode_id()
|
||||
self.assertFalse(invoice.partner_bank_id)
|
||||
self.assertFalse(invoice.invoice_partner_bank_id)
|
||||
|
||||
invoice.partner_id = False
|
||||
invoice._onchange_partner_id()
|
||||
self.assertEquals(invoice.payment_mode_id, self.payment_mode_model)
|
||||
self.assertEquals(invoice.partner_bank_id, self.partner_bank_model)
|
||||
self.assertEquals(invoice.invoice_partner_bank_id, self.partner_bank_model)
|
||||
|
||||
def test_invoice_create(self):
|
||||
invoice = self._create_invoice()
|
||||
invoice.action_invoice_open()
|
||||
aml = invoice.move_id.line_ids.filtered(
|
||||
invoice.action_post()
|
||||
aml = invoice.line_ids.filtered(
|
||||
lambda l: l.account_id.user_type_id == self.acct_type_payable
|
||||
)
|
||||
self.assertEquals(invoice.payment_mode_id, aml[0].payment_mode_id)
|
||||
|
||||
def test_invoice_constrains(self):
|
||||
with self.assertRaises(ValidationError):
|
||||
self.env["account.invoice"].create(
|
||||
self.move_model.create(
|
||||
{
|
||||
"partner_id": self.supplier.id,
|
||||
"type": "in_invoice",
|
||||
@@ -305,7 +303,7 @@ class TestAccountPaymentPartner(common.SavepointCase):
|
||||
)
|
||||
|
||||
def test_payment_mode_constrains_01(self):
|
||||
self.env["account.invoice"].create(
|
||||
self.move_model.create(
|
||||
{
|
||||
"partner_id": self.supplier.id,
|
||||
"type": "in_invoice",
|
||||
@@ -316,14 +314,14 @@ class TestAccountPaymentPartner(common.SavepointCase):
|
||||
self.supplier_payment_mode.company_id = self.company_2
|
||||
|
||||
def test_payment_mode_constrains_02(self):
|
||||
self.env["account.move"].create(
|
||||
self.move_model.create(
|
||||
{
|
||||
"date": fields.Date.today(),
|
||||
"journal_id": self.journal_sale.id,
|
||||
"name": "/",
|
||||
"ref": "reference",
|
||||
"state": "draft",
|
||||
"line_ids": [
|
||||
"invoice_line_ids": [
|
||||
(
|
||||
0,
|
||||
0,
|
||||
@@ -354,28 +352,28 @@ class TestAccountPaymentPartner(common.SavepointCase):
|
||||
|
||||
def test_invoice_refund(self):
|
||||
invoice = self._create_invoice()
|
||||
invoice.partner_bank_id = False
|
||||
invoice.action_invoice_open()
|
||||
invoice.invoice_partner_bank_id = False
|
||||
invoice.action_post()
|
||||
# Lets create a refund invoice for invoice_1.
|
||||
# I refund the invoice Using Refund Button.
|
||||
context = {
|
||||
"active_model": "account.invoice",
|
||||
"active_ids": [invoice.id],
|
||||
"active_id": invoice.id,
|
||||
}
|
||||
account_invoice_refund = (
|
||||
self.env["account.invoice.refund"]
|
||||
.with_context(context)
|
||||
.create(dict(description="Refund for Invoice", filter_refund="refund"))
|
||||
refund_invoice_wizard = (
|
||||
self.env["account.move.reversal"]
|
||||
.with_context(
|
||||
{
|
||||
"active_ids": [invoice.id],
|
||||
"active_id": invoice.id,
|
||||
"active_model": "account.move",
|
||||
}
|
||||
)
|
||||
.create({"refund_method": "refund", "reason": "reason test create"})
|
||||
)
|
||||
refund_invoice = self.move_model.browse(
|
||||
refund_invoice_wizard.reverse_moves()["res_id"]
|
||||
)
|
||||
# I clicked on refund button.
|
||||
account_invoice_refund.with_context(context).invoice_refund()
|
||||
invoice_refund = invoice.refund_invoice_ids[0]
|
||||
|
||||
self.assertEquals(invoice_refund.payment_mode_id, invoice.payment_mode_id)
|
||||
self.assertEquals(refund_invoice.payment_mode_id, invoice.payment_mode_id)
|
||||
self.assertEquals(
|
||||
invoice_refund.partner_bank_id,
|
||||
self.env.ref("account_payment_mode.main_company_iban"),
|
||||
refund_invoice.invoice_partner_bank_id, invoice.invoice_partner_bank_id
|
||||
)
|
||||
|
||||
def test_partner(self):
|
||||
@@ -385,49 +383,94 @@ class TestAccountPaymentPartner(common.SavepointCase):
|
||||
)
|
||||
|
||||
def test_partner_onchange(self):
|
||||
customer_invoice = self.env["account.invoice"].create(
|
||||
customer_invoice = self.move_model.create(
|
||||
{"partner_id": self.customer.id, "type": "out_invoice"}
|
||||
)
|
||||
customer_invoice._onchange_partner_id()
|
||||
self.assertEqual(customer_invoice.payment_mode_id, self.customer_payment_mode)
|
||||
|
||||
self.supplier_invoice._onchange_partner_id()
|
||||
self.assertEqual(self.supplier_invoice.partner_bank_id, self.supplier_bank)
|
||||
self.assertEqual(
|
||||
self.supplier_invoice.invoice_partner_bank_id, self.supplier_bank
|
||||
)
|
||||
vals = {"partner_id": False, "type": "out_invoice"}
|
||||
invoice = self.env["account.invoice"].new(vals)
|
||||
invoice._onchange_partner_id()
|
||||
invoice = self.move_model.new(vals)
|
||||
self.assertFalse(invoice.payment_mode_id)
|
||||
vals = {"partner_id": False, "type": "in_invoice"}
|
||||
invoice = self.env["account.invoice"].new(vals)
|
||||
invoice._onchange_partner_id()
|
||||
self.assertFalse(invoice.partner_bank_id)
|
||||
invoice = self.move_model.new(vals)
|
||||
self.assertFalse(invoice.invoice_partner_bank_id)
|
||||
|
||||
def test_onchange_payment_mode_id(self):
|
||||
mode = self.supplier_payment_mode
|
||||
mode.payment_method_id.bank_account_required = True
|
||||
self.supplier_invoice.partner_bank_id = self.supplier_bank.id
|
||||
self.supplier_invoice.invoice_partner_bank_id = self.supplier_bank.id
|
||||
self.supplier_invoice.payment_mode_id = mode.id
|
||||
self.supplier_invoice._onchange_payment_mode_id()
|
||||
self.assertEqual(self.supplier_invoice.partner_bank_id, self.supplier_bank)
|
||||
self.assertEqual(
|
||||
self.supplier_invoice.invoice_partner_bank_id, self.supplier_bank
|
||||
)
|
||||
mode.payment_method_id.bank_account_required = False
|
||||
self.supplier_invoice._onchange_payment_mode_id()
|
||||
self.assertFalse(self.supplier_invoice.partner_bank_id)
|
||||
self.assertEqual(
|
||||
self.supplier_invoice.invoice_partner_bank_id, self.supplier_bank
|
||||
)
|
||||
self.supplier_invoice.payment_mode_id = False
|
||||
self.supplier_invoice._onchange_payment_mode_id()
|
||||
self.assertFalse(self.supplier_invoice.partner_bank_id)
|
||||
self.assertFalse(self.supplier_invoice.invoice_partner_bank_id)
|
||||
|
||||
def test_print_report(self):
|
||||
self.supplier_invoice.partner_bank_id = self.supplier_bank.id
|
||||
self.supplier_invoice.invoice_partner_bank_id = self.supplier_bank.id
|
||||
report = self.env.ref("account.account_invoices")
|
||||
res = str(report.render_qweb_html(self.supplier_invoice.ids)[0])
|
||||
self.assertIn(self.supplier_bank.acc_number, res)
|
||||
payment_mode = self.supplier_payment_mode
|
||||
payment_mode.show_bank_account_from_journal = True
|
||||
self.supplier_invoice.payment_mode_id = payment_mode.id
|
||||
self.supplier_invoice.partner_bank_id = False
|
||||
self.supplier_invoice.invoice_partner_bank_id = False
|
||||
res = str(report.render_qweb_html(self.supplier_invoice.ids)[0])
|
||||
self.assertIn(self.journal_c1.bank_acc_number, res)
|
||||
payment_mode.bank_account_link = "variable"
|
||||
payment_mode.variable_journal_ids = [(6, 0, self.journal.ids)]
|
||||
res = str(report.render_qweb_html(self.supplier_invoice.ids)[0])
|
||||
self.assertIn(self.journal_bank.acc_number, res)
|
||||
|
||||
def test_filter_type_domain(self):
|
||||
in_invoice = self.move_model.create(
|
||||
{
|
||||
"partner_id": self.supplier.id,
|
||||
"type": "in_invoice",
|
||||
"journal_id": self.journal_c1.id,
|
||||
}
|
||||
)
|
||||
self.assertEqual(in_invoice.payment_mode_filter_type_domain, "outbound")
|
||||
self.assertEqual(
|
||||
in_invoice.partner_bank_filter_type_domain, in_invoice.commercial_partner_id
|
||||
)
|
||||
out_refund = self.move_model.create(
|
||||
{
|
||||
"partner_id": self.customer.id,
|
||||
"type": "out_refund",
|
||||
"journal_id": self.journal_c2.id,
|
||||
}
|
||||
)
|
||||
self.assertEqual(out_refund.payment_mode_filter_type_domain, "outbound")
|
||||
self.assertEqual(
|
||||
out_refund.partner_bank_filter_type_domain, out_refund.commercial_partner_id
|
||||
)
|
||||
in_refund = self.move_model.create(
|
||||
{
|
||||
"partner_id": self.supplier.id,
|
||||
"type": "in_refund",
|
||||
"journal_id": self.journal_c1.id,
|
||||
}
|
||||
)
|
||||
self.assertEqual(in_refund.payment_mode_filter_type_domain, "inbound")
|
||||
self.assertEqual(
|
||||
in_refund.partner_bank_filter_type_domain, in_refund.bank_partner_id
|
||||
)
|
||||
out_invoice = self.move_model.create(
|
||||
{
|
||||
"partner_id": self.customer.id,
|
||||
"type": "out_invoice",
|
||||
"journal_id": self.journal_c2.id,
|
||||
}
|
||||
)
|
||||
self.assertEqual(out_invoice.payment_mode_filter_type_domain, "inbound")
|
||||
self.assertEqual(
|
||||
out_invoice.partner_bank_filter_type_domain, out_invoice.bank_partner_id
|
||||
)
|
||||
|
||||
@@ -1,85 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2014-16 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
|
||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
-->
|
||||
|
||||
<odoo>
|
||||
|
||||
<record id="view_account_invoice_filter" model="ir.ui.view">
|
||||
<field name="name">account_payment_partner.account_invoice_search</field>
|
||||
<field name="model">account.invoice</field>
|
||||
<field name="inherit_id" ref="account.view_account_invoice_filter"/>
|
||||
<field name="arch" type="xml">
|
||||
<filter name="status" position="after">
|
||||
<filter string="Payment Mode" name="payment_mode_groupby"
|
||||
context="{'group_by': 'payment_mode_id'}"/>
|
||||
</filter>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="invoice_form" model="ir.ui.view">
|
||||
<field name="name">account_payment_partner.invoice_form</field>
|
||||
<field name="model">account.invoice</field>
|
||||
<field name="inherit_id" ref="account.invoice_form" />
|
||||
<field name="arch" type="xml">
|
||||
<field name="payment_term_id" position="after">
|
||||
<field name="payment_mode_id"
|
||||
domain="[('payment_type', '=', 'inbound'), ('company_id', '=', company_id)]"
|
||||
widget="selection"/>
|
||||
<field name="commercial_partner_id" invisible="1"/>
|
||||
</field>
|
||||
<field name="partner_bank_id" position="attributes">
|
||||
<attribute name="invisible">0</attribute>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="invoice_supplier_form" model="ir.ui.view">
|
||||
<field name="name">account_payment_partner.invoice_supplier_form</field>
|
||||
<field name="model">account.invoice</field>
|
||||
<field name="inherit_id" ref="account.invoice_supplier_form" />
|
||||
<field name="arch" type="xml">
|
||||
<field name="payment_term_id" position="after">
|
||||
<field name="payment_mode_id"
|
||||
domain="[('payment_type', '=', 'outbound'), ('company_id', '=', company_id)]"
|
||||
widget="selection"/>
|
||||
<field name="commercial_partner_id" invisible="1"/>
|
||||
<field name="bank_account_required" invisible="1"/>
|
||||
</field>
|
||||
<field name="partner_bank_id" position="attributes">
|
||||
<attribute name="domain">[('partner_id', '=', commercial_partner_id),
|
||||
'|',('company_id', '=', company_id),('company_id', '=', False)]</attribute>
|
||||
<attribute name="invisible">0</attribute>
|
||||
<attribute name="attrs">{'invisible': [('bank_account_required', '=', False)], 'required': [('bank_account_required', '=', True)]}</attribute>
|
||||
<attribute name="context">{'default_partner_id':commercial_partner_id}</attribute>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="invoice_tree" model="ir.ui.view">
|
||||
<field name="name">account_payment_partner.customer_invoice_tree</field>
|
||||
<field name="model">account.invoice</field>
|
||||
<field name="inherit_id" ref="account.invoice_tree"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="residual_signed" position="after">
|
||||
<field name="payment_mode_id"/>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="invoice_supplier_tree" model="ir.ui.view">
|
||||
<field name="name">account_payment_partner.supplier_invoice_tree</field>
|
||||
<field name="model">account.invoice</field>
|
||||
<field name="inherit_id" ref="account.invoice_supplier_tree"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="residual_signed" position="after">
|
||||
<field name="payment_mode_id"/>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
</odoo>
|
||||
57
account_payment_partner/views/account_move_view.xml
Normal file
57
account_payment_partner/views/account_move_view.xml
Normal file
@@ -0,0 +1,57 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2014-16 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
|
||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
-->
|
||||
|
||||
<odoo>
|
||||
|
||||
<record id="view_account_invoice_filter" model="ir.ui.view">
|
||||
<field name="name">account_payment_partner.account_invoice_search</field>
|
||||
<field name="model">account.move</field>
|
||||
<field name="inherit_id" ref="account.view_account_invoice_filter"/>
|
||||
<field name="arch" type="xml">
|
||||
<filter name="status" position="after">
|
||||
<filter string="Payment Mode" name="payment_mode_groupby"
|
||||
context="{'group_by': 'payment_mode_id'}"/>
|
||||
</filter>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="view_move_form" model="ir.ui.view">
|
||||
<field name="name">account_payment_partner.view_move_form</field>
|
||||
<field name="model">account.move</field>
|
||||
<field name="inherit_id" ref="account.view_move_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//div[field[@name='invoice_payment_term_id']]" position="after">
|
||||
<field name="payment_mode_id"
|
||||
domain="[('payment_type', '=', payment_mode_filter_type_domain), ('company_id', '=', company_id)]"
|
||||
widget="selection"
|
||||
invisible="context.get('default_type') not in ('out_invoice','out_refund','in_invoice','in_refund')"/>
|
||||
<field name="commercial_partner_id" invisible="1"/>
|
||||
<field name="bank_account_required" invisible="1"/>
|
||||
<field name="payment_mode_filter_type_domain" invisible="1"/>
|
||||
<field name="partner_bank_filter_type_domain" invisible="1"/>
|
||||
</xpath>
|
||||
<field name="invoice_partner_bank_id" position="attributes">
|
||||
<attribute name="domain">[('partner_id', '=', partner_bank_filter_type_domain),
|
||||
'|',('company_id', '=', company_id),('company_id', '=', False)]</attribute>
|
||||
<attribute name="attrs">{'required': [('bank_account_required', '=', True)]}</attribute>
|
||||
<attribute name="context">{'default_partner_id':commercial_partner_id}</attribute>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_invoice_tree" model="ir.ui.view">
|
||||
<field name="name">account_payment_partner.view_invoice_tree</field>
|
||||
<field name="model">account.move</field>
|
||||
<field name="inherit_id" ref="account.view_invoice_tree"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="amount_residual_signed" position="after">
|
||||
<field name="payment_mode_id"/>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
@@ -2,7 +2,7 @@
|
||||
<odoo>
|
||||
|
||||
<template id="report_invoice_payment_mode" inherit_id="account.report_invoice_document">
|
||||
<xpath expr="//p[@t-if='o.payment_term_id']" position="after">
|
||||
<xpath expr="//p[@t-if='o.invoice_payment_term_id']" position="after">
|
||||
<p t-if="o.payment_mode_id.note">
|
||||
<strong>Payment Mode:</strong>
|
||||
<span t-field="o.payment_mode_id.note" />
|
||||
|
||||
Reference in New Issue
Block a user