# Part of Odoo. See LICENSE file for full copyright and licensing details. import base64 from freezegun import freeze_time from dateutil.relativedelta import relativedelta from odoo import fields from odoo.addons.account.tests.common import AccountTestInvoicingCommon from odoo.tests import tagged @tagged('post_install_l10n', 'post_install', '-at_install') class TestZenginBatchPayment(AccountTestInvoicingCommon): def create_payment(self, partner, amount, memo, days_from_now): payment = self.env['account.payment'].create({ "partner_id": partner.id, 'payment_method_line_id': self.batch_payment.id, "memo": memo, "amount": amount, "payment_type": "outbound", "date": fields.Date.context_today(self.env.user) + relativedelta(days=days_from_now), }) payment.action_post() return payment @classmethod @AccountTestInvoicingCommon.setup_country('jp') def setUpClass(cls): super().setUpClass() cls.journal = cls.company_data['default_journal_bank'] cls.batch_payment = cls.journal.outbound_payment_method_line_ids.filtered(lambda line: line.code == 'zengin') cls.env.user.group_ids |= cls.env.ref('account.group_validate_bank_account') cls.bank_a = cls.env["res.bank"].create({ "name": "Mitsuisumitomo", "bic": "0009", "l10n_jp_zengin_name_kana": "ミツイスミトモ", "l10n_jp_zengin_branch_name": "Sannomiya", "l10n_jp_zengin_branch_name_kana": "サンノミヤ", "l10n_jp_zengin_branch_code": "410", "country": cls.env.ref("base.jp").id, }) cls.bank_b = cls.env["res.bank"].create({ "name": "Mitsuisumitomo", "bic": "0009", "l10n_jp_zengin_name_kana": "ミツイスミトモ", "l10n_jp_zengin_branch_name": "Hibiya", "l10n_jp_zengin_branch_name_kana": "ヒビヤ", "l10n_jp_zengin_branch_code": "632", "country": cls.env.ref("base.jp").id, }) cls.bank_c = cls.env["res.bank"].create({ "name": "Mitsuisumitomo", "bic": "0009", "l10n_jp_zengin_name_kana": "ミツイスミトモ", "l10n_jp_zengin_branch_name": "Osaka Honten", "l10n_jp_zengin_branch_name_kana": "オオサカホンテン", "l10n_jp_zengin_branch_code": "101", "country": cls.env.ref("base.jp").id, }) cls.journal.bank_account_id = cls.env["res.partner.bank"].create({ "partner_id": cls.company_data["company"].partner_id.id, "bank_id": cls.bank_a.id, "acc_number": "0185018", "l10n_jp_zengin_acc_holder_name_kana": "ワカクサタロウ", "l10n_jp_zengin_account_type": "regular", "l10n_jp_zengin_client_code": "8818002600", }) cls.bank_partner_a = cls.env["res.partner.bank"].create({ "partner_id": cls.partner_a.id, "bank_id": cls.bank_b.id, "allow_out_payment": True, "acc_number": "1234567", "l10n_jp_zengin_acc_holder_name_kana": "ワカクサシヨウジ", "l10n_jp_zengin_account_type": "regular", }) cls.bank_partner_b = cls.env["res.partner.bank"].create({ "partner_id": cls.partner_b.id, "bank_id": cls.bank_c.id, "allow_out_payment": True, "acc_number": "7654321", "l10n_jp_zengin_acc_holder_name_kana": "ワカクサシヨウジオオサカシシヤ", "l10n_jp_zengin_account_type": "regular", }) with freeze_time('2023-12-15'): cls.batch = cls.env["account.batch.payment"].create({ "journal_id": cls.company_data["default_journal_bank"].id, "batch_type": "outbound", }) payments = cls.create_payment(cls, cls.partner_b, 150000, 'partner_b', 0) | cls.create_payment(cls, cls.partner_a, 1000000, 'partner_a', 0) cls.batch.payment_ids = payments.sorted() def test_generate_zengin_batch_payment_file(self): generated = self.batch._generate_export_file() data: bytes = base64.decodebytes(generated['file']) record_data = data.decode('SHIFT_JIS') # Zengin files are encoded in SHIFT_JIS expected = [ # header "12108818002600ワカクサタロウ 12150009ミツイスミトモ 410サンノミヤ 10185018 ", # entry detail for payment "partner_a" "20009ミツイスミトモ 632ヒビヤ 000011234567ワカクサシヨウジ 00010000000000000000000000000007 ", # entry detail for payment "partner_b" "20009ミツイスミトモ 101オオサカホンテン 000017654321ワカクサシヨウジオオサカシシヤ 00001500000000000000000000000007 ", # file control record "8000002000001150000 ", # footer "9 ", ] for generated_line, expected_line in zip(record_data.splitlines(), expected): self.assertEqual(generated_line, expected_line, "Generated line in Zengin file does not match expected.") def test_generate_zengin_batch_payment_file_group_payment(self): self.batch.l10n_jp_zengin_merge_transactions = True with freeze_time('2023-12-15'): new_payment = self.create_payment(self.partner_a, 1000000, 'partner_a', 1) self.batch.payment_ids |= new_payment sorted(self.batch.payment_ids) generated = self.batch._generate_export_file() data: bytes = base64.decodebytes(generated['file']) record_data = data.decode('SHIFT_JIS') # Zengin files are encoded in SHIFT_JIS expected = [ # header "12108818002600ワカクサタロウ 12150009ミツイスミトモ 410サンノミヤ 10185018 ", # entry detail for payment "partner_a" "20009ミツイスミトモ 632ヒビヤ 000011234567ワカクサシヨウジ 00020000000000000000000000000007 ", # entry detail for payment "partner_b" "20009ミツイスミトモ 101オオサカホンテン 000017654321ワカクサシヨウジオオサカシシヤ 00001500000000000000000000000007 ", # file control record "8000002000002150000 ", # footer "9 ", ] for generated_line, expected_line in zip(record_data.splitlines(), expected): self.assertEqual(generated_line, expected_line, "Generated line in Zengin file does not match expected.")