From b506c7730f7d66713090e3d8867a2e759ce79135 Mon Sep 17 00:00:00 2001 From: Valentin Vinagre Urteaga Date: Wed, 22 Apr 2020 13:47:27 +0200 Subject: [PATCH] [IMP] account_banking_sepa_credit_transfer: black, isort, prettier --- .../__init__.py | 1 - .../__manifest__.py | 32 +- .../data/account_payment_method.xml | 20 +- .../data/pain.001.001.04.xsd | 2 +- .../demo/sepa_credit_transfer_demo.xml | 41 +- .../models/__init__.py | 1 - .../models/account_payment_line.py | 7 +- .../models/account_payment_method.py | 34 +- .../models/account_payment_order.py | 196 ++++---- .../post_install.py | 15 +- .../static/description/icon.svg | 2 +- .../tests/__init__.py | 1 - .../tests/test_sct.py | 426 ++++++++++-------- 13 files changed, 429 insertions(+), 349 deletions(-) diff --git a/account_banking_sepa_credit_transfer/__init__.py b/account_banking_sepa_credit_transfer/__init__.py index 24b65ee99..e2b93a535 100644 --- a/account_banking_sepa_credit_transfer/__init__.py +++ b/account_banking_sepa_credit_transfer/__init__.py @@ -1,3 +1,2 @@ - from . import models from .post_install import update_bank_journals diff --git a/account_banking_sepa_credit_transfer/__manifest__.py b/account_banking_sepa_credit_transfer/__manifest__.py index 620e4e23d..8b27589b1 100644 --- a/account_banking_sepa_credit_transfer/__manifest__.py +++ b/account_banking_sepa_credit_transfer/__manifest__.py @@ -4,23 +4,17 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). { - 'name': 'Account Banking SEPA Credit Transfer', - 'summary': 'Create SEPA XML files for Credit Transfers', - 'version': '12.0.1.0.0', - 'license': 'AGPL-3', - 'author': "Akretion, " - "Tecnativa, " - "Odoo Community Association (OCA)", - 'website': 'https://github.com/OCA/bank-payment', - 'category': 'Banking addons', - 'conflicts': ['account_sepa'], - 'depends': ['account_banking_pain_base'], - 'data': [ - 'data/account_payment_method.xml', - ], - 'demo': [ - 'demo/sepa_credit_transfer_demo.xml' - ], - 'post_init_hook': 'update_bank_journals', - 'installable': True, + "name": "Account Banking SEPA Credit Transfer", + "summary": "Create SEPA XML files for Credit Transfers", + "version": "12.0.1.0.0", + "license": "AGPL-3", + "author": "Akretion, " "Tecnativa, " "Odoo Community Association (OCA)", + "website": "https://github.com/OCA/bank-payment", + "category": "Banking addons", + "conflicts": ["account_sepa"], + "depends": ["account_banking_pain_base"], + "data": ["data/account_payment_method.xml",], + "demo": ["demo/sepa_credit_transfer_demo.xml"], + "post_init_hook": "update_bank_journals", + "installable": True, } diff --git a/account_banking_sepa_credit_transfer/data/account_payment_method.xml b/account_banking_sepa_credit_transfer/data/account_payment_method.xml index 515314b5a..01b08910a 100644 --- a/account_banking_sepa_credit_transfer/data/account_payment_method.xml +++ b/account_banking_sepa_credit_transfer/data/account_payment_method.xml @@ -1,14 +1,10 @@ - + - - - - SEPA Credit Transfer to suppliers - sepa_credit_transfer - outbound - - pain.001.001.03 - - - + + SEPA Credit Transfer to suppliers + sepa_credit_transfer + outbound + + pain.001.001.03 + diff --git a/account_banking_sepa_credit_transfer/data/pain.001.001.04.xsd b/account_banking_sepa_credit_transfer/data/pain.001.001.04.xsd index 813c7fe29..1bd82454d 100644 --- a/account_banking_sepa_credit_transfer/data/pain.001.001.04.xsd +++ b/account_banking_sepa_credit_transfer/data/pain.001.001.04.xsd @@ -965,4 +965,4 @@ - \ No newline at end of file + diff --git a/account_banking_sepa_credit_transfer/demo/sepa_credit_transfer_demo.xml b/account_banking_sepa_credit_transfer/demo/sepa_credit_transfer_demo.xml index c11d6ff76..41fa37b8f 100644 --- a/account_banking_sepa_credit_transfer/demo/sepa_credit_transfer_demo.xml +++ b/account_banking_sepa_credit_transfer/demo/sepa_credit_transfer_demo.xml @@ -1,24 +1,21 @@ - + - - - - SEPA Credit Transfer to suppliers - - variable - - - - - - - - - - - - - - - + + SEPA Credit Transfer to suppliers + + variable + + + + + + + + + + + diff --git a/account_banking_sepa_credit_transfer/models/__init__.py b/account_banking_sepa_credit_transfer/models/__init__.py index 137fca50c..ff1cd9532 100644 --- a/account_banking_sepa_credit_transfer/models/__init__.py +++ b/account_banking_sepa_credit_transfer/models/__init__.py @@ -1,4 +1,3 @@ - from . import account_payment_method from . import account_payment_order from . import account_payment_line diff --git a/account_banking_sepa_credit_transfer/models/account_payment_line.py b/account_banking_sepa_credit_transfer/models/account_payment_line.py index a2fd57286..1614d4c6f 100644 --- a/account_banking_sepa_credit_transfer/models/account_payment_line.py +++ b/account_banking_sepa_credit_transfer/models/account_payment_line.py @@ -1,15 +1,14 @@ # Copyright 2017 Akretion - Alexis de Lattre # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -from odoo import models, fields +from odoo import fields, models class AccountPaymentLine(models.Model): - _inherit = 'account.payment.line' + _inherit = "account.payment.line" # local_instrument 'INST' used for instant credit transfers # which will begin on November 21st 2017, cf # https://www.europeanpaymentscouncil.eu/document-library/ # rulebooks/2017-sepa-instant-credit-transfer-rulebook - local_instrument = fields.Selection( - selection_add=[('INST', 'Instant Transfer')]) + local_instrument = fields.Selection(selection_add=[("INST", "Instant Transfer")]) diff --git a/account_banking_sepa_credit_transfer/models/account_payment_method.py b/account_banking_sepa_credit_transfer/models/account_payment_method.py index c093be50a..b1a9fde88 100644 --- a/account_banking_sepa_credit_transfer/models/account_payment_method.py +++ b/account_banking_sepa_credit_transfer/models/account_payment_method.py @@ -1,28 +1,34 @@ # Copyright 2016 Akretion (Alexis de Lattre ) # 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 AccountPaymentMethod(models.Model): - _inherit = 'account.payment.method' + _inherit = "account.payment.method" - pain_version = fields.Selection(selection_add=[ - ('pain.001.001.02', 'pain.001.001.02'), - ('pain.001.001.03', 'pain.001.001.03 ' - '(recommended for credit transfer)'), - ('pain.001.001.04', 'pain.001.001.04'), - ('pain.001.001.05', 'pain.001.001.05'), - ('pain.001.003.03', 'pain.001.003.03 (credit transfer in Germany)'), - ]) + pain_version = fields.Selection( + selection_add=[ + ("pain.001.001.02", "pain.001.001.02"), + ("pain.001.001.03", "pain.001.001.03 " "(recommended for credit transfer)"), + ("pain.001.001.04", "pain.001.001.04"), + ("pain.001.001.05", "pain.001.001.05"), + ("pain.001.003.03", "pain.001.003.03 (credit transfer in Germany)"), + ] + ) @api.multi def get_xsd_file_path(self): self.ensure_one() if self.pain_version in [ - 'pain.001.001.02', 'pain.001.001.03', 'pain.001.001.04', - 'pain.001.001.05', 'pain.001.003.03']: - path = 'account_banking_sepa_credit_transfer/data/%s.xsd'\ - % self.pain_version + "pain.001.001.02", + "pain.001.001.03", + "pain.001.001.04", + "pain.001.001.05", + "pain.001.003.03", + ]: + path = ( + "account_banking_sepa_credit_transfer/data/%s.xsd" % self.pain_version + ) return path return super(AccountPaymentMethod, self).get_xsd_file_path() 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 3a39862f4..d78986ad2 100644 --- a/account_banking_sepa_credit_transfer/models/account_payment_order.py +++ b/account_banking_sepa_credit_transfer/models/account_payment_order.py @@ -2,19 +2,20 @@ # Copyright 2014-2018 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 from odoo.exceptions import UserError -from lxml import etree class AccountPaymentOrder(models.Model): - _inherit = 'account.payment.order' + _inherit = "account.payment.order" @api.multi def generate_payment_file(self): """Creates the SEPA Credit Transfer file. That's the important code!""" self.ensure_one() - if self.payment_method_id.code != 'sepa_credit_transfer': + if self.payment_method_id.code != "sepa_credit_transfer": return super(AccountPaymentOrder, self).generate_payment_file() pain_flavor = self.payment_method_id.pain_version @@ -22,14 +23,13 @@ class AccountPaymentOrder(models.Model): # to support country-specific extensions such as # pain.001.001.03.ch.02 (cf l10n_ch_sepa) if not pain_flavor: - raise UserError( - _("PAIN version '%s' is not supported.") % pain_flavor) - if pain_flavor.startswith('pain.001.001.02'): - bic_xml_tag = 'BIC' + raise UserError(_("PAIN version '%s' is not supported.") % pain_flavor) + if pain_flavor.startswith("pain.001.001.02"): + bic_xml_tag = "BIC" name_maxsize = 70 - root_xml_tag = 'pain.001.001.02' - elif pain_flavor.startswith('pain.001.001.03'): - bic_xml_tag = 'BIC' + root_xml_tag = "pain.001.001.02" + elif pain_flavor.startswith("pain.001.001.03"): + bic_xml_tag = "BIC" # size 70 -> 140 for with pain.001.001.03 # BUT the European Payment Council, in the document # "SEPA Credit Transfer Scheme Customer-to-bank @@ -39,42 +39,44 @@ class AccountPaymentOrder(models.Model): # so we follow the "European Payment Council" # and we put 70 and not 140 name_maxsize = 70 - root_xml_tag = 'CstmrCdtTrfInitn' - elif pain_flavor.startswith('pain.001.001.04'): - bic_xml_tag = 'BICFI' + root_xml_tag = "CstmrCdtTrfInitn" + elif pain_flavor.startswith("pain.001.001.04"): + bic_xml_tag = "BICFI" name_maxsize = 140 - root_xml_tag = 'CstmrCdtTrfInitn' - elif pain_flavor.startswith('pain.001.001.05'): - bic_xml_tag = 'BICFI' + root_xml_tag = "CstmrCdtTrfInitn" + elif pain_flavor.startswith("pain.001.001.05"): + bic_xml_tag = "BICFI" name_maxsize = 140 - root_xml_tag = 'CstmrCdtTrfInitn' + root_xml_tag = "CstmrCdtTrfInitn" # added pain.001.003.03 for German Banks # it is not in the offical ISO 20022 documentations, but nearly all # german banks are working with this instead 001.001.03 - elif pain_flavor == 'pain.001.003.03': - bic_xml_tag = 'BIC' + elif pain_flavor == "pain.001.003.03": + bic_xml_tag = "BIC" name_maxsize = 70 - root_xml_tag = 'CstmrCdtTrfInitn' + root_xml_tag = "CstmrCdtTrfInitn" else: - raise UserError( - _("PAIN version '%s' is not supported.") % pain_flavor) + raise UserError(_("PAIN version '%s' is not supported.") % pain_flavor) xsd_file = self.payment_method_id.get_xsd_file_path() gen_args = { - 'bic_xml_tag': bic_xml_tag, - 'name_maxsize': name_maxsize, - 'convert_to_ascii': self.payment_method_id.convert_to_ascii, - 'payment_method': 'TRF', - 'file_prefix': 'sct_', - 'pain_flavor': pain_flavor, - 'pain_xsd_file': xsd_file, + "bic_xml_tag": bic_xml_tag, + "name_maxsize": name_maxsize, + "convert_to_ascii": self.payment_method_id.convert_to_ascii, + "payment_method": "TRF", + "file_prefix": "sct_", + "pain_flavor": pain_flavor, + "pain_xsd_file": xsd_file, } nsmap = self.generate_pain_nsmap() attrib = self.generate_pain_attrib() - xml_root = etree.Element('Document', nsmap=nsmap, attrib=attrib) + xml_root = etree.Element("Document", nsmap=nsmap, attrib=attrib) pain_root = etree.SubElement(xml_root, root_xml_tag) # A. Group header - group_header, nb_of_transactions_a, control_sum_a = \ - self.generate_group_header_block(pain_root, gen_args) + ( + group_header, + nb_of_transactions_a, + control_sum_a, + ) = self.generate_group_header_block(pain_root, gen_args) transactions_count_a = 0 amount_control_sum_a = 0.0 lines_per_group = {} @@ -93,30 +95,40 @@ class AccountPaymentOrder(models.Model): lines_per_group[key].append(line) else: lines_per_group[key] = [line] - for (requested_date, priority, local_instrument, categ_purpose),\ - lines in list(lines_per_group.items()): + for (requested_date, priority, local_instrument, categ_purpose), lines in list( + lines_per_group.items() + ): # B. Payment info requested_date = fields.Date.to_string(requested_date) - payment_info, nb_of_transactions_b, control_sum_b = \ - self.generate_start_payment_info_block( - pain_root, - "self.name + '-' " - "+ requested_date.replace('-', '') + '-' + priority + " - "'-' + local_instrument + '-' + category_purpose", - priority, local_instrument, categ_purpose, - False, requested_date, { - 'self': self, - 'priority': priority, - 'requested_date': requested_date, - 'local_instrument': local_instrument or 'NOinstr', - 'category_purpose': categ_purpose or 'NOcateg', - }, gen_args) + ( + payment_info, + nb_of_transactions_b, + control_sum_b, + ) = self.generate_start_payment_info_block( + pain_root, + "self.name + '-' " + "+ requested_date.replace('-', '') + '-' + priority + " + "'-' + local_instrument + '-' + category_purpose", + priority, + local_instrument, + categ_purpose, + False, + requested_date, + { + "self": self, + "priority": priority, + "requested_date": requested_date, + "local_instrument": local_instrument or "NOinstr", + "category_purpose": categ_purpose or "NOcateg", + }, + gen_args, + ) self.generate_party_block( - payment_info, 'Dbtr', 'B', - self.company_partner_bank_id, gen_args) - charge_bearer = etree.SubElement(payment_info, 'ChrgBr') + payment_info, "Dbtr", "B", self.company_partner_bank_id, gen_args + ) + charge_bearer = etree.SubElement(payment_info, "ChrgBr") if self.sepa: - charge_bearer_text = 'SLEV' + charge_bearer_text = "SLEV" else: charge_bearer_text = self.charge_bearer charge_bearer.text = charge_bearer_text @@ -127,50 +139,74 @@ class AccountPaymentOrder(models.Model): transactions_count_b += 1 # C. Credit Transfer Transaction Info credit_transfer_transaction_info = etree.SubElement( - payment_info, 'CdtTrfTxInf') + payment_info, "CdtTrfTxInf" + ) payment_identification = etree.SubElement( - credit_transfer_transaction_info, 'PmtId') + credit_transfer_transaction_info, "PmtId" + ) instruction_identification = etree.SubElement( - payment_identification, 'InstrId') + payment_identification, "InstrId" + ) instruction_identification.text = self._prepare_field( - 'Instruction Identification', 'line.name', - {'line': line}, 35, gen_args=gen_args) + "Instruction Identification", + "line.name", + {"line": line}, + 35, + gen_args=gen_args, + ) end2end_identification = etree.SubElement( - payment_identification, 'EndToEndId') + payment_identification, "EndToEndId" + ) end2end_identification.text = self._prepare_field( - 'End to End Identification', 'line.name', - {'line': line}, 35, gen_args=gen_args) + "End to End Identification", + "line.name", + {"line": line}, + 35, + gen_args=gen_args, + ) currency_name = self._prepare_field( - 'Currency Code', 'line.currency_id.name', - {'line': line}, 3, gen_args=gen_args) - amount = etree.SubElement( - credit_transfer_transaction_info, 'Amt') + "Currency Code", + "line.currency_id.name", + {"line": line}, + 3, + gen_args=gen_args, + ) + amount = etree.SubElement(credit_transfer_transaction_info, "Amt") instructed_amount = etree.SubElement( - amount, 'InstdAmt', Ccy=currency_name) - instructed_amount.text = '%.2f' % line.amount_currency + amount, "InstdAmt", Ccy=currency_name + ) + instructed_amount.text = "%.2f" % line.amount_currency amount_control_sum_a += line.amount_currency amount_control_sum_b += line.amount_currency if not line.partner_bank_id: raise UserError( - _("Bank account is missing on the bank payment line " - "of partner '%s' (reference '%s').") - % (line.partner_id.name, line.name)) + _( + "Bank account is missing on the bank payment line " + "of partner '%s' (reference '%s')." + ) + % (line.partner_id.name, line.name) + ) self.generate_party_block( - credit_transfer_transaction_info, 'Cdtr', - 'C', line.partner_bank_id, gen_args, line) + credit_transfer_transaction_info, + "Cdtr", + "C", + line.partner_bank_id, + gen_args, + line, + ) if line.purpose: - purpose = etree.SubElement( - credit_transfer_transaction_info, 'Purp') - etree.SubElement(purpose, 'Cd').text = line.purpose + purpose = etree.SubElement(credit_transfer_transaction_info, "Purp") + etree.SubElement(purpose, "Cd").text = line.purpose self.generate_remittance_info_block( - credit_transfer_transaction_info, line, gen_args) - if not pain_flavor.startswith('pain.001.001.02'): + credit_transfer_transaction_info, line, gen_args + ) + if not pain_flavor.startswith("pain.001.001.02"): nb_of_transactions_b.text = str(transactions_count_b) - control_sum_b.text = '%.2f' % amount_control_sum_b - if not pain_flavor.startswith('pain.001.001.02'): + control_sum_b.text = "%.2f" % amount_control_sum_b + if not pain_flavor.startswith("pain.001.001.02"): nb_of_transactions_a.text = str(transactions_count_a) - control_sum_a.text = '%.2f' % amount_control_sum_a + control_sum_a.text = "%.2f" % amount_control_sum_a else: nb_of_transactions_a.text = str(transactions_count_a) - control_sum_a.text = '%.2f' % amount_control_sum_a + control_sum_a.text = "%.2f" % amount_control_sum_a return self.finalize_sepa_file_creation(xml_root, gen_args) diff --git a/account_banking_sepa_credit_transfer/post_install.py b/account_banking_sepa_credit_transfer/post_install.py index 5570a35e3..59b19a1d7 100644 --- a/account_banking_sepa_credit_transfer/post_install.py +++ b/account_banking_sepa_credit_transfer/post_install.py @@ -1,18 +1,17 @@ # Copyright 2016 Akretion (Alexis de Lattre ) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from odoo import api, SUPERUSER_ID +from odoo import SUPERUSER_ID, api def update_bank_journals(cr, registry): with api.Environment.manage(): env = api.Environment(cr, SUPERUSER_ID, {}) - ajo = env['account.journal'] - journals = ajo.search([('type', '=', 'bank')]) - sct = env.ref( - 'account_banking_sepa_credit_transfer.sepa_credit_transfer') + ajo = env["account.journal"] + journals = ajo.search([("type", "=", "bank")]) + sct = env.ref("account_banking_sepa_credit_transfer.sepa_credit_transfer") if sct: - journals.write({ - 'outbound_payment_method_ids': [(4, sct.id)], - }) + journals.write( + {"outbound_payment_method_ids": [(4, sct.id)],} + ) return diff --git a/account_banking_sepa_credit_transfer/static/description/icon.svg b/account_banking_sepa_credit_transfer/static/description/icon.svg index 266ef8442..5f56744a7 100644 --- a/account_banking_sepa_credit_transfer/static/description/icon.svg +++ b/account_banking_sepa_credit_transfer/static/description/icon.svg @@ -89,4 +89,4 @@ y="109.17231" id="tspan2995" style="font-weight:bold;-inkscape-font-specification:Sans Bold">TRANSFER - \ No newline at end of file + diff --git a/account_banking_sepa_credit_transfer/tests/__init__.py b/account_banking_sepa_credit_transfer/tests/__init__.py index 8b95a582a..0ec705804 100644 --- a/account_banking_sepa_credit_transfer/tests/__init__.py +++ b/account_banking_sepa_credit_transfer/tests/__init__.py @@ -1,2 +1 @@ - from . import test_sct diff --git a/account_banking_sepa_credit_transfer/tests/test_sct.py b/account_banking_sepa_credit_transfer/tests/test_sct.py index f2547d5b2..59e109abb 100644 --- a/account_banking_sepa_credit_transfer/tests/test_sct.py +++ b/account_banking_sepa_credit_transfer/tests/test_sct.py @@ -3,84 +3,96 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). import base64 -from odoo.exceptions import UserError -from odoo.tools import float_compare -from odoo.tests import common import time + from lxml import etree +from odoo.exceptions import UserError +from odoo.tests import common +from odoo.tools import float_compare + class TestSCT(common.HttpCase): - def setUp(self): super(TestSCT, self).setUp() - self.account_model = self.env['account.account'] - self.move_model = self.env['account.move'] - self.journal_model = self.env['account.journal'] - self.payment_order_model = self.env['account.payment.order'] - self.payment_line_model = self.env['account.payment.line'] - self.bank_line_model = self.env['bank.payment.line'] - self.partner_bank_model = self.env['res.partner.bank'] - self.attachment_model = self.env['ir.attachment'] - self.invoice_model = self.env['account.invoice'] - self.invoice_line_model = self.env['account.invoice.line'] - self.partner_agrolait = self.env.ref('base.res_partner_2') - self.partner_asus = self.env.ref('base.res_partner_1') - self.partner_c2c = self.env.ref('base.res_partner_12') - self.eur_currency = self.env.ref('base.EUR') - self.usd_currency = self.env.ref('base.USD') - self.main_company = self.env['res.company'].create({ - 'name': 'Test EUR company', - 'currency_id': self.eur_currency.id, - }) + self.account_model = self.env["account.account"] + self.move_model = self.env["account.move"] + self.journal_model = self.env["account.journal"] + self.payment_order_model = self.env["account.payment.order"] + self.payment_line_model = self.env["account.payment.line"] + self.bank_line_model = self.env["bank.payment.line"] + self.partner_bank_model = self.env["res.partner.bank"] + self.attachment_model = self.env["ir.attachment"] + self.invoice_model = self.env["account.invoice"] + self.invoice_line_model = self.env["account.invoice.line"] + self.partner_agrolait = self.env.ref("base.res_partner_2") + self.partner_asus = self.env.ref("base.res_partner_1") + self.partner_c2c = self.env.ref("base.res_partner_12") + self.eur_currency = self.env.ref("base.EUR") + self.usd_currency = self.env.ref("base.USD") + self.main_company = self.env["res.company"].create( + {"name": "Test EUR company", "currency_id": self.eur_currency.id,} + ) self.partner_agrolait.company_id = self.main_company.id self.partner_asus.company_id = self.main_company.id self.partner_c2c.company_id = self.main_company.id - self.env.user.write({ - 'company_ids': [(6, 0, self.main_company.ids)], - 'company_id': self.main_company.id, - }) + self.env.user.write( + { + "company_ids": [(6, 0, self.main_company.ids)], + "company_id": self.main_company.id, + } + ) self.env.ref( - 'l10n_generic_coa.configurable_chart_template' + "l10n_generic_coa.configurable_chart_template" ).try_loading_for_current_company() - self.account_expense = self.account_model.search([ - ('user_type_id', '=', - self.env.ref('account.data_account_type_expenses').id), - ('company_id', '=', self.main_company.id), - ], limit=1) - self.account_payable = self.account_model.search([ - ('user_type_id', '=', - self.env.ref('account.data_account_type_payable').id), - ('company_id', '=', self.main_company.id), - ], limit=1) - self.partner_bank = self.env.ref( - 'account_payment_mode.main_company_iban' - ).copy({ - 'company_id': self.main_company.id, - 'partner_id': self.main_company.partner_id.id, - 'bank_id': ( - self.env.ref('account_payment_mode.bank_la_banque_postale').id - ), - }) + self.account_expense = self.account_model.search( + [ + ( + "user_type_id", + "=", + self.env.ref("account.data_account_type_expenses").id, + ), + ("company_id", "=", self.main_company.id), + ], + limit=1, + ) + self.account_payable = self.account_model.search( + [ + ( + "user_type_id", + "=", + self.env.ref("account.data_account_type_payable").id, + ), + ("company_id", "=", self.main_company.id), + ], + limit=1, + ) + self.partner_bank = self.env.ref("account_payment_mode.main_company_iban").copy( + { + "company_id": self.main_company.id, + "partner_id": self.main_company.partner_id.id, + "bank_id": ( + self.env.ref("account_payment_mode.bank_la_banque_postale").id + ), + } + ) # create journal - self.bank_journal = self.journal_model.create({ - 'name': 'Company Bank journal', - 'type': 'bank', - 'code': 'BNKFB', - 'bank_account_id': self.partner_bank.id, - 'bank_id': self.partner_bank.bank_id.id, - }) + self.bank_journal = self.journal_model.create( + { + "name": "Company Bank journal", + "type": "bank", + "code": "BNKFB", + "bank_account_id": self.partner_bank.id, + "bank_id": self.partner_bank.bank_id.id, + } + ) # update payment mode self.payment_mode = self.env.ref( - 'account_banking_sepa_credit_transfer.' - 'payment_mode_outbound_sepa_ct1' - ).copy({ - 'company_id': self.main_company.id, - }) - self.payment_mode.write({ - 'bank_account_link': 'fixed', - 'fixed_journal_id': self.bank_journal.id, - }) + "account_banking_sepa_credit_transfer." "payment_mode_outbound_sepa_ct1" + ).copy({"company_id": self.main_company.id,}) + self.payment_mode.write( + {"bank_account_link": "fixed", "fixed_journal_id": self.bank_journal.id,} + ) # Trigger the recompute of account type on res.partner.bank self.partner_bank_model.search([])._compute_acc_type() @@ -90,208 +102,252 @@ class TestSCT(common.HttpCase): self.check_eur_currency_sct() def test_pain_001_03(self): - self.payment_mode.payment_method_id.pain_version = 'pain.001.001.03' + self.payment_mode.payment_method_id.pain_version = "pain.001.001.03" self.check_eur_currency_sct() def test_pain_001_04(self): - self.payment_mode.payment_method_id.pain_version = 'pain.001.001.04' + self.payment_mode.payment_method_id.pain_version = "pain.001.001.04" self.check_eur_currency_sct() def test_pain_001_05(self): - self.payment_mode.payment_method_id.pain_version = 'pain.001.001.05' + self.payment_mode.payment_method_id.pain_version = "pain.001.001.05" self.check_eur_currency_sct() def test_pain_003_03(self): - self.payment_mode.payment_method_id.pain_version = 'pain.001.003.03' + self.payment_mode.payment_method_id.pain_version = "pain.001.003.03" self.check_eur_currency_sct() def check_eur_currency_sct(self): invoice1 = self.create_invoice( self.partner_agrolait.id, - 'account_payment_mode.res_partner_2_iban', self.eur_currency.id, - 42.0, 'F1341') + "account_payment_mode.res_partner_2_iban", + self.eur_currency.id, + 42.0, + "F1341", + ) invoice2 = self.create_invoice( self.partner_agrolait.id, - 'account_payment_mode.res_partner_2_iban', self.eur_currency.id, - 12.0, 'F1342') + "account_payment_mode.res_partner_2_iban", + self.eur_currency.id, + 12.0, + "F1342", + ) invoice3 = self.create_invoice( self.partner_agrolait.id, - 'account_payment_mode.res_partner_2_iban', self.eur_currency.id, - 5.0, 'A1301', 'in_refund') + "account_payment_mode.res_partner_2_iban", + self.eur_currency.id, + 5.0, + "A1301", + "in_refund", + ) invoice4 = self.create_invoice( self.partner_c2c.id, - 'account_payment_mode.res_partner_12_iban', self.eur_currency.id, - 11.0, 'I1642') + "account_payment_mode.res_partner_12_iban", + self.eur_currency.id, + 11.0, + "I1642", + ) invoice5 = self.create_invoice( self.partner_c2c.id, - 'account_payment_mode.res_partner_12_iban', self.eur_currency.id, - 41.0, 'I1643') + "account_payment_mode.res_partner_12_iban", + self.eur_currency.id, + 41.0, + "I1643", + ) for inv in [invoice1, invoice2, invoice3, invoice4, invoice5]: action = inv.create_account_payment_line() - self.assertEqual(action['res_model'], 'account.payment.order') - self.payment_order = self.payment_order_model.browse(action['res_id']) - self.assertEqual( - self.payment_order.payment_type, 'outbound') - self.assertEqual( - self.payment_order.payment_mode_id, self.payment_mode) - self.assertEqual( - self.payment_order.journal_id, self.bank_journal) - pay_lines = self.payment_line_model.search([ - ('partner_id', '=', self.partner_agrolait.id), - ('order_id', '=', self.payment_order.id)]) + self.assertEqual(action["res_model"], "account.payment.order") + self.payment_order = self.payment_order_model.browse(action["res_id"]) + self.assertEqual(self.payment_order.payment_type, "outbound") + self.assertEqual(self.payment_order.payment_mode_id, self.payment_mode) + self.assertEqual(self.payment_order.journal_id, self.bank_journal) + pay_lines = self.payment_line_model.search( + [ + ("partner_id", "=", self.partner_agrolait.id), + ("order_id", "=", self.payment_order.id), + ] + ) self.assertEqual(len(pay_lines), 3) agrolait_pay_line1 = pay_lines[0] - accpre = self.env['decimal.precision'].precision_get('Account') + accpre = self.env["decimal.precision"].precision_get("Account") self.assertEqual(agrolait_pay_line1.currency_id, self.eur_currency) + self.assertEqual(agrolait_pay_line1.partner_bank_id, invoice1.partner_bank_id) self.assertEqual( - agrolait_pay_line1.partner_bank_id, invoice1.partner_bank_id) - self.assertEqual(float_compare( - agrolait_pay_line1.amount_currency, 42, precision_digits=accpre), - 0) - self.assertEqual(agrolait_pay_line1.communication_type, 'normal') - self.assertEqual(agrolait_pay_line1.communication, 'F1341') + float_compare( + agrolait_pay_line1.amount_currency, 42, precision_digits=accpre + ), + 0, + ) + self.assertEqual(agrolait_pay_line1.communication_type, "normal") + self.assertEqual(agrolait_pay_line1.communication, "F1341") self.payment_order.draft2open() - self.assertEqual(self.payment_order.state, 'open') + self.assertEqual(self.payment_order.state, "open") self.assertEqual(self.payment_order.sepa, True) - bank_lines = self.bank_line_model.search([ - ('partner_id', '=', self.partner_agrolait.id)]) + bank_lines = self.bank_line_model.search( + [("partner_id", "=", self.partner_agrolait.id)] + ) self.assertEqual(len(bank_lines), 1) agrolait_bank_line = bank_lines[0] self.assertEqual(agrolait_bank_line.currency_id, self.eur_currency) - self.assertEqual(float_compare( - agrolait_bank_line.amount_currency, 49.0, precision_digits=accpre), - 0) - self.assertEqual(agrolait_bank_line.communication_type, 'normal') self.assertEqual( - agrolait_bank_line.communication, 'F1341-F1342-A1301') - self.assertEqual( - agrolait_bank_line.partner_bank_id, invoice1.partner_bank_id) + float_compare( + agrolait_bank_line.amount_currency, 49.0, precision_digits=accpre + ), + 0, + ) + self.assertEqual(agrolait_bank_line.communication_type, "normal") + self.assertEqual(agrolait_bank_line.communication, "F1341-F1342-A1301") + self.assertEqual(agrolait_bank_line.partner_bank_id, invoice1.partner_bank_id) action = self.payment_order.open2generated() - self.assertEqual(self.payment_order.state, 'generated') - self.assertEqual(action['res_model'], 'ir.attachment') - attachment = self.attachment_model.browse(action['res_id']) - self.assertEqual(attachment.datas_fname[-4:], '.xml') + self.assertEqual(self.payment_order.state, "generated") + self.assertEqual(action["res_model"], "ir.attachment") + attachment = self.attachment_model.browse(action["res_id"]) + self.assertEqual(attachment.datas_fname[-4:], ".xml") xml_file = base64.b64decode(attachment.datas) xml_root = etree.fromstring(xml_file) namespaces = xml_root.nsmap - namespaces['p'] = xml_root.nsmap[None] + namespaces["p"] = xml_root.nsmap[None] namespaces.pop(None) - pay_method_xpath = xml_root.xpath( - '//p:PmtInf/p:PmtMtd', namespaces=namespaces) - self.assertEqual(pay_method_xpath[0].text, 'TRF') + pay_method_xpath = xml_root.xpath("//p:PmtInf/p:PmtMtd", namespaces=namespaces) + self.assertEqual(pay_method_xpath[0].text, "TRF") sepa_xpath = xml_root.xpath( - '//p:PmtInf/p:PmtTpInf/p:SvcLvl/p:Cd', namespaces=namespaces) - self.assertEqual(sepa_xpath[0].text, 'SEPA') + "//p:PmtInf/p:PmtTpInf/p:SvcLvl/p:Cd", namespaces=namespaces + ) + self.assertEqual(sepa_xpath[0].text, "SEPA") debtor_acc_xpath = xml_root.xpath( - '//p:PmtInf/p:DbtrAcct/p:Id/p:IBAN', namespaces=namespaces) + "//p:PmtInf/p:DbtrAcct/p:Id/p:IBAN", namespaces=namespaces + ) self.assertEqual( debtor_acc_xpath[0].text, - self.payment_order.company_partner_bank_id.sanitized_acc_number) + self.payment_order.company_partner_bank_id.sanitized_acc_number, + ) self.payment_order.generated2uploaded() - self.assertEqual(self.payment_order.state, 'uploaded') + self.assertEqual(self.payment_order.state, "uploaded") for inv in [invoice1, invoice2, invoice3, invoice4, invoice5]: - self.assertEqual(inv.state, 'paid') + self.assertEqual(inv.state, "paid") return def test_usd_currency_sct(self): invoice1 = self.create_invoice( self.partner_asus.id, - 'account_payment_mode.res_partner_2_iban', self.usd_currency.id, - 2042.0, 'Inv9032') + "account_payment_mode.res_partner_2_iban", + self.usd_currency.id, + 2042.0, + "Inv9032", + ) invoice2 = self.create_invoice( self.partner_asus.id, - 'account_payment_mode.res_partner_2_iban', self.usd_currency.id, - 1012.0, 'Inv9033') + "account_payment_mode.res_partner_2_iban", + self.usd_currency.id, + 1012.0, + "Inv9033", + ) for inv in [invoice1, invoice2]: action = inv.create_account_payment_line() - self.assertEqual(action['res_model'], 'account.payment.order') - self.payment_order = self.payment_order_model.browse(action['res_id']) - self.assertEqual( - self.payment_order.payment_type, 'outbound') - self.assertEqual( - self.payment_order.payment_mode_id, self.payment_mode) - self.assertEqual( - self.payment_order.journal_id, self.bank_journal) - pay_lines = self.payment_line_model.search([ - ('partner_id', '=', self.partner_asus.id), - ('order_id', '=', self.payment_order.id)]) + self.assertEqual(action["res_model"], "account.payment.order") + self.payment_order = self.payment_order_model.browse(action["res_id"]) + self.assertEqual(self.payment_order.payment_type, "outbound") + self.assertEqual(self.payment_order.payment_mode_id, self.payment_mode) + self.assertEqual(self.payment_order.journal_id, self.bank_journal) + pay_lines = self.payment_line_model.search( + [ + ("partner_id", "=", self.partner_asus.id), + ("order_id", "=", self.payment_order.id), + ] + ) self.assertEqual(len(pay_lines), 2) asus_pay_line1 = pay_lines[0] - accpre = self.env['decimal.precision'].precision_get('Account') + accpre = self.env["decimal.precision"].precision_get("Account") self.assertEqual(asus_pay_line1.currency_id, self.usd_currency) + self.assertEqual(asus_pay_line1.partner_bank_id, invoice1.partner_bank_id) self.assertEqual( - asus_pay_line1.partner_bank_id, invoice1.partner_bank_id) - self.assertEqual(float_compare( - asus_pay_line1.amount_currency, 2042, precision_digits=accpre), - 0) - self.assertEqual(asus_pay_line1.communication_type, 'normal') - self.assertEqual(asus_pay_line1.communication, 'Inv9032') + float_compare( + asus_pay_line1.amount_currency, 2042, precision_digits=accpre + ), + 0, + ) + self.assertEqual(asus_pay_line1.communication_type, "normal") + self.assertEqual(asus_pay_line1.communication, "Inv9032") self.payment_order.draft2open() - self.assertEqual(self.payment_order.state, 'open') + self.assertEqual(self.payment_order.state, "open") self.assertEqual(self.payment_order.sepa, False) - bank_lines = self.bank_line_model.search([ - ('partner_id', '=', self.partner_asus.id)]) + bank_lines = self.bank_line_model.search( + [("partner_id", "=", self.partner_asus.id)] + ) self.assertEqual(len(bank_lines), 1) asus_bank_line = bank_lines[0] self.assertEqual(asus_bank_line.currency_id, self.usd_currency) - self.assertEqual(float_compare( - asus_bank_line.amount_currency, 3054.0, precision_digits=accpre), - 0) - self.assertEqual(asus_bank_line.communication_type, 'normal') self.assertEqual( - asus_bank_line.communication, 'Inv9032-Inv9033') - self.assertEqual( - asus_bank_line.partner_bank_id, invoice1.partner_bank_id) + float_compare( + asus_bank_line.amount_currency, 3054.0, precision_digits=accpre + ), + 0, + ) + self.assertEqual(asus_bank_line.communication_type, "normal") + self.assertEqual(asus_bank_line.communication, "Inv9032-Inv9033") + self.assertEqual(asus_bank_line.partner_bank_id, invoice1.partner_bank_id) action = self.payment_order.open2generated() - self.assertEqual(self.payment_order.state, 'generated') - self.assertEqual(action['res_model'], 'ir.attachment') - attachment = self.attachment_model.browse(action['res_id']) - self.assertEqual(attachment.datas_fname[-4:], '.xml') + self.assertEqual(self.payment_order.state, "generated") + self.assertEqual(action["res_model"], "ir.attachment") + attachment = self.attachment_model.browse(action["res_id"]) + self.assertEqual(attachment.datas_fname[-4:], ".xml") xml_file = base64.b64decode(attachment.datas) xml_root = etree.fromstring(xml_file) namespaces = xml_root.nsmap - namespaces['p'] = xml_root.nsmap[None] + namespaces["p"] = xml_root.nsmap[None] namespaces.pop(None) - pay_method_xpath = xml_root.xpath( - '//p:PmtInf/p:PmtMtd', namespaces=namespaces) - self.assertEqual(pay_method_xpath[0].text, 'TRF') + pay_method_xpath = xml_root.xpath("//p:PmtInf/p:PmtMtd", namespaces=namespaces) + self.assertEqual(pay_method_xpath[0].text, "TRF") sepa_xpath = xml_root.xpath( - '//p:PmtInf/p:PmtTpInf/p:SvcLvl/p:Cd', namespaces=namespaces) + "//p:PmtInf/p:PmtTpInf/p:SvcLvl/p:Cd", namespaces=namespaces + ) self.assertEqual(len(sepa_xpath), 0) debtor_acc_xpath = xml_root.xpath( - '//p:PmtInf/p:DbtrAcct/p:Id/p:IBAN', namespaces=namespaces) + "//p:PmtInf/p:DbtrAcct/p:Id/p:IBAN", namespaces=namespaces + ) self.assertEqual( debtor_acc_xpath[0].text, - self.payment_order.company_partner_bank_id.sanitized_acc_number) + self.payment_order.company_partner_bank_id.sanitized_acc_number, + ) self.payment_order.generated2uploaded() - self.assertEqual(self.payment_order.state, 'uploaded') + self.assertEqual(self.payment_order.state, "uploaded") for inv in [invoice1, invoice2]: - self.assertEqual(inv.state, 'paid') + self.assertEqual(inv.state, "paid") return def create_invoice( - self, partner_id, partner_bank_xmlid, currency_id, - price_unit, reference, type='in_invoice'): - invoice = self.invoice_model.create({ - 'partner_id': partner_id, - 'reference_type': 'none', - 'reference': reference, - 'currency_id': currency_id, - 'name': 'test', - 'account_id': self.account_payable.id, - 'type': type, - 'date_invoice': time.strftime('%Y-%m-%d'), - 'payment_mode_id': self.payment_mode.id, - 'partner_bank_id': self.env.ref(partner_bank_xmlid).id, - }) - self.invoice_line_model.create({ - 'invoice_id': invoice.id, - 'price_unit': price_unit, - 'quantity': 1, - 'name': 'Great service', - 'account_id': self.account_expense.id, - }) + self, + partner_id, + partner_bank_xmlid, + currency_id, + price_unit, + reference, + type="in_invoice", + ): + invoice = self.invoice_model.create( + { + "partner_id": partner_id, + "reference_type": "none", + "reference": reference, + "currency_id": currency_id, + "name": "test", + "account_id": self.account_payable.id, + "type": type, + "date_invoice": time.strftime("%Y-%m-%d"), + "payment_mode_id": self.payment_mode.id, + "partner_bank_id": self.env.ref(partner_bank_xmlid).id, + } + ) + self.invoice_line_model.create( + { + "invoice_id": invoice.id, + "price_unit": price_unit, + "quantity": 1, + "name": "Great service", + "account_id": self.account_expense.id, + } + ) invoice.action_invoice_open() return invoice