From 1dc167f307f55bdbb2deb28de52b2b354265df4c Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Sat, 10 Oct 2026 00:42:57 +0200 Subject: [PATCH 01/17] [IMP] account_invoice_import: re-write the module (almost !) Move XML parsing in UBL and CII in the factur-x lib. As a consequence, the OCA module account_invoice_import_ubl and account_invoice_import_facturx have been marked as installable. Advantage: easier to maintain, no more backport across several odoo versions when there is a bug in the XML parsing. The invoice pivot format is now the pivot format of the factur-x lib, which is a python dict with the structure of the EN16931 standard. Remove dependency on base_business_document_import: matching functions are now directly in the module account_invoice_import. Advantage: if you need to inherit a match method, you now have all the data of the invoice, not only a small subset of it -> more powerful inherit possibilities. On res.partner, boolean field invoice_import_single_line has been replaced by selection field invoice_import_shrink_lines (migration script provided). It adds the possibility to import one line per VAT rate. In the warning message of the invoice, messages linked to a specific invoice line have a reference to it (new field import_invoice_line_identifier added on the invoice line). Add detailed import logs in the chatter. Adapt the module account_invoice_import_simple_pdf to changes in account_invoice_import. Many many other improvements ! --- .pre-commit-config.yaml | 2 + account_invoice_import/README.rst | 134 +- account_invoice_import/__manifest__.py | 8 +- .../migrations/18.0.2.0.0/post-migration.py | 31 + .../migrations/18.0.2.0.0/pre-migration.py | 14 + account_invoice_import/models/__init__.py | 1 + account_invoice_import/models/account_move.py | 19 + .../models/account_move_line.py | 18 + account_invoice_import/models/res_partner.py | 81 +- account_invoice_import/readme/CONFIGURE.md | 4 +- account_invoice_import/readme/DESCRIPTION.md | 30 +- account_invoice_import/readme/USAGE.md | 21 +- .../static/description/index.html | 70 +- account_invoice_import/tests/__init__.py | 3 +- .../tests/pdf/Facture_FR_BASICWL.pdf | Bin 0 -> 86615 bytes .../tests/pdf/Facture_FR_EN16931.pdf | Bin 0 -> 92807 bytes .../tests/pdf/Facture_FR_EXTENDED.pdf | Bin 0 -> 92847 bytes account_invoice_import/tests/test_facturx.py | 155 ++ .../tests/test_invoice_import.py | 6 +- account_invoice_import/views/account_move.xml | 21 + account_invoice_import/views/res_partner.xml | 7 +- .../wizard/account_invoice_import.py | 2388 +++++++++++------ .../account_invoice_import_partner_create.py | 20 +- .../wizard/account_invoice_import_view.xml | 29 +- .../__manifest__.py | 2 +- .../readme/DESCRIPTION.md | 2 + ...ccount_invoice_import_simple_pdf_fields.py | 62 +- ...nvoice_import_simple_pdf_invoice_number.py | 6 +- .../models/res_partner.py | 147 +- .../tests/test_invoice_import.py | 39 +- .../wizard/account_invoice_import.py | 124 +- .../wizard/account_invoice_import_view.xml | 2 +- account_invoice_import_ubl/__manifest__.py | 2 +- .../readme/DESCRIPTION.md | 2 + requirements.txt | 1 + 35 files changed, 2285 insertions(+), 1166 deletions(-) create mode 100644 account_invoice_import/migrations/18.0.2.0.0/post-migration.py create mode 100644 account_invoice_import/migrations/18.0.2.0.0/pre-migration.py create mode 100644 account_invoice_import/models/account_move_line.py create mode 100644 account_invoice_import/tests/pdf/Facture_FR_BASICWL.pdf create mode 100644 account_invoice_import/tests/pdf/Facture_FR_EN16931.pdf create mode 100644 account_invoice_import/tests/pdf/Facture_FR_EXTENDED.pdf create mode 100644 account_invoice_import/tests/test_facturx.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1484579fc8..d4444c870e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,8 @@ exclude: | (?x) # NOT INSTALLABLE ADDONS + ^account_invoice_import_facturx/| + ^account_invoice_import_ubl/| # END NOT INSTALLABLE ADDONS # Files and folders generated by bots, to avoid loops ^setup/|/static/description/index\.html$| diff --git a/account_invoice_import/README.rst b/account_invoice_import/README.rst index 25a0f6f959..0d1f6b3b73 100644 --- a/account_invoice_import/README.rst +++ b/account_invoice_import/README.rst @@ -46,48 +46,37 @@ post `__ - (Cross-Industry Invoice) developped by - `UN/CEFACT `__ (United Nations Centre for - Trade Facilitation and Electronic Business), -- `UBL `__ (Universal Business Language) which is - an ISO standard (`ISO/IEC - 19845 `__) - developped by `OASIS `__ (Organization - for the Advancement of Structured Information Standards). - -Some e-invoice standards such as -`Factur-X `__ propose to embed the XML -description of the invoice inside the PDF invoice. Other people think -that the futur is pure-XML invoices: a European initiative called -`PEPPOL `__ aims at setting up an open network to -exchange e-invoices as UBL XML. We don't know yet which standard and -which practice will prevail on electronic invoicing in the future, but -we hope that lazy accountants won't have to manually encode their vendor -bills in the near future. This module is here to help achieve this goal! - -This module doesn't do anything useful by itself ; it requires other -modules to work: each modules adds a specific invoice format. +- `CII `__ + (Cross-Industry Invoice) developped by + `UN/CEFACT `__ (United Nations Centre + for Trade Facilitation and Electronic Business), +- `UBL `__ (Universal Business Language) which is + an ISO standard (`ISO/IEC + 19845 `__) + developped by `OASIS `__ (Organization + for the Advancement of Structured Information Standards). + +The `Factur-X `__ invoice standard embeds +a CII XML file inside the PDF invoice: this is the concept of hybrid +invoice. + +This module has native support for UBL XML, CII XML and Factur-X. You +can install additional modules (for example +account_invoice_import_simple_pdf) to support other invoice formats. Here is how the module works: -- the user starts a wizard and uploads the PDF or XML invoice, -- if it is an XML file, Odoo will parse it to create the invoice - (requires additional modules for specific XML formats, such as the - module *account_invoice_import_ubl* for the UBL format), -- if it is a PDF file with an embedded XML file in Factur-X/CII format, - Odoo will extract the embedded XML file and parse it to create the - invoice (requires the module *account_invoice_import_facturx*), -- otherwise, Odoo will use the *invoice2data* Python library to try to - interpret the text of the PDF (requires the module - *account_invoice_import_invoice2data*), -- if there is already some draft supplier invoice for this supplier, - Odoo will propose to select one to update or create a new draft - invoice, -- otherwise, Odoo will directly create a new draft supplier invoice and - attach the PDF to it. - -This module also works with supplier refunds. +- the user starts a wizard and uploads the PDF or XML invoice, +- if it is an XML file, Odoo will parse it to create the invoice +- if it is a PDF file with an embedded XML file in Factur-X/CII format, + Odoo will extract the embedded XML file and parse it to create the + invoice, +- if there is already a draft supplier invoice for this supplier with + the same invoice number, Odoo will display a warning, +- otherwise, Odoo will create a new draft vendor bill and attach the + PDF or XML invoice file to it. + +This module also works with vendor refunds. **Table of contents** @@ -100,25 +89,23 @@ Configuration Go to the form view of the suppliers and configure it with the following parameters: -- Individual/Company: *Company* -- the *VAT Number* (this field is used by default when searching the - supplier in the Odoo partner database) -- in the *Accounting* tab, create one or several *Invoice Import - Configurations*. +- the *VAT Number* (this field is used by default when searching the + supplier in the Odoo partner database) +- in the *Accounting* tab, set the *Invoice Import Configuration*. You can configure a mail gateway to import invoices from an email: -- Go to the menu *Settings > Technical > Email > Incoming Mail Servers* - and setup the access (POP or IMAP) to the mailbox that will be used to - receive the invoices, -- In the section *Actions to perform on incoming mails*, set the field - *Create a new record* to *Wizard to import supplier invoices/refunds* - (model *account.invoice.import*). -- If you are in a multi-company setup, you also have to go to the menu - *Invoicing > Configuration > Settings*: in the section *Invoice - Import*, enter the email of the mailbox used to import invoices in the - field *Mail Gateway: Destination E-mail* (it will be used to import - the invoice in the proper company). +- Go to the menu *Settings > Technical > Email > Incoming Mail Servers* + and setup the access (POP or IMAP) to the mailbox that will be used + to receive the invoices, +- In the section *Actions to perform on incoming mails*, set the field + *Create a new record* to *Wizard to import supplier invoices/refunds* + (model *account.invoice.import*). +- If you are in a multi-company setup, you also have to go to the menu + *Invoicing > Configuration > Settings*: in the section *Invoice + Import*, enter the email of the mailbox used to import invoices in + the field *Mail Gateway: Destination E-mail* (it will be used to + import the invoice in the proper company). Usage ===== @@ -128,32 +115,13 @@ instructions of the wizard. You can also start the wizard from the *Accounting Dashboard*: on the purchase journal, click on the *Upload* button. -This module also supports the scenario where you have a draft vendor -bill (generated from a purchase order for instance) and you have to -update it to comply with the real invoice sent by the vendor: on the -form view of the draft vendor bill, click on the button *Import Invoice -File* and follow the instructions of the wizard. - -If you have a large volume of invoices to import, you may be interested -by the script **mass_invoice_import.py** which is available in the -*scripts* subdirectory of this module. If you run: - -:: - - ./mass_invoice_import.py --help - -you will have detailed instructions on how to use the script. - -A particular use case of this script is to have a directory where all -the invoices saved are automatically uploaded in Odoo. For that, have a -look at the sample script **inotify-sample.sh** available in the same -subdirectory. Edit this sample script to adapt it to your needs. +You can upload several invoice file at the same time. Known issues / Roadmap ====================== -- Remove dependency on *base_iban* and develop a separate glue module - between this module and *base_iban* +- Remove dependency on *base_iban* and develop a separate glue module + between this module and *base_iban* Bug Tracker =========== @@ -176,12 +144,12 @@ Authors Contributors ------------ -- Alexis de Lattre -- Andrea Stirpe -- Nicolas JEUDY -- Yannick Vaucher -- Ronald Portier -- Simone Orsi +- Alexis de Lattre +- Andrea Stirpe +- Nicolas JEUDY +- Yannick Vaucher +- Ronald Portier +- Simone Orsi Maintainers ----------- diff --git a/account_invoice_import/__manifest__.py b/account_invoice_import/__manifest__.py index b075188ceb..85b54afac5 100644 --- a/account_invoice_import/__manifest__.py +++ b/account_invoice_import/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Account Invoice Import", - "version": "18.0.1.4.0", + "version": "18.0.2.0.0", "category": "Accounting & Finance", "license": "AGPL-3", "summary": "Import supplier invoices/refunds as PDF or XML files", @@ -14,8 +14,12 @@ "depends": [ "account", "base_iban", - "base_business_document_import", + "account_tax_unece", + "account_payment_unece", + "uom_unece", ], + "excludes": ["account_invoice_import_ubl", "account_invoice_import_facturx"], + "external_dependencies": {"python": ["factur-x>=7.5"]}, "data": [ "security/ir.model.access.csv", "views/res_config_settings.xml", diff --git a/account_invoice_import/migrations/18.0.2.0.0/post-migration.py b/account_invoice_import/migrations/18.0.2.0.0/post-migration.py new file mode 100644 index 0000000000..04c43a6fb2 --- /dev/null +++ b/account_invoice_import/migrations/18.0.2.0.0/post-migration.py @@ -0,0 +1,31 @@ +# Copyright 2026 Akretion France (https://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +# In post migration script: +# - we can access the registry +# - the new fields are created +# - the old fields are still readable + +from openupgradelib import openupgrade + + +@openupgrade.migrate() +def migrate(env, version): + openupgrade.logged_query( + env.cr, + f""" + UPDATE res_partner + SET invoice_import_shrink_lines = ( + SELECT jsonb_object_agg( + key, + CASE + WHEN value = 'true'::jsonb THEN '"single"'::jsonb + ELSE value + END + ) + FROM jsonb_each({openupgrade.get_legacy_name("invoice_import_single_line")}) + ) + WHERE {openupgrade.get_legacy_name("invoice_import_single_line")} IS NOT NULL + """, + ) diff --git a/account_invoice_import/migrations/18.0.2.0.0/pre-migration.py b/account_invoice_import/migrations/18.0.2.0.0/pre-migration.py new file mode 100644 index 0000000000..b4028c5383 --- /dev/null +++ b/account_invoice_import/migrations/18.0.2.0.0/pre-migration.py @@ -0,0 +1,14 @@ +# Copyright 2026 Akretion France (https://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from openupgradelib import openupgrade + +_column_renames = { + "res_partner": [("invoice_import_single_line", None)], +} + + +@openupgrade.migrate() +def migrate(env, version): + openupgrade.rename_columns(env.cr, _column_renames) diff --git a/account_invoice_import/models/__init__.py b/account_invoice_import/models/__init__.py index 7d0a6d323c..373b79d830 100644 --- a/account_invoice_import/models/__init__.py +++ b/account_invoice_import/models/__init__.py @@ -1,4 +1,5 @@ from . import res_partner from . import res_company from . import account_move +from . import account_move_line from . import account_journal diff --git a/account_invoice_import/models/account_move.py b/account_invoice_import/models/account_move.py index 52259ffa89..d619c0f436 100644 --- a/account_invoice_import/models/account_move.py +++ b/account_invoice_import/models/account_move.py @@ -3,6 +3,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo import Command, api, fields, models +from odoo.exceptions import UserError from odoo.tools import is_html_empty @@ -23,6 +24,24 @@ def _compute_show_import_warnings(self): def _invoice_import_set_partner_and_update_lines(self, partner): self.ensure_one() + if self.is_purchase_document() and self.ref: + existing_inv = self.search( + [ + ("company_id", "=", self.company_id.id), + ("commercial_partner_id", "=", partner.commercial_partner_id.id), + ("ref", "=ilike", self.ref), + ("move_type", "=", self.move_type), + ], + limit=1, + ) + if existing_inv: + raise UserError( + self.env._( + "The invoice on which you are trying to update the partner " + "already exists: %s.", + existing_inv.display_name, + ) + ) initial_fp = self.fiscal_position_id fp = partner.property_account_position_id self.write({"partner_id": partner.id}) diff --git a/account_invoice_import/models/account_move_line.py b/account_invoice_import/models/account_move_line.py new file mode 100644 index 0000000000..17602f5e24 --- /dev/null +++ b/account_invoice_import/models/account_move_line.py @@ -0,0 +1,18 @@ +# Copyright 2026 Akretion France (https://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class AccountMoveLine(models.Model): + _inherit = "account.move.line" + + # I initially wanted to name this field import_identifier + # but the risk of naming conflict was too high, so I decided to + # set a longer name + import_invoice_line_identifier = fields.Char( + string="Import Identifier", + readonly=True, + help="When importing a vendor bill, this field stores BT-126", + ) diff --git a/account_invoice_import/models/res_partner.py b/account_invoice_import/models/res_partner.py index 7550c939f3..bdf6530f73 100644 --- a/account_invoice_import/models/res_partner.py +++ b/account_invoice_import/models/res_partner.py @@ -4,7 +4,7 @@ from markupsafe import Markup -from odoo import _, api, fields, models +from odoo import api, fields, models from odoo.exceptions import UserError @@ -35,8 +35,13 @@ class ResPartner(models.Model): "fiscal position.", ) # FORCE VALUE fields - invoice_import_single_line = fields.Boolean( - string="Force Single Invoice Line", company_dependent=True + invoice_import_shrink_lines = fields.Selection( + [ + ("single", "Single Line"), + ("per_vat_rate", "One Line per VAT rate"), + ], + string="Shrink Invoice Lines", + company_dependent=True, ) invoice_import_label = fields.Char( string="Force Invoice Line Description", @@ -61,19 +66,18 @@ class ResPartner(models.Model): related="invoice_import_move_id.partner_id" ) - def _convert_to_import_config(self, company): + def _commercial_partner_update_import_config(self, import_config): self.ensure_one() - if not company: - company = self.env.company - self = self.with_company(company.id) - vals = { - "company": company, - "single_line": self.invoice_import_single_line, - "label": self.invoice_import_label or False, - "journal": self.invoice_import_journal_id or False, - } + assert self == self.commercial_partner_id + # company context has already been injected in self + company = import_config["company"] + import_config["shrink_lines"] = self.invoice_import_shrink_lines + if self.invoice_import_label: + import_config["label"] = self.invoice_import_label + if self.invoice_import_journal_id: + import_config["purchase_journal"] = self.invoice_import_journal_id if self.invoice_import_product_id: - vals["product"] = self.invoice_import_product_id + import_config["product"] = self.invoice_import_product_id else: taxes = ( self.invoice_import_tax_ids @@ -83,13 +87,48 @@ def _convert_to_import_config(self, company): or False ) if taxes: - vals["taxes"] = taxes + import_config["taxes"] = taxes if ( self.invoice_import_account_id and company in self.invoice_import_account_id.company_ids ): - vals["account"] = self.invoice_import_account_id - return vals + import_config["account"] = self.invoice_import_account_id + if not import_config.get("product") and not import_config.get("account"): + previous_invoice = self._get_previous_invoice(import_config) + if previous_invoice: + import_config["previous_invoice"] = previous_invoice + self._update_import_config_from_previous_invoice(import_config) + + @api.model + def _update_import_config_from_previous_invoice(self, import_config): + if import_config.get("previous_invoice"): + inv = import_config["previous_invoice"] + ilines = inv.invoice_line_ids.filtered( + lambda x: x.display_type == "product" + ) + if ilines: + iline = ilines[0] + if not import_config.get("product") and iline.product_id: + import_config["product"] = iline.product_id + else: + if not import_config.get("account"): + import_config["account"] = iline.account_id + if not import_config.get("taxes") and iline.tax_ids: + import_config["taxes"] = iline.tax_ids + + def _get_previous_invoice(self, import_config): + self.ensure_one() + domain = [ + ("company_id", "=", import_config["company"].id), + ("commercial_partner_id", "=", self.id), + ("state", "=", "posted"), + ] + if import_config["invoice_type"] == "out": + domain.append(("move_type", "in", ("out_invoice", "out_refund"))) + else: + domain.append(("move_type", "in", ("in_invoice", "in_refund"))) + inv = self.env["account.move"].search(domain, limit=1, order="date desc") + return inv def update_imported_invoice(self): """Method called by button in partner banner""" @@ -101,7 +140,7 @@ def update_imported_invoice(self): # it could cause multi-company issues self.message_post( body=Markup( - _( + self.env._( "Partner has been created from the wizard " "Create or Update Partner of vendor bill import." ) @@ -109,7 +148,7 @@ def update_imported_invoice(self): ) if invoice_import_move.partner_id: raise UserError( - _( + self.env._( "The vendor bill %(move)s already has a partner %(partner)s.", move=invoice_import_move.display_name, partner=invoice_import_move.partner_id.display_name, @@ -118,7 +157,7 @@ def update_imported_invoice(self): invoice_import_move._invoice_import_set_partner_and_update_lines(self) invoice_import_move.message_post( body=Markup( - _( + self.env._( "Partner %(partner_name)s has been " "created via the wizard Create or update partner.", @@ -166,7 +205,7 @@ def _invoice_import_update_partner(self, import_partner_data): # it could cause multi-company access-right issues self.message_post( body=Markup( - _( + self.env._( "Partner updated via the wizard " "Create or Update Partner of Vendor Bill import." ) diff --git a/account_invoice_import/readme/CONFIGURE.md b/account_invoice_import/readme/CONFIGURE.md index ceedaeecd2..ff29eb9e2c 100644 --- a/account_invoice_import/readme/CONFIGURE.md +++ b/account_invoice_import/readme/CONFIGURE.md @@ -1,11 +1,9 @@ Go to the form view of the suppliers and configure it with the following parameters: -- Individual/Company: *Company* - the *VAT Number* (this field is used by default when searching the supplier in the Odoo partner database) -- in the *Accounting* tab, create one or several *Invoice Import - Configurations*. +- in the *Accounting* tab, set the *Invoice Import Configuration*. You can configure a mail gateway to import invoices from an email: diff --git a/account_invoice_import/readme/DESCRIPTION.md b/account_invoice_import/readme/DESCRIPTION.md index 08825ca6f6..daf813225e 100644 --- a/account_invoice_import/readme/DESCRIPTION.md +++ b/account_invoice_import/readme/DESCRIPTION.md @@ -22,35 +22,21 @@ two international standards exists to describe an Invoice in XML: developped by [OASIS](https://www.oasis-open.org/) (Organization for the Advancement of Structured Information Standards). -Some e-invoice standards such as -[Factur-X](http://fnfe-mpe.org/factur-x/) propose to embed the XML -description of the invoice inside the PDF invoice. Other people think -that the futur is pure-XML invoices: a European initiative called -[PEPPOL](https://peppol.eu/) aims at setting up an open network to -exchange e-invoices as UBL XML. We don't know yet which standard and -which practice will prevail on electronic invoicing in the future, but -we hope that lazy accountants won't have to manually encode their vendor -bills in the near future. This module is here to help achieve this goal! +The [Factur-X](http://fnfe-mpe.org/factur-x/) invoice standard embeds a CII XML +file inside the PDF invoice: this is the concept of hybrid invoice. -This module doesn't do anything useful by itself ; it requires other -modules to work: each modules adds a specific invoice format. +This module has native support for UBL XML, CII XML and Factur-X. You can install additional modules (for example account_invoice_import_simple_pdf) to support other invoice formats. Here is how the module works: - the user starts a wizard and uploads the PDF or XML invoice, - if it is an XML file, Odoo will parse it to create the invoice - (requires additional modules for specific XML formats, such as the - module *account_invoice_import_ubl* for the UBL format), - if it is a PDF file with an embedded XML file in Factur-X/CII format, Odoo will extract the embedded XML file and parse it to create the - invoice (requires the module *account_invoice_import_facturx*), -- otherwise, Odoo will use the *invoice2data* Python library to try to - interpret the text of the PDF (requires the module - *account_invoice_import_invoice2data*), -- if there is already some draft supplier invoice for this supplier, - Odoo will propose to select one to update or create a new draft invoice, -- otherwise, Odoo will directly create a new draft supplier invoice and - attach the PDF to it. +- if there is already a draft supplier invoice for this supplier with + the same invoice number, Odoo will display a warning, +- otherwise, Odoo will create a new draft vendor bill and + attach the PDF or XML invoice file to it. -This module also works with supplier refunds. +This module also works with vendor refunds. diff --git a/account_invoice_import/readme/USAGE.md b/account_invoice_import/readme/USAGE.md index fced72c7ba..3051f437d1 100644 --- a/account_invoice_import/readme/USAGE.md +++ b/account_invoice_import/readme/USAGE.md @@ -3,23 +3,4 @@ the instructions of the wizard. You can also start the wizard from the *Accounting Dashboard*: on the purchase journal, click on the *Upload* button. -This module also supports the scenario where you have a draft vendor -bill (generated from a purchase order for instance) and you have to -update it to comply with the real invoice sent by the vendor: on the -form view of the draft vendor bill, click on the button *Import Invoice -File* and follow the instructions of the wizard. - -If you have a large volume of invoices to import, you may be interested -by the script **mass_invoice_import.py** which is available in the -*scripts* subdirectory of this module. If you run: - -``` -./mass_invoice_import.py --help -``` - -you will have detailed instructions on how to use the script. - -A particular use case of this script is to have a directory where all -the invoices saved are automatically uploaded in Odoo. For that, have a -look at the sample script **inotify-sample.sh** available in the same -subdirectory. Edit this sample script to adapt it to your needs. +You can upload several invoice file at the same time. diff --git a/account_invoice_import/static/description/index.html b/account_invoice_import/static/description/index.html index 825ada584d..f86ba83005 100644 --- a/account_invoice_import/static/description/index.html +++ b/account_invoice_import/static/description/index.html @@ -390,44 +390,33 @@

Account Invoice Import

  • CII (Cross-Industry Invoice) developped by -UN/CEFACT (United Nations Centre for -Trade Facilitation and Electronic Business),
  • +UN/CEFACT (United Nations Centre +for Trade Facilitation and Electronic Business),
  • UBL (Universal Business Language) which is an ISO standard (ISO/IEC 19845) developped by OASIS (Organization for the Advancement of Structured Information Standards).
-

Some e-invoice standards such as -Factur-X propose to embed the XML -description of the invoice inside the PDF invoice. Other people think -that the futur is pure-XML invoices: a European initiative called -PEPPOL aims at setting up an open network to -exchange e-invoices as UBL XML. We don’t know yet which standard and -which practice will prevail on electronic invoicing in the future, but -we hope that lazy accountants won’t have to manually encode their vendor -bills in the near future. This module is here to help achieve this goal!

-

This module doesn’t do anything useful by itself ; it requires other -modules to work: each modules adds a specific invoice format.

+

The Factur-X invoice standard embeds +a CII XML file inside the PDF invoice: this is the concept of hybrid +invoice.

+

This module has native support for UBL XML, CII XML and Factur-X. You +can install additional modules (for example +account_invoice_import_simple_pdf) to support other invoice formats.

Here is how the module works:

  • the user starts a wizard and uploads the PDF or XML invoice,
  • -
  • if it is an XML file, Odoo will parse it to create the invoice -(requires additional modules for specific XML formats, such as the -module account_invoice_import_ubl for the UBL format),
  • +
  • if it is an XML file, Odoo will parse it to create the invoice
  • if it is a PDF file with an embedded XML file in Factur-X/CII format, Odoo will extract the embedded XML file and parse it to create the -invoice (requires the module account_invoice_import_facturx),
  • -
  • otherwise, Odoo will use the invoice2data Python library to try to -interpret the text of the PDF (requires the module -account_invoice_import_invoice2data),
  • -
  • if there is already some draft supplier invoice for this supplier, -Odoo will propose to select one to update or create a new draft invoice,
  • -
  • otherwise, Odoo will directly create a new draft supplier invoice and -attach the PDF to it.
  • +
  • if there is already a draft supplier invoice for this supplier with +the same invoice number, Odoo will display a warning,
  • +
  • otherwise, Odoo will create a new draft vendor bill and attach the +PDF or XML invoice file to it.
-

This module also works with supplier refunds.

+

This module also works with vendor refunds.

Table of contents

    @@ -448,25 +437,23 @@

    Configuration

    Go to the form view of the suppliers and configure it with the following parameters:

      -
    • Individual/Company: Company
    • the VAT Number (this field is used by default when searching the supplier in the Odoo partner database)
    • -
    • in the Accounting tab, create one or several Invoice Import -Configurations.
    • +
    • in the Accounting tab, set the Invoice Import Configuration.

    You can configure a mail gateway to import invoices from an email:

    • Go to the menu Settings > Technical > Email > Incoming Mail Servers -and setup the access (POP or IMAP) to the mailbox that will be used to -receive the invoices,
    • +and setup the access (POP or IMAP) to the mailbox that will be used +to receive the invoices,
    • In the section Actions to perform on incoming mails, set the field Create a new record to Wizard to import supplier invoices/refunds (model account.invoice.import).
    • If you are in a multi-company setup, you also have to go to the menu Invoicing > Configuration > Settings: in the section Invoice -Import, enter the email of the mailbox used to import invoices in the -field Mail Gateway: Destination E-mail (it will be used to import -the invoice in the proper company).
    • +Import, enter the email of the mailbox used to import invoices in +the field Mail Gateway: Destination E-mail (it will be used to +import the invoice in the proper company).
@@ -475,22 +462,7 @@

Usage

instructions of the wizard. You can also start the wizard from the Accounting Dashboard: on the purchase journal, click on the Upload button.

-

This module also supports the scenario where you have a draft vendor -bill (generated from a purchase order for instance) and you have to -update it to comply with the real invoice sent by the vendor: on the -form view of the draft vendor bill, click on the button Import Invoice -File and follow the instructions of the wizard.

-

If you have a large volume of invoices to import, you may be interested -by the script mass_invoice_import.py which is available in the -scripts subdirectory of this module. If you run:

-
-./mass_invoice_import.py --help
-
-

you will have detailed instructions on how to use the script.

-

A particular use case of this script is to have a directory where all -the invoices saved are automatically uploaded in Odoo. For that, have a -look at the sample script inotify-sample.sh available in the same -subdirectory. Edit this sample script to adapt it to your needs.

+

You can upload several invoice file at the same time.

Known issues / Roadmap

