Files
enterprise-addons/l10n_nl_reports/tests/test_icp_sbr.py
T

216 lines
12 KiB
Python

# pylint: disable=C0326
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import os
from freezegun import freeze_time
from unittest import skipIf
from odoo import fields
from odoo.addons.account_reports.tests.common import TestAccountReportsCommon
from odoo.addons.account_reports.tests.account_sales_report_common import AccountSalesReportCommon
from odoo.tests import tagged
@tagged('post_install_l10n', 'post_install', '-at_install')
class TestNlICPSBR(AccountSalesReportCommon):
@classmethod
@AccountSalesReportCommon.setup_country('nl')
def setUpClass(cls):
super().setUpClass()
cls.env.company.write({
'vat': 'NL123456782B90',
'l10n_nl_reports_sbr_ob_nummer': '987654321B09',
})
cls.partner_c = cls.env['res.partner'].create({
'name': 'Partner C',
'country_id': cls.env.ref('base.de').id,
'vat': 'DE123456788',
})
@freeze_time('2019-02-23 18:45')
def test_icp_xbrl_export(self):
# Create a new partner for the representative and link it to the company.
representative = self.env['res.partner'].create({
'company_type': 'company',
'name': 'Fidu NL',
'street': 'Fidu Street 123',
'city': 'Amsterdam',
'zip': '1019',
'country_id': self.env.ref('base.nl').id,
'vat': 'NL123456782B90',
'phone': '+31470123456',
'email': 'info@fidu.nl',
})
self.env.company.account_representative_id = representative.id
self.env.user.phone = '+31432112345'
t_tax = self.env.ref(f'account.{self.env.company.id}_btw_X0_ABC_levering')
s_tax = self.env.ref(f'account.{self.env.company.id}_btw_X0_diensten')
product_service = self.env['product.product'].create({
'name': 'product_service',
'lst_price': 750.0,
'taxes_id': [s_tax.id],
'type': 'service',
})
product_triangular = self.env['product.product'].create({
'name': 'product_triangular',
'lst_price': 500.0,
'taxes_id': [t_tax.id],
})
self.init_invoice('out_invoice', partner=self.partner_a, invoice_date=fields.Date.from_string('2019-02-15'), post=True, products=[self.product_a, product_service, product_triangular])
self.init_invoice('out_invoice', partner=self.partner_b, invoice_date=fields.Date.from_string('2019-06-20'), post=True, products=[self.product_a, product_service])
# Credit note for a fictitious invoice in a previous month, tests that negative values are also included in the export
self.init_invoice('out_refund', partner=self.partner_c, invoice_date=fields.Date.from_string('2019-06-30'), post=True, products=[product_triangular])
self.env['account.move.line'].flush_model()
report = self.env.ref('l10n_nl_reports.dutch_icp_report')
date_from = fields.Date.from_string('2019-01-01')
date_to = fields.Date.from_string('2019-12-31')
options = self._generate_options(report, date_from, date_to)
wizard = self.env['l10n_nl_reports.sbr.icp.wizard'] \
.with_context(default_date_from=date_from, default_date_to=date_to, options=options) \
.create({'tax_consultant_number': '123456'})
# This call will add the wanted values in the options
wizard.action_download_xbrl_file()
generated_xbrl = self.get_xml_tree_from_string(self.env['l10n_nl_reports.ec.sales.report.handler'].export_icp_report_to_xbrl(options).get('file_content'))
expected_xbrl = self.get_xml_tree_from_string('''
<xbrli:xbrl xmlns:bd-i="http://www.nltaxonomie.nl/nt20/bd/20251210/dictionary/bd-data" xmlns:xbrldi="http://xbrl.org/2006/xbrldi" xmlns:bd-axes="http://www.nltaxonomie.nl/nt20/bd/20251210/validation/bd-axes" xmlns:link="http://www.xbrl.org/2003/linkbase" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xbrli="http://www.xbrl.org/2003/instance" xmlns:bd-domains="http://www.nltaxonomie.nl/nt20/bd/20251210/validation/bd-domains" xmlns:iso4217="http://www.xbrl.org/2003/iso4217" xml:lang="nl">
<link:schemaRef xlink:type="simple" xlink:href="http://www.nltaxonomie.nl/nt20/bd/20251210/entrypoints/bd-rpt-icp-opgaaf-2026.xsd" />
<xbrli:context id="CD_Opgaaf">
<xbrli:entity>
<xbrli:identifier scheme="www.belastingdienst.nl/omzetbelastingnummer">987654321B09</xbrli:identifier>
</xbrli:entity>
<xbrli:period>
<xbrli:startDate>2019-01-01</xbrli:startDate>
<xbrli:endDate>2019-12-31</xbrli:endDate>
</xbrli:period>
</xbrli:context>
<xbrli:context id="Msg_PASN1">
<xbrli:entity>
<xbrli:identifier scheme="www.belastingdienst.nl/omzetbelastingnummer">987654321B09</xbrli:identifier>
</xbrli:entity>
<xbrli:period>
<xbrli:startDate>2019-01-01</xbrli:startDate>
<xbrli:endDate>2019-12-31</xbrli:endDate>
</xbrli:period>
<xbrli:scenario>
<xbrldi:typedMember dimension="bd-axes:ProfessionalAssociationSerialNumberDimension">
<bd-domains:ProfessionalAssociationSerialNumberDomain>1</bd-domains:ProfessionalAssociationSerialNumberDomain>
</xbrldi:typedMember>
</xbrli:scenario>
</xbrli:context>
<xbrli:context id="ICP_FR_23334175221">
<xbrli:entity>
<xbrli:identifier scheme="www.belastingdienst.nl/omzetbelastingnummer">987654321B09</xbrli:identifier>
</xbrli:entity>
<xbrli:period>
<xbrli:startDate>2019-01-01</xbrli:startDate>
<xbrli:endDate>2019-12-31</xbrli:endDate>
</xbrli:period>
<xbrli:scenario>
<xbrldi:typedMember dimension="bd-axes:VATNumberDimension">
<bd-domains:VATNumberDomain>23334175221</bd-domains:VATNumberDomain>
</xbrldi:typedMember>
<xbrldi:typedMember dimension="bd-axes:CountryCodeEUDimension">
<bd-domains:CountryCodeEUDomain>FR</bd-domains:CountryCodeEUDomain>
</xbrldi:typedMember>
</xbrli:scenario>
</xbrli:context>
<xbrli:context id="ICP_BE_0477472701">
<xbrli:entity>
<xbrli:identifier scheme="www.belastingdienst.nl/omzetbelastingnummer">987654321B09</xbrli:identifier>
</xbrli:entity>
<xbrli:period>
<xbrli:startDate>2019-01-01</xbrli:startDate>
<xbrli:endDate>2019-12-31</xbrli:endDate>
</xbrli:period>
<xbrli:scenario>
<xbrldi:typedMember dimension="bd-axes:VATNumberDimension">
<bd-domains:VATNumberDomain>0477472701</bd-domains:VATNumberDomain>
</xbrldi:typedMember>
<xbrldi:typedMember dimension="bd-axes:CountryCodeEUDimension">
<bd-domains:CountryCodeEUDomain>BE</bd-domains:CountryCodeEUDomain>
</xbrldi:typedMember>
</xbrli:scenario>
</xbrli:context>
<xbrli:context id="ICP_DE_123456788">
<xbrli:entity>
<xbrli:identifier scheme="www.belastingdienst.nl/omzetbelastingnummer">987654321B09</xbrli:identifier>
</xbrli:entity>
<xbrli:period>
<xbrli:startDate>2019-01-01</xbrli:startDate>
<xbrli:endDate>2019-12-31</xbrli:endDate>
</xbrli:period>
<xbrli:scenario>
<xbrldi:typedMember dimension="bd-axes:VATNumberDimension">
<bd-domains:VATNumberDomain>123456788</bd-domains:VATNumberDomain>
</xbrldi:typedMember>
<xbrldi:typedMember dimension="bd-axes:CountryCodeEUDimension">
<bd-domains:CountryCodeEUDomain>DE</bd-domains:CountryCodeEUDomain>
</xbrldi:typedMember>
</xbrli:scenario>
</xbrli:context>
<xbrli:unit id="EUR">
<xbrli:measure>iso4217:EUR</xbrli:measure>
</xbrli:unit>
<bd-i:MessageReferenceSupplierICP contextRef="CD_Opgaaf">___ignore___</bd-i:MessageReferenceSupplierICP>
<bd-i:SoftwareVendorAccountNumber contextRef="CD_Opgaaf">swo02770</bd-i:SoftwareVendorAccountNumber>
<bd-i:SoftwarePackageName contextRef="CD_Opgaaf">Odoo</bd-i:SoftwarePackageName>
<bd-i:SoftwarePackageVersion contextRef="CD_Opgaaf">___ignore___</bd-i:SoftwarePackageVersion>
<bd-i:DateTimeCreation contextRef="CD_Opgaaf">201902231845</bd-i:DateTimeCreation>
<bd-i:ProfessionalAssociationForTaxServiceProvidersName contextRef="Msg_PASN1">NBA</bd-i:ProfessionalAssociationForTaxServiceProvidersName>
<bd-i:TaxConsultantNumber contextRef="CD_Opgaaf">123456</bd-i:TaxConsultantNumber>
<bd-i:ContactInitials contextRef="CD_Opgaaf">BIAA</bd-i:ContactInitials>
<bd-i:ContactPrefix contextRef="CD_Opgaaf">I am</bd-i:ContactPrefix>
<bd-i:ContactSurname contextRef="CD_Opgaaf">accountman!</bd-i:ContactSurname>
<bd-i:ContactTelephoneNumber contextRef="CD_Opgaaf">+31432112345</bd-i:ContactTelephoneNumber>
<bd-i:VATIdentificationNumberNLFiscalEntityDivision contextRef="CD_Opgaaf">123456782B90</bd-i:VATIdentificationNumberNLFiscalEntityDivision>
<bd-i:SuppliesAmount unitRef="EUR" decimals="INF" contextRef="ICP_FR_23334175221">1000</bd-i:SuppliesAmount>
<bd-i:SuppliesAmount unitRef="EUR" decimals="INF" contextRef="ICP_BE_0477472701">1000</bd-i:SuppliesAmount>
<bd-i:ServicesAmount unitRef="EUR" decimals="INF" contextRef="ICP_FR_23334175221">750</bd-i:ServicesAmount>
<bd-i:ServicesAmount unitRef="EUR" decimals="INF" contextRef="ICP_BE_0477472701">750</bd-i:ServicesAmount>
<bd-i:ABCSuppliesAmount unitRef="EUR" decimals="INF" contextRef="ICP_FR_23334175221">500</bd-i:ABCSuppliesAmount>
<bd-i:ABCSuppliesAmount unitRef="EUR" decimals="INF" contextRef="ICP_DE_123456788">-500</bd-i:ABCSuppliesAmount>
</xbrli:xbrl>
''')
self.assertXmlTreeEqual(generated_xbrl, expected_xbrl)
@tagged('external_l10n', 'post_install', '-at_install', '-standard', 'external')
@skipIf(not os.getenv("NL_SBR_CERT"), "No SBR certificate")
class TestNlSBRFlow(TestAccountReportsCommon):
@classmethod
@TestAccountReportsCommon.setup_country('nl')
def setUpClass(cls):
super().setUpClass()
cls.env.company.write({
'vat': 'NL123456782B90',
'l10n_nl_reports_sbr_ob_nummer': '987654321B09',
})
cls.NL_SBR_CERT = os.getenv("NL_SBR_CERT")
cls.NL_SBR_PWD = os.getenv("NL_SBR_PWD")
def test_sbr_flow(self):
# Load the certificate and key in the company
certificate = self.env['certificate.certificate'].create({
'name': 'SBR NL certificate',
'content': self.NL_SBR_CERT.encode(),
'pkcs12_password': self.NL_SBR_PWD,
'company_id': self.env.company.id,
})
self.assertTrue(certificate.private_key_id)
self.env.company.l10n_nl_reports_sbr_cert_id = certificate
date_from = fields.Date.from_string('2019-01-01')
date_to = fields.Date.from_string('2019-12-31')
report = self.env.ref('l10n_nl_reports.dutch_icp_report')
options = self._generate_options(report, date_from, date_to)
wizard = self.env['l10n_nl_reports.sbr.icp.wizard']\
.with_context(default_date_from=date_from, default_date_to=date_to, options=options)\
.create({'is_test': True})
res = wizard.send_xbrl()
self.assertTrue(res)