107 lines
5.2 KiB
Python
107 lines
5.2 KiB
Python
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo.exceptions import UserError
|
|
from odoo.fields import Command
|
|
from odoo.addons.account.tests.common import AccountTestInvoicingCommon
|
|
from odoo.tests import tagged
|
|
|
|
|
|
@tagged('post_install_l10n', 'post_install', '-at_install')
|
|
class TestL10nVNEmvQrCode(AccountTestInvoicingCommon):
|
|
""" Test the generation of the EMV QR Code on invoices """
|
|
|
|
@classmethod
|
|
@AccountTestInvoicingCommon.setup_country('vn')
|
|
def setUpClass(cls):
|
|
super().setUpClass()
|
|
cls.company_data['company'].qr_code = True
|
|
cls.company_data['company'].partner_id.update({
|
|
'country_id': cls.env.ref('base.vn').id,
|
|
'city': 'Vietnam',
|
|
})
|
|
|
|
cls.bank_vn = cls.env['res.bank'].create({
|
|
'name': 'VN Bank',
|
|
'bic': '970422',
|
|
})
|
|
|
|
cls.acc_emv_vn = cls.env['res.partner.bank'].create({
|
|
'acc_number': '123456789012345678',
|
|
'bank_id': cls.bank_vn.id,
|
|
'partner_id': cls.company_data['company'].partner_id.id,
|
|
'proxy_type': 'bank_acc',
|
|
'proxy_value': '660704060000129',
|
|
'include_reference': True,
|
|
})
|
|
|
|
cls.acc_emv_vn_without_paynow_info = cls.env['res.partner.bank'].create({
|
|
'acc_number': '1234567890',
|
|
'partner_id': cls.company_data['company'].partner_id.id,
|
|
})
|
|
|
|
cls.emv_qr_invoice = cls.env['account.move'].create({
|
|
'move_type': 'out_invoice',
|
|
'partner_id': cls.partner_a.id,
|
|
'currency_id': cls.env.ref('base.VND').id,
|
|
'partner_bank_id': cls.acc_emv_vn.id,
|
|
'company_id': cls.company_data['company'].id,
|
|
'invoice_line_ids': [Command.create({'quantity': 1, 'price_unit': 100})],
|
|
})
|
|
|
|
def test_emv_qr_code_generation(self):
|
|
self.emv_qr_invoice.qr_code_method = 'emv_qr'
|
|
self.emv_qr_invoice._generate_qr_code()
|
|
|
|
# Using invoice currency other than VND should fail
|
|
self.emv_qr_invoice.currency_id = self.env.ref('base.USD')
|
|
with self.assertRaises(UserError, msg="The chosen QR-code type is not eligible for this invoice."):
|
|
self.emv_qr_invoice._generate_qr_code()
|
|
|
|
# Without company partner city should fail
|
|
self.emv_qr_invoice.currency_id = self.env.ref('base.VND')
|
|
self.company_data['company'].partner_id.city = False
|
|
with self.assertRaises(UserError, msg="Missing Merchant City."):
|
|
self.emv_qr_invoice._generate_qr_code()
|
|
|
|
# Without paynow infomation should fail
|
|
self.company_data['company'].partner_id.city = 'Vietnam'
|
|
self.emv_qr_invoice.partner_bank_id = self.acc_emv_vn_without_paynow_info
|
|
with self.assertRaises(UserError, msg="The account receiving the payment must have a Proxy type and a Proxy value set."):
|
|
self.emv_qr_invoice._generate_qr_code()
|
|
|
|
def test_emv_qr_vals(self):
|
|
self.emv_qr_invoice.qr_code_method = 'emv_qr'
|
|
unstruct_ref = 'INV/TEST/0001'
|
|
emv_qr_vals = self.emv_qr_invoice.partner_bank_id._get_qr_vals(
|
|
qr_method=self.emv_qr_invoice.qr_code_method,
|
|
amount=self.emv_qr_invoice.amount_residual,
|
|
currency=self.emv_qr_invoice.currency_id,
|
|
debtor_partner=self.emv_qr_invoice.partner_id,
|
|
free_communication=unstruct_ref,
|
|
structured_communication=self.emv_qr_invoice.payment_reference,
|
|
)
|
|
|
|
# Check the whole qr code string
|
|
self.assertEqual(emv_qr_vals, '00020101021238590010A0000007270129000697042201156607040600001290208QRIBFTTA52040000530370454031005802VN5914company_1_data6007Vietnam62170813INV/TEST/00016304600B')
|
|
|
|
def test_remove_vietnamese_accents(self):
|
|
accent_string = "áàảãạăắằẳẵặâấầẩẫậÁÀẢÃẠĂẮẰẲẴẶÂẤẦẨẪẬéèẻẽẹêếềểễệÉÈẺẼẸÊẾỀỂỄỆóòỏõọôốồổỗộơớờởỡợÓÒỎÕỌÔỐỒỔỖỘƠỚỜỞỠỢíìỉĩịÍÌỈĨỊúùủũụưứừửữựÚÙỦŨỤƯỨỪỬỮỰýỳỷỹỵÝỲỶỸỴđĐ"
|
|
result = self.env['res.partner.bank']._remove_accents(accent_string)
|
|
self.assertEqual(result, "aaaaaaaaaaaaaaaaaAAAAAAAAAAAAAAAAAeeeeeeeeeeeEEEEEEEEEEEoooooooooooooooooOOOOOOOOOOOOOOOOOiiiiiIIIIIuuuuuuuuuuuUUUUUUUUUUUyyyyyYYYYYdD")
|
|
|
|
def test_emv_qr_vals_with_accent_partner(self):
|
|
self.company_data['company'].partner_id.name = 'áÁéÉóÓíÍúÚýÝđĐ'
|
|
self.emv_qr_invoice.qr_code_method = 'emv_qr'
|
|
unstruct_ref = 'INV/TEST/0002'
|
|
emv_qr_vals = self.emv_qr_invoice.partner_bank_id._get_qr_vals(
|
|
qr_method=self.emv_qr_invoice.qr_code_method,
|
|
amount=self.emv_qr_invoice.amount_residual,
|
|
currency=self.emv_qr_invoice.currency_id,
|
|
debtor_partner=self.emv_qr_invoice.partner_id,
|
|
free_communication=unstruct_ref,
|
|
structured_communication=self.emv_qr_invoice.payment_reference,
|
|
)
|
|
|
|
# Check the whole qr code string
|
|
self.assertEqual(emv_qr_vals, '00020101021238590010A0000007270129000697042201156607040600001290208QRIBFTTA52040000530370454031005802VN5914aAeEoOiIuUyYdD6007Vietnam62170813INV/TEST/000263041AA5')
|