diff --git a/account_invoice_import/tests/__init__.py b/account_invoice_import/tests/__init__.py index d0a138175d..49b90faa42 100644 --- a/account_invoice_import/tests/__init__.py +++ b/account_invoice_import/tests/__init__.py @@ -1 +1,2 @@ -from . import test_invoice_import +# from . import test_invoice_import +from . import test_facturx diff --git a/account_invoice_import/tests/pdf/Facture_FR_BASICWL.pdf b/account_invoice_import/tests/pdf/Facture_FR_BASICWL.pdf new file mode 100644 index 0000000000000000000000000000000000000000..72dcaf7c7c17bd74c397de3a596621906a683c4c GIT binary patch literal 86615 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 (^%v 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
  • @aW55D4U|Lt0T)N9OTmHnZNG`u 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 v;xsfh68Qg7ffosuwl%Y(g2xt)TK?m^qS5M) literal 0 HcmV?d00001 diff --git a/account_invoice_import/tests/pdf/Facture_FR_EXTENDED.pdf b/account_invoice_import/tests/pdf/Facture_FR_EXTENDED.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e163f287919a9ebdcb5863b8143436ce39207619 GIT binary patch literal 92847 zcmeEv2UwF!(sZ6 zf|afy_e}x_>N(%}{^!5<|L%P*mXO`qo!Ob$*?D(o=VjMbQsDvfijc5RP4^FzfI<8q zxQ!EuloScyIhY*+WCjuhiu6GiBz%Ux?obe)F2n(fAmLMlquh`nFo}!|3DnIF-9%tt zQ!Tii5(Ehaol!F97ZniT2aEHIfWZQSU{PTKbADk#etvU)AyMrAoFse(C>tlJEfRD_ z1!9Xtc>)l^CLrwZP>_l|`a95vDEgD1AIuN31NycD?G}N-=nAkP2!=qQfN~pOkUR=x z19tDB$#GnUg0>H?lfX)B}2dLh~41>G<8%+NxIJAIwWv&bHgren&mN{C;Zb;xO z0tDVE_^ARUeELuX9OY>X1!~cv2fz)Go+w)+whIJ^pM*~fY6pWTzRe$ZXee^d1o9ig_)1}In18BuYty$!#e4Mfb=P7neWfk5nppyKud0wVmP zwgOOoPBf)xRYhXv0TSwiWD`*FadknLBLEpfTuG#4f$tzMs3!sthBOD5m!AU!b+d)r z!Q33AIgAWdc*HnlWk{qv5v~%7o^S+0-OUaKwDnbY^Mb={p&+2S8$!av4k^uw@^q6x zq5nc{p}_yPP_$M_0ICm>Kp-J*b`VcH2|X0V1!fO}qGuZfEgT6jKR@eEF93V~Sugrf z6ar%70+n}g@Ps-5b4vk*fVn}@)Y-#5T_H$dFv@O77}EDZ_lSSk{htQ9za!K?9j%d@ z$KQ?D2LY32bwncFCHVNfy}fz81$p6~4txTD$>1~5(loGjgt|g_U~Xvc*+N-mNI)Qr zAe4P<9U*QG02AT1C|5w=F>3FFL<68fAg&UsD3~1-FeOj}cc?9v;Rj(c$_Pb5J+X~; znyD+vprvRFb>oGiB%p3!5phAV1ln@2*}}2BbwjeDL9iBs#|I4ucITG>lnXGcP&+9; zG=3R7Oy2r+TmC zCll4t<{53F3}LR&Jw5@_m)I=?3$*6b&>HtTZVt2SFum;(}U0s3c1qGdUKuUsur3y54xdfzU z$cY{IZnJ#?`4z=qupCV-hSvrtcXtI3gOb<#jVC;Z)zG21#0AN(?pLK`f@7|2S z3u&B_lJ;b)Zr)>1J+QGOwQetscwENayq*k5Qi zfV#LqJpsC44sK98KqIwvj8p}LceL%d+MUtt3|JciD4aGN1=u#UoLxBNZEPUEz#1;h z?|{XMfjGc|za7`Xk)t_?8NEDUKY{VN{WgBIsn_)c4Ezp%c6bF8{2b;Et$ zF_P1UBL8dB*foBCmIjuLf7v+}Y)`-bT6_LN%ankX2yiice+mu*r~m_Ih#lY&U{-1n z$_)lAWOh(#Rz(qv8RZ2g85Z?H$lY%KimYGJ{RLG9P$b|`|3UdN60}A87a09Cg!t@Y z+_MjRi-obgA(o82lKl#SvD$!*bAWsLVpbaiEU@DKvR@nM1C>8X(1ijXD=@JH_yKlc zTmKnguNy4T&mMjs#6gB&>VGl=EnO|R8x#rg^ab2ZtTXi+128%ONAArIF)*+A4tc*; z{X*ED8vQ$Xv18h6x~G9Z$;MKMh1*@;{(d3CaN(bU?pm$?!kQ(3B?(ROu2ZyYfc_7! zS%6!~zbm7Ex@IZp%c~mz9>os-e_hgkiWaTum?cR8hOkA!fG02r$_L~LfdPIw0_~Ih zXD?fVyaGF8{5wPWzujK{Gcx`&?KN2V|J!R|$=J2m!o0h#-hZOG782WAP5!^R#w-Lo z1{!#3Lz}Yy1Lpd-Cjd1aO?hoa&3|rc)lk5;63C7Nj`prVZMnc>0^ml&pl)t}`@3h5 zcWm@dx4XLmn8o*(XP<*^0Y)#-4}1UZ&j?^~-ra}p|50oE59#=iGq;+C`oJ#3|2Ma2 z5B>iVa|`Sv?>bTcSJ~U2PZ4TRz!Z35%*Jm90c$ug&LP&WKs=GZKI~zf!vm)PzuTxC zH~XiX5A5x_=y*Cn++co~J>B0PLk{lH@T0fi#CLwg0C#uy>G!ASz3Y4b6C9XfDM9T4 z*B!f4f!;|2cD;V10#HH(+zm5AL%5qSNC{;Fhas@z+gG>eE$@ue5b6ST2aZ~xMsDcG zV+6!S5!lHC9)p2hj=h~V^dl$w2SW@{@9qL@+G?YKg9T3+E?|D+K0Zq_6&uX$4>pNXJ0SP?uE(3Gj#44#OWg2=L*C zJ@MkT_r#KoX?1|X7;671c5EkqD>KY!bm73Bx(imD?d&{(lY;{|(TgV<1ULu5?h=a$ z2@35zARH*)&(>YPLB|a$0~P>IiqKn!FgNV}9cGQjQinDGXqaEyDgwt97#-4rxIj?0 zZFhE;@x6-QTA;VwfTI{-w_AT#>boU-u-J;f8!(0=dlLfK?$C!iz<@KJ-?R_|ctEJe z@~i-EFnDj$VX^(qeEW;;vF)%v(eE|{gIEFOyJLWWvx`657cB_L3E(soI7>w#VIHVI z_(A_IHbzto`v<)ZEV#2P_%~zL{A)Xg8QI_J>kh&D?1(&Y6btP4dqP3Fz@9L2N5DUA z(4Of3ciI^dQ7qp7P&)(JIE;bzlEj$Kh)rehy$zFj%4>6qF-gZ zYfJ=%L7ph!VE{NQfPnPd3f)mQE+)M z&BXg#WAhjG}nO- zA=(KOQABy7ClU4#MA>M^TlrJv{>DFj67)XAPYQQ1YC(Zh=wD{z-Z6~ej=Q#3u+#C* zxb_8#$QZ*sF~>k41j-X+3%J-o9GC(G2;BfexnMvP77XIDGk<uTl~Yn9i&*ez2?}`e+MB(=$Hn3 z4E>Etbs)$Dh6J3Z-4p$NPaO*CifBUBl@wL<1;8dICRh@%#ebsf-$H}!Y_AE%4E(*Q ze^Fvgivx#r7yw0xi!I6p9bm9?fD0Dk6%@l_`>pQhD9}o~r!#+Zx`)A`071YIJKgU) z0oz}Eu;&8@e}8)zi0NNxC;VhLSY^l6{I&QXjz8}=|I_nBEQ5X;?_at5Uu3=ju;;hy zG5#u;gXI60m@h0OxVORbpUC}xcpC7Jn167p?ASs>sHf|%wonO*u=RwwW9GCVKRd8f z48dAAZV&?Q0=SC6ma!l|$O(&eKlDL~?5Nvr%+pWP2UxP-L!AB)3?=Y)!BCjZ4a`IS zU*N%#_pe8d(aeKjKkW#1`|5AbwK1)K-J25;5c&tl+8C1o@xkbw;l4BR{jCA}^jrNw zE&~wz8iQ_LB;m!#<5c>} zBLhJ=COFc%pI77Jh8|Q@;A}g)O5+d6`Wt`E@!tCM{YQ@S=cR-dLY!7+_q%XI&DXf} zC-|*w%%94>Mm5Ja%8vycx-=ieZbMEaH4ztx%-QCT-HgEBhCUAzYj4rs4r0fdU?=)P zvAV&sc>E|0IZjh|OF&DY!@5qA?KZfDLq?2STR?1TTU(u|qM4ilU%Hv}lAIJV5d=i8 z#=K1YdAo3GGkNOAJL9DK#w5Kia7(bf2X+0IiXZj3;2%FAUE3vF$$d?A+Y7!fLG`Z# zPetB2gyZB9xE(=>b5$S5OXtI4ak=xk`QlvrMbHM@cn=-8NaZ=22 zzQMQ8FBK9@ya(f$XkA`A3B>q_X@=ntwH&J&UKfb)#$};Iashd|P9kv-1ruS1oXi=Vuw3Fy zoW~PK#mF?|IL{oS&80RBX4EBpFDLDY;~>u_b|^zm&=I#Zm+XE>OfEk1a!)QPGK6`6 z^qZV)HObxJ1#8OJIEvN`u|a0mM_=RGS~I;STx%il!C}74`I%TVq{Es{3RkCv>FS~W z7SeJY%V6ctjPO#9O}mhwvG~llY0+ zTL`Wa7+9a}B^GQe;g{?sTxz~lj>An5(`r*rz)jfG`n8<31h2S-v7D}ibfGQ0{ICm= zS@ZL99v2G9)+gm$i?|nC#>!cka1OQQxr+e;Z~o%Wnt9}Q>pOS4OnjEGrAdW#f=eX4 z!99~2)kJqgj!&pmA9f4oYo?z(=T3i#@MFlK3HkNYQg{iiwx6Ya@UlZ$S_D5E_>c$S zHeF7isQN7FL->O@FubXCd{WEj_*k&_q(4Ed+{tocsmr0ciu|CflqJOE1frMePX>r}86K3_aY+1PLow76UO+@e+H7(zhO(OdwVWWo4xtj1*I1 zog!u>ON#1LnK}8DDlF3G5lrb=K8aq8Scs#N&`DFO50TnR^iw4HEFNSY_~2Lu<=B%S z*_c_GPuf%JP%TBKN3uUMdvx*9*(n;E6JJhLM6HLdhrCp5RXa)@a|*<%cJ|8QuIL%1 zub_=21vN%}JkGcj)w3s!k}}jz+>jY!fQ8>z8f86^sI4Y?gJbB>yM!YO;V0RWDmn@5 z1O&*gMfEB(E7GyXB(ZmT+6mty_oee?9*K5QwN&t8`<{s3dAt)c<2obei64T`?2k%DAAg)ctuUy2<;;Z?JPpE| z!9()z3S#x<&N!!>=%$*D{;IT*i>KRi$K6oqEOTnCh9Wf2Q*YxA>r+m{V?`uJ5fU*@ z3J>xmbkp_D>z>yOxdVCX`qbhn{!_N6+)m^x)DJ>URZ4SZ@*494@&odI5s>1jDkO9csGe{S2+hQl1KU))k^BL4*xm6Aqgb%jAwbkTLV=#+lYp0zK`|_9o(h45D zN}x${8b3LPvpKUl#riDx!PUyE_PvC??7g(TM!jUcJiTJ}cuT}f1WQayBujLamp5WJ z!bcu0TCY~9ag(2G)vw?-(dK3`X5flXZ9i*mRAFl3Uvl_4wQ~fjwbr(w0{5k^%TW>L ziv-t$`ySI-$5h;WdDcaGmFXevtKbjqtG0(K*j|Dc30A3A53h=Q9sW*U7jDti(nCdzG?V8E)qMC;JK=8o2>PN&w1j?5sNNGCsDx7*S6Df(JXQBQMRP^? z9c5S6j3UWt!- zI~fG7^(xJQmXcw1uzS=Ol3nCP*j`=9>av`{@njHByA+zK{Dgx(xu**?voz!7De4;} zrNqo8d#eA6RpNN!`7Wz2vl$DLD+;-~oGwQ#qluNH^VJ4(-x~Cud3e+znw~v~T05%X zhVDI1!W4s)vl{p}!-mw~-8`bN!by|Tk>cA;J&Qj}3Qhi+PA(sDyI`nd@XJutfch}! zAZ+N^z=eU4;hLe10m5PBLH0rDz=@k&x43Q>-*(QgQ}Yh{DDmdZ8~<8Zt#2)REp08T zmZ#Rj@2GTAc2ahTWsqg8WxQpoW%^j?Som1fSd2`f%w?HinK+q*9|Zo#{7?APY$<=^ zS`Jw*Sf*JPT<(82K2SCYAK1>vJDaAFcTd;%4yz$&5w%f_lhT8H=6pZht-{HtK2D6n z>846N1<&=a-#PKr@;%x66Ymw@)4V_TUSNf0<|rgR-5nBe6TNNB5C#yKetL??Bf;hkG(47IJ0sSQ~5Gp>R|5=(`YMN=|*>3sX zdZFp8IeyLSDpjwNy^1}rJ;WYn54AsGZ(uKJf8O3|j(^T)4mnrQ%WhWu@u9fjq z2#iCr?E>2CAJunn#`#7NwkX&^>?Uof?33*EAcIh_ZH0q}!xx7rYjwLWJ5Fm(NFi`H ztLBksDl~Lfrsqh{xioKXE0c#8Z~;5h-Q9Aw^X%iI-l8_AZl{j-Pu}-4wq$f>Jod|c zkn$k@LD-7G0?xvj1^nk6B{3yjCC5u7U5G_kj|(2BI3A}Jua(u8*caV*t?xQd3Qs&w z)(3`Hu!oEfPe0UtSnR^)LgP~DQub1&+_n5eIonJ1#oopGMVrO1iy4b5iz1767aJER z7o!$0EOw0ayzDQpy60UvbK=aznb|w@j+9AU6NPWU?YG(3=M>oRBlMylMS?lo) zq2j?j**nWUS288lG14;9?;Ep(J8$rW{fY3CoXm^nCcJ0qIns&Kxzi=mPo|TlbEUJK zKXqQdD<7^ceU>pn^#pcdrD9HwXH-sCm(m8uDMq2Tm872w)#P}R?UYR>6(yg z+nV9(rJ8d!3pKB*FIK}n$7i!AEhj7|e>~YrKh&l;J2^u&nKV5(0iLUv_Lx6B6E&$m zE8cFOwH$&j!}=1}Gw$&tvR%Hhe8v;tWjv68UDwK`^nZzXBP zGEO|M*eKpub;)Wy;0xOZ=jP(3!lu9`<7WG&*Jk!+%cjTXvCXhe+ReDltWEsQstuMe zO%vPA+i}}vIL1NpL8@|^a(Z&-n-!WbG@l3QPeeBB1rOt`;JM;8;I-jV5M&>&r!}Ep z=ZU1gK{IpoC~XS;Q#v7fyI*j(a91VfQKFrq z%RkIX@{Z&JNe%G^sq*2QB(tQchqGwkQ!-N4vI+6r2i<2~R&=zw3hHI$266M0@Vaoj z@GY`4oy|Ox$#qGiTDw}S`n-?Qdfw;y&ytg5lNMB&#L2`tkvAfXB9kJsB5$ijs$Eu# z?^I7RO)^fhOrlDPVC`2Pi@8KILi;#IAciDTBc>=OBT^!gnU0KJi%$BiDXX8#a{gPR zLCO5#{4%8%N>z^haSGG9QA0-^YlY5baPcJ4o$I+lJ6Htcxz9Yx|KX%-_GLr>Ox^py=yvCf*Pd(@HGH_9F(O%4YDOw@zQ7;x#om*W}omO2_ zU0L1a6YCT1ljQTjr_v{3y?kBq%ls6}qd+w|YP-YahxHCCAC^AseAqk6I*K5QDawG_ z;S{gN5w%$LUNvs@OGz)29;pdvd{x&t=cJaQA))b2UFF=Zb95TU=N_tACe^cxvv25o zYI&X`;Z){(%)@^2=2$g<@-%lDVL-sucAK?ek41vUkS1TqBX1b7941v~^s1a8|s z=|py#C)aQ-8QNc%yWZQ#t)6CKY-p_hT<*E{YPn0OOVOgo$k`FP5z7(15!i_GNdG-a zPZM!_ad{xLtw~`|d6ue`nw5&5N|Umb(v#B9wRUD) zKik++-}3yJ(a9qBJCTKVimu)fDur#(K$WIyT%1x@~(0p zvPUyVqes&uOtaK2)GXxR$i19#K{JjqqFH zH^b{xuBsHN}7@-rp(~04tr%ummi%{pCwVjon&5jrJ<@4m1mbjLDxN+i6 z){U$(i<@t5N$2|Oe6Lx}ScRX+B)=YiH9jN$T70qg9qnlCJnby)h$m!O>RIO{tdOh7 zuG-hNL$#x|&ub%41;|RI&O-L^hrxzY$>Q(YYqyy-64Z4}bkzGz`qlZ=_|(hf%2diM z;JTlJ$1ac2H(2=JlSyd2-x%Lm+E^738xS9GEg(4{=STIA%pcJ|`0z7v>w>F;YlFjr zBjiKn!&^8*R6>|T^g=F#coSU@cT}WP)KfH46jT&#<8KpcvuPu0<83nw7Yy$SmyOd^ z;a159IA*WnrUFrcsc^(SVMHB|W9(yW5F8a~XQ*Txj(rx#6Du9d7AqL1b38}zqcF2z zfPKBw<|_htD~uJE?`mT^VW4 z>^FSw7TYbsTRpd~+dB#x3xWkvg69PJDjh3bDg`R(DvRyc`Ybd2!LLMb3(kw42XZlZ zi%^K@fMp?L)?=;#uQm%eqBr2A^@O*>Qo`cHvchtdFDo}H$0-eDK5~3=3MRS}jVuZ$Y@|;Gs4XOZIJvE;9zjBpCH~akadBWXPbXrPsW4t4{%rhQ zyk$H%-Z%bP{E7Is_{w+|Chtr&?Rsqz?RIT9Z7S^%?OAR5OgAwtNghd8$?2?`ENB*4 zR#sM9reM~&EVHaKNgeSf)EKg*#=WMqnxR^(F0|IJI;Hl0t-1F#Pv3=mv(boI&s3B! z66HaL=tJ@#ToDbE5+A-jSxGA};>Xmeaw1f0{scpYO-^0FzeiwW0bB_S%$>74MmWV zOR|v5X8Ko8eSX~57LmhbDOtauwLdNky1((IZL*eo8RQT;rcRpo)a**vz7}0sH)A1?M zD$*+4s>Z5rynLLdNw`TmkSH*tDXpm?FflMAurToYw$}EsZKLfsI8H%oLH0owa@KOD za_Vx<&3!@Ff}RDvk#ov*%(c(;x7M}xvxZHCHRm;R1UmM1Jf9|{tEsq{*LnU^2PF^@^cXHR?AS= z(1JGcw%InVwuaW}Hqy4^ZHHQKw*t?tN&~8qN{%WoRYR5RR1B4nDzD>xm@BBF;%8!0 z5`^NUn66P?IO;3&)pQ0q6VdtRO!%3KGg)VD-}!v!^_`46AMe!Z#puZv93I>pJUjS& z5O=U}@aEu$LAF7}-~zalA)cXzA(^4%IqUu=IB-|vknfRE>j(wtJVaz#Ubz+=0P&5D> zz!jVVx|*A9olbcrF;zF!U3}85)uz>+6|BdvCq2juJ_Y8gI9tK>#cj%F%9xr{{fs(W z*GWzxPRYX4g_7?Ah8AvEb*0!P*_GOL%tX%A&wQI1n~CV^=?aYJXQGnK_kOgZww!dC zEl!mvUX$g57A_|@=MZN*rzPiM&c~cQoQj?x7z9=WL%|wg$*@nuUc=Xh*oVo6rH7`6b#92>rno74&Z=L|!QJ7EgNXxy zy`7z*Jrer5$0zHHWU@?hTH*C~8OM@+rIs$uSK z33shLk-lP<@ha&e$C}YcV`g?8Asx|vVZPI4{AHY{fTkgGIO(rUOZJ%}c#Y>B=ethXBbFNXd5!R>^pb_Bv@k}D+I^yb{v2IVH@{+S=EUwUj!Gk4I$=ST%iuD|^fHhn!TMPX2(L7}R3 zy>+VfVe4RPdf0X48P-A82G*+l_55UISLFg_QswI$XE+==mbI&M)WkgAKMJF%(y5oI zu+X&Pwsg^5ypU;VuK!w3%5t;TXZ}>1dRKBgM}y9-Om114sXw!E zL4)&VDr1UY+UeA^G_SNVE`PIcRk1fUANJ;R=K|7rSkmNDyJ#R@lv!oou&L{7xbfxd z+}EV9^t0D#Q%EXE+DOWx*=T2JEofNln^mM#8atXM)-I9U9pMEx#jagDj4-clpo zQ_tsTUyMEre=+w$uY&}d{10N21M0_t_rP-*a}AMJrK! z@%fg^(8#??3kQ}=3z(A7SD_+d36XXoI?;!s@uH2e*U}wc+Fvq1)OgVceuqfP^U)xxC@Y9BPAZml>U&(pf!m)lpz zQ(Ahfw8{11hXukZ!coFDQW^RozNeN9)t_fttGqnxOzJ%9tbpa$|NF{n%_3ov^gfwe9t0%pg z{q8xZ^i1Bz7H4aa8$)g9oYM!>33(UHSL-u9Yu*D-#3Mb&EpG5u@Fw$a-(9>Le)qZs zU+u%XYqhhruC;A-3Eowx1Qg#|5c5ao73TEp(CmBJAG1}ZbIK;lBF(||Qwa8@?rU5j z=d-Ow-a{8t7an{h`^2;8x^Uu?|BFLwUzTC3H7o3EM$0R!eao)P$=}((X?@54zVxks zZT!8}`|*Zu52KZ$;b-f`H_z9V$<%&>2Jy=s=V$)R(s|60iGkTi`13sDE8$e<_!m=m zQ_UA@MNl7lP_3v@)bs-G3q)B?os6gdyKf&s9l4{qOV+K{8xyH59U;d>J4H{yuZ|Pf zBn1}Cw!e&UN%uT|dA)t3gon)iDCp|VQVjqlA^T^mYuI{sBwilngj-8a{oDy7>6ZV7og zatD;SEOx)_eYxiG&EuNK^)H=YlBd(#IXaqNvyY`#I|qm^fBaJS!TZy=MO{P#hhP7? z5Hx~n0P*$HCTl|~8i?8*MH~DXWAdqU2&6AvzP7)pz0}FilhU?S(U2Z=3 zMM&%+GKz2(Zt0hSolCmk^XA)@BOI8?rOhu@i*`vD3cnM-CgW@G>FDX<36FNrxY+G{ z*0u=Z674 zT6*a_T0e5>?WMs>^P5jMU(6%>p*gRl6Z|b#>pyK&&No?>H|SoRTxDH(e2u=1&$21h z@@tcj&%5ofZ+jl5uUQ3{gSgdrO?Z@eGcDg<@VQqGxaq0gTmLu9u5) zjF|^4t@kBVX~I*-YwM-IKK%G$;MI$s&-W(o4SEiI{W2RrTR0o%{nVS}6Vo_*L$R;- z^qZ-RZyTB~wygz!A|123B)btXjlUAodZ>eeZ;v>hF_3 z+niWrK#78w#{6m1tVZlY>b_pjWdTPuD4YNG1# zrvdMlPp8Kfo9F{S{rIu`y^MuP_I}{{X6JX0$&NOb}FeL{Z(F78xP4IhCGaUSohGOsw&W9bLiXb(!$%a zRV#z0#x47ArQcpndq4j)H@+4aIF|QH@1@6>`Wx{&goDEh#g~L$mIzt(!1q65H+|RW zzn`Bf>l(n$M!|zMayxE*CA_4tG#QiYu&3vt8}X^jRTGE0@ee% z0=9qjY;6T@XNjG8B%82=z!AHFV+}qmha$si#l_Kmy$uLQ_Vw>^A)@<2E(}0?s)hzu zK>9v;@NPyp9Td_Xg;d96sUzXTeggupfsj!kTtwXt2(?8g>jDzyA@o%hKt3jSCFTD+w1Mg`702504#?rw`?VWR*E^I};?aFRkRyRBGrGmPJ8{`b@h zP}x1bazpT9rX(*A3X0ZmK&J%%N~eHo32cr4;Ib(;4=F~|e-{21bR4h{e)qMBSB}Z^htAz6&ciPPNX<|{ zPy#F}AuPbf&o6<#yZsB~{tkc)o-lh~bbRc;>R=z_e}Q#q)1!>evxrI7xj%E{Zzc|t zju8z8uoIi26Wth_QF4#{=$w%K}<%|C-PHc(bb+66o>B><$|p3X8tU zjHUV@%mJ$Z)RPy)1%;8bj3J=JzjX1l@?Z7?T%yP1U6Vmi1y48h9Uiox_Ndvb|Cc@O zx4!6cg5dTbq$3mr-O26?0=y^Cj-)|ohwK+j``iD9?Dr*LS1g$I`@c^p=&ADyVHlzP zM$wKNw8yBQJpWG=h`P41j=G}qFC+V(Ww|jno$@a<{lCC%LqP3;i>N?W%-x*PyOUwh z(xN8=*0}#N{{LB-01sK1EWN-@UQMVM^jB-}|B7(-J%9jCIxx;%`Rp01Jwc%#0slKh zgtcJ5tt;5BcNSOo9p7O8lJvXf!1HB!hkt!_J)<;5`UG)8)&nfY5-z-4*Pn1aLDF;sSR7?xvvqEX?he{n_)eCD=N% zKi;I-!-l;Av$MB?-DyF;6#~68gLx~&?)C==y-fn($Gjh6_XPszFMyK{+~+YuK;@A@ zx*tc(qxZhu70jyze#!bTBm@SwR{+8O?TwlTQeE+VrJPw;*xL8Mw2YF%p0c37wjdq$GJBpOSS_xR@!S74L|ZS zYnFTe$Ynz!)@KtGIE?Xc6-Ze7YiyP4t+n~Rpm4UOFRAc8N%5pQJN^x2UYHSy z*{Nz*1^o5ImXHwGXaqAJ@@ih6v%jS5>ly_OpHlcCfBII%%dh-3u0)WZ;BP;1-`FQ^ zV2;+ER?d*C+Mn?C<hBQthsEj{7K=gp1JiUreY5=(p}sViUJ#Kn`eUr7mD zsLP=k&zhM0{4t&7Q!4YD27zhU>hoSgYu$0~^Y6rCm%kbpU!?6Yi}-|(*Tx=Kg(Ee9 zB3}!7qnDGg{A$<{^>M>jlXfvuOFL4z*zcURsk2fpPosSa;WgK zjNjh=SSH%xEjrYD*MYC4{&CA?B)3DtKqfJ69IM{#jM2*~gC+A`APo-15AK)8w(4kv zg~xJLdbcbHqWtW9;q*jD?5pER3XV8NG%Fg|H(r#8RVhQ95FS;(pD56LGv}!7-7IF? zdTw(S8r!L3PfZ|(4ug0^1JU<$M~_tw*tzy43I_%7`}EKYP_|FI-bs%fH7VmAyDp?{ z8Yf-mI^H;_c=Tn+F_odOHFL+t2c!`3Q{~@I$C{MHe7eO6aYeAi+<%d9u@%~VWoI>WQoT&`cfU} z(eYKmxk!4S>uH+&BR8%OtEFFVIcpOobm!*y&?)oLg3#A=hdX6mx49L$DFgJEk4yKT2%}Yx5{h`aEe~@b;w1!xw{ZTdu0N-M1fkoU^jE zY@KgHsgzphUafK7_>8!oMym)^ui6q(;3gO6z5l-i4?x zYZ{pu-IL%et-O|Z7TIorrC1+iKihtY%zN$m^f|Q5=6l5SXxrho@b7Q4TpteOPv*T` z5i2-q1J|9GQ)ttq$hxsE!YNZK{#~=ASBgX_S|#%hJ_WUi>dT2*W}oavnyDM=7K9C6 z&l9EjgkKXh@HpiwX%VMHlogJcR2kn^UpzYOo;QrLe*GSqC=r*^XsKOD=j!yxFH-3E z+Y3CVw;Btd=UZs1XD$R}D7OhadOQi}{bo}Oqx%qRtYW7wJDA_-Je$`h^6a{M{Yb-| zHd8CkPE$kUQmEeCV)UXL$FuxZac(#Pml@u1)%f~E$(Ga6?`$5Z@!UQd-M9KoU-S*t zk2I%3wx;sS&niads>Azy*Ef24UX<~n?&n`9KMfL$5DJqwrBCQV5uYt=7K6B_r5{La!RBHngm&_Z{Q>q#5s8;I``$^aouNHJ`T8X*(I|0+oJIjmTggwQd+RpI0 zo~9k{67U#yd4DU$O1Vvi{29~4Va9WkJ?T2C-88D7VSf1_F<63N!7b=Z+mNBr)8gv2D_b z@TZc3g*V#M%e$g~uvWtI-AGImwN^Rj2iR%hL|`sslaX>7uFR2pQ=vv&k3&Q=#POdz z%HS3kaaQSC?tiY&#rR!nGb;arimE#AE1~3@K|R4Dhc*p0lHF?j20J)LILj%n)GL5} zravUEI72qX-`_cc_=Y=mGw%$fvn(p)bmjfzKu>$^Pz_`9m^_zu1?@=JPOo`iH;@xg zDC-k9NZOlFcBd;fX6I!r`_lVLX4wx{(q;v%1k22o9e)2rsKn*s76>(ZUBFCyikzG} z-Ptj<)T+6xZzwbKny{q!Se$z1SGS@pmpfPJI6f}ck92|Otd(vp8}M9@!)>y8Q26o5 z^{hLK)e4hmVP5&qCD_#weHjejHI_yyF-v*j;z7oe$RbJ{ko2?mUV7jjdLL~T-kFcv{m<1Fpk6U5CIAKF?P zzY(ITin)`vgCm%?OS*b8FpG+tI=R8j+N{Lt#`C~! zny(Yu8*PCT@5%;VH7&8qhCD7#5Y29omG&3g#IL2Wx-?DOV*(wuS}i^+E|dKv54 zqSoPIUa3@NE-C2`Ez`tQ0ne)mwPPr_r1+FyyUHz4IOAK!Rlf+Lr%faBjheK?XSz{L zwhkM!&LbUf+WuhhMAWj;FwAkTTQ0Iy`I5c>i}Sbir6b+iTD*DOT)bp`DTT0^o)mVH zrwqJL*Y&xt=FPo&?hT{5NZF7)Y~r~(TIw;MWbo0>{=$4w&13fbg}FPk`O+zeX|^(k zqhH!QWO>rCD#&a1@v5n+V;ZsDV*Ymo?u)hP5Eqw4C;@N5q@oj9Uh57{d~`PDkgms7?K`~bhcm0Dwuk>I$=duQ=bYQ_MrxV-`0`~dg2I`%vqjLy zT4*xBG>R^YOnY_(l3~tLCRwMoMov#LLag4e%$C-4@q+na-H8gKAIG7L;-9##Dha-2 zYOlkCA8+a95>uL#DLpUBuQK_b#oIopie!WKJ@rgR>B3KVYrcp?oX^0p_`{mIKTg3MEK~1XFA>&VT@fvje zK*^q6ch{W*tt-tJV@>YremiBxVC*Mq*3_X< zmR(dd?Qkxx_-bYAboc6a(g!kK%7luDM&{3h42csyc?3PHVGjc0-U)1^ejr)cBxws{ zsxU$O`fEmgflmf)FXV>3a*6fmD{6CIpGm!Scr9Lom^VB=yNdG>R9ul7~HtA{-8p3>K*msbrAfKUc^3O|#%k z@@v+)qX}s$<_V_A{E4)iV9_@Uq9TKNjMIeXJQ1UD=a8kRRRrF>8j)hu(hNIQW|nsR zj{FIw*Z2XC{Vv{BU&%-#+&(CZPA;Gsua?nze0~pF&&~!m6>{i!NsfTn|=yfMH8F%$3gFpZEfDy z(e8@0@AGbYkWRFD|5ffKi}R?B%Vt6*YHfA><70vAXRqFD*XAwqX6SV^W)TzS72@P- z?ZJCvHoS7Jk~&G*BVS=zCR@Ajs$RvYQIDC}+hWPWz)uD>jC<5tO3xnV%bLBpFRk^E5ZzlPt0O3#$Ugv-nPJ@MaWNv_)v|4jI#2%40 zs{^^gWc)J4u7{J-bnLMG%BAxRTN?S+S~7SJ^RI(=13K&A_l~L&yizC09y27F$r8Un zB9daxLHPC7b#6j4b7xMm+aP$uEj(er_h0Xu$=_1WrOnRvn)J62sV0@0IPFd}_e$DY z>8>EMF((+lO4e{G_sD zm6YE2#7p{#7gq-C0r!L6i-YgpFN-;|sG6-+y?FAXBTXzvN7K|Lptnxnm+Q*4pcC!J z6xVg)9lCNoP+y#UN0T`*dMthAzEytxXjEN-o^TogO~HL3OsyM2D;G{F>B@us64B`8HpVNBcCqfychDaiZyu z$ZP0)_{u`~;h0CPPv51^1^>5?9=zGWc^vp8q?xCj|H=lzo3sLIrst#PomFH3q3=ox z`AcCmscu3Vn1Oxjh@v7KrPGYU%xbj|uYv$K5>`6CLc! zIMFXwRCg5y0Wa1>Z|ng3Kzu4d=0p&9CrJu$qG1c9g#q@0_<-X;5Fh$D0|c}HwtN(K zKGks{H*9ys6aMn0HYWQpBfbA;E2WzWLnvY z!4c&b1U88j;Vy7b1N1>6kQoN*1-wxUi1Z=hI}fu%zdcfTFG^=;RQq1wh@o^}n9lag z?Fk%84Hb1299&#n97*60&h{%DMI3xQJoI1ShXD9XNK8mbKtM=x=nxU{5t1WENJ&UZ z$;hcG$;he5Nl7W`D5+?U($dl%p`d4=JIX+Pl=djP6I^_t4FTa{Lc+sG$w ztvFP~I0-mu__(Y%cvQIfRJhxZa8BUh;^5%}e8~Zw@PqS2c>V{3hAMJaKpCC z4``^o60r7op-GYSvDbI5YFI|8T80t$QpeGI*PKsZ^vxPGeerT-K>gJ=PXB_2f;A5A z(p%P|L2uaQ5vRiQF)~)_&utPUZhPE)L~}R!T@FF-mXn$$(5rYB`$dZ%-UbvD>B{CA zwtU6`Ysc6=zxv?IqjNDvw<67g)O<6$a@Q@X3Cjk z!Y+I$^^FmkuXi!GifKUYdXg(SLS{EQrUJ0Hd zbl4KjDNYZ_HkVc(CDH{r5FtuNW5#a!;p_%ne$aM)vk-34za#@ZIS)JX$`&qt^M8j5 z4I-cqKkc_+Di(P?$I>?*@3b+TDInIPXC}rQdTrKk-e#$mxzZ>mVK{pAV_?n}X{vXl z-l7M6o@%J8fD6KNgRwOI1MQbfYlk;o>JPu6TR3g-g2gLfsyOCMeI6waTAF8o4?-L~ zoI~gj%nu+(K$B1C%7)(l*+*ZEG6Sw%t8#d)l^b+qS1| zP22XgZQK64-}k)dJO91sTX(HnYh_ht)vLUk?5x6^g4?1Y_apW0{S0AP`i- z%a(->kD4T|k7*l}o^xET4gK9k@SJ&^$d<4<0V?YxWLgXNhT~kA7TxX=^ui&8_wH(9 zCU9K~-Iw{kQWG1R+54iy@n|S_p~PLLTlMtXkZ=nSC1lv! zcyg~^Bx<278$(UR=H0PDiWXN(L%M|enAH?jocYVTW@I1a-a#3#q*|ONZV`+Uj2#QK zZ_!tWJ0~563k&0rsS!g0Ye&_k(@+K_DnT_|NQAW!LZL#nFEY9InO|tRpflI4qpUjk zj*{Zkl5YI{to)JVnYi`)dK(J}>lVW!gKLL%ZL-%&V1#yPxJz5ZN<6x_aeWd~@6E(2K?EGpbFQmRZb zYvOND4qJ>xrkRePM$K2E(Je44ON)mbn#h>q?TSoQcra(>?Ij)dWv&<+_`F*35m@5p z>Pq0)&PF>j*8Dt^rj$&=c(#DJU-}UP6`#p3WLc_GQ<iAzmO5iA=C4NA_&By5ZV3(4Co8k zy-~e#N5rz4HLD@4h}!Q!v#Jzs6;n`3|5R4!zNUy63>fII_CRIk9p7Q0md=gkZAx(JfX7%?(PYxK(xyd(P) zj3~k<7+?S}PzW$^(9c2q^ELqi1AricA|Vsf>k={W%h@8J5Yq|B`%a@0FxGT$fsrWa z*~Qh8G70)!^6A_A$HwROT>Wcg1mgvI&KEsY?LXVM(ZCvEhkL%^>__`8>=_04%6?rQ zT{UZy-_;C(eJ_jmMF)Xbi^Zw!Gh@Zx2?T#>)R%2ZXEp3 zy-!!<0~Ky|jZ*(+j}prY1toCg<-xYOhN7ro%R8W2VnmT_f_lQ{+B5G4%k4%l?XoXq$b>qCN5#Kn1nU3U zac~yDSMUN)6gPH>EU5_9<8`Ux7Ef3{KC$EkD7kR3VUbH30bRS=lh;^1UT3Mwi<2gJ zXC}RSjnIWnHRKY15GFw&h$6vIQh!DlFfwm}%OAxzCcLRAZ%!6tI~qQ>L-jq*+%;5` zOEO{u%8|erYoc$2ouGp_Klo|gXm2KF9L*V8(THt$ah%~jA5qFm3-iZK7-c-)$TDMy zb8yv+8~vH5iX<7hkOG4T_&`InuW5ptWNkH2$E~=zB|#YJ{yu({Vi3)up2@Q9-ot&I z=d6($*XlRDrIMk-B4bBY&TpAhy66~12qD$O#DkvXR@8!9npHh>*JMp% zyAOafPPOhjc*T4rVDSvsI3KgGOJ1{c%>JO zCcG&4zU!)@`X?ii4IJ1rk3djaRFO?^L+;FQ@Yc;4C()-r$w+ahzf_Yp+MY<$?HM9R z1uXMc$L)_uQf#c@6d#ruxbW(_I^AANn4FUA>#*~ic_xWRd_fSL{n+qj%>mTo?rc*>7XQabQVoxHjFM8 zarTwLaRYM-Sw0WU?Vf1TaQ$V_E0LehsoMTa+9gV}ge8g*x$zh+5k{Eo5Ar4?ruc=w5a6;eXMSq?+IsiV zqK4m;sDu zVxZjimoQGdcv-63^ooP%le6c$SQ=8EiJ_W`wl8r<+KciCtBDia5#k_wVQ99=5=oOQ zIkN*Kz$RkW>+E6Kuf7iJX#=Y{&hFfr&bexucx^rI9`FW9aIp-e5w#iyl93@)ynp6m=W*_o7DDm8j| zCpwiHnlnED)^YhC7xHTSm`~-)r8rDo)C_Qyn||`b%tu8nk%$qq-DZfB)$E2CyAJcP z=P^olyowH6!lpwSg=E^X(GG;C2Grr-4P=jznK(8fRkW1R6dGthHFQc!d;qwXshXMs zegK5cl`mV_csm)RX0t?ZQoYoBk7}>wy{lsfouigt=Ciu0&n*_Q)97MPn z?G{cZwDyWKy-YR%(alRk2&~azdBy+j-1At{kWt%K))!%~F`mtN#t%}=vNt#^aKvQl zKJ!>{Q^-4&C5Ob|8JG;HvfCij!$FxdU=z&tI!D1Jd5qN*OIoCI-o)4%hpAMTHoFak z^&14p%I|a8`^vze$qdfv&Tp3)Tq-Q4tHE($G)L85_}Gdg6Ies^ZZ4C|NyUpgKUHSShy6wLV^?SUXRc1~HowMtRT9u2XjI~{XoH-G z?67dIM%nJVxtx0s(L$Q+EM9^HYA{h?K9UKuE)U*11q$Gnrvi4;%8z zSH|&YPr(N)33QPH!bG(M9ECvDE>0alY&}k-TRLPuk&aZWh%uYgk0o;oKzFWvp!7mCl(cKR#h0ud@G9qp2p!X8i;Q;_1oZrJy0)m;dHe2#=jY z&^QjwW7vv4746i@)jE^ge#fPv=UX{D9=Ox?fR6<@y<v^5`5)KC~)KBuyB2 zQRpVoBpC8U;OC4*AGDQeqH9}}^*3NfQ;f~HIgUfGmLkMNt1^)Z7CUau5vEzbx?C&b zn9?&l4X{Lg|4^?H^W(bU%ygI_KPB)tJS2DqQ(nPcfIN$b!bb5cMuhOASwD=D#j2Y~t_o`E;G~#+TJBp`rr}7!I13rv=@h0)2mQ^WMDmfx)zq<;jsRbU;(yT)Zv*7xb=K2l=<+$@J-zfL1ULa2`)9huGK z^cW3Rw3ALcnADd*P)|pmzHdS)UCizQ!Fq@E3MB%13iuaswTjaEkJvu79Ks-4b}Bx< z74FQ&JrE2O0xz$L>SCpct44*8yPOPsd9rD{kd*1A{$EuoX~?A*s(_-8E0N zH9k2(5Pk$habpv;+$Q+}Ara&$EzCF}0Rb)k1+5IjB#&ZS#^AUBF9buNWdnSD{?OCC zBl)9Xgk{JD4-H~!KglSFh(6WX#O21uEz(dG57c17rf!$_Mg#OIC_lE>trG|jO+X^H z2oVS%Xruy>Xy~{rrXmj2hFn30um6GoQkg6b~wV8*JgD0ReGw7S|9xy z9)**|br_z@qz!;7k!tN)ZX!N;(znprZ7<0TsoJ$}1O$0%16@ZIV$HE*q62KrAVZ^M z9vp-nZic!Q6hd{Q#3+dTzG3|6rK>=@BO#waAb{095EH&ygln8(#7JR2p)xMNS>g;z zMWSNj_lW2pfmPP%zLhr1s`OoO5USwTB{)H==Q|$^Dsyx#1jHAT(ha{QN%%b zm;}!qnJXCj5-k8|l6{nHZoE3zf~YAW@*eG3qqCg^&HkZ%PN-`5!M2`EmUpi1EH&YrUNpaf(E1iaMm9Y)o(2T@v=sV0#F z5|SX3WSf#8klO{gA1%*zKX ziHPY@GrCAm-{*k0}BEDXSzuO24=d?9X2`wCN_poE9Jl3 z=f4b{P_&;ZMhyQldD05xS1{Qu;Z_^ZgjMgHtvK)~ANQ%)K-Mm7Q(My5}|?CkUe z>9VYNq{C@=f z#NuFRsZ7B3d8PR6^}lL;cKB%p{){Cs)#tY|{#+d4%jBwS^DlGk*SG(H;j71gF#O9% z%kY`$^|ROi;>rInGcG*=Jv}2G+ke<$T{6zp-7ORrFh3?dpHazKuNWs!*g}z!GWu+B z1ZKF>bRcMv!A*!v7zgPW&Gf(rLvwyKCC!uz%NAASl}7+tvKj*YVURVM|6!;_Zb{)O z=4ml!qS8CJ?M$HY@#JIP4i{CY60&j0T!EUcl zLcC#^(dNff49nW1A5X7SEq)KR2b>li;q-M zNM8cnH*FYoTf*T9%9z5;Uc`H<9Ru?zEG#qZ5kLFE>K2LV-)Ck>IKMA;;?P%9ba`FB*Mcrd@?%$UXMvKZnVv)75E zL1w|?IhYc&a=TR3C9tYAuY%;~FmjC0Gq6xu-ytF&GyWng3{yHfA;$EiVR8Ikxn7T9 zg9wZFZjdybP=VNYD5mvN&q_2dX1XtmENYo~}t|5>NX$*n5q%<12q&UdboEgA1Fsa%VM`D9NBVsFkK>6dJkn7*hW_ zI{m3o{mOm4hu()pS%w+9>>{14w9-29v(B(|xLQr0x;i;zDfmGmJ5(>VQLoU-e>@Mq z@YsY?7x?53FiG$2`Fby7@LX+B0c$jE;{JMdPLfC8(>2(%VaZ^Ha5rI>;|I3Ix*%r* zG$7ezbIpYce&TaGvq)rJYvp}b@ce6epLxOw6`$<2xnBnU?U1D`5UMON>=evdHPAdC z!m}d+va14%32!TN*+l?J2#Ve6&dA%lV_aO9jQ;)!|8C1DoBj3O|v0u49F3>es z>If*vvM(5TscMUJd^D3@QFS_3RWe!} z`1y{}v-j#Yw^vQBq1z^kV+`~}R-QL;#m+fr49VEtVWNs&D{!B?9m~)(tvHqRIGA^E zSSS^AD;!B7C^vg=EG;STeIAw!?n9%b#03s#AYftdgY66lw{9Fsn1BDz+}Eaqm@LBW z(ETOW)|ujAkm0cM-_M9o&okKSaqmF~-?*ncY)#wi_s&M!+Z+n^w&${R^>kL!Wh~Cp zWK`nlHr$`i(2kN9#SDLOER2b`1r<`wtVhqx8XQ)Pw#!r=%x>t!G*NJO{)Brup9`Pi zIXclj>S}qatRM%VLQRO8c4ucq@rN$0(UY12YOjU_+w_9q2hmfl!=(dk-PCnK!3!qW z<>jht_F^vvMz_k}yi>F7HM!iBPedme2k5Qheh+9%aB&xv@^QZ%6u;*U{I=HdO@JvLqD($fAhKUq0+wCTU$e^ zrX`rxvdA=uP;|xbh}f+?NK@t`@c6)P);q^h@nv;&m6r=FSZ(Gu*+6NZttnQtDANAv zX7_M4QqAshL!I;Ica*U#ZixYh2YYqoI=SRx#Iqoa^u6(AU2Q?`^o<*U9T$gEC5=iN z3ss}p`zCI|dUb2vwrZj^e$)cqs{CViLheapZr0CqvTS1b45lZlJL>c=%k1W;tt!>5 zTD+g?z|+;BH$2EtQf_V)7}$4MxHxbya5-B@$9ByAXa)fb8#*)y*>Y+0=_8;HYOOjr zf*ZWp#^)=+g{%zhF{?K)zIfN{{Wp{Q@TPXHx@NO!WD4QHw?~uTFO4cTLt0h4)zmz7 zbjuGX_D}0S-=_t**&?O0QN*MPmDZ!yH=#Txf)j@R@lQX z5_vHjx4E&rxi(-=-RY^D5VRB-f^TI|2fFN<&52FXbWr47@q19kG0v1Y*=+`iJ(#8KOAUSeBZD6ts#L=nmp*^*Q^H{{yiaBhnEwo-Tv71{P>P$@r;k|;jk&Xqn7 zEoGa*nEw0>G$+h{F6nW+1ag$$ax=-de#Y*S;w`+SmfTbd#GXD-(p<9DoYfWUqN}t* zd>z`3>G4$Sdt(O_x8RgR7O4^&AQHg;A)YYE;6?LGEtF-+*_}*;^%^n(DQphdQ8t=W z9RD0EpDy4TaaF?auod^sAggWEskk1KJ0627X;`YSIOK(Md+l53A3T8e>{0 z@_;rD;U9QoE~3qKl;}X@Uc~9_km7-U%g};FO!z^ftAs^#>45?H9h&VCF`^c3A}4aP zI7k$3$2%#{R*_&N;#?hrmp(Cy60sk3>~T2Jq}zIRFG<-mAvL!2Sz@7twoGv_qJmdj zi!OZ?%7FS$a@hPHA6n)8c;9ZLcdQ|wtkB=^$HcVQD!H(UAzaDO9Ye=XR})w_Q|!(W zg~=%~L!1q0^f>*fBVzYfkyQZ^S@g8ovs=R(ldB)$`4-Xn3a2sXeEV@RkcZCNd&{{Qe8I*6B$1@3 zq@?^?6BTuD&(KiX*tDdVFpQM6zh785Fc1{<>B*^e+^9jF+Nf?gAvrmn3WA+|X-Pz1 zIjK8m;lx3mrgw@-7;%+!_&s?za!^I6_2VI%5$7cMm=O!Fs#pz;x!4u2>XLTGK6~)L z=;UAe>i z?XZPqcjqw(lWrVju)YS?L=a|Sj@n0KJ;AtUKOAtGVXqfan}u`h@0|lh+yL*dgw(bX z_O?PZB}PAr>ic?Z*>hzHcJOocdrYCHOun|Znn%8Gy+|cF?Xx`w#{Ve8!t!?+cJ{x^ zf7WODJonYcSDkKjAh9rG{ z2L2=tHf;1md=f)Jt8=PGNQ zNIg#1`>yL3(H9SIeffMTPA2X*bucf-wArUGt3dD0P=h09>Cs{EP zD!Rigr!0bjvi4h}Af}ZBzKk_Cv}5akgVy$c@o4sTmohdV9k!~3&sDPt=a_G_IE|z3 zobK{OUmeAzG0%@&XN2#1a|#F>Y2|Qt^Y*<)g0OsqthhLia@ylEaDzDK6&R`o8=>qdFz$72^ z?tMp$BT_ECcFNPOtE%NITkXCat66quB=lmebX_ZyivPBr@xLo2Am7f*)E-&*oC@Y#Ke z>X6Ik5*shyjtTxUIfvpoSG7TOJ+#~T>0BlKL5w@+IpBlsuo zp@>Npl2ZP0A9N@*1^n8uHF}f;_*DBL#5{>Q@)-rLVU8t9h70QzAXKi%E$%JKCCY&4 zlNyCjrEpUYculf9XwJ*Dvm6e#7&5Dt3!YnAWKtenJ)ota`?UFD&`IDKfWf z2!EYBI_+ozJ#^1$0>K^W6|~OpE&LHVp$nZAuyU!-79_JN6C%VgyvBqi)au4)3>z-pgfUoxiKMHsO@n&lekn=H;_DJf+R*SmGyU4NS zm;5RJ<6z2zWQ}4y|Gpr$K4iU3v5pqqAKc~Cpd-HEOVSaE2j1$9<#355c5B>q1?hlR zzu60z0qdc%sjeA(uuXNT#1>}Vr*Xx4>HmoM%JvQz0WiQPw8<@5I!rVpkhg18o46{R z6*Q@PP3fA9LtgA_&x*d=vkGFx(iG7ecj7~TYnR@V&R_dr=ib8F+|;bFD!OVqm6k4Z z@bY-_82q^QI{TX5v)7~k$n~9z76)}5to~N z#`5=!up1wH*S02tpDF%F2DG-98keRNV!d1py+ge@!NPP@@7PMVwo~Du^T5{9+k0mT z^7)taIT!t+vY79P%Xx%2E_&}ESbd#Dm%%RZ&j_cU#J}OS!`-LiADOZuss{I5pxx4&n}r{Z6jNO?E>(N#t}sDx zak~E!T&$|P6D7GY*(&HM0F`ObfTFY=g`A9)k?BcZ z5|mEG6HY-~k5WHnkw_(P#LvT3L^i7ZCvrmYRV^qiz=jgCMS^}YCRcLz3Z?}J+ov0? zYfy28NYs{*t4O(%=Sm~yIP=u1SG$#)jhmuMO!WQ9Ex<8gSc|{bON~3F5rFMvN?SHT z1!79rlOHpq-ntI#9>IX&xQQBOnf4T2J{c*33H4C))=@<_Dm_XD8e=dfRNBPvP}8D8 zq4~&FX;J_4n1=)WHK&7W&qU+Z zmcSL3-r4W7E0!ybBQ^QZSOW`ShYdA|%K++eN-J#@Xums<15}&Dg4TyZNRQ@HTRi}_s zveqWYaT7eHL!0eO+;26@oY=YumM(UH0U(OYKpr}QsMGbukWuD+y7GmKv0a1g1;|fq zB0nocLXgkZa0HM*lJIsRH71mz6esF3Dl$0bLrVb~HGM_{wtbj&#{Hm!`k(#AaNBbr z4jD;qM32tl@55fltBYf0o8${oT_R&hN0#-@ZkFNeJz||&lS~>ycIqI=kY>V^(w-2A zXm))hw&U;m-SQ4dG3Ph+AQ*#(aRq-vhI8rakocp~7WH^V)jt{)_=m%Y1~`o-9E~PTq9=k$yN^1ZDbtBO^hr zq^{1(^r?$d>UQ3(3Zmk=5^fFaIp`t1L#spZ8}I!aNq^2XM&|d(g~W(iY zl#O|Vk_{OG`w&i* zxq#G(&3#{JA?f$zc>Cs6Us)##jeJO>fDs~O@+6snJ5H3bDV<1>KWw;_Ge{I^szLdo zmy;VVPR&sg!(ktC)`%@?8oIIUZ_8dl3HDsbB@m$V#9)a;J^Fcr3Wn-X1Wsfwv-AQO#6N^rjeYN_~EwjVZ) z_<`ByS4__tSv57ZRz6r<^YG!(wduL`-$0MHW<@jOoAWk$pK?{z$kfW%P1KCr&beX1 zo`KocR;((WZ?QmNk7)#Ij5oPIEIPHqEy4XJL7wIR5wH(#5fxJMM@*va2r((W0&zz- zWW_OuFkLAcg-;l2Gk4}JC$tyC2u^X>3UO8*hfi1p3Iq5?YH?Qr5g4wjim)W3rT9Q? zf_a=9m*;a)qS8-~mQ0Y$hz!_Z!faVd(#}dqXhKSDvgOb{phT`(b%aCzY=n>a5=XC> zJB`W;?Y+LJ%cTY0s1L|i>CQ*OrviiNZTAPBhr`57VO|f!JPW*VHgnd*Ox`QR7L`Y| zp>s!46%huwW4rNqDSOFCqv;bNyoo&_tMoPBHJ0rzJZU7yyl%#b8aW7`GBJl>k}9pK!6?bST*IzV9~D*ebI-aon>v8;N%6x9+6u zLZ&|QTBMdKB2swfo0Xf$LB!Q z_Rwcz-g|4C0c9jxjox6pns?r5^7l9gT2TjSB}aEtwAI$tvRosyi5n;@AxWI)kT>QQ z7GlILOn>;Dl?oUO`Si8o!NvM^@h<9BA z?(Xm$Q&6a6)P*~>&8S{}_q&WT6=L2oSjieMjwV z&f~^LVFY`sR{&2EF)}y&emZiG0A~jG3Jz*w1hM10;DFp$_Nq2aMGN|*3N0r0mU+F9$V9gLYWtl;%w(>T*^vx?gI zMehZn90_&B-Q9u)`D|Q2qVh-b3(~iMpd*4Sg*JD3BbA6{y&;x-AiJvNi~xp6k+qLGdpBJAkR?Tnb8TScsE(`f~>Yx<(|N zQupWxE|{vOA;HW8*9=Pkc-9_1(w(;J2lYP+-{T~hzoK9_ySSw7# zP|o_J^@dBU1BEI|%6e_phg*Yit1sq@s=+(FQM}G?xOJClCykQX>w-JLSmfOBHQ^x+ z&ASLl$b+aQZA5v)zTsj@1bYd>Oi-Ge=gso?LqQzPyLntZGDFj-m}I$jxg$2Pzk`HY zlmyb98qSF)xJ3O!m3uOz<6Pu=5LQFr0)!&_ZfbLEA^b$j6g*579P6RmX=(CCiExUy z3Uy!0^=3kZHeDm?!J1aU3FX4`9`v0e7Ngm@BpFbLX}9!Bw25YP;~=Rd!ik1~(Au8M zG~)5>&qE$GXE|hJjSbc#Ovdp=aQjzhb3n*;M=At#T~6+3t!ZwjBm)XPPey6|$4>Oz zQgn{S=IlZrbCMQtrTh4q(C^J3#czud(Fls3Z3w!$!NE^)$hq)8bU%i=rLI(lP&8v7 zmZ@BMbg^SarF~#kb}9-oVfcj9^FYFCfZ{uGG9m-xTlAt1%s`;?2nmAQUXjfY z38Y!Z8(woEQ8TU5WG%qSm8I-1l}{tH^Snw?^rZc5PztwlYF~X02tX{Wu6XZpK69Dl z-Ix{^OUh(sHU4>l@a{CG?W9sFyBektRX9)YmwAwUkbW>_USIDbX8Njz;e`tV1C9?l=#BWA%GI30@co3SROIbq4p1ri3?m|7Y`e% zy!v)PX=xFe1*~L!4Mc>nq27F-WC%(I9K?i67e|NOqa%3V!k08_Bc2c9!W8kCAJ`CD2FGt%K93fYy$wm0)YP`d}!rFFY^_p!% zQ{h}Fyq`?QxOM0+GnhP>4u9TNclG`C%%78|@@E?h94{@!T=;?yWITE)e?zoCVK5&U zl6tAwLR?iWCxobr>S0h)Z#fQ`3U7WQNCXTLhaWbdQ3}&H5x^_2pZoe;lkSeeS5{m; zB2C;5=mU+M#_7^3Q;E3qY>}!g^mT0s(ET#puSVcx{p3%Z_n4t$D%OQJTTm(Rc)I8_ z`5N$qJhlR<0Ei{h7qc?^O(c=&Ud(k?4hN#=}C#4(JXTdy1xWMq1;Rzn_kZVB{ywjycdfUMXJc zrqoEo5}x~vD|>-H^aRuz;EZ`*I*qubIiJ;KKf=&43)bb+VKQ7%`a zEMhT7{uWu0Uyzs4Kla}ioN*OD{&68g9^Vq8Tg$ke**k}^&t~2RFOCGu2oBmFE&Lhu zWB?|2xY|Od4>3#EYa!C%K4bfv6kt?Wa4#jZoD)3Crr;W$0#p0f^z84VBiOJSt=UTR zrV6`?>-u7|G%VoZ7$}QDFhsCZA6zRlj^WV0ras=X_0H4ON8>AWaO=KxL=CxdN1CR! zHn+Wb(JG6+rRx2Z>IWXZmZ^q^>nQS$moa@#-)=pOD$wm{u9;j94gEQgh9#>q&c~cH z{z2fShXe7v{CR#0(THG4UN{d7E^Dsj++pVL^dgZDC-~K86Kne6PHlU5UTlv8>S_?-qR(g9;otGZq&05K%!M?-h~T=&_qqn?OamqtXC16iF4sHuyWG=|PpRQZO>CYZOW3vFGff{D&3`l0d@f#sJ`Nr6#XJP+P z3ySHC(vfPaQo~nd?T4CcpOo{y6)6?^_o>RIGvjof_4dAEzEjKlEjR5RQI7_vX;oD%)~*!EN`a2!8eq$(txGI~t~I=azWb8P+Hp z*UA-9+uCh($9-iYRS6pFD+?=VQcAVo1j2gU&8g|xq*Ii&nUV$k{j}rd2?||CM~z^j z70(@h7SQFQTL%XQq~WLvwkp7oVCQFebE}hiP7qczIY0fok!y4-1K0a_Wcq{Ur)gq4-Iw+rjv_l-;q( zYv+Kz`qA1i+zrZzEf@_~04RhUeYXJO4(JG7uSaex<+6m}G0;dioDKjKsN1KMSQCOg z5OWAb_xf0wq8v|JiByK@cW)sAjt8=PVDCpcsI^@UEutk`07*_&Uc2}m(owSBjNDPm zZ3)R^p^<4g(`Pfqh_PMvo17>PFqr@&WIBArT_eAUiB980T{qj8X)giHSsuBaFbqp@ z_CkWF*oILpgxg;E#|CLVSc2iZ$)NqCMP3;eC61@FQHx`CsKP>S^K#K?+HDZb;P@vv zl04&y;crxXj~di7`7ipU^>#esWRiWMZh7ai`2>s;a2CZ6V{)7cs(7IHj)+Zay{O`D z#Rg9Z!9bHM0aZ(Lj8VhLnaT55pCkK4`iHOy`|1x%9c~;mtWr>@+_Dr8pD4X}Ca;3U z>3c%G`Yk8~5xgi7JltSud$U$0l1r+M&yUC!tC(HY0*24y%>g|K0&0{LWo-k}O(3!( z&eUA%SQM+fXE zCkMxQXJ@`X_;53_d1Jr#>yh?0?OMj-%^9~l7~Wc4aOLKMpAu7#isE&T-1L2rU1f@DjM)gy?$4&^Z)X`tK)op#G4`ef;^;bWVLb zUB)nrHb;oPi(p)?BROeLkBmW%Oc(DrPq+7rWpE4bF2UX1-GaMAaCg_>?(Xh`TY%v1 z?hxGFFL}=Md+#~twfoPlnqF)5?&;pWYr1w#b*=tDDfrvp$jkPZF!TPrTxJP$$%YE8}Izl?<&60%h~A~-n%phH-xt1X z-sqsbF_G>MXw%bk3(1fj+>GZS(}v%D$ZJk&ZI){0wsAcZLA3Cp=^XE@`oN(uk>m`) zHL50AoTs>zY=+T9MmK6+Kbs(P*G?w<1Eu1|=Of`J;F0tar~4b0_O_~p`IZw@$C7t= z_A4GuW1m~v&OPd-W`be8sEqUIxLX%i23iRPSVlcAS)Xd|?pRKGa=tt=i)3vL2U-bN z1Eh!*`kP_hkfIT`)N&>Ec$+kWtk_|?7n3^_tiW|8d=q*=2;#`?8Y^M@ymR6??Jw9% zl_h@K_h*VLy?)!i#ce3Ia}ABJA4L~ocbiW~@_>a4vTthHPnes5DccBM9}^WujqB_m zjPH|=1pLc_WI#{XgrYN-il`*Y2=IE zJVZtF=f+?rb_!9iKl`mn0IP9`OGpX1d2DO`ny8Yajqmxy+J%KnL^~WL3nX0Kno%o- zgDhn;Wivii_T(F(T7q=JFRGRcv!npbEm6Jnh$=`!zj0b!pnBEvx3aQ4D?EuAE9m9Q zk@|X5>hqv|uhcmzQ#~n4TC@?a@Ak}?NQt~zU$O(josjaZSWydGnUEhR0CQGF*h*xD zW2X{LOi%R^iuX9n1jdektbAR3*+T30Pj^m5*mBOspS<@E{au+3aqfl=2w{StJ#BQp zyE$17C2PRWeqDDalE|$%XUGC_See-@@0-S$6P5;Y!U}GdPIeu3u^XL77gV^QF7o-P zZ0>UYxcdHM8MYXRHXvW5CR=Gk{WE7r_`%2aDxNGNMNj2sOM*n>{j7IH!}athiqgwa z{p(5w0d^}0S9|zs%mpBZF1IZFM0NWDY#OQ}=ngCt0>NmTMsST`fy%=pNc7T{)v+Wd zTPd%+wS=1TBl5}FrJ81I@0_-eEO@H$?)B-hgfdPddkMxi4(YcOR0JiwcMwu~uKF2Wsdsn5<=_mFlYUnvr!ysT^xDali7~7YnN=r@5dj{DDQ6$S&Fp*uS&S?2hq&`*? z%N=fUs3HWWwKAz6KZIH2FvAabfUCgeQ)o>L{tC~NTh4Bo}r z=m{rF2hQ%_Qk9RxtJ#+BPJBzD9b5G)(KCWoK zD_4~)>>(TH!un%3qYz!@2{LKcOT3Xv~~3AoEJato-16>Shc(Z23O1z)WD(VyiSOi+u8sbi!Z#m(sT+X7;S-Jr!4baUbXizV}~! zu})yIiZ)r8g9rfGjElG#r0K&cU1;N?SE z@(>YI^gxldY@_|!Mk_s#X0fehF6Kt9$*);tKWU}&?#_lgj5(IPK5A1{!bw`X+Rhh6 zE(_wd;g^zUSO$OSs#6GS%_L_?c09&wKw}d|F02Zkqpq`;H#_KigS<0Y@$tqodSucw z5NU^^13TD};t1ZgY}Ep;HiEARo=M8xFg=9ad(%SlY2j=a3mjg<+myKYt(HXDPg>p$ z@47&-|5O@@UX`aD$d8ALI}&wD6dVSxg{O{;?YA>nYCK|E>k*X}nHJ_~PL;3k|5m7+ zDUNzYRj-_gODdWvZTb^2LOz_I>>@5^=-U;6NRF(-Z_XXDE4Hg|`TmDpo^#tFf>Gr! z!Dt9g$xZ~2DUfwC*tNXx5pi$5+pu5Ov_2~LvpW^~scjrpE3+b5AreQwrpq5P7%nBRPM~nx(<=z}7WpoedM59?g)jZ+Zn4>x`C{ zCr|(0bRFF`Hn{e|y5oA z@Z>-B8VMFwDt|i6pj(*Q+D!Hh_1d#Ra=nYk>iYvaTU&E%#7$zypN{H|_YQxas7zP# zn7yY4gI$pvKXe=p@F*-t_HGt*=IC=~xoCCjaE1BhS%Xmto>rmu<*zzDO$oANX2z|A zrNuR}kprbZEL^uq`dn6buI`(cD(yG0(Jh)m}I}&4$mW z&$i7x&jztXxWB^kl%?2o4!GzZpKxQi>M?W@+7+|OKj;e58z5GaI2}0izmu`iu64Nf zgWpuU-vtjoROR^GRn~)U*HT}ecx#2OR!zj|UD6L^z^W-PHe)&Ke*iG$nR!)u-bU~^ zcjVo!bKRgmV7f`N8G8qM2R&Ih(;ZkOxnbFNYIgY)F?tQ`iL+@Ib~twepKsD{@)P?* zfAi=B-+U}M%Ih%B? z(x$2FaIL#;yw0=U*tY)4{94iG*a5-B&1`%#)sVR>EXO`BPbnA38sMHaMAFMd8xM4X z=CEgICXDw(3nNa`NkgU+`4xyPIdynvafiiQoVycZ;SB|ip#GgD;1_a~YWyvfYCvOP zx)L;#Xid}v`#DQCgM(N!dV&%!ZBv#cpHeZ*uHx-Z*aR2ioro^Ojw76q=x`Rl_F+DT zE_>TKS)O8n%l86=2B-?0S?O;y0W1u?pwY}*v{#;2Xp>z52fqn^HxIfJ_~t-BV|<`Z zL`sv`?kr!Km9q9WiMyd!PKSXVb~qRXyEi?-Tw%Yl0-kX{6;Y?0v}b+*v9q*JW@K6B z(=EpH7l<|R$U~P6(#+G%vwxg3Ti16K&Dtiic`TN!ldu2jWR)dp#f|T=(lkD1UbkwS zyv0kTLDxDr=|@%{%}pZd)r z&N|4_VQQ&{G}^O62o1>GwdOMtIuXqA=}w6r1%Rsjw>b$%f&9XLDH z4wei3%7!D7GHQ)z7fgx?)TEyX+d`OmDsg?*^U8aAwhY5HP{}btA4&Y|3QJ}I zr|fEk1BPBJ~3B0?Bqj||0KDH%dwWF~(qQb*~2K28>m zP&{pSeV7|#@^W@dWWIaI?O#yyCED9%3s))7ac5BcSFcz$#r#Jl8GEFafAvwS>aWyO z!XPgv?Xs2F&{Y|noA+NiyYAn%5?MH({Ap6gFETGk`zO5RcAU5Zur%1(Rb8fp%MwrN zWV=Jmj~(hCuxbVGVw^M-!1{xw47?2-4b%*Lx9@xXg{rjGwIyKiu$bb{`dti5!08`n zzLyv7lOmQ^&e<*f%0dz^QQ=4c53T&z`89Y3k`Qw-e)@*#u0#@bbOwq&&Drb*;J z#%iI4yQFhX4nfX#04Z;yv(Wmwa3&j5m4ouZVDp=k-iQC+9UUw_TDxh~3{ac1E z3POp_-PHBGd~id~di`~)vl#8RUYM_5Y;~$egUDAggno9ZkYe}Q>XGl0Y^=Jm4WRr* zhj-c%I5WZ^(aXsKQdzju!wDr*hqu3D)2TOQX@itn%t@=xA7&`Hrb6Y+D9SoSuTKI< zb5e?k@zyCtiY%RQhQ!|6XLQ#=k7~~|Z{@QrDY|u5$~;9qR32a*GJVxN5u^x)VR1cvNB|QCP z5mht!%4xX88ei!6mEfYd+B;n7*AZzNBogpN z7PBMV{-=-HHiHa55mqAX>GW5TYoV~xpISimmo;>xaYqjgTfegd(tf~1ddSPqkeAZm z@@H`Aj5FWBU)pE4Ym2TYlcjPNnd)tfb&4j9{A=-GXebt=tTlg$>$O=!GfUUegEh>M z%bhNc-m3VM-zUKND7xWA_%LP()|S+5M8xRhpoq z71J-5926MczQ}|Jr_R0|sT^sy>54b+9~rG)?`88KvQ6gH^FGONb<4x`RA*NC1KOBF z&+waS9{@OLpWrCrIfJ|bVNC=i`j0G%1e}|=;)dP(eGVud-!}et=xibOKeyi;y+D6M z-pXzfYv;4rO01@fSpkd|gS4XFP~5Nr#Sg-d#In9$Ix%HgvaoYuHzfa|gJ(z2YR+!f zD#4W2`R*Wfa}vo~-IkgD${d2+d~P!pvY|hBfEBq+p0cW;&(fmPL4i^s&tw0MJD){k zc~n8zLzroDSQ=jk&=CI=Byk-~Kb+S4DThus<@l|eGsBcz2b33kid!^BEg_`>@rmaa zLjKyryUUY&3z{(1Kr~c}8Jx}bYU%rV!?B}{hmVuPEr;!%)x%-IKm^e@+1hl~XwMk~ zEB0pYl?K&=YM5q>x(2@HEr*z{0WE+Q>YX!)sD%nwu6~$~5 zb{oFu^E+w=pLg*$^~@FLz3fLlU)Sy8Kl84e3+SC?Y@YGVyj$r=9nWzk2x~V83r3p{ z7u^gu%YBQ=_-(5qHqRT)_%HV;;G1A?I&mER2hidMF=!&8iQg6vUw~STh;FX1?Twqv zXN?3*ctAcgehcru&y&+ARjkP;+K@w&w1c=i$hUyl8}-{Inr{v;l6e7gb*;qT+Q-Cv zb14PDZr?(G(TQ@Alab0{58Q;_8^9UDQ)2ma{iNU#-E!sp;)QE1!OusKcs_cK+w9KF z|8PCLyqCfAxgGr^-xbVsoR%@So3uw%2c^Y}<7rjc)yVz6m&iUid5A7=`}v7R-#fW#u>D~30f4QnUa?<|kYMn2y}h5D zw;UwX>I->a2|q&1bZe&s;j+?a-=jshW zX)~yUTq=*_wKsIXlsg?i(NgU)MsJ1p)ayL2rfX$)?*GaaS_AQx2;HuL-9*`{nP5fP zJYG9~&u9GFbOgHkLOyKTxC*wAdxo9?GQw~S2Phb~z#|6_A2oJLl@ZIBAZiHx(B|Ek zD1Mm%NB>z3?G5(~_gx?yIeEb(e7c5u1{qH!+$JRu?}<|z`FW;xXA8IQQL^8l@tIZ> zUCFqteyrIJJ=`MCdwJXx#kMIEDTct&s6T3*uRH8`*>ue>hgU2I7$i!P=F|j(5~^Xb>9FVr9%b6|lD)l-gCM^5dG=g&sx@Q`6*&RUOmjR_ z&2Rj^=T`VdYm4PMF9&W;*6V}U3N_pwuNU5{9CD@%%qT^z!k{*SAe{KvEh zgtfPw7bprjzu(e5mgxFfGejYb8u8(qlKq)%Usiw4ZkToVPw>*&T@IsD4+e6M};uu%R0VpURD?xdP7>qiM z4?Vmrnp6{7S2Xh-_?@h@0s_u+r9Fne*l zNKn&vNa!HCcs{T*j;SSiFCp`u)g-Vt0|>`xdoDlUUFE2J>^0@^?MQxuhI_C=9_9aRnT|HbpejYG{<)bQ8_o!{l_k8<;fG}=&@n`IQIBqY4bDV)2(hiQG zU-Q*W_ew?GZ46^iGFu*nAqTacd#4(uLAXoE_uh}plqi|&wT!h@@f!VA8{YK!XKS@b>;k`=b~)2?PWqhbQ5PT+A(4c1~~vWc=teYk3s_j&YqcN;n}-p~9c*JO26(K*Uv@8^Ba zpWb#s;tlmgI1xFeooR&i8bhJ6c;cTBGpHrG@qQx)aUfj*C-F=~h%N+1;&cOj|3wBa zG7I)bDf++$@#N!bStcZ7u1XmD;lPK!exz9D;I~`JTOl+YE*+sY^$;( zWC~vC$}Q9wb|K*fgUl+4p!I1A3OlntGzrNpOvT0vH;p$waSnH&+$ND^S2iv}%}KT; zr)NCCPINdIE%3uwH&KidEkCTE;y8j-)|nC3%7MI(+$^>^w=ax&3t{r~fF`vwd(28S zmx^7p;uO6dgN{u;Ng&2>E96h0U5-`7^uz>}2nwX2ESo3oTu|TD4F_hox5vUQb<-Su z>Oq!j(~bo_0XAb?w=Q95x~g`v!CO*YNnEye5Ymn%A>A|)iHAxVgI|~=poYjw-MD4p zk~{DZ5ZTfVBd7lW(+sPI<(!Sr$g7{yAYT*^rHJa}QSeirmIYy#fU;{3Kfs1LGBfUy ziH<9qL$l`6@)3t7hr%#x%%eEI(Zl-wzWO2`vyiS@VMHhUvLwE*Fc5WSH?|t2qdyh{e1iQ4m^z{fEYUhF%L8Z>+hzD!^y{b*%+r`Z}eev=)(M^0? z{B$_QN{n1l$)TExsmAgER*DAroOT&7utR~})xFq$7vBw#J0o+H3}|8E=+Kg<*y@FY zonIp|D|V*a zWehP+$p~oZu|4&Q!K@&gmA%B82FumGn#RqqD#2tdeN?5j(LnWs(pr4kT7J&^lvt^= zZY2Yf<}m|R0~9K!W^jts5+(Ll0tEy7r!{#7bw7u!7k9KjaieckfvgJE_P)8jJoT;o z#Dxtod9%9yv*o}b^M_Lco?y0-lcGrai&ot0IW zeH9I2Ra_h*Jt&*^-BeP=k2nngIEU&ErWFjAISqb2QM{%f5=%EYG(JJos%i+%I(GA%w z>_zp(3;bRRzqe7*s}J59!@v=BozSiq?4Pq{hIwlCSX0i>?;FvRHV1IvS2d{hU+ZS% zh#8@nEbS%C=^)MdGKaFaU(Ub}W103ksK3P@vmBEgMQ!U3Gkd*{%0_y{UdBMXIig>j z(lMxg-P7SnOoG?Q3mYUe_0fk~%(BAOFeWUAsNT%3F{ADv?+lu-e|75@_5 z0i2{bxChh{HEU<+Lt(MINZpXe#Cvv(>YKa^6`6ZlKl!8lDXOG%+r1-eKt2Rl9{o_p7m|FIMXQy6v(jgj$tPh;LIyT zjQA3q$eQv-9#|;fD6`%AfLpd(XR<1+$t|eXUrb*Y0zFm2faS?6H(xq*&6!6EXAs=$ z&r}-=VB%R<3N-~wat5wRxJk3pRPv&)3=i|r^NUXQ>QB^_7t!Xtp z6syn5ow(=YfXuIaF0P6dykk;}4Ch^IzWH2{cNS(EvoxXqDj8gHy-s| z(&8pf@pql+N#sXIaF%M$O9Ov&QY=Wa?24E@I;qZ#VKF+rVP{olxQxmBRGnYXWGpQ) zo6qkVNAsC|3(C_PBXKM;PUc&aZn-T79@R(B=`?LG4pa-XC!=aq z&WyfT=EX>Q?2|QNiJs(oDc8?6X$^|CgfBOZS?QA`SR*#HZ!r4C&vEVZa&CI6)Wl`V z@|Gv*+-482G|G_B9&(B0?4>uYj#$uZYSup_$!O|WC0k+R^qX(ujhW3nqmzf(G$L|^ z#w(qg+!o-*G;Q=-nbY266m+1~H`ZVrllP@-LY&RW6ZK(V7{I2vYQkb#ThUd4n$rs4 z$p|aDECwbs<49O^*umX=tmCsWL`d$44c;*!^1Kxp})X($}4NX8fjimr9Zgy{`C(Yd*vPsESibh`Zqu$LbmPE%RJ@yoN zYxEm4K)P)!Cl?qulYs{jC(~}WX}7o-Z{`l~O%;3%;#sp58r0K_ITB`;1uHmN>nAFD zZH88?QuoU*wxrC*-0YF=C8b=u`9^H(J7CurrSTyx3YGQ!JN$|+J*M{(WeXnLpabIpqM3%!QZ=!ecxRA>0}p|2HP zWw$8;!=n7{N3d-_%M}M6Q>l+SwJ^nXWa`f>3U6`_wNycSCD!y5BND}$nwo@MZF?Z`U7m}RR|y}32>Q_;oDQtUi3@r1|+%`{bR zzLLQ6$>A5nQC=F&Gb2S`2RzM5!vc77FQ+@-g?Dq$b&J=<>T~xln(&u={Dhe{%(|v} zwr-9Xan^-vPK}yp0((!z5xvvxnY(wT=zI&*RanbOb66)|rKosrf83wjB&DAOVkT{h zUpk$O0msT?hNW2`tjK6|;zhBP^CHRsPtbJplaGeRbKh>J=mj)yIS-?g z?HyU2X%*Tk#V60}ou*Qr=7xd>jPSjqtaY8Nb=uCeEIfzB^aY{T;-cpL4?krQoCFN# z>Z1ZO-s@9@+zbUpMQxCjc%fF0acp;km*b`le0KvN#Y!h%TYX!5r^z^Qf|Xi)HFHeL zSd+#52e3VqO-G5NOk^T$bz^0HdA7Bj{egJI4Ng__*NW!Y7Vq`Wd2-TpBklU)NLIx= z?SX@t)~6V!Q_xV5WD4PiLqVB|)viYifyOLb(Lm3JE6+E0~Z;cH~8 zqqD2D+G_EYsA6kzyNR&ppoP>b!VYaLhD)_y@j+vAlXLZtqv4V&*XHJ?=Aj79XD-!V z0RiO%sbW``Td_r@jW+gSURpv?B;^+>cN1WVx3hRxCax#7ej`wLe`VslbZw!zsR(>2 zMQc^FO-s`N({6TS1$@{1C^pXq1<#lJXD2KG(>m(@)=9|KNq~0BN6#{2t(r{~a&r+m zi5>XR#K>6rx&19!_6^SJ0gR-Ia4vhgegl3wdgGo_zZq<5v9nCUH2z$h;LHZp`@uzA z%VSXpjm-QEJnLaj43GN7!(&;&(}TS#EII|EaRGlt z8t7^53E6je-hrNO4f?M2l3P#+rqZjHhdGOzFtIsDI zvnm^Vn>IG8hebtk*sLhEE3mB$EDu)ln>HFP!x!#nK5!I(O=j+}cy2_ruZYlWB8vh) z663})y4_sPPLJjz%qDXvCTo)Db9lW6Iz*ZGj?-Yx#!|VBHVg|UO10JihImQXXpHmF z3@{{zCSTv;zYPF{;nSks`^nwEn-LUQ6)gZ9Om8TEB~W7 z-9Yp1oMNe6hGw={^Q-q1O9K8`M$f$4!q`yr;LyYRJQ5TM7)_IO;^ zqZR|-ZxmRAkK=W>wDrGfdi8y*>sfjd)q@X@(hj@r+WKLT= zY=y7{R-${uJuK!s`h74a>UbR6{aB|QH}{%JP?@dxKj$nQ~H!T4h74XQ;BzRx`O>wNVWsK zyOPOs)7(6ub_0t#G*#b?W-a*#uUZ_eM7wtb^vQOQ2S?t&w?848+z>QBT%1aI>*15t zPt#AOyz&h4MvkSvJ0=yZ1q!2!hcS)uvKTj|P|l;D`zRxZa;TDtk{O#*@khH9;u?D* zR0&gaGxytPR!BXOhDTy)!go~z!jx*cq~~m@d~nN9~{Dgb@;E{8Fx+Ilq_Ws zDxod7%5Y(R3e6xQAH?y&tAMG`Yyvig@xPxfL!24E4cpN4RnU^3?Fi2HI8!bX+@OE* zBo7EBE|I{Q9HkKKbtk~%YjHuB4Jhy6CCNw9%%)7u%(ICC%LnN4&;u(pmdZWC+*9$xe`RM69g((5FaqpIQe_`SREpzLOVn^ z@}7%6DwFp4Rc;pNU(JSj>=SWu0(27%t{u~JO6AB1W@-u&^a`>-kR5_LAYh|%I^;vX zVeIibK&c4&;GU}q`9NJO4Iv@|e0B)P`-EdbFJj=Zb)0JVihAtgU>+Nke`V!^v8hQq zqr1m-_$lRu=?P>*Kf&%%j`+R05AntlkaZqX#1asin8WPJS3HgGX;{qeVL2eF%J5@h zvnZk)1`?0o!&{i&2MQ*3RM21ZOZy09i|`4&z3UG_7I}sUrTN?-nm<2 z#B2k+&|?8p_UR-z?q0Q-Z1vuk8q2;vtteK} zgwDmlpb*JvTEVMpxln5HC148A_U;9{cvN}8jPiGhO9`sM;VeQdF#?gaX^k4qFqK7Z z1aF9t&5f7~X=9&>*8SXCbRmx{W4jQJJXB|3%MfP(b_6;C(_c_OO+RIuUq0+#6QSr- zxA8)#7;c(t4)|+KQO5Q@EE0W zZmho$047cG-*p-R15g-P1$E5eFO>fg7kr)wycNtxrSRKz}zRPz|7 zm4dO3XF|mlOoiWm!~j%AF=X)Yf5iioh5~=%0!)x_(A>X9j1dGCT;Q*XH1xx=At05y z;%6WEsIwS?ZxMuzpgtOGrP&PNGk7v}%G_Tpc%%8?TIs*8$-~j`!J{&J0-zdl0tc^k z_ZD{qeOp^szR>CO74FA!5uF7A5oc~G8GaSezxLiUCGx@G z!*K=w(6av|BAbdZje-Go^7=)N_g$>vS&uyh3+GIcEho0Y* zH5pQ~Y1*BL#iG^e^OFmAh36eu?A-{W{)Cq<=Uo+~PkN zzTvy_A^Slg@J@k5lRD^m&49R!qjBr|cKAAp?u8Ru@fJAG6^?k)=ffH^{p#ndws7_? zo=cnQJoORVJ>~1#Q;Qyc0oG+}rUUnEn;1Hr5Wc>7L4W^%o_YK5c<`w83i~Fjp}=?8 zJ@P?gg2K83xZV@=P%Q?I6@jV)Q5db=Xyc^R{Y_iEIoyb+TiG1Xfw^CjlsPVeyloF=NJ*tr{1iu zAp<4X$Ebx@uEj&k_D!3eh8%rhq|ceL?tLWW4RdoHs)*5Hl|d{5C&WGgeLY_2WAf4` z(x#PqAE|fAb5tiPYG_weZ@;Wwwo!F%!E3lkqci#?z1xf@6@68)xs<4hy^2v)$X`U$ zNaqyrtoIWUnVE5-lv6~8#nOu7w=42ZWH2!EqWlL0FaZv}av8#$GQ-rbI4i_B9Pn<8 zEeeiDb|oZ$;0BrwnmzGT2#&sx`BOyfd&k@0J{IeXN!qqCkyGY2?xfJJ-7iDGCR1O^ z-?afuHo598M3l?}4jRHf{JE%)STLunua!jnrdj>rbos_*lqN=$CYAIEdcUtI>~T2@ zIHGZXL4WAIi(U33H*uc~RoYcpvpV=} zQTiG`K=s229#~U;OkY-AJg)+*u~<=KJ*$u^GxQ!eFLBY^tksJsp6(X?bxoAN=nv0c z0)bu9N~80=OpqY`>!p<(=NL%`z15`Xg2y1C~Z}K|q$Q80ghH;c0BSS%4yXSpF$-F#;n#$`PG(mQwh67OX%43qWp1 ze-A^~6lC(hFf-XPM`lss^(4Y2ixc;TowsQr1CG8~c@Nz>+gghxds z{il|{=qZ<8LFmIzlrwgQhdPaV0Su(c%$j~lmoJu8fkB}493#}D zkGCKIq_!EE?1K>c_F+li0{g_x4{Y1cs3r7G2m01sF?7CL2ULgv#VTgS0@1R|Rhek` z8b47)PBr93EbLkNtLpNg1jwr|ND;na-T%xp{15bcC|B?P<4E8-&$94w@rG zerNIK)EkETjrGs-Et#CHqYUJq{~w&BwT~Lwn;hdq)^>NBT22gj!46}W#qYb<}CT~jG+w2)NW>|_{4-^h8xqU5b=;kXAgb8#JM|U|3 zUt!&R$0mMO)2g(Uxi+_+W!er#NULfrq|Wbpc&ZH~&bGdodqXu6v5bb7L(_~T zeL2{})uvqh(n6ZD6;892e%1DoPlNTCbl3PN{YC3C!=btrr+&b87`vNfaf|n)ug8=J z!{#&F8-V+!*K=EQrSlo%%Y0Zs7W?M07IY8Hc27Ou)@+*|>Gf>R=xv!Eb2>-Y z=~>7=V{oV)euSh8eSAguESq$<^sMCf1gydDWY6Tc7*&!VLPq)B1Ha$E-itzPVnG9qAPya=zUNg)+$D3?M)3Po`#^pL=84 zcPewOrXCwO`ChE^j1SFh+8P}1tng87Xum6W_`A__} z&)+%xt^f6Z%ipp7;b8ua|IYKT|5y2Y|Ifn6@F{QbH~0(J{8xw10seOS=VAW(zmxe} z{>MXpPV8^|zXfFq{U=c7e_>>@f8zW9KQJ=?t?>Sz7@7Z}VDSI4{+a%ZNW*_-WU{e* zGBQ7#nHWB4nT!mdywLw5Sn%Jc_Mh;W|JHf<{}+$R{9o{x|5+&FA3Wx#WC7>@`gQa_ zBnz0?I5_^BWI?C9m$K*rh^ETJ#zxAjw1;%biwoBg4PJa~@D!3{Ly#y`P!?faP$7|j zP!Nq(0E7vO;uMxWhPIfX37q6FBs=|Bd$V8mX~^O|SlVX!V{l9bvFEPkZ72d+7v8o{ zyPcbpUCQ&Vjf-X9OC~r~*nupKA+dl)B7`p$$J96k7F9kVM7QWdOX`gsqHPzGv}PcD zp|Lcc2D|ys%kqUdNJ>AUpwA+XRcU{(hZsQph#_JjYA09L(BW{Xz|Ygb$c-jqMYLUQuam)-Ol5O_hWjNv$y+2JZ{O*kH(~ zpr8M_*mDrKkRs1}P zC)g(#!M;ZHITo8!0gZ=(L=VjzbuJnBWC`pWKEZCU_eq~9>a<@G3#wlt;1=hW ziYuz~vAIxi3W`%mK^@N>BW+rr1;yh9F7XxaBV!F_lItAJ$I2LW22}SvZ%M3MI7c6H zqWAkHO}rTPkdZcul0Zb@c9~eC-vwmueM}tz0V%daxM#d?bT^GOR8GX9zL?jc!7b%8 z?Lw~v*;=G+-^Ffs{IoHjd+KZO3t4x{M_|WSF>mH_ao4dFJ3qzd$oGG`|!4_hbSl!{!D?Y+Z6~MdXw=) z7<9RU^>_Mh^kDzW0x#J`cKfPt%BLHdvYq5N4F5>^(vH zWQ>{yHaSizk{pM(r#mCML9yxRAUA&0%0ZWfGnnK^R2{6#hu{dVDReZN%fua-SOSgAp5fTvP_1oBE>r1dGwu#fS7=YK1n_)Wwdz|ab#0P z8N|6O5+N6(M(5@cw>g{o4?=FcB%LiqH$^w3M|Mnk>sPQusrxNjW7>0K$zG{tJ0@It zF$}j)d_P)!gf?+s>sKCRdGUzhEpuxo<_{W(;MdX86n-$H7v8xJrQ)9Ecw1xaIe%nm zfsF3mdUyT@a<0CteusDaTcVm?)ivqtZ7F{k-5qf#$JkI$h_`gDki~rPLQIZ(lYX|` z-Qh=#Em&qdgm**?LEJPrW#wOQXzS6*vHW?u>VsNSZ!PJ1LFZzvZt%~zyzmvovg%aQ zDgE1vlC<4PsdgB|uez8zAQT323KKSQ_NK^`FxQI%mWz1ZyPHVf#M;bx-Hp}F9+A&K6{FIiaFuUR}8>Y-?()*=9) z{7bkR;GZ&#Ir(Sih#Qz)Us#DTDl=oQNDXK>$s(iRh_!|xjk%WH-(JC*66)Z+zf9Il ztFs7kL^fUfip(l18f)$G=AJ8W)gtD9ITUlk7kgp_GGudyIP@h9zYnQbBM*3@%SQ2_ z*c+jhht1`EJA`^p(iTW^@U`0;(x3i`0~3k}3r9ONIXaG&nU%yz*_V@@oW3J1cTMg= z+DzSpby2%onat5JY>srtRV7xXM778Cmq>}#zfp&#)LxUH_251jLm;x*nS`Y1E-ND1 z4xwmNGdWAAQfoDH#~B#wxQ*xlDBuhP=dAlo>gpB5QmRw4;O88mcHV9MegNXNh-sTP zw=uf)6>y@C72_w~I!ITutf|ciC||8njk=FUC2M&$J!vO`JWC<~aL}c6hVv1+mWDoRVAx zxv!%w7GE^bS<+c&>2TKR%*G`eomdX#e)ta5Rjsy(0&{z7%I;OwCNgFxRFbFJ;C#$o zW!jzZ+*jw-O4m3%CjMA{-)*hxZ_*6wvRQA_u-N2vo@gw?KTb&!#8XHnjj3AVLQmfS zNMv&81S|{<)N`J>k+6K5{=`y>4q{xR&!&d=E49yXk7zYG+kcUXGP2}OZyK51wu3+v zogfmg13C}j)|7NoZfL1;4zzAYHpywt|3H+wKlu(YImLii{C&Q7WaKC2NsELnVT3d) zmlrk*V2Jn;(}ChgxKcy~?ZGq%`+2Oob4mf&XhCTlsD~AzbT-dG(s(v9ji%Laz>=M8 zixDqc1H99MK;1ffd%0sws>9T%f27SPEJ^@X3cU4cS--HAmoFhDCV+Q@@y6}hxPdgG zxggiIEua(x`9$&it&Y?iX!!ZWgvwoJtqTG{bXQi3C&Id<%>}(6VN9P!S0um4axUb2 zWltyu-j%?i)?9*-xiW6ESL_nrO5 zTI>{^4MiyI&vltSSX<=)M4TWf)7}z4f%K#T zMIDHol;QT_KtYtRk2knV!%sJu%Vf_cbt_HyyhNt(S_$LPCC6bsE<6(cRw@YboXx zG#`59Ex~@U!KS@8?u3n}v0>{6G9ocRfMxWfP&iS@S)u1|Z&~rw>F|0Rw!=zPL@YYO zxFePVD6ez!E~)!uM@Kq2Fg!UC&93dbP}4F=T5S_J33wMDE_VsGe0ez7rqifzz4*}y zpks&}uO@`4&)ZNI4$k7}TO4KNJ&%waM54bW*)Q-Ar_s235Z>sgPiG#mZ<7WO=l76D zXoe^QC`!aylZ`W2Q@Kg$4f_Wxm$;Te=g=ZYapD)xTeb+JqSvEc#DDj2vkXfmgK5xH zGAc=p%#Jup>2fafRVT)aJTdv!K;eIZd6_84-^kDJ74S1Ou)9B05rm{a271tfCTSKU zp=QeLv0h13F#HY-h<-adI#J}je|gLHN@JfskiOc-aez0i=#S4}Hiimr&1bz>f89e> zTrXmy$>O>@-`0t7imJ(p-;_B&JL#~zY$=;e7WYFpB2H5S!Db%nZ3&8u6mAs6Lx$%Gukcn98%+wld=yKxcdY#g?` z#ueE7lPR4w6_$v77tf1*<;!{*CVPtv0ftFH5+tK#9xtF|NN$dc#EHn8n8E?708{yS zK5wE74|=AnY5#&3mIcHAeCfy%k~j07<<1kCUtyr9BoMZ83#(~aIa&tnKB$~7Ojj-t7ASdKUS<*t068emECXsnCi7L?jCtyg-+hQJxBTtS zv*F%D9h*0GbZ*?-0ct?X-OIzD^qu_MZPeVOH#8% zrpEA3J=sP_>Y$6vcELs(ZM$vlwqrKl21`B8l8g~eHqwPlZSzWEv6cmE5;jU_p2`il>tP07iw8cwGj`O;lvN)J}SQaubFizF! zWV|DJcQQ$~S{=IN9R_UZ#^ncW$vY?!;PRjykz8*wK8^4Wv>Oph1XEy_vL_{X>ri{*Wji$h~RgQZbaSP1xl1q4jmU}X#_h8Ug3Z1R~khInk$#>Ef< z_(0`;h7F1iEA_5L2!#NksChi+>BYk?|#y;a%Jg5_w;>0IWuTo1;C9swCxZQBF8!lhUN({!<~8g(J*^( zG)zopVK5muw_b1yyM(g>KLxxC0_PSQg*G7~@IVkM!bNF>*2HMVk(-~l3*lqv0xXuR z1jF~U<|aQS8&p&T>xI3+55{b`y^HQ7P-YACv5@sqj@Aatrzm$QcPrbK$CPK47nE|O zbSoQ`ZOUD-sB_AQQsstS0Q7ajDP`QP7|8?~uae1=1;p>-ck}K1G5#DcJH}t&3F0OG zG`#WrWW_*_qWvi>>W%J`;Ar2PmYMQ%<2dNrmaeWY{%@yFU5?{@m#HBc&5L}_|4n!Y zWutKLkt(i=Z{}KfJ~<_y3pht}6XcT;irr(9#->c?%H;DBW~bg^(xqyBNhFC&Ngkrl z^NvX_&YCOD^3F`IQ!myo(JeHGY^&6(wX5}O#nz;EEr#-GLpw7Boo25-tVtz7e>(40q%9VDccB z%fbn+LCSca<3^l)jKI04tMq?jbbyJkvmz)PmoeW4R>Ae``YQXm?@4sj; zS_44B6ge0`%KewY{Fw?|gzbuXuuUeV_P?p)eKq{A2k{@prFYF9)jXzn zk=I)3FL*N4@Z0Lzx7O?KynFpkQ*v{cqz*r@y!BLb%a=ekkAqCN52(h567i&<-l*1L z;}GXu_d-Rzn>Thx{?ci5$Si@7M0tck92u)C~Qy}J0+SQV$#?BWQ0VjT|Y#C4^uvA`YRE5fZqsML+~4_=q~92aRITeIy6F1tBf5D+Ss(#T#;zg&JAi6}^ zZ$R3YN6sMygh~(|94?ipkjdU~I?PU|L*aCAm?#`hPU{l8$y1$E*ydQPyk#8Z@+VC{4>X&nCIHJZ)9QBv0G1kx^T%a9@%O-^}$#B<~)1ksV$X* zfp<6nlOoWc3M9^p!6C*uni|bRn!TFWHNqrrlJ=K8X9PSTjf|5EDm5oZ8jV)_2FIH@ zj_0(9XtcbXJ4_BE1t_w+gDS-HkOjS=0s>z6q9CY(3GO^qH!cWj<-tU6p1jSIFW;dj zlsdFpa~>ihkqAc)=(_PXhNQoj1ET!?i-4xjL`EB+;$A8=M3tDp=1e~iNYd-|KrL)B zYa<_b7z5hw$h$#xZh%W16yW%TghIB0%cESttO=?Enzqt_Cg=-j5}gnZimvi9P?YmA z6+FBK&Vb3zz76EjU%c{4S2!Qf{}p%e%8kDYKMvD)U*8g-yHe2ZdO_lHpp(IIN)2{9 zN1H}lr<}_JZ8Zb{oAWMX; zt^9odR)(!iKsV$Wne^4ae^GIrE8L&(&9Bdd|K0TE9sB<5e!;$O?v`ht+OYU;ywUpN zDV%^+&ttOwg~#KU)V=)9`^RsK$?Ei6(v0>WLKZsFAW0?j`CKvAqvg5o$hlyW)t+Zn z7&HbmCt#!p5#6j-fo{vBb0t2e#LCGQN+VV(om(zgNTX%9rQH&-@D^f@iRN)X63ycV zlwisyA-G6|b1IoL&22z7*U5D9WSvYCkF^SYzX%HQIA-D)+r+PvIlFE>w*1!;u-c8BabzY}E|e>0szclo zp+Ol^D@0%qB1tiRAbfAW$@D~u!N;pbl3+v%B(Qnyw$@_sO8r`7bT=mr&uS?>r+E*lv~;vSnwC zF=xE2sh?Ox1gf3EEcYCQ!@S_mnt%oWaK?stXvOdr`lHGOLS#`-t=r_4HFal8EvYEqc! zp!NlMCP~s}T85E)?L<^D+INtuaKEvDD4$q zH5*VpIc8kRk1aPKIed+3%nc2lSodD*;&*Sa*qPPYCq3V~{8xK!S^4;;$F^O5au?>d zP8~^f-;X86x8C^eD`(z10V`lG*NIb@6yXcTA%Vlf*939vC6I#&UMySo3|kd+VsTW& zH*r+H-;#MU8%i3#{WknH-MQ(y<$XwnZ+5x#1PWQegSRum1F4yLNCHo#=Q zoq|e*R7!;cBqNzzrQ{G6vNTwes0apwpkWbZH;z9L1XYg+00os23F1WcSAU>*>~+}t z%KOS4w%+sQ(WMa>kWCE%YJJ?imRTPmfGPL;Vb1;6{7|_E=bAvrEimO`{OfStZ_X#X zZT`O>3NPh-eH#`v%vesgP+f~d(?Qp=gPdap9X}hL4Ho2EaGGU;WrFWB&6nANG8?Z& zYw;SsMX^lXq-oWzw%&=h;%)pU#d`Gy%_i+#*0&6=n2d?Qayy)og9eh6MT0?-kMdzx znxsK48`8wPGIwXy zIY{qFYL4p{^`y999Esa8_|-dOR-%jLy&_}57t4ENn@@RGZ)_(AhB7qvqZ%iOp-hE} zN;PsScOzgk5Ob~Fh%;NRF|aLeto!Wfv9FfYZ@w#h>4Oi#m+o1xX-Un-I~Fe5GHk+* z>Ff9GyKUVwTzuLCi+7(nyL;jNX&EQB9Erfrd2IV{@r;@cx6iNIyx~fuWXF`J+irVy z53GS%ky>XTSy+ABj_?=n|2Beew>`MI{kAoan;#=9*H+!OVS{ww)kPiE^B>7{y>$1n@VB2q zk7oiE8vv)&4t$_XCfP+ND5D)jQvU`7a0@siI6WY70WaH3wy3x0U)Kprx!OjGO_Sno zw2zLTVVV~Q8)Wi~|Uj{dcj8j{TaUucMo#Hcz z6nO@b;!!qp$veB3ceIRJ{LbU=uDa*Y-Zg9X?!9%*jpgJW%;OuLpWhjdoC$}+FYkNc zMf_;^{%IU(;|(%>>N^J(tEOYcq6n zxSROp+LgM^T7{Yjihy>AZVH*mjgbcxCE8Is)dS=~Zl`>wVh{I>TxKMCoi1A-WY1%L|8H2pLj#Dpm5g*vrXtJ8@{p(GW?HX||ikUc=GgF6IC(TxWORT`yA3ToD= zvAT!MLOQI56w-~=K_##PN#6*`dy#R~LiOj$AZfV_vj*zf>O!Z&4G z>>&PQ;c$4?3*k9J&*gvKGrsg;?#lOL`8O};^XD#0R8qMSWIiXze5t4aCj{?SYL)4B zts^~6o1PA{6IT#FEPXn7B73WLQ`$q8haG#haZlTyO+9EooO;53D)kR> zAEheBSg_j)n?Oc-UVsl|OyI|7%uH6 zdM_6CeflX~FX#K&4x}!FkQvGhF-sW}c#^5a$n0YU?8(ndiL#v$Bxd{uWy9+AaWc7% zMD-5H#1&Q_TKvM1an0lNmz-IIbBnjETb0mmTYCDAEzg#UN^9Z~r**-JhIu*lwKY%p z5^kS4_PLFd*H1RN zB9W-nE*vL5WP-&g2mbUCLddtDFu~aX;)C9e8$otfq49o#-G@jbFm%us00a53ddv7{ z@!P_2*r_XmYHlbfH6*AvFk^5hyl~7YY_aE+;!=(Txl#n0E;J;9RJIv_ZZf?CZ-QO4 zqLbM9WruJUGmc!0S|Iz%VQElS#H0u8<#O@c_k8{jXwpVG#~x4)Hv;ESqKUzDncz|= zw#%_xjyRs#*A((cU}sSi;!yL-m=Q@ujY$1wHD>BOPmRCKpazZ6!((bs@-VlD`{>H2 zq`j|H=-C$@wy$p?)UXlA{uQ8j1G+spJj;Yd9((ybel$OwU&y!cGNnPGR4BD3gHnq) z1y<7&I2j09sXG){ktmt4i6k2StM+CbcVa+$1MT!;6YU*6QVH}c|44j&vyO3x@+P`= zqsIlHuTo+HMQ!5~BWjCox_QK?QNwRGyLjK@%f=6TCS_bvMN{9q6lYDSmmkI-L~1lN z=tfJGvd+PMIxat9xMQ<6!3#O{zGf$@GR!Z`PU2I=vQTh@eTQa>WI8yLCjT(+A^lT%6O` zO%A`P=kYsKzUaobpqFzfnsxhvm$D5MNFw-QXDMvYlRC~+9tpd7d`!x)73xo zrML&{ZtL2&ZT7a*y?2uj`d*x};htky(Q?IkMRv18cu;>Os=NOO%dq$OOnyjro?SS__ETAdpeo1E_} z-nAIyAe42bNM6Z9r87gSE2u5i60O!8kKdV3aR-8!QgFo!i7vAigR}*T(}Cn>k>O6n zNEAWS-jSiA$a3L8P*r4|Z*8!yv+}@NlREt|xuLfoQ!(+YJjw`r`_V$hE;-YTshN&a zt1)&OYG7xh7JRKh%U$lYWlUHyYvjxYWaN=WU41J~Z}=p9{?R+W*!NLi!IZlvH$C;l zEvuj9r|TAHmt>Fl`p;Dr;eY>OYwxXiB3^^{{&vstD<73VTh{&9124RQVv?7g*-6vU zZ-RNl9Fr_T?@gB3-i2J9rQWf~yV|kVwasy->mkct#}UU@md~V1lIaG^W0rjuZdh8i zjHFNk^#TTM9!Vypx~AynQ)+Yq)&%@cX%vxNlm^{BIDpiEN5c>3FN0#Yiz3%BAbf!` zO$QKFgZQ>1#`e;30?W z4_?9YSGM=wvicuSJb#9~`Ky+d9edZTeH>30S1+Bk?oW*x+pHy6@u#y`d?@_a@IS+! zhdY0Ll*@bg;E6}JQ5<5F6!|Af7ajy1tnCm|0b}?2^4J}WkpQ&WF~S+X}L_^Llz?&9Ll!@xw+!&(UXm2Yt(LF@aE?l3Yg83Q4bLvlL{BqWo+2cdEkJ_ zpXz#impCHy1gYAF<#pk^w)Op@B*Q`JVRN{a_W=Jk0!5q({z@Yb5^oSEihPmOE)lns zrtv1^#N{N6N@$dJNQz`A9pSX2d76{d~OLC3L2>s+$4EMMK8~&-g80<2JA#m+g3{(H%G3YOhCQ=OCHHzcrr-t2Iv*q;S z*0Z7HVn%cj)BF zlU&)!lUJTOd6MpXkAM1NU>7aJ#q{IKnMQ*i65I!H`eI zeSydqu$uNBfW5zSHMB>M5=3U;ETjT-`M@Dq9L~jf?~d>syYTn#X$?q*knkdm#YpxC zMZFoP^Jyw_qv0mQ-3HD;uTLo5o;=Z+kV2{ZLU5luDUX+FlqOlc(ry%Z#LLu5wN7Ca zk%=?Qor-vMf-VUq%hMHpT^`Dp4^s@+jp4@0g7Ol@MD=L>IKz#`oAlF+OMp8sGOm)X zmbWMl$$In$jo->HD^t~mRFtYs(WUBBj9KQPsKB^Fu}Sd&cfaNtyoc;jKdm`{4$69T zukr88K2Uzaf1&@}cv1Gf(rM&Cr;*9!f>NbYs5KguXfWuzBNICXWR$ui6M_p>dY$yL zL9USG2BXn0$U*aw>r@&|vQ}pXl}BOF>-{Q)8Hyuez#@bQmK%A6-k{NGRR$H$8MPXX zLLrw^6OmC5>J(C$FNs=Qp``|WPTP&2396(iD%_x2ry{CuGBc>0V!#cCb->!_n_3ib z1-mZ*x)FZn0KR0pw2+Av_L7U`;!GVB;8^E^@jHW$Ps)?1}^Cm$HfNdDB66QbbPg zms6e#5gt&ma+!jqh@9Imm!h%8m`X;EP){G!OSEo9cjR=3Je$_ofrgTvXiEc?50taA za)!vcPL;$S?KcJ3*$ulP!L&4LFk|*Ila(6Hyj%*0Cx#FA z>@DJR_a54nf5X8S!d-{=ru~uk^*wyv@CI4h_rRMc$->KL$eIIJP674zz!KPuPQofm z4%$c|g0(vzHK29q1;p=$^xZsLzn99H9R=iISg<{?VCl*M-GH>gO0}ZSpv$bpdV7{V z+a9zx+8@?DqTQ=iIJBwScKb0qZ>Rf0s>7X^pwMy}y;Ftbh~I4DIS_((nXx%y3i8%u z9&zMe9KAX+ICgbJ<#gxmfVQ5r*^l5J<8VeDVOdR`FRCbCFQs{x^r~w+GTRwzI@WW z_@Oz|#+*9EJ+y7vlDx6AjgP9vRxH?dh06Qcz-M~cZP6(~tw3BnM->a1z$?2+bEg!& zwE3b;!X%4Y12H~;nWjNg6$c-To>)_TL+m?W{+Y;bNfq^9Qq5-~v?-jxZwYiT(5NL%sfO@Gtsp9;Qc?(J zg+f5kIuXo-2ue(ZFC`UHC_@SyA_|IPb!wngf!h>26!4C5P)mZTf%yb)C%ZuAr!fXe zC>2PyP$BFPjtLh8LFgu1I@J|>qBf0X^wgR~1Dr6hN)&!y_bj;{f&WyuRi$pFaBl}+a174fyP8@`{z0!AF z=(+sIw#Jn!`LyrH0;Y}vy4JJXLccsfH9o?wFAcpRdW|VJFB%TYj)tje(a;;c-qe}k ziiS2v^sGKhE9OZs@D~J*lYk#?N4rrw;s2jAPpBfU2rey3{~bv=2_vm?xjX-6*Lf zEm1kN1DdO5_)S01TrZyYN6*ls>gx}+S5Mp%eA1Q2IRBORxD8Z;EqXqz-A84h$Dk*D z&=W1Pq1nOwkYS0LOcW=YZxU}Z^J#=2s^dJ|)^xUBpV zJumC;L|^_JLaWc7gh|yS3$sO1h?wvS9e~7#7Uw81|@7s1?*ciUt{oy|R6@K**x@s3jJ{Oh) zk4!+_!HO!fI02-h9Bmb9L@fzzXhXsd^pNlz_bcrou1ou>_B1-5@UH}e&X{0GNZ`_C zsfKi?u)C^aW{;BV?{^uPZQSoKr^a4P&oy~( zViIT;#-!XFK6VNYlW3$;B;R%XhVaXu_J;rX@C$hK@jv5?;YV|i|6=c7=hc6<>B+wk zGWeUzzr{=c@F||T|J<8{cHjF%_?vqUhrirPZ)!dp{utj5yN?P@KA-|&@;O;IE)DuH zR|wLD3e)Wf_-7%K4V4d@f}$JKZX}@H>X=l?R0GOAsZY-qd!tiDw<$9--xnM_Svor> zFoZjKa@n1}5_{!MunV6D{ck$VN*4M}=R$(%7Tu{eoHbEf$wq?&~JgyA<1#aWXYlx%Dmxf|)wE+l*X(&g`-)wW3nS>k_1-6khFf zC(`w!hQ+NOl$mKAoa|Ej60>^WEfn7`1a=U}%7tZ;%dQ$)10do==Yg%9=#rw^voYYO zmIWIH*aZ2@F{sb*c;p^>tquYUy=PqzC-X|2FU4Ds>w_H*0%LM?m*XsZn#L3iRgq`o z`zkRe8=QUn(sws+I$XQ<{&3+g$@-wPmczF@TSj2v@#8(~QdbLure@E%Y1*bZQ;B}l zrxnEuem@MaoK&|deXu!h6CQi_oT)t_L?Tawr{ZCZ=Ni$2!4h6b7KZb=!X`nmDnQKS zdBO`OgtcnInKisYP|NA9OtnnzH0XDL1Yor~G#YKPO0`3c-RdIs6g8)|o6P&JUZ$mb z4saHBjTRM^Fhz&nogKKK2@2t6QBfGZ$e-*IH zvZ*UvlQ_g(Fr+JY$ywgJ>Bx#4fZjsVDyj2kaT?_s@JO{7u6< zxBhO~6MdfNS2jQW!t&N9!?i>)d@|0&^4;OvpT7J1(cHe1CtrT`-S=NbKVd5_Kp?K5 z_@IuQ^IY%{Pt-*0xoRTLr+o2a{#i1GS%^dQCeCZrEKII75BmUEhug?m%r$W9&^nH5 zKn<8o!KH*C#EGB-ZU*k%O)5GFH5E@kfb9GS&qVFSeHZ(fotRmPnVr~V%H=-Z`1e0k zD{=S>+5=B`D)%+$eGa_2Q}4ujs$)Lo45XT8>0eNBL2Xb^^ipbeo=82pMrpKYZN?OJ ziY7%nL^DL2uY1s-PBo^Q##_paWu~&YT4SxLHg1({xptLdwRv^iM(tL^Hsdza9p(pA zd(=n7!-gL7SE|p=-)j5B@5~XW3zR2~2%4A*adxxGlx$R);YF_jRV!JoGON`plhLTr zsAZhfu18MMNwSgT zIvA8dLY$)EN;MG;(Lj#QEIkaC6m`W*Ye4OC*u_5j(U8N&j-hPg#q)N04YAh&(j0@3 zjT&93kV+*w1r_N8km+xsdON>*+6bPj5LuikUH`OzDAQVM?OAS5Ktu+ z1a#ezFAl^746*y9W%R})C^LRoohi`+jshy=^&(M53ddUwK0zI>KmL(F z(e3|hSGaCuQudlzdErHS#nhzuCHe$DweP{!^=p=sC6`}&VN}_4I?qLsFSz}%db9Bd z!CUx5bK)@Njmj}evl2szYm|2@HzYl6dM@KQr&U@VHf#38jQ6cVJef&|n1fZed5U?; zd8&Epd763J#frts#j3^X#hS(1E?-xQp5AUwN*j_iS5>C2_Eo30cw3U%l769jM00QI z{TcUVKc(8Mc{1gx)K1^;e3k@CUq)A8t|BE_qv9QsFOFAdCOGJMl+$f5vQM$kx4&RN zWtZvgZhM3Mtetn;x7&&RFqw(sfDJtx6h(SQDdN*0g0Zs_x?aqdJhtJxbcQ^PGv_7L zC6EMXoSb)Ns@));CE0@}Tb{j}+|(gYN{5^;Is>QEak?Xit+JH#yo#J-Iix73Er;ZY zARZ(kDM_Dr7Ge5P13~t|{g%984MH@(Sh*pFuQ=CXtgRYNdFjOqIuDVGwvOGrW3q-guPg)oK)Jz_wFUlq#8@ zk4J7XfnG$TCY{2lM>jryx_|w8dNXYqy&`ed#Gc|y$pk@VNWqV8oWnx}Pj=u|)S^ zOjtj8+^ST!fBY?rY}4jVEAToKOsb^Zk!$A7-8K7px=%EOr^??G-b3TiZ1nHoY~CYE z7LO-6Uz@8d)=jXD@r+FxJ7L_c8M@VJI!kgI_9@d7d};ZPA%W4!vutGvH+g2I&6-d) zD`X2LFHBqRSe?+6w9&S~u`S_F&t{)pCzk3EH=T;ODt$_}x>QZna?4>d9*ss5$>FZi z!#I_j9)k?SlE2YU{5`k?rI5o1v&JXs&g^ad(qSJx`Y7+c*hlBL7iEFMO^-K$8j8x#_Zs^@qoaFF z^h9&u3Rgic7qvbY3^C^CktA;-PX$LlS4t|#l`*+8DTT@?M&tp}(h?`KGm#V@+n1M`P2Gc zxM=rHRSzy2`1=&NtTkL_*0wf4-qrcdvC>BEa3VLg`Ke0|@W z;g3IgBR$2AC*ASD=nZc!+_H1zj^9&GqlbOzAF!i{c*To)Bi1L{12Vem584BB^*i~U z3J}}%$An|DWAZokN`250aBwDNoYo=c<6-Lc_-?f#%Q%}alb5OI=~_5nmQq%NwfwyaP+;y6A+m}C@z2#JppCV+5b5L z-9ms9_+bah#W>eWH;w{;yj%***oN?fpFElA%t-G1WB49?=SOFTg})@JIQ-qX>`}Rw z!YBP)tWDJU1qgQ^|&9S%~XaKy)VlZS$Oo84@)*=_N0 zdb?w=-*|-VLP{J$8nP>><{WlAhvRLwQ=ksOs zJr3UWP^FS;&#ig%WR;$q(G#DjBG%VCfXd#!tKT7QW>%HK**0LT({OH@%kM_H(qK0p z>1^n_G5&hdbkk&@{~* z+z(K>x&QhZJyPmFPlC0{QEU2tNn7#Q&aDSt+_Z5&4va3FJ8BF#F7e(gpWsg)yB`uZ zL&7i`SzI=kpZn;ae|NO!^;hukS{}Zux#gj|o4;?CDZl$SzWcEcX~L`cM9ah5T4(}D zoa}xHlQ`pJw-dgPNu0X^-vmg&siG2R;5vzupeoSBKN8+WIw-X+SmDrPvuHNQTjS$- zUgXVct2&;P99AS=fwm8!;-!#`c-!{uJJN{1VgG98u zIL_!&E8~0;a92lL0#4BT*tb*8YZdEqs##xqeG1fSlStW}G0sewW?c}yGMq<%*`X@D z1rK=>kA1EyeDLV0aL=CCaKaxy#PO@Xyyy4fKaw|aJ%03f_*Z{E8{U23H9Yq>;eUru z;XEAQiPgUde;Tvo2y;Of(*tHU1bvblk5)JnsO82Wy7Wi^>c0{z9qt4%X1Z}*^AQcZ z4jZ!{vCVr37a#p5npf~LyUk%EGPO#h(yD;7Tg(=dg_Ff|Ru4Anz_Tfw9&Aw=Jctoc zI{en-sM!a0U^-wO@g{q6VjpZU+YkQkxw*HNwKPv&eb32_VIY@#el@tb$J`@(Mt zJ#h(>7KBfocqSa)TbZ+O$l&5HpZ@IM=`PA|AAxbY*-ekH_8ZldIpmw-@)Y!2d%40a zmn(>z;}lAs5T#tfbCOIZluK$X!OmHsZdA9a1+_vcMQ>ebpk(YWNYsQEyD5LMkbP?b z=wRC%EI&RodJzlzDZ5ex#|Egra&T-w5zL8#IRQDaerk;Y&M!~QiGnoN8$HTWdjoQv z8Jvl}Up#06Fd+&i02oKX|Lh<5-YT{dQS95RTnxIa7aJaVl_Nc`UI`05m)G;_z8}lC zU2cQf9|d~NS0L}wv+WDP3bh&pFLknclDgO|QzqCGGSohEhBu%dV!ly5);vo-M_r@- zUiEF9F4LQlGQv9|Wm3wHjNKXXA)X;=MHyq&V?D)bGdwfWYUNd)s1~=%I*0})Z}wM zb|!wls4%v)mRYUL00QKd58y+XHP^7XRne%ICQBw~rlt>*ZHo zrYD@hR}$G*9m|3$pMDNMNAbFXXCG-;fT;5L;fk^Rjf&;^r-d){at)$~V26WFnbPbd z<&p(UmQo9$A2PIAIE&UNsj!NDvjAmP<#Ci6fs^>ldrL%M9G9Z3gpJn^@)is%%0ieu zg9*U~zT$Xw`0~5I4}afyeB8dZ?;jL;uI&FPeC5fzvGz-D%9W0z2NoP>r>AI5cq*xY z9Zy6z1XU?|j6|bcA&T8Nw-fEsDIg3QDYhrhd()TXy?|sf4JOt=Iii3!wST)Zw$YTeNmB))(1;@eyn$vccHggxj`wb zb+ihN%4YTL!tH8VibcuUQqo!q_Fv9Gm?E8M@E7x##8;* zn!_(eZL8Ot<>~iER85LrMUGj=uiiBVMu|N+Q9cQ564DBoJPhzo;@k6P^TI_Nx6f|- z?Y8hQ@D1yS-Z*jWZI6XN#Pv7(M$a8K+NXX@G$S%3}us>|-K&SIi6kQ^(2o z$B*~Pgr2^q$=vV9lFq&osJs#Vg&)qpO#c>RP}4@X^MogulMCc9nG4B0ncE=*aStv< z0xk{4q32}J0f83EkV7E}SZI|qdFr!rzm3$6g ziEwX{_2J4+T!afd!wdV*+$I2SOk{R2&1b}RY*CXmW149wF5reLhAM|@hw1W-1tyiz zBpE$1xQyoDRwFaZfG@vG!RB9{}iAkw4nWONyNSYwCB+Y+OQteP3Q*odvbRU=>J1y)Es$^Y3u~a-Ia==LD2UQZXo8yjq z=xHJFafiL6uiW;jy|=u#902xb5q_vPTz8_+v<9X(L=8>X22mB_MC=o+eu0%4oYZum zwS%r;59n<10V7o*;sd5=z;{Q!I2a#LB*q8mm8A}6fPE+Cb_PtKS8(98I*YZ?WVBds zP$&W7cz~E%k_js|(HKx`55hk}Ka4 z^`QJxR~RGqH?YXte@`*}Zu5M7;kSx-1^bJ7Py96{z5lQ4Q7b*OP{1t5{+=u=Cm#`> zj7DGmBYZ#jQ>znX5GBlt^zqH;cKSCFA>0IR47km*XVGT-D!Luq7GV~eC%lRthxnc3 zSu_&Dv)~HBIe3IhX?}1M!Hvb6(Oigg06ZPsEO0ZSt_L8zk>-K&W&B^!9tbz`&!Z-q z4z7fT(1#>i7lemsf1phnggxL)P$nDtp#=CSginBb4Dwb&o`n$iEZ-bCk6(>E0deDF z?R*UV@PI2)xKRUydU*m`LHi*KpeiW$7`R8^eH0xVE1{qEn^NlBsmrc3m4)f`_lDN$lr=`jAqE%yEVEu<}knMf@82dZ+uN_(O zUgw;IIj*5@jXTBth$Ko6d!~E#d;XD_o!FTe_Kr+?fX(CtGzWCsLfG#J?6X;D6wIGS z)yLiu8p};a^ouI`3p1Z%6rf^n6egf1Dq=8)ZpM}v%p(Q4$afg8lcg2`i>Y3 zBq|P$!34?0Au*UkS>g>bn1?)dF<3wvaajzOLH@NdSdJEm8)C2mnZ(axuo4xE-^E}R zsWgm;!D=+vv}@q6Gv}I4$6zft*UZIW9m=$pLr*YIv97V+$zXxbi1mI3%UJv~43@L_ zP6jI&{4#?njfJi6#9){s+uJc1=E(M842C(feHnvcj_l)NFwBvCY7B-sve(97m?Qg& z7z}gd7#@RRjvSRS80N_Fw-^j_Tzj@BvCv7{VgunAye%Bu`EvpgR#IF8lxDT6I6{#ypyY1vfF;CPxRHQKiX znkUuGU^j#P3{GPC3mBZv;9>?3qAMeHI)xRi|1p@gl{%lonrQqI2D7oGu0S);Dv(=3 zXd$XZRS-&OFSr?~hQTGM0WAgB63Zn4$8A7O08_sb;%iwB31aG?d?r9+SbXLG!Cz#gV?+@parpBPi84KjB+ZWHyHzcZ(=F6j6$b_-^zL&orfqj(HR)c zdeXwM+>f^==!*ooDq}PlrKDPh`)Wp6l-8EAwyvd@s#sl>tZ%erJ*$!Sy9U~?XEjE# zFR@-%vi7QCvk^_9y>5=pMz|>@SpQpDYZ7bW z+Ftd~JjD%tU%~3GxrQ2O-Ue1zwC(=*D7IT-7^#X;YV(iswLqOAhLu_fqjgusVpfI{zW5PgnHv7`CG|T;=kWY_6izAu$|Q#l~ODX049pX=H0J zN{vfd$>>O~rS94R%AzZOWo%~ZS#Kz9E|0CPDBr0Y=tn(!yGp$+KiG+ye=xqPSQ`si z4Xq5*)z{Hx2rYy7e$2MA|EHjTgbNvMON<6qGTb&Zx@#HWC(&7_eUGm9mKfKFuBPS~ zm0jhY(bRf2Bb8`1D(vZfjck>y8W=@?+e;bGr0JCm6HT!;=o*S* zv4xfI?{R0b0st zD8$~H(R@Y&(HYMi$oc zI{1_}$H7ie3{MG*oq@FMFCwWJFR6{Kj~_}s{qfOt62)j^4ChyA^nbUDU7eYJj@&=b z3s~wZ$lp59X4L?1i_-Je{peb58RZ;T`Dk?g*2Z{db8Jm7Vzq<@cp_b`WwF-i>Ruk> zr3(gjqiCBg{{v?FdFP4&?i7lxxX=JiH!=Rv5?jv;WAyk_`08JU6l0-lYPq_Kf81Vm zYzL$ixPWoSXs;KN__GH4~VS{K81bBu@l zx3($vXF|+XKD+8ia}kP38Q02OQSM#Ideq1;TN{&f{x@?j#b|NqHN36AUCK$S8K!Hm z*+rVJk&!b7ayMN=w^#S>{~1%XclE6Pe!6P7uD%s){+F=XyjBkF=Z{x&HbCB}gxbn5 zPV2837*Dic*HU+VjH5>JA6-?AG5Wa5d9SCT|7k>5>0<&L`;TX?U-qJVPADd!MMo2r z_o~>eF8#qAH2nbIS8Hx&(khims$=`mawZ$CK-WrF|L3#cUtd#9{;Q4YIzJ`F{dgXu z*t#mQR4tnvrAUig2hw^y_Wz~0ke1JzGPqNpa23Nm~i zDga$e0)H^P4FU}@4_r2)R)U#mVk~Di`@ekh;EBQoC>I`%-30rm#=!x^g@LklabLegGoMoma6X;|9O0#VZFhNi}brplJuhNV(tT~($urn05- z|0GiutxTHUP}fRhnxzR#q1@m=AbSvaIhoSPx;klE?V_5NW@%ceIn=Z~R6Vk(wz6(o zXi;ljWmA8(!&sygiybyA)YMEH$jKaxpvXg3@M72D#%q?3yJj& zO(ChKwZ3vGbYH5fscfpOf?>c*ZB;XjqjISPX{+e?YXRkrFu+h%sJXcTnxg}%g!)^n zYNXm&Rdn#JOGDC%+LjuIhWdtvYFe7Y(CrrJNEINpxj(LDMQCYDZ3uE#0npmCDpO*Z zZjD`KR2*BjPC}62!Ciub1J|sqa%GGA{}IZfypy+%PSKMkhA|f4L%!58-Ms*Vk5?*HDEeIRvok zuD*(#rZ2a)vepx_vQ}5dZpK1SP)IWaWEb2o=F^HPg3*c^(C&3-;E_bAs+t?@<)J?5 z%0qD^n+rNc`o_YT$sb>!4t0vRE0jPvieHmU?`ED z$e403xAO5_?<``SqS#?kWx2tgRTy2)j+%$EoW6j#xfM*D{yZX`MSg}=dCsq7EcVWr zY*8E~DTI7<9Ct;yoi=E3sDff#x!!(sokIY&az%wUymE*}33HBkz{X7dNTgF@sVREh z)#Uh>o!&vwJv_tWVETq>_NgysH@yYH_b@7&#-F65Hml0YFaautvwd*vwI$iSr3Lxz z^rh`V&sm=8*CUsJ{Z1CMt(Th4FLH!E!D_JsipJ77TzXgixabAaNd*y!l%H_4x!v5W zS?!nWHa6lm23Q~u^P7tzeXA$7!1&=P^DURrA1inwOHJRBF(GC@1-mRxg{^KfPB~%m z)tDur$N*Yszy$R$18qlsOq;#DBDF9Llj6q!eYQk?7$k%}X8$<4Ij3NSU3f_u(v&9D zAC8JeCD1!=q-*Eq9eWt;wD8rmmS128yQW`V)0PEnzm`)oVv*~w&u7U`mBJmVI3R|Opy~bY+X~3v>6KHaW6U6q)_OxrZ!|4B zq@toar||VviKRXPC_og*v|Kau6d*G*Gdnl=T7Zmp^-FL8#fba|qpSW8_$sf2thD7+ zm$ZbI{F-z2DqsbJp213N6>&K|_~7wtBqmR3HCHFw1P?k3B(_>(-&5tFuSvb4;~0m) zp=GV9aSc@@3sW~MQ;`JiC(~c7#KVSg9Q@bHSU^V6JuHJVWjfVe2q^&b>|qd}Hr?R` zzu$awwDQ|yr3S=YTw@vHcWL|wE79_Wa!%$OsTy1rTenEeSR_Ka( zs95{ zV`X^0s`lex-w|@w6v1JI)L2D%fSVU-J=>)HD)%vs8rMucG|C2 zwmPhw4oa-j1EImaTj}h0C3T=aQ4J0R&JhSjb>y0X{hNIzQR}+2aG~QhII8d;Z$Sno zaSSGN@=;@g9OAgZ zcI73_`sTDn@Kl2T_yOWBB%|=lz%|1y0&bJ_yA)5v@4SNQYhOA?U>gyZH4Ho*~)`oQRt6L(kfzSWf-edQRO?pM(^C6C$<>Urg(f@n+C_sYT(kx|3G zd4QO+UCO~FzQbA4`}QPuVM}`&If~!lRB-$B!#gdSCV1P(HN#hJDB}-BNXy8!EnW2i z@dBy0*~1TVJ4m)Rejda|0SNv8=t7c0u5YQ<_9bB8AkU1&Q?kct%jS=%h4LEcE}TGz$Iv=Lz88gxl$gFmYI#j^<}A_TNxrvqN7AY= z=5pKiN`9E=ygtJr8^TuFp}|GplJN+tq#!b=tmxgOIHGg8eTCK z;FZ+>zEEXV#$mnsrrLRyV>3?*vZ5cRCReO@nvUVD(}I^WJFQ5UodMRG(M#}lOCwDq z(M#z~BSB04O~;Hx@I|KJu8Kn)C;@zH52(gtuoXlhWGT*06U{o_R-h`)m6LL-=35GM z2HAeI|5@;Rko#UPEaSoJnw!oVKKN%E+xItEfzk^4thFm5;GWT|oIQ`7s`TL4&4D4g zGozH?rlm6>3O+HK&f{uxx*^nqT%m-g!L zZLWacUhiVS%k1;+szx3`F}X|pG4*RoeKFeQpXb{CE%s&`fxFM%v^h8C-urVl9 zLL3-uwYQ#IO5=a zZxsDZu08KLw~&YHGHd7_f^#PWICt`->llY3k5zoyLw9l4BCr<#3AuTWv+sK{hq@s3 zS6c^`R_N;!v-a;N=W?q!yKh{oa1Xfm=P$jd~&D}ZKGFN zANIG_LLZJfO&E)njYWyw?Pu8{`mUKt5}lleDH>EXPQwbHD3~2X;|eWL5|rv)yHiN4 znqu_f!QwmjwHr+MmCa3UrTBbSm@=v(nK{r7eV}JQ_pIl}K-qNTP4UyDqYY5yQ^pd# ztJu2prZB5rZ_!QmbJ)s7f8EWSmmX)g{Z9@z2A(dsJq_`6D>x%5Q;}q><_4ZEcC1g8 zi&c7?+UKm&E3T^QxHalY*b84G$PoRi4ZOQcL+|E1t&CcbWlUE=cK7KwCg_8U4%Da; z)M@k2;ro-VppY}Z^PmkT$j(%beHRt@=B3sZFLGBjf(DQ_A8AtUDc=3!>&egb^7#&f zo_xYnT%jrFj_AvdRPaR%Ll{hqY_aeFt!|CNz{PpW&eCeS61TCB0@{!P^hEr&S%c)< zjvE>71vynMcM|&*%+O_Ue&miBaaRpTM$C_GL-i^skUAEXa}{lEh4H`_qwfYJLxg1% z$hsq&5jzu^hhw=sux^hpOS+~BtI=E`$;u-DWVdiY>km>}%wre&%If+?x|qBtWg}Jr z^IcC&gc5U8HC%Is%i!KRRkuFzhmf&{uq`)MwGEzw|* zvoCQ6Q)_OP5Xx#h@mbg?zpjRRakj}nOPv1Oz^17tbY1xy$oDmlSuA~49Zr*uH<2Il zc^L4V(dyy%>OcHcWFP#%9`(70YuTWMtsVAl9FO=hgT@q?z_amrqY@h<@-DS(LU^eynEkvI>t5f;$L z+DO7$&Es|7bCXl-uzQp|MB3nwT}c4czj-vChmhBf{d0QLXk|FSW&|2_II z1pL^+(cVbU3f?tcJ7Fj)jUNI=?g>3Kp#N5T#aFB*hTB_QXDi$F;x*19vH~L9X3z_- z*P$~S4T2_YQ3da^N~~3M%jP)4LZh3dthWTi)A-0UFYnH5p^49NNRRm9^)XuIRYx0} zVq8#t;jY(t6M~`0S8hk+T4Amib<<#}M z9F_OpvxmyImVJ92Um7UktK8S!(P=-C?;kr=)a|Pj>7lh^P}bsFVO6&XT}6KSulC!l zMcV6iof;m0&kvYAZK}Lk0BAaK#mL*(*Fa5m2+In+*h3figt;(H=pODfV5U4PzbojN zslRGmjDN-g;oNgI;oc|PvRthmYTR=jOT0*C>@%GDQQU(+?b*mPTs8Jf?&)@^L*4>= zHo(vK2%~~~y6bI$&;AavDIGV_cNSwQ9Y3S*4%;VmSN3%G+L?T=8n0aX`zCd5ow1(d zY!VEf&*~+WAqJ2Od`x?vjAi?{}7Uxp7H z!@k@uF-M}S?4JUOgHa^^rmTSfQC5GCYtH@~^826I*h+4;MkEZsaj@YT1oa$@ejkxA zi2M`6TiD24PsK@5&)NZ=L0ZqjQOH!!o&Nm=TdIFPVH9Qt>>zZLAwY#nXvAptoWS*eh4K=8>091M&g82~YJz%xiV>RFl@ z2w0m~8j(Ow3F+C28=0AyI{w2Y`2UFHx5|<^uS1skl+wEbg$+Ut`lXVK&wrOalMsW#B8t>MeBWp-qw5asaZ z$aR;}cd=~|nMDqcVU8E@e#kQEzZM4xo)q&ct!UN47sExalzJ+=HQ#$}S=(bgWBf#1 zRlRXjapT=z5WZQ$^UW~i+i2HLFOCAlQ@6NQpwE|5a&sj@ZJA_du;qq6914EOyW>}e zqxcffuyHEv1U2XwRD)tID)Zw6-agN`wh(HJEck01H5)06mZh!R8L;ZCUDjqzM#^(^NbaimC6PUM2~-t7 z0~U&cTirJW$1d~k-SSo1+6RR=+nta0r6j=Bh0#21&Jvr0y|amtfK8$cSoF~+u%c&) z@x-ZjMyZaF(uMOyz(IZHYP`FW0Kx&(dj>g`kB7jusk;)RU(}I|rtHr} zeyweYB)6#u44UPuk0?0Q04QzC+U%?jl(h%BOLIWBNH^eE^Q~{ z*58-Gw02LGUJcuK%VmIhd77MV$CjP)`pAyXtY@#T&uQ;emUHvIAe!2GM@LwvWsBZq zng1Zka}F1XHWo+xLF7m6D_o71EjyF47$YhC3_HwXZTD&x7_C#=ULt~rjB3eI^?Okh ztxsQ*zm7H~)zP*M;LgQX zSj-I7Odgt%ZtUOjFZYuuBLs=7sWg=4k_8`b-Z@Y8@8-BK_ebs@>>2%VBNuR6JnWZ8+dK+pq2(@xwv%>z)056ZngikU6!DMNtA`zQ_S} zYOm!iym^7u<@5Lg3`kG21~(y|awa8lO5a^$=-61)lM+iZxqlwS1ojCP!1`<7YpoGN2u|ZNU>Iv!zU4pXg06;B@v$Gq~;cTO4~BW)}e|16f~Zc2#NU?Q>z?idP&)h zVAo1pj!<0eh|01~m%Wb3$`wJt;#3DENENFr_K2GY?GVZiz_60nbc!1nenV(6`&uv9 zl{ZXAB4E|t^-!ra($JZ~V;`_YN<1;g16 zEF_jS57T5-GM>02gOaF&EvDKk)X+Fxu>xg zb`b8=Nrr=kgfyYro^@t75H?$X3^hQ1NDCJIfJiFX{@D-~|G=Pq4Y`2=_2`=U)vk>SS0iPlhbQ!M| zKRMfg-K0)c)Z*c<=7qp90#)u^5C5g{bXAC1RYn(CiprRO~of2Y`&7%}}wnnlgu{WB8-=@&X$P+3N z?A^jXk*@kC2ZcQGyk_F(ff0Pp3=I@s$)$uLZ{ZQ@s(Lwiuf@-i9GGmqw3SRQ_lo#= zKQ>+BJb=2Q6CD>`1is7?A@E6O2LZaf`-4|DsiEq;Ly@d|C)|M|4#VCVz><8{*aKED zY%0pP&3pCL2SfyRTfd~P9GAOW;p;LA&!ul%x`esEEcO4pj=tEh8<1g$1f(Gx9pVVz&>^D;5n{#56GD30QFHCQy$E>G8r0OtWkzv8HtEH&$MkRq?j)oF8 z?IqpX_&iB6>acjgIdCMbMcO`Y_;Y!ZvvBf3xQ4cM@#ku$Fm7Wt3_!E9XmMGSOp7Du zgvQPAw7_&lzAnV>HqQ$>#KrN2aL2f-WF zK5`qy?EB5SxhE( ztL7YGbOqvl^qe(OAuZ$M2(oM)K_*H*Xr#(VtgrJysPbWB!FI<~j~v^E>~n(h5?quZ z8P0U)fxQThWwX$UnAB|3fJrT->CPkR7y;LzFqm4z*~rA4UP%Z3eGsM5Ecvd|&W^oq zZN1(q#Ul3&>lR%f!BXM23zJWJC>^aEdRUsG1GzcF)U>BbkPKx;%Z~zjN1|lzUIJN3 z3BD0b6-${Q83PJ-hHK7Sn3=7}lmrkNg-IQWytMttqePmCUbTfba|jM_5oKH7jdpUc z^ivAM$M_)%Cvs}{6iO?{4T6NJ)Z%E#RyRVA!maOH1Pkd{W%2QDD)Dalp>x_y2t@n6 zL&Hl#E*I(a`L;Bl#EbPWJf(sjs`5#0htV-^mzNsydxnlua8v9$A_iT7lCC3Mc5C+o z94C|jQ)w!Xyi67ua+C9F8-`EDN^Q0|(C-CJsH1AT^Qy4nJ<6 zq_n34R1UP!WyMF;S z3i?Dqi?GwC1By!KYHbj1^hZ-x=*Q^->>kDUxLh0QYd>~a{SQS-wzZ(iMUra;(t}W6 zC{5-Z+BWK77Mo{L`*B#s2d-qdz31P~zgr>YTlo$3W5NO|4o4YM~2&+ZGomYfi2ukA|&T?DWwMmQHRj`Qk3W0EXNV=Xy`<7r)+*n?B!!`o4+! z$f+BTB`O%nx+O9rjHEWa;(NlZ3yGCPDbl05PZzog-3`8DcSkf6>J#?@ea-ZI?qcMv&nzg+QpL{M43pL3jAi4xtu(Y4Sd z<7b%sO(qq!#l^`jmg#pF`S;1%s^&EssMEvni|G%+Iki6#YcJXxi>3Rkx0NUb+gqUk zvy~a=>_;~~#!J4+b$$S;{K0Ic7m(R$*(H5q0v^`2VM_o|Z27h(MCaPK;S6r~gzVO> zjuXdKb1)wyMZ!j9bi+oc7&y4RC?sVXDwQ5J3t1LaKlW<6>6%q6xtyHDJ$YNJqE*(N zpiykE`<_;-&&heyaQ{LxjQ##K! zOJ9*UOCM1jGRqeSl!rRiZq3d%pxln>oQA5@-3`rf<19T^=GPJlebeh`gIt#aj1 zO>lihIh9)CvS&G51`ZxYq3{Gn$(kkaNIQG(nK^kHchqKR^o1ljdhQ%@rH3I$vLU>P zDjc!ONr(+E%5JV|If=I&^{yfhXiBSmIg%HfI9)zOGe1e&ent-+4E22Y%3mJ)5BtvIaff;>aO9k#zrki`nt zmQb=Pz0<(pT`-?hcO!?Vfo|@7LTYu@|l2bf24f2XSb4CWXm&>=s zf|u~t%L%O4Ytq; z$I-mZ4B=E&Mt6hJ(2P|^RU#NpfoMOtUjYt)Wd4f)jtxAMmRzLjfKw4birm!&!`81? z^%{o5vMYm*fE^ZZdPIt(Dn|#2wX?u|Z+9FB{YiVaqBTdS&3^Ozhph;Yqg_)v_>i5ov@$Ii=@5S!X{748hSSLlN=pT{ zl81P9Mrb$R$($-g>hQCbSVnUL5$D0THY>lypRcSCI+xxhw-zY3k;7D~Pvx~2V9v63 z9fWJn%7&xmOI&!hA0zgV1XqQ9E{MbaI_eac5~r&`#y{Cq=(>fM}xml zogG-KMa6FujD~fU$|+WER3W0!X(CI3SRK^5v){e`%E6jb7P&HBg^kts`F+TJ(9pCy zGQxZJb>^Z?e*Dj`Lp0u&Zp%#}&M=*=6~OX*rdj)FTh#5Qj8Bck&p{oMFyF43DD{lv z-9I$a*~$la#-6*wr1#i*~WF5$e*t!d_UnWw)krYTo zo&2Irj_g%bM~sRlM3#seWV?21@y05ji1K`%CG5D!ydrXf*WD@Ja^g}4f7><_iz?QI z!xX#`2%vlF>ZTFXQy2c}oWT;gN_*BKaxu_V-h1JFpB$MWs#aoi(+M@Ol zM20u!mq?*HKgA{6%^Utcca0PHWe~D5x#scRPt|blcicZUW8=FQ;KO86UaP;ByU3}K z3Ko4TC5);_&gzb3rZkEJlkvZKb;rYxHI?x?uc!8Kv=$+oQt9oaF-oA}*fz%Qe&*O_ zhRyYs=&e=sCF_;_W3y9z`LT%xJ@&5YWYrSm275aDuNH5vg%Qj%B!qb1_5V(+tG$si zJcN{%37+xa8woob8w(qWG0DGW5GL7woF%dTKN%3h)B1b+4;kCv=&`dg|Dngk1cFf7 z{&g%9Gb8X%8_bOCERZ(RUu;0sfJ}eNSV15N-S1!Z*ch4qYb+Zx6Qq6iS3MAr@xSH+ zaWMTUV}Yps=`%zIgmiiTG9L?&neERwSbz`~>Ob{Bp#RDrD(+H+>^M!)NiLBYlb(tZ19Cy_xy7}71|X42EsGcaUi z)i>Z^XE$aBv9TB%8W|d}KnQ^K4VjIZdH+8u5RzaCYhxP{NF74DmjC#1(6e{^N8y7Y O^~3~EK_Mb53jaSjP5OQS literal 0 HcmV?d00001 diff --git a/account_invoice_import/tests/test_facturx.py b/account_invoice_import/tests/test_facturx.py new file mode 100644 index 0000000000..1e9e29e52e --- /dev/null +++ b/account_invoice_import/tests/test_facturx.py @@ -0,0 +1,155 @@ +# Copyright 2015-2021 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + + +from odoo import Command, fields +from odoo.tests.common import TransactionCase +from odoo.tools import file_open, mute_logger + + +class TestFacturx(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True)) + cls.company = cls.env.ref("base.main_company") + adjustment_credit_account_id = ( + cls.env["account.account"] + .create( + { + "company_ids": [Command.set([cls.company.id])], + "code": "758FXADJUST", + "name": "Adjustment income account", + "account_type": "income", + } + ) + .id + ) + adjustment_debit_account_id = ( + cls.env["account.account"] + .create( + { + "company_ids": [Command.set([cls.company.id])], + "code": "658FXADJUST", + "name": "Adjustment expense account", + "account_type": "expense", + } + ) + .id + ) + cls.company.write( + { + "adjustment_credit_account_id": adjustment_credit_account_id, + "adjustment_debit_account_id": adjustment_debit_account_id, + } + ) + cls.expense_account = cls.env["account.account"].search( + [ + ("company_ids", "=", cls.company.id), + ("account_type", "=", "expense"), + ], + limit=1, + ) + cls.purchase_tax = cls.env["account.tax"].search( + [ + ("company_id", "=", cls.company.id), + ("type_tax_use", "=", "purchase"), + ("amount_type", "=", "percent"), + ("amount", ">", 5), + ], + limit=1, + ) + cls.jolie_boutique_partner = cls.env["res.partner"].create( + { + "name": "Ma jolie boutique", + "is_company": True, + "country_id": cls.env.ref("base.fr").id, + "vat": "FR11999999998", + "invoice_import_shrink_lines": "single", + "invoice_import_account_id": cls.expense_account.id, + "invoice_import_tax_ids": [Command.set(cls.purchase_tax.ids)], + } + ) + + # avoid warning logs pypdf._reader: incorrect startxref pointer(1) + @mute_logger("pypdf._reader") + def test_import_facturx_invoice(self): + sample_files = { + "Facture_FR_BASICWL.pdf": { + "invoice_number": "FA-2017-0010", + "amount_untaxed": 624.90, + "amount_total": 671.15, + "invoice_date": "2017-11-13", + "partner_id": self.jolie_boutique_partner.id, + }, + "Facture_FR_EN16931.pdf": { + "invoice_number": "FA-2017-0010", + "amount_untaxed": 624.90, + "amount_total": 671.15, + "invoice_date": "2017-11-13", + "partner_id": self.jolie_boutique_partner.id, + }, + "Facture_FR_EXTENDED.pdf": { + "invoice_number": "FA-2017-0010", + "amount_untaxed": 624.90, + "amount_total": 671.15, + "invoice_date": "2017-11-13", + "partner_id": self.jolie_boutique_partner.id, + }, + } + amo = self.env["account.move"] + cur = self.env.ref("base.EUR") + for inv_file, res_dict in sample_files.items(): + f = file_open( + "account_invoice_import_facturx/tests/files/" + inv_file, "rb" + ) + pdf_file = f.read() + f.close() + wiz = self.env["account.invoice.import"].create( + { + "invoice_attachment_ids": [ + Command.create({"raw": pdf_file, "name": inv_file}) + ], + "company_id": self.company.id, + "debug_disable_company_check": True, + } + ) + wiz.import_invoices_button() + invoices = amo.search( + [ + ("state", "=", "draft"), + ("move_type", "in", ("in_invoice", "in_refund")), + ("ref", "=", res_dict["invoice_number"]), + ("company_id", "=", self.company.id), + ] + ) + self.assertEqual(len(invoices), 1) + inv = invoices[0] + self.assertEqual(inv.move_type, res_dict.get("type", "in_invoice")) + self.assertEqual( + fields.Date.to_string(inv.invoice_date), res_dict["invoice_date"] + ) + if res_dict.get("invoice_date_due"): + self.assertEqual( + fields.Date.to_string(inv.invoice_date_due), + res_dict["invoice_date_due"], + ) + self.assertEqual( + inv.partner_id.id, + res_dict["partner_id"], + ) + self.assertFalse( + cur.compare_amounts( + inv.amount_untaxed, + res_dict["amount_untaxed"], + ) + ) + self.assertFalse( + cur.compare_amounts( + inv.amount_total, + res_dict["amount_total"], + ) + ) + # Delete because several sample invoices have the same number + invoices.unlink() diff --git a/account_invoice_import/tests/test_invoice_import.py b/account_invoice_import/tests/test_invoice_import.py index 245fbeb3f3..ec74a9dc89 100644 --- a/account_invoice_import/tests/test_invoice_import.py +++ b/account_invoice_import/tests/test_invoice_import.py @@ -73,7 +73,7 @@ def setUpClass(cls): { "name": "Expense product", "default_code": "AII-TEST-PRODUCT", - "taxes_id": [(6, 0, [cls.sale_tax.id])], + "taxes_id": [Command.set([cls.sale_tax.id])], "supplier_taxes_id": [Command.set([cls.purchase_tax.id])], "property_account_income_id": cls.income_account.id, "property_account_expense_id": cls.expense_account.id, @@ -82,12 +82,12 @@ def setUpClass(cls): ) cls.all_import_config = [ { - "single_line": True, + "shrink_lines": "single", "account": cls.expense_account, "taxes": cls.purchase_tax, "company": cls.company, }, - {"single_line": False, "product": cls.product, "company": cls.company}, + {"shrink_lines": False, "product": cls.product, "company": cls.company}, { "account": cls.expense_account, "company": cls.company, diff --git a/account_invoice_import/views/account_move.xml b/account_invoice_import/views/account_move.xml index d988c16c27..5c957369db 100644 --- a/account_invoice_import/views/account_move.xml +++ b/account_invoice_import/views/account_move.xml @@ -32,6 +32,27 @@ string="Create or Update Partner" /> + + + + + + diff --git a/account_invoice_import/views/res_partner.xml b/account_invoice_import/views/res_partner.xml index da8b9b5b60..85341da487 100644 --- a/account_invoice_import/views/res_partner.xml +++ b/account_invoice_import/views/res_partner.xml @@ -26,7 +26,7 @@ invisible="invoice_import_product_id" /> - + @@ -44,7 +44,10 @@ type="object" name="update_imported_invoice" class="oe_link" - /> on imported vendor bill + /> on imported vendor bill

  • diff --git a/account_invoice_import/wizard/account_invoice_import.py b/account_invoice_import/wizard/account_invoice_import.py index 976e21d91c..7efc18c4df 100644 --- a/account_invoice_import/wizard/account_invoice_import.py +++ b/account_invoice_import/wizard/account_invoice_import.py @@ -3,21 +3,25 @@ # @author: Alexis de Lattre # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -import base64 import html import logging import mimetypes -from datetime import datetime +from collections import defaultdict from email.utils import parseaddr from io import BytesIO +from textwrap import shorten +from babel import Locale from lxml import etree from markupsafe import Markup +from stdnum.iban import is_valid as iban_is_valid -from odoo import Command, _, api, fields, models +from odoo import Command, api, fields, models from odoo.exceptions import UserError from odoo.tools import config, float_is_zero, float_round -from odoo.tools.misc import format_amount +from odoo.tools.misc import format_amount, formatLang + +from odoo.addons.base.models.res_bank import sanitize_account_number logger = logging.getLogger(__name__) @@ -26,6 +30,16 @@ except (OSError, ImportError) as err: logger.debug("Cannot import pypdf. Error details below.") logger.debug(err) +try: + from facturx import ( + get_data_dict_copy_for_logs, + is_credit_note, + parse_ubl_cii_xml, + untdid_get_label, + ) +except (OSError, ImportError) as err: + logger.debug("Cannot import factur-x. Error details below.") + logger.debug(err) class AccountInvoiceImport(models.TransientModel): @@ -40,16 +54,43 @@ class AccountInvoiceImport(models.TransientModel): invoice_attachment_ids = fields.Many2many( "ir.attachment", string="PDF or XML Invoices to Import", required=True ) + debug_disable_company_check = fields.Boolean( + string="Disable Company Check", + help="If enabled, it will disable the check that the buyer " + "company correspond to the company of the wizard. " + "It is useful for debug purposes to test the import of a vendor bill " + "in a test database.", + ) + show_debug_disable_company_check = fields.Boolean(readonly=True) @api.model - def parse_xml_invoice(self, xml_root, company): - return False + def default_get(self, fields_list): + res = super().default_get(fields_list) + running_env = config.get("running_env") + if running_env in ("test", "dev"): + res["show_debug_disable_company_check"] = True + return res @api.model - def parse_pdf_invoice(self, file_data, company): + def parse_xml_invoice(self, xml_root, import_config): + self._update_import_config(import_config) + parsed_inv = False + try: + parsed_inv = parse_ubl_cii_xml( + xml_root, float_as="float", date_as="date", bytes_as="bytes" + ) + except Exception as err: + logger.info( + f"The factur-x lib wasn't able to parse this XML file. Error: {err}" + ) + return parsed_inv + + @api.model + def parse_pdf_invoice(self, file_data, import_config): """This method must be inherited by additional modules with the same kind of logic as the account_statement_import_* modules""" + self._update_import_config(import_config) pdf_reader = PdfReader(BytesIO(file_data)) for attach_obj in pdf_reader.attachment_list: filename = attach_obj.name @@ -70,547 +111,749 @@ def parse_pdf_invoice(self, file_data, company): ) continue logger.info("Start to parse XML file %s", filename) - parsed_inv = self.parse_xml_invoice(xml_root, company) + parsed_inv = self.parse_xml_invoice(xml_root, import_config) if parsed_inv: return parsed_inv - parsed_inv = self.fallback_parse_pdf_invoice(file_data, company) + parsed_inv = self.fallback_parse_pdf_invoice(file_data, import_config) if not parsed_inv: parsed_inv = {} + self._fallback_update_parsed_inv(parsed_inv, import_config) + # In the fallback scenario, we may have amount_tax and amount_untaxed + # but not amount total return parsed_inv - def fallback_parse_pdf_invoice(self, file_data, company): + def fallback_parse_pdf_invoice(self, file_data, import_config): """Designed to be inherited by the module account_invoice_import_invoice2data, to be sure the invoice2data technique is used after the electronic invoice modules such as account_invoice_import_facturx and account_invoice_import_ubl """ + self._update_import_config(import_config) return False - # INVOICE PIVOT format ('parsed_inv' without pre-processing) - # For refunds, we support 2 possibilities: - # a) type = 'in_invoice' with negative amounts and qty - # b) type = 'in_refund' with positive amounts and qty ("Odoo way") - # That way, it simplifies the code in the format-specific import - # modules, which is what we want! - # { - # 'type': 'in_invoice' or 'in_refund' # 'in_invoice' by default - # 'journal': {'code': 'PUR'}, # use only if you want to force - # # a specific journal - # 'currency': { - # 'iso': 'EUR', - # 'country_code': 'FR', - # 'currency_symbol': '€', # The one or the other - # }, - # 'date': '2015-10-08', # Must be a string - # 'date_due': '2015-11-07', - # 'date_start': '2015-10-01', # for services over a period of time - # 'date_end': '2015-10-31', - # 'amount_untaxed': 10.0, - # 'amount_tax': 2.0, # provide amount_untaxed OR amount_tax - # 'amount_total': 12.0, # Total with taxes, must always be provided - # 'partner': { - # 'vat': 'FR25499247138', - # 'email': 'support@browserstack.com', - # 'name': 'Capitaine Train', - # 'street': '27 rue Henri Rolland', - # 'street2': 'ZAC des cactus', - # 'city': 'Villeurbanne', - # 'zip': '69100', - # 'country_code': 'FR', - # 'state_code': False, - # 'phone': '+33 4 72 42 24 42', - # 'mobile': '+33 6 42 12 42 12', - # }, - # 'company': {'vat': 'FR12123456789'}, # Rarely set in invoices - # # Only used to check we are not - # # importing the invoice in the - # # wrong company by mistake - # 'invoice_number': 'I1501243', - # 'description': 'TGV Paris-Lyon', - # 'attachments': {'file1.pdf': base64data1, 'file2.pdf': base64data2}, - # 'chatter_msg': ['Notes added in chatter of the invoice'], - # 'note': 'Note embedded in the document', - # 'origin': 'Origin note', - # 'lines': [{ - # 'product': { - # 'barcode': '4123456000021', - # 'code': 'GZ250', - # }, - # 'name': 'Gelierzucker Extra 250g', - # 'price_unit': 1.45, # price_unit without taxes - # 'discount': 10.0, # for 10% discount - # 'qty': 2.0, - # 'price_subtotal': 2.61, # not required, but needed - # to be able to generate adjustment lines when decimal - # precision is not high enough in Odoo - # 'uom': {'unece_code': 'C62'}, - # 'taxes': [{ - # 'amount_type': 'percent', - # 'amount': 20.0, - # 'unece_type_code': 'VAT', - # 'unece_categ_code': 'S', - # 'unece_due_date_code': '432', - # }], - # 'date_start': '2015-10-01', - # 'date_end': '2015-10-31', - # # date_start and date_end on lines override the global value - # }], - # } - - # IMPORT CONFIG - # { - # 'company': company recordset, # required field - # 'single_line': False, # boolean - # 'analytic_distribution': Analytic distribution, - # 'account': Account recordset, - # 'taxes': taxes multi-recordset, - # 'label': 'Force invoice line description', - # 'product': product recordset, - # 'previous_invoice': invoice recordset, # used - # } - # - # Note: we also support importing customer invoices via - # create_invoice() but only with single_line = False + def _fallback_update_parsed_inv(self, parsed_inv, import_config): + if "BT-112" not in parsed_inv: + # Designed to allow the import of an empty invoice with + # 1 invoice line at 0 that has the right account/product/analytic + parsed_inv["BT-112"] = 0 + if "BT-110" in parsed_inv and "BT-109" not in parsed_inv: + parsed_inv["BT-109"] = parsed_inv["BT-112"] - parsed_inv["BT-110"] + elif "BT-109" not in parsed_inv and "BT-110" not in parsed_inv: + # For invoices that never have taxes + parsed_inv["BT-109"] = parsed_inv["BT-112"] @api.model def _prepare_create_invoice_no_partner(self, parsed_inv, import_config, vals): - if parsed_inv.get("partner"): - if parsed_inv["partner"].get("email"): - source_email = parsed_inv["partner"]["email"] - if parsed_inv["partner"].get("name"): - source_email = f"{parsed_inv['partner']['name']} <{source_email}>" - vals["invoice_source_email"] = source_email + if import_config.get("email_from"): + vals["invoice_source_email"] = import_config["email_from"] + partner_dict = self._get_partner_dict(parsed_inv, import_config) + if partner_dict: + if not vals.get("invoice_source_email"): + for contact_dict in partner_dict.get("contacts") or []: + if contact_dict.get("email"): + source_email = contact_dict["email"] + if partner_dict.get("name"): + source_email = f"{partner_dict['name']} <{source_email}>" + vals["invoice_source_email"] = source_email + break partner_data = { "is_company": True, "country_id": False, "state_id": False, - "supplier_rank": 1, } + if import_config["invoice_type"] == "in": + partner_data["supplier_rank"] = 1 + else: + partner_data["customer_rank"] = 1 if ( - parsed_inv["partner"].get("country_code") - and isinstance(parsed_inv["partner"]["country_code"], str) - and len(parsed_inv["partner"]["country_code"].strip()) == 2 + partner_dict.get("country_code") + and partner_dict["country_code"] + in import_config["speedy"]["country_code2id"] ): - country = self.env["res.country"].search( - [ - ( - "code", - "=", - parsed_inv["partner"]["country_code"].upper().strip(), - ) - ], - limit=1, - ) - if country: - partner_data["country_id"] = country.id + partner_data["country_id"] = import_config["speedy"]["country_code2id"][ + partner_dict["country_code"] + ] # There are already warnings when country code doesn't exist - if ( - partner_data.get("country_id") - and parsed_inv["partner"].get("state_code") - and isinstance(parsed_inv["partner"]["state_code"], str) + lang = self._get_lang_from_country_code( + partner_dict["country_code"], import_config + ) + if lang: + partner_data["lang"] = lang + if partner_data.get("country_id") and partner_dict.get( + "country_subdivision" ): - state = self.env["res.country.state"].search( - [ - ( - "code", - "=", - parsed_inv["partner"]["state_code"].upper().strip(), - ), - ("country_id", "=", partner_data["country_id"]), - ], - limit=1, + state_ids = list( + self.env["res.country.state"]._search( + [ + ( + "name", + "=", + partner_dict["country_subdivision"], + ), + ("country_id", "=", partner_data["country_id"]), + ], + ["id"], + limit=1, + ) ) - if state: - partner_data["state_id"] = state.id + if state_ids: + partner_data["state_id"] = state_ids[0] rpo = self.env["res.partner"] - for key, value in parsed_inv["partner"].items(): - if ( - value - and isinstance(value, str) - and hasattr(rpo, key) - and key not in ("country_code", "state_code") - ): - partner_data[key] = value + # if purchase module is installed + if ( + import_config["invoice_type"] == "in" + and hasattr(rpo, "property_purchase_currency_id") + and parsed_inv["BT-5"] in import_config["speedy"]["currency_code2id"] + ): + partner_data["property_purchase_currency_id"] = import_config["speedy"][ + "currency_code2id" + ][parsed_inv["BT-5"]] + + partner_dict_key2odoo_field = { + "name": "name", + "addr_l1": "street", + "addr_l2": "street2", + "addr_l3": "street3", + "postcode": "zip", + "city": "city", + "vat_identifier": "vat", + } + for partner_dict_key, odoo_field in partner_dict_key2odoo_field.items(): + value = partner_dict.get(partner_dict_key) + if value and isinstance(value, str) and hasattr(rpo, odoo_field): + partner_data[odoo_field] = value vals["import_partner_data"] = partner_data @api.model - def _prepare_create_invoice_journal(self, parsed_inv, import_config, vals): - if parsed_inv["type"] in ("in_invoice", "in_refund") and import_config.get( - "journal" + def _get_forced_journal_id(self, parsed_inv, import_config, vals): + forced_journal_id = False + if import_config["invoice_type"] == "in" and import_config.get( + "purchase_journal" ): - vals["journal_id"] = import_config["journal"].id - elif parsed_inv.get("journal"): - journal = self.env["business.document.import"]._match_journal( - parsed_inv["journal"], - parsed_inv["chatter_msg"], - company=import_config["company"], - raise_exception=False, - ) - if ( - parsed_inv["type"] in ("in_invoice", "in_refund") - and journal.type != "purchase" - ): - raise UserError( - _( - "You are importing a vendor bill/refund in journal '%s' " - "which is not a purchase journal." - ) - % journal.display_name + if import_config["purchase_journal"].type != "purchase": + msg = ( + f"Forced purchase journal " + f"{import_config['purchase_journal'].display_name} is " + f"in fact a {import_config['purchase_journal'].type} journal" ) + self._warning_log(import_config, msg) elif ( - parsed_inv["type"] in ("out_invoice", "out_refund") - and journal.type != "sale" + import_config["purchase_journal"].company_id != import_config["company"] ): - raise UserError( - _( - "You are importing a customer invoice/refund in journal '%s' " - "which is not a sale journal." - ) - % journal.display_name + msg = ( + f"Forced purchase journal " + f"{import_config['purchase_journal'].display_name} belongs to " + "company " + f"{import_config['purchase_journal'].company_id.display_name} " + "whereas invoice import is in company " + f"{import_config['company'].display_name}" ) - vals["journal_id"] = journal.id - else: - # we don't rely on auto-set of journal, because we need the journal - # to get the default account - if parsed_inv["type"] in ("out_invoice", "out_refund"): - journal_type = "sale" + self._warning_log(import_config, msg) else: - journal_type = "purchase" - journal = self.env["account.journal"].search( - [ - ("company_id", "=", import_config["company"].id), - ("type", "=", journal_type), - ], - limit=1, - ) - if not journal: - raise UserError( - _( - "No journal with type %(journal_type)s in company %(company)s.", - company=import_config["company"].display_name, - journal_type=journal._fields["type"].convert_to_export( - journal_type, journal - ), - ) + forced_journal_id = import_config["purchase_journal"].id + elif import_config["invoice_type"] == "out" and import_config.get( + "sale_journal" + ): + if import_config["sale_journal"].type != "sale": + msg = ( + f"Forced sale journal " + f"{import_config['sale_journal'].display_name} is in fact " + f"a {import_config['sale_journal'].type} journal" + ) + self._warning_log(import_config, msg) + elif import_config["sale_journal"].company_id != import_config["company"]: + msg = ( + f"Forced sale journal " + f"{import_config['sale_journal'].display_name} belongs to company " + f"{import_config['sale_journal'].company_id.display_name} whereas " + "invoice import is in company " + "{import_config['company'].display_name}" ) - vals["journal_id"] = journal.id + self._warning_log(import_config, msg) + else: + forced_journal_id = import_config["sale_journal"].id + return forced_journal_id @api.model def _prepare_create_invoice_vals(self, parsed_inv, import_config): - assert parsed_inv.get("pre-processed"), "pre-processing not done" company = import_config["company"] - bdio = self.env["business.document.import"] + refund = False + if parsed_inv.get("BT-3"): + refund = is_credit_note(parsed_inv) vals = { - "move_type": parsed_inv["type"], "company_id": company.id, - "invoice_origin": parsed_inv.get("origin"), - "ref": parsed_inv.get("invoice_number"), - "invoice_date": parsed_inv.get("date"), + "invoice_origin": import_config.get("origin"), + "invoice_date": parsed_inv.get("BT-2"), "invoice_line_ids": [], + "currency_id": import_config["invoice_currency"].id, } - if parsed_inv["type"] in ("out_invoice", "out_refund"): - partner_type = "customer" + if import_config["invoice_type"] == "in": + vals["move_type"] = refund and "in_refund" or "in_invoice" + vals["ref"] = parsed_inv.get("BT-1") else: - partner_type = "supplier" - partner = None - if parsed_inv.get("partner"): - partner = bdio._match_partner( - parsed_inv["partner"], - parsed_inv["chatter_msg"], - partner_type=partner_type, - raise_exception=False, - ) + vals["move_type"] = refund and "out_refund" or "out_invoice" + if parsed_inv.get("BT-1"): + vals["name"] = parsed_inv["BT-1"] + partner = import_config.get("partner") + cpartner = import_config.get("commercial_partner") if partner: - partner = partner.commercial_partner_id.with_company(company.id) vals["partner_id"] = partner.id - self._set_previous_invoice(parsed_inv, import_config, partner) - self._update_import_config_from_previous_invoice(import_config) + wire_transfer_codes = ("30", "42", "52", "58") + out_pay_method_line = cpartner.property_outbound_payment_method_line_id + if ( + parsed_inv.get("BT-81") + and parsed_inv["BT-81"] in wire_transfer_codes + and parsed_inv.get("BT-84") + and vals["move_type"] == "in_invoice" + and out_pay_method_line + and out_pay_method_line.payment_method_id.unece_code + in wire_transfer_codes + ): + partner_bank = self._match_bank_account( + cpartner, + parsed_inv, + import_config, + ) + if partner_bank: + vals["partner_bank_id"] = partner_bank.id else: self._prepare_create_invoice_no_partner(parsed_inv, import_config, vals) - if parsed_inv.get("currency"): - currency = bdio._match_currency( - parsed_inv["currency"], - parsed_inv["chatter_msg"], - import_config["company"], - raise_exception=False, - ) - vals["currency_id"] = currency.id - self._prepare_create_invoice_journal(parsed_inv, import_config, vals) + forced_journal_id = self._get_forced_journal_id(parsed_inv, import_config, vals) + if forced_journal_id: + vals["journal_id"] = forced_journal_id # Force due date of the invoice - if parsed_inv.get("date_due"): - vals["invoice_date_due"] = parsed_inv["date_due"] + if parsed_inv.get("BT-9"): + vals["invoice_date_due"] = parsed_inv["BT-9"] # Set invoice_payment_term_id to False because the due date is # set by invoice_date + invoice_payment_term_id otherwise vals["invoice_payment_term_id"] = False - # Bank info - if parsed_inv.get("iban") and vals["move_type"] == "in_invoice" and partner: - partner_bank = bdio._match_partner_bank( - partner, - parsed_inv["iban"], - parsed_inv.get("bic"), - parsed_inv["chatter_msg"], - create_if_not_found=company.invoice_import_create_bank_account, - ) - if partner_bank: - vals["partner_bank_id"] = partner_bank.id - self._last_update_import_config(parsed_inv, import_config, vals) # invoice lines - if parsed_inv.get("lines") and not import_config.get("single_line"): - self._prepare_line_vals_nline(parsed_inv, import_config, vals, partner) + if parsed_inv.get("BG-25") and not import_config.get("shrink_lines"): + for line_dict in parsed_inv["BG-25"]: + lvals = self._prepare_line_vals_bg25( + line_dict, parsed_inv, import_config, vals + ) + vals["invoice_line_ids"].append(Command.create(lvals)) + if lvals["discount"] is None: + bg27_line = 0 + for allowance_dict in line_dict.get("BG-27") or []: + bg27_line += 1 + alvals = self._prepare_line_vals_bg27( + bg27_line, + allowance_dict, + parsed_inv, + import_config, + lvals, + ) + vals["invoice_line_ids"].append(Command.create(alvals)) + bg28_line = 0 + for charge_dict in line_dict.get("BG-28") or []: + bg28_line += 1 + clvals = self._prepare_line_vals_bg28( + bg28_line, charge_dict, parsed_inv, import_config, lvals + ) + vals["invoice_line_ids"].append(Command.create(clvals)) + # BG-20 = global allowances / BG-21 = global charges + bg20_line = 0 + for allowance_dict in parsed_inv.get("BG-20") or []: + bg20_line += 1 + lvals = self._prepare_line_vals_bg20( + f"BG-20-{bg20_line}", + allowance_dict, + parsed_inv, + import_config, + vals, + ) + vals["invoice_line_ids"].append(Command.create(lvals)) + bg21_line = 0 + for charge_dict in parsed_inv.get("BG-21") or []: + bg21_line += 1 + lvals = self._prepare_line_vals_bg21( + f"BG-21-{bg21_line}", + charge_dict, + parsed_inv, + import_config, + vals, + ) + vals["invoice_line_ids"].append(Command.create(lvals)) + elif ( + parsed_inv.get("BG-23") + and import_config.get("shrink_lines") == "per_vat_rate" + ): + line_nr = 0 + for vatline_dict in parsed_inv["BG-23"]: + line_nr += 1 + lvals = self._prepare_line_vals_bg23( + str(line_nr), vatline_dict, parsed_inv, import_config, vals + ) + vals["invoice_line_ids"].append(Command.create(lvals)) else: - self._prepare_line_vals_1line(parsed_inv, import_config, vals, partner) + lvals = self._prepare_line_vals_single(parsed_inv, import_config, vals) + vals["invoice_line_ids"].append(Command.create(lvals)) # if module account_invoice_check_total from OCA/account-invoicing is installed + # Maybe we should depend on this module... ? Or have the equivalent + # that we only "enable" when importing an e-invoice ? + attachment_ids = [] + for attach_dict in parsed_inv.get("BG-24") or []: + if attach_dict.get("BT-125") and attach_dict.get("BT-125-2"): + attachment_ids.append( + Command.create( + { + "raw": attach_dict["BT-125"], + "name": attach_dict["BT-125-2"], + "res_model": "account.move", + } + ) + ) + if import_config.get("filename") and import_config.get("file_bin"): + attachment_ids.append( + Command.create( + { + "raw": import_config["file_bin"], + "name": import_config["filename"], + "res_model": "account.move", + } + ) + ) + if attachment_ids: + vals["attachment_ids"] = attachment_ids + narration_list = [] + for note_dict in parsed_inv.get("BG-1") or []: + if note_dict.get("BT-22"): + note = False + if note_dict.get("BT-21"): + note_categ = untdid_get_label("4451", note_dict["BT-21"]) + if note_categ: + note = ( + f"
  • {note_categ} : " + f"{note_dict['BT-22']}
  • " + ) + if not note: + note = f"
  • {note_dict['BT-22']}
  • " + narration_list.append(note) + if narration_list: + narration = f"
      {'\n'.join(narration_list)}
    " + if import_config["invoice_type"] == "in": + label = self.env._("Notes extracted from the electronic invoice:") + narration = f"

    {label}

    {narration}" + vals["narration"] = narration if hasattr(self.env["account.move"], "check_total"): - vals["check_total"] = parsed_inv["amount_total"] + vals["check_total"] = parsed_inv["BT-112"] + vals["import_warnings"] = self._prepare_import_warnings(import_config) + if import_config.get("invoice_extra_vals") and isinstance( + import_config["invoice_extra_vals"], dict + ): + vals.update(import_config["invoice_extra_vals"]) return vals + def _prepare_import_warnings(self, import_config): + import_warnings = False + if import_config["line_warnings"]: + for line_ref, msg_list in import_config["line_warnings"].items(): + msg = f"
      {''.join([f'
    • {msg}
    • ' for msg in msg_list])}
    " + line_prefix = self.env._("Invoice Line External ID:") + import_config["global_warnings"].append( + f"{line_prefix} {line_ref} {msg}" + ) + if import_config["global_warnings"]: + title = self.env._("Electronic invoice import warnings:") + warning_lis = "".join( + [f"
  • {x}
  • " for x in import_config["global_warnings"]] + ) + import_warnings = f"

    {title}

      {warning_lis}
    " + return import_warnings and Markup(import_warnings) + @api.model - def _prepare_line_vals_1line(self, parsed_inv, import_config, vals, partner): - il_vals = { + def _prepare_line_vals_shrink_common(self, parsed_inv, import_config, vals): + product = import_config.get("product") + lvals = { "display_type": "product", "quantity": 1, + "product_id": product and product.id or False, } + self._prepare_line_set_account(lvals, product, import_config) if import_config.get("label"): - il_vals["name"] = import_config["label"] - elif parsed_inv.get("description"): - il_vals["name"] = parsed_inv["description"] + lvals["name"] = import_config["label"] + elif parsed_inv.get("BT-11-0"): + lvals["name"] = parsed_inv["BT-11-0"] + # For the moment, we only take into account the 'price_include' + # option of the first tax + self._prepare_line_set_global_start_end_dates(lvals, parsed_inv, import_config) + return lvals + + @api.model + def _prepare_line_vals_single(self, parsed_inv, import_config, vals): + cpartner = import_config.get("commercial_partner") # can be None + lvals = self._prepare_line_vals_shrink_common(parsed_inv, import_config, vals) # For the moment, we only take into account the 'price_include' # option of the first tax taxes = self.env["account.tax"] if import_config.get("product"): product = import_config["product"] - il_vals["product_id"] = product.id - if parsed_inv["type"] in ("out_invoice", "out_refund"): - account = product._get_product_accounts()["income"] + if import_config["invoice_type"] == "out": product_taxes = product.taxes_id else: - account = product._get_product_accounts()["expense"] product_taxes = product.supplier_taxes_id taxes = product_taxes.filtered( lambda tax: tax.company_id == import_config["company"] ) else: - if import_config.get("account"): - account = import_config["account"] - if import_config.get("taxes"): - taxes = import_config["taxes"] - fp = partner and partner.property_account_position_id or False - if fp: - account = fp.map_account(account) + taxes = import_config.get("taxes") + fp = cpartner and cpartner.property_account_position_id or False + if fp and taxes: taxes = fp.map_tax(taxes) - il_vals.update( - { - "account_id": account.id, - "tax_ids": [Command.set(taxes.ids)], - } - ) + if taxes: + lvals["tax_ids"] = [Command.set(taxes.ids)] if taxes and taxes[0].price_include: - il_vals["price_unit"] = parsed_inv.get("amount_total") + lvals["price_unit"] = parsed_inv["BT-112"] else: - il_vals["price_unit"] = parsed_inv.get("amount_untaxed") - if ( - import_config["start_end_dates_installed"] - and parsed_inv.get("date_start") - and parsed_inv.get("date_end") - ): - il_vals["start_date"] = parsed_inv.get("date_start") - il_vals["end_date"] = parsed_inv.get("date_end") + lvals["price_unit"] = parsed_inv.get("BT-109") + return lvals - vals["invoice_line_ids"].append(Command.create(il_vals)) + @api.model + def _prepare_line_vals_bg23( + self, line_nr, vatline_dict, parsed_inv, import_config, vals + ): + lvals = self._prepare_line_vals_shrink_common(parsed_inv, import_config, vals) + taxes = self.env["account.tax"] + taxes = self._match_vat_tax_bg23( + line_nr, + vatline_dict, + parsed_inv, + import_config, + ) + lvals.update( + { + "tax_ids": [Command.set(taxes and taxes.ids or [])], + "price_unit": vatline_dict.get("BT-116"), + "import_invoice_line_identifier": line_nr, + } + ) + return lvals @api.model - def _prepare_line_vals_nline(self, parsed_inv, import_config, vals, partner): - assert parsed_inv.get("lines") - bdio = self.env["business.document.import"] - for line in parsed_inv["lines"]: - product = False - if line.get("product"): - product = bdio._match_product( - line["product"], - parsed_inv["chatter_msg"], - seller=partner, - raise_exception=False, - ) - if not product and import_config.get("product"): - product = import_config["product"] - if product: - product = product.with_company(import_config["company"].id) - if parsed_inv["type"] in ("out_invoice", "out_refund"): - account = product._get_product_accounts()["income"] - else: - account = product._get_product_accounts()["expense"] + def _prepare_line_set_account(self, lvals, product, import_config): + # product can have a value or not + # fallback on import_config["product"] has already been made + # We don't update lvals when there is no account, so that the compute + # method will set a default value for the account + account = False + if product: + product = product.with_company(import_config["company"].id) + if import_config["invoice_type"] == "out": + account = product._get_product_accounts()["income"] else: - account = import_config["account"] + account = product._get_product_accounts()["expense"] + elif import_config.get("account"): + account = import_config["account"] + if account: + cpartner = import_config.get( + "commercial_partner" + ) # already has with_company + if cpartner: + fp = cpartner and cpartner.property_account_position_id or False + if fp: + account = fp.map_account(account) + lvals["account_id"] = account.id - if parsed_inv["type"] in ("out_invoice", "out_refund"): - type_tax_use = "sale" - else: - type_tax_use = "purchase" - taxes = bdio._match_taxes( - line.get("taxes"), - parsed_inv["chatter_msg"], - company=import_config["company"], - type_tax_use=type_tax_use, - raise_exception=False, - ) - if not taxes and product: - if parsed_inv["type"] in ("out_invoice", "out_refund"): - product_taxes = product.taxes_id - else: - product_taxes = product.supplier_taxes_id + @api.model + def _prepare_line_set_global_start_end_dates( + self, lvals, parsed_inv, import_config + ): + # We only set global start/end dates if it hasn't already been set at line-level + if import_config["start_end_dates_installed"]: + if ( + not lvals.get("start_date") + and not lvals.get("end_date") + and parsed_inv.get("BT-73") + and parsed_inv.get("BT-74") + ): + lvals["start_date"] = parsed_inv["BT-73"] + lvals["end_date"] = parsed_inv["BT-74"] - taxes = product_taxes.filtered( - lambda tax: tax.company_id == import_config["company"] - ) - if not taxes: - taxes = import_config["taxes"] + @api.model + def _prepare_line_vals_bg25(self, line_dict, parsed_inv, import_config, vals): + line_ident = line_dict["BT-126"] + product = self._match_product(line_dict, parsed_inv, import_config) + if not product and import_config.get("product"): + product = import_config["product"] + partner = import_config.get("commercial_partner") + if product and import_config["invoice_type"] == "out": + taxes = product.taxes_id.filtered( + lambda tax: tax.company_id == import_config["company"] + ) + # TODO replace by tax_include equivalent ? fp = partner and partner.property_account_position_id or False - if fp: - account = fp.map_account(account) + if fp and taxes: taxes = fp.map_tax(taxes) - uom = bdio._match_uom( - line.get("uom"), - parsed_inv["chatter_msg"], - product=product, - raise_exception=False, + else: + taxes = self._match_vat_tax_bg25( + line_dict, + parsed_inv, + import_config, ) - if product and product.uom_id.category_id != uom.category_id: - parsed_inv["chatter_msg"].append( - self.env._( - "Matched UoM is %(matched_uom)s, but this " - "UoM doesn't belong to the same category as UoM " - "%(product_uom)s configured on product " - "%(product)s. So Odoo has set the UoM of the product " - "(%(product_uom)s).", - matched_uom=uom.display_name, - product_uom=product.uom_id.display_name, - product=product.display_name, - ) + uom = self._match_uom(line_dict, parsed_inv, import_config) + + if uom and product and product.uom_id.category_id != uom.category_id: + import_config["line_warnings"][line_ident].append( + self.env._( + "Matched unit of measure (UoM) is " + "%(matched_uom)s, " + "but this UoM doesn't belong to the same category as UoM " + "%(product_uom)s configured on product " + "%(product)s. So Odoo has set the UoM of the product " + "(%(product_uom)s).", + matched_uom=uom.display_name, + product_uom=product.uom_id.display_name, + product=product.display_name, ) + ) + uom = product.uom_id + + if not uom: + if product: uom = product.uom_id + else: + uom = self.env.ref("uom.product_uom_unit") + price_unit = line_dict["BT-146"] + if line_dict.get("BT-149"): + price_unit /= line_dict["BT-149"] + # Special treatment for single line-level allowance with a percent + discount = None + if len(line_dict.get("BG-27", [])) == 1 and line_dict["BG-27"][0].get("rate"): + discount = line_dict["BG-27"][0]["rate"] + allowance_base = line_dict["BG-27"][0].get("base_amount") + if allowance_base: + line_base = line_dict["BT-129"] * price_unit + if import_config["invoice_currency"].compare_amounts( + allowance_base, line_base + ): + discount = None + lvals = { + "display_type": "product", + "import_invoice_line_identifier": line_ident, + "product_id": product and product.id or False, + "product_uom_id": uom.id, + "quantity": line_dict["BT-129"], + "price_unit": price_unit, + # TODO add support for tax incl ? + "discount": discount, + "tax_ids": [Command.set(taxes and taxes.ids or [])], + } + # to let the compute methods do their work for the default value + self._prepare_line_set_account(lvals, product, import_config) + if import_config.get("label"): + lvals["name"] = import_config["label"] + else: + name_list = [line_dict.get("BT-153"), line_dict.get("BT-154")] + lvals["name"] = "\n".join([x for x in name_list if x]) + if ( + import_config["start_end_dates_installed"] + and line_dict.get("BT-134") + and line_dict.get("BT-135") + ): + lvals["start_date"] = line_dict["BT-134"] + lvals["end_date"] = line_dict["BT-135"] + self._prepare_line_set_global_start_end_dates(lvals, parsed_inv, import_config) + return lvals - il_vals = { - "display_type": "product", - "product_id": product and product.id or False, - "product_uom_id": uom.id, - "account_id": account.id, - "tax_ids": [Command.set(taxes.ids)], - "quantity": line["qty"], - "price_unit": line["price_unit"], # TODO add support for tax incl ? - "discount": line.get("discount", 0), + def _prepare_line_vals_bg27( + self, bg27_line, allowance_dict, parsed_inv, import_config, lvals + ): + allowance_vals = dict(lvals) + untdid = "5189" + line_ident = f"{lvals['import_invoice_line_identifier']}-BG27-{bg27_line}" + allowance_vals.update( + { + "import_invoice_line_identifier": line_ident, + "name": self.env._( + "Allowance on %s", shorten(lvals.get("name", ""), 50) + ), + "price_unit": allowance_dict["amount"] * -1, } + ) + self._prepare_line_common_bg27_bg28( + allowance_dict, untdid, parsed_inv, import_config, allowance_vals + ) + return allowance_vals - if import_config.get("label"): - il_vals["name"] = import_config["label"] - elif line.get("name"): - il_vals["name"] = line["name"] - if import_config["start_end_dates_installed"]: - il_vals["start_date"] = line.get("date_start") or parsed_inv.get( - "date_start" - ) - il_vals["end_date"] = line.get("date_end") or parsed_inv.get("date_end") - vals["invoice_line_ids"].append(Command.create(il_vals)) + def _prepare_line_vals_bg28( + self, bg28_line, charge_dict, parsed_inv, import_config, lvals + ): + charge_vals = dict(lvals) # copies product, account, taxes, ... + untdid = "7161" + line_ident = f"{lvals['import_invoice_line_identifier']}-BG28-{bg28_line}" + charge_vals.update( + { + "import_invoice_line_identifier": line_ident, + "name": self.env._( + "Extra charge on %s", shorten(lvals.get("name", ""), 50) + ), + "price_unit": charge_dict["amount"], + } + ) + self._prepare_line_common_bg27_bg28( + charge_dict, untdid, parsed_inv, import_config, charge_vals + ) + return charge_vals - @api.model - def _set_previous_invoice(self, parsed_inv, import_config, partner): - if not import_config.get("previous_invoice"): - domain = [ - ("company_id", "=", import_config["company"].id), - ("commercial_partner_id", "=", partner.id), - ("state", "=", "posted"), - ] - if parsed_inv["type"] in ("out_invoice", "out_refund"): - domain.append(("move_type", "in", ("out_invoice", "out_refund"))) + def _prepare_line_common_bg27_bg28( + self, common_dict, untdid, parsed_inv, import_config, common_vals + ): + name_list = [common_vals["name"]] + untdid_5153_code2label = import_config["speedy"]["untdid_5153_code2label"] + if common_dict.get("reason"): + name_list.append(self.env._("Reason: %s", common_dict["reason"])) + if common_dict.get("reason_code"): + reason_code_label = untdid_get_label(untdid, common_dict["reason_code"]) + if reason_code_label: + name_list.append(self.env._("Coded reason: %s", reason_code_label)) else: - domain.append(("move_type", "in", ("in_invoice", "in_refund"))) - inv = self.env["account.move"].search(domain, limit=1, order="date desc") - if inv: - import_config["previous_invoice"] = inv + name_list.append( + self.env._( + "Unknown reason code '%(code)s' (not in UNTDID %(untdid)s)", + code=common_dict["reason_code"], + untdid=untdid, + ) + ) + elif common_dict.get("non_vat_tax_code"): + if common_dict["non_vat_tax_code"] in untdid_5153_code2label: + name_list.append( + self.env._( + "Reason: Non-VAT Tax '%s'", + untdid_5153_code2label[common_dict["non_vat_tax_code"]], + ) + ) + else: + name_list.append( + self.env._( + "Reason: Non-VAT Tax with code '%s' (not in UNTDID 5153)", + common_dict["non_vat_tax_code"], + ) + ) + name_last_line = [] + if common_dict.get("base_amount"): + base_fmt = format_amount( + self.env, common_dict["base_amount"], import_config["invoice_currency"] + ) + name_last_line.append(self.env._("Base: %s", base_fmt)) + if common_dict.get("rate"): + rate_fmt = formatLang(self.env, common_dict["rate"], digits=2) + name_last_line.append(self.env._("Rate: %s %%", rate_fmt)) + if name_last_line: + name_list.append(" - ".join(name_last_line)) - @api.model - def _update_import_config_from_previous_invoice(self, import_config): - if import_config.get("previous_invoice"): - inv = import_config["previous_invoice"] - ilines = inv.invoice_line_ids.filtered( - lambda x: x.display_type == "product" + common_vals.update( + { + "quantity": 1, + "discount": None, + "name": "\n".join(name_list), + } + ) + + def _prepare_line_vals_bg20( + self, line_ident, allowance_dict, parsed_inv, import_config, vals + ): + reason_code_label = untdid_get_label("5189", allowance_dict.get("reason_code")) + allowance_dict.update( + { + "reason_code_label": reason_code_label, + "amount_signed": allowance_dict["amount"] * -1, + "untdid": "5189", + "line_ident": line_ident, + } + ) + return self._prepare_line_vals_common_bg20_bg21( + allowance_dict, parsed_inv, import_config, vals + ) + + def _prepare_line_vals_bg21( + self, line_ident, charge_dict, parsed_inv, import_config, vals + ): + reason_code_label = untdid_get_label("7161", charge_dict.get("reason_code")) + charge_dict.update( + { + "reason_code_label": reason_code_label, + "amount_signed": charge_dict["amount"], + "untdid": "7161", + "line_ident": line_ident, + } + ) + return self._prepare_line_vals_common_bg20_bg21( + charge_dict, parsed_inv, import_config, vals + ) + + def _prepare_line_vals_common_bg20_bg21( + self, common_dict, parsed_inv, import_config, vals + ): + name_list = [] + if common_dict.get("reason"): + name_list.append(common_dict["reason"]) + if common_dict["reason_code_label"]: + name_list.append( + self.env._("Coded reason: %s", common_dict["reason_code_label"]) ) - if ilines: - iline = ilines[0] - if not import_config.get("product") and iline.product_id: - import_config["product"] = iline.product_id - else: - if not import_config.get("account") and iline.account_id: - import_config["account"] = iline.account_id - if not import_config.get("taxes") and iline.tax_ids: - import_config["taxes"] = iline.tax_ids - - def _last_update_import_config(self, parsed_inv, import_config, vals): - # if import_config settings are empty, get from global params - # import_config['product']: inject with_company() - # import_config['taxes']: filter on company and type_tax_use - # import_config['account']: check the company - # set import_config['start_end_dates_installed'] - if not import_config.get("taxes"): - if parsed_inv["type"] in ("out_invoice", "out_refund"): - import_config["taxes"] = import_config["company"].account_sale_tax_id - else: - import_config["taxes"] = import_config[ - "company" - ].account_purchase_tax_id - if not import_config.get("account"): - journal = self.env["account.journal"].browse(vals["journal_id"]) - import_config["account"] = journal.default_account_id - if not import_config.get("account"): - pcateg_obj = self.env["product.category"] - import_config["account"] = pcateg_obj._fields[ - "property_account_expense_categ_id" - ].get_company_dependent_fallback(pcateg_obj) - if import_config.get("product"): - import_config["product"] = import_config["product"].with_company( - import_config["company"].id + elif common_dict.get("reason_code"): + name_list.append( + self.env._( + "Unknown reason code '%(code)s' (not in UNTDID %(untdid)s)", + code=common_dict["reason_code"], + untdid=common_dict["untdid"], + ) ) - # Cleanup data - if import_config["taxes"]: - if parsed_inv["type"] in ("out_invoice", "out_refund"): - type_tax_use = "sale" - else: - type_tax_use = "purchase" - import_config["taxes"] = import_config["taxes"].filtered( - lambda x: x.company_id.id == import_config["company"].id - and x.type_tax_use == type_tax_use + name_last_line = [] + if common_dict.get("base_amount"): + base_fmt = format_amount( + self.env, common_dict["base_amount"], import_config["invoice_currency"] ) - if ( - import_config["account"] - and import_config["company"] not in import_config["account"].company_ids - ): - import_config["account"] = False - # set 'start_end_dates_installed' if the OCA module - # account_invoice_start_end_dates from https://github.com/OCA/account-closing - # is installed - line_model = self.env["account.move.line"] - import_config["start_end_dates_installed"] = ( - hasattr(line_model, "start_date") - and hasattr(line_model, "end_date") - or False + name_last_line.append(self.env._("Base: %s", base_fmt)) + if common_dict.get("rate"): + rate_fmt = formatLang(self.env, common_dict["rate"], digits=2) + name_last_line.append(self.env._("Rate: %s %%", rate_fmt)) + if name_last_line: + name_list.append(" - ".join(name_last_line)) + vat_tax = self._match_vat_tax_common( + common_dict["line_ident"], + common_dict["vat_category_code"], + int(round(common_dict.get("vat_rate", 0) * 100)), + parsed_inv, + import_config, ) + product = import_config.get("product") + lvals = { + "display_type": "product", + "product_id": product and product.id or False, + "name": "\n".join(name_list), + "quantity": 1, + "price_unit": common_dict["amount_signed"], + "import_invoice_line_identifier": common_dict["line_ident"], + "tax_ids": [Command.set(vat_tax and [vat_tax.id] or [])], + } + self._prepare_line_set_account(lvals, product, import_config) + self._prepare_line_set_global_start_end_dates(lvals, parsed_inv, import_config) + return lvals @api.model - def parse_invoice( - self, invoice_file_b64, invoice_filename, company, email_from=None - ): - assert invoice_file_b64, "No invoice file" - assert isinstance(invoice_file_b64, bytes) - logger.info("Starting to import invoice %s", invoice_filename) - file_data = base64.b64decode(invoice_file_b64) + def parse_invoice(self, invoice_file_bin, invoice_filename, import_config): + assert invoice_file_bin, "No invoice file" + assert isinstance(invoice_file_bin, bytes) + self._update_import_config(import_config) + import_config.update( + { + "filename": invoice_filename, + "file_bin": invoice_file_bin, + } + ) + logger.info(f"Starting to import invoice {invoice_filename}") filetype = mimetypes.guess_type(invoice_filename) logger.debug("Invoice mimetype: %s", filetype) if filetype and filetype[0] in ["application/xml", "text/xml"]: try: - xml_root = etree.fromstring(file_data) + xml_root = etree.fromstring(invoice_file_bin) except Exception as err: raise UserError( - _( + self.env._( "The XML file '%(filename)s' is not XML-compliant. " "Error: %(err)s", filename=invoice_filename, @@ -622,10 +865,10 @@ def parse_invoice( ) logger.debug("Starting to import the following XML file:") logger.debug(pretty_xml_bytes.decode("utf-8")) - parsed_inv = self.parse_xml_invoice(xml_root, company) + parsed_inv = self.parse_xml_invoice(xml_root, import_config) if parsed_inv is False: raise UserError( - _( + self.env._( "Odoo failed to read the XML invoice '%(filename)s'. " "Did you install the Odoo module to support this type " "of file?", @@ -634,108 +877,38 @@ def parse_invoice( ) # Fallback on PDF else: - parsed_inv = self.parse_pdf_invoice(file_data, company) - if "attachments" not in parsed_inv: - parsed_inv["attachments"] = {} - parsed_inv["attachments"][invoice_filename] = invoice_file_b64 - if email_from: - if "partner" not in parsed_inv: - parsed_inv["partner"] = {} - partner_name, email = parseaddr(email_from) - if not parsed_inv["partner"].get("email"): - parsed_inv["partner"]["email"] = email - if partner_name and not parsed_inv["partner"].get("name"): - parsed_inv["partner"]["name"] = partner_name - pp_parsed_inv = self._pre_process_parsed_inv(parsed_inv, company) - return pp_parsed_inv - - @api.model - def _pre_process_parsed_inv(self, parsed_inv, company): - if parsed_inv.get("pre-processed"): - return parsed_inv - parsed_inv["pre-processed"] = True - if "chatter_msg" not in parsed_inv: - parsed_inv["chatter_msg"] = [] - if not parsed_inv.get("currency_rec"): - parsed_inv["currency_rec"] = self.env[ - "business.document.import" - ]._match_currency( - parsed_inv.get("currency"), [], company=company, raise_exception=False - ) - # Rounding totals - self._pre_process_parsed_inv_rounding(parsed_inv, company) - if parsed_inv.get("type") in ("out_invoice", "out_refund"): - return parsed_inv - if "amount_total" not in parsed_inv: - # Designed to allow the import of an empty invoice with - # 1 invoice line at 0 that has the right account/product/analytic - parsed_inv["amount_total"] = 0 - if "amount_tax" in parsed_inv and "amount_untaxed" not in parsed_inv: - parsed_inv["amount_untaxed"] = ( - parsed_inv["amount_total"] - parsed_inv["amount_tax"] - ) - elif "amount_untaxed" not in parsed_inv and "amount_tax" not in parsed_inv: - # For invoices that never have taxes - parsed_inv["amount_untaxed"] = parsed_inv["amount_total"] - # Support the 2 refund methods; if method a) is used, we convert to - # method b) - if not parsed_inv.get("type"): - parsed_inv["type"] = "in_invoice" # default value - if ( - parsed_inv["type"] == "in_invoice" - and "amount_total" in parsed_inv - and parsed_inv["currency_rec"].compare_amounts( - parsed_inv["amount_total"], 0 - ) - < 0 - ): - parsed_inv["type"] = "in_refund" - for entry in ["amount_untaxed", "amount_total"]: - parsed_inv[entry] *= -1 - for line in parsed_inv.get("lines", []): - line["qty"] *= -1 - if "price_subtotal" in line: - line["price_subtotal"] *= -1 - # Handle taxes: - self._pre_process_parsed_inv_taxes(parsed_inv, company) - parsed_inv_for_log = dict(parsed_inv) - if "attachments" in parsed_inv_for_log: - parsed_inv_for_log.pop("attachments") - logger.debug("Result of invoice parsing parsed_inv=%s", parsed_inv_for_log) - # the 'company' dict in parsed_inv is NOT used to auto-detect - # the company, but to check that we are not importing an - # invoice for another company by mistake - if ( - parsed_inv.get("company") - and not config["test_enable"] - and not self.env.context.get("edi_skip_company_check") - ): - self.env["business.document.import"]._check_company( - parsed_inv["company"], - parsed_inv["chatter_msg"], - company, - raise_exception=True, - ) + parsed_inv = self.parse_pdf_invoice(invoice_file_bin, import_config) return parsed_inv - @api.model - def _pre_process_parsed_inv_rounding(self, parsed_inv, company): - for entry in ["amount_untaxed", "amount_total", "amount_tax"]: - if entry in parsed_inv: - parsed_inv[entry] = parsed_inv["currency_rec"].round(parsed_inv[entry]) - prec_price = self.env["decimal.precision"].precision_get("Product Price") - prec_disc = self.env["decimal.precision"].precision_get("Discount") - prec_qty = self.env["decimal.precision"].precision_get( - "Product Unit of Measure" - ) - for line in parsed_inv.get("lines", []): - line["qty"] = float_round(line["qty"], precision_digits=prec_qty) - line["price_unit"] = float_round( - line["price_unit"], precision_digits=prec_price - ) - line["discount"] = float_round( - line.get("discount", 0), precision_digits=prec_disc - ) + # @api.model + # def _pre_process_parsed_inv(self, parsed_inv, import_config): + # TODO this method is not called any more, but we may restore it one day + # Rounding totals + # self._pre_process_parsed_inv_rounding(parsed_inv, company) + # if parsed_inv.get("type") in ("out_invoice", "out_refund"): + # return parsed_inv + # Support the 2 refund methods; if method a) is used, we convert to + # method b) + # if not parsed_inv.get("type"): + # parsed_inv["type"] = "in_invoice" # default value + # if ( + # parsed_inv["type"] == "in_invoice" + # and "amount_total" in parsed_inv + # and parsed_inv["currency_rec"].compare_amounts( + # parsed_inv["amount_total"], 0 + # ) + # < 0 + # ): + # parsed_inv["type"] = "in_refund" + # for entry in ["amount_untaxed", "amount_total"]: + # parsed_inv[entry] *= -1 + # for line in parsed_inv.get("lines", []): + # line["qty"] *= -1 + # if "price_subtotal" in line: + # line["price_subtotal"] *= -1 + # Handle taxes: + # self._pre_process_parsed_inv_taxes(parsed_inv, company) + # return parsed_inv @api.model def _pre_process_parsed_inv_taxes( @@ -754,7 +927,7 @@ def _pre_process_parsed_inv_taxes( if line.get("taxes"): if len(line["taxes"]) > 1: parsed_inv["chatter_msg"].append( - _( + self.env._( "You are importing an invoice in company %(company)s " "that cannot deduct VAT and the imported invoice has " "several VAT taxes on the same line (%(line)s). We do " @@ -773,69 +946,318 @@ def _pre_process_parsed_inv_taxes( line["taxes"] = [] @api.model - def _invoice_already_exists(self, parsed_inv, commercial_partner, company_id): - if not parsed_inv.get("invoice_number"): + def _invoice_already_exists(self, parsed_inv, import_config): + invoice_number = parsed_inv.get("BT-1") + if not invoice_number: return False - existing_inv = self.env["account.move"].search( - [ - ("company_id", "=", company_id), + is_refund = is_credit_note(parsed_inv) + domain = [ + ("company_id", "=", import_config["company"].id), + ] + if import_config["invoice_type"] == "in": + commercial_partner = import_config.get("partner") + if not commercial_partner: + return False + move_type = is_refund and "in_refund" or "in_invoice" + domain += [ + ("move_type", "=", move_type), ("commercial_partner_id", "=", commercial_partner.id), - ("move_type", "=", parsed_inv["type"]), - ("ref", "=ilike", parsed_inv["invoice_number"]), - ], - limit=1, - ) + ("ref", "=like", invoice_number), + ] + match_log = ( + f"with move type '{move_type}' partner " + f"'{commercial_partner.display_name}' and reference '{invoice_number}'" + ) + else: + move_type = is_refund and "out_refund" or "out_invoice" + domain += [("name", "=", invoice_number), ("move_type", "=", move_type)] + match_log = ( + f"with move type '{move_type}' and invoice number '{invoice_number}'" + ) + + existing_inv = self.env["account.move"].search(domain, limit=1) + if existing_inv: + msg = ( + f"Found existing invoice {existing_inv.display_name} " + f"ID {existing_inv.id} {match_log}" + ) + self._warning_log(import_config, msg) + import_config["action_warnings"].append( + self.env._( + "Invoice '%(filename)s' already exists in Odoo: %(existing_inv)s.", + filename=import_config.get("filename"), + existing_inv=existing_inv.display_name, + ) + ) + else: + msg = f"No existing invoice found {match_log}" + self._info_log(import_config, msg) return existing_inv - def import_invoices(self): + @api.model + def _prepare_speedy(self): + """speedy is a data structure embedded into import_config + that is used to store the fixed data dictionnaries that are + designed to speed-up (country_code2id, currency_code2id, ...) + """ + currency_code2id = { + cur["name"]: cur["id"] + for cur in self.env["res.currency"] + .with_context(active_test=False) + .search_read([], ["name"]) + } + all_countries = self.env["res.country"].search_read([], ["code"]) + country_code2id = {cou["code"]: cou["id"] for cou in all_countries} + country_id2code = {cou["id"]: cou["code"] for cou in all_countries} + installed_langs = [ + lang["code"] for lang in self.env["res.lang"].search_read([], ["code"]) + ] + uom_unece2rec = { + uom.unece_code: uom + for uom in self.env["uom.uom"].search([("unece_code", "!=", False)]) + } + untdid_5153_code2label = { + unece["code"]: unece["name"] + for unece in self.env["unece.code.list"].search_read( + [("type", "=", "tax_type")], ["name", "code"] + ) + } + incoterms_code2id = { + inc["code"]: inc["id"] + for inc in self.env["account.incoterms"] + .with_context(active_test=False) + .search_read([], ["code"]) + } + speedy = { + "currency_code2id": currency_code2id, + "country_code2id": country_code2id, + "country_id2code": country_id2code, + "incoterms_code2id": incoterms_code2id, + "installed_langs": installed_langs, + "uom_unece2rec": uom_unece2rec, + "untdid_5153_code2label": untdid_5153_code2label, + } + return speedy + + # IMPORT CONFIG + # REQUIRED FIELDS when calling public method with import_config arg: + # - company (recordset) or company_id (useful in webservice mode) + # FIELDS that are always set after _update_import_config() are marked with (A) + # FIELDS that are always set after _commercial_partner_update_import_config() + # are marked with (cPA) + # It is important that fields that have a default value such as "if_already_exists" + # are always set after _update_import_config() so that the default value is set + # in a single place in the code + # { + ### + # 'company': company recordset, # required field + # 'company_id': company ID # for useful for webservice mode + # 'invoice_type': 'in' or 'out' # (A) defaults to 'in' + # 'action_warnings': [] # (A) warnings for the notif pop-up for the user + # when the wizard is used + # 'global_warnings': [], # (A) global warnings for the HTML field import_warnings + # 'line_warnings': [], # (A) per-line warnings for the HTML field import_warnings + # 'logs': [], # (A) invoice import logs + # 'filename': 'invoice_sample.pdf', + # 'file_bin': # file as bytes (NOT base64) + # 'create_bank_account': True or False, + # 'webservice_mode': True or False, # if True, create_invoice() returns + # an invoice ID + # "if_already_exists": "return_false", # (A) possible values : + # raise, match, return_false (default) + # "start_end_dates_installed": True or False # (A) True is OCA module + # account_invoice_start_end_dates is installed + # "debug_disable_company_check": True or False, + # 'partner': partner recordset, # force a partner. When this key is used, + # it already has with_company(company) + # 'partner_id': ID # same as previous field, for webservice + # 'email_from': "Alexis de Lattre ", # for message_new() + # 'sale_journal': sale journal recordset, # used to force a journal + # 'sale_journal_id': ID # same as previous field, for webservice mode + # 'purchase_journal': purchase journal recordset, # used to force a journal + # 'purchase_journal_id': ID # same as previous field, for webservice mode + # 'origin': 'invoice origin', # set the 'invoice_origin' char field + # 'invoice_extra_vals': {}, # extra values for invoice create() + # 'vat_tax2rec': {}, # (A) sale or purchase tax properties to recordset + # (sale or purchase tax depend on 'invoice_type') + # 'updated': True, # technical key just to avoid double processing + # of _update_import_config() + # FIELDS below are set by _commercial_partner_update_import_config() + # 'shrink_lines': False, # selection: single/per_vat_rate + # 'analytic_distribution': Analytic distribution, + # 'account': Account recordset, + # 'taxes': taxes multi-recordset, + # 'label': 'Force invoice line description', + # 'product': product recordset, + # 'previous_invoice': invoice recordset, # used + # FIELDS below are set by ???? + # 'invoice_currency': currency recordset, # set by ... + # 'speedy: { # (A) + # 'currency_code2id': {}, 'country_code2id': {}, 'incoterms_code2id': {}, + # 'installed_langs': {}, 'uom_unece2rec': {}, 'untdid_5153_code2label': {}, + # }, + # } + + @api.model + def _update_import_config(self, import_config, speedy=None): + # VERY IMPORTANT: add public methods that accept import_config + # as argument must call _update_import_config() at the beginning + # of the method. The "updated" key ensures that we don't do this + # several times + assert isinstance(import_config, dict) + if import_config.get("updated"): + return + # to make it work from JSON-RPC + if not import_config.get("company") and import_config.get("company_id"): + import_config["company"] = self.env["res.company"].browse( + import_config["company_id"] + ) + company = import_config.get("company") + if not company: + raise UserError(self.env._("Missing company in the import configuration.")) + if not import_config.get("invoice_type"): + import_config["invoice_type"] = "in" + if import_config["invoice_type"] not in ("out", "in"): + raise UserError( + self.env._( + "Wrong value for 'invoice_type' key in " + "import configuration (%s)", + import_config["invoice_type"], + ) + ) + # I set global_warnings like this so that devs can inject a warnings + # before calling create_invoice() for example + if not import_config.get("global_warnings"): + import_config["global_warnings"] = [] + if not import_config.get("if_already_exists"): + import_config["if_already_exists"] = "return_false" # set default value + if import_config["if_already_exists"] not in ("raise", "match", "return_false"): + raise UserError( + self.env._( + "Wrong value for 'if_already_exists' key in import_config (%s).", + import_config["if_already_exists"], + ) + ) + if not import_config.get("speedy"): + if speedy is None: + import_config["speedy"] = self._prepare_speedy() + else: + import_config["speedy"] = speedy + line_model = self.env["account.move.line"] + start_end_dates_installed = ( + hasattr(line_model, "start_date") + and hasattr(line_model, "end_date") + or False + ) + type_tax_use = import_config["invoice_type"] == "in" and "purchase" or "sale" + tax_domain = [ + ("type_tax_use", "=", type_tax_use), + ("company_id", "=", company.id), + ("unece_type_code", "=", "VAT"), + ("unece_categ_code", "!=", False), + ("price_include", "=", False), + ("amount_type", "=", "percent"), + ] + vat_tax2rec = { + ( + tax.unece_categ_code, + int(round(tax.amount * 100)), + tax.tax_exigibility, + ): tax + for tax in self.env["account.tax"].search(tax_domain, order="amount desc") + } + + import_config.update( + { + "create_bank_account": company.invoice_import_create_bank_account, + "action_warnings": [], + "logs": [], + # key = import_invoice_line_identifier ; value = list of logs + "line_warnings": defaultdict(list), + "start_end_dates_installed": start_end_dates_installed, + "vat_tax2rec": vat_tax2rec, + } + ) + # we may have a partner key in import config when create_invoice() is called + # from outside of this module + if import_config.get("partner_id") and not import_config.get("partner"): + import_config["partner"] = ( + self.env["res.partner"] + .browse(import_config["partner_id"]) + .with_company(import_config["company"]) + ) + # Same as for 'company': allow journal ID to make it work with JSON+RPC + if ( + import_config["invoice_type"] == "out" + and import_config.get("sale_journal_id") + and not import_config.get("sale_journal") + ): + import_config["sale_journal"] = self.env["account.journal"].browse( + import_config["sale_journal_id"] + ) + elif ( + import_config["invoice_type"] == "in" + and import_config.get("purchase_journal_id") + and not import_config.get("purchase_journal") + ): + import_config["purchase_journal"] = self.env["account.journal"].browse( + import_config["purchase_journal_id"] + ) + import_config["updated"] = True + + def _invoice_currency_update_import_config(self, parsed_inv, import_config): + if not import_config.get("invoice_currency"): + if parsed_inv.get("BT-5"): + currency_code2id = import_config["speedy"]["currency_code2id"] + currency_id = currency_code2id.get(parsed_inv["BT-5"]) + if currency_id: + currency = self.env["res.currency"].browse(currency_id) + if not currency.active: + import_config["global_warnings"].append( + self.env._( + "Currency %s is inactive in Odoo: " + "you should activate it.", + currency.name, + ) + ) + else: + import_config["global_warnings"].append( + self.env._( + "Currency ISO code '%(invoice_currency_code)s' not found " + "in Odoo: using company currency " + "'%(company_currency_code)s'.", + invoice_currency_code=parsed_inv["BT-5"], + company_currency_code=import_config[ + "company" + ].currency_id.name, + ) + ) + currency = import_config["company"].currency_id + else: + currency = import_config["company"].currency_id + import_config["invoice_currency"] = currency + + def import_invoices_button(self): """Method called by the button of the wizard""" self.ensure_one() - company = self.company_id if not self.invoice_attachment_ids: - raise UserError(_("You must select the vendor bills to import.")) + raise UserError(self.env._("You must select the vendor bills to import.")) invoice_ids = [] - warnings = [] + speedy = self._prepare_speedy() + action_warnings = [] for attach in self.invoice_attachment_ids: - parsed_inv = self.parse_invoice(attach.datas, attach.name, company) - import_config = {"company": company} - if parsed_inv.get("partner"): - partner = self.env["business.document.import"]._match_partner( - parsed_inv["partner"], - parsed_inv["chatter_msg"], - raise_exception=False, - ) - if partner: - # To speed-up next match - parsed_inv["partner"] = {"recordset": partner} - existing_inv = self._invoice_already_exists( - parsed_inv, partner.commercial_partner_id, company.id - ) - if existing_inv: - logger.warning( - "This invoice already exists " - "in Odoo (ID %d number %s supplier number %s)", - existing_inv.id, - existing_inv.name, - parsed_inv.get("invoice_number"), - ) - warnings.append( - _( - "Invoice '%(filename)s' already exists in Odoo: " - "%(existing_inv)s.", - filename=attach.name, - existing_inv=existing_inv.display_name, - ) - ) - continue - - import_config = partner._convert_to_import_config(company) - invoice = self.create_invoice( - parsed_inv, - import_config, - origin=_("Import of file %s", attach.name), - ) - invoice_ids.append(invoice.id) + import_config = { + "company": self.company_id, + "origin": self.env._("Import of file %s", attach.name), + "debug_disable_company_check": self.debug_disable_company_check, + } + self._update_import_config(import_config, speedy) + parsed_inv = self.parse_invoice(attach.raw, attach.name, import_config) + invoice = self.create_invoice(parsed_inv, import_config) + if invoice: + invoice_ids.append(invoice.id) + action_warnings += import_config.get("action_warnings") next_action = self.env["ir.actions.actions"]._for_xml_id( "account.action_move_in_invoice_type" @@ -853,111 +1275,193 @@ def import_invoices(self): } ) else: - if warnings: - raise UserError("\n".join(warnings)) - raise UserError(_("No invoice created.")) + if action_warnings: + raise UserError("\n".join(action_warnings)) + raise UserError(self.env._("No invoice created.")) + msg_type = "success" + sticky = False + if action_warnings: + msg_type = "warning" + sticky = True + sticky = bool(action_warnings) + action_warnings.append( + self.env._("%s vendor bill(s) created", len(invoice_ids)) + ) action = { "type": "ir.actions.client", "tag": "display_notification", "params": { - "type": "success", - "title": _("Import Vendor Bills"), - "message": _("%d vendor bill(s) created", len(invoice_ids)), + "type": msg_type, + "title": self.env._("Import Vendor Bills"), + "message": "\n".join(action_warnings), "next": next_action, + "sticky": sticky, }, } - if warnings: - action["params"].update( - { - "type": "warning", - "message": "\n".join(warnings), - "sticky": True, - } - ) return action + def _check_import_company(self, parsed_inv, import_config): + if import_config.get("debug_disable_company_check") or self.env.context.get( + "edi_skip_company_check" + ): + return True + company_dict = self._get_company_dict(parsed_inv, import_config) + if not company_dict: + return True + raw_vat = company_dict.get("vat_identifier") + company = import_config["company"] + if raw_vat: + invoice_vat = ( + "".join(x for x in raw_vat if not x.isspace()).upper() or False + ) + import_company_vat = company.partner_id.vat + if import_company_vat: + if import_company_vat != invoice_vat: + raise UserError( + self.env._( + "Trying to import invoice in company %(company)s " + "that has VAT number '%(import_company_vat)s' " + "but the invoice to import contains VAT number " + "'%(invoice_vat)s'", + company=company.display_name, + import_company_vat=import_company_vat, + invoice_vat=invoice_vat, + ) + ) + else: + msg = ( + f"Importing invoice in company {company.display_name} that " + f"has VAT number {import_company_vat}: it matches the " + "VAT number written in the invoice" + ) + self._info_log(import_config, msg) + else: + msg = ( + f"Company {import_config['company'].display_name} has no " + "VAT number, so we can't check that we are importing in the " + "right company using VAT number" + ) + self._warning_log(import_config, msg) + else: + msg = ( + "No VAT number for our company in the invoice we are importing, " + "so we can't check that we are importing in the right company " + "using VAT number" + ) + self._warning_log(import_config, msg) + @api.model - def create_invoice(self, parsed_inv, import_config, origin=None): + def create_invoice(self, parsed_inv, import_config): + parsed_inv_for_log = get_data_dict_copy_for_logs(parsed_inv) + logger.info(f"Start to create invoice from data {parsed_inv_for_log}") + self._update_import_config(import_config) + self._invoice_currency_update_import_config(parsed_inv, import_config) amo = self.env["account.move"] - parsed_inv = self._pre_process_parsed_inv(parsed_inv, import_config["company"]) + partner = import_config.get("partner") + # if called from outside of this module, the partner may be already known, + # (for example when creating a customer invoice or module simple_pdf) + if not partner: + partner = self._match_partner(parsed_inv, import_config) + if partner: + partner_wc = partner.with_company(import_config["company"]) + import_config["partner"] = partner_wc + commercial_partner = partner_wc.commercial_partner_id + import_config["commercial_partner"] = commercial_partner + commercial_partner._commercial_partner_update_import_config(import_config) + # self._pre_process_parsed_inv(parsed_inv, import_config) + self._check_import_company(parsed_inv, import_config) + existing_inv = self._invoice_already_exists(parsed_inv, import_config) + if existing_inv: + if import_config.get("if_already_exists") == "raise": + raise UserError( + self.env._( + "Invoice already exists in Odoo: %(existing_inv)s", + existing_inv=existing_inv.display_name, + ) + ) + elif import_config.get("if_already_exists") == "match": + if import_config[ + "currency" + ] == existing_inv.currency_id and not import_config[ + "currency" + ].compare_amounts(parsed_inv["BT-112"], existing_inv.amount_total): + return existing_inv + else: + raise UserError( + self.env._( + "The invoice to import already exists (%(existing_inv)s) " + "but it's total amount (%(existing_inv_total_amount)s) " + "doesn't match the total amount of the invoice to import " + "(%(import_inv_total_amount)s).", + existing_inv=existing_inv.display_name, + existing_inv_total_amount=format_amount( + self.env, + existing_inv.amount_total, + existing_inv.currency_id, + ), + import_inv_total_amount=format_amount( + self.env, + parsed_inv["BT-112"], + import_config["currency"], + ), + ) + ) + + else: + return False + vals = self._prepare_create_invoice_vals(parsed_inv, import_config) logger.debug("Invoice vals for creation: %s", vals) invoice = amo.create(vals) self._post_process_invoice(parsed_inv, import_config, invoice) logger.info("Invoice ID %d created", invoice.id) - self.env["business.document.import"].post_create_or_update(parsed_inv, invoice) - invoice.message_post( - body=Markup( - _( - "This invoice has been created automatically via file import. " - "Origin: %s.", - origin or _("unspecified"), - ) - ) - ) + chatter_msg = self._prepare_chatter_message(parsed_inv, import_config) + if chatter_msg: + invoice.message_post(body=Markup(chatter_msg)) + if import_config.get("webservice_mode"): + return invoice.id return invoice - @api.model - def create_invoice_webservice( - self, - invoice_file_b64, - invoice_filename, - company_id, - origin, - email_from=None, - ): - # for invoice_file_b64, we accept it as bytes AND str - # to avoid "Object of type bytes is not JSON serializable" - assert invoice_file_b64 - if isinstance(invoice_file_b64, str): - invoice_file_b64 = invoice_file_b64.encode("utf8") - assert isinstance(invoice_file_b64, bytes) - assert isinstance(invoice_filename, str) - if company_id is None: - company = self.env.company - company_id = company.id - else: - company = self.env["res.company"].browse(company_id) - logger.info( - "Starting to import invoice file %s in company ID %d", - invoice_filename, - company_id, - ) - parsed_inv = self.parse_invoice( - invoice_file_b64, invoice_filename, company, email_from=email_from - ) - partner = self.env["business.document.import"]._match_partner( - parsed_inv["partner"], parsed_inv["chatter_msg"], raise_exception=False - ) - if partner: - partner = partner.commercial_partner_id - # To avoid a second full _match_partner() inside create_invoice() - parsed_inv["partner"]["recordset"] = partner - existing_inv = self._invoice_already_exists(parsed_inv, partner, company_id) - if existing_inv: - logger.warning( - "This supplier invoice already exists " - "in Odoo (ID %d number %s supplier number %s)", - existing_inv.id, - existing_inv.name, - parsed_inv.get("invoice_number"), - ) - return False - import_config = partner._convert_to_import_config(company) - else: - import_config = {"company": company} - invoice = self.create_invoice(parsed_inv, import_config, origin) - return invoice.id + def _prepare_chatter_message(self, parsed_inv, import_config): + chatter_msg = [ + self.env._("This invoice has been created automatically via file import.") + ] + if import_config.get("origin"): + label = self.env._("Origin:") + chatter_msg.append(f"{label} {import_config['origin']}.") + if import_config.get("logs"): + label = self.env._("Detailed import logs below:") + logs = [] + for log_level, msg in import_config["logs"]: + if log_level == "info": + logs.append( + f'' + f"INFO {msg}" + ) + elif log_level == "warning": + logs.append( + f'' + f"WARNING {msg}" + ) + elif log_level == "error": + logs.append( + f'' + f"ERROR {msg}" + ) + chatter_msg.append(f"{label}

    {'
    '.join(logs)}

    ") + return " ".join(chatter_msg) @api.model def _prepare_global_adjustment_line(self, diff_amount, invoice, import_config): cur = invoice.currency_id diff_amount_cmp = cur.compare_amounts(diff_amount, 0) company = invoice.company_id + # TODO : if a product or account is forced, + # I think we should use this account (and product) ? if diff_amount_cmp > 0: if not company.adjustment_debit_account_id: raise UserError( - _( + self.env._( "You must configure the 'Adjustment Debit Account' " "on the Accounting Configuration page of company %(company)s.", company=company.display_name, @@ -968,7 +1472,7 @@ def _prepare_global_adjustment_line(self, diff_amount, invoice, import_config): else: if not company.adjustment_credit_account_id: raise UserError( - _( + self.env._( "You must configure the 'Adjustment Credit Account' " "on the Accounting Configuration page of company %(company)s.", company=company.display_name, @@ -979,23 +1483,23 @@ def _prepare_global_adjustment_line(self, diff_amount, invoice, import_config): if invoice.fiscal_position_id: account = invoice.fiscal_position_id.map_account(account) - il_vals = { + lvals = { "move_id": invoice.id, "display_type": "product", - "name": _("Adjustment"), + "name": self.env._("Adjustment"), "account_id": account.id, "quantity": sign, "price_unit": diff_amount * sign, } - logger.debug("Prepared global adjustment invoice line %s", il_vals) - return il_vals + logger.debug("Prepared global adjustment invoice line %s", lvals) + return lvals def _prepare_adjustment_line(self, iline, diff_amount): vals = { "move_id": iline.move_id.id, "display_type": "product", "account_id": iline.account_id.id, - "name": _("Adjustment on %s") % iline.name, + "name": self.env._("Adjustment on %s") % iline.name, "quantity": 1, "price_unit": diff_amount, "tax_ids": [Command.set(iline.tax_ids.ids)], @@ -1004,18 +1508,20 @@ def _prepare_adjustment_line(self, iline, diff_amount): @api.model def _post_process_invoice(self, parsed_inv, import_config, invoice): - if parsed_inv.get("type") in ("out_invoice", "out_refund"): + if import_config.get("invoice_type") == "out": return amlo = self.env["account.move.line"] inv_cur = invoice.currency_id # If untaxed amount is wrong, create adjustment lines - if parsed_inv["currency_rec"].compare_amounts( - parsed_inv["amount_untaxed"], invoice.amount_untaxed + # TODO wrong when DEEE !!! + if invoice.currency_id.compare_amounts( + parsed_inv["BT-109"], invoice.amount_untaxed ): # Try to find the line that has a problem - for i in range(len(parsed_inv["lines"])): - if "price_subtotal" not in parsed_inv["lines"][i]: + for i in range(len(parsed_inv["BG-25"])): + if "price_subtotal" not in parsed_inv["BG-25"][i]: continue + # TODO continue... at the moment, it will quit here iline = invoice.invoice_line_ids[i] odoo_subtotal = iline.price_subtotal parsed_subtotal = parsed_inv["lines"][i]["price_subtotal"] @@ -1034,40 +1540,44 @@ def _post_process_invoice(self, parsed_inv, import_config, invoice): adj_line = amlo.create(vals) logger.info("Adjustment invoice line created ID %d", adj_line.id) # Fallback: create global adjustment line - if parsed_inv["currency_rec"].compare_amounts( - parsed_inv["amount_untaxed"], invoice.amount_untaxed + if invoice.currency_id.compare_amounts( + parsed_inv["BT-109"], invoice.amount_untaxed ): - diff_amount = inv_cur.round( - parsed_inv["amount_untaxed"] - invoice.amount_untaxed + diff_amount = inv_cur.round(parsed_inv["BT-109"] - invoice.amount_untaxed) + parsed_amount_untaxed_fmt = format_amount( + self.env, parsed_inv["BT-109"], invoice.currency_id ) - logger.info( - "Amount untaxed difference found " "(source: %s, odoo:%s, diff:%s)", - parsed_inv["amount_untaxed"], - invoice.amount_untaxed, - diff_amount, + amount_untaxed_fmt = format_amount( + self.env, invoice.amount_untaxed, invoice.currency_id ) - il_vals = self._prepare_global_adjustment_line( + msg = ( + f"Amount untaxed difference found: source " + f"{parsed_amount_untaxed_fmt}, odoo {amount_untaxed_fmt}, " + f"diff {format_amount(self.env, diff_amount, invoice.currency_id)}" + ) + self._info_log(import_config, msg) + lvals = self._prepare_global_adjustment_line( diff_amount, invoice, import_config ) - mline = amlo.create(il_vals) + mline = amlo.create(lvals) logger.info("Global adjustment invoice line created ID %d", mline.id) - assert not parsed_inv["currency_rec"].compare_amounts( - parsed_inv["amount_untaxed"], invoice.amount_untaxed + assert not invoice.currency_id.compare_amounts( + parsed_inv["BT-109"], invoice.amount_untaxed ) # Force tax amount if necessary - if parsed_inv["currency_rec"].compare_amounts( - invoice.amount_total, parsed_inv["amount_total"] + if invoice.currency_id.compare_amounts( + invoice.amount_total, parsed_inv["BT-112"] ): initial_amount_tax = invoice.amount_tax - invoice._check_total_amount(parsed_inv["amount_total"]) + invoice._check_total_amount(parsed_inv["BT-112"]) # 2 scenarios: forcing tax total was not possible (because # there is no tax at all in invoice lines for example) or # it worked - if parsed_inv["currency_rec"].compare_amounts( - invoice.amount_total, parsed_inv["amount_total"] + if invoice.currency_id.compare_amounts( + invoice.amount_total, parsed_inv["BT-112"] ): - parsed_inv["chatter_msg"].append( - _( + import_config["global_warnings"].append( + self.env._( "The total amount of the imported invoice is " "%(real_amount_total)s whereas the total amount computed by " "Odoo is %(current_amount_total)s. It is the " @@ -1081,14 +1591,14 @@ def _post_process_invoice(self, parsed_inv, import_config, invoice): "Default Taxes on the partner " "(if there are no products on invoice lines).", real_amount_total=format_amount( - self.env, parsed_inv["amount_total"], invoice.currency_id + self.env, parsed_inv["BT-112"], invoice.currency_id ), current_amount_total=format_amount( self.env, invoice.amount_total, invoice.currency_id ), real_amount_tax=format_amount( self.env, - parsed_inv["amount_total"] - parsed_inv["amount_untaxed"], + parsed_inv["BT-112"] - parsed_inv["BT-109"], invoice.currency_id, ), current_amount_tax=format_amount( @@ -1098,8 +1608,8 @@ def _post_process_invoice(self, parsed_inv, import_config, invoice): ) else: - parsed_inv["chatter_msg"].append( - _( + import_config["global_warnings"].append( + self.env._( "The total tax amount has been " "forced to %(forced_amount)s (amount " "computed by Odoo was: %(initial_amount)s).", @@ -1112,72 +1622,6 @@ def _post_process_invoice(self, parsed_inv, import_config, invoice): ) ) - def xpath_to_dict_helper(self, xml_root, xpath_dict, namespaces): - for key, value in xpath_dict.items(): - if isinstance(value, list): - isdate = isfloat = ischar_to_clean = False - if "date" in key: - isdate = True - elif "amount" in key: - isfloat = True - elif key == "name": - ischar_to_clean = True - xpath_dict[key] = self.multi_xpath_helper( - xml_root, - value, - namespaces, - isdate=isdate, - isfloat=isfloat, - ischar_to_clean=ischar_to_clean, - ) - if not xpath_dict[key]: - logger.debug("No value extracted for %s", key) - elif isinstance(value, dict): - xpath_dict[key] = self.xpath_to_dict_helper(xml_root, value, namespaces) - return xpath_dict - - def multi_xpath_helper( - self, - xml_root, - xpath_list, - namespaces, - isdate=False, - isfloat=False, - ischar_to_clean=False, - ): - assert isinstance(xpath_list, list) - for xpath in xpath_list: - xpath_res = xml_root.xpath(xpath, namespaces=namespaces) - if xpath_res and xpath_res[0].text: - if isdate: - if ( - xpath_res[0].attrib - and xpath_res[0].attrib.get("format") != "102" - ): - raise UserError(_("Only the date format 102 is supported.")) - date_dt = datetime.strptime(xpath_res[0].text, "%Y%m%d") - date_str = fields.Date.to_string(date_dt) - return date_str - elif isfloat: - res_float = float(xpath_res[0].text) - return res_float - elif ischar_to_clean: - res_char = xpath_res[0].text - if res_char and isinstance(res_char, str): - # With the experience, we'll probably have more things to clean - res_char = res_char.replace("\n", " ") - return res_char - else: - return xpath_res[0].text - return False - - def raw_multi_xpath_helper(self, xml_root, xpath_list, namespaces): - for xpath in xpath_list: - xpath_res = xml_root.xpath(xpath, namespaces=namespaces) - if xpath_res: - return xpath_res - return [] - @api.model def message_new(self, msg_dict, custom_values=None): """Process the message data from a fetchmail configuration @@ -1263,34 +1707,400 @@ def message_new(self, msg_dict, custom_values=None): attach_bytes = attach.content.encode("utf-8") else: attach_bytes = attach.content - origin = _( - "email sent by {email_from} on {date} " - "with subject {subject}", + origin = self.env._( + "email sent by %(email_from)s on %(date)s " + "with subject %(subject)s", email_from=msg_dict.get("email_from") and html.escape(msg_dict["email_from"]), date=msg_dict.get("date"), subject=msg_dict.get("subject") and html.escape(msg_dict["subject"]), ) + company = self.env + import_config = { + "company_id": company_id, + "email_from": msg_dict.get("email_from"), + "origin": origin, + # "debug_disable_company_check": True, + } + try: - invoice_id = self.create_invoice_webservice( - base64.b64encode(attach_bytes), - filename, - company_id, - origin, - email_from=msg_dict.get("email_from"), + parsed_inv = self.parse_invoice( + attach_bytes, filename, import_config ) + invoice = self.create_invoice(parsed_inv, import_config) logger.info( - "Invoice ID %d created from email attachment %s.", - invoice_id, - filename, + f"Invoice ID {invoice.id} created from " + f"email attachment {filename}." ) - except Exception as e: + except Exception as err: logger.error( - "Failed to import invoice from mail attachment %s. Error: %s", - filename, - e, + f"Failed to import invoice from mail attachment {filename}. " + f"Error: {err}" ) else: logger.info("The email has no attachments, skipped.") return self.create({}) + + def _get_partner_dict(self, parsed_inv, import_config): + if import_config["invoice_type"] == "in": + partner_dict = parsed_inv.get("BG-4") + else: + partner_dict = parsed_inv.get("BG-7") + return partner_dict or {} + + def _get_company_dict(self, parsed_inv, import_config): + if import_config["invoice_type"] == "in": + company_dict = parsed_inv.get("BG-7") + else: + company_dict = parsed_inv.get("BG-4") + return company_dict or {} + + @api.model + def _match_partner(self, parsed_inv, import_config): + partner_dict = self._get_partner_dict(parsed_inv, import_config) + partner = False + if partner_dict.get("vat_identifier"): + raw_vat = partner_dict["vat_identifier"] + vat = "".join(x for x in raw_vat if not x.isspace()).upper() or False + if vat: + partner = self.env["res.partner"].search( + [ + ("vat", "=", vat), + # ('parent_id', '=', False), + ("company_id", "in", (import_config["company"].id, False)), + ], + limit=1, + ) + if partner: + msg = f"Partner '{partner.display_name}' matched via VAT number" + self._info_log(import_config, msg) + return partner + if import_config.get("email_from"): + _partner_name, email = parseaddr(import_config["email_from"]) + if email: + partner = self.env["res.partner"].search( + [ + ("email", "=like", email), + ("company_id", "in", (import_config["company"].id, False)), + ], + limit=1, + ) + if partner: + msg = f"Partner '{partner.display_name}' matched via email" + self._info_log(import_config, msg) + return partner + return partner + + @api.model + def _match_product(self, line_dict, parsed_inv, import_config): + # parsed_inv is useful when inheriting this method + # modify the behavior for a specific supplier + product_obj = self.env["product.product"] + base_domain = [("company_id", "in", (False, import_config["company"].id))] + msg_prefix = f"Invoice line {line_dict['BT-126']}:" + if line_dict.get("BT-157"): + product = product_obj.search( + base_domain + [("barcode", "=", line_dict["BT-157"])], limit=1 + ) + if product: + msg = ( + f"{msg_prefix} product {product.display_name} " + "matched via barcode (BT-157)" + ) + self._info_log(import_config, msg) + return product + else: + msg = ( + f"{msg_prefix} no product with barcode '{line_dict['BT-157']}' " + "found in Odoo" + ) + self._info_log(import_config, msg) + if line_dict.get("BT-156"): + product = product_obj.search( + base_domain + [("default_code", "=", line_dict["BT-156"])], limit=1 + ) + if product: + msg = ( + f"{msg_prefix} product {product.display_name} matched via buyer " + "product identifier (BT-156)" + ) + self._info_log(import_config, msg) + return product + else: + msg = ( + f"{msg_prefix} no product with internal reference " + f"'{line_dict['BT-156']}' (buyer product identifier BT-156) " + "found in Odoo" + ) + self._info_log(import_config, msg) + if line_dict.get("BT-155") and import_config.get("commercial_partner"): + sinfo = self.env["product.supplierinfo"].search( + base_domain + + [ + ("product_code", "=", line_dict["BT-155"]), + ("partner_id", "=", import_config["commercial_partner"].id), + ], + limit=1, + ) + if sinfo: + msg = ( + f"{msg_prefix} product {product.display_name} matched " + "via seller product identifier (BT-155)" + ) + if sinfo.product_id: + self._info_log(import_config, msg) + return sinfo.product_id + if ( + sinfo.product_tmpl_id + and len(sinfo.product_tmpl_id.product_variant_ids) == 1 + ): + self._info_log(import_config, msg) + return sinfo.product_tmpl_id.product_variant_ids + else: + msg = ( + f"{msg_prefix} no product with code '{line_dict['BT-155']}' " + "(seller product identifier BT-155) found in the supplier info " + "records of Odoo" + ) + self._info_log(import_config, msg) + # msg = f"NO product with code {line_dict['BT-155']}" + # import_config['line_warnings'][line_dict.get('BT-126')].append(msg) + return None + + @api.model + def _match_uom(self, line_dict, parsed_inv, import_config): + uom_unece2rec = import_config["speedy"]["uom_unece2rec"] + import_remap = { + "EA": "C62", + } + if line_dict.get("BT-130"): + if line_dict["BT-130"] in uom_unece2rec: + return uom_unece2rec[line_dict["BT-130"]] + if line_dict["BT-130"] in import_remap: + uom_code = import_remap[line_dict["BT-130"]] + if uom_code in uom_unece2rec: + return uom_unece2rec[uom_code] + msg = ( + f"Line {line_dict.get('BT-126')}: no unit of measure with " + f"UNECE code '{line_dict['BT-130']}' in Odoo" + ) + # import_config['line_warnings'][line_dict.get('BT-126')].append(msg) + self._warning_log(import_config, msg) + return False + + def _match_vat_tax_common( + self, line_ident, vat_categ_code, vat_rate_int, parsed_inv, import_config + ): + bt8_to_odoo = { + "invoice": "on_invoice", + "delivery": "on_invoice", + "payment": "on_payment", + } + tax_exigibility = ( + parsed_inv.get("BT-8") and bt8_to_odoo.get(parsed_inv["BT-8"]) or False + ) + msg_prefix = f"Invoice line {line_ident}:" + vat_tax2rec = import_config["vat_tax2rec"] + tax = vat_tax2rec.get((vat_categ_code, vat_rate_int, tax_exigibility)) + if tax: + return tax + for (tax_vat_categ_code, tax_vat_rate_int, _exig), tax in vat_tax2rec.items(): + if ( + tax_vat_categ_code == vat_categ_code + and tax_vat_rate_int == vat_rate_int + ): + return tax + for (tax_vat_categ_code, _rate, _exig), tax in vat_tax2rec.items(): + if tax_vat_categ_code == vat_categ_code: + msg = ( + f"{msg_prefix} approx match on tax {tax.display_name} " + "using only VAT categ code" + ) + self._warning_log(import_config, msg) + return tax + return False + + @api.model + def _match_vat_tax_bg25(self, line_dict, parsed_inv, import_config): + vat_categ_code = line_dict.get("BT-151") + vat_rate_int = ( + line_dict.get("BT-152") and int(round(line_dict["BT-152"] * 100)) or False + ) + line_ident = line_dict["BT-126"] + return self._match_vat_tax_common( + line_ident, vat_categ_code, vat_rate_int, parsed_inv, import_config + ) + + @api.model + def _match_vat_tax_bg23(self, line_nr, vat_line_dict, parsed_inv, import_config): + vat_categ_code = vat_line_dict.get("BT-118") + vat_rate_int = ( + vat_line_dict.get("BT-119") + and int(round(vat_line_dict["BT-119"] * 100)) + or False + ) + return self._match_vat_tax_common( + line_nr, vat_categ_code, vat_rate_int, parsed_inv, import_config + ) + + @api.model + def _match_bank_account(self, commercial_partner, parsed_inv, import_config): + assert import_config["invoice_type"] == "in" + bank_account_number = parsed_inv.get("BT-84") + bank_acc_obj = self.env["res.partner.bank"] + if bank_account_number: + sanitized_acc_number = sanitize_account_number(bank_account_number) + bank_account = bank_acc_obj.with_context(active_test=False).search( + [ + ("partner_id", "=", commercial_partner.id), + ("sanitized_acc_number", "=", sanitized_acc_number), + ], + limit=1, + ) + if bank_account: + msg = ( + f"Matched on bank account {bank_account.display_name} " + "of partner {commercial_partner.display_name} " + "(allow_out_payment={bank_account.allow_out_payment})" + ) + if not bank_account.allow_out_payment: + import_config["global_warnings"].append( + self.env._( + "Matched with bank account " + "%(bank_account)s, " + "but this bank account is not allowed yet " + "for outgoing payments.", + bank_account=bank_account.display_name, + ) + ) + if not bank_account.active: + import_config["global_warnings"].append( + self.env._( + "Matched with bank account " + "%(bank_account)s, " + "but this bank account is archived. " + "You should re-activate it.", + bank_account=bank_account.display_name, + ) + ) + self._info_log(import_config, msg) + return bank_account + if import_config["create_bank_account"]: + bank_id = False + bic = parsed_inv.get("BT-86") + if bic and len(bic) in (8, 11): + if len(bic) == 8: + alt_bic = f"{bic}XXX" + bank_domain = [("bic", "in", (bic, alt_bic))] + elif len(bic) == 11 and bic.endswith("XXX"): + alt_bic = bic[:8] + bank_domain = [("bic", "in", (bic, alt_bic))] + else: + bank_domain = [("bic", "=", bic)] + bank_ids = list(self.env["res.bank"]._search(bank_domain, limit=1)) + bank_id = bank_ids and bank_ids[0] or False + country_id2code = import_config["speedy"]["country_id2code"] + # for SEPA countries, we don't create bank accounts that are not + # IBANs and where the bank account number doesn't start with the + # country code + sepa_country_group = self.env.ref("base.sepa_zone") + sepa_country_codes = [ + country_id2code[country.id] + for country in sepa_country_group.country_ids + if country_id2code.get(country.id) + ] + vendor_country_code = parsed_inv.get("BG-4", {}).get("country_code") + if vendor_country_code and vendor_country_code in sepa_country_codes: + if not iban_is_valid(sanitized_acc_number): + import_config["global_warnings"].append( + self.env._( + "Bank account '%(acc_number)s' hasn't been created " + "automatically because the vendor's country is in the " + "SEPA zone and the bank account number is not " + "a valid IBAN.", + acc_number=sanitized_acc_number, + ) + ) + return False + if not sanitized_acc_number.startswith(vendor_country_code): + import_config["global_warnings"].append( + self.env._( + "Bank account '%(acc_number)s' hasn't been created " + "automatically because the vendor's country " + "(%(vendor_country_code)s) is different from the " + "country of the IBAN.", + acc_number=sanitized_acc_number, + vendor_country_code=vendor_country_code, + ) + ) + return False + vals = { + "partner_id": commercial_partner.id, + "acc_number": sanitized_acc_number, + "bank_id": bank_id, + } + if hasattr(bank_acc_obj, "acc_type_manual"): + # if OCA module partner_bank_acc_type_constraint is installed + if iban_is_valid(sanitized_acc_number): + vals["acc_type_manual"] = "iban" + else: + vals["acc_type_manual"] = "bank" + bank_account = bank_acc_obj.create(vals) + import_config["global_warnings"].append( + self.env._( + "New bank account %(bank_account)s created. " + "You must check that this bank account really belongs to " + "the vendor and then allow it for outgoing payments.", + bank_account=bank_account.display_name, + ) + ) + else: + import_config["global_warnings"].append( + self.env._( + "The electronic invoice states the bank account number " + "%(bank_account_number)s, " + "but this bank account doesn't exist in Odoo for partner " + "%(commercial_partner)s and the option to " + "auto-create bank accounts upon invoice import is not enabled.", + bank_account_number=bank_account_number, + commercial_partner=commercial_partner.display_name, + ) + ) + return bank_account + return False + + @api.model + def _info_log(self, import_config, msg): + logger.info(msg) + import_config["logs"].append(("info", msg)) + + @api.model + def _warning_log(self, import_config, msg): + logger.warning(msg) + import_config["logs"].append(("warning", msg)) + + @api.model + def _error_log(self, import_config, msg): + logger.error(msg) + import_config["logs"].append(("error", msg)) + + @api.model + def _get_lang_from_country_code(self, country_code, import_config): + assert country_code + try: + locale = Locale.parse(f"und_{country_code.upper()}") + country_lang_code = locale.language + except Exception as err: + msg = f"Failed to get lang from country code '{country_code}': Error: {err}" + self._warning_log(import_config, msg) + return False + full_lang_code = f"{country_lang_code}_{country_code}" + installed_langs = import_config["speedy"]["installed_langs"] + for lang_code in installed_langs: + if lang_code == full_lang_code: + return lang_code + for lang_code in installed_langs: + if country_lang_code == lang_code[:2]: + return lang_code + return False diff --git a/account_invoice_import/wizard/account_invoice_import_partner_create.py b/account_invoice_import/wizard/account_invoice_import_partner_create.py index 29efb00a6b..5fe57b1156 100644 --- a/account_invoice_import/wizard/account_invoice_import_partner_create.py +++ b/account_invoice_import/wizard/account_invoice_import_partner_create.py @@ -45,12 +45,24 @@ def default_get(self, fields_list): res["import_partner_data"] = import_partner_data if import_partner_data.get("vat"): res["partner_vat"] = import_partner_data["vat"] + # Partner may have been created in the meantime + existing_partner = self.env["res.partner"].search( + [ + ("company_id", "in", (False, move.company_id.id)), + ("vat", "=", import_partner_data["vat"]), + ], + limit=1, + ) + if existing_partner: + update_partner_id = existing_partner.commercial_partner_id.id + res.update( + { + "update_partner_id": update_partner_id, + "create_or_update": "update", + } + ) if import_partner_data.get("name"): res["partner_name"] = import_partner_data["name"] - # Partner may have been created in the meantime - res["update_partner_id"] = self.env[ - "business.document.import" - ]._match_partner(import_partner_data, [], raise_exception=False) return res def create_partner(self): diff --git a/account_invoice_import/wizard/account_invoice_import_view.xml b/account_invoice_import/wizard/account_invoice_import_view.xml index e200063766..402c713631 100644 --- a/account_invoice_import/wizard/account_invoice_import_view.xml +++ b/account_invoice_import/wizard/account_invoice_import_view.xml @@ -11,22 +11,35 @@

    Upload below the vendor bills/refunds as PDF or XML file: Odoo will create a draft vendor bills refund for each file.

    + >Upload below the vendor bills/refunds as PDF or XML file: Odoo will create a draft vendor bill/refund for each file.

    Supported formats:

    -
      +
        +
      • UBL (Universal Business Language) XML,
      • +
      • CII (Cross Industry Invoice) XML,
      • +
      • Factur-X (PDF invoice with embedded CII XML file),
      • +

      If the format you need is not listed above, you should install an additionnal Odoo module that adds support for that format (e.g. account_invoice_import_facturx, account_invoice_import_ubl, account_invoice_import_simple_pdf, etc).

      + >If the format you need is not listed above, you should install an additionnal Odoo module that adds support for that format.

    - + + +