From c60b7cd115269b1c88a44fb37100c2b80260a081 Mon Sep 17 00:00:00 2001 From: Maximilien TANTIN Date: Wed, 25 May 2022 14:52:46 +0200 Subject: [PATCH] [14.0][account_invoice_import_invoice2data] Add lines management to create multiline invoices [14.0][account_invoice_import_invoice2data] Add tests for multiline products management --- .../demo/demo_data.xml | 21 +++++ .../invoice_gandi_websites_2022030201155.pdf | Bin 0 -> 82016 bytes .../tests/test_invoice_import.py | 82 +++++++++++++++++- .../wizard/account_invoice_import.py | 38 ++++++++ 4 files changed, 140 insertions(+), 1 deletion(-) create mode 100755 account_invoice_import_invoice2data/tests/pdf/invoice_gandi_websites_2022030201155.pdf diff --git a/account_invoice_import_invoice2data/demo/demo_data.xml b/account_invoice_import_invoice2data/demo/demo_data.xml index d32cd646ed..bd04ba1b60 100644 --- a/account_invoice_import_invoice2data/demo/demo_data.xml +++ b/account_invoice_import_invoice2data/demo/demo_data.xml @@ -30,5 +30,26 @@ + + Gandi + + 1 + 0 + 63 Boulevard Massena + 75013 + Paris + + https://www.gandi.net + FR81423093459 + + + + Gandi + + nline_static_product + Fiber optic access at the main office + + + diff --git a/account_invoice_import_invoice2data/tests/pdf/invoice_gandi_websites_2022030201155.pdf b/account_invoice_import_invoice2data/tests/pdf/invoice_gandi_websites_2022030201155.pdf new file mode 100755 index 0000000000000000000000000000000000000000..7057314110c61e56831e902ecd715870b555d0dd GIT binary patch literal 82016 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 literal 0 HcmV?d00001 diff --git a/account_invoice_import_invoice2data/tests/test_invoice_import.py b/account_invoice_import_invoice2data/tests/test_invoice_import.py index 8c5c30ee4d..d2c86835fd 100644 --- a/account_invoice_import_invoice2data/tests/test_invoice_import.py +++ b/account_invoice_import_invoice2data/tests/test_invoice_import.py @@ -3,6 +3,9 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). import base64 +import datetime + +from mock import patch from odoo import fields from odoo.tests.common import TransactionCase @@ -27,7 +30,13 @@ def setUp(self): ) internet_product.supplier_taxes_id = [(6, 0, [frtax.id])] - def test_import_free_invoice(self): + def test_import_free_1line_invoice(self): + # Check for invoice_line_method is set correctly + free_import_config = self.env.ref( + "account_invoice_import_invoice2data.free_import_config" + ) + self.assertEqual(free_import_config.invoice_line_method, "1line_static_product") + filename = "invoice_free_fiber_201507.pdf" f = file_open("account_invoice_import_invoice2data/tests/pdf/" + filename, "rb") pdf_file = f.read() @@ -100,3 +109,74 @@ def test_import_free_invoice(self): self.assertEqual(len(invoices), 1) inv = invoices[0] self.assertEqual(fields.Date.to_string(inv.invoice_date), "2015-07-02") + + @patch( + "odoo.addons.account_invoice_import_invoice2data.wizard.account_invoice_import.extract_data" # noqa: B950 + ) + def test_import_gandi_nline_invoice(self, patched): + patched.return_value = self.mock_extract_data() + + # Check for invoice_line_method is set correctly + gandi_import_config = self.env.ref( + "account_invoice_import_invoice2data.gandi_import_config" + ) + self.assertEqual( + gandi_import_config.invoice_line_method, "nline_static_product" + ) + + filename = "invoice_gandi_websites_2022030201155.pdf" + f = file_open("account_invoice_import_invoice2data/tests/pdf/" + filename, "rb") + pdf_file = f.read() + pdf_file_b64 = base64.b64encode(pdf_file) + wiz = self.env["account.invoice.import"].create( + { + "invoice_file": pdf_file_b64, + "invoice_filename": filename, + } + ) + f.close() + wiz.import_invoice() + # Check result of invoice creation + invoices = self.env["account.move"].search( + [ + ("state", "=", "draft"), + ("move_type", "=", "in_invoice"), + ("ref", "=", "2022010100001"), + ] + ) + self.assertEqual(len(invoices), 1) + inv = invoices[0] + self.assertEqual(inv.move_type, "in_invoice") + self.assertEqual(fields.Date.to_string(inv.invoice_date), "2022-01-01") + self.assertEqual( + inv.partner_id, self.env.ref("account_invoice_import_invoice2data.gandi") + ) + self.assertEqual(inv.journal_id.type, "purchase") + self.assertEqual(float_compare(inv.amount_total, 109.97, precision_digits=2), 0) + self.assertEqual( + float_compare(inv.amount_untaxed, 91.64, precision_digits=2), 0 + ) + self.assertEqual(len(inv.invoice_line_ids), 7) + + def mock_extract_data(self): + return { + "issuer": "Gandi", + "amount": 109.97, + "amount_untaxed": 91.64, + "date": datetime.datetime(2022, 1, 1, 0, 0), + "invoice_number": "2022010100001", + "vat": "FR81423093459", + "partner_name": "Gandi", + "siren": "423 093 459", + "lines": [ + {"name": "site1.com", "taxes": 20.0, "price_unit": 12.0}, + {"name": "site2.fr", "taxes": 20.0, "price_unit": 13.91}, + {"name": "site3.fr", "taxes": 20.0, "price_unit": 13.91}, + {"name": "site4.com", "taxes": 20.0, "price_unit": 12.0}, + {"price_unit": 12.0}, + {"name": "site6.fr", "price_unit": 13.91}, + {"taxes": 20.0, "price_unit": 13.91}, + ], + "currency": "EUR", + "desc": "Invoice from Gandi", + } diff --git a/account_invoice_import_invoice2data/wizard/account_invoice_import.py b/account_invoice_import_invoice2data/wizard/account_invoice_import.py index 48903124e3..2055007d50 100644 --- a/account_invoice_import_invoice2data/wizard/account_invoice_import.py +++ b/account_invoice_import_invoice2data/wizard/account_invoice_import.py @@ -82,6 +82,22 @@ def invoice2data_to_parsed_inv(self, invoice2data_res): "date_start": invoice2data_res.get("date_start"), "date_end": invoice2data_res.get("date_end"), } + + lines = [] + for line in invoice2data_res.get("lines", []): + if "name" not in line: + line["name"] = "" + else: + line["name"] = " ".join(line["name"].split()) + if "qty" not in line: + line["qty"] = 1 + if "taxes" not in line: + line["taxes"] = [] + line["taxes"] = self.invoice2data_parse_taxes(line["taxes"]) + lines += [line] + if len(lines) > 0: + parsed_inv["lines"] = lines + for field in ["invoice_number", "description"]: if isinstance(invoice2data_res.get(field), list): parsed_inv[field] = " ".join(invoice2data_res[field]) @@ -97,3 +113,25 @@ def invoice2data_to_parsed_inv(self, invoice2data_res): if key.startswith("date") and value: parsed_inv[key] = fields.Date.to_string(value) return parsed_inv + + @api.model + def invoice2data_parse_taxes(self, taxes=None): + def get_tax(tax_amount): + try: + tax = float(tax_amount) + except (ValueError, TypeError): + tax_id = self.env.user.company_id.account_purchase_tax_id + if tax_id: + tax = tax_id.amount + else: + tax = 0.0 + return { + "amount_type": "percent", + "amount": tax, + } + + if type(taxes) == list and len(taxes) > 0: + taxes_list = [get_tax(tax_amount) for tax_amount in taxes] + else: + taxes_list = [get_tax(taxes)] + return taxes_list