mirror of
https://gitlab.com/flectra-community/l10n-switzerland-flectra.git
synced 2024-11-16 19:12:04 +00:00
167 lines
5.6 KiB
Python
167 lines
5.6 KiB
Python
|
# Part of Flectra. See LICENSE file for full copyright and licensing details.
|
||
|
import time
|
||
|
|
||
|
from flectra.addons.account.tests.account_test_classes import AccountingTestCase
|
||
|
|
||
|
CH_IBAN = 'CH15 3881 5158 3845 3843 7'
|
||
|
QR_IBAN = 'CH21 3080 8001 2345 6782 7'
|
||
|
|
||
|
|
||
|
class TestSwissQR(AccountingTestCase):
|
||
|
|
||
|
def setUp(self):
|
||
|
super(TestSwissQR, self).setUp()
|
||
|
# Activate SwissQR in Swiss invoices
|
||
|
self.env['ir.config_parameter'].create(
|
||
|
{'key': 'l10n_ch.print_qrcode', 'value': '1'}
|
||
|
)
|
||
|
self.customer = self.env['res.partner'].create(
|
||
|
{
|
||
|
"name": "Partner",
|
||
|
"street": "Route de Berne 41",
|
||
|
"street2": "",
|
||
|
"zip": "1000",
|
||
|
"city": "Lausanne",
|
||
|
"country_id": self.env.ref("base.ch").id,
|
||
|
}
|
||
|
)
|
||
|
self.env.user.company_id.partner_id.write(
|
||
|
{
|
||
|
"street": "Route de Berne 88",
|
||
|
"street2": "",
|
||
|
"zip": "2000",
|
||
|
"city": "Neuchâtel",
|
||
|
"country_id": self.env.ref('base.ch').id,
|
||
|
}
|
||
|
)
|
||
|
self.invoice1 = self.create_invoice('base.CHF')
|
||
|
|
||
|
def create_invoice(self, currency_to_use='base.CHF'):
|
||
|
""" Generates a test invoice """
|
||
|
|
||
|
product = self.env.ref("product.product_product_4")
|
||
|
acc_type = self.env.ref('account.data_account_type_current_assets')
|
||
|
account = self.env['account.account'].search(
|
||
|
[('user_type_id', '=', acc_type.id)], limit=1
|
||
|
)
|
||
|
invoice = (
|
||
|
self.env['account.move']
|
||
|
.with_context(default_type='out_invoice')
|
||
|
.create(
|
||
|
{
|
||
|
'type': 'out_invoice',
|
||
|
'partner_id': self.customer.id,
|
||
|
'currency_id': self.env.ref(currency_to_use).id,
|
||
|
'date': time.strftime('%Y') + '-12-22',
|
||
|
'invoice_line_ids': [
|
||
|
(
|
||
|
0,
|
||
|
0,
|
||
|
{
|
||
|
'name': product.name,
|
||
|
'product_id': product.id,
|
||
|
'account_id': account.id,
|
||
|
'quantity': 1,
|
||
|
'price_unit': 42.0,
|
||
|
},
|
||
|
)
|
||
|
],
|
||
|
}
|
||
|
)
|
||
|
)
|
||
|
return invoice
|
||
|
|
||
|
def create_account(self, number):
|
||
|
""" Generates a test res.partner.bank. """
|
||
|
return self.env['res.partner.bank'].create(
|
||
|
{
|
||
|
'acc_number': number,
|
||
|
'partner_id': self.env.user.company_id.partner_id.id,
|
||
|
}
|
||
|
)
|
||
|
|
||
|
def swissqr_not_generated(self, invoice):
|
||
|
"""Prints the given invoice and tests that no Swiss QR generation is triggered.
|
||
|
|
||
|
"""
|
||
|
self.assertFalse(
|
||
|
invoice.can_generate_qr_bill(),
|
||
|
'No Swiss QR should be generated for this invoice',
|
||
|
)
|
||
|
|
||
|
def swissqr_generated(self, invoice, ref_type='NON'):
|
||
|
"""Prints the given invoice and tests that a Swiss QR generation is triggered.
|
||
|
|
||
|
"""
|
||
|
self.assertTrue(
|
||
|
invoice.can_generate_qr_bill(), 'A Swiss QR can be generated'
|
||
|
)
|
||
|
if ref_type == 'QRR':
|
||
|
self.assertTrue(invoice.name)
|
||
|
struct_ref = invoice.name
|
||
|
unstr_msg = ''
|
||
|
else:
|
||
|
struct_ref = ''
|
||
|
unstr_msg = invoice.name or ''
|
||
|
unstr_msg = (unstr_msg or invoice.number).replace('/', '%2F')
|
||
|
payload = (
|
||
|
"SPC%0A"
|
||
|
"0200%0A"
|
||
|
"1%0A"
|
||
|
"{iban}%0A"
|
||
|
"K%0A"
|
||
|
"YourCompany%0A"
|
||
|
"Route+de+Berne+88%0A"
|
||
|
"2000+Neuch%C3%A2tel%0A"
|
||
|
"%0A%0A"
|
||
|
"CH%0A"
|
||
|
"%0A%0A%0A%0A%0A%0A%0A"
|
||
|
"42.00%0A"
|
||
|
"CHF%0A"
|
||
|
"K%0A"
|
||
|
"Partner%0A"
|
||
|
"Route+de+Berne+41%0A"
|
||
|
"1000+Lausanne%0A"
|
||
|
"%0A%0A"
|
||
|
"CH%0A"
|
||
|
"{ref_type}%0A"
|
||
|
"{struct_ref}%0A"
|
||
|
"{unstr_msg}%0A"
|
||
|
"EPD%0A"
|
||
|
).format(
|
||
|
iban=invoice.partner_bank_id.sanitized_acc_number,
|
||
|
ref_type=ref_type,
|
||
|
struct_ref=struct_ref,
|
||
|
unstr_msg=unstr_msg,
|
||
|
)
|
||
|
|
||
|
expected_url = ("/report/qrcode/?value={}"
|
||
|
"&width=256&height=256&bar_border=0").format(payload)
|
||
|
|
||
|
url = invoice.build_swiss_code_url()
|
||
|
self.assertEqual(url, expected_url)
|
||
|
|
||
|
def test_swissQR_missing_bank(self):
|
||
|
# Let us test the generation of a SwissQR for an invoice, first by showing an
|
||
|
# QR is included in the invoice is only generated when Flectra has all the data
|
||
|
# it needs.
|
||
|
self.invoice1.action_invoice_open()
|
||
|
self.swissqr_not_generated(self.invoice1)
|
||
|
|
||
|
def test_swissQR_iban(self):
|
||
|
# Now we add an account for payment to our invoice
|
||
|
# Here we don't use a structured reference
|
||
|
iban_account = self.create_account(CH_IBAN)
|
||
|
self.invoice1.partner_bank_id = iban_account
|
||
|
self.invoice1.action_invoice_open()
|
||
|
|
||
|
self.swissqr_generated(self.invoice1, ref_type="NON")
|
||
|
|
||
|
def test_swissQR_qriban(self):
|
||
|
# Now use a proper QR-IBAN, we are good to print a QR Bill
|
||
|
qriban_account = self.create_account(QR_IBAN)
|
||
|
self.assertTrue(qriban_account.acc_type, 'qr-iban')
|
||
|
self.invoice1.partner_bank_id = qriban_account
|
||
|
self.invoice1.action_invoice_open()
|
||
|
self.swissqr_generated(self.invoice1, ref_type="QRR")
|