diff --git a/account_banking_pain_base/README.rst b/account_banking_pain_base/README.rst index ab9b5bba3fb..24e820f93f9 100644 --- a/account_banking_pain_base/README.rst +++ b/account_banking_pain_base/README.rst @@ -7,7 +7,7 @@ Account Banking PAIN Base Module !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:cb0a3e1e489965d9fd1e4540fb54b404f630887d8a913484c222034edbe91786 + !! source digest: sha256:b830f262c5a7db70d35218b9b420e0d1614bbb20c17e2a3cb4197609a514d2da !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/account_banking_pain_base/__manifest__.py b/account_banking_pain_base/__manifest__.py index 192f16ed0b5..02298499958 100644 --- a/account_banking_pain_base/__manifest__.py +++ b/account_banking_pain_base/__manifest__.py @@ -16,11 +16,13 @@ "external_dependencies": {"python": ["unidecode", "lxml"]}, "data": [ "security/security.xml", + "security/ir.model.access.csv", "views/account_payment_line.xml", "views/account_payment_order.xml", "views/account_payment_mode.xml", "views/res_config_settings.xml", "views/account_payment_method.xml", + "views/account_pain_regulatory_reporting.xml", ], "post_init_hook": "set_default_initiating_party", "installable": True, diff --git a/account_banking_pain_base/models/__init__.py b/account_banking_pain_base/models/__init__.py index 4f1503393fe..e66683d13b0 100644 --- a/account_banking_pain_base/models/__init__.py +++ b/account_banking_pain_base/models/__init__.py @@ -1,6 +1,7 @@ from . import account_payment_line from . import account_payment_order from . import account_payment_mode +from . import account_pain_regulatory_reporting from . import res_company from . import res_config_settings from . import account_payment_method diff --git a/account_banking_pain_base/models/account_pain_regulatory_reporting.py b/account_banking_pain_base/models/account_pain_regulatory_reporting.py new file mode 100644 index 00000000000..ba534128db5 --- /dev/null +++ b/account_banking_pain_base/models/account_pain_regulatory_reporting.py @@ -0,0 +1,49 @@ +# Copyright 2023 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class AccountPainRegulatoryReporting(models.Model): + _name = "account.pain.regulatory.reporting" + _description = "Regulatory Reporting Codes for ISO 20022/PAIN banking standard" + _order = "code, country_id" + + code = fields.Char(required=True, copy=False, size=10) + name = fields.Char(required=True, translate=True, copy=False) + country_id = fields.Many2one("res.country", ondelete="restrict", required=False) + active = fields.Boolean(default=True) + + _sql_constraints = [ + ( + "code_country_unique", + "unique(code, country_id)", + "This code already exists for that country.", + ) + ] + + @api.depends("code", "name") + def name_get(self): + res = [] + for rec in self: + res.append((rec.id, "[%s] %s" % (rec.code, rec.name))) + return res + + def _name_search( + self, name="", args=None, operator="ilike", limit=100, name_get_uid=None + ): + if args is None: + args = [] + ids = [] + if name and operator == "ilike": + ids = list(self._search([("code", "=", name)] + args, limit=limit)) + if ids: + return ids + return super()._name_search( + name=name, + args=args, + operator=operator, + limit=limit, + name_get_uid=name_get_uid, + ) diff --git a/account_banking_pain_base/models/account_payment_line.py b/account_banking_pain_base/models/account_payment_line.py index 2e3d0314753..ebb85f2dbd1 100644 --- a/account_banking_pain_base/models/account_payment_line.py +++ b/account_banking_pain_base/models/account_payment_line.py @@ -3,6 +3,8 @@ # Copyright 2014-2022 Tecnativa - Pedro M. Baeza # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +from lxml import etree + from odoo import api, fields, models @@ -163,18 +165,50 @@ class AccountPaymentLine(models.Model): help="If neither your bank nor your local regulations oblige you to " "set the category purpose, leave the field empty.", ) + # Regulatory Reporting codes are provided by national central banks for the countries + # where this data is required in specific circumstances + regulatory_reporting_id = fields.Many2one( + "account.pain.regulatory.reporting", + ondelete="restrict", + domain="[('country_id', 'in', (False, company_country_id))]", + ) + company_country_id = fields.Many2one(related="company_id.country_id") # PAIN allows 140 characters communication = fields.Char(size=140) - # The field struct_communication_type has been dropped in v9 - # We now use communication_type ; you should add an option - # in communication_type with selection_add=[] - communication_type = fields.Selection( - selection_add=[("ISO", "ISO")], ondelete={"ISO": "cascade"} - ) @api.model def _get_payment_line_grouping_fields(self): """Add specific PAIN fields to the grouping criteria.""" res = super()._get_payment_line_grouping_fields() - res += ["priority", "local_instrument", "category_purpose", "purpose"] + res += [ + "priority", + "local_instrument", + "category_purpose", + "purpose", + "regulatory_reporting_id", + ] return res + + def generate_regulatory_reporting(self, parent_node, gen_args): + if self.regulatory_reporting_id: + regulatory_reporting = etree.SubElement(parent_node, "RgltryRptg") + regulatory_reporting_details = etree.SubElement( + regulatory_reporting, "Dtls" + ) + regulatory_reporting_details_code = etree.SubElement( + regulatory_reporting_details, "Cd" + ) + regulatory_reporting_details_code.text = self.env[ + "account.payment.order" + ]._prepare_field( + "Regulatory Details Code", + "line.regulatory_reporting_id.code", + {"line": self}, + 10, + gen_args=gen_args, + ) + + def generate_purpose(self, parent_node): + if self.purpose: + purpose = etree.SubElement(parent_node, "Purp") + etree.SubElement(purpose, "Cd").text = self.purpose diff --git a/account_banking_pain_base/models/account_payment_order.py b/account_banking_pain_base/models/account_payment_order.py index 990507247dd..b9af0d1f75c 100644 --- a/account_banking_pain_base/models/account_payment_order.py +++ b/account_banking_pain_base/models/account_payment_order.py @@ -285,7 +285,6 @@ def _validate_xml(self, xml_string, gen_args): ) % str(e) ) from None - return True def finalize_sepa_file_creation(self, xml_root, gen_args): xml_string = etree.tostring( @@ -461,7 +460,6 @@ def generate_initiating_party_block(self, parent_node, gen_args): ) % self.company_id.name ) - return True @api.model def generate_party_agent( @@ -495,7 +493,6 @@ def generate_party_agent( # for Credit Transfers, in the 'C' block, if BIC is not provided, # we should not put the 'Creditor Agent' block at all, # as per the guidelines of the EPC - return True @api.model def generate_party_id(self, parent_node, party_type, partner): @@ -519,7 +516,9 @@ def generate_party_acc_number( party_account_other = etree.SubElement(party_account_id, "Othr") party_account_other_id = etree.SubElement(party_account_other, "Id") party_account_other_id.text = partner_bank.sanitized_acc_number - return True + if party_type == "Dbtr" and partner_bank.currency_id: + party_account_current = etree.SubElement(party_account, "Ccy") + party_account_current.text = partner_bank.currency_id.name @api.model def generate_address_block(self, parent_node, partner, gen_args): @@ -567,7 +566,6 @@ def generate_address_block(self, parent_node, partner, gen_args): gen_args=gen_args, ) adrline2.text = val - return True @api.model def generate_party_block( @@ -625,13 +623,12 @@ def generate_party_block( gen_args, bank_line=bank_line, ) - return True @api.model def generate_remittance_info_block(self, parent_node, line, gen_args): remittance_info = etree.SubElement(parent_node, "RmtInf") communication_type = line.payment_line_ids[:1].communication_type - if communication_type == "normal": + if communication_type == "free": remittance_info_unstructured = etree.SubElement(remittance_info, "Ustrd") remittance_info_unstructured.text = self._prepare_field( "Remittance Unstructured Information", @@ -640,7 +637,7 @@ def generate_remittance_info_block(self, parent_node, line, gen_args): 140, gen_args=gen_args, ) - else: + elif communication_type == "structured": remittance_info_structured = etree.SubElement(remittance_info, "Strd") creditor_ref_information = etree.SubElement( remittance_info_structured, "CdtrRefInf" @@ -657,7 +654,7 @@ def generate_remittance_info_block(self, parent_node, line, gen_args): creditor_ref_info_type_issuer = etree.SubElement( creditor_ref_info_type, "Issr" ) - creditor_ref_info_type_issuer.text = communication_type + creditor_ref_info_type_issuer.text = "ISO" creditor_reference = etree.SubElement( creditor_ref_information, "CdtrRef" ) @@ -676,7 +673,7 @@ def generate_remittance_info_block(self, parent_node, line, gen_args): creditor_ref_info_type_issuer = etree.SubElement( creditor_ref_info_type, "Issr" ) - creditor_ref_info_type_issuer.text = communication_type + creditor_ref_info_type_issuer.text = "ISO" creditor_reference = etree.SubElement(creditor_ref_information, "Ref") @@ -687,7 +684,6 @@ def generate_remittance_info_block(self, parent_node, line, gen_args): 35, gen_args=gen_args, ) - return True @api.model def generate_creditor_scheme_identification( @@ -709,4 +705,3 @@ def generate_creditor_scheme_identification( csi_scheme_name = etree.SubElement(csi_other, "SchmeNm") csi_scheme_name_proprietary = etree.SubElement(csi_scheme_name, "Prtry") csi_scheme_name_proprietary.text = scheme_name_proprietary - return True diff --git a/account_banking_pain_base/security/ir.model.access.csv b/account_banking_pain_base/security/ir.model.access.csv new file mode 100644 index 00000000000..c866ab33ea3 --- /dev/null +++ b/account_banking_pain_base/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_account_pain_regulatory_reporting_read,Read access on account.pain.regulatory.reporting,model_account_pain_regulatory_reporting,base.group_user,1,0,0,0 +access_account_pain_regulatory_reporting_full,Full access on account.pain.regulatory.reporting,model_account_pain_regulatory_reporting,account.group_account_manager,1,1,1,1 diff --git a/account_banking_pain_base/static/description/index.html b/account_banking_pain_base/static/description/index.html index 3b6dfae0b28..dc6d7a203df 100644 --- a/account_banking_pain_base/static/description/index.html +++ b/account_banking_pain_base/static/description/index.html @@ -367,7 +367,7 @@

