[ADD] account_banking_mandate_contact: new module

This commit is contained in:
Carlos Dauden
2022-12-09 09:52:06 +01:00
committed by Ernesto Tejeda
parent 0d9fa7785f
commit c98a7ae021
15 changed files with 358 additions and 0 deletions

View File

@@ -0,0 +1,78 @@
===============================
Account Banking Mandate Contact
===============================
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png
:target: https://odoo-community.org/page/development-status
:alt: Production/Stable
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
: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_banking_mandate_contact
: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_banking_mandate_contact
: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
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
Manage specific banking mandate in contact level
**Table of contents**
.. contents::
:local:
Usage
=====
To use this module you need to:
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_banking_mandate_contact%0Aversion:%2012.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.
Credits
=======
Authors
~~~~~~~
* Tecnativa
Contributors
~~~~~~~~~~~~
* Carlos Dauden <carlos.dauden@tecnativa.com>
Maintainers
~~~~~~~~~~~
This module is maintained by the OCA.
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
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_banking_mandate_contact>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View File

@@ -0,0 +1,2 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from . import models

View File

@@ -0,0 +1,18 @@
# Copyright 2019 Tecnativa - Carlos Dauden
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
{
"name": "Account Banking Mandate Contact",
"summary": "Assign specific banking mandates in contact level",
"version": "13.0.1.0.0",
"development_status": "Production/Stable",
"category": "Banking addons",
"website": "https://github.com/OCA/bank-payment",
"author": "Tecnativa, Odoo Community Association (OCA)",
"license": "AGPL-3",
"application": False,
"installable": True,
"depends": ["account_banking_mandate", "sale"],
"data": [
"views/res_partner.xml",
],
}

View File

@@ -0,0 +1,30 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_banking_mandate_contact
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 13.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: account_banking_mandate_contact
#: model:ir.model,name:account_banking_mandate_contact.model_res_partner
msgid "Contact"
msgstr ""
#. module: account_banking_mandate_contact
#: model:ir.model.fields,field_description:account_banking_mandate_contact.field_res_partner__contact_mandate_id
#: model:ir.model.fields,field_description:account_banking_mandate_contact.field_res_users__contact_mandate_id
msgid "Contact Mandate"
msgstr ""
#. module: account_banking_mandate_contact
#: model:ir.model,name:account_banking_mandate_contact.model_account_move_line
msgid "Journal Item"
msgstr ""

View File

@@ -0,0 +1,34 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_banking_mandate_contact
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-02-21 12:57+0100\n"
"PO-Revision-Date: 2020-02-21 12:58+0100\n"
"Last-Translator: Carlos Dauden <carlos.dauden@tecnativa.com>\n"
"Language-Team: \n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 1.8.7.1\n"
#. module: account_banking_mandate_contact
#: model:ir.model,name:account_banking_mandate_contact.model_res_partner
msgid "Contact"
msgstr "Contacto"
#. module: account_banking_mandate_contact
#: model:ir.model.fields,field_description:account_banking_mandate_contact.field_res_partner__contact_mandate_id
#: model:ir.model.fields,field_description:account_banking_mandate_contact.field_res_users__contact_mandate_id
msgid "Contact Mandate"
msgstr "Mandato del contacto"
#. module: account_banking_mandate_contact
#: model:ir.model,name:account_banking_mandate_contact.model_account_move_line
msgid "Journal Item"
msgstr "Apunte contable"

View File

@@ -0,0 +1,3 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from . import account_move_line
from . import res_partner

View File

@@ -0,0 +1,27 @@
# Copyright 2019 Tecnativa - Carlos Dauden
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo import models
class AccountMoveLine(models.Model):
_inherit = "account.move.line"
# Extended to use partner_shipping_id mandate if it have set
def _prepare_payment_line_vals(self, payment_order):
vals = super(AccountMoveLine, self)._prepare_payment_line_vals(payment_order)
if payment_order.payment_type != "inbound" or self.mandate_id:
return vals
mandate = (
self.move_id.partner_shipping_id.valid_mandate_id
or self.move_id.partner_id.valid_mandate_id
)
if mandate:
vals.update(
{
"mandate_id": mandate.id,
"partner_bank_id": mandate.partner_bank_id.id,
}
)
return vals

View File

@@ -0,0 +1,21 @@
# Copyright 2019 Tecnativa - Carlos Dauden
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo import fields, models
class ResPartner(models.Model):
_inherit = "res.partner"
contact_mandate_id = fields.Many2one(
comodel_name="account.banking.mandate",
string="Contact Mandate",
)
def _compute_valid_mandate_id(self):
procesed_partners = self.browse()
for partner in self:
if partner.contact_mandate_id.state == "valid":
partner.valid_mandate_id = partner.contact_mandate_id
procesed_partners |= partner
super(ResPartner, self - procesed_partners)._compute_valid_mandate_id()

View File

@@ -0,0 +1 @@
* Carlos Dauden <carlos.dauden@tecnativa.com>

View File

@@ -0,0 +1 @@
Manage specific banking mandate in contact level

View File

@@ -0,0 +1 @@
To use this module you need to:

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@@ -0,0 +1,4 @@
# Copyright 2021 Tecnativa - Víctor Martínez
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl
from . import test_account_payment_order

