From a5f01f9d7ada5ab480fdcfdb3340b1da93e78386 Mon Sep 17 00:00:00 2001 From: Brice bib Bartoletti Date: Thu, 5 Oct 2023 15:00:10 +0200 Subject: [PATCH] [IMP] l10n_dk_oioubl: allow import The aim of this commit is to allow import of OIOUBL einvoice. Documentation source: https://oioubl.info/classes/en/index.html The test xml files are those provided in the OIOUBL documentation. The testing xml files are those provided by the Danish administration with the documentation. You can download the documentation here: https://oioubl.info/documents/en/allpdf.zip The xml are in the folder "Eksempelfiler". closes odoo/odoo#137758 Task-id: 3420748 X-original-commit: b6a060b60e6755af4e6029eb7b23d417a3c4a774 Signed-off-by: Laurent Smet (las) Signed-off-by: Brice Bartoletti (bib) --- addons/l10n_dk_oioubl/models/account_move.py | 12 + .../external/ADVORD_01_01_00_Invoice_v2p1.xml | 198 +++++++++++++++ .../external/ADVORD_02_02_00_Invoice_v2p1.xml | 200 +++++++++++++++ .../external/ADVORD_03_03_00_Invoice_v2p1.xml | 200 +++++++++++++++ .../external/BASPRO_01_01_00_Invoice_v2p1.xml | 228 ++++++++++++++++++ .../tests/test_xml_oioubl_dk.py | 117 ++++++++- 6 files changed, 948 insertions(+), 7 deletions(-) create mode 100644 addons/l10n_dk_oioubl/models/account_move.py create mode 100644 addons/l10n_dk_oioubl/tests/test_files/external/ADVORD_01_01_00_Invoice_v2p1.xml create mode 100644 addons/l10n_dk_oioubl/tests/test_files/external/ADVORD_02_02_00_Invoice_v2p1.xml create mode 100644 addons/l10n_dk_oioubl/tests/test_files/external/ADVORD_03_03_00_Invoice_v2p1.xml create mode 100644 addons/l10n_dk_oioubl/tests/test_files/external/BASPRO_01_01_00_Invoice_v2p1.xml diff --git a/addons/l10n_dk_oioubl/models/account_move.py b/addons/l10n_dk_oioubl/models/account_move.py new file mode 100644 index 00000000000..3f6476a8914 --- /dev/null +++ b/addons/l10n_dk_oioubl/models/account_move.py @@ -0,0 +1,12 @@ +from odoo import api, models + + +class AccountMove(models.Model): + _inherit = 'account.move' + + @api.model + def _get_ubl_cii_builder_from_xml_tree(self, tree): + customization_id = tree.find('{*}CustomizationID') + if customization_id is not None and 'OIOUBL-2' in customization_id.text: + return self.env['account.edi.xml.oioubl_201'] + return super()._get_ubl_cii_builder_from_xml_tree(tree) diff --git a/addons/l10n_dk_oioubl/tests/test_files/external/ADVORD_01_01_00_Invoice_v2p1.xml b/addons/l10n_dk_oioubl/tests/test_files/external/ADVORD_01_01_00_Invoice_v2p1.xml new file mode 100644 index 00000000000..9ed7c43cf00 --- /dev/null +++ b/addons/l10n_dk_oioubl/tests/test_files/external/ADVORD_01_01_00_Invoice_v2p1.xml @@ -0,0 +1,198 @@ + + + + + + + + 2.0 + OIOUBL-2.01 + Procurement-OrdSel-BilSim-1.0 + A00095678 + false + 6E09886B-DC6E-439F-82D1-7CCAC7F4E3B3 + 2006-04-10 + 380 + DKK + 5250124502 + + 5002701 + 2006-04-01 + + + + DK16356706 + + DK16356706 + + + Krea Toys + + + StructuredDK + Leverandørvej + 11 + Dyssegård + 2870 + + DK + + + + DK16356706 + + 63 + Moms + + + + Krea Toys + DK16356706 + + + 9876 + Hugo Jensen + 26532147 + Hugo@kt.dk + + + + + + 5798000416604 + + 5798000417777 + + + Myretuen + + + StructuredDK + Fredericiavej + 10 + Helsingør + 3000 + + DK + + + + DK16356709 + + 63 + Moms + + + + Myretuen + DK16356709 + + + 1413 + Lise Hansen + 2653214 + Lise@mt.dk + + + + + 2006-04-15 + + + 1 + 42 + 2006-04-25 + DK:BANK + + 0005704966 + A00095678 + + 9544 + + + + + 1 + 1 + 6250.00 + + + 1250.00 + + 5000.00 + 1250.00 + + StandardRated + 25 + + 63 + Moms + + + + + + 5000.00 + 1250.00 + 6250.00 + 6250.00 + + + 1 + 1.00 + 5000.00 + + 1 + + + 1250.00 + + 5000.00 + 1250.00 + + StandardRated + 25 + + 63 + Moms + + + + + + Fine toy + Fine toy + + 5712345780121 + + + + 5000.00 + 1 + 1 + + + diff --git a/addons/l10n_dk_oioubl/tests/test_files/external/ADVORD_02_02_00_Invoice_v2p1.xml b/addons/l10n_dk_oioubl/tests/test_files/external/ADVORD_02_02_00_Invoice_v2p1.xml new file mode 100644 index 00000000000..108cd05c4e9 --- /dev/null +++ b/addons/l10n_dk_oioubl/tests/test_files/external/ADVORD_02_02_00_Invoice_v2p1.xml @@ -0,0 +1,200 @@ + + + + + + + + 2.0 + OIOUBL-2.01 + Procurement-OrdSel-BilSim-1.0 + A00095680 + false + 6E09886B-DC6E-439F-82D1-7CCAC7F4E3B4 + 2006-04-10 + 380 + DKK + 5250124502 + + 5002701 + 6E09886B-DC6E-43EE-82D1-7CCAC7F4E3B1 + 2006-04-01 + + + + DK16356706 + + DK16356706 + + + Super Soft A/S + + + StructuredDK + Leverandørvej + 11 + Dyssegård + 2870 + + DK + + + + DK16356706 + + 63 + Moms + + + + Super Soft A/S + DK16356706 + + + 5567 + Hugo Jensen + 26532147 + Hugo@ss.dk + + + + + + 5798000416604 + + 5798000417777 + + + Myretuen + + + StructuredDK + Fredericiavej + 10 + Helsingør + 3000 + + DK + + + + DK16356709 + + 63 + Moms + + + + Myretuen + DK16356709 + + + 1413 + Lise Hansen + 2653214 + Lise@mt.dk + + + + + 2006-04-15 + + + 1 + 42 + 2006-04-25 + DK:BANK + + 0005704966 + A00095680 + + 9544 + + + + + 1 + 1 + 5000.00 + + + 1000.00 + + 4000.00 + 1000.00 + + StandardRated + 25 + + 63 + Moms + + + + + + 4000.00 + 1000.00 + 5000.00 + 5000.00 + + + 1 + 800.00 + 4000.00 + + 1 + + + 1000.00 + + 4000.00 + 1000.00 + + StandardRated + 25 + + 63 + Moms + + + + + + Superble + Superble + + 5712345780121 + + + + 5.00 + 1 + 1 + + + diff --git a/addons/l10n_dk_oioubl/tests/test_files/external/ADVORD_03_03_00_Invoice_v2p1.xml b/addons/l10n_dk_oioubl/tests/test_files/external/ADVORD_03_03_00_Invoice_v2p1.xml new file mode 100644 index 00000000000..e5ae677a779 --- /dev/null +++ b/addons/l10n_dk_oioubl/tests/test_files/external/ADVORD_03_03_00_Invoice_v2p1.xml @@ -0,0 +1,200 @@ + + + + + + + + 2.0 + OIOUBL-2.01 + Procurement-OrdAdvR-BilSim-1.0 + A00095678 + false + 6E09886B-DC6E-439F-82D1-7CCAC7F4E3B3 + 2006-04-10 + 380 + DKK + 5250124502 + + 5002701 + 6E09886B-DC6E-439F-82D1-7CCAC7F4E3B1 + 2006-04-01 + + + + DK16356706 + + DK16356706 + + + PricewaterhouseCoopers + + + StructuredDK + Strandvejen + 44 + Hellerup + 2900 + + DK + + + + DK16356706 + + 63 + Moms + + + + PricewaterhouseCoopers + DK16356706 + + + 8149 + Peter Skovborg + 26532147 + Peter@pwc.dk + + + + + + 5798000416604 + + 5798000416642 + + + IT- og Telestyrelsen + + + StructuredDK + Holsteinsgade + 300 + København Ø + 2100 + + DK + + + + DK16356709 + + 63 + Moms + + + + IT- og Telestyrelsen + DK16356709 + + + 90015 + Lasse Jensen + 2653214 + Lasse@itst.dk + + + + + 2006-04-15 + + + 1 + 42 + 2006-04-25 + DK:BANK + + 0005704966 + A00095678 + + 9544 + + + + + 1 + 1 + 6250.00 + + + 1250.00 + + 5000.00 + 1250.00 + + StandardRated + 25 + + 63 + Moms + + + + + + 5000.00 + 1250.00 + 6250.00 + 6250.00 + + + 1 + 1.00 + 5000.00 + + 1 + + + 1250.00 + + 5000.00 + 1250.00 + + StandardRated + 25 + + 63 + Moms + + + + + + Konsulentrapport + Konsulentrapport + + n/a + + + + 5000.00 + 1 + 1 + + + diff --git a/addons/l10n_dk_oioubl/tests/test_files/external/BASPRO_01_01_00_Invoice_v2p1.xml b/addons/l10n_dk_oioubl/tests/test_files/external/BASPRO_01_01_00_Invoice_v2p1.xml new file mode 100644 index 00000000000..4b72f40b439 --- /dev/null +++ b/addons/l10n_dk_oioubl/tests/test_files/external/BASPRO_01_01_00_Invoice_v2p1.xml @@ -0,0 +1,228 @@ + + + + + + + + 2.0 + OIOUBL-2.01 + Procurement-OrdSimR-BilSim-1.0 + A00095678 + false + 9756b4d0-8815-1029-857a-e388fe63f399 + 2005-11-20 + 380 + DKK + 5250124502 + + 5002701 + 9756b468-8815-1029-857a-e388fe63f399 + 2005-11-01 + + + + DK16356706 + + DK16356706 + + + Tavleverandøren + + + StructuredDK + Leverandørvej + 11 + Dyssegård + 2870 + + DK + + + + DK16356706 + + 63 + Moms + + + + Tavleleverandøren + DK16356706 + + + 23456 + Hugo Jensen + 15812337 + Hugo@tavl.dk + + + + + + 5798000416604 + + 5798000416604 + + + Den Lille Skole + + + StructuredDK + Fredericiavej + 10 + Helsingør + 3000 + + DK + + + + Den Lille Skole + DK16356709 + + + 7778 + Hans Hansen + 26532147 + Hans@dls.dk + + + + + 2005-11-15 + + + 1 + 42 + 2005-11-25 + DK:BANK + + 1234567890 + A00095678 + + 1234 + + + + + 1 + 1 + 6312.50 + + + 1262.50 + + 5050.00 + 1262.50 + + StandardRated + 25 + + 63 + Moms + + + + + + 5050.00 + 1262.50 + 6312.50 + 6312.50 + + + 1 + 1.00 + 5000.00 + + 1 + + + 1250.00 + + 5000.00 + 1250.00 + + StandardRated + 25 + + 63 + Moms + + + + + + Hejsetavle + Hejsetavle + + 5712345780121 + + + + 5000.00 + 1 + 1 + + + + 2 + 2.00 + 50.00 + + 2 + + + 12.50 + + 50.00 + 12.50 + + StandardRated + 25 + + 63 + Moms + + + + + + Beslag + Beslag + + 5712345780111 + + + + 25.00 + 1 + 1 + + + diff --git a/addons/l10n_dk_oioubl/tests/test_xml_oioubl_dk.py b/addons/l10n_dk_oioubl/tests/test_xml_oioubl_dk.py index 2503255f14b..9f2629fabc5 100644 --- a/addons/l10n_dk_oioubl/tests/test_xml_oioubl_dk.py +++ b/addons/l10n_dk_oioubl/tests/test_xml_oioubl_dk.py @@ -1,10 +1,12 @@ from freezegun import freeze_time -from odoo import Command +from odoo import Command, fields from odoo.addons.l10n_account_edi_ubl_cii_tests.tests.common import TestUBLCommon from odoo.addons.account.tests.test_account_move_send import TestAccountMoveSendCommon from odoo.exceptions import UserError +from odoo.modules.module import get_resource_path from odoo.tests import tagged +from odoo.tools import file_open @tagged('post_install_l10n', 'post_install', '-at_install') @@ -60,10 +62,11 @@ class TestUBLDK(TestUBLCommon, TestAccountMoveSendCommon): 'company_registry': '123 568 941 00056', 'ubl_cii_format': 'oioubl_201', }) - cls.dk_local_tax_1 = cls.env["account.chart.template"].ref('tax120') - cls.dk_local_tax_2 = cls.env["account.chart.template"].ref('tax110') - cls.dk_foreign_tax_1 = cls.env["account.chart.template"].ref('tax210') - cls.dk_foreign_tax_2 = cls.env["account.chart.template"].ref('tax220') + cls.dk_local_sale_tax_1 = cls.env["account.chart.template"].ref('tax120') + cls.dk_local_sale_tax_2 = cls.env["account.chart.template"].ref('tax110') + cls.dk_foreign_sale_tax_1 = cls.env["account.chart.template"].ref('tax210') + cls.dk_foreign_sale_tax_2 = cls.env["account.chart.template"].ref('tax220') + cls.dk_local_purchase_tax_goods = cls.env["account.chart.template"].ref('tax400') def create_post_and_send_invoice(self, partner=None, move_type='out_invoice'): if not partner: @@ -71,10 +74,10 @@ class TestUBLDK(TestUBLCommon, TestAccountMoveSendCommon): if partner == self.partner_a: # local dk taxes - tax_1, tax_2 = self.dk_local_tax_1, self.dk_local_tax_2 + tax_1, tax_2 = self.dk_local_sale_tax_1, self.dk_local_sale_tax_2 else: # dk taxes for foreigners - tax_1, tax_2 = self.dk_foreign_tax_1, self.dk_foreign_tax_2 + tax_1, tax_2 = self.dk_foreign_sale_tax_1, self.dk_foreign_sale_tax_2 invoice = self.env["account.move"].create({ 'move_type': move_type, @@ -104,6 +107,10 @@ class TestUBLDK(TestUBLCommon, TestAccountMoveSendCommon): invoice._generate_pdf_and_send_invoice(self.move_template, from_cron=False, allow_fallback_pdf=False) return invoice + ######### + # EXPORT + ######### + @freeze_time('2017-01-01') def test_export_invoice_two_line_partner_dk(self): invoice = self.create_post_and_send_invoice() @@ -166,3 +173,99 @@ class TestUBLDK(TestUBLCommon, TestAccountMoveSendCommon): self.partner_c.company_registry = False with self.assertRaisesRegex(UserError, "The company registry is required for french partner:"): self.create_post_and_send_invoice(partner=self.partner_c) + + ######### + # IMPORT + ######### + + def import_bill_xml_file_in_purchase_journal(self, file_path): + full_file_path = get_resource_path(self.test_module, 'tests/test_files', file_path) + self.assertTrue(full_file_path, f'File not found: {file_path}') + with file_open(full_file_path, 'rb') as file: + xml_attachment = self.env['ir.attachment'].create({ + 'mimetype': 'application/xml', + 'name': 'test_invoice.xml', + 'raw': file.read(), + }) + purchase_journal = self.company_data["default_journal_purchase"] + invoice = purchase_journal._create_document_from_attachment(xml_attachment.id) + return invoice + + @freeze_time('2017-01-01') + def test_oioubl_import_exemple_file_1(self): + file_name = 'external/ADVORD_01_01_00_Invoice_v2p1.xml' + bill = self.import_bill_xml_file_in_purchase_journal(file_name) + self.assertRecordValues(bill, ({ + 'ref': 'A00095678', + 'invoice_date': fields.Date.from_string('2006-04-10'), + 'amount_total': 6_250.00, + },)) + self.assertRecordValues(bill.invoice_line_ids, ({ + 'name': 'Fine toy', + 'quantity': 1, + 'price_unit': 5_000.00, + 'price_subtotal': 5_000.00, + 'price_total': 6_250.00, + 'tax_ids': self.dk_local_purchase_tax_goods.ids, + },)) + + @freeze_time('2017-01-01') + def test_oioubl_import_exemple_file_2(self): + file_name = 'external/ADVORD_02_02_00_Invoice_v2p1.xml' + bill = self.import_bill_xml_file_in_purchase_journal(file_name) + self.assertRecordValues(bill, ({ + 'ref': 'A00095680', + 'invoice_date': fields.Date.from_string('2006-04-10'), + 'amount_total': 5_000.00, + },)) + self.assertRecordValues(bill.invoice_line_ids, ({ + 'name': 'Superble', + 'quantity': 800, + 'price_unit': 5.00, + 'price_subtotal': 4_000.00, + 'price_total': 5_000.00, + 'tax_ids': self.dk_local_purchase_tax_goods.ids, + },)) + + @freeze_time('2017-01-01') + def test_oioubl_import_exemple_file_3(self): + file_name = 'external/ADVORD_03_03_00_Invoice_v2p1.xml' + bill = self.import_bill_xml_file_in_purchase_journal(file_name) + self.assertRecordValues(bill, ({ + 'ref': 'A00095678', + 'invoice_date': fields.Date.from_string('2006-04-10'), + 'amount_total': 6_250.00, + },)) + self.assertRecordValues(bill.invoice_line_ids, ({ + 'name': 'Konsulentrapport', + 'quantity': 1, + 'price_unit': 5_000.00, + 'price_subtotal': 5_000.00, + 'price_total': 6_250.00, + 'tax_ids': self.dk_local_purchase_tax_goods.ids, + },)) + + @freeze_time('2017-01-01') + def test_oioubl_import_exemple_file_4(self): + file_name = 'external/BASPRO_01_01_00_Invoice_v2p1.xml' + bill = self.import_bill_xml_file_in_purchase_journal(file_name) + self.assertRecordValues(bill, ({ + 'ref': 'A00095678', + 'invoice_date': fields.Date.from_string('2005-11-20'), + 'amount_total': 6_312.50, + },)) + self.assertRecordValues(bill.invoice_line_ids, ({ + 'name': 'Hejsetavle', + 'quantity': 1, + 'price_unit': 5_000.00, + 'price_subtotal': 5_000.00, + 'price_total': 6_250.00, + 'tax_ids': self.dk_local_purchase_tax_goods.ids, + }, { + 'name': 'Beslag', + 'quantity': 2, + 'price_unit': 25.00, + 'price_subtotal': 50.00, + 'price_total': 62.50, + 'tax_ids': self.dk_local_purchase_tax_goods.ids, + }))