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 0000000000..7057314110 Binary files /dev/null and b/account_invoice_import_invoice2data/tests/pdf/invoice_gandi_websites_2022030201155.pdf differ 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