View File

@@ -0,0 +1,117 @@
# Copyright 2021 Tecnativa - Víctor Martínez
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl
from odoo import fields
from odoo.tests.common import Form, TransactionCase
class TestAccountPaymentOrder(TransactionCase):
def setUp(self):
super(TestAccountPaymentOrder, self).setUp()
self.partner = self.env["res.partner"].create({"name": "Test Partner"})
self.product = self.env["product.product"].create({"name": "Test product"})
self.partner_bank_core = self._create_res_partner_bank("N-CORE")
self.mandate_core = self._create_mandate(self.partner_bank_core, "CORE")
self.partner_bank_b2b = self._create_res_partner_bank("N-B2B")
self.mandate_b2b = self._create_mandate(self.partner_bank_b2b, "B2B")
self.method_sepa = self.env["account.payment.method"].create(
{
"name": "SEPA",
"code": "sepa_direct_debit",
"payment_type": "inbound",
"bank_account_required": True,
}
)
self.journal_bank = self.env["account.journal"].create(
{"name": "BANK", "type": "bank", "code": "bank"}
)
payment_form = Form(self.env["account.payment.mode"])
payment_form.name = "SEPA (CORE)"
payment_form.payment_method_id = self.method_sepa
payment_form.bank_account_link = "fixed"
payment_form.fixed_journal_id = self.journal_bank
payment_form.payment_order_ok = True
self.payment_core = payment_form.save()
self.payment_b2b = self.payment_core.copy({"name": "SEPA B2B"})
self.partner.customer_payment_mode_id = self.payment_core.id
self.env["account.journal"].create(
{"name": "SALE", "type": "sale", "code": "sale"}
)
self.invoice = self._create_invoice()
payment_order_form = Form(
self.env["account.payment.order"].with_context(
default_payment_type="inbound"
)
)
payment_order_form.payment_mode_id = self.payment_core
self.payment_order = payment_order_form.save()
def _create_res_partner_bank(self, acc_number):
res_partner_bank_form = Form(self.env["res.partner.bank"])
res_partner_bank_form.partner_id = self.partner
res_partner_bank_form.acc_number = acc_number
return res_partner_bank_form.save()
def _create_mandate(self, partner_bank, scheme):
mandate_form = Form(self.env["account.banking.mandate"])
mandate_form.partner_bank_id = partner_bank
mandate_form.signature_date = fields.Date.from_string("2021-01-01")
mandate = mandate_form.save()
mandate.validate()
return mandate
def _create_invoice(self):
invoice_form = Form(
self.env["account.move"].with_context(default_type="out_invoice")
)
invoice_form.partner_id = self.partner
invoice_form.invoice_date = fields.Date.from_string("2021-01-01")
with invoice_form.invoice_line_ids.new() as line_form:
line_form.product_id = self.product
line_form.quantity = 1
line_form.price_unit = 30
line_form.tax_ids.clear()
invoice = invoice_form.save()
invoice.action_post()
return invoice
def test_invoice_payment_mode(self):
self.assertEqual(self.invoice.state, "posted")
self.assertEqual(self.invoice.payment_mode_id, self.payment_core)
self.assertEqual(
self.invoice.invoice_date_due, fields.Date.from_string("2021-01-01")
)
def test_account_payment_order_core(self):
line_create_form = Form(
self.env["account.payment.line.create"].with_context(
active_model="account.payment.order", active_id=self.payment_order.id
)
)
line_create_form.date_type = "due"
line_create_form.due_date = fields.Date.from_string("2021-01-01")
line_create = line_create_form.save()
line_create.populate()
line_create.create_payment_lines()
self.assertAlmostEqual(len(self.payment_order.payment_line_ids), 1)
payment_line = self.payment_order.payment_line_ids.filtered(
lambda x: x.partner_id == self.partner
)
self.assertEqual(payment_line.partner_bank_id, self.partner_bank_core)
def test_account_payment_order_core_extra(self):
self.partner.contact_mandate_id = self.mandate_b2b
line_create_form = Form(
self.env["account.payment.line.create"].with_context(
active_model="account.payment.order", active_id=self.payment_order.id
)
)
line_create_form.date_type = "due"
line_create_form.due_date = fields.Date.from_string("2021-01-01")
line_create = line_create_form.save()
line_create.populate()
line_create.create_payment_lines()
self.assertAlmostEqual(len(self.payment_order.payment_line_ids), 1)
payment_line = self.payment_order.payment_line_ids.filtered(
lambda x: x.partner_id == self.partner
)
self.assertEqual(payment_line.partner_bank_id, self.partner_bank_b2b)

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="view_partner_property_form" model="ir.ui.view">
<field name="model">res.partner</field>
<field
name="inherit_id"
ref="account_payment_partner.view_partner_property_form"
/>
<field name="arch" type="xml">
<field name="customer_payment_mode_id" position="after">
<field
name="contact_mandate_id"
options="{'no_create': True}"
domain="[('partner_id', '=', commercial_partner_id), ('state', '=', 'valid')]"
/>
</field>
</field>
</record>
</odoo>