81 lines
3.4 KiB
Python
81 lines
3.4 KiB
Python
from lxml import etree
|
|
import base64
|
|
from odoo.addons.account.tests.common import AccountTestInvoicingCommon
|
|
from odoo.tests import tagged
|
|
|
|
|
|
@tagged('post_install', '-at_install')
|
|
class TestISO20022CommonCreditTransfer(AccountTestInvoicingCommon):
|
|
@classmethod
|
|
def collect_company_accounting_data(cls, company):
|
|
company.update({
|
|
'street': '4 Privet Drive',
|
|
'city': 'Little Whinging',
|
|
'zip': 1997,
|
|
'iso20022_orgid_id': '0123456789',
|
|
'iso20022_initiating_party_name': 'Grunnings'
|
|
})
|
|
|
|
return super().collect_company_accounting_data(company)
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super().setUpClass()
|
|
|
|
@classmethod
|
|
def create_payment(cls, bank_journal, partner, payment_method, amount, memo=None):
|
|
""" Create a SEPA credit transfer payment """
|
|
return cls.env['account.payment'].create({
|
|
'journal_id': bank_journal.id,
|
|
'payment_method_line_id': cls.payment_method_line.id,
|
|
'payment_type': 'outbound',
|
|
'date': '2024-03-04',
|
|
'amount': amount,
|
|
'partner_id': partner.id,
|
|
'partner_type': 'supplier',
|
|
'memo': memo,
|
|
})
|
|
|
|
def generate_iso20022_batch_payment(self, partner, memo=None):
|
|
payment_1 = self.create_payment(self.company_data['default_journal_bank'], partner, self.payment_method, 500, memo)
|
|
payment_1.action_post()
|
|
payment_2 = self.create_payment(self.company_data['default_journal_bank'], partner, self.payment_method, 600, memo)
|
|
payment_2.action_post()
|
|
|
|
batch = self.env['account.batch.payment'].create({
|
|
'journal_id': self.company_data['default_journal_bank'].id,
|
|
'payment_ids': [(4, payment.id, None) for payment in (payment_1 | payment_2)],
|
|
'payment_method_id': self.payment_method.id,
|
|
'batch_type': 'outbound',
|
|
'iso20022_batch_booking': True,
|
|
})
|
|
wizard_action = batch.validate_batch()
|
|
self.assertIsNone(wizard_action)
|
|
batch._send_after_validation()
|
|
return batch
|
|
|
|
def get_sct_doc_from_batch(self, batch):
|
|
xml_doc = etree.fromstring(base64.b64decode(batch.export_file))
|
|
# Check that all unique elements respect the ISO20022 constraints before replacing them for testing purpose
|
|
namespace = {'ns': next(iter(xml_doc.nsmap.values()))}
|
|
MsgId = xml_doc.find('.//ns:MsgId', namespaces=namespace)
|
|
self.assertTrue(len(MsgId) <= 35)
|
|
MsgId.text = '12345'
|
|
Date = xml_doc.find('.//ns:CreDtTm', namespaces=namespace)
|
|
# date format : 20yy-mm-ddThh:mm:ss
|
|
date_regex = r'^20\d{2}\-(0[1-9]|1[012])\-(0[1-9]|[12][0-9]|3[01])T([0-1]?\d|2[0-3])(?::([0-5]?\d))?(?::([0-5]?\d))$'
|
|
self.assertRegex(Date.text, date_regex)
|
|
Date.text = '2024-03-04T08:21:16'
|
|
PmtInfId = xml_doc.find('.//ns:PmtInfId', namespaces=namespace)
|
|
self.assertTrue(len(PmtInfId) <= 35)
|
|
PmtInfId.text = '1709540476.798265401'
|
|
InstrId = xml_doc.findall('.//ns:InstrId', namespaces=namespace)
|
|
for instr_id in InstrId:
|
|
self.assertTrue(len(instr_id) <= 35)
|
|
instr_id.text = '5-SCT-BNK1-2024-03-04'
|
|
EndToEndId = xml_doc.findall('.//ns:EndToEndId', namespaces=namespace)
|
|
for end_to_end_id in EndToEndId:
|
|
self.assertTrue(len(end_to_end_id) <= 35)
|
|
end_to_end_id.text = '1709565642.64888074015'
|
|
return xml_doc
|