Account Banking PAIN Base Module

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:cb0a3e1e489965d9fd1e4540fb54b404f630887d8a913484c222034edbe91786 +!! source digest: sha256:b830f262c5a7db70d35218b9b420e0d1614bbb20c17e2a3cb4197609a514d2da !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Beta License: AGPL-3 OCA/bank-payment Translate me on Weblate Try me on Runboat

This module contains fields and functions that are used by the module for SEPA diff --git a/account_banking_pain_base/views/account_pain_regulatory_reporting.xml b/account_banking_pain_base/views/account_pain_regulatory_reporting.xml new file mode 100644 index 00000000000..5a702388643 --- /dev/null +++ b/account_banking_pain_base/views/account_pain_regulatory_reporting.xml @@ -0,0 +1,80 @@ + + + + + + account.pain.regulatory.reporting + +

+ + + + + + + + + + + + + account.pain.regulatory.reporting + + + + + + + + + + + account.pain.regulatory.reporting + + + + + + + + + + + + + + + PAIN Regulatory Reporting + account.pain.regulatory.reporting + tree,form + + + + + diff --git a/account_banking_pain_base/views/account_payment_line.xml b/account_banking_pain_base/views/account_payment_line.xml index 918050524a7..6ae213cd6fe 100644 --- a/account_banking_pain_base/views/account_payment_line.xml +++ b/account_banking_pain_base/views/account_payment_line.xml @@ -17,6 +17,11 @@ + + @@ -30,6 +35,11 @@ + + + + + diff --git a/account_banking_sepa_credit_transfer/models/account_payment_order.py b/account_banking_sepa_credit_transfer/models/account_payment_order.py index ebd4047408c..35aa61dc9d4 100644 --- a/account_banking_sepa_credit_transfer/models/account_payment_order.py +++ b/account_banking_sepa_credit_transfer/models/account_payment_order.py @@ -191,10 +191,11 @@ def generate_payment_file(self): # noqa: C901 gen_args, line, ) - line_purpose = line.payment_line_ids[:1].purpose - if line_purpose: - purpose = etree.SubElement(credit_transfer_transaction_info, "Purp") - etree.SubElement(purpose, "Cd").text = line_purpose + payment_line = line.payment_line_ids[0] + payment_line.generate_purpose(credit_transfer_transaction_info) + payment_line.generate_regulatory_reporting( + credit_transfer_transaction_info, gen_args + ) self.generate_remittance_info_block( credit_transfer_transaction_info, line, gen_args ) diff --git a/account_banking_sepa_credit_transfer/tests/test_sct.py b/account_banking_sepa_credit_transfer/tests/test_sct.py index 8096c703f26..5552133d58f 100644 --- a/account_banking_sepa_credit_transfer/tests/test_sct.py +++ b/account_banking_sepa_credit_transfer/tests/test_sct.py @@ -231,7 +231,7 @@ def check_eur_currency_sct(self): ), 0, ) - self.assertEqual(partner1_pay_line1.communication_type, "normal") + self.assertEqual(partner1_pay_line1.communication_type, "free") self.assertEqual(partner1_pay_line1.communication, "F1341") self.payment_order.draft2open() self.assertEqual(self.payment_order.state, "open") @@ -322,7 +322,7 @@ def test_usd_currency_sct(self): ), 0, ) - self.assertEqual(partner2_pay_line1.communication_type, "normal") + self.assertEqual(partner2_pay_line1.communication_type, "free") self.assertEqual(partner2_pay_line1.communication, "Inv9032") self.payment_order.draft2open() self.assertEqual(self.payment_order.state, "open") @@ -392,7 +392,7 @@ def create_invoice( } data = { "partner_id": partner_id, - "reference_type": "none", + "reference_type": "free", "ref": reference, "currency_id": currency_id, "invoice_date": time.strftime("%Y-%m-%d"), diff --git a/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml b/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml index 62bcdb05590..7d81acec755 100644 --- a/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml +++ b/account_banking_sepa_direct_debit/demo/sepa_direct_debit_demo.xml @@ -5,7 +5,10 @@ variable - + FR78ZZZ424242 diff --git a/account_banking_sepa_direct_debit/models/account_payment_order.py b/account_banking_sepa_direct_debit/models/account_payment_order.py index bed20090fcc..78a40afff84 100644 --- a/account_banking_sepa_direct_debit/models/account_payment_order.py +++ b/account_banking_sepa_direct_debit/models/account_payment_order.py @@ -252,11 +252,11 @@ def generate_payment_file(self): gen_args, line, ) - line_purpose = line.payment_line_ids[:1].purpose - if line_purpose: - purpose = etree.SubElement(dd_transaction_info, "Purp") - etree.SubElement(purpose, "Cd").text = line_purpose - + payment_line = line.payment_line_ids[0] + payment_line.generate_purpose(dd_transaction_info) + payment_line.generate_regulatory_reporting( + dd_transaction_info, gen_args + ) self.generate_remittance_info_block(dd_transaction_info, line, gen_args) nb_of_transactions_b.text = str(transactions_count_b) diff --git a/account_banking_sepa_direct_debit/tests/test_sdd.py b/account_banking_sepa_direct_debit/tests/test_sdd.py index 1c25dedf027..2faa6c4ebcb 100644 --- a/account_banking_sepa_direct_debit/tests/test_sdd.py +++ b/account_banking_sepa_direct_debit/tests/test_sdd.py @@ -270,7 +270,7 @@ def check_sdd(self): ), 0, ) - self.assertEqual(partner1_pay_line1.communication_type, "normal") + self.assertEqual(partner1_pay_line1.communication_type, "free") self.assertEqual(partner1_pay_line1.communication, invoice1.name) payment_order._compute_sepa() payment_order.draft2open() @@ -313,7 +313,7 @@ def check_sdd(self): payment_order.generated2uploaded() self.assertEqual(payment_order.state, "uploaded") for inv in [invoice1, invoice2]: - self.assertEqual(inv.payment_state, "in_payment") + self.assertIn(inv.payment_state, ("in_payment", "paid")) self.assertEqual(self.partner2_mandate.recurrent_sequence_type, "recurring") return @@ -327,7 +327,7 @@ def create_invoice(self, partner_id, mandate, price_unit, inv_type="out_invoice" invoice = self.invoice_model.create( { "partner_id": partner_id, - "reference_type": "none", + "reference_type": "free", "currency_id": self.env.ref("base.EUR").id, "move_type": inv_type, "journal_id": self.journal_sale_company_B.id, diff --git a/account_payment_order/README.rst b/account_payment_order/README.rst index 2b2e6262353..ac6dbe62dcd 100644 --- a/account_payment_order/README.rst +++ b/account_payment_order/README.rst @@ -7,7 +7,7 @@ Account Payment Order !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:be08f419f59232b9d2477c622f6a1c7785923030652892888fad64f335a6b5ab + !! source digest: sha256:96ea0487f4913c511030f33354ddc59f9216077eee1c990a3feb451a50351960 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Mature-brightgreen.png diff --git a/account_payment_order/__manifest__.py b/account_payment_order/__manifest__.py index 1ca5046e8b6..c158faacd44 100644 --- a/account_payment_order/__manifest__.py +++ b/account_payment_order/__manifest__.py @@ -31,7 +31,7 @@ "views/account_payment_order.xml", "views/account_payment_line.xml", "views/account_move_line.xml", - "views/account_invoice_view.xml", + "views/account_move.xml", "data/payment_seq.xml", "report/print_account_payment_order.xml", "report/account_payment_order.xml", diff --git a/account_payment_order/migrations/16.0.2.0.0/pre-migration.py b/account_payment_order/migrations/16.0.2.0.0/pre-migration.py index 309fd42a7aa..39bb190b1bf 100644 --- a/account_payment_order/migrations/16.0.2.0.0/pre-migration.py +++ b/account_payment_order/migrations/16.0.2.0.0/pre-migration.py @@ -11,3 +11,17 @@ def migrate(cr, version): 'ALTER TABLE "account_payment_method" RENAME "payment_order_only" ' 'TO "payment_order_ok"' ) + # Harmonize values for reference_type on account.move + # and communication_type on account.payment.line: + # 2 possible values : free and structured + cr.execute( + "UPDATE account_move SET reference_type='free' WHERE reference_type='none'" + ) + cr.execute( + "UPDATE account_payment_line SET communication_type='free' " + "WHERE communication_type='normal'" + ) + cr.execute( + "UPDATE account_payment_line SET communication_type='structured' " + "WHERE communication_type='ISO'" + ) diff --git a/account_payment_order/models/account_move.py b/account_payment_order/models/account_move.py index 51ac75f8735..115e89aa7e0 100644 --- a/account_payment_order/models/account_move.py +++ b/account_payment_order/models/account_move.py @@ -19,13 +19,14 @@ class AccountMove(models.Model): ) payment_order_ok = fields.Boolean(compute="_compute_payment_order_ok") # we restore this field from <=v11 for now for preserving behavior - # TODO: Check if we can remove it and base everything in something at - # payment mode or company level + # in v16, we have a field invoice_reference_type on sale journals + # but it's not relevant because companies don't have a sale journal per country + # and we need it for supplier invoices too reference_type = fields.Selection( - selection=[("none", "Free Reference"), ("structured", "Structured Reference")], + selection=[("free", "Free Reference"), ("structured", "Structured Reference")], readonly=True, states={"draft": [("readonly", False)]}, - default="none", + default="free", ) payment_line_count = fields.Integer(compute="_compute_payment_line_count") @@ -56,13 +57,6 @@ def _get_invoice_in_payment_state(self): def _get_payment_order_communication_direct(self): """Retrieve the communication string for this direct item.""" communication = self.payment_reference or self.ref or self.name or "" - if self.is_invoice(): - if (self.reference_type or "none") != "none": - communication = self.ref - elif self.is_purchase_document(): - communication = self.ref or self.payment_reference - else: - communication = self.payment_reference or self.name return communication def _get_payment_order_communication_full(self): diff --git a/account_payment_order/models/account_move_line.py b/account_payment_order/models/account_move_line.py index 4c7f212f087..f029e496366 100644 --- a/account_payment_order/models/account_move_line.py +++ b/account_payment_order/models/account_move_line.py @@ -15,21 +15,6 @@ class AccountMoveLine(models.Model): check_company=True, ) - def _get_communication(self): - """ - Retrieve the communication string for the payment order - """ - aplo = self.env["account.payment.line"] - # default values for communication_type and communication - communication_type = "normal" - communication = self.move_id._get_payment_order_communication_full() - # change these default values if move line is linked to an invoice - if self.move_id.is_invoice(): - if (self.move_id.reference_type or "none") != "none": - ref2comm_type = aplo.invoice_reference_type2communication_type() - communication_type = ref2comm_type[self.move_id.reference_type] - return communication_type, communication - def _prepare_payment_line_vals(self, payment_order): self.ensure_one() vals = { diff --git a/account_payment_order/models/account_payment_line.py b/account_payment_order/models/account_payment_line.py index 853739c58c4..91d4b8fdaf8 100644 --- a/account_payment_order/models/account_payment_line.py +++ b/account_payment_order/models/account_payment_line.py @@ -105,7 +105,7 @@ class AccountPaymentLine(models.Model): store=True, readonly=False, precompute=True, - selection=[("normal", "Free")], + selection=[("free", "Free"), ("structured", "Structured")], required=True, ) payment_ids = fields.Many2many( @@ -167,7 +167,7 @@ def payment_line_hashcode(self): values.append(str(self.move_line_id.account_id or False)) # Don't group the payment lines that use a structured communication # otherwise it would break the structured communication system ! - if self.communication_type != "normal": + if self.communication_type != "free": values.append(str(self.id)) return "-".join(values) @@ -175,14 +175,17 @@ def payment_line_hashcode(self): def _compute_payment_line(self): for line in self: communication = False - communication_type = "normal" + communication_type = "free" currency_id = line.company_id.currency_id.id amount_currency = 0.0 move_line = line.move_line_id partner = line.partner_id partner_bank_id = False if move_line: - communication_type, communication = move_line._get_communication() + communication_type = move_line.move_id.reference_type + communication = ( + move_line.move_id._get_payment_order_communication_full() + ) currency_id = move_line.currency_id.id amount_currency = move_line.amount_residual_currency if line.order_id.payment_type == "outbound": @@ -198,14 +201,6 @@ def _compute_payment_line(self): line.partner_id = partner and partner.id or False line.partner_bank_id = partner_bank_id - def invoice_reference_type2communication_type(self): - """This method is designed to be inherited by - localization modules""" - # key = value of 'reference_type' field on account_invoice - # value = value of 'communication_type' field on account_payment_line - res = {"none": "normal", "structured": "structured"} - return res - def draft2open_payment_line_check(self): self.ensure_one() if self.bank_account_required and not self.partner_bank_id: diff --git a/account_payment_order/models/account_payment_order.py b/account_payment_order/models/account_payment_order.py index fd669b838d2..8d942bb8273 100644 --- a/account_payment_order/models/account_payment_order.py +++ b/account_payment_order/models/account_payment_order.py @@ -290,11 +290,9 @@ def _compute_journal_id(self): def action_uploaded_cancel(self): self.action_cancel() - return True def cancel2draft(self): self.write({"state": "draft"}) - return True def action_cancel(self): # Unreconcile and cancel payments @@ -309,7 +307,6 @@ def action_cancel(self): "generated_user_id": False, } ) - return True def draft2open(self): """ @@ -422,7 +419,6 @@ def draft2open(self): payment_vals.append(paydict["paylines"]._prepare_account_payment_vals()) self.env["account.payment"].create(payment_vals) self.write({"state": "open"}) - return True def generate_payment_file(self): """Returns (payment file as string, filename)""" @@ -469,7 +465,6 @@ def generated2uploaded(self): self.write( {"state": "uploaded", "date_uploaded": fields.Date.context_today(self)} ) - return True def action_move_journal_line(self): self.ensure_one() diff --git a/account_payment_order/static/description/index.html b/account_payment_order/static/description/index.html index d66a4d51034..3b328b2f788 100644 --- a/account_payment_order/static/description/index.html +++ b/account_payment_order/static/description/index.html @@ -367,7 +367,7 @@

Account Payment Order

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:be08f419f59232b9d2477c622f6a1c7785923030652892888fad64f335a6b5ab +!! source digest: sha256:96ea0487f4913c511030f33354ddc59f9216077eee1c990a3feb451a50351960 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Mature License: AGPL-3 OCA/bank-payment Translate me on Weblate Try me on Runboat

This module adds support for payment orders and debit orders.

diff --git a/account_payment_order/tests/test_payment_order_outbound.py b/account_payment_order/tests/test_payment_order_outbound.py index b6578569038..9742a42142c 100644 --- a/account_payment_order/tests/test_payment_order_outbound.py +++ b/account_payment_order/tests/test_payment_order_outbound.py @@ -277,7 +277,7 @@ def test_invoice_communication_01(self): def test_invoice_communication_02(self): self.invoice.payment_reference = "R1234" self.assertEqual( - "F1242", self.invoice._get_payment_order_communication_direct() + "R1234", self.invoice._get_payment_order_communication_direct() ) def test_manual_line_and_manual_date(self): @@ -383,7 +383,7 @@ def test_supplier_refund_reference(self): self.invoice.payment_reference = "F/1234" self.invoice.action_post() self.assertEqual( - "F1242", self.invoice._get_payment_order_communication_direct() + "F/1234", self.invoice._get_payment_order_communication_direct() ) self.refund = self._create_supplier_refund(self.invoice) with Form(self.refund) as refund_form: @@ -393,7 +393,9 @@ def test_supplier_refund_reference(self): line_form.price_unit = 75.0 self.refund.action_post() - self.assertEqual("R1234", self.refund._get_payment_order_communication_direct()) + self.assertEqual( + "FR/1234", self.refund._get_payment_order_communication_direct() + ) # The user add the outstanding payment to the invoice invoice_line = self.invoice.line_ids.filtered( @@ -415,8 +417,7 @@ def test_supplier_refund_reference(self): self.assertEqual(len(payment_order.payment_line_ids), 1) - self.assertEqual("F1242 R1234", payment_order.payment_line_ids.communication) - self.assertNotIn("FR/1234", payment_order.payment_line_ids.communication) + self.assertEqual("F/1234 FR/1234", payment_order.payment_line_ids.communication) def test_supplier_manual_refund(self): """ diff --git a/account_payment_order/views/account_invoice_view.xml b/account_payment_order/views/account_move.xml similarity index 92% rename from account_payment_order/views/account_invoice_view.xml rename to account_payment_order/views/account_move.xml index 11187123806..294c8e1967a 100644 --- a/account_payment_order/views/account_invoice_view.xml +++ b/account_payment_order/views/account_move.xml @@ -58,12 +58,7 @@ - +
diff --git a/account_payment_order/wizard/account_payment_line_create.py b/account_payment_order/wizard/account_payment_line_create.py index 217ba6ffed7..3fe01f724b8 100644 --- a/account_payment_order/wizard/account_payment_line_create.py +++ b/account_payment_order/wizard/account_payment_line_create.py @@ -190,4 +190,3 @@ def _compute_eligible_move_line_ids(self): def create_payment_lines(self): if self.move_line_ids: self.move_line_ids.create_payment_line_from_move_line(self.order_id) - return True diff --git a/account_payment_order_notification/tests/test_account_payment_order_notification.py b/account_payment_order_notification/tests/test_account_payment_order_notification.py index 43dec66783a..6bdb3847676 100644 --- a/account_payment_order_notification/tests/test_account_payment_order_notification.py +++ b/account_payment_order_notification/tests/test_account_payment_order_notification.py @@ -8,6 +8,7 @@ class TestAccountPaymentOrderNotification(TransactionCase): def setUpClass(cls): super().setUpClass() cls.payment_mode = cls.env.ref("account_payment_mode.payment_mode_inbound_dd1") + cls.payment_mode.payment_order_ok = True cls.partner_a = cls.env["res.partner"].create({"name": "Test partner A"}) cls.partner_a_child = cls.env["res.partner"].create( {