diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 56b5daca9032..b812585c2a77 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -20,7 +20,8 @@ exclude: | (l10n_it_fatturapa/data/fatturaordinaria_v1.2.1.xsl)| (l10n_it_fatturapa/data/FoglioStileAssoSoftware_v1.1.xsl)| # XML tests should not be reformatted - ^l10n_it_fatturapa_out/tests/data + ^l10n_it_fatturapa_out/tests/data| + ^l10n_it_fatturapa_in/tests/data default_language_version: python: python3 node: "14.13.0" @@ -134,6 +135,7 @@ repos: args: - --rcfile=.pylintrc - --exit-zero + - --ignore=l10n_it_fatturapa_in/tests/data/ verbose: true additional_dependencies: &pylint_deps - pylint-odoo==3.5.0 @@ -141,4 +143,5 @@ repos: name: pylint with mandatory checks args: - --rcfile=.pylintrc-mandatory + - --ignore=l10n_it_fatturapa_in/tests/data/ additional_dependencies: *pylint_deps diff --git a/l10n_it_fatturapa_in/README.rst b/l10n_it_fatturapa_in/README.rst new file mode 100644 index 000000000000..6ef0b35fb13f --- /dev/null +++ b/l10n_it_fatturapa_in/README.rst @@ -0,0 +1,194 @@ +===================================== +ITA - Fattura elettronica - Ricezione +===================================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fl10n--italy-lightgray.png?logo=github + :target: https://github.com/OCA/l10n-italy/tree/14.0/l10n_it_fatturapa_in + :alt: OCA/l10n-italy +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/l10n-italy-14-0/l10n-italy-14-0-l10n_it_fatturapa_in + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/122/14.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +**Italiano** + +Questo modulo consente di importare i file XML della fattura elettronica versione 1.2 + +http://www.fatturapa.gov.it/export/fatturazione/it/normativa/f-2.htm + +ricevuti attraverso il Sistema di Interscambio (SdI). + +http://www.fatturapa.gov.it/export/fatturazione/it/sdi.htm + +**English** + +This module allows to import Electronic Bill XML files version 1.2 + +http://www.fatturapa.gov.it/export/fatturazione/en/normativa/f-2.htm + +received through the Exchange System (ES). + +http://www.fatturapa.gov.it/export/fatturazione/en/sdi.htm + +**Table of contents** + +.. contents:: + :local: + +Installation +============ + +**Italiano** + +Questo modulo richiede asn1crypto + +https://github.com/wbond/asn1crypto + +**English** + +This module requires asn1crypto + +https://github.com/wbond/asn1crypto + +Configuration +============= + +**Italiano** + +Consultare anche il file README del modulo l10n_it_fatturapa. + +Per ciascun fornitore è possibile impostare il "Livello dettaglio e-fatture": + + - Livello minimo: la fattura fornitore viene creata senza righe, che dovranno essere create dall'utente in base a quanto indicato nella fattura elettronica + - Livello massimo: le righe della fattura fornitore verranno generate a partire da tutte quelle presenti nella fattura elettronica + +Nella scheda fornitore è inoltre possibile impostare il "Prodotto predefinito per e-fattura": verrà usato, durante la generazione delle fatture fornitore, quando non sono disponibili altri prodotti adeguati. Il conto e l'imposta della riga fattura verranno impostati in base a quelli configurati nel prodotto. + +Tutti i codici prodotto usati dai fornitori possono essere impostati nella relativa scheda, in + +Magazzino → Prodotti + +Se il fornitore specifica un codice noto nell'XML, questo verrà usato dal sistema per recuperare il prodotto corretto da usare nella riga fattura, impostando il conto e l'imposta collegati. + +**English** + +See also the README file of l10n_it_fatturapa module. + +For every supplier, it is possible to set the 'E-bills Detail Level': + + - Minimum level: Bill is created with no lines; User will have to create them, according to what specified in the electronic bill + - Maximum level: Every line contained in electronic bill will create a line in bill + +Moreover, in supplier form you can set the 'E-bill Default Product': this product will be used, during generation of bills, when no other possible product is found. Tax and account of bill line will be set according to what configured in the product. + +Every product code used by suppliers can be set, in product form, in + +Inventory → Products + +If supplier specifies a known code in XML, the system will use it to retrieve the correct product to be used in bill line, setting the related tax and account. + +Usage +===== + +**Italiano** + + * Andare in Contabilità → Acquisti → Fattura elettronica + * Caricare un file XML + * Visualizzare il contenuto della fattura facendo clic su "Mostra anteprima" + * Eseguire la procedura guidata "Importa e-fattura" per creare una fattura in bozza oppure "Collega a fattura esistente" per collegare il file XML a una fattura già (automaticamente) creata + +Nell'elenco file delle fatture elettroniche in ingresso saranno presenti, in modo predefinito, quelli da registrare. Sono i file che devono ancora essere collegati a una o più fatture fornitore. + +**English** + + * Go to Accounting → Purchases → Electronic Bill + * Upload XML file + * View bill content clicking on 'Show preview' + * Run 'Import e-bill' wizard to create a draft bill or run 'Link to existing bill' to link the XML file to an already (automatically) created bill + +In the incoming electronic bill files list you will see, by default, files to be registered. These are files not yet linked to one or more bills. + +Known issues / Roadmap +====================== + +Il modulo contiene un cambiamento alla firma di un metodo in ``models/account.py`` +il quale cambia da + +``compute_xml_amount_untaxed(self, DatiRiepilogo)`` + +a + +``compute_xml_amount_untaxed(self, FatturaBody)`` + +Il cambiamento è dovuto all'implementazione della gestione degli arrotondamenti +che posso essere presenti in 2 sezioni diverse del file XML della fattura elettronica. + +La soluzione ottimale è stata di cambiare la firma del metodo per consentire +la visibilità delle sezioni ``FatturaElettronicaBody.DatiBeniServizi.DatiRiepilogo`` e +``FatturaElettronicaBody.DatiGenerali.DatiGeneraliDocumento`` dove è presente il nodo ``Arrotondamento`` + +Pertanto, al fine di ottenere il corretto valore del totale imponibile, i moduli che +avessero ridefinito il metodo ``compute_xml_amount_untaxed`` nel modello ``account.invoice`` +dovranno adeguare la chiamata al metodo stesso preoccupandosi di utilizzare come primo parametro l'oggetto ``FatturaElettronicaBody``. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Agile Business Group +* Innoviu + +Contributors +~~~~~~~~~~~~ + +* Lorenzo Battistini +* Roberto Onnis +* Alessio Gerace +* Sergio Zanchetta +* Giovanni Serra +* Gianmarco Conte +* Marco Colombo + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/l10n-italy `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/l10n_it_fatturapa_in/__init__.py b/l10n_it_fatturapa_in/__init__.py new file mode 100644 index 000000000000..0182fc47ed18 --- /dev/null +++ b/l10n_it_fatturapa_in/__init__.py @@ -0,0 +1,3 @@ +from . import models +from . import tests +from . import wizard diff --git a/l10n_it_fatturapa_in/__manifest__.py b/l10n_it_fatturapa_in/__manifest__.py new file mode 100644 index 000000000000..5694c0af7daf --- /dev/null +++ b/l10n_it_fatturapa_in/__manifest__.py @@ -0,0 +1,35 @@ +# Copyright 2015 AgileBG SAGL +# Copyright 2015 innoviu Srl +# Copyright 2018 Lorenzo Battistini +# Copyright 2018 Sergio Zanchetta (Associazione PNLUG - Gruppo Odoo) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "ITA - Fattura elettronica - Ricezione", + "version": "14.0.1.0.0", + "development_status": "Alpha", + "category": "Localization/Italy", + "summary": "Ricezione fatture elettroniche", + "author": "Agile Business Group, Innoviu, " "Odoo Community Association (OCA)", + "website": "https://github.com/OCA/l10n-italy" "l10n_it_fatturapa_in", + "license": "AGPL-3", + "depends": [ + "base_vat", + "l10n_it_fatturapa", + "l10n_it_fiscal_document_type", + "l10n_it_withholding_tax_reason", + ], + "data": [ + "views/account_view.xml", + "views/partner_view.xml", + "wizard/wizard_import_fatturapa_view.xml", + "wizard/link_to_existing_invoice.xml", + "views/company_view.xml", + "security/ir.model.access.csv", + "security/rules.xml", + ], + "installable": True, + "external_dependencies": { + "python": ["elementpath", "xmlschema", "asn1crypto"], + }, +} diff --git a/l10n_it_fatturapa_in/i18n/it.po b/l10n_it_fatturapa_in/i18n/it.po new file mode 100644 index 000000000000..91a0bf91e528 --- /dev/null +++ b/l10n_it_fatturapa_in/i18n/it.po @@ -0,0 +1,1726 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_it_fatturapa_in +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-09-27 08:07+0000\n" +"PO-Revision-Date: 2020-10-05 08:16+0000\n" +"Last-Translator: Lorenzo Battistini \n" +"Language-Team: \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 3.10\n" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_account_config_settings_ftpa_in +msgid "" +"" +msgstr "" +"" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_account_config_settings_ftpa_in +msgid "" +"Supplier Invoices\n" +" " +msgstr "" +"Fatture fornitori\n" +" " + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__access_token +msgid "Access Token" +msgstr "Token di accesso" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_res_company__arrotondamenti_passivi_account_id +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_res_config_settings__arrotondamenti_passivi_account_id +msgid "Account used to round down bills amount." +msgstr "Conto usato per gli arrotonamenti passivi dell'importo delle fatture." + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_res_company__arrotondamenti_attivi_account_id +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_res_config_settings__arrotondamenti_attivi_account_id +msgid "Account used to round up bills amount." +msgstr "Conto usato per gli arrotondamenti attivi dell'importo delle fatture." + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_needaction +msgid "Action Needed" +msgstr "Azione richiesta" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__active +msgid "Active" +msgstr "Attivo" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__admin_ref +msgid "Administration Reference" +msgstr "Riferimento amministrazione" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Amount Summary" +msgstr "Riepilogo importo" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__cod_article_ids +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Articles Code" +msgstr "Codice articoli" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__ir_attachment_id +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice__attachment_id +msgid "Attachment" +msgstr "Allegato" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_attachment_count +msgid "Attachment Count" +msgstr "Totale allegati" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__local_url +msgid "Attachment URL" +msgstr "URL allegato" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/models/attachment.py:118 +#, python-format +msgid "Attachment without name" +msgstr "Allegato senza nome" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Attachments" +msgstr "Allegati" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:750 +#, python-format +msgid "" +"BIC is required and not exist in Xml\n" +"Curr bank data is: \n" +"IBAN: %s\n" +"Bank Name: %s\n" +msgstr "" +"BIC è richiesto e non esiste nell'XML\n" +"I dati correnti della banca sono: \n" +"IBAN: %s\n" +"Nome banca: %s\n" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__invoice_id +msgid "Bill" +msgstr "Fattura" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice_line__e_invoice_nbr +msgid "Bill number in XML" +msgstr "Numero fattura nell'XML" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/link_to_existing_invoice.py:94 +#, python-format +msgid "" +"Bill number {bill_nbr} of {bill_date}.\n" +"Total no tax: {bill_no_tax}\n" +"Total tax: {bill_tax}" +msgstr "" +"Numero fattura {bill_nbr} del {bill_date}.\n" +"Totale imponibile: {bill_no_tax}\n" +"Totale imposte: {bill_tax}" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1419 +#, python-format +msgid "Bill total %s is different from document total amount %s" +msgstr "Il totale fattura %s è diverso dall'importo totale del documento %s" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_fatturapa_in_attachment_form +msgid "Bills" +msgstr "Fatture" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__invoices_number +msgid "Bills Number" +msgstr "Numero fatture" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__invoices_total +msgid "Bills Total" +msgstr "Totale fatture" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.wizard_import_fatturapa_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.wizard_link_supplier_invoice +msgid "Cancel" +msgstr "Annulla" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__checksum +msgid "Checksum/SHA1" +msgstr "Checksum/SHA1" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_article_code__name +msgid "Code Type" +msgstr "Tipo codice" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_article_code__code_val +msgid "Code Value" +msgstr "Valore codice" + +#. module: l10n_it_fatturapa_in +#: model:ir.model,name:l10n_it_fatturapa_in.model_res_company +msgid "Companies" +msgstr "Aziende" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__company_id +msgid "Company" +msgstr "Azienda" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:91 +#, python-format +msgid "Company Name field contains '%s'. Your System contains '%s'" +msgstr "Il campo nome azienda contiene \"%s\", il sistema contiene \"%s\"" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1434 +#, python-format +msgid "Computed amount untaxed %s is different from summary data %s" +msgstr "L'imponibile calcolato %s è diverso da quello dei dati di riepilogo %s" + +#. module: l10n_it_fatturapa_in +#: model:ir.model,name:l10n_it_fatturapa_in.model_res_config_settings +msgid "Config Settings" +msgstr "Impostazioni di configurazione" + +#. module: l10n_it_fatturapa_in +#: model:ir.model,name:l10n_it_fatturapa_in.model_res_partner +msgid "Contact" +msgstr "Contatto" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:184 +#, python-format +msgid "Country Code %s not found in system." +msgstr "Codice nazione %s non trovato nel sistema." + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__create_uid +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line_other_data__create_uid +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_article_code__create_uid +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__create_uid +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_import_fatturapa__create_uid +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice__create_uid +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice_line__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__create_date +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line_other_data__create_date +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_article_code__create_date +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__create_date +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_import_fatturapa__create_date +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice__create_date +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice_line__create_date +msgid "Created on" +msgstr "Creato il" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_fatturapa_in_attachment_form +msgid "Creation" +msgstr "Creazione" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:294 +#, python-format +msgid "" +"Current invoice is from {} with REA Code {}. Yet it seems that partners {} " +"have the same REA Code. This code should be unique; please fix it." +msgstr "" +"La fattura corrente viene da {} con codice REA {}. Tuttavia sembra che i " +"partner {} abbiano lo stesso codice REA. questo codice dovrebbe essere " +"unico; prego correggere." + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line_other_data__name +msgid "Data Type" +msgstr "Tipo dati" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__db_datas +msgid "Database Data" +msgstr "Dati database" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line_other_data__date_ref +msgid "Date Reference" +msgstr "Riferimento data" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_account_config_settings_ftpa_in +msgid "Default products used in electronic supplier invoices" +msgstr "Prodotti predefiniti usati nelle fatture elettroniche fornitore" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:805 +#, python-format +msgid "Define a purchase journal for this company: '%s' (id: %d)." +msgstr "Definire un registro di acquisto per questa azienda: \"%s\" (ID: %d)." + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Delivery" +msgstr "Consegna" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__name +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__description +msgid "Description" +msgstr "Descrizione" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Discount Supplement" +msgstr "Sconto maggiorazione" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_res_company__sconto_maggiorazione_product_id +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_res_config_settings__sconto_maggiorazione_product_id +msgid "Discount Supplement Product" +msgstr "Prodotto per sconto maggiorazione" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__discount_rise_price_ids +msgid "Discount and Supplement Details" +msgstr "Dettagli sconto e maggiorazione" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__display_name +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line_other_data__display_name +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_article_code__display_name +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__display_name +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_import_fatturapa__display_name +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice__display_name +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice_line__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:904 +#, python-format +msgid "Document type %s not handled." +msgstr "Tipo documento %s non gestito." + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_account_invoice__e_invoice_validation_error +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__e_invoice_validation_error +msgid "E Invoice Validation Error" +msgstr "Errore di validazione e-fattura" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_account_invoice__e_invoice_validation_message +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__e_invoice_validation_message +msgid "E Invoice Validation Message" +msgstr "Messaggio di validazione e-fattura" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_account_invoice__e_invoice_received_date +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__e_invoice_received_date +msgid "E-Bill Received Date" +msgstr "Data ricezione e-fattura" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_account_invoice__e_invoice_amount_tax +msgid "E-Invoice Tax Amount" +msgstr "Importo imposta e-fattura" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_account_invoice__e_invoice_amount_total +msgid "E-Invoice Total Amount" +msgstr "Importo totale e-fattura" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_account_invoice__e_invoice_amount_untaxed +msgid "E-Invoice Untaxed Amount" +msgstr "Imponibile e-fattura" + +#. module: l10n_it_fatturapa_in +#: model:ir.model,name:l10n_it_fatturapa_in.model_fatturapa_article_code +msgid "E-bill Article Code" +msgstr "Codice articolo e-fattura" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_res_partner__e_invoice_default_product_id +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_res_users__e_invoice_default_product_id +msgid "E-bill Default Product" +msgstr "Prodotto predefinito per e-fattura" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "E-bill Details" +msgstr "Dettagli e-fattura" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_account_invoice__fatturapa_attachment_in_id +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_account_invoice_line__fatturapa_attachment_in_id +msgid "E-bill Import File" +msgstr "File importato e-fattura" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "E-bill Inconsistencies" +msgstr "Incongruenze e-fattura" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/models/account.py:168 +#, python-format +msgid "" +"E-bill contains DatiRitenuta but no lines subjected to Ritenuta was found. " +"Please manually check Withholding tax Amount\n" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/models/account.py:177 +#, python-format +msgid "E-bill contains ImportoRitenuta %s but created invoice has got %s\n" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice_line__e_invoice_descr +msgid "E-bill description" +msgstr "Descrizione e-fattura" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__att_name +msgid "E-bill file name" +msgstr "Nome file e-fattura" + +#. module: l10n_it_fatturapa_in +#: model:ir.model,name:l10n_it_fatturapa_in.model_fatturapa_attachment_in +msgid "E-bill import file" +msgstr "File importato e-fattura" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_res_partner__e_invoice_detail_level +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_res_users__e_invoice_detail_level +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_import_fatturapa__e_invoice_detail_level +msgid "E-bills Detail Level" +msgstr "Livello di dettaglio e-fatture" + +#. module: l10n_it_fatturapa_in +#: model:ir.model,name:l10n_it_fatturapa_in.model_discount_rise_price +msgid "E-invoice Discount Supplement Data" +msgstr "Dati sconto maggiorazione e-fattura" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_account_invoice__e_invoice_date_invoice +msgid "E-invoice date" +msgstr "Data e-fattura" + +#. module: l10n_it_fatturapa_in +#: model:ir.model,name:l10n_it_fatturapa_in.model_einvoice_line +msgid "E-invoice line" +msgstr "Riga e-fattura" + +#. module: l10n_it_fatturapa_in +#: model:ir.model,name:l10n_it_fatturapa_in.model_einvoice_line_other_data +msgid "E-invoice line other data" +msgstr "Altri dati riga e-fattura" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_account_invoice__e_invoice_reference +msgid "E-invoice vendor reference" +msgstr "Riferimento fornitore e-fattura" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.wizard_import_fatturapa_form_view +msgid "Electronic Bill Import" +msgstr "Importazione fattura elettronica" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:53 +#, python-format +msgid "File %s is linked to bills yet." +msgstr "Il file %s è già collegato a delle fatture." + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__datas +msgid "File Content" +msgstr "Contenuto file" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__file_size +msgid "File Size" +msgstr "Dimensione file" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1457 +#, python-format +msgid "File is linked to bills yet." +msgstr "Il file è già collegato a delle fatture." + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__datas_fname +msgid "Filename" +msgstr "Nome file" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_follower_ids +msgid "Followers" +msgstr "Follower" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_channel_ids +msgid "Followers (Channels)" +msgstr "Follower (canali)" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_partner_ids +msgid "Followers (Partners)" +msgstr "Follower (partner)" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_account_invoice__e_invoice_force_validation +msgid "Force E-Invoice Validation" +msgstr "Forza validazione e-fattura" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "General Data" +msgstr "Dati generali" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:638 +#, python-format +msgid "Global bill discount from document general data" +msgstr "Sconto globale fattura dai dati generali del documento" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_fatturapa_in_attachment_form +msgid "History" +msgstr "Cronologia" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__id +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line_other_data__id +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_article_code__id +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__id +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_import_fatturapa__id +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice__id +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice_line__id +msgid "ID" +msgstr "ID" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_unread +msgid "If checked new messages require your attention." +msgstr "Se selezionato, nuovi messaggi richiedono attenzione." + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_needaction +msgid "If checked, new messages require your attention." +msgstr "Se selezionato, nuovi messaggi richiedono attenzione." + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "Se selezionato, alcuni messaggi presentano un errore di consegna." + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_fatturapa_attachment_in__invoices_total +msgid "" +"If specified by supplier, total amount of the document net of any discount " +"and including tax charged to the buyer/ordered" +msgstr "" +"Se specificato dal fornitore, importo totale del documento al netto di " +"eventuali sconti e comprensivo di imposta a debito del cessionario/" +"committente" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.wizard_import_fatturapa_form_view +msgid "Import" +msgstr "Importa" + +#. module: l10n_it_fatturapa_in +#: model:ir.model,name:l10n_it_fatturapa_in.model_wizard_import_fatturapa +msgid "Import E-bill" +msgstr "Importa e-fattura" + +#. module: l10n_it_fatturapa_in +#: model:ir.actions.act_window,name:l10n_it_fatturapa_in.action_wizard_import_fatturapa +msgid "Import Electronic Bill" +msgstr "Importa fattura elettronica" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_account_invoice__inconsistencies +msgid "Import Inconsistencies" +msgstr "Incongruenze nell'importazione" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_fatturapa_in_attachment_form +msgid "Import e-bill" +msgstr "Importa e-fattura" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__in_invoice_ids +msgid "In Bills" +msgstr "Fatture in ingresso" + +#. module: l10n_it_fatturapa_in +#: model:ir.actions.act_window,name:l10n_it_fatturapa_in.action_fattura_pa_in +#: model:ir.ui.menu,name:l10n_it_fatturapa_in.menu_fattura_pa_in_tree +msgid "Incoming E-bill Files" +msgstr "File e-fatture in ingresso" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__index_content +msgid "Indexed Content" +msgstr "Contenuto indicizzato" + +#. module: l10n_it_fatturapa_in +#: model:ir.model,name:l10n_it_fatturapa_in.model_account_invoice +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice_line__invoice_id +msgid "Invoice" +msgstr "Fattura" + +#. module: l10n_it_fatturapa_in +#: selection:res.company,in_invoice_registration_date:0 +msgid "Invoice Date" +msgstr "Data fattura" + +#. module: l10n_it_fatturapa_in +#: model:ir.model,name:l10n_it_fatturapa_in.model_account_invoice_line +msgid "Invoice Line" +msgstr "Riga fattura" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/models/account.py:225 +#, python-format +msgid "" +"Invoice date ({bill_date_invoice}) does not match with e-bill invoice date " +"({e_bill_date_invoice})" +msgstr "" +"La data fattura ({bill_date_invoice}) non corrisponde con la data della " +"fattura elettronica ({e_bill_date_invoice})" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__invoices_date +msgid "Invoices date" +msgstr "Data fatture" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_is_follower +msgid "Is Follower" +msgstr "È un follower" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__public +msgid "Is public document" +msgstr "È un documento pubblico" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__key +msgid "Key" +msgstr "Chiave" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line____last_update +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line_other_data____last_update +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_article_code____last_update +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in____last_update +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_import_fatturapa____last_update +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice____last_update +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice_line____last_update +msgid "Last Modified on" +msgstr "Ultima modifica il" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__write_uid +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line_other_data__write_uid +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_article_code__write_uid +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__write_uid +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_import_fatturapa__write_uid +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice__write_uid +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice_line__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__write_date +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line_other_data__write_date +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_article_code__write_date +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__write_date +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_import_fatturapa__write_date +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice__write_date +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice_line__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice__line_ids +msgid "Line" +msgstr "Riga" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Line Detail" +msgstr "Dettaglio riga" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__line_number +msgid "Line Number" +msgstr "Numero riga" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_account_invoice__e_invoice_line_ids +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Lines Detail" +msgstr "Dettaglio righe" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.wizard_link_supplier_invoice +msgid "Link" +msgstr "Collega" + +#. module: l10n_it_fatturapa_in +#: model:ir.model,name:l10n_it_fatturapa_in.model_wizard_link_to_invoice_line +msgid "Link e-bill to bill" +msgstr "Collega a fattura" + +#. module: l10n_it_fatturapa_in +#: model:ir.model,name:l10n_it_fatturapa_in.model_wizard_link_to_invoice +msgid "Link to Bill" +msgstr "Collega a fattura" + +#. module: l10n_it_fatturapa_in +#: model:ir.actions.act_window,name:l10n_it_fatturapa_in.action_wizard_link_supplier_invoice +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.wizard_link_supplier_invoice +msgid "Link to existing supplier bills" +msgstr "Collega a fatture fornitore esistenti" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_main_attachment_id +msgid "Main Attachment" +msgstr "Allegato principale" + +#. module: l10n_it_fatturapa_in +#: selection:res.partner,e_invoice_detail_level:0 +#: selection:wizard.import.fatturapa,e_invoice_detail_level:0 +msgid "Maximum" +msgstr "Massimo" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_has_error +msgid "Message Delivery error" +msgstr "Errore di consegna messaggio" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_ids +msgid "Messages" +msgstr "Messaggi" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__mimetype +msgid "Mime Type" +msgstr "Tipo MIME" + +#. module: l10n_it_fatturapa_in +#: selection:res.partner,e_invoice_detail_level:0 +#: selection:wizard.import.fatturapa,e_invoice_detail_level:0 +msgid "Minimum" +msgstr "Minimo" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_res_partner__e_invoice_detail_level +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_res_users__e_invoice_detail_level +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_wizard_import_fatturapa__e_invoice_detail_level +msgid "" +"Minimum level: Bill is created with no lines; User will have to create them, " +"according to what specified in the electronic bill.\n" +"Tax rate level: Rate level: an invoice line is created for each rate present " +"in the electronic invoice\n" +"Maximum level: every line contained in the electronic bill will create a " +"line in the bill." +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__name +msgid "Name" +msgstr "Nome" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:99 +#, python-format +msgid "Name field contains '%s'. Your System contains '%s'" +msgstr "Il campo nome contiene \"%s\", il sistema contiene \"%s\"" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:726 +#, python-format +msgid "Name of Bank with BIC '%s' is not set. Can't create bank" +msgstr "Impossibile creare la banca con BIC \"%s\", il nome non è impostato." + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__tax_kind +msgid "Nature" +msgstr "Natura" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:882 +#, python-format +msgid "No currency found with code %s." +msgstr "Valuta con codice %s non trovata." + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:351 +#, python-format +msgid "" +"No tax with percentage %s and nature %s found. Please configure this tax." +msgstr "" +"Imposta con aliquota %s e natura %s non trovata, configurare questa imposta." + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1246 +#, python-format +msgid "" +"No withholding tax found with document payment reason %s, rate %s and type " +"%s." +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line_other_data__num_ref +msgid "Number Reference" +msgstr "Riferimento numero" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_needaction_counter +msgid "Number of Actions" +msgstr "Numero di azioni" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_has_error_counter +msgid "Number of error" +msgstr "Numero di errori" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_needaction_counter +msgid "Number of messages which requires an action" +msgstr "Numero di messaggi che richiedono un'azione" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "Numero di messaggi con errore di consegna" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_unread_counter +msgid "Number of unread messages" +msgstr "Numero di messaggi non letti" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_fatturapa_in_attachment_form +msgid "Open full-screen" +msgstr "Apri a tutto schermo" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__other_data_ids +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Other Administrative Data" +msgstr "Altri dati gestionali" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:668 +#, python-format +msgid "Payment method %s is not defined in your system." +msgstr "Modalità di pagamento %s non definita nel sistema." + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1207 +#, python-format +msgid "Payment method code %s is incorrect." +msgstr "Codice modalità di pagamento %s non corretto." + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1202 +#, python-format +msgid "Payment method code not found in document." +msgstr "Codice modalità di pagamento non trovato nel documento." + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Payments" +msgstr "Pagamenti" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Payments Details" +msgstr "Dettagli pagamenti" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__period_end_date +msgid "Period End Date" +msgstr "Data fine periodo" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__period_start_date +msgid "Period Start Date" +msgstr "Data inizio periodo" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__ftpa_preview_link +msgid "Preview link" +msgstr "Collegamento di anteprima" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_res_company__cassa_previdenziale_product_id +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_res_config_settings__cassa_previdenziale_product_id +msgid "Product used to model DatiCassaPrevidenziale XML element on bills." +msgstr "" +"Prodotto usato come modello per l'elemento XML DatiCassaPrevidenziale delle " +"fatture." + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_res_company__sconto_maggiorazione_product_id +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_res_config_settings__sconto_maggiorazione_product_id +msgid "Product used to model ScontoMaggiorazione XML element on bills." +msgstr "" +"Prodotto usato come modello per l'elemento XML ScontoMaggiorazione delle " +"fatture." + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Progress data" +msgstr "Dati stato avanzamento lavori" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:237 +#, python-format +msgid "Province ( %s ) not present in your system" +msgstr "Provincia ( %s ) non presente nel sistema" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__qty +msgid "Quantity" +msgstr "Quantità" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:269 +#, python-format +msgid "REA Office Province Code ( %s ) not present in your system" +msgstr "Codice provincia dell'ufficio REA ( %s ) non presente nel sistema" + +#. module: l10n_it_fatturapa_in +#: selection:res.company,in_invoice_registration_date:0 +msgid "Received Date" +msgstr "Data ricezione" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:226 +#, python-format +msgid "Register Province ( %s ) not present in your system" +msgstr "Provincia Albo ( %s ) non presente nel sistema" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__registered +msgid "Registered" +msgstr "Registrato" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Related Documents" +msgstr "Documenti collegati" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_discount_rise_price__e_invoice_line_id +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line_other_data__e_invoice_line_id +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_article_code__e_invoice_line_id +msgid "Related E-bill Line" +msgstr "Riga e-fattura collegata" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_fatturapa_in_attachment_form +msgid "Remove" +msgstr "Rimuovi" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__res_model_name +msgid "Res Model Name" +msgstr "Nome modello risorsa" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__res_field +msgid "Resource Field" +msgstr "Campo risorsa" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__res_id +msgid "Resource ID" +msgstr "ID risorsa" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__res_model +msgid "Resource Model" +msgstr "Modello risorsa" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__res_name +msgid "Resource Name" +msgstr "Nome risorsa" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_res_company__arrotondamenti_passivi_account_id +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_res_config_settings__arrotondamenti_passivi_account_id +msgid "Round Down Account" +msgstr "Conto arrotondamenti passivi" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_res_company__arrotondamenti_attivi_account_id +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_res_config_settings__arrotondamenti_attivi_account_id +msgid "Round Up Account" +msgstr "Conto arrotondamenti attivi" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/models/account.py:77 +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1122 +#, python-format +msgid "Round down account is not set in Accounting Settings" +msgstr "" +"Il conto per l'arrotondamento passivo non è impostato in configurazione " +"contabilità" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/models/account.py:84 +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1116 +#, python-format +msgid "Round up account is not set in Accounting Settings" +msgstr "" +"Il conto per l'arrotondamento attivo non è impostato in configurazione " +"contabilità" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1129 +#, python-format +msgid "Round up and down tax is not set" +msgstr "L'imposta per l'arrotondamento attivo e passivo non è impostata" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_res_company__arrotondamenti_tax_id +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_res_config_settings__arrotondamenti_tax_id +msgid "Rounding Tax" +msgstr "Imposta arrotondamento" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/models/account.py:79 +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1143 +#, python-format +msgid "Rounding down" +msgstr "Arrotondamento passivo" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/models/account.py:86 +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1143 +#, python-format +msgid "Rounding up" +msgstr "Arrotondamento attivo" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__service_type +msgid "Sale Provision Type" +msgstr "Tipo cessione prestazione" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_account_config_settings_ftpa_in +msgid "" +"Set default date used to register vendor invoices: date of invoice or " +"received date." +msgstr "" +"Imposta la data predefinita usata per registrare le fatture fornitore: data " +"della fattura o data ricezione." + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Stable Organization" +msgstr "Stabile organizzazione" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__store_fname +msgid "Stored Filename" +msgstr "Nome file memorizzato" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Summary Data" +msgstr "Dati riepilogo" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__xml_supplier_id +msgid "Supplier" +msgstr "Fornitore" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_partner_form_fatturapa_in +msgid "Supplier data" +msgstr "Dati fornitore" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:108 +#, python-format +msgid "Surname field contains '%s'. Your System contains '%s'" +msgstr "Il campo cognome contiene \"%s\", il sistema contiene \"%s\"" + +#. module: l10n_it_fatturapa_in +#: selection:res.partner,e_invoice_detail_level:0 +msgid "Tax Rate" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:255 +#, python-format +msgid "Tax Regime %s not present in your system." +msgstr "Regime fiscale %s non presente nel sistema." + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__wt_amount +msgid "Tax Withholding" +msgstr "Ritenuta d'acconto" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:559 +#, python-format +msgid "Tax kind %s not found" +msgstr "Tipo imposta %s non trovato" + +#. module: l10n_it_fatturapa_in +#: selection:wizard.import.fatturapa,e_invoice_detail_level:0 +msgid "Tax rate" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_res_company__arrotondamenti_tax_id +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_res_config_settings__arrotondamenti_tax_id +msgid "Tax used to both round up and down bills amount." +msgstr "" +"Imposta usata per gli arrotondamenti attivi e passivi degli importi delle " +"fatture." + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/models/account.py:137 +#, python-format +msgid "" +"Taxed amount ({bill_amount_tax}) does not match with e-bill taxed amount " +"({e_bill_amount_tax})" +msgstr "" +"L'importo delle imposte ({bill_amount_tax}) non corrisponde con l'importo " +"delle imposte della fattura elettronica ({e_bill_amount_tax})" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_fatturapa_attachment_in__key +msgid "" +"Technical field used to resolve multiple attachments in a multi-website " +"environment." +msgstr "" +"Campo tecnico usato per gestire allegati multipli in un ambiente multisito." + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line_other_data__text_ref +msgid "Text Reference" +msgstr "Riferimento testo" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1231 +#, python-format +msgid "" +"The bill contains withholding tax with payment reason %s, but such a tax is " +"not found in your system. Please set it." +msgstr "" +"La fattura contiene una ritenuta d'acconto con causale pagamento %s. Tale " +"ritenuta non è presente nel sistema, è necessario impostarla." + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_fatturapa_attachment_in__res_model +msgid "The database object this attachment will be attached to." +msgstr "L'oggetto del database a cui verrà assegnato questo allegato." + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/models/account.py:105 +#, python-format +msgid "The invoice '%s' doesn't match the related e-invoice" +msgstr "La fattura '%s' non combacia con la relativa e-fattura" + +#. module: l10n_it_fatturapa_in +#: sql_constraint:fatturapa.attachment.in:0 +msgid "The name of the e-bill file must be unique!" +msgstr "Il nome del file della e-fattura deve essere unico!" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_fatturapa_attachment_in__res_id +msgid "The record id this is attached to." +msgstr "L'ID del record a cui questo è collegato." + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__theme_template_id +msgid "Theme Template" +msgstr "Modello del tema" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__thumbnail +msgid "Thumbnail" +msgstr "Anteprima" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_fatturapa_in_attachment_search +msgid "To Register" +msgstr "Da registrare" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:356 +#, python-format +msgid "" +"Too many taxes with percentage %s and nature %s found. Tax %s with lower " +"priority has been set on invoice lines." +msgstr "" +"Troppe imposte con aliquota %s e natura %s trovate. L'imposta %s con " +"maggiore priorità è stata impostata sulle righe fattura." + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:381 +#, python-format +msgid "" +"Too many taxes with percentage equals to '%s'.\n" +"Fix it if required" +msgstr "" +"Troppe imposte con aliquota uguale a\"%s\".\n" +"Correggere se necessario" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__total_price +msgid "Total Price" +msgstr "Prezzo totale" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/models/account.py:154 +#, python-format +msgid "" +"Total amount ({bill_amount_total}) does not match with e-bill total amount " +"({e_bill_amount_total})" +msgstr "" +"L'importo totale ({bill_amount_total}) non corrisponde con l'importo totale " +"della fattura elettronica ({e_bill_amount_total})" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:166 +#, python-format +msgid "" +"Two distinct partners with VAT number %s or Fiscal Code %s already present " +"in db." +msgstr "" +"Nel database sono già presenti due diversi partner con partita IVA %s o " +"codice fiscale %s." + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__type +msgid "Type" +msgstr "Tipo" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__unit_price +msgid "Unit Price" +msgstr "Prezzo unitario" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__uom +msgid "Unit of measure" +msgstr "Unità di misura" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_unread +msgid "Unread Messages" +msgstr "Messaggi non letti" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_unread_counter +msgid "Unread Messages Counter" +msgstr "Numero messaggi non letti" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/models/account.py:120 +#, python-format +msgid "" +"Untaxed amount ({bill_amount_untaxed}) does not match with e-bill untaxed " +"amount ({e_bill_amount_untaxed})" +msgstr "" +"L'imponibile ({bill_amount_untaxed}) non corrisponde con l'imponibile della " +"fattura elettronica ({e_bill_amount_untaxed})" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__url +msgid "Url" +msgstr "URL" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_res_partner__e_invoice_default_product_id +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_res_users__e_invoice_default_product_id +msgid "" +"Used by electronic invoice XML import. If filled in, generated bill lines " +"will use this product when no other possible product is found." +msgstr "" +"Usato nell'importazione XML della fattura elettronica. Se valorizzato, le " +"righe fattura generate useranno questo prodotto in mancanza di altri " +"disponibili." + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__tax_amount +msgid "VAT Rate" +msgstr "Aliquota IVA" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_res_company__in_invoice_registration_date +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_res_config_settings__in_invoice_registration_date +msgid "Vendor invoice registration default date" +msgstr "Data predefinita per la registrazione delle fatture fornitore" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/models/account.py:214 +#, python-format +msgid "" +"Vendor reference ({bill_vendor_ref}) does not match with e-bill vendor " +"reference ({e_bill_vendor_ref})" +msgstr "" +"Il riferimento fornitore ({bill_vendor_ref}) non corrisponde con il " +"riferimento fornitore della fattura elettronica ({e_bill_vendor_ref})" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__website_id +msgid "Website" +msgstr "Sito web" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__website_message_ids +msgid "Website Messages" +msgstr "Messaggi sito web" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__website_url +msgid "Website URL" +msgstr "URL sito web" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_fatturapa_attachment_in__website_message_ids +msgid "Website communication history" +msgstr "Cronologia comunicazioni sito web" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Welfare Fund" +msgstr "Cassa previdenziale" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:586 +#, python-format +msgid "Welfare Fund %s not present in your system." +msgstr "Cassa previdenziale %s non presente nel sistema." + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_res_company__cassa_previdenziale_product_id +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_res_config_settings__cassa_previdenziale_product_id +msgid "Welfare Fund Data Product" +msgstr "Prodotto per dati cassa previdenziale" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Welfare Fund Details" +msgstr "Dettagli cassa previdenziale" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1290 +#, python-format +msgid "" +"Welfare Fund data %s has withholding tax but no withholding tax was found in " +"the system." +msgstr "" +"I dati cassa previdenziale %s hanno la ritenuta d'acconto ma non sono " +"presenti nel sistema." + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:568 +#, python-format +msgid "Welfare Fund is not defined." +msgstr "Cassa previdenziale non definita." + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1282 +#, python-format +msgid "Welfare Fund: %s" +msgstr "Cassa previdenziale: %s" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Withholding" +msgstr "Ritenuta" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Withholding Details" +msgstr "Dettagli ritenuta" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice_line__wizard_id +msgid "Wizard" +msgstr "Procedura guidata" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:441 +#, python-format +msgid "XML contains tax %s. Product %s has tax %s. Using the XML one" +msgstr "" +"Il file XML contiene l'imposta %s, il prodotto %s l'imposta %s. Verrà usata " +"quella dell'XML." + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:372 +#, python-format +msgid "" +"XML contains tax with percentage '%s' but it does not exist in your system" +msgstr "" +"Il file XML contiene l'imposta con aliquota \"%s\", ma questa non esiste nel " +"sistema." + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_fatturapa_in_attachment_tree +msgid "Xml Attachment" +msgstr "Allegato XML" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_fatturapa_attachment_in__type +msgid "" +"You can either upload a file from your computer or copy/paste an internet " +"link to your file." +msgstr "" +"È possibile caricare un file dal computer oppure fare copia/incolla di un " +"collegamento Internet al file." + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/link_to_existing_invoice.py:118 +#, python-format +msgid "You can select only one XML file to link." +msgstr "È possibile selezionare solo un file XML da collegare." + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_fatturapa_in_attachment_form +msgid "on" +msgstr "il" + +#~ msgid "Do not block e-bill import in case of missing Enasarco configuration" +#~ msgstr "" +#~ "Non blocca l'importazione delle e-fatture in caso di configurazione " +#~ "Enasarco mancante" + +#~ msgid "" +#~ "No withholding tax found with document payment reason %s and rate %s." +#~ msgstr "" +#~ "Ritenuta d'acconto con causale pagamento %s e aliquota %s non trovata." + +#~ msgid "Relax checks for Enasarco" +#~ msgstr "Rilassare controlli per Enasarco" + +#~ msgid "" +#~ "The bill contains Welfare Fund tax with Type %s and Tax %s but such a tax " +#~ "is not found in your system. Please set it." +#~ msgstr "" +#~ "La fattura contiene un'imposta cassa previdenziale con tipo %s e imposta " +#~ "%s ma una tale imposta non è presente nel sistema. Prego impostarla." + +#~ msgid "" +#~ "The bill contains Welfare Fund tax with Type %s, but such a tax is not " +#~ "found in your system. Please set it." +#~ msgstr "" +#~ "La fattura contiene un'imposta cassa previdenziale con tipo %s, ma una " +#~ "tale imposta non è presente nel sistema. Prego impostarla." + +#~ msgid "" +#~ "Minimum level: Bill is created with no lines; User will have to create " +#~ "them, according to what specified in the electronic bill.\n" +#~ "Maximum level: every line contained in the electronic bill will create a " +#~ "line in the bill." +#~ msgstr "" +#~ "Livello minimo: la fattura viene creata senza righe, che dovranno essere " +#~ "aggiunte dall'utente in base a quanto indicato nella fattura " +#~ "elettronica.\n" +#~ "Livello massimo: le righe della fattura verranno generate a partire da " +#~ "tutte quelle presenti nella fattura elettronica." + +#~ msgid "Product used to model ScontoMaggiorazione XML element on bills" +#~ msgstr "" +#~ "Prodotto usato come modello per l'elemento XML ScontoMaggiorazione delle " +#~ "fatture." + +#~ msgid "" +#~ "One or more invoice doesn't match the amount (tax or untaxed or total) of " +#~ "the original e-invoice. Please check" +#~ msgstr "" +#~ "L'importo di una o più fatture (imposta, imponibile o totale) non " +#~ "combacia con quello della e-fattura originale. Prego controllare" + +#~ msgid "" +#~ "The invoice doesn't match one of the amount untaxed, tax amount or total " +#~ "amount of the original e-invoice. Please check" +#~ msgstr "" +#~ "L'imponibile, l'imposta o il totale della fattura non combacia con quello " +#~ "della e-fattura originale. Prego controllare" + +#~ msgid "Product used to model DatiBollo XML element on bills" +#~ msgstr "" +#~ "Prodotto usato come modello per l'elemento XML DatiBollo delle fatture." + +#~ msgid "Product used to model DatiBollo XML element on bills." +#~ msgstr "" +#~ "Prodotto usato come modello per l'elemento XML DatiBollo delle fatture." + +#~ msgid "Product used to model DatiCassaPrevidenziale XML element on bills" +#~ msgstr "" +#~ "Prodotto usato come modello per l'elemento XML DatiCassaPrevidenziale " +#~ "delle fatture." + +#~ msgid "Stamp Data Product" +#~ msgstr "Prodotto per dati bollo" + +#~ msgid "Stamp duty payed under the MEF Decree June 17, 2014 (art. 6)" +#~ msgstr "Bollo assolto ai sensi del decreto MEF 17 giugno 2014 (art. 6)" + +#~ msgid "Aliquota IVA" +#~ msgstr "Aliquota IVA" + +#~ msgid "Altri Dati Gestionali" +#~ msgstr "Altri dati gestionali" + +#~ msgid "Altri dati gestionali" +#~ msgstr "Altri dati gestionali" + +#~ msgid "Attachment Name" +#~ msgstr "Nome allegato" + +#~ msgid "Bollo assolto ai sensi del decreto MEF 17 giugno 2014 (art. 6)" +#~ msgstr "Bollo assolto ai sensi del decreto MEF 17 giugno 2014 (art. 6)" + +#, fuzzy +#~ msgid "Cassa Previdenziale: %s" +#~ msgstr "Cassa previdenziale: %s" + +#~ msgid "Cod. Articles" +#~ msgstr "Codici articoli" + +#, fuzzy +#~ msgid "Codice Articoli" +#~ msgstr "Codice articoli" + +#, fuzzy +#~ msgid "Data Fine Periodo" +#~ msgstr "Data fine periodo" + +#, fuzzy +#~ msgid "Data Inizio Periodo" +#~ msgstr "Data inizio periodo" + +#, fuzzy +#~ msgid "Dati generali" +#~ msgstr "Dati generali" + +#~ msgid "" +#~ "DatiAnagrafici.Anagrafica.Cognome contains \"%s\". Your System contains " +#~ "\"%s\"" +#~ msgstr "" +#~ "DatiAnagrafici.Anagrafica.Cognome contiene \"%s\", il sistema contiene " +#~ "\"%s\"" + +#~ msgid "" +#~ "DatiAnagrafici.Anagrafica.Denominazione contains \"%s\". Your System " +#~ "contains \"%s\"" +#~ msgstr "" +#~ "DatiAnagrafici.Anagrafica.Denominazione contiene \"%s\", il sistema " +#~ "contiene \"%s\"" + +#~ msgid "Descrizione" +#~ msgstr "Descrizione" + +#, fuzzy +#~ msgid "Dettaglio Linea" +#~ msgstr "Dettaglio Riga" + +#, fuzzy +#~ msgid "Dettaglio Linee" +#~ msgstr "Dettaglio righe" + +#, fuzzy +#~ msgid "Fattura PA V1.2 Schema" +#~ msgstr "XML Schema V1.2" + +#~ msgid "FatturaPA Discount Rise Price Data" +#~ msgstr "Dati sconto e maggiorazione fatturaPA" + +#~ msgid "FatturaPA import File" +#~ msgstr "File importazione fatturaPA" + +#~ msgid "Import FatturaPA" +#~ msgstr "Importa e-fattura" + +#~ msgid "In Invoices" +#~ msgstr "Fatture passive" + +#~ msgid "Incoming Fattura Elettronica files" +#~ msgstr "File fattura elettronica in ingresso" + +#~ msgid "Invoices" +#~ msgstr "Fatture" + +#~ msgid "Link to Supplier Invoice" +#~ msgstr "Collega a fattura fornitore" + +#, fuzzy +#~ msgid "Livello di dettaglio Fatture elettroniche" +#~ msgstr "Livello di dettaglio fatture elettroniche" + +#, fuzzy +#~ msgid "Livello di dettaglio Fatture elettroniche passive" +#~ msgstr "Livello di dettaglio fatture elettroniche passive" + +#, fuzzy +#~ msgid "" +#~ "Livello minimo: La fattura passiva viene creata senza righe; sara' " +#~ "l'utente a doverle creare in base a quanto indicato dal fornitore nella " +#~ "fattura elettronica\n" +#~ "Livello Massimo: tutte le righe presenti nella fattura elettronica " +#~ "vengono create come righe della fattura passiva" +#~ msgstr "" +#~ "Livello minimo: La fattura passiva viene creata senza righe; sarà " +#~ "l'utente a doverle creare in base a quanto indicato dal fornitore nella " +#~ "fattura elettronica\n" +#~ "Livello Massimo: tutte le righe presenti nella fattura elettronica " +#~ "vengono create come righe della fattura passiva" + +#, fuzzy +#~ msgid "Massimo" +#~ msgstr "Massimo" + +#, fuzzy +#~ msgid "Numero Linea" +#~ msgstr "Numero riga" + +#~ msgid "Partner" +#~ msgstr "Partner" + +#, fuzzy +#~ msgid "Prezzo Totale" +#~ msgstr "Prezzo totale" + +#, fuzzy +#~ msgid "Prezzo unitario" +#~ msgstr "Prezzo unitario" + +#, fuzzy +#~ msgid "" +#~ "Prodotto da utilizzare nelle fatture passive quando nell'XML viene " +#~ "valorizzato l'elemento DatiBollo" +#~ msgstr "" +#~ "Prodotto da utilizzare nelle fatture passive quando nell'XML viene " +#~ "valorizzato l'elemento DatiBollo" + +#, fuzzy +#~ msgid "" +#~ "Prodotto da utilizzare nelle fatture passive quando nell'XML viene " +#~ "valorizzato l'elemento DatiCassaPrevidenziale" +#~ msgstr "" +#~ "Prodotto da utilizzare nelle fatture passive quando nell'XML viene " +#~ "valorizzato l'elemento DatiCassaPrevidenziale" + +#, fuzzy +#~ msgid "" +#~ "Prodotto da utilizzare nelle fatture passive quando nell'XML viene " +#~ "valorizzato l'elemento ScontoMaggiorazione" +#~ msgstr "" +#~ "Prodotto da utilizzare nelle fatture passive quando nell'XML viene " +#~ "valorizzato l'elemento ScontoMaggiorazione" + +#~ msgid "Product for Dati Bollo" +#~ msgstr "Prodotto per dati bollo" + +#~ msgid "ProvinciaAlbo ( %s ) not present in system" +#~ msgstr "ProvinciaAlbo ( %s ) non presente nel sistema" + +#, fuzzy +#~ msgid "Riferimento Data" +#~ msgstr "Riferimento data" + +#, fuzzy +#~ msgid "Riferimento Numero" +#~ msgstr "Riferimento numero" + +#, fuzzy +#~ msgid "Riferimento Testo" +#~ msgstr "Riferimento testo" + +#, fuzzy +#~ msgid "Riferimento mministrazione" +#~ msgstr "Riferimento amministrazione" + +#, fuzzy +#~ msgid "Ritenuta" +#~ msgstr "Ritenuta" + +#~ msgid "SAL data" +#~ msgstr "Dati SAL" + +#, fuzzy +#~ msgid "Sconto Maggiorazione" +#~ msgstr "Sconto maggiorazione" + +#, fuzzy +#~ msgid "" +#~ "Se indicato dal fornitore, Importo totale del documento al netto " +#~ "dell'eventuale sconto e comprensivo di imposta a debito del cessionario / " +#~ "committente" +#~ msgstr "" +#~ "Se indicato dal fornitore, Importo totale del documento al netto " +#~ "dell'eventuale sconto e comprensivo di imposta a debito del cessionario / " +#~ "committente" + +#, fuzzy +#~ msgid "Tipo Cessione Prestazione" +#~ msgstr "Tipo cessione prestazione" + +#, fuzzy +#~ msgid "Tipo Dato" +#~ msgstr "Tipo dato" + +#~ msgid "TipoCassa %s is not present in your system" +#~ msgstr "TipoCassa %s non presente nel sistema" + +#~ msgid "TipoCassa is not defined " +#~ msgstr "TipoCassa non definito " + +#~ msgid "Show preview" +#~ msgstr "Mostra anteprima" diff --git a/l10n_it_fatturapa_in/i18n/l10n_it_fatturapa_in.pot b/l10n_it_fatturapa_in/i18n/l10n_it_fatturapa_in.pot new file mode 100644 index 000000000000..ed161b23a446 --- /dev/null +++ b/l10n_it_fatturapa_in/i18n/l10n_it_fatturapa_in.pot @@ -0,0 +1,1323 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_it_fatturapa_in +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_account_config_settings_ftpa_in +msgid "" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_account_config_settings_ftpa_in +msgid "Supplier Invoices\n" +" " +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__access_token +msgid "Access Token" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_res_company__arrotondamenti_passivi_account_id +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_res_config_settings__arrotondamenti_passivi_account_id +msgid "Account used to round down bills amount." +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_res_company__arrotondamenti_attivi_account_id +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_res_config_settings__arrotondamenti_attivi_account_id +msgid "Account used to round up bills amount." +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_needaction +msgid "Action Needed" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__active +msgid "Active" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__admin_ref +msgid "Administration Reference" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Amount Summary" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__cod_article_ids +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Articles Code" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__ir_attachment_id +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice__attachment_id +msgid "Attachment" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_attachment_count +msgid "Attachment Count" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__local_url +msgid "Attachment URL" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/models/attachment.py:118 +#, python-format +msgid "Attachment without name" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Attachments" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:750 +#, python-format +msgid "BIC is required and not exist in Xml\n" +"Curr bank data is: \n" +"IBAN: %s\n" +"Bank Name: %s\n" +"" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__invoice_id +msgid "Bill" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice_line__e_invoice_nbr +msgid "Bill number in XML" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/link_to_existing_invoice.py:94 +#, python-format +msgid "Bill number {bill_nbr} of {bill_date}.\n" +"Total no tax: {bill_no_tax}\n" +"Total tax: {bill_tax}" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1419 +#, python-format +msgid "Bill total %s is different from document total amount %s" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_fatturapa_in_attachment_form +msgid "Bills" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__invoices_number +msgid "Bills Number" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__invoices_total +msgid "Bills Total" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.wizard_import_fatturapa_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.wizard_link_supplier_invoice +msgid "Cancel" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__checksum +msgid "Checksum/SHA1" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_article_code__name +msgid "Code Type" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_article_code__code_val +msgid "Code Value" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model,name:l10n_it_fatturapa_in.model_res_company +msgid "Companies" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__company_id +msgid "Company" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:91 +#, python-format +msgid "Company Name field contains '%s'. Your System contains '%s'" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1434 +#, python-format +msgid "Computed amount untaxed %s is different from summary data %s" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model,name:l10n_it_fatturapa_in.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model,name:l10n_it_fatturapa_in.model_res_partner +msgid "Contact" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:184 +#, python-format +msgid "Country Code %s not found in system." +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__create_uid +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line_other_data__create_uid +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_article_code__create_uid +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__create_uid +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_import_fatturapa__create_uid +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice__create_uid +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice_line__create_uid +msgid "Created by" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__create_date +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line_other_data__create_date +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_article_code__create_date +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__create_date +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_import_fatturapa__create_date +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice__create_date +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice_line__create_date +msgid "Created on" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_fatturapa_in_attachment_form +msgid "Creation" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:294 +#, python-format +msgid "Current invoice is from {} with REA Code {}. Yet it seems that partners {} have the same REA Code. This code should be unique; please fix it." +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line_other_data__name +msgid "Data Type" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__db_datas +msgid "Database Data" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line_other_data__date_ref +msgid "Date Reference" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_account_config_settings_ftpa_in +msgid "Default products used in electronic supplier invoices" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:805 +#, python-format +msgid "Define a purchase journal for this company: '%s' (id: %d)." +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Delivery" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__name +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__description +msgid "Description" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Discount Supplement" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_res_company__sconto_maggiorazione_product_id +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_res_config_settings__sconto_maggiorazione_product_id +msgid "Discount Supplement Product" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__discount_rise_price_ids +msgid "Discount and Supplement Details" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__display_name +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line_other_data__display_name +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_article_code__display_name +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__display_name +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_import_fatturapa__display_name +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice__display_name +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice_line__display_name +msgid "Display Name" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:904 +#, python-format +msgid "Document type %s not handled." +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_account_invoice__e_invoice_validation_error +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__e_invoice_validation_error +msgid "E Invoice Validation Error" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_account_invoice__e_invoice_validation_message +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__e_invoice_validation_message +msgid "E Invoice Validation Message" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_account_invoice__e_invoice_received_date +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__e_invoice_received_date +msgid "E-Bill Received Date" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_account_invoice__e_invoice_amount_tax +msgid "E-Invoice Tax Amount" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_account_invoice__e_invoice_amount_total +msgid "E-Invoice Total Amount" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_account_invoice__e_invoice_amount_untaxed +msgid "E-Invoice Untaxed Amount" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model,name:l10n_it_fatturapa_in.model_fatturapa_article_code +msgid "E-bill Article Code" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_res_partner__e_invoice_default_product_id +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_res_users__e_invoice_default_product_id +msgid "E-bill Default Product" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "E-bill Details" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_account_invoice__fatturapa_attachment_in_id +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_account_invoice_line__fatturapa_attachment_in_id +msgid "E-bill Import File" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "E-bill Inconsistencies" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/models/account.py:168 +#, python-format +msgid "E-bill contains DatiRitenuta but no lines subjected to Ritenuta was found. Please manually check Withholding tax Amount\n" +"" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/models/account.py:177 +#, python-format +msgid "E-bill contains ImportoRitenuta %s but created invoice has got %s\n" +"" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice_line__e_invoice_descr +msgid "E-bill description" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__att_name +msgid "E-bill file name" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model,name:l10n_it_fatturapa_in.model_fatturapa_attachment_in +msgid "E-bill import file" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_res_partner__e_invoice_detail_level +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_res_users__e_invoice_detail_level +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_import_fatturapa__e_invoice_detail_level +msgid "E-bills Detail Level" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model,name:l10n_it_fatturapa_in.model_discount_rise_price +msgid "E-invoice Discount Supplement Data" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_account_invoice__e_invoice_date_invoice +msgid "E-invoice date" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model,name:l10n_it_fatturapa_in.model_einvoice_line +msgid "E-invoice line" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model,name:l10n_it_fatturapa_in.model_einvoice_line_other_data +msgid "E-invoice line other data" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_account_invoice__e_invoice_reference +msgid "E-invoice vendor reference" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.wizard_import_fatturapa_form_view +msgid "Electronic Bill Import" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:53 +#, python-format +msgid "File %s is linked to bills yet." +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__datas +msgid "File Content" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__file_size +msgid "File Size" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1457 +#, python-format +msgid "File is linked to bills yet." +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__datas_fname +msgid "Filename" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_follower_ids +msgid "Followers" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_channel_ids +msgid "Followers (Channels)" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_partner_ids +msgid "Followers (Partners)" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_account_invoice__e_invoice_force_validation +msgid "Force E-Invoice Validation" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "General Data" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:638 +#, python-format +msgid "Global bill discount from document general data" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_fatturapa_in_attachment_form +msgid "History" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__id +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line_other_data__id +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_article_code__id +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__id +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_import_fatturapa__id +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice__id +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice_line__id +msgid "ID" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_unread +msgid "If checked new messages require your attention." +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_needaction +msgid "If checked, new messages require your attention." +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_fatturapa_attachment_in__invoices_total +msgid "If specified by supplier, total amount of the document net of any discount and including tax charged to the buyer/ordered" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.wizard_import_fatturapa_form_view +msgid "Import" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model,name:l10n_it_fatturapa_in.model_wizard_import_fatturapa +msgid "Import E-bill" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.actions.act_window,name:l10n_it_fatturapa_in.action_wizard_import_fatturapa +msgid "Import Electronic Bill" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_account_invoice__inconsistencies +msgid "Import Inconsistencies" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_fatturapa_in_attachment_form +msgid "Import e-bill" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__in_invoice_ids +msgid "In Bills" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.actions.act_window,name:l10n_it_fatturapa_in.action_fattura_pa_in +#: model:ir.ui.menu,name:l10n_it_fatturapa_in.menu_fattura_pa_in_tree +msgid "Incoming E-bill Files" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__index_content +msgid "Indexed Content" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model,name:l10n_it_fatturapa_in.model_account_invoice +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice_line__invoice_id +msgid "Invoice" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: selection:res.company,in_invoice_registration_date:0 +msgid "Invoice Date" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model,name:l10n_it_fatturapa_in.model_account_invoice_line +msgid "Invoice Line" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/models/account.py:225 +#, python-format +msgid "Invoice date ({bill_date_invoice}) does not match with e-bill invoice date ({e_bill_date_invoice})" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__invoices_date +msgid "Invoices date" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_is_follower +msgid "Is Follower" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__public +msgid "Is public document" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__key +msgid "Key" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line____last_update +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line_other_data____last_update +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_article_code____last_update +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in____last_update +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_import_fatturapa____last_update +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice____last_update +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice_line____last_update +msgid "Last Modified on" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__write_uid +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line_other_data__write_uid +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_article_code__write_uid +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__write_uid +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_import_fatturapa__write_uid +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice__write_uid +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice_line__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__write_date +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line_other_data__write_date +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_article_code__write_date +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__write_date +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_import_fatturapa__write_date +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice__write_date +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice_line__write_date +msgid "Last Updated on" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice__line_ids +msgid "Line" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Line Detail" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__line_number +msgid "Line Number" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_account_invoice__e_invoice_line_ids +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Lines Detail" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.wizard_link_supplier_invoice +msgid "Link" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model,name:l10n_it_fatturapa_in.model_wizard_link_to_invoice_line +msgid "Link e-bill to bill" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model,name:l10n_it_fatturapa_in.model_wizard_link_to_invoice +msgid "Link to Bill" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.actions.act_window,name:l10n_it_fatturapa_in.action_wizard_link_supplier_invoice +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.wizard_link_supplier_invoice +msgid "Link to existing supplier bills" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_main_attachment_id +msgid "Main Attachment" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: selection:res.partner,e_invoice_detail_level:0 +#: selection:wizard.import.fatturapa,e_invoice_detail_level:0 +msgid "Maximum" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_has_error +msgid "Message Delivery error" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_ids +msgid "Messages" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__mimetype +msgid "Mime Type" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: selection:res.partner,e_invoice_detail_level:0 +#: selection:wizard.import.fatturapa,e_invoice_detail_level:0 +msgid "Minimum" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_res_partner__e_invoice_detail_level +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_res_users__e_invoice_detail_level +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_wizard_import_fatturapa__e_invoice_detail_level +msgid "Minimum level: Bill is created with no lines; User will have to create them, according to what specified in the electronic bill.\n" +"Tax rate level: Rate level: an invoice line is created for each rate present in the electronic invoice\n" +"Maximum level: every line contained in the electronic bill will create a line in the bill." +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__name +msgid "Name" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:99 +#, python-format +msgid "Name field contains '%s'. Your System contains '%s'" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:726 +#, python-format +msgid "Name of Bank with BIC '%s' is not set. Can't create bank" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__tax_kind +msgid "Nature" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:882 +#, python-format +msgid "No currency found with code %s." +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:351 +#, python-format +msgid "No tax with percentage %s and nature %s found. Please configure this tax." +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1246 +#, python-format +msgid "No withholding tax found with document payment reason %s, rate %s and type %s." +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line_other_data__num_ref +msgid "Number Reference" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_needaction_counter +msgid "Number of Actions" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_has_error_counter +msgid "Number of error" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_needaction_counter +msgid "Number of messages which requires an action" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_unread_counter +msgid "Number of unread messages" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_fatturapa_in_attachment_form +msgid "Open full-screen" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__other_data_ids +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Other Administrative Data" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:668 +#, python-format +msgid "Payment method %s is not defined in your system." +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1207 +#, python-format +msgid "Payment method code %s is incorrect." +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1202 +#, python-format +msgid "Payment method code not found in document." +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Payments" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Payments Details" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__period_end_date +msgid "Period End Date" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__period_start_date +msgid "Period Start Date" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__ftpa_preview_link +msgid "Preview link" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_res_company__cassa_previdenziale_product_id +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_res_config_settings__cassa_previdenziale_product_id +msgid "Product used to model DatiCassaPrevidenziale XML element on bills." +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_res_company__sconto_maggiorazione_product_id +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_res_config_settings__sconto_maggiorazione_product_id +msgid "Product used to model ScontoMaggiorazione XML element on bills." +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Progress data" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:237 +#, python-format +msgid "Province ( %s ) not present in your system" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__qty +msgid "Quantity" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:269 +#, python-format +msgid "REA Office Province Code ( %s ) not present in your system" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: selection:res.company,in_invoice_registration_date:0 +msgid "Received Date" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:226 +#, python-format +msgid "Register Province ( %s ) not present in your system" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__registered +msgid "Registered" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Related Documents" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_discount_rise_price__e_invoice_line_id +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line_other_data__e_invoice_line_id +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_article_code__e_invoice_line_id +msgid "Related E-bill Line" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_fatturapa_in_attachment_form +msgid "Remove" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__res_model_name +msgid "Res Model Name" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__res_field +msgid "Resource Field" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__res_id +msgid "Resource ID" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__res_model +msgid "Resource Model" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__res_name +msgid "Resource Name" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_res_company__arrotondamenti_passivi_account_id +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_res_config_settings__arrotondamenti_passivi_account_id +msgid "Round Down Account" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_res_company__arrotondamenti_attivi_account_id +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_res_config_settings__arrotondamenti_attivi_account_id +msgid "Round Up Account" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/models/account.py:77 +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1122 +#, python-format +msgid "Round down account is not set in Accounting Settings" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/models/account.py:84 +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1116 +#, python-format +msgid "Round up account is not set in Accounting Settings" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1129 +#, python-format +msgid "Round up and down tax is not set" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_res_company__arrotondamenti_tax_id +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_res_config_settings__arrotondamenti_tax_id +msgid "Rounding Tax" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/models/account.py:79 +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1143 +#, python-format +msgid "Rounding down" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/models/account.py:86 +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1143 +#, python-format +msgid "Rounding up" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__service_type +msgid "Sale Provision Type" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_account_config_settings_ftpa_in +msgid "Set default date used to register vendor invoices: date of invoice or received date." +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Stable Organization" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__store_fname +msgid "Stored Filename" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Summary Data" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__xml_supplier_id +msgid "Supplier" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_partner_form_fatturapa_in +msgid "Supplier data" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:108 +#, python-format +msgid "Surname field contains '%s'. Your System contains '%s'" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: selection:res.partner,e_invoice_detail_level:0 +msgid "Tax Rate" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:255 +#, python-format +msgid "Tax Regime %s not present in your system." +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__wt_amount +msgid "Tax Withholding" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:559 +#, python-format +msgid "Tax kind %s not found" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: selection:wizard.import.fatturapa,e_invoice_detail_level:0 +msgid "Tax rate" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_res_company__arrotondamenti_tax_id +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_res_config_settings__arrotondamenti_tax_id +msgid "Tax used to both round up and down bills amount." +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/models/account.py:137 +#, python-format +msgid "Taxed amount ({bill_amount_tax}) does not match with e-bill taxed amount ({e_bill_amount_tax})" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_fatturapa_attachment_in__key +msgid "Technical field used to resolve multiple attachments in a multi-website environment." +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line_other_data__text_ref +msgid "Text Reference" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1231 +#, python-format +msgid "The bill contains withholding tax with payment reason %s, but such a tax is not found in your system. Please set it." +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_fatturapa_attachment_in__res_model +msgid "The database object this attachment will be attached to." +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/models/account.py:105 +#, python-format +msgid "The invoice '%s' doesn't match the related e-invoice" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: sql_constraint:fatturapa.attachment.in:0 +msgid "The name of the e-bill file must be unique!" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_fatturapa_attachment_in__res_id +msgid "The record id this is attached to." +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__theme_template_id +msgid "Theme Template" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__thumbnail +msgid "Thumbnail" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_fatturapa_in_attachment_search +msgid "To Register" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:356 +#, python-format +msgid "Too many taxes with percentage %s and nature %s found. Tax %s with lower priority has been set on invoice lines." +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:381 +#, python-format +msgid "Too many taxes with percentage equals to '%s'.\n" +"Fix it if required" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__total_price +msgid "Total Price" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/models/account.py:154 +#, python-format +msgid "Total amount ({bill_amount_total}) does not match with e-bill total amount ({e_bill_amount_total})" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:166 +#, python-format +msgid "Two distinct partners with VAT number %s or Fiscal Code %s already present in db." +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__type +msgid "Type" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__unit_price +msgid "Unit Price" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__uom +msgid "Unit of measure" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_unread +msgid "Unread Messages" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__message_unread_counter +msgid "Unread Messages Counter" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/models/account.py:120 +#, python-format +msgid "Untaxed amount ({bill_amount_untaxed}) does not match with e-bill untaxed amount ({e_bill_amount_untaxed})" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__url +msgid "Url" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_res_partner__e_invoice_default_product_id +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_res_users__e_invoice_default_product_id +msgid "Used by electronic invoice XML import. If filled in, generated bill lines will use this product when no other possible product is found." +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_einvoice_line__tax_amount +msgid "VAT Rate" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_res_company__in_invoice_registration_date +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_res_config_settings__in_invoice_registration_date +msgid "Vendor invoice registration default date" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/models/account.py:214 +#, python-format +msgid "Vendor reference ({bill_vendor_ref}) does not match with e-bill vendor reference ({e_bill_vendor_ref})" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__website_id +msgid "Website" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__website_message_ids +msgid "Website Messages" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in__website_url +msgid "Website URL" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_fatturapa_attachment_in__website_message_ids +msgid "Website communication history" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Welfare Fund" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:586 +#, python-format +msgid "Welfare Fund %s not present in your system." +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_res_company__cassa_previdenziale_product_id +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_res_config_settings__cassa_previdenziale_product_id +msgid "Welfare Fund Data Product" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Welfare Fund Details" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1290 +#, python-format +msgid "Welfare Fund data %s has withholding tax but no withholding tax was found in the system." +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:568 +#, python-format +msgid "Welfare Fund is not defined." +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1282 +#, python-format +msgid "Welfare Fund: %s" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Withholding" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Withholding Details" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_wizard_link_to_invoice_line__wizard_id +msgid "Wizard" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:441 +#, python-format +msgid "XML contains tax %s. Product %s has tax %s. Using the XML one" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:372 +#, python-format +msgid "XML contains tax with percentage '%s' but it does not exist in your system" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_fatturapa_in_attachment_tree +msgid "Xml Attachment" +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_fatturapa_attachment_in__type +msgid "You can either upload a file from your computer or copy/paste an internet link to your file." +msgstr "" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/link_to_existing_invoice.py:118 +#, python-format +msgid "You can select only one XML file to link." +msgstr "" + +#. module: l10n_it_fatturapa_in +#: model_terms:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_fatturapa_in_attachment_form +msgid "on" +msgstr "" + diff --git a/l10n_it_fatturapa_in/migrations/12.0.1.18.3/pre-migration.py b/l10n_it_fatturapa_in/migrations/12.0.1.18.3/pre-migration.py new file mode 100644 index 000000000000..0f231b3d4955 --- /dev/null +++ b/l10n_it_fatturapa_in/migrations/12.0.1.18.3/pre-migration.py @@ -0,0 +1,14 @@ +from openupgradelib import openupgrade + + +@openupgrade.migrate() +def migrate(env, version): + if not version: + return + openupgrade.logged_query( + env.cr, + """ + ALTER TABLE fatturapa_attachment_in + ADD COLUMN IF NOT EXISTS invoices_date character varying + """, + ) diff --git a/l10n_it_fatturapa_in/migrations/13.0.1.0.0/noupdate_changes.xml b/l10n_it_fatturapa_in/migrations/13.0.1.0.0/noupdate_changes.xml new file mode 100644 index 000000000000..1ac4f44a174f --- /dev/null +++ b/l10n_it_fatturapa_in/migrations/13.0.1.0.0/noupdate_changes.xml @@ -0,0 +1,8 @@ + + + + ['|',('company_id','=',False),('company_id','in',company_ids)] + + diff --git a/l10n_it_fatturapa_in/migrations/13.0.1.0.0/post-migration.py b/l10n_it_fatturapa_in/migrations/13.0.1.0.0/post-migration.py new file mode 100644 index 000000000000..215de4b1f80e --- /dev/null +++ b/l10n_it_fatturapa_in/migrations/13.0.1.0.0/post-migration.py @@ -0,0 +1,43 @@ +# Copyright 2021 Alfredo Zamora - Agile Business Group +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from openupgradelib import openupgrade + + +def migrate(cr, installed_version): + openupgrade.load_data( + cr, "l10n_it_fatturapa_in", "migrations/13.0.1.0.0/noupdate_changes.xml" + ) + + openupgrade.logged_query( + cr, + """ +update account_move +set + fatturapa_attachment_in_id = inv.fatturapa_attachment_in_id, + inconsistencies = inv.inconsistencies, + e_invoice_amount_untaxed = inv.e_invoice_amount_untaxed, + e_invoice_amount_tax = inv.e_invoice_amount_tax, + e_invoice_amount_total = inv.e_invoice_amount_total, + e_invoice_reference = inv.e_invoice_reference, + e_invoice_date_invoice = inv.e_invoice_date_invoice, + e_invoice_force_validation = inv.e_invoice_force_validation, + e_invoice_received_date = inv.e_invoice_received_date +from account_invoice inv +where + account_move.id = inv.move_id; + """, + ) + + openupgrade.logged_query( + cr, + """ +update einvoice_line +set + invoice_id = am.id +from account_invoice inv + join account_move am on am.id = inv.move_id +where + invoice_id = inv.id; + """, + ) diff --git a/l10n_it_fatturapa_in/models/__init__.py b/l10n_it_fatturapa_in/models/__init__.py new file mode 100644 index 000000000000..4eca7ddaf65a --- /dev/null +++ b/l10n_it_fatturapa_in/models/__init__.py @@ -0,0 +1,4 @@ +from . import attachment +from . import account +from . import partner +from . import company diff --git a/l10n_it_fatturapa_in/models/account.py b/l10n_it_fatturapa_in/models/account.py new file mode 100644 index 000000000000..df3ffdc027d2 --- /dev/null +++ b/l10n_it_fatturapa_in/models/account.py @@ -0,0 +1,413 @@ +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError +from odoo.tools import float_compare + + +class AccountInvoice(models.Model): + _inherit = "account.move" + + fatturapa_attachment_in_id = fields.Many2one( + "fatturapa.attachment.in", "E-bill Import File", ondelete="restrict", copy=False + ) + inconsistencies = fields.Text("Import Inconsistencies", copy=False) + e_invoice_line_ids = fields.One2many( + "einvoice.line", "invoice_id", string="Lines Detail", readonly=True, copy=False + ) + + e_invoice_amount_untaxed = fields.Monetary( + string="E-Invoice Untaxed Amount", readonly=True + ) + e_invoice_amount_tax = fields.Monetary(string="E-Invoice Tax Amount", readonly=True) + e_invoice_amount_total = fields.Monetary( + string="E-Invoice Total Amount", readonly=True + ) + + e_invoice_reference = fields.Char( + string="E-invoice vendor reference", readonly=True + ) + + e_invoice_date_invoice = fields.Date(string="E-invoice date", readonly=True) + + e_invoice_validation_error = fields.Boolean( + compute="_compute_e_invoice_validation_error" + ) + + e_invoice_validation_message = fields.Text( + compute="_compute_e_invoice_validation_error" + ) + + e_invoice_force_validation = fields.Boolean(string="Force E-Invoice Validation") + + e_invoice_received_date = fields.Date(string="E-Bill Received Date") + + @api.depends( + "line_ids.matched_debit_ids.debit_move_id.move_id.line_ids.amount_residual", + "line_ids.matched_debit_ids.debit_move_id.move_id.line_ids.amount_residual_currency", # noqa: B950 + "line_ids.matched_credit_ids.credit_move_id.move_id.line_ids.amount_residual", + "line_ids.matched_credit_ids.credit_move_id.move_id.line_ids.amount_residual_currency", # noqa: B950 + "line_ids.debit", + "line_ids.credit", + "line_ids.currency_id", + "line_ids.amount_currency", + "line_ids.amount_residual", + "line_ids.amount_residual_currency", + "line_ids.payment_id.state", + "line_ids.full_reconcile_id", + ) + def _compute_amount(self): + super(AccountInvoice, self)._compute_amount() + for inv in self: + if inv.efatt_rounding != 0: + inv.amount_total += inv.efatt_rounding + sign = inv.move_type in ["in_refund", "out_refund"] and -1 or 1 + inv.amount_total_signed = inv.amount_total * sign + + def action_post(self): + for invoice in self: + if ( + invoice.e_invoice_validation_error + and not invoice.e_invoice_force_validation + ): + raise ValidationError( + _("The invoice '%s' doesn't match the related e-invoice") + % invoice.display_name + ) + return super().action_post() + + def e_inv_check_amount_untaxed(self): + error_message = "" + if ( + self.e_invoice_amount_untaxed + and float_compare( + self.amount_untaxed - self.efatt_rounding, + # Using abs because odoo invoice total can't be negative, + # while XML total can. + # See process_negative_lines method + abs(self.e_invoice_amount_untaxed), + precision_rounding=self.currency_id.rounding, + ) + != 0 + ): + error_message = _( + "Untaxed amount ({bill_amount_untaxed}) " + "does not match with " + "e-bill untaxed amount ({e_bill_amount_untaxed})" + ).format( + bill_amount_untaxed=self.amount_untaxed or 0, + e_bill_amount_untaxed=self.e_invoice_amount_untaxed, + ) + return error_message + + def e_inv_check_amount_tax(self): + error_message = "" + if ( + self.e_invoice_amount_tax + and float_compare( + self.amount_tax, + abs(self.e_invoice_amount_tax), + precision_rounding=self.currency_id.rounding, + ) + != 0 + ): + error_message = _( + "Taxed amount ({bill_amount_tax}) " + "does not match with " + "e-bill taxed amount ({e_bill_amount_tax})" + ).format( + bill_amount_tax=self.amount_tax or 0, + e_bill_amount_tax=self.e_invoice_amount_tax, + ) + return error_message + + def e_inv_check_amount_total(self): + error_message = "" + if ( + self.e_invoice_amount_total + and float_compare( + self.amount_total - self.efatt_rounding, + abs(self.e_invoice_amount_total), + precision_rounding=self.currency_id.rounding, + ) + != 0 + ): + error_message = _( + "Total amount ({bill_amount_total}) " + "does not match with " + "e-bill total amount ({e_bill_amount_total})" + ).format( + bill_amount_total=self.amount_total or 0, + e_bill_amount_total=self.e_invoice_amount_total, + ) + return error_message + + def e_inv_dati_ritenuta(self): + error_message = "" + # ftpa_withholding_type is set when DatiRitenuta is set, + # withholding_tax is not set if no lines with Ritenuta = SI are found + if self.ftpa_withholding_ids and not self.withholding_tax: + error_message += _( + "E-bill contains DatiRitenuta but no lines subjected to Ritenuta was " + "found. Please manually check Withholding tax Amount\n" + ) + if ( + sum(self.ftpa_withholding_ids.mapped("amount")) + != self.withholding_tax_amount + ): + error_message += _( + "E-bill contains ImportoRitenuta %s but created invoice has got" + " %s\n" + % ( + sum(self.ftpa_withholding_ids.mapped("amount")), + self.withholding_tax_amount, + ) + ) + return error_message + + @api.depends( + "move_type", + "state", + "fatturapa_attachment_in_id", + "amount_untaxed", + "amount_tax", + "amount_total", + "ref", + "invoice_date", + ) + def _compute_e_invoice_validation_error(self): + self.ensure_one() + self.e_invoice_validation_error = False + self.e_invoice_validation_message = False + + bills_to_check = self.filtered( + lambda inv: inv.is_purchase_document() + and inv.state in ["draft", "posted"] + and inv.fatturapa_attachment_in_id + ) + for bill in bills_to_check: + error_messages = list() + + error_message = bill.e_inv_check_amount_untaxed() + if error_message: + error_messages.append(error_message) + + error_message = bill.e_inv_check_amount_tax() + if error_message: + error_messages.append(error_message) + + error_message = bill.e_inv_check_amount_total() + if error_message: + error_messages.append(error_message) + + error_message = bill.e_inv_dati_ritenuta() + if error_message: + error_messages.append(error_message) + + if bill.e_invoice_reference and bill.ref != bill.e_invoice_reference: + error_messages.append( + _( + "Vendor reference ({bill_vendor_ref}) " + "does not match with " + "e-bill vendor reference ({e_bill_vendor_ref})" + ).format( + bill_vendor_ref=bill.ref or "", + e_bill_vendor_ref=bill.e_invoice_reference, + ) + ) + if ( + bill.e_invoice_reference + and bill.payment_reference != bill.e_invoice_reference + ): + error_messages.append( + _( + "Vendor reference ({bill_vendor_ref}) " + "does not match with " + "e-bill vendor reference ({e_bill_vendor_ref})" + ).format( + bill_vendor_ref=bill.payment_reference or "", + e_bill_vendor_ref=bill.e_invoice_reference, + ) + ) + + if ( + bill.e_invoice_date_invoice + and bill.e_invoice_date_invoice != bill.invoice_date + ): + error_messages.append( + _( + "Invoice date ({bill_date_invoice}) " + "does not match with " + "e-bill invoice date ({e_bill_date_invoice})" + ).format( + bill_date_invoice=bill.invoice_date or "", + e_bill_date_invoice=bill.e_invoice_date_invoice, + ) + ) + + if not error_messages: + continue + bill.e_invoice_validation_error = True + bill.e_invoice_validation_message = ",\n".join(error_messages) + "." + + def name_get(self): + result = super(AccountInvoice, self).name_get() + res = [] + for tup in result: + invoice = self.browse(tup[0]) + if invoice.is_purchase_document(): + name = "{}, {}".format(tup[1], invoice.partner_id.name) + if invoice.amount_total_signed: + name += ", {} {}".format( + invoice.amount_total_signed, + invoice.currency_id.symbol, + ) + if invoice.invoice_origin: + name += ", %s" % invoice.invoice_origin + res.append((invoice.id, name)) + else: + res.append(tup) + return res + + def remove_attachment_link(self): + self.ensure_one() + self.fatturapa_attachment_in_id = False + return {"type": "ir.actions.client", "tag": "reload"} + + @api.model + def compute_xml_amount_untaxed(self, FatturaBody): + amount_untaxed = 0.0 + for Riepilogo in FatturaBody.DatiBeniServizi.DatiRiepilogo: + amount_untaxed += float(Riepilogo.ImponibileImporto or 0.0) + return amount_untaxed + + @api.model + def compute_xml_amount_total(self, FatturaBody, amount_untaxed, amount_tax): + rounding = float( + FatturaBody.DatiGenerali.DatiGeneraliDocumento.Arrotondamento or 0.0 + ) + return amount_untaxed + amount_tax + rounding + + @api.model + def compute_xml_amount_tax(self, DatiRiepilogo): + amount_tax = 0.0 + for Riepilogo in DatiRiepilogo: + amount_tax += float(Riepilogo.Imposta or 0.0) + return amount_tax + + def set_einvoice_data(self, fattura): + self.ensure_one() + amount_untaxed = self.compute_xml_amount_untaxed(fattura) + amount_tax = self.compute_xml_amount_tax(fattura.DatiBeniServizi.DatiRiepilogo) + amount_total = self.compute_xml_amount_total( + fattura, amount_untaxed, amount_tax + ) + reference = fattura.DatiGenerali.DatiGeneraliDocumento.Numero + date_invoice = fields.Date.from_string( + fattura.DatiGenerali.DatiGeneraliDocumento.Data + ) + + self.update( + { + "e_invoice_amount_untaxed": amount_untaxed, + "e_invoice_amount_tax": amount_tax, + "e_invoice_amount_total": amount_total, + "e_invoice_reference": reference, + "e_invoice_date_invoice": date_invoice, + } + ) + + def process_negative_lines(self): + self.ensure_one() + for line in self.invoice_line_ids: + if line.price_unit >= 0: + return + # if every line is negative, change them all + for line in self.invoice_line_ids: + line.with_context(check_move_validity=False).update( + {"price_unit": -line.price_unit} + ) + self.with_context(check_move_validity=False)._recompute_dynamic_lines( + recompute_all_taxes=True + ) + + +class FatturapaArticleCode(models.Model): + # _position = ['2.2.1.3'] + _name = "fatturapa.article.code" + _description = "E-bill Article Code" + + name = fields.Char("Code Type") + code_val = fields.Char("Code Value") + e_invoice_line_id = fields.Many2one( + "einvoice.line", "Related E-bill Line", readonly=True + ) + + +class AccountInvoiceLine(models.Model): + # _position = [ + # '2.2.1.3', '2.2.1.6', '2.2.1.7', + # '2.2.1.8', '2.1.1.10' + # ] + _inherit = "account.move.line" + + fatturapa_attachment_in_id = fields.Many2one( + "fatturapa.attachment.in", + "E-bill Import File", + readonly=True, + related="move_id.fatturapa_attachment_in_id", + ) + + +class DiscountRisePrice(models.Model): + _inherit = "discount.rise.price" + e_invoice_line_id = fields.Many2one( + "einvoice.line", "Related E-bill Line", readonly=True + ) + + +class EInvoiceLine(models.Model): + _name = "einvoice.line" + _description = "E-invoice line" + invoice_id = fields.Many2one( + "account.move", "Bill", readonly=True, ondelete="cascade" + ) + line_number = fields.Integer("Line Number", readonly=True) + service_type = fields.Char("Sale Provision Type", readonly=True) + cod_article_ids = fields.One2many( + "fatturapa.article.code", "e_invoice_line_id", "Articles Code", readonly=True + ) + name = fields.Char("Description", readonly=True) + qty = fields.Float("Quantity", readonly=True, digits="Product Unit of Measure") + uom = fields.Char("Unit of measure", readonly=True) + period_start_date = fields.Date("Period Start Date", readonly=True) + period_end_date = fields.Date("Period End Date", readonly=True) + unit_price = fields.Float("Unit Price", readonly=True, digits="Product Price") + discount_rise_price_ids = fields.One2many( + "discount.rise.price", + "e_invoice_line_id", + "Discount and Supplement Details", + readonly=True, + ) + total_price = fields.Float("Total Price", readonly=True) + tax_amount = fields.Float("VAT Rate", readonly=True) + wt_amount = fields.Char("Tax Withholding", readonly=True) + tax_kind = fields.Char("Nature", readonly=True) + admin_ref = fields.Char("Administration Reference", readonly=True) + other_data_ids = fields.One2many( + "einvoice.line.other.data", + "e_invoice_line_id", + string="Other Administrative Data", + readonly=True, + ) + + +class EInvoiceLineOtherData(models.Model): + _name = "einvoice.line.other.data" + _description = "E-invoice line other data" + + e_invoice_line_id = fields.Many2one( + "einvoice.line", "Related E-bill Line", readonly=True + ) + name = fields.Char("Data Type", readonly=True) + text_ref = fields.Char("Text Reference", readonly=True) + num_ref = fields.Float("Number Reference", readonly=True) + date_ref = fields.Char("Date Reference", readonly=True) diff --git a/l10n_it_fatturapa_in/models/attachment.py b/l10n_it_fatturapa_in/models/attachment.py new file mode 100644 index 000000000000..8ae1d7607301 --- /dev/null +++ b/l10n_it_fatturapa_in/models/attachment.py @@ -0,0 +1,142 @@ +import base64 + +from odoo import _, api, fields, models +from odoo.tools import format_date + + +class FatturaPAAttachmentIn(models.Model): + _name = "fatturapa.attachment.in" + _description = "E-bill import file" + _inherits = {"ir.attachment": "ir_attachment_id"} + _inherit = ["mail.thread"] + _order = "id desc" + + ir_attachment_id = fields.Many2one( + "ir.attachment", "Attachment", required=True, ondelete="cascade" + ) + att_name = fields.Char( + string="E-bill file name", related="ir_attachment_id.name", store=True + ) + in_invoice_ids = fields.One2many( + "account.move", + "fatturapa_attachment_in_id", + string="In Bills", + readonly=True, + ) + xml_supplier_id = fields.Many2one( + "res.partner", string="Supplier", compute="_compute_xml_data", store=True + ) + invoices_number = fields.Integer( + "Bills Number", compute="_compute_xml_data", store=True + ) + invoices_total = fields.Float( + "Bills Total", + compute="_compute_xml_data", + store=True, + help="If specified by supplier, total amount of the document net of " + "any discount and including tax charged to the buyer/ordered", + ) + invoices_date = fields.Char( + string="Invoices date", compute="_compute_xml_data", store=True + ) + registered = fields.Boolean("Registered", compute="_compute_registered", store=True) + + e_invoice_received_date = fields.Datetime(string="E-Bill Received Date") + + e_invoice_validation_error = fields.Boolean( + compute="_compute_e_invoice_validation_error" + ) + + e_invoice_validation_message = fields.Text( + compute="_compute_e_invoice_validation_error" + ) + + _sql_constraints = [ + ( + "ftpa_attachment_in_name_uniq", + "unique(att_name)", + "The name of the e-bill file must be unique!", + ) + ] + + @api.depends("in_invoice_ids.e_invoice_validation_error") + def _compute_e_invoice_validation_error(self): + for att in self: + att.e_invoice_validation_error = False + att.e_invoice_validation_message = False + bills_with_error = att.in_invoice_ids.filtered( + lambda b: b.e_invoice_validation_error + ) + if not bills_with_error: + continue + att.e_invoice_validation_error = True + errors_message_template = u"{bill}:\n{errors}" + error_messages = list() + for bill in bills_with_error: + error_messages.append( + errors_message_template.format( + bill=bill.display_name, errors=bill.e_invoice_validation_message + ) + ) + att.e_invoice_validation_message = "\n\n".join(error_messages) + + def get_xml_string(self): + return self.ir_attachment_id.get_xml_string() + + def recompute_xml_fields(self): + self._compute_xml_data() + self._compute_registered() + + @api.depends("ir_attachment_id.datas") + def _compute_xml_data(self): + for att in self: + att.xml_supplier_id = False + att.invoices_number = False + att.invoices_total = False + att.invoices_date = False + wiz_obj = self.env["wizard.import.fatturapa"].with_context( + from_attachment=att + ) + fatt = wiz_obj.get_invoice_obj(att) + cedentePrestatore = fatt.FatturaElettronicaHeader.CedentePrestatore + partner_id = wiz_obj.getCedPrest(cedentePrestatore) + att.xml_supplier_id = partner_id + att.invoices_number = len(fatt.FatturaElettronicaBody) + att.invoices_total = 0 + invoices_date = [] + for invoice_body in fatt.FatturaElettronicaBody: + dgd = invoice_body.DatiGenerali.DatiGeneraliDocumento + att.invoices_total += float(dgd.ImportoTotaleDocumento or 0) + invoice_date = format_date( + att.with_context(lang=att.env.user.lang).env, + fields.Date.from_string(dgd.Data), + ) + if invoice_date not in invoices_date: + invoices_date.append(invoice_date) + att.invoices_date = " ".join(invoices_date) + + @api.depends("in_invoice_ids") + def _compute_registered(self): + for att in self: + if att.in_invoice_ids and len(att.in_invoice_ids) == att.invoices_number: + att.registered = True + else: + att.registered = False + + def extract_attachments(self, AttachmentsData, invoice_id): + AttachModel = self.env["fatturapa.attachments"] + for attach in AttachmentsData: + if not attach.NomeAttachment: + name = _("Attachment without name") + else: + name = attach.NomeAttachment + content = attach.Attachment.encode() + _attach_dict = { + "name": name, + "datas": base64.b64encode(content), + "description": attach.DescrizioneAttachment or "", + "compression": attach.AlgoritmoCompressione or "", + "format": attach.FormatoAttachment or "", + "invoice_id": invoice_id, + } + AttachModel.create(_attach_dict) diff --git a/l10n_it_fatturapa_in/models/company.py b/l10n_it_fatturapa_in/models/company.py new file mode 100644 index 000000000000..a25218af7459 --- /dev/null +++ b/l10n_it_fatturapa_in/models/company.py @@ -0,0 +1,66 @@ +from odoo import fields, models + + +class ResCompany(models.Model): + _inherit = "res.company" + + cassa_previdenziale_product_id = fields.Many2one( + "product.product", + "Welfare Fund Data Product", + help="Product used to model DatiCassaPrevidenziale XML element " "on bills.", + ) + sconto_maggiorazione_product_id = fields.Many2one( + "product.product", + "Discount Supplement Product", + help="Product used to model ScontoMaggiorazione XML element on bills.", + ) + + arrotondamenti_attivi_account_id = fields.Many2one( + "account.account", + "Round Up Account", + domain=[("deprecated", "=", False)], + help="Account used to round up bills amount.", + ) + arrotondamenti_passivi_account_id = fields.Many2one( + "account.account", + "Round Down Account", + domain=[("deprecated", "=", False)], + help="Account used to round down bills amount.", + ) + arrotondamenti_tax_id = fields.Many2one( + "account.tax", + "Rounding Tax", + domain=[("type_tax_use", "=", "purchase"), ("amount", "=", 0.0)], + help="Tax used to both round up and down bills amount.", + ) + in_invoice_registration_date = fields.Selection( + [ + ("inv_date", "Invoice Date"), + ("rec_date", "Received Date"), + ], + string="Vendor invoice registration default date", + default="inv_date", + ) + + +class AccountConfigSettings(models.TransientModel): + _inherit = "res.config.settings" + + cassa_previdenziale_product_id = fields.Many2one( + related="company_id.cassa_previdenziale_product_id", readonly=False + ) + sconto_maggiorazione_product_id = fields.Many2one( + related="company_id.sconto_maggiorazione_product_id", readonly=False + ) + arrotondamenti_attivi_account_id = fields.Many2one( + related="company_id.arrotondamenti_attivi_account_id", readonly=False + ) + arrotondamenti_passivi_account_id = fields.Many2one( + related="company_id.arrotondamenti_passivi_account_id", readonly=False + ) + arrotondamenti_tax_id = fields.Many2one( + related="company_id.arrotondamenti_tax_id", readonly=False + ) + in_invoice_registration_date = fields.Selection( + related="company_id.in_invoice_registration_date", readonly=False + ) diff --git a/l10n_it_fatturapa_in/models/partner.py b/l10n_it_fatturapa_in/models/partner.py new file mode 100644 index 000000000000..f9cd48f0d2e8 --- /dev/null +++ b/l10n_it_fatturapa_in/models/partner.py @@ -0,0 +1,58 @@ +from odoo import fields, models + + +class Partner(models.Model): + _inherit = "res.partner" + + e_invoice_default_product_id = fields.Many2one( + comodel_name="product.product", + string="E-bill Default Product", + help="Used by electronic invoice XML import. " + "If filled in, generated bill lines will use this product when " + "no other possible product is found.", + ) + e_invoice_detail_level = fields.Selection( + [ + ("0", "Minimum"), + ("1", "Tax Rate"), + ("2", "Maximum"), + ], + string="E-bills Detail Level", + help="Minimum level: Bill is created with no lines; " + "User will have to create them, according to what specified in " + "the electronic bill.\n" + "Tax rate level: Rate level: an invoice line is created for each " + "rate present in the electronic invoice\n" + "Maximum level: every line contained in the electronic bill " + "will create a line in the bill.", + default="2", + required=True, + ) + e_invoice_price_decimal_digits = fields.Integer( + "E-bills prices decimal digits", + help="Decimal digits used in prices computation. This is needed to correctly " + "import e-invoices with many decimal digits, not being forced to " + "increase decimal digits of all your prices. " + 'Otherwise, increase "Product Price" precision. ' + "-1 to use the default precision", + default=-1, + ) + e_invoice_quantity_decimal_digits = fields.Integer( + "E-bills quantities decimal digits", + help='Decimal digits used for quantity field. See "prices decimal digits". ' + "-1 to use the default precision", + default=-1, + ) + e_invoice_discount_decimal_digits = fields.Integer( + "E-bills discounts decimal digits", + help='Decimal digits used for discount field. See "prices decimal digits". ' + "-1 to use the default precision", + default=-1, + ) + + # https://github.com/odoo/odoo/pull/71920 + # this is temporary fix, we depend on the issue do the solved for our test + # to be all green + def _split_vat(self, vat): + vat = vat.replace(" ", "") + return super()._split_vat(vat) diff --git a/l10n_it_fatturapa_in/readme/CONFIGURE.rst b/l10n_it_fatturapa_in/readme/CONFIGURE.rst new file mode 100644 index 000000000000..2b412e5a29de --- /dev/null +++ b/l10n_it_fatturapa_in/readme/CONFIGURE.rst @@ -0,0 +1,33 @@ +**Italiano** + +Consultare anche il file README del modulo l10n_it_fatturapa. + +Per ciascun fornitore è possibile impostare il "Livello dettaglio e-fatture": + + - Livello minimo: la fattura fornitore viene creata senza righe, che dovranno essere create dall'utente in base a quanto indicato nella fattura elettronica + - Livello massimo: le righe della fattura fornitore verranno generate a partire da tutte quelle presenti nella fattura elettronica + +Nella scheda fornitore è inoltre possibile impostare il "Prodotto predefinito per e-fattura": verrà usato, durante la generazione delle fatture fornitore, quando non sono disponibili altri prodotti adeguati. Il conto e l'imposta della riga fattura verranno impostati in base a quelli configurati nel prodotto. + +Tutti i codici prodotto usati dai fornitori possono essere impostati nella relativa scheda, in + +Magazzino → Prodotti + +Se il fornitore specifica un codice noto nell'XML, questo verrà usato dal sistema per recuperare il prodotto corretto da usare nella riga fattura, impostando il conto e l'imposta collegati. + +**English** + +See also the README file of l10n_it_fatturapa module. + +For every supplier, it is possible to set the 'E-bills Detail Level': + + - Minimum level: Bill is created with no lines; User will have to create them, according to what specified in the electronic bill + - Maximum level: Every line contained in electronic bill will create a line in bill + +Moreover, in supplier form you can set the 'E-bill Default Product': this product will be used, during generation of bills, when no other possible product is found. Tax and account of bill line will be set according to what configured in the product. + +Every product code used by suppliers can be set, in product form, in + +Inventory → Products + +If supplier specifies a known code in XML, the system will use it to retrieve the correct product to be used in bill line, setting the related tax and account. diff --git a/l10n_it_fatturapa_in/readme/CONTRIBUTORS.rst b/l10n_it_fatturapa_in/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000000..d592bfd1ebf4 --- /dev/null +++ b/l10n_it_fatturapa_in/readme/CONTRIBUTORS.rst @@ -0,0 +1,7 @@ +* Lorenzo Battistini +* Roberto Onnis +* Alessio Gerace +* Sergio Zanchetta +* Giovanni Serra +* Gianmarco Conte +* Marco Colombo diff --git a/l10n_it_fatturapa_in/readme/DESCRIPTION.rst b/l10n_it_fatturapa_in/readme/DESCRIPTION.rst new file mode 100644 index 000000000000..29ce32fed4bc --- /dev/null +++ b/l10n_it_fatturapa_in/readme/DESCRIPTION.rst @@ -0,0 +1,19 @@ +**Italiano** + +Questo modulo consente di importare i file XML della fattura elettronica versione 1.2 + +http://www.fatturapa.gov.it/export/fatturazione/it/normativa/f-2.htm + +ricevuti attraverso il Sistema di Interscambio (SdI). + +http://www.fatturapa.gov.it/export/fatturazione/it/sdi.htm + +**English** + +This module allows to import Electronic Bill XML files version 1.2 + +http://www.fatturapa.gov.it/export/fatturazione/en/normativa/f-2.htm + +received through the Exchange System (ES). + +http://www.fatturapa.gov.it/export/fatturazione/en/sdi.htm diff --git a/l10n_it_fatturapa_in/readme/INSTALL.rst b/l10n_it_fatturapa_in/readme/INSTALL.rst new file mode 100644 index 000000000000..a23c6e049dba --- /dev/null +++ b/l10n_it_fatturapa_in/readme/INSTALL.rst @@ -0,0 +1,11 @@ +**Italiano** + +Questo modulo richiede asn1crypto + +https://github.com/wbond/asn1crypto + +**English** + +This module requires asn1crypto + +https://github.com/wbond/asn1crypto diff --git a/l10n_it_fatturapa_in/readme/ROADMAP.rst b/l10n_it_fatturapa_in/readme/ROADMAP.rst new file mode 100644 index 000000000000..452aee30958f --- /dev/null +++ b/l10n_it_fatturapa_in/readme/ROADMAP.rst @@ -0,0 +1,19 @@ +Il modulo contiene un cambiamento alla firma di un metodo in ``models/account.py`` +il quale cambia da + +``compute_xml_amount_untaxed(self, DatiRiepilogo)`` + +a + +``compute_xml_amount_untaxed(self, FatturaBody)`` + +Il cambiamento è dovuto all'implementazione della gestione degli arrotondamenti +che posso essere presenti in 2 sezioni diverse del file XML della fattura elettronica. + +La soluzione ottimale è stata di cambiare la firma del metodo per consentire +la visibilità delle sezioni ``FatturaElettronicaBody.DatiBeniServizi.DatiRiepilogo`` e +``FatturaElettronicaBody.DatiGenerali.DatiGeneraliDocumento`` dove è presente il nodo ``Arrotondamento`` + +Pertanto, al fine di ottenere il corretto valore del totale imponibile, i moduli che +avessero ridefinito il metodo ``compute_xml_amount_untaxed`` nel modello ``account.invoice`` +dovranno adeguare la chiamata al metodo stesso preoccupandosi di utilizzare come primo parametro l'oggetto ``FatturaElettronicaBody``. diff --git a/l10n_it_fatturapa_in/readme/USAGE.rst b/l10n_it_fatturapa_in/readme/USAGE.rst new file mode 100644 index 000000000000..0deca0bd6ac4 --- /dev/null +++ b/l10n_it_fatturapa_in/readme/USAGE.rst @@ -0,0 +1,17 @@ +**Italiano** + + * Andare in Contabilità → Acquisti → Fattura elettronica + * Caricare un file XML + * Visualizzare il contenuto della fattura facendo clic su "Mostra anteprima" + * Eseguire la procedura guidata "Importa e-fattura" per creare una fattura in bozza oppure "Collega a fattura esistente" per collegare il file XML a una fattura già (automaticamente) creata + +Nell'elenco file delle fatture elettroniche in ingresso saranno presenti, in modo predefinito, quelli da registrare. Sono i file che devono ancora essere collegati a una o più fatture fornitore. + +**English** + + * Go to Accounting → Purchases → Electronic Bill + * Upload XML file + * View bill content clicking on 'Show preview' + * Run 'Import e-bill' wizard to create a draft bill or run 'Link to existing bill' to link the XML file to an already (automatically) created bill + +In the incoming electronic bill files list you will see, by default, files to be registered. These are files not yet linked to one or more bills. diff --git a/l10n_it_fatturapa_in/security/ir.model.access.csv b/l10n_it_fatturapa_in/security/ir.model.access.csv new file mode 100644 index 000000000000..6ce8e04fa203 --- /dev/null +++ b/l10n_it_fatturapa_in/security/ir.model.access.csv @@ -0,0 +1,8 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_fatturapa_attachment_in,access_fatturapa_attachment_in,model_fatturapa_attachment_in,account.group_account_invoice,1,1,1,1 +access_fatturapa_article_code,access_fatturapa_article_code,model_fatturapa_article_code,account.group_account_invoice,1,1,1,1 +access_einvoice_line,access_einvoice_line,model_einvoice_line,account.group_account_invoice,1,1,1,1 +access_einvoice_line_other_data,access_einvoice_line_other_data,model_einvoice_line_other_data,account.group_account_invoice,1,1,1,1 +access_wizard_import_fatturapa,access_wizard_import_fatturapa,model_wizard_import_fatturapa,account.group_account_invoice,1,1,1,1 +access_wizard_link_to_invoice,access_wizard_link_to_invoice,model_wizard_link_to_invoice,account.group_account_invoice,1,1,1,1 +access_wizard_link_to_invoice_line,access_wizard_link_to_invoice_line,model_wizard_link_to_invoice_line,account.group_account_invoice,1,1,1,1 diff --git a/l10n_it_fatturapa_in/security/rules.xml b/l10n_it_fatturapa_in/security/rules.xml new file mode 100644 index 000000000000..0fd6a0e2cde6 --- /dev/null +++ b/l10n_it_fatturapa_in/security/rules.xml @@ -0,0 +1,15 @@ + + + + + Fatturapa in fatturapa_in_multi_company_rule multi company rule + + + ['|',('company_id','=',False),('company_id','in',company_ids)] + + + diff --git a/l10n_it_fatturapa_in/static/description/icon.png b/l10n_it_fatturapa_in/static/description/icon.png new file mode 100644 index 000000000000..3a0328b516c4 Binary files /dev/null and b/l10n_it_fatturapa_in/static/description/icon.png differ diff --git a/l10n_it_fatturapa_in/static/description/index.html b/l10n_it_fatturapa_in/static/description/index.html new file mode 100644 index 000000000000..44ea8f854030 --- /dev/null +++ b/l10n_it_fatturapa_in/static/description/index.html @@ -0,0 +1,516 @@ + + + + + + +ITA - Fattura elettronica - Ricezione + + + +
+

ITA - Fattura elettronica - Ricezione

+ + +

Beta License: AGPL-3 OCA/l10n-italy Translate me on Weblate Try me on Runbot

+

Italiano

+

Questo modulo consente di importare i file XML della fattura elettronica versione 1.2

+

http://www.fatturapa.gov.it/export/fatturazione/it/normativa/f-2.htm

+

ricevuti attraverso il Sistema di Interscambio (SdI).

+

http://www.fatturapa.gov.it/export/fatturazione/it/sdi.htm

+

English

+

This module allows to import Electronic Bill XML files version 1.2

+

http://www.fatturapa.gov.it/export/fatturazione/en/normativa/f-2.htm

+

received through the Exchange System (ES).

+

http://www.fatturapa.gov.it/export/fatturazione/en/sdi.htm

+

Table of contents

+ +
+

Installation

+

Italiano

+

Questo modulo richiede asn1crypto

+

https://github.com/wbond/asn1crypto

+

English

+

This module requires asn1crypto

+

https://github.com/wbond/asn1crypto

+
+
+

Configuration

+

Italiano

+

Consultare anche il file README del modulo l10n_it_fatturapa.

+

Per ciascun fornitore è possibile impostare il “Livello dettaglio e-fatture”:

+
+
    +
  • Livello minimo: la fattura fornitore viene creata senza righe, che dovranno essere create dall’utente in base a quanto indicato nella fattura elettronica
  • +
  • Livello massimo: le righe della fattura fornitore verranno generate a partire da tutte quelle presenti nella fattura elettronica
  • +
+
+

Nella scheda fornitore è inoltre possibile impostare il “Prodotto predefinito per e-fattura”: verrà usato, durante la generazione delle fatture fornitore, quando non sono disponibili altri prodotti adeguati. Il conto e l’imposta della riga fattura verranno impostati in base a quelli configurati nel prodotto.

+

Tutti i codici prodotto usati dai fornitori possono essere impostati nella relativa scheda, in

+

Magazzino → Prodotti

+

Se il fornitore specifica un codice noto nell’XML, questo verrà usato dal sistema per recuperare il prodotto corretto da usare nella riga fattura, impostando il conto e l’imposta collegati.

+

English

+

See also the README file of l10n_it_fatturapa module.

+

For every supplier, it is possible to set the ‘E-bills Detail Level’:

+
+
    +
  • Minimum level: Bill is created with no lines; User will have to create them, according to what specified in the electronic bill
  • +
  • Maximum level: Every line contained in electronic bill will create a line in bill
  • +
+
+

Moreover, in supplier form you can set the ‘E-bill Default Product’: this product will be used, during generation of bills, when no other possible product is found. Tax and account of bill line will be set according to what configured in the product.

+

Every product code used by suppliers can be set, in product form, in

+

Inventory → Products

+

If supplier specifies a known code in XML, the system will use it to retrieve the correct product to be used in bill line, setting the related tax and account.

+
+
+

Usage

+

Italiano

+
+
    +
  • Andare in Contabilità → Acquisti → Fattura elettronica
  • +
  • Caricare un file XML
  • +
  • Visualizzare il contenuto della fattura facendo clic su “Mostra anteprima”
  • +
  • Eseguire la procedura guidata “Importa e-fattura” per creare una fattura in bozza oppure “Collega a fattura esistente” per collegare il file XML a una fattura già (automaticamente) creata
  • +
+
+

Nell’elenco file delle fatture elettroniche in ingresso saranno presenti, in modo predefinito, quelli da registrare. Sono i file che devono ancora essere collegati a una o più fatture fornitore.

+

English

+
+
    +
  • Go to Accounting → Purchases → Electronic Bill
  • +
  • Upload XML file
  • +
  • View bill content clicking on ‘Show preview’
  • +
  • Run ‘Import e-bill’ wizard to create a draft bill or run ‘Link to existing bill’ to link the XML file to an already (automatically) created bill
  • +
+
+

In the incoming electronic bill files list you will see, by default, files to be registered. These are files not yet linked to one or more bills.

+
+
+

Known issues / Roadmap

+

Il modulo contiene un cambiamento alla firma di un metodo in models/account.py +il quale cambia da

+

compute_xml_amount_untaxed(self, DatiRiepilogo)

+

a

+

compute_xml_amount_untaxed(self, FatturaBody)

+

Il cambiamento è dovuto all’implementazione della gestione degli arrotondamenti +che posso essere presenti in 2 sezioni diverse del file XML della fattura elettronica.

+

La soluzione ottimale è stata di cambiare la firma del metodo per consentire +la visibilità delle sezioni FatturaElettronicaBody.DatiBeniServizi.DatiRiepilogo e +FatturaElettronicaBody.DatiGenerali.DatiGeneraliDocumento dove è presente il nodo Arrotondamento

+

Pertanto, al fine di ottenere il corretto valore del totale imponibile, i moduli che +avessero ridefinito il metodo compute_xml_amount_untaxed nel modello account.invoice +dovranno adeguare la chiamata al metodo stesso preoccupandosi di utilizzare come primo parametro l’oggetto FatturaElettronicaBody.

+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Agile Business Group
  • +
  • Innoviu
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/l10n-italy project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/l10n_it_fatturapa_in/static/src/img/icon.png b/l10n_it_fatturapa_in/static/src/img/icon.png new file mode 100644 index 000000000000..1f07394c3b79 Binary files /dev/null and b/l10n_it_fatturapa_in/static/src/img/icon.png differ diff --git a/l10n_it_fatturapa_in/tests/__init__.py b/l10n_it_fatturapa_in/tests/__init__.py new file mode 100644 index 000000000000..04aa630c98ef --- /dev/null +++ b/l10n_it_fatturapa_in/tests/__init__.py @@ -0,0 +1,2 @@ +from . import fatturapa_common +from . import test_import_fatturapa_xml diff --git a/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR03.base64.xml.p7m b/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR03.base64.xml.p7m new file mode 100644 index 000000000000..5209aacc3a42 --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR03.base64.xml.p7m @@ -0,0 +1 @@ +MIIkBgYJKoZIhvcNAQcCoIIj9zCCI/MCAQExDTALBglghkgBZQMEAgEwghm3BgkqhkiG9w0BBwGgghmoBIIZpDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+CjxwOkZhdHR1cmFFbGV0dHJvbmljYSB2ZXJzaW9uZT0iRlBSMTIiIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIiB4bWxuczpwPSJodHRwOi8vaXZhc2Vydml6aS5hZ2VuemlhZW50cmF0ZS5nb3YuaXQvZG9jcy94c2QvZmF0dHVyZS92MS4yIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9pdmFzZXJ2aXppLmFnZW56aWFlbnRyYXRlLmdvdi5pdC9kb2NzL3hzZC9mYXR0dXJlL3YxLjIgaHR0cDovL3d3dy5mYXR0dXJhcGEuZ292Lml0L2V4cG9ydC9mYXR0dXJhemlvbmUvc2RpL2ZhdHR1cmFwYS92MS4yL1NjaGVtYV9kZWxfZmlsZV94bWxfRmF0dHVyYVBBX3ZlcnNpb25lXzEuMi54c2QiPgogIDxGYXR0dXJhRWxldHRyb25pY2FIZWFkZXI+CiAgICA8RGF0aVRyYXNtaXNzaW9uZT4KICAgICAgPElkVHJhc21pdHRlbnRlPgogICAgICAgIDxJZFBhZXNlPklUPC9JZFBhZXNlPgogICAgICAgIDxJZENvZGljZT4wNTk3OTM2MTIxODwvSWRDb2RpY2U+CiAgICAgIDwvSWRUcmFzbWl0dGVudGU+CiAgICAgIDxQcm9ncmVzc2l2b0ludmlvPjAwMDAxPC9Qcm9ncmVzc2l2b0ludmlvPgogICAgICA8Rm9ybWF0b1RyYXNtaXNzaW9uZT5GUFIxMjwvRm9ybWF0b1RyYXNtaXNzaW9uZT4KICAgICAgPENvZGljZURlc3RpbmF0YXJpbz4wMDAwMDAwPC9Db2RpY2VEZXN0aW5hdGFyaW8+CiAgICAgIDxDb250YXR0aVRyYXNtaXR0ZW50ZS8+CiAgICA8L0RhdGlUcmFzbWlzc2lvbmU+CiAgICA8Q2VkZW50ZVByZXN0YXRvcmU+CiAgICAgIDxEYXRpQW5hZ3JhZmljaT4KICAgICAgICA8SWRGaXNjYWxlSVZBPgogICAgICAgICAgPElkUGFlc2U+SVQ8L0lkUGFlc2U+CiAgICAgICAgICA8SWRDb2RpY2U+MDI3ODA3OTAxMDc8L0lkQ29kaWNlPgogICAgICAgIDwvSWRGaXNjYWxlSVZBPgogICAgICAgIDxBbmFncmFmaWNhPgogICAgICAgICAgPERlbm9taW5hemlvbmU+U09DSUVUQScgQUxQSEEgU1JMPC9EZW5vbWluYXppb25lPgogICAgICAgIDwvQW5hZ3JhZmljYT4KICAgICAgICA8UmVnaW1lRmlzY2FsZT5SRjAxPC9SZWdpbWVGaXNjYWxlPgogICAgICA8L0RhdGlBbmFncmFmaWNpPgogICAgICA8U2VkZT4KICAgICAgICA8SW5kaXJpenpvPlZJQUxFIFJPTUEgNTQzPC9JbmRpcml6em8+CiAgICAgICAgPENBUD4wNzEwMDwvQ0FQPgogICAgICAgIDxDb211bmU+U0FTU0FSSTwvQ29tdW5lPgogICAgICAgIDxQcm92aW5jaWE+U1M8L1Byb3ZpbmNpYT4KICAgICAgICA8TmF6aW9uZT5JVDwvTmF6aW9uZT4KICAgICAgPC9TZWRlPgogICAgPC9DZWRlbnRlUHJlc3RhdG9yZT4KICAgIDxDZXNzaW9uYXJpb0NvbW1pdHRlbnRlPgogICAgICA8RGF0aUFuYWdyYWZpY2k+CiAgICAgICAgPENvZGljZUZpc2NhbGU+MDM1MzM1OTAxNzQ8L0NvZGljZUZpc2NhbGU+CiAgICAgICAgPEFuYWdyYWZpY2E+CiAgICAgICAgICA8RGVub21pbmF6aW9uZT5CRVRBIEdBTU1BPC9EZW5vbWluYXppb25lPgogICAgICAgIDwvQW5hZ3JhZmljYT4KICAgICAgPC9EYXRpQW5hZ3JhZmljaT4KICAgICAgPFNlZGU+CiAgICAgICAgPEluZGlyaXp6bz5WSUEgVE9SSU5PIDM4LUI8L0luZGlyaXp6bz4KICAgICAgICA8Q0FQPjAwMTQ1PC9DQVA+CiAgICAgICAgPENvbXVuZT5ST01BPC9Db211bmU+CiAgICAgICAgPFByb3ZpbmNpYT5STTwvUHJvdmluY2lhPgogICAgICAgIDxOYXppb25lPklUPC9OYXppb25lPgogICAgICA8L1NlZGU+CiAgICA8L0Nlc3Npb25hcmlvQ29tbWl0dGVudGU+CiAgPC9GYXR0dXJhRWxldHRyb25pY2FIZWFkZXI+CiAgPEZhdHR1cmFFbGV0dHJvbmljYUJvZHk+CiAgICA8RGF0aUdlbmVyYWxpPgogICAgICA8RGF0aUdlbmVyYWxpRG9jdW1lbnRvPgogICAgICAgIDxUaXBvRG9jdW1lbnRvPlREMDE8L1RpcG9Eb2N1bWVudG8+CiAgICAgICAgPERpdmlzYT5FVVI8L0RpdmlzYT4KICAgICAgICA8RGF0YT4yMDE0LTEyLTE4PC9EYXRhPgogICAgICAgIDxOdW1lcm8+MTIzPC9OdW1lcm8+CiAgICAgICAgPENhdXNhbGU+TEEgRkFUVFVSQSBGQSBSSUZFUklNRU5UTyBBRCBVTkEgT1BFUkFaSU9ORSBBQUFBIEJCQkJCQkJCQkJCQkJCQkJCQiBDQ0MgREREREREREREREREREREIEUgRkZGRkZGRkZGRkZGRkZGRkZGRkYgR0dHR0dHR0dHRyBISEhISEhIIElJIExMTExMTExMTExMTExMTExMIE1NTSBOTk5OTiBPTyBQUFBQUFBQUFBQUCBRUVFRIFJSUlIgU1NTU1NTU1NTU1NTU1M8L0NhdXNhbGU+CiAgICAgICAgPENhdXNhbGU+U0VHVUUgREVTQ1JJWklPTkUgQ0FVU0FMRSBORUwgQ0FTTyBJTiBDVUkgTk9OIFNJQU5PIFNUQVRJIFNVRkZJQ0lFTlRJIDIwMCBDQVJBVFRFUkkgQUFBQUFBQUFBQUEgQkJCQkJCQkJCQkJCQkJCQkI8L0NhdXNhbGU+CiAgICAgIDwvRGF0aUdlbmVyYWxpRG9jdW1lbnRvPgogICAgICA8RGF0aU9yZGluZUFjcXVpc3RvPgogICAgICAgIDxSaWZlcmltZW50b051bWVyb0xpbmVhPjE8L1JpZmVyaW1lbnRvTnVtZXJvTGluZWE+CiAgICAgICAgPElkRG9jdW1lbnRvPjY2Njg1PC9JZERvY3VtZW50bz4KICAgICAgICA8TnVtSXRlbT4xPC9OdW1JdGVtPgogICAgICA8L0RhdGlPcmRpbmVBY3F1aXN0bz4KICAgICAgPERhdGlUcmFzcG9ydG8+CiAgICAgICAgPERhdGlBbmFncmFmaWNpVmV0dG9yZT4JCQkJCiAgICAgICAgICA8SWRGaXNjYWxlSVZBPgogICAgICAgICAgICA8SWRQYWVzZT5JVDwvSWRQYWVzZT4KICAgICAgICAgICAgPElkQ29kaWNlPjA0NTA3OTkwMTUwPC9JZENvZGljZT4KICAgICAgICAgIDwvSWRGaXNjYWxlSVZBPgogICAgICAgICAgPEFuYWdyYWZpY2E+CiAgICAgICAgICAgIDxEZW5vbWluYXppb25lPlRyYXNwb3J0byBzcGE8L0Rlbm9taW5hemlvbmU+CiAgICAgICAgICA8L0FuYWdyYWZpY2E+CiAgICAgICAgPC9EYXRpQW5hZ3JhZmljaVZldHRvcmU+CiAgICAgICAgPERhdGFPcmFDb25zZWduYT4yMDEyLTEwLTIyVDE2OjQ2OjEyLjAwMCswMjowMDwvRGF0YU9yYUNvbnNlZ25hPgogICAgICA8L0RhdGlUcmFzcG9ydG8+CiAgICA8L0RhdGlHZW5lcmFsaT4KICAgIDxEYXRpQmVuaVNlcnZpemk+CiAgICAgIDxEZXR0YWdsaW9MaW5lZT4KICAgICAgICA8TnVtZXJvTGluZWE+MTwvTnVtZXJvTGluZWE+CiAgICAgICAgPENvZGljZUFydGljb2xvPgogICAgICAgICAgPENvZGljZVRpcG8+SU5UPC9Db2RpY2VUaXBvPgogICAgICAgICAgPENvZGljZVZhbG9yZT5BUlQxMjM8L0NvZGljZVZhbG9yZT4KICAgICAgICA8L0NvZGljZUFydGljb2xvPgogICAgICAgIDxEZXNjcml6aW9uZT5MQSBERVNDUklaSU9ORSBERUxMQSBGT1JOSVRVUkEgUFVPJyBTVVBFUkFSRSBJIENFTlRPIENBUkFUVEVSSSBDSEUgUkFQUFJFU0VOVEFWQU5PIElMIFBSRUNFREVOVEUgTElNSVRFIERJTUVOU0lPTkFMRS4gVEFMRSBMSU1JVEUgTkVMTEEgTlVPVkEgVkVSU0lPTkUgRScgU1RBVE8gUE9SVEFUTyBBIE1JTExFIENBUkFUVEVSSTwvRGVzY3JpemlvbmU+CiAgICAgICAgPFF1YW50aXRhPjUuMDA8L1F1YW50aXRhPgogICAgICAgIDxQcmV6em9Vbml0YXJpbz4xLjAwPC9QcmV6em9Vbml0YXJpbz4KICAgICAgICA8UHJlenpvVG90YWxlPjUuMDA8L1ByZXp6b1RvdGFsZT4KICAgICAgICA8QWxpcXVvdGFJVkE+MjIuMDA8L0FsaXF1b3RhSVZBPgogICAgICA8L0RldHRhZ2xpb0xpbmVlPgogICAgICA8RGV0dGFnbGlvTGluZWU+CiAgICAgICAgPE51bWVyb0xpbmVhPjI8L051bWVyb0xpbmVhPgogICAgICAgIDxEZXNjcml6aW9uZT5GT1JOSVRVUkUgVkFSSUUgUEVSIFVGRklDSU88L0Rlc2NyaXppb25lPgogICAgICAgIDxRdWFudGl0YT4xMC4wMDwvUXVhbnRpdGE+CiAgICAgICAgPFByZXp6b1VuaXRhcmlvPjIuMDA8L1ByZXp6b1VuaXRhcmlvPgogICAgICAgIDxQcmV6em9Ub3RhbGU+MjAuMDA8L1ByZXp6b1RvdGFsZT4KICAgICAgICA8QWxpcXVvdGFJVkE+MjIuMDA8L0FsaXF1b3RhSVZBPgogICAgICA8L0RldHRhZ2xpb0xpbmVlPgogICAgICA8RGF0aVJpZXBpbG9nbz4KICAgICAgICA8QWxpcXVvdGFJVkE+MjIuMDA8L0FsaXF1b3RhSVZBPgogICAgICAgIDxJbXBvbmliaWxlSW1wb3J0bz4yNS4wMDwvSW1wb25pYmlsZUltcG9ydG8+CiAgICAgICAgPEltcG9zdGE+NS41MDwvSW1wb3N0YT4KICAgICAgICA8RXNpZ2liaWxpdGFJVkE+STwvRXNpZ2liaWxpdGFJVkE+CiAgICAgIDwvRGF0aVJpZXBpbG9nbz4KICAgIDwvRGF0aUJlbmlTZXJ2aXppPgogICAgPERhdGlQYWdhbWVudG8+CiAgICAgIDxDb25kaXppb25pUGFnYW1lbnRvPlRQMDE8L0NvbmRpemlvbmlQYWdhbWVudG8+CiAgICAgIDxEZXR0YWdsaW9QYWdhbWVudG8+CiAgICAgICAgPE1vZGFsaXRhUGFnYW1lbnRvPk1QMDE8L01vZGFsaXRhUGFnYW1lbnRvPgogICAgICAgIDxEYXRhU2NhZGVuemFQYWdhbWVudG8+MjAxNS0wMS0zMDwvRGF0YVNjYWRlbnphUGFnYW1lbnRvPgogICAgICAgIDxJbXBvcnRvUGFnYW1lbnRvPjMyLjUwPC9JbXBvcnRvUGFnYW1lbnRvPgogICAgICA8L0RldHRhZ2xpb1BhZ2FtZW50bz4KICAgIDwvRGF0aVBhZ2FtZW50bz4KICA8L0ZhdHR1cmFFbGV0dHJvbmljYUJvZHk+CiAgPEZhdHR1cmFFbGV0dHJvbmljYUJvZHk+CiAgICA8RGF0aUdlbmVyYWxpPgogICAgICA8RGF0aUdlbmVyYWxpRG9jdW1lbnRvPgogICAgICAgIDxUaXBvRG9jdW1lbnRvPlREMDE8L1RpcG9Eb2N1bWVudG8+CiAgICAgICAgPERpdmlzYT5FVVI8L0RpdmlzYT4KICAgICAgICA8RGF0YT4yMDE0LTEyLTIwPC9EYXRhPgogICAgICAgIDxOdW1lcm8+NDU2PC9OdW1lcm8+CiAgICAgICAgPENhdXNhbGU+TEEgRkFUVFVSQSBGQSBSSUZFUklNRU5UTyBBRCBVTkEgT1BFUkFaSU9ORSBBQUFBIEJCQkJCQkJCQkJCQkJCQkJCQiBDQ0MgREREREREREREREREREREIEUgRkZGRkZGRkZGRkZGRkZGRkZGRkYgR0dHR0dHR0dHRyBISEhISEhIIElJIExMTExMTExMTExMTExMTExMIE1NTSBOTk5OTiBPTyBQUFBQUFBQUFBQUCBRUVFRIFJSUlIgU1NTU1NTU1NTU1NTU1M8L0NhdXNhbGU+CiAgICAgICAgPENhdXNhbGU+U0VHVUUgREVTQ1JJWklPTkUgQ0FVU0FMRSBORUwgQ0FTTyBJTiBDVUkgTk9OIFNJQU5PIFNUQVRJIFNVRkZJQ0lFTlRJIDIwMCBDQVJBVFRFUkkgQUFBQUFBQUFBQUEgQkJCQkJCQkJCQkJCQkJCQkI8L0NhdXNhbGU+CiAgICAgIDwvRGF0aUdlbmVyYWxpRG9jdW1lbnRvPgogICAgICA8RGF0aU9yZGluZUFjcXVpc3RvPgogICAgICAgIDxSaWZlcmltZW50b051bWVyb0xpbmVhPjE8L1JpZmVyaW1lbnRvTnVtZXJvTGluZWE+CiAgICAgICAgPElkRG9jdW1lbnRvPjY2Njg1PC9JZERvY3VtZW50bz4KICAgICAgICA8TnVtSXRlbT4xPC9OdW1JdGVtPgogICAgICA8L0RhdGlPcmRpbmVBY3F1aXN0bz4KICAgIDwvRGF0aUdlbmVyYWxpPgogICAgPERhdGlCZW5pU2Vydml6aT4KICAgICAgPERldHRhZ2xpb0xpbmVlPgogICAgICAgIDxOdW1lcm9MaW5lYT4xPC9OdW1lcm9MaW5lYT4KICAgICAgICA8RGVzY3JpemlvbmU+UFJFU1RBWklPTkUgREVMIFNFR1VFTlRFIFNFUlZJWklPIFBST0ZFU1NJT05BTEU6IExBIERFU0NSSVpJT05FIERFTExBIFBSRVNUQVpJT05FIFBVTycgU1VQRVJBUkUgSSBDRU5UTyBDQVJBVFRFUkkgQ0hFIFJBUFBSRVNFTlRBVkFOTyBJTCBQUkVDRURFTlRFIExJTUlURSBESU1FTlNJT05BTEUuIFRBTEUgTElNSVRFIE5FTExBIE5VT1ZBIFZFUlNJT05FIEUnIFNUQVRPIFBPUlRBVE8gQSBNSUxMRSBDQVJBVFRFUkk8L0Rlc2NyaXppb25lPgogICAgICAgIDxQcmV6em9Vbml0YXJpbz4yMDAwLjAwPC9QcmV6em9Vbml0YXJpbz4KICAgICAgICA8UHJlenpvVG90YWxlPjIwMDAuMDA8L1ByZXp6b1RvdGFsZT4KICAgICAgICA8QWxpcXVvdGFJVkE+MjIuMDA8L0FsaXF1b3RhSVZBPgogICAgICA8L0RldHRhZ2xpb0xpbmVlPgogICAgICA8RGF0aVJpZXBpbG9nbz4KICAgICAgICA8QWxpcXVvdGFJVkE+MjIuMDA8L0FsaXF1b3RhSVZBPgogICAgICAgIDxJbXBvbmliaWxlSW1wb3J0bz4yMDAwLjAwPC9JbXBvbmliaWxlSW1wb3J0bz4KICAgICAgICA8SW1wb3N0YT40NDAuMDA8L0ltcG9zdGE+CiAgICAgICAgPEVzaWdpYmlsaXRhSVZBPkk8L0VzaWdpYmlsaXRhSVZBPgogICAgICA8L0RhdGlSaWVwaWxvZ28+CiAgICA8L0RhdGlCZW5pU2Vydml6aT4KICAgIDxEYXRpUGFnYW1lbnRvPgogICAgICA8Q29uZGl6aW9uaVBhZ2FtZW5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 diff --git a/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR03.xml b/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR03.xml new file mode 100644 index 000000000000..752e850b6b10 --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR03.xml @@ -0,0 +1,154 @@ + + + + + + IT + 05979361218 + + 00001 + FPR12 + 0000000 + + + + + + IT + 02780790107 + + + SOCIETA' ALPHA SRL + + RF01 + + + VIALE ROMA 543 + 07100 + SASSARI + SS + IT + + + + + 03533590174 + + BETA GAMMA + + + + VIA TORINO 38-B + 00145 + ROMA + RM + IT + + + + + + + TD01 + EUR + 2014-12-18 + 123 + LA FATTURA FA RIFERIMENTO AD UNA OPERAZIONE AAAA BBBBBBBBBBBBBBBBBB CCC DDDDDDDDDDDDDDD E FFFFFFFFFFFFFFFFFFFF GGGGGGGGGG HHHHHHH II LLLLLLLLLLLLLLLLL MMM NNNNN OO PPPPPPPPPPP QQQQ RRRR SSSSSSSSSSSSSS + SEGUE DESCRIZIONE CAUSALE NEL CASO IN CUI NON SIANO STATI SUFFICIENTI 200 CARATTERI AAAAAAAAAAA BBBBBBBBBBBBBBBBB + + + 1 + 66685 + 1 + + + + + IT + 04507990150 + + + Trasporto spa + + + 2012-10-22T16:46:12.000+02:00 + + + + + 1 + + INT + ART123 + + LA DESCRIZIONE DELLA FORNITURA PUO' SUPERARE I CENTO CARATTERI CHE RAPPRESENTAVANO IL PRECEDENTE LIMITE DIMENSIONALE. TALE LIMITE NELLA NUOVA VERSIONE E' STATO PORTATO A MILLE CARATTERI + 5.00 + 1.00 + 5.00 + 22.00 + + + 2 + FORNITURE VARIE PER UFFICIO + 10.00 + 2.00 + 20.00 + 22.00 + + + 22.00 + 25.00 + 5.50 + I + + + + TP01 + + MP01 + 2015-01-30 + 32.50 + + + + + + + TD01 + EUR + 2014-12-20 + 456 + LA FATTURA FA RIFERIMENTO AD UNA OPERAZIONE AAAA BBBBBBBBBBBBBBBBBB CCC DDDDDDDDDDDDDDD E FFFFFFFFFFFFFFFFFFFF GGGGGGGGGG HHHHHHH II LLLLLLLLLLLLLLLLL MMM NNNNN OO PPPPPPPPPPP QQQQ RRRR SSSSSSSSSSSSSS + SEGUE DESCRIZIONE CAUSALE NEL CASO IN CUI NON SIANO STATI SUFFICIENTI 200 CARATTERI AAAAAAAAAAA BBBBBBBBBBBBBBBBB + + + 1 + 66685 + 1 + + + + + 1 + PRESTAZIONE DEL SEGUENTE SERVIZIO PROFESSIONALE: LA DESCRIZIONE DELLA PRESTAZIONE PUO' SUPERARE I CENTO CARATTERI CHE RAPPRESENTAVANO IL PRECEDENTE LIMITE DIMENSIONALE. TALE LIMITE NELLA NUOVA VERSIONE E' STATO PORTATO A MILLE CARATTERI + 2000.00 + 2000.00 + 22.00 + + + 22.00 + 2000.00 + 440.00 + I + + + + TP01 + + MP19 + 2015-01-28 + 2440.00 + + + + diff --git a/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR03.xml.p7m b/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR03.xml.p7m new file mode 100644 index 000000000000..d0fb2e2676b5 Binary files /dev/null and b/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR03.xml.p7m differ diff --git a/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR04.base64.xml.p7m b/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR04.base64.xml.p7m new file mode 100644 index 000000000000..00d53a6adfa3 --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR04.base64.xml.p7m @@ -0,0 +1,196 @@ +MIIkBgYJKoZIhvcNAQcCoIIj9zCCI/MCAQExDTALBglghkgBZQMEAgEwghm3Bgk +qhkiG9w0BBwGgghmoBIIZpDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Il +VURi04Ij8+CjxwOkZhdHR1cmFFbGV0dHJvbmljYSB2ZXJzaW9uZT0iRlBSMTIiI +HhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIiB4 +bWxuczpwPSJodHRwOi8vaXZhc2Vydml6aS5hZ2VuemlhZW50cmF0ZS5nb3YuaXQ +vZG9jcy94c2QvZmF0dHVyZS92MS4yIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudz +Mub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb +249Imh0dHA6Ly9pdmFzZXJ2aXppLmFnZW56aWFlbnRyYXRlLmdvdi5pdC9kb2Nz +L3hzZC9mYXR0dXJlL3YxLjIgaHR0cDovL3d3dy5mYXR0dXJhcGEuZ292Lml0L2V +4cG9ydC9mYXR0dXJhemlvbmUvc2RpL2ZhdHR1cmFwYS92MS4yL1NjaGVtYV9kZW +xfZmlsZV94bWxfRmF0dHVyYVBBX3ZlcnNpb25lXzEuMi54c2QiPgogIDxGYXR0d +XJhRWxldHRyb25pY2FIZWFkZXI+CiAgICA8RGF0aVRyYXNtaXNzaW9uZT4KICAg +ICAgPElkVHJhc21pdHRlbnRlPgogICAgICAgIDxJZFBhZXNlPklUPC9JZFBhZXN +lPgogICAgICAgIDxJZENvZGljZT4wNTk3OTM2MTIxODwvSWRDb2RpY2U+CiAgIC +AgIDwvSWRUcmFzbWl0dGVudGU+CiAgICAgIDxQcm9ncmVzc2l2b0ludmlvPjAwM +DAxPC9Qcm9ncmVzc2l2b0ludmlvPgogICAgICA8Rm9ybWF0b1RyYXNtaXNzaW9u +ZT5GUFIxMjwvRm9ybWF0b1RyYXNtaXNzaW9uZT4KICAgICAgPENvZGljZURlc3R +pbmF0YXJpbz4wMDAwMDAwPC9Db2RpY2VEZXN0aW5hdGFyaW8+CiAgICAgIDxDb2 +50YXR0aVRyYXNtaXR0ZW50ZS8+CiAgICA8L0RhdGlUcmFzbWlzc2lvbmU+CiAgI +CA8Q2VkZW50ZVByZXN0YXRvcmU+CiAgICAgIDxEYXRpQW5hZ3JhZmljaT4KICAg +ICAgICA8SWRGaXNjYWxlSVZBPgogICAgICAgICAgPElkUGFlc2U+SVQ8L0lkUGF +lc2U+CiAgICAgICAgICA8SWRDb2RpY2U+MDI3ODA3OTAxMDc8L0lkQ29kaWNlPg +ogICAgICAgIDwvSWRGaXNjYWxlSVZBPgogICAgICAgIDxBbmFncmFmaWNhPgogI +CAgICAgICAgPERlbm9taW5hemlvbmU+U09DSUVUQScgQUxQSEEgU1JMPC9EZW5v +bWluYXppb25lPgogICAgICAgIDwvQW5hZ3JhZmljYT4KICAgICAgICA8UmVnaW1 +lRmlzY2FsZT5SRjAxPC9SZWdpbWVGaXNjYWxlPgogICAgICA8L0RhdGlBbmFncm +FmaWNpPgogICAgICA8U2VkZT4KICAgICAgICA8SW5kaXJpenpvPlZJQUxFIFJPT +UEgNTQzPC9JbmRpcml6em8+CiAgICAgICAgPENBUD4wNzEwMDwvQ0FQPgogICAg +ICAgIDxDb211bmU+U0FTU0FSSTwvQ29tdW5lPgogICAgICAgIDxQcm92aW5jaWE ++U1M8L1Byb3ZpbmNpYT4KICAgICAgICA8TmF6aW9uZT5JVDwvTmF6aW9uZT4KIC +AgICAgPC9TZWRlPgogICAgPC9DZWRlbnRlUHJlc3RhdG9yZT4KICAgIDxDZXNza +W9uYXJpb0NvbW1pdHRlbnRlPgogICAgICA8RGF0aUFuYWdyYWZpY2k+CiAgICAg +ICAgPENvZGljZUZpc2NhbGU+MDM1MzM1OTAxNzQ8L0NvZGljZUZpc2NhbGU+CiA +gICAgICAgPEFuYWdyYWZpY2E+CiAgICAgICAgICA8RGVub21pbmF6aW9uZT5CRV +RBIEdBTU1BPC9EZW5vbWluYXppb25lPgogICAgICAgIDwvQW5hZ3JhZmljYT4KI +CAgICAgPC9EYXRpQW5hZ3JhZmljaT4KICAgICAgPFNlZGU+CiAgICAgICAgPElu +ZGlyaXp6bz5WSUEgVE9SSU5PIDM4LUI8L0luZGlyaXp6bz4KICAgICAgICA8Q0F +QPjAwMTQ1PC9DQVA+CiAgICAgICAgPENvbXVuZT5ST01BPC9Db211bmU+CiAgIC +AgICAgPFByb3ZpbmNpYT5STTwvUHJvdmluY2lhPgogICAgICAgIDxOYXppb25lP +klUPC9OYXppb25lPgogICAgICA8L1NlZGU+CiAgICA8L0Nlc3Npb25hcmlvQ29t +bWl0dGVudGU+CiAgPC9GYXR0dXJhRWxldHRyb25pY2FIZWFkZXI+CiAgPEZhdHR +1cmFFbGV0dHJvbmljYUJvZHk+CiAgICA8RGF0aUdlbmVyYWxpPgogICAgICA8RG +F0aUdlbmVyYWxpRG9jdW1lbnRvPgogICAgICAgIDxUaXBvRG9jdW1lbnRvPlREM +DE8L1RpcG9Eb2N1bWVudG8+CiAgICAgICAgPERpdmlzYT5FVVI8L0RpdmlzYT4K +ICAgICAgICA8RGF0YT4yMDE0LTEyLTE4PC9EYXRhPgogICAgICAgIDxOdW1lcm8 ++MTIzPC9OdW1lcm8+CiAgICAgICAgPENhdXNhbGU+TEEgRkFUVFVSQSBGQSBSSU +ZFUklNRU5UTyBBRCBVTkEgT1BFUkFaSU9ORSBBQUFBIEJCQkJCQkJCQkJCQkJCQ +kJCQiBDQ0MgREREREREREREREREREREIEUgRkZGRkZGRkZGRkZGRkZGRkZGRkYg +R0dHR0dHR0dHRyBISEhISEhIIElJIExMTExMTExMTExMTExMTExMIE1NTSBOTk5 +OTiBPTyBQUFBQUFBQUFBQUCBRUVFRIFJSUlIgU1NTU1NTU1NTU1NTU1M8L0NhdX +NhbGU+CiAgICAgICAgPENhdXNhbGU+U0VHVUUgREVTQ1JJWklPTkUgQ0FVU0FMR +SBORUwgQ0FTTyBJTiBDVUkgTk9OIFNJQU5PIFNUQVRJIFNVRkZJQ0lFTlRJIDIw +MCBDQVJBVFRFUkkgQUFBQUFBQUFBQUEgQkJCQkJCQkJCQkJCQkJCQkI8L0NhdXN +hbGU+CiAgICAgIDwvRGF0aUdlbmVyYWxpRG9jdW1lbnRvPgogICAgICA8RGF0aU +9yZGluZUFjcXVpc3RvPgogICAgICAgIDxSaWZlcmltZW50b051bWVyb0xpbmVhP +jE8L1JpZmVyaW1lbnRvTnVtZXJvTGluZWE+CiAgICAgICAgPElkRG9jdW1lbnRv +PjY2Njg1PC9JZERvY3VtZW50bz4KICAgICAgICA8TnVtSXRlbT4xPC9OdW1JdGV +tPgogICAgICA8L0RhdGlPcmRpbmVBY3F1aXN0bz4KICAgICAgPERhdGlUcmFzcG +9ydG8+CiAgICAgICAgPERhdGlBbmFncmFmaWNpVmV0dG9yZT4JCQkJCiAgICAgI +CAgICA8SWRGaXNjYWxlSVZBPgogICAgICAgICAgICA8SWRQYWVzZT5JVDwvSWRQ +YWVzZT4KICAgICAgICAgICAgPElkQ29kaWNlPjA0NTA3OTkwMTUwPC9JZENvZGl +jZT4KICAgICAgICAgIDwvSWRGaXNjYWxlSVZBPgogICAgICAgICAgPEFuYWdyYW +ZpY2E+CiAgICAgICAgICAgIDxEZW5vbWluYXppb25lPlRyYXNwb3J0byBzcGE8L +0Rlbm9taW5hemlvbmU+CiAgICAgICAgICA8L0FuYWdyYWZpY2E+CiAgICAgICAg +PC9EYXRpQW5hZ3JhZmljaVZldHRvcmU+CiAgICAgICAgPERhdGFPcmFDb25zZWd +uYT4yMDEyLTEwLTIyVDE2OjQ2OjEyLjAwMCswMjowMDwvRGF0YU9yYUNvbnNlZ2 +5hPgogICAgICA8L0RhdGlUcmFzcG9ydG8+CiAgICA8L0RhdGlHZW5lcmFsaT4KI +CAgIDxEYXRpQmVuaVNlcnZpemk+CiAgICAgIDxEZXR0YWdsaW9MaW5lZT4KICAg +ICAgICA8TnVtZXJvTGluZWE+MTwvTnVtZXJvTGluZWE+CiAgICAgICAgPENvZGl +jZUFydGljb2xvPgogICAgICAgICAgPENvZGljZVRpcG8+SU5UPC9Db2RpY2VUaX +BvPgogICAgICAgICAgPENvZGljZVZhbG9yZT5BUlQxMjM8L0NvZGljZVZhbG9yZ +T4KICAgICAgICA8L0NvZGljZUFydGljb2xvPgogICAgICAgIDxEZXNjcml6aW9u +ZT5MQSBERVNDUklaSU9ORSBERUxMQSBGT1JOSVRVUkEgUFVPJyBTVVBFUkFSRSB +JIENFTlRPIENBUkFUVEVSSSBDSEUgUkFQUFJFU0VOVEFWQU5PIElMIFBSRUNFRE +VOVEUgTElNSVRFIERJTUVOU0lPTkFMRS4gVEFMRSBMSU1JVEUgTkVMTEEgTlVPV +kEgVkVSU0lPTkUgRScgU1RBVE8gUE9SVEFUTyBBIE1JTExFIENBUkFUVEVSSTwv +RGVzY3JpemlvbmU+CiAgICAgICAgPFF1YW50aXRhPjUuMDA8L1F1YW50aXRhPgo +gICAgICAgIDxQcmV6em9Vbml0YXJpbz4xLjAwPC9QcmV6em9Vbml0YXJpbz4KIC +AgICAgICA8UHJlenpvVG90YWxlPjUuMDA8L1ByZXp6b1RvdGFsZT4KICAgICAgI +CA8QWxpcXVvdGFJVkE+MjIuMDA8L0FsaXF1b3RhSVZBPgogICAgICA8L0RldHRh +Z2xpb0xpbmVlPgogICAgICA8RGV0dGFnbGlvTGluZWU+CiAgICAgICAgPE51bWV +yb0xpbmVhPjI8L051bWVyb0xpbmVhPgogICAgICAgIDxEZXNjcml6aW9uZT5GT1 +JOSVRVUkUgVkFSSUUgUEVSIFVGRklDSU88L0Rlc2NyaXppb25lPgogICAgICAgI +DxRdWFudGl0YT4xMC4wMDwvUXVhbnRpdGE+CiAgICAgICAgPFByZXp6b1VuaXRh +cmlvPjIuMDA8L1ByZXp6b1VuaXRhcmlvPgogICAgICAgIDxQcmV6em9Ub3RhbGU ++MjAuMDA8L1ByZXp6b1RvdGFsZT4KICAgICAgICA8QWxpcXVvdGFJVkE+MjIuMD +A8L0FsaXF1b3RhSVZBPgogICAgICA8L0RldHRhZ2xpb0xpbmVlPgogICAgICA8R +GF0aVJpZXBpbG9nbz4KICAgICAgICA8QWxpcXVvdGFJVkE+MjIuMDA8L0FsaXF1 +b3RhSVZBPgogICAgICAgIDxJbXBvbmliaWxlSW1wb3J0bz4yNS4wMDwvSW1wb25 +pYmlsZUltcG9ydG8+CiAgICAgICAgPEltcG9zdGE+NS41MDwvSW1wb3N0YT4KIC +AgICAgICA8RXNpZ2liaWxpdGFJVkE+STwvRXNpZ2liaWxpdGFJVkE+CiAgICAgI +DwvRGF0aVJpZXBpbG9nbz4KICAgIDwvRGF0aUJlbmlTZXJ2aXppPgogICAgPERh +dGlQYWdhbWVudG8+CiAgICAgIDxDb25kaXppb25pUGFnYW1lbnRvPlRQMDE8L0N +vbmRpemlvbmlQYWdhbWVudG8+CiAgICAgIDxEZXR0YWdsaW9QYWdhbWVudG8+Ci +AgICAgICAgPE1vZGFsaXRhUGFnYW1lbnRvPk1QMDE8L01vZGFsaXRhUGFnYW1lb +nRvPgogICAgICAgIDxEYXRhU2NhZGVuemFQYWdhbWVudG8+MjAxNS0wMS0zMDwv +RGF0YVNjYWRlbnphUGFnYW1lbnRvPgogICAgICAgIDxJbXBvcnRvUGFnYW1lbnR +vPjMyLjUwPC9JbXBvcnRvUGFnYW1lbnRvPgogICAgICA8L0RldHRhZ2xpb1BhZ2 +FtZW50bz4KICAgIDwvRGF0aVBhZ2FtZW50bz4KICA8L0ZhdHR1cmFFbGV0dHJvb +mljYUJvZHk+CiAgPEZhdHR1cmFFbGV0dHJvbmljYUJvZHk+CiAgICA8RGF0aUdl +bmVyYWxpPgogICAgICA8RGF0aUdlbmVyYWxpRG9jdW1lbnRvPgogICAgICAgIDx +UaXBvRG9jdW1lbnRvPlREMDE8L1RpcG9Eb2N1bWVudG8+CiAgICAgICAgPERpdm +lzYT5FVVI8L0RpdmlzYT4KICAgICAgICA8RGF0YT4yMDE0LTEyLTIwPC9EYXRhP +gogICAgICAgIDxOdW1lcm8+NDU2PC9OdW1lcm8+CiAgICAgICAgPENhdXNhbGU+ +TEEgRkFUVFVSQSBGQSBSSUZFUklNRU5UTyBBRCBVTkEgT1BFUkFaSU9ORSBBQUF +BIEJCQkJCQkJCQkJCQkJCQkJCQiBDQ0MgREREREREREREREREREREIEUgRkZGRk +ZGRkZGRkZGRkZGRkZGRkYgR0dHR0dHR0dHRyBISEhISEhIIElJIExMTExMTExMT +ExMTExMTExMIE1NTSBOTk5OTiBPTyBQUFBQUFBQUFBQUCBRUVFRIFJSUlIgU1NT +U1NTU1NTU1NTU1M8L0NhdXNhbGU+CiAgICAgICAgPENhdXNhbGU+U0VHVUUgREV +TQ1JJWklPTkUgQ0FVU0FMRSBORUwgQ0FTTyBJTiBDVUkgTk9OIFNJQU5PIFNUQV +RJIFNVRkZJQ0lFTlRJIDIwMCBDQVJBVFRFUkkgQUFBQUFBQUFBQUEgQkJCQkJCQ +kJCQkJCQkJCQkI8L0NhdXNhbGU+CiAgICAgIDwvRGF0aUdlbmVyYWxpRG9jdW1l +bnRvPgogICAgICA8RGF0aU9yZGluZUFjcXVpc3RvPgogICAgICAgIDxSaWZlcml +tZW50b051bWVyb0xpbmVhPjE8L1JpZmVyaW1lbnRvTnVtZXJvTGluZWE+CiAgIC +AgICAgPElkRG9jdW1lbnRvPjY2Njg1PC9JZERvY3VtZW50bz4KICAgICAgICA8T +nVtSXRlbT4xPC9OdW1JdGVtPgogICAgICA8L0RhdGlPcmRpbmVBY3F1aXN0bz4K +ICAgIDwvRGF0aUdlbmVyYWxpPgogICAgPERhdGlCZW5pU2Vydml6aT4KICAgICA +gPERldHRhZ2xpb0xpbmVlPgogICAgICAgIDxOdW1lcm9MaW5lYT4xPC9OdW1lcm +9MaW5lYT4KICAgICAgICA8RGVzY3JpemlvbmU+UFJFU1RBWklPTkUgREVMIFNFR +1VFTlRFIFNFUlZJWklPIFBST0ZFU1NJT05BTEU6IExBIERFU0NSSVpJT05FIERF +TExBIFBSRVNUQVpJT05FIFBVTycgU1VQRVJBUkUgSSBDRU5UTyBDQVJBVFRFUkk +gQ0hFIFJBUFBSRVNFTlRBVkFOTyBJTCBQUkVDRURFTlRFIExJTUlURSBESU1FTl +NJT05BTEUuIFRBTEUgTElNSVRFIE5FTExBIE5VT1ZBIFZFUlNJT05FIEUnIFNUQ +VRPIFBPUlRBVE8gQSBNSUxMRSBDQVJBVFRFUkk8L0Rlc2NyaXppb25lPgogICAg +ICAgIDxQcmV6em9Vbml0YXJpbz4yMDAwLjAwPC9QcmV6em9Vbml0YXJpbz4KICA +gICAgICA8UHJlenpvVG90YWxlPjIwMDAuMDA8L1ByZXp6b1RvdGFsZT4KICAgIC +AgICA8QWxpcXVvdGFJVkE+MjIuMDA8L0FsaXF1b3RhSVZBPgogICAgICA8L0Rld +HRhZ2xpb0xpbmVlPgogICAgICA8RGF0aVJpZXBpbG9nbz4KICAgICAgICA8QWxp +cXVvdGFJVkE+MjIuMDA8L0FsaXF1b3RhSVZBPgogICAgICAgIDxJbXBvbmliaWx +lSW1wb3J0bz4yMDAwLjAwPC9JbXBvbmliaWxlSW1wb3J0bz4KICAgICAgICA8SW +1wb3N0YT40NDAuMDA8L0ltcG9zdGE+CiAgICAgICAgPEVzaWdpYmlsaXRhSVZBP +kk8L0VzaWdpYmlsaXRhSVZBPgogICAgICA8L0RhdGlSaWVwaWxvZ28+CiAgICA8 +L0RhdGlCZW5pU2Vydml6aT4KICAgIDxEYXRpUGFnYW1lbnRvPgogICAgICA8Q29 +uZGl6aW9uaVBhZ2FtZW50bz5UUDAxPC9Db25kaXppb25pUGFnYW1lbnRvPgogIC +AgICA8RGV0dGFnbGlvUGFnYW1lbnRvPgogICAgICAgIDxNb2RhbGl0YVBhZ2FtZ +W50bz5NUDE5PC9Nb2RhbGl0YVBhZ2FtZW50bz4KICAgICAgICA8RGF0YVNjYWRl +bnphUGFnYW1lbnRvPjIwMTUtMDEtMjg8L0RhdGFTY2FkZW56YVBhZ2FtZW50bz4 +KICAgICAgICA8SW1wb3J0b1BhZ2FtZW50bz4yNDQwLjAwPC9JbXBvcnRvUGFnYW +1lbnRvPgogICAgICA8L0RldHRhZ2xpb1BhZ2FtZW50bz4KICAgIDwvRGF0aVBhZ +2FtZW50bz4KICA8L0ZhdHR1cmFFbGV0dHJvbmljYUJvZHk+CjwvcDpGYXR0dXJh +RWxldHRyb25pY2E+CqCCByIwggceMIIGBqADAgECAgQAmWk4MA0GCSqGSIb3DQE +BCwUAMIGFMQswCQYDVQQGEwJJVDEVMBMGA1UECgwMSU5GT0NFUlQgU1BBMSIwIA +YDVQQLDBlDZXJ0aWZpY2F0b3JlIEFjY3JlZGl0YXRvMRQwEgYDVQQFEwswNzk0N +TIxMTAwNjElMCMGA1UEAwwcSW5mb0NlcnQgRmlybWEgUXVhbGlmaWNhdGEgMjAe +Fw0xODEwMjUxMDAwNDlaFw0yMTEwMjUwMDAwMDBaMIGBMQswCQYDVQQGEwJJVDE +PMA0GA1UEBAwGQ09SQVRPMR8wHQYDVQQFExZUSU5JVC1DUlRTUkc3NE0xOEE0NT +lHMRYwFAYDVQQDDA1DT1JBVE8gU0VSR0lPMRcwFQYDVQQuEw4yMDE4NzExNjUwN +Tg4MjEPMA0GA1UEKgwGU0VSR0lPMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAzhvbAYi42YNPBbUIqgALQnYqy//aj3QrGzRDlw/WqVIkTPVjkBo2YGp +4JrUTR+Z2NoQqyTOXlqKs7G+weZAA7bMOEgbZJMJyTdc2MX/XPnycn6XOijqlIv +8yJ9QZW+3gmBj6m5FDHtYqzJkPxZL72Ls+9dEbrGtUqZsYwCu9POc30MSOKAWOh +w35g5DbyANuAyypgHlguxC5dTSJ92cG2gjL2Z+YctiULZWphav9NkiWTsnuL0aX +Oo8BBc3X0T+1gUNzvYUsroqGL1nNsmVMPif79kKMIJwhANbnMTSp1sv8pTlGCNn +BeYDr0hHE/PL2CfdwmX5OAj43A5CZZHjUQwIDAQABo4IDljCCA5IwCQYDVR0TBA +IwADAlBgNVHRIEHjAcgRpmaXJtYS5kaWdpdGFsZUBpbmZvY2VydC5pdDCB5wYDV +R0fBIHfMIHcMDKgMKAuhixodHRwOi8vY3JsLmluZm9jZXJ0Lml0L2NybHMvZmly +bWEyL0NSTDIzLmNybDCBpaCBoqCBn4aBnGxkYXA6Ly9sZGFwLmluZm9jZXJ0Lml +0L2NuJTNESW5mb0NlcnQlMjBGaXJtYSUyMFF1YWxpZmljYXRhJTIwMiUyMENSTD +IzLG91JTNEQ2VydGlmaWNhdG9yZSUyMEFjY3JlZGl0YXRvLG8lM0RJTkZPQ0VSV +CUyMFNQQSxjJTNESVQ/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDBuBggrBgEF +BQcBAQRiMGAwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLnNjLmluZm9jZXJ0Lml +0LzA1BggrBgEFBQcwAoYpaHR0cDovL2NlcnQuaW5mb2NlcnQuaXQvY2EyL2Zpcm +1hMi9DQS5jcnQwbwYDVR0gBGgwZjBPBgYrTCQBASAwRTBDBggrBgEFBQcCARY3a +HR0cDovL3d3dy5maXJtYS5pbmZvY2VydC5pdC9kb2N1bWVudGF6aW9uZS9tYW51 +YWxpLnBocDAIBgYrTBgBAQIwCQYHBACL7EABAjCBhAYIKwYBBQUHAQMEeDB2MAg +GBgQAjkYBATAIBgYEAI5GAQQwCwYGBACORgEDAgEUMBMGBgQAjkYBBjAJBgcEAI +5GAQYBMD4GBgQAjkYBBTA0MDIWLGh0dHBzOi8vd3d3LmZpcm1hLmluZm9jZXJ0L +ml0L3BkZi9QS0ktRFMucGRmEwJFTjAOBgNVHQ8BAf8EBAMCBkAwKAYDVR0JBCEw +HzAdBggrBgEFBQcJATERGA8xOTc0MDgxODAwMDAwMFowgbIGA1UdIwSBqjCBp4A +Uk90h/APQFQpyraPM1ZoJnTiLnemhgYukgYgwgYUxCzAJBgNVBAYTAklUMRUwEw +YDVQQKDAxJTkZPQ0VSVCBTUEExIjAgBgNVBAsMGUNlcnRpZmljYXRvcmUgQWNjc +mVkaXRhdG8xFDASBgNVBAUTCzA3OTQ1MjExMDA2MSUwIwYDVQQDDBxJbmZvQ2Vy +dCBGaXJtYSBRdWFsaWZpY2F0YSAyggEBMB0GA1UdDgQWBBQC+5alhufm+HCHTCg +81oGQIoDmvjANBgkqhkiG9w0BAQsFAAOCAQEAAIHw1SdESPUrScc75vO6lzDTKo +TWWduV9FqUN7gI0TVMlFmjoHccCs9J/RHM/wyRaQgaUULGo80aB5C9Ps5ZceVU+ +LbDRALN4UHg56prc04fVXzdltdIbe94ipQQfgqnWcO+z3fYtL3q/aBE54tRGPiY +BpbKIl9I7VwvMUNkJ7LNYZcM4wm9Ejj+yQUqzfe+MskIaM8PnvQJLcXGuNmWStX +ExKjWgeggIDy2+7r1lkVgACOv4KXYXPXvzr+TbjrLtpXSAelYvrCIdYTgAPPQzw +G9KJjaZgAWzJZQJ1STzCnnylg1gMSVbUNtnAsobwJMnX602ZOdw65HsV8f2lHHK +DGCAvwwggL4AgEBMIGOMIGFMQswCQYDVQQGEwJJVDEVMBMGA1UECgwMSU5GT0NF +UlQgU1BBMSIwIAYDVQQLDBlDZXJ0aWZpY2F0b3JlIEFjY3JlZGl0YXRvMRQwEgY +DVQQFEwswNzk0NTIxMTAwNjElMCMGA1UEAwwcSW5mb0NlcnQgRmlybWEgUXVhbG +lmaWNhdGEgMgIEAJlpODANBglghkgBZQMEAgEFAKCCAT4wGAYJKoZIhvcNAQkDM +QsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMTgxMjIxMTU1ODEzWjAvBgkq +hkiG9w0BCQQxIgQgNOm1eVRN+DqSfoOxwlk6r+TguNLak0hU+Lf4SaAMwxUwgdI +GCyqGSIb3DQEJEAIvMYHCMIG/MIG8MIG5BCCSL/SmwV+hCfetFWZgJp3KfvusfJ +zeD4S3B4nKkumawjCBlDCBi6SBiDCBhTELMAkGA1UEBhMCSVQxFTATBgNVBAoMD +ElORk9DRVJUIFNQQTEiMCAGA1UECwwZQ2VydGlmaWNhdG9yZSBBY2NyZWRpdGF0 +bzEUMBIGA1UEBRMLMDc5NDUyMTEwMDYxJTAjBgNVBAMMHEluZm9DZXJ0IEZpcm1 +hIFF1YWxpZmljYXRhIDICBACZaTgwDQYJKoZIhvcNAQELBQAEggEABrraEzS4n6 +SW2S9C5e0lEnqJehEEz4riodSsf79ZpNLsjZ88NMkQHR/Gy+q306NFA0KopfSKg +RmnbMXNKj1hSmLKaI7O6R+vfAwTs15/3VBaK86zCvzr1ig2zOSk2wlo2o64EiId +qDtOi9C7kTKIp4mC74QSLQvQf4dxA6mxzrw3jM9Su3nodwNq637rRcqverBPMK0 +ViEWIZyjzp/eClugD+ngGSmcEEImOE2aAXwPZTH8lhgPECTE10q2hc4567ZBdRj +EevLisiqLSY6NuE137XOeradGUB44iV/YCFO77HakttpcnZ8SkEausjuWIH3/y/ +BUi2EVDR4jtbdDTkA== \ No newline at end of file diff --git a/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR04.xml b/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR04.xml new file mode 100644 index 000000000000..21046810c9bd --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR04.xml @@ -0,0 +1,107 @@ + + + + + + IT + 05979361218 + + 00001 + FPR12 + 0000000 + + + + + + IT + 02780790107 + + + SOCIETA' ALPHA SRL + + RF01 + + + VIALE ROMA 543 + 07100 + SASSARI + SS + IT + + + + + 03533590174 + + BETA GAMMA + + + + VIA TORINO 38-B + 00145 + ROMA + RM + IT + + + + + + + TD01 + EUR + 2019-02-15 + 123 + LA FATTURA FA RIFERIMENTO AD UNA OPERAZIONE AAAA BBBBBBBBBBBBBBBBBB CCC DDDDDDDDDDDDDDD E FFFFFFFFFFFFFFFFFFFF GGGGGGGGGG HHHHHHH II LLLLLLLLLLLLLLLLL MMM NNNNN OO PPPPPPPPPPP QQQQ RRRR SSSSSSSSSSSSSS + SEGUE DESCRIZIONE CAUSALE NEL CASO IN CUI NON SIANO STATI SUFFICIENTI 200 CARATTERI AAAAAAAAAAA BBBBBBBBBBBBBBBBB + + + + + 1 + + INT + ART123 + + LA DESCRIZIONE DELLA FORNITURA PUO' SUPERARE I CENTO CARATTERI CHE RAPPRESENTAVANO IL PRECEDENTE LIMITE DIMENSIONALE. TALE LIMITE NELLA NUOVA VERSIONE E' STATO PORTATO A MILLE CARATTERI + 5.00 + 1.00 + 5.00 + 22.00 + + + 2 + FORNITURE VARIE PER UFFICIO + 10.00 + 2.00 + 20.00 + 22.00 + + + 3 + + DATA + 2018-11-27 - 2018-11-30 + + Canone servizio base + 1.00 + Nr + 0.00 + + SC + 0.00 + 0.00 + + 0.00 + 22.00 + + + 22.00 + 25.00 + 5.50 + I + + + + diff --git a/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR05.xml b/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR05.xml new file mode 100644 index 000000000000..9c0afe0487eb --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR05.xml @@ -0,0 +1,89 @@ + + + + + + IT + 05979361218 + + FPR05 + FPR12 + 0000000 + + + + + + IT + 02780790107 + + + SOCIETA' ALPHA SRL + + RF01 + + + VIALE ROMA 543 + 07100 + SASSARI + SS + IT + + + + + 03533590174 + + BETA GAMMA + + + + VIA TORINO 38-B + 00145 + ROMA + RM + IT + + + + + + + TD01 + EUR + 2014-12-18 + 14311 + LA FATTURA FA RIFERIMENTO AD UNA OPERAZIONE AAAA BBBBBBBBBBBBBBBBBB CCC DDDDDDDDDDDDDDD E FFFFFFFFFFFFFFFFFFFF GGGGGGGGGG HHHHHHH II LLLLLLLLLLLLLLLLL MMM NNNNN OO PPPPPPPPPPP QQQQ RRRR SSSSSSSSSSSSSS + SEGUE DESCRIZIONE CAUSALE NEL CASO IN CUI NON SIANO STATI SUFFICIENTI 200 CARATTERI AAAAAAAAAAA BBBBBBBBBBBBBBBBB + + + + + 1 + LA DESCRIZIONE + 1.00 + 10.00 + 10.00 + 22.00 + + + 2 + FORNITURE VARIE PER UFFICIO + 1.00 + 20.00 + + SC + 100.00 + + 0.00 + 22.00 + + + 22.00 + 10.00 + 2.20 + I + + + + diff --git a/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR06.xml b/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR06.xml new file mode 100644 index 000000000000..01f94d37e168 --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR06.xml @@ -0,0 +1,82 @@ + + + + + + IT + 05979361218 + + 00001 + FPR12 + 0000000 + + + + + + IT + 02780790107 + + + SOCIETA' ALPHA SRL + + RF01 + + + VIALE ROMA 543 + 07100 + SASSARI + SS + IT + + + + + 03533590174 + + BETA GAMMA + + + + VIA TORINO 38-B + 00145 + ROMA + RM + IT + + + + + + + TD04 + EUR + 2020-01-09 + 123 + + + + + 1 + FORNITURE VARIE PER UFFICIO + 10.00 + 2.00 + 20.00 + 22.00 + + + 2 + SCONTO + 5.00 + -1.00 + -5.00 + 22.00 + + + 22.00 + 15.00 + 3.30 + + + + diff --git a/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR07.xml b/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR07.xml new file mode 100644 index 000000000000..de5a3da366fd --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR07.xml @@ -0,0 +1,74 @@ + + + + + + IT + 05979361218 + + 00001 + FPR12 + 0000000 + + + + + + IT + 02780790107 + + + SOCIETA' ALPHA SRL + + RF01 + + + VIALE ROMA 543 + 07100 + SASSARI + SS + IT + + + + + 03533590174 + + BETA GAMMA + + + + VIA TORINO 38-B + 00145 + ROMA + RM + IT + + + + + + + TD04 + EUR + 2020-01-09 + 14331 + + + + + 1 + FORNITURE VARIE PER UFFICIO + 10.00 + -2.00 + -20.00 + 22.00 + + + 22.00 + -20.00 + -4.40 + + + + diff --git a/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR08.xml b/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR08.xml new file mode 100644 index 000000000000..a59656a91ff8 --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR08.xml @@ -0,0 +1,89 @@ + + + + + + IT + 05979361218 + + FPR08 + FPR12 + 0000000 + + + + + + IT + 02780790107 + + + SOCIETA' ALPHA SRL + + RF01 + + + VIALE ROMA 543 + 07100 + SASSARI + SS + IT + + + + + 03533590174 + + BETA GAMMA + + + + VIA TORINO 38-B + 00145 + ROMA + RM + IT + + + + + + + TD06 + EUR + 2020-01-09 + 124 + + RT01 + 360.00 + 20.00 + A + + + TC02 + 4.00 + 72.00 + 1800.00 + 22.00 + + 2283.84 + PARCELLA + + + + + 1 + ASSISTENZA TRIBUTARIA + 1800.00 + 1800.00 + 22.00 + + + 22.00 + 1872.00 + 411.84 + I + + + + diff --git a/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR09.xml b/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR09.xml new file mode 100644 index 000000000000..7d7a1441bcaa --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR09.xml @@ -0,0 +1,83 @@ + + + + + + IT + 05979361218 + + FPR09 + FPR12 + 0000000 + + + + + + IT + 02780790107 + + + SOCIETA' ALPHA SRL + + RF01 + + + VIALE ROMA 543 + 07100 + SASSARI + SS + IT + + + + + 03533590174 + + BETA GAMMA + + + + VIA TORINO 38-B + 00145 + ROMA + RM + IT + + + + + + + TD06 + EUR + 2020-05-15 + 125 + + RT02 + 30.16 + 23.00 + A + + 800.00 + + + + + 1 + Compensi provvigionali per procurata vendita + 1.000 + 655.74000 + 655.74 + 22.00 + SI + + + 22.00 + 655.74 + 144.26 + I + + + + diff --git a/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR10.xml b/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR10.xml new file mode 100644 index 000000000000..52c9e8573660 --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR10.xml @@ -0,0 +1,99 @@ + + + + + + IT + 05979361218 + + FPR10 + FPR12 + 0000000 + + + + + + IT + 02780790107 + + + SOCIETA' ALPHA SRL + + RF01 + + + VIALE ROMA 543 + 07100 + SASSARI + SS + IT + + + + + 03533590174 + + BETA GAMMA + + + + VIA TORINO 38-B + 00145 + ROMA + RM + IT + + + + + + + TD01 + EUR + 2020-06-16 + 126 + LA FATTURA FA RIFERIMENTO AD UNA OPERAZIONE AAAA BBBBBBBBBBBBBBBBBB CCC DDDDDDDDDDDDDDD E FFFFFFFFFFFFFFFFFFFF GGGGGGGGGG HHHHHHH II LLLLLLLLLLLLLLLLL MMM NNNNN OO PPPPPPPPPPP QQQQ RRRR SSSSSSSSSSSSSS + SEGUE DESCRIZIONE CAUSALE NEL CASO IN CUI NON SIANO STATI SUFFICIENTI 200 CARATTERI AAAAAAAAAAA BBBBBBBBBBBBBBBBB + + + + + 1 + + INT + ART123 + + LA DESCRIZIONE DELLA FORNITURA PUO' SUPERARE I CENTO CARATTERI CHE RAPPRESENTAVANO IL PRECEDENTE LIMITE DIMENSIONALE. TALE LIMITE NELLA NUOVA VERSIONE E' STATO PORTATO A MILLE CARATTERI + 5.00 + 1.00 + 5.00 + 22.00 + + + 2 + FORNITURE VARIE PER UFFICIO + 10.00 + 2.00 + 20.00 + 22.00 + + + 22.00 + 25.00 + 5.50 + I + + + + TP01 + + MP01 + 2020-06-30 + 32.50 + IT59R0100003228000000000621 + BCITITMM + + + + diff --git a/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR11.xml b/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR11.xml new file mode 100644 index 000000000000..687680a3f95e --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR11.xml @@ -0,0 +1,89 @@ + + + + + + IT + 05979361218 + + FPR11 + FPR12 + 0000000 + + + + + + IT + 02780790107 + + + SOCIETA' ALPHA SRL + + RF01 + + + VIALE ROMA 543 + 07100 + SASSARI + SS + IT + + + + + 03533590174 + + BETA GAMMA + + + + VIA TORINO 38-B + 00145 + ROMA + RM + IT + + + + + + + TD01 + EUR + 2020-01-09 + 14401 + + RT02 + 52.00 + 26.00 + Q + + + RT04 + 40.00 + 4.00 + Q + + 1220.00 + + + + + 1 + Provvigione + 1.000 + 1000.00000 + 1000.00 + 22.00 + SI + + + 22.00 + 1000.00 + 220.00 + I + + + + diff --git a/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR12.xml b/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR12.xml new file mode 100644 index 000000000000..bc36c01df394 --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR12.xml @@ -0,0 +1,89 @@ + + + + + + IT + 05979361218 + + FPR12 + FPR12 + 0000000 + + + + + + IT + 02780790107 + + + SOCIETA' ALPHA SRL + + RF01 + + + VIALE ROMA 543 + 07100 + SASSARI + SS + IT + + + + + 03533590174 + + BETA GAMMA + + + + VIA TORINO 38-B + 00145 + ROMA + RM + IT + + + + + + + TD01 + EUR + 2020-01-09 + 14410 + + RT02 + 54.00 + 27.00 + Q + + + RT04 + 40.00 + 4.00 + Q + + 1220.00 + + + + + 1 + Provvigione + 1.000 + 1000.00000 + 1000.00 + 22.00 + SI + + + 22.00 + 1000.00 + 220.00 + I + + + + diff --git a/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR13.xml b/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR13.xml new file mode 100644 index 000000000000..7ce05fa9997f --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR13.xml @@ -0,0 +1,113 @@ + + + + + + IT + 02780790107 + + FPR13 + FPR12 + 0000000 + + 06543534343 + info@yourcompany.example.com + + test@pec.it + + + + + IT + 02780790107 + + + YourCompany + + RF01 + + + Via Milano, 1 + 00100 + Roma + AK + IT + + + 06543534343 + info@yourcompany.example.com + + + + + + IT + 07973780013 + + 07973780013 + + B2B Customer + + + + Via Roma, 1 + 16100 + Genova + AK + IT + + + + + + + TD01 + EUR + 2020-09-30 + FPR 16/20 + + RT01 + 3120.00 + 20.00 + A + + + TC22 + 4.00 + 600.00 + 15000.00 + 22.00 + SI + + 19032.00 + + + + + 1 + Consulenza attività commerciale e gestione progetti svolta nel periodo 08/2019-08/2020 + 1.00 + 15000.00 + 15000.00 + 22.00 + SI + + + 22.00 + 15600.00 + 3432.00 + + + + TP02 + + MP05 + 2020-09-30 + 15912.00 + FINECO BANK + IT37F0301503200000005796587 + UNCRITMMXXX + + + + diff --git a/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR14.xml b/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR14.xml new file mode 100644 index 000000000000..ba9ef4a3a1b8 --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR14.xml @@ -0,0 +1,106 @@ + + + + + + IT + 02780790107 + + FPR14 + FPR12 + 0000000 + + 06543534343 + info@yourcompany.example.com + + test@pec.it + + + + + IT + 02780790107 + + + YourCompany + + RF01 + + + Via Milano, 1 + 00100 + Roma + AK + IT + + + 06543534343 + info@yourcompany.example.com + + + + + + IT + 07973780013 + + 07973780013 + + B2B Customer + + + + Via Roma, 1 + 16100 + Genova + AK + IT + + + + + + + TD01 + EUR + 2020-09-30 + FPR 17/20 + 54313.50 + + + + + 10 + Benzina S.Pb 10PPM + 4000.00000000 + L + 1.35580114 + 5423.20456 + 22.00 + + + 20 + Gasolio Autotrazione 10PPM + 32000.00000000 + L + 1.22175180 + 39096.05760 + 22.00 + + + 22.00 + 44519.26 + 9794.24 + I + + + + TP02 + + MP11 + 2021-04-21 + 54313.50 + + + + diff --git a/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR15.xml b/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR15.xml new file mode 100644 index 000000000000..8042e0e46fb2 --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT01234567890_FPR15.xml @@ -0,0 +1,108 @@ + + + + + + IT + 02780790107 + + FPR14 + FPR12 + 0000000 + + 06543534343 + info@yourcompany.example.com + + test@pec.it + + + + + IT + 02780790107 + + + YourCompany + + RF01 + + + Via Milano, 1 + 00100 + Roma + AK + IT + + + 06543534343 + info@yourcompany.example.com + + + + + + IT + 07973780013 + + 07973780013 + + B2B Customer + + + + Via Roma, 1 + 16100 + Genova + AK + IT + + + + + + + TD01 + EUR + 2020-09-30 + 14481 + 54313.50 + + + + + 10 + Benzina S.Pb 10PPM + 4000.00000000 + L + 1.35580114 + 5423.20456 + 22.00 + + + 20 + Gasolio Autotrazione 10PPM + 32000.00000000 + L + 1.22175180 + 39096.05760 + 22.00 + + + 22.00 + 44519.26 + 9794.24 + I + + + + TP01 + + MP01 + 2021-04-21 + 54313.50 + IT59R0100003228000000000622 + BCITITMM + + + + diff --git a/l10n_it_fatturapa_in/tests/data/IT02780790107_11004.xml b/l10n_it_fatturapa_in/tests/data/IT02780790107_11004.xml new file mode 100644 index 000000000000..382c0b4da1c8 --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT02780790107_11004.xml @@ -0,0 +1,216 @@ + + + + + + + IT + 02780790107 + + 00001 + FPA12 + UFPQ1O + + + + + + IT + 02780790107 + + + SOCIETA' ALPHA SRL + + RF01 + + + VIALE ROMA 543 + 07100 + SASSARI + SS + IT + + + + + + IT + 03339130126 + + 03339130126 + + Rappresentante fiscale + 1234567890123 + + + + + + 80213330584 + + AMMINISTRAZIONE BETA + + + + VIA TORINO 38-B + 00145 + ROMA + RM + IT + + + + + + IT + 03339130126 + + 03339130126 + + Rappresentante fiscale + 1234567890123 + + + + + + + + TD01 + EUR + 2014-12-18 + 123 + + TC01 + 4.00 + 9.00 + 22.00 + rif. amm + + LA FATTURA FA RIFERIMENTO AD UNA OPERAZIONE AAAA BBBBBBBBBBBBBBBBBB CCC DDDDDDDDDDDDDDD E FFFFFFFFFFFFFFFFFFFF GGGGGGGGGG HHHHHHH II LLLLLLLLLLLLLLLLL MMM NNNNN OO PPPPPPPPPPP QQQQ + SEGUE DESCRIZIONE CAUSALE NEL CASO IN CUI NON SIANO STATI SUFFICIENTI 200 CARATTERI AAAAAAAAAAA BBBBBBBBBBBBBBBBB + SI + + + 1 + 66685 + 1 + 123abc + 456def + + + 1 + 123 + 2012-09-01 + 5 + 123abc + 456def + + + 1 + 123 + 5 + 123abc + 456def + + + 1 + 123 + 5 + 123abc + 456def + + + + + IT + 05714511002 + + + Trasporto spa + + + KGM + DAP + + strada dei test + 150/B + 12042 + Bra + CN + IT + + 2012-10-22T16:46:12.000+02:00 + + + + + 1 + LA DESCRIZIONE DELLA FORNITURA PUO' SUPERARE I CENTO CARATTERI CHE RAPPRESENTAVANO IL PRECEDENTE LIMITE DIMENSIONALE. TALE LIMITE NELLA NUOVA VERSIONE E' STATO PORTATO A MILLE CARATTERI + 5.00 + 1.00 + 5.00 + 22.00 + + + 2 + FORNITURE VARIE PER UFFICIO + 10.00 + 2.00 + 20.00 + 22.00 + + + 22.00 + 34.00 + 7.48 + D + + + + TP01 + + MP05 + 2015-04-30 + 20.00 + Bank Test + IT28V0100003245232200001200 + GEBABEBB + 2.00 + 2015-05-01 + + + MP05 + 2015-05-30 + 9.00 + Bank Test + IT28V0100003245232200001200 + GEBABEBB + 1.00 + 2015-05-31 + + + + TP02 + + MP05 + 2015-06-30 + 1.50 + Bank Test + IT28V0100003245232200001200 + GEBABEBB + 0.15 + 2015-07-01 + + + + test.png + png + descrizione test + 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ly1bJ//xna6PPesN3lx+rf7qsla6+DefwLNTH7xakvz5u6mDELyHHBpgWkgEEAnp8wAge0e2bVESi8UcIsLMSZPeCgYCb8e6YQbAUz0cx1HZbBaM8/cfeeSRkvPPP9999dVX+bZt246LIaq3bNGvueYaedmIEbjv3nufNAOBB5UXkAs/Y1E4GPyaoeupO9ev95maA8Dll1/u0UR0ddDTo7sdmEIINDU1YeCgQdNWr127ctiwYZBSyoMHDx5XH+3evVt77bXXaMmSJVizfv0KJsR17777bo+JIo8XR8XQbLnnovhs04FaYirlSeni7qFtL4wLvJt6HwEhbqkZd9/G3++ZgdN/MtD923easfeHyaNa5e794RT9b985xD5+x31OPnUVqq+4525G5gPvp5tAIOoufa9Syi0NxqBp5v/865opf9iMaoSWHxkals16DK6Fw1ODgYAfm9glbZxznsvlKONlWGp56KGHvvi5z31ONTQ0yA0bNuhHuVhkO3bsMDOZDCZPmeI8VF2Nl3772zc1wxizd+9eWJblKqVIKUX5fF4dOnTINkOhyKm6/hQAVFZWEgCEQiGHiDB9+vSXhRB/725gtmfqAwcOIGia19y/cuUzQ4YMwZAhQ9zm5mYkk0fZR3v36rt378Y555zj7t27F7+85541hqb98NChQ/3OzMAx5LazbiI9dBtz6sevuYgZ9NsDyQ8guGeB7i4hOYFQHohBKpU1BT9n1LYl//C98zB9o/EkBkC/HtL6goXxGE+P4lEWejkE5y6Iy4PvAqsX2F6DGZ4cty6eg/U3g2untOZb/LMBWLE2tOWfALHSQAlKA+FBwzde1VD3uzox5qLOuR785OGVGze+aFnW8EQi4TAvPWy3abRM02TxeBxpy1oXC4fnzCocZVZTU8MCgYA+evRo2rZtm5o4cSIBwOOPP85efPFFPmLECDZixAjFOW9juocfeWSMct0niQiJZLJTtqH2WZtisRgGlJcfkb/i2muv1e+77z5n49atH80lk283NjX1ipn88gCAdP38xXPn/tW/vn79euOUU04BAGlZFsaPH0+PPvooM00To0eP5g888ABfvHhx3m/f6tWrB+UcZ7ehafHW1tZj9tdgAE7/6EfNKePG2fX19T0ebXds2Ud3rgX79znYMXXdk2knN6Yh1ywFetaLXKUoaoZZVAuiCdhpB+1p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 + + + diff --git a/l10n_it_fatturapa_in/tests/data/IT02780790107_11004_xml_doctor.xml b/l10n_it_fatturapa_in/tests/data/IT02780790107_11004_xml_doctor.xml new file mode 100644 index 000000000000..3cd6055b7b27 --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT02780790107_11004_xml_doctor.xml @@ -0,0 +1,208 @@ + + + + + + IT + 02780790107 + + 00001 + FPA12 + UFPQ1O + + + + + + IT + 02780790107 + + + SOCIETA' ALPHA SRL + + RF01 + + + VIALE ROMA 543 + 07100 + SASSARI + SS + IT + + + + + + IT + 03339130126 + + 03339130126 + + Rappresentante fiscale + 1234567890123 + + + + + + 80213330584 + + AMMINISTRAZIONE BETA + + + + VIA TORINO 38-B + 00145 + ROMA + RM + IT + + + + + + IT + 03339130126 + + 03339130126 + + Rappresentante fiscale + 1234567890123 + + + + + + + + TD01 + EUR + 2014-12-18+01:00 + 14221 + + TC01 + 4.00 + 9.00 + 22.00 + rif. amm + + + SI + + + 1 + 66685 + 1 + 123abc + 456def + + + 1 + 123 + 2012-09-01 + 5 + 123abc + 456def + + + 1 + 123 + 5 + 123abc + 456def + + + 1 + 123 + 5 + 123abc + 456def + + + + + IT + 05714511002 + + + Trasporto spa + + + KGM + DAP + + strada dei test + + 12042 + Bra + CN + IT + + 0001-01-01T00:00:00.000+02:00 + + + + + 1 + + 5.00 + 1.00 + 5.00 + 22.00 + + + 2 + FORNITURE VARIE PER UFFICIO + 10.00 + 2.00 + 20.00 + 22.00 + + + 22.00 + 34.00 + 7.48 + D + + + + TP01 + + MP05 + 2015-04-30 + 20.00 + Bank Test + IT28V0100003245232200001200 + GEBABEBB + 2.00 + 2015-05-01 + + + MP05 + 2015-05-30 + 9.00 + Bank Test + IT28V0100003245232200001200 + GEBABEBB + 1.00 + 2015-05-31 + + + + TP02 + + MP05 + 2015-06-30 + 1.50 + Bank Test + IT28V0100003245232200001200 + GEBABEBB + 0.15 + 2015-07-01+02:00 + + + + diff --git a/l10n_it_fatturapa_in/tests/data/IT02780790107_11005.xml b/l10n_it_fatturapa_in/tests/data/IT02780790107_11005.xml new file mode 100644 index 000000000000..8aba9de93e66 --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT02780790107_11005.xml @@ -0,0 +1,217 @@ + + + + + + IT + 02780790107 + + 11005 + FPA12 + UFPQ1O + + + + + + IT + 02780790107 + + + Societa' Alpha SRL + + RF01 + + + VIALE ROMA 543 + 07100 + SASSARI + SS + IT + + + + + + IT + 03339130126 + + 03339130126 + + Rappresentante fiscale + 1234567890123 + + + + + + 80213330584 + + AMMINISTRAZIONE BETA + + + + VIA TORINO 38-B + 00145 + ROMA + RM + IT + + + + + + IT + 03339130126 + + 03339130126 + + Rappresentante fiscale + 1234567890123 + + + + + + + + TD01 + EUR + 2014-12-18 + 124 + + TC01 + 4.00 + 1.00 + 25.00 + 22.00 + rif. amm + + LA FATTURA FA RIFERIMENTO AD UNA OPERAZIONE AAAA BBBBBBBBBBBBBBBBBB CCC DDDDDDDDDDDDDDD E FFFFFFFFFFFFFFFFFFFF GGGGGGGGGG HHHHHHH II LLLLLLLLLLLLLLLLL MMM NNNNN OO PPPPPPPPPPP QQQQ + SEGUE DESCRIZIONE CAUSALE NEL CASO IN CUI NON SIANO STATI SUFFICIENTI 200 CARATTERI AAAAAAAAAAA BBBBBBBBBBBBBBBBB + + + 1 + 66685 + 1 + 123abc + 456def + + + 1 + 123 + 2012-09-01 + 5 + 123abc + 456def + + + 1 + 123 + 5 + 123abc + 456def + + + 1 + 123 + 5 + 123abc + 456def + + + + + IT + 05714511002 + + + Trasporto spa + + + + strada dei test + 150/B + 12042 + Bra + CN + IT + + 2012-10-22T16:46:12.000+02:00 + + + + + 1 + + EAN + 12345 + + LA DESCRIZIONE DELLA FORNITURA PUO' SUPERARE I CENTO CARATTERI CHE RAPPRESENTAVANO IL PRECEDENTE LIMITE DIMENSIONALE. TALE LIMITE NELLA NUOVA VERSIONE E' STATO PORTATO A MILLE CARATTERI + 5.00 + 1.00 + 5.00 + 22.00 + + + 2 + FORNITURE VARIE PER UFFICIO + 10.00 + 2.00 + 20.00 + 22.00 + + + 22.00 + 26.00 + 5.72 + D + + + + TP01 + + MP05 + 2015-04-30 + 20.00 + Bank Test + IT28V0100003245232200001200 + GEBABEBB + 2.00 + 2015-05-01 + + + MP05 + 2015-05-30 + 9.00 + Bank Test + IT28V0100003245232200001200 + GEBABEBB + 1.00 + 2015-05-31 + + + + TP02 + + MP05 + 2015-06-30 + 1.50 + Bank Test + IT28V0100003245232200001200 + GEBABEBB + 0.15 + 2015-07-01 + + + + test.png + png + descrizione test + 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ly1bJ//xna6PPesN3lx+rf7qsla6+DefwLNTH7xakvz5u6mDELyHHBpgWkgEEAnp8wAge0e2bVESi8UcIsLMSZPeCgYCb8e6YQbAUz0cx1HZbBaM8/cfeeSRkvPPP9999dVX+bZt246LIaq3bNGvueYaedmIEbjv3nufNAOBB5UXkAs/Y1E4GPyaoeupO9ev95maA8Dll1/u0UR0ddDTo7sdmEIINDU1YeCgQdNWr127ctiwYZBSyoMHDx5XH+3evVt77bXXaMmSJVizfv0KJsR17777bo+JIo8XR8XQbLnnovhs04FaYirlSeni7qFtL4wLvJt6HwEhbqkZd9/G3++ZgdN/MtD923easfeHyaNa5e794RT9b985xD5+x31OPnUVqq+4525G5gPvp5tAIOoufa9Syi0NxqBp5v/865opf9iMaoSWHxkals16DK6Fw1ODgYAfm9glbZxznsvlKONlWGp56KGHvvi5z31ONTQ0yA0bNuhHuVhkO3bsMDOZDCZPmeI8VF2Nl3772zc1wxizd+9eWJblKqVIKUX5fF4dOnTINkOhyKm6/hQAVFZWEgCEQiGHiDB9+vSXhRB/725gtmfqAwcOIGia19y/cuUzQ4YMwZAhQ9zm5mYkk0fZR3v36rt378Y555zj7t27F7+85541hqb98NChQ/3OzMAx5LazbiI9dBtz6sevuYgZ9NsDyQ8guGeB7i4hOYFQHohBKpU1BT9n1LYl//C98zB9o/EkBkC/HtL6goXxGE+P4lEWejkE5y6Iy4PvAqsX2F6DGZ4cty6eg/U3g2untOZb/LMBWLE2tOWfALHSQAlKA+FBwzde1VD3uzox5qLOuR785OGVGze+aFnW8EQi4TAvPWy3abRM02TxeBxpy1oXC4fnzCocZVZTU8MCgYA+evRo2rZtm5o4cSIBwOOPP85efPFFPmLECDZixAjFOW9juocfeWSMct0niQiJZLJTtqH2WZtisRgGlJcfkb/i2muv1e+77z5n49atH80lk283NjX1ipn88gCAdP38xXPn/tW/vn79euOUU04BAGlZFsaPH0+PPvooM00To0eP5g888ABfvHhx3m/f6tWrB+UcZ7ehafHW1tZj9tdgAE7/6EfNKePG2fX19T0ebXds2Ud3rgX79znYMXXdk2knN6Yh1ywFetaLXKUoaoZZVAuiCdhpB+1p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 + + + diff --git a/l10n_it_fatturapa_in/tests/data/IT02780790107_11006.xml b/l10n_it_fatturapa_in/tests/data/IT02780790107_11006.xml new file mode 100644 index 000000000000..169d5f7e2a37 --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT02780790107_11006.xml @@ -0,0 +1,97 @@ + + + + + + IT + 02780790107 + + 11005 + FPA12 + UFPQ1O + + + + + + IT + 02780790107 + + + Societa' Alpha SRL + + RF01 + + + VIALE ROMA 543 + 07100 + SASSARI + SS + IT + + + + + 80213330584 + + AMMINISTRAZIONE BETA + + + + VIA TORINO 38-B + 00145 + ROMA + RM + IT + + + + + + + TD01 + EUR + 2014-12-18 + 125 + + + 60 + 66685 + 1 + 123abc + 456def + + + + + 1 + + EAN + 12345 + + + 5.00 + 1.00 + 5.00 + 22.00 + + + 2 + FORNITURE VARIE PER UFFICIO + 10.00 + 2.00 + 20.00 + 22.00 + + + 22.00 + 25.00 + 5.50 + D + + + + diff --git a/l10n_it_fatturapa_in/tests/data/IT02780790107_11007.xml b/l10n_it_fatturapa_in/tests/data/IT02780790107_11007.xml new file mode 100644 index 000000000000..ce6011d5f8f3 --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT02780790107_11007.xml @@ -0,0 +1,98 @@ + + + + + + IT + 02780790107 + + 11007 + FPA12 + UFPQ1O + + + + + + IT + 02780790107 + + + Societa' Alpha SRL + + RF01 + + + VIALE ROMA 543 + 07100 + SASSARI + SS + IT + + + + + 80213330584 + + AMMINISTRAZIONE BETA + + + + VIA TORINO 38-B + 00145 + ROMA + RM + IT + + + + + + + TD01 + EUR + 2015-06-18 + 136 + 56.50 + + + 60 + 66685 + 1 + 123abc + 456def + + + + + 1 + + EAN + 12345 + + ABC + 5.00 + 1.00 + 5.00 + 15.55 + + + 2 + FORNITURE VARIE PER UFFICIO + 10.00 + 2.00 + 20.00 + 15.55 + + + 15.55 + 25.00 + 3.89 + D + + + + diff --git a/l10n_it_fatturapa_in/tests/data/IT05979361218_001.xml b/l10n_it_fatturapa_in/tests/data/IT05979361218_001.xml new file mode 100644 index 000000000000..3d1f8d65eb76 --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT05979361218_001.xml @@ -0,0 +1,119 @@ + + + + + + IT + 05979361218 + + 001 + FPA12 + UFPQ1O + + + + + IT + 05979361218 + + + SOCIETA' ALPHA BETA SRL + + Albo di test + TO + TO1258B + 2010-01-16 + RF02 + + + VIALE ROMA 543B + 07100 + SASSARI + SS + + + + + + 80213330584 + + AMMINISTRAZIONE BETA + + + + VIA TORINO 38-B + 00145 + ROMA + RM + IT + + + + + + + TD01 + EUR + 2015-02-16 + FT/2015/0006 + + TC22 + 0.00 + 3.00 + 3.00 + 0.00 + N4 + + Rif ordine MAPA: --- Nr. Identificativo Ordine 1234567 + + + 0.00 + 0.00 + + + + + 1 + Prodotto di test al giorno + 15.00 + Giorno(i) + 3.60 + 54.00 + 0.00 + N4 + + Vostro RIF + Riferimento + 3.00 + + + Vostro RIF + Riferimento2 + + + + 0.00 + N4 + 57.00 + 0.00 + Operazioni senza addebito imposta regime contribuenti minimi art.27 c.1-2 DL.98/11 + + + + TP01 + + MP05 + 2015-03-18 + 27.00 + + + MP05 + 2015-04-17 + 27.00 + + + + diff --git a/l10n_it_fatturapa_in/tests/data/IT05979361218_002.xml b/l10n_it_fatturapa_in/tests/data/IT05979361218_002.xml new file mode 100644 index 000000000000..7f1c3f08644b --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT05979361218_002.xml @@ -0,0 +1,106 @@ + + + + + + IT + 05979361218 + + 002 + FPA12 + UFPQ1O + + + + + IT + 05979361218 + + + SOCIETA' ALPHA BETA SRL + + Albo di test + TO + TO1258B + 2010-01-16 + RF02 + + + VIALE ROMA 543B + 07100 + SASSARI + SS + IT + + + + + 80213330584 + + AMMINISTRAZIONE BETA + + + + VIA TORINO 38-B + 00145 + ROMA + RM + IT + + + + + + + TD01 + EUR + 2015-02-16 + FT/2015/0007 + + TC22 + 0.00 + 3.00 + 3.00 + 0.00 + N4 + + Rif ordine MAPA: --- Nr. Identificativo Ordine 1234567 + + + + + 1 + Prodotto di test al giorno + 15.00 + Giorno(i) + 3.60 + 54.00 + 0.00 + N4 + + + 0.00 + N4 + 57.00 + 0.00 + Operazioni senza addebito imposta regime contribuenti minimi art.27 c.1-2 DL.98/11 + + + + TP01 + + MP05 + 2015-03-18 + 27.00 + + + MP05 + 2015-04-17 + 27.00 + + + + diff --git a/l10n_it_fatturapa_in/tests/data/IT05979361218_003.xml b/l10n_it_fatturapa_in/tests/data/IT05979361218_003.xml new file mode 100644 index 000000000000..240035ebebbe --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT05979361218_003.xml @@ -0,0 +1,102 @@ + + + + + + IT + 05979361218 + + 003 + FPA12 + UFPQ1O + + + + + IT + 05979361218 + + + SOCIETA' ALPHA BETA SRL + + RF02 + + + VIALE ROMA 543B + 07100 + SASSARI + SS + IT + + + + + 80213330584 + + AMMINISTRAZIONE BETA + + + + VIA TORINO 38-B + 00145 + ROMA + RM + IT + + + + + + IT + 03533590174 + + MRORSS90E25B111T + + MARIO + ROSSI + + + + TZ + + + + + TD01 + EUR + 2015-02-16 + FT/2015/0008 + + SI + 6.00 + + Rif ordine MAPA: --- Nr. Identificativo Ordine 1234567 + + + + + 1 + Prodotto di test al giorno + 1.00 + 10.00 + + SC + 10.00 + + 9.00 + 0.00 + N4 + + + 0.00 + N4 + 9.00 + 0.00 + Operazioni senza addebito imposta regime contribuenti minimi art.27 c.1-2 DL.98/11 + + + + diff --git a/l10n_it_fatturapa_in/tests/data/IT05979361218_004.xml b/l10n_it_fatturapa_in/tests/data/IT05979361218_004.xml new file mode 100644 index 000000000000..fc0442860da3 --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT05979361218_004.xml @@ -0,0 +1,121 @@ + + + + + + IT + 05979361218 + + 004 + FPA12 + UFPQ1O + + + + + IT + 05979361218 + + + SOCIETA' ALPHA BETA SRL + + RF02 + + + VIALE ROMA 543B + 07100 + SASSARI + SS + IT + + + + + 80213330584 + + AMMINISTRAZIONE BETA + + + + VIA TORINO 38-B + 00145 + ROMA + RM + IT + + + + + + IT + 03533590174 + + MRORSS90E25B111T + + MARIO + ROSSI + + + + TZ + + + + + TD01 + EUR + 2015-02-16 + FT/2015/0009 + Rif ordine MAPA: --- Nr. Identificativo Ordine 1234567 + + + + + 1 + + SA + 123456-01 + + USB + 4.00 + PZ + 177.00 + + SC + 10.00 + + 637.20 + 22.00 + D122353 + + + 2 + + SA + 123456-04 + + USB + 1.00 + PZ + 596.00 + + SC + 10.00 + + 536.40 + 22.00 + D122354 + + + 22.00 + 1173.60 + 258.19 + S + SCISSIONE PAGAMENTI Split Payment art.17-ter del DPR 633/1972 + + + + diff --git a/l10n_it_fatturapa_in/tests/data/IT05979361218_005.xml b/l10n_it_fatturapa_in/tests/data/IT05979361218_005.xml new file mode 100644 index 000000000000..057a9c038e61 --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT05979361218_005.xml @@ -0,0 +1,112 @@ + + + + + + IT + 05979361218 + + 005 + FPA12 + UFPQ1O + + + + + IT + 05979361218 + + + SOCIETA' ALPHA BETA SRL + + RF02 + + + VIALE ROMA 543B + 07100 + SASSARI + SS + IT + + + + + 80213330584 + + AMMINISTRAZIONE BETA + + + + VIA TORINO 38-B + 00145 + ROMA + RM + IT + + + + + + + TD01 + EUR + 2015-02-16 + FT/2015/0010 + + SC + 10.00 + + 1288.61 + Rif ordine MAPA: --- Nr. Identificativo Ordine 1234567 + + + + + 1 + + SA + 123456-01 + + USB + 4.00 + PZ + 177.00 + + SC + 10.00 + + 637.20 + 22.00 + + + + 2 + + SA + 123456-04 + + USB + 1.00 + PZ + 596.00 + + SC + 10.00 + + 536.40 + 22.00 + + + + 22.00 + 1173.60 + 258.19 + S + SCISSIONE PAGAMENTI Split Payment art.17-ter del DPR 633/1972 + + + + diff --git a/l10n_it_fatturapa_in/tests/data/IT05979361218_006.XML b/l10n_it_fatturapa_in/tests/data/IT05979361218_006.XML new file mode 100644 index 000000000000..c8cfd9d8b99f --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT05979361218_006.XML @@ -0,0 +1,111 @@ + + + + + + IT + 05979361218 + + 006 + FPA12 + UFPQ1O + + + + + IT + 05979361218 + + + SOCIETA' ALPHA BETA SRL + + RF02 + + + VIALE ROMA 543B + 07100 + SASSARI + SS + IT + + + + + 80213330584 + + AMMINISTRAZIONE BETA + + + + VIA TORINO 38-B + 00145 + ROMA + RM + IT + + + + + + + TD01 + EUR + 2015-02-17 + FT/2015/0011 + + SC + 10.00 + + Rif ordine MAPA: --- Nr. Identificativo Ordine 1234567 + + + + + 1 + + SA + 123456-01 + + USB + 4.00 + PZ + 177.00 + + SC + 10.00 + + 637.20 + 22.00 + + + + 2 + + SA + 123456-04 + + USB + 1.00 + PZ + 596.00 + + SC + 10.00 + + 536.40 + 22.00 + + + + 22.00 + 1173.60 + 258.19 + S + SCISSIONE PAGAMENTI Split Payment art.17-ter del DPR 633/1972 + + + + diff --git a/l10n_it_fatturapa_in/tests/data/IT05979361218_007.xml b/l10n_it_fatturapa_in/tests/data/IT05979361218_007.xml new file mode 100644 index 000000000000..e4dccdf77f55 --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT05979361218_007.xml @@ -0,0 +1,97 @@ + + + + + + IT + 05979361218 + + 007 + FPA12 + UFPQ1O + + + + + IT + 05979361218 + + + SOCIETA' ALPHA BETA SRL + + RF02 + + + VIALE ROMA 543B + 07100 + SASSARI + SS + IT + + + + + 80213330584 + + AMMINISTRAZIONE BETA + + + + VIA TORINO 38-B + 00145 + ROMA + RM + IT + + + + + + + TD01 + EUR + 2015-03-16 + FT/2015/0009 + Rif ordine MAPA: --- Nr. Identificativo Ordine 1234567 + + + + + 1 + Prodotto di test al giorno + 1.00 + 10.00 + + SC + 10.00 + + 9.00 + 0.00 + N4 + + + 0.00 + N4 + 9.00 + 0.00 + Operazioni senza addebito imposta regime contribuenti minimi art.27 c.1-2 DL.98/11 + + + + TP02 + + MP18 + 2015-06-03+02:00 + 9.00 + Bank Test + IT24J0617501400000006042218 + GEBABEBB + 2.00 + 2015-06-04+02:00 + + + + diff --git a/l10n_it_fatturapa_in/tests/data/IT05979361218_008.xml b/l10n_it_fatturapa_in/tests/data/IT05979361218_008.xml new file mode 100644 index 000000000000..719edafa35f9 --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT05979361218_008.xml @@ -0,0 +1,93 @@ + + + + + + IT + 05979361218 + + 008 + FPA12 + UFPQ1O + + + + + IT + 05979361218 + + + SOCIETA' ALPHA BETA SRL + + RF02 + + + VIALE ROMA 543B + 07100 + SASSARI + SS + IT + + + + + 80213330584 + + AMMINISTRAZIONE BETA + + + + VIA TORINO 38-B + 00145 + ROMA + RM + IT + + + + + + MARIO + ROSSI + + + + TZ + + + + + TD01 + EUR + 2015-06-22 + FT/2015/0012 + Rif ordine MAPA: --- Nr. Identificativo Ordine 1234567 + + + + + 1 + Prodotto di test al giorno + 1.00 + 10.00 + + SC + 10.00 + + 9.00 + 0.00 + N4 + + + 0.00 + N4 + 9.00 + 0.00 + Operazioni senza addebito imposta regime contribuenti minimi art.27 c.1-2 DL.98/11 + + + + diff --git a/l10n_it_fatturapa_in/tests/data/IT05979361218_009.xml b/l10n_it_fatturapa_in/tests/data/IT05979361218_009.xml new file mode 100644 index 000000000000..96937e411ffd --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT05979361218_009.xml @@ -0,0 +1,95 @@ + + + + + + IT + 05979361218 + + 009 + FPA12 + UFPQ1O + + + + + + IT + 05979361218 + + + SOCIETA' ALPHA SRL + + RF19 + + + VIALE ROMA 543 + 07100 + SASSARI + SS + IT + + + + + 80213330584 + + DITTA BETA + + + + VIA TORINO 38-B + 00145 + ROMA + RM + IT + + + + + + + TD01 + EUR + 2014-12-18 + 129 + + RT01 + 1.00 + 20.00 + A + + LA FATTURA FA RIFERIMENTO AD UNA OPERAZIONE AAAA BBBBBBBBBBBBBBBBBB CCC DDDDDDDDDDDDDDD E FFFFFFFFFFFFFFFFFFFF GGGGGGGGGG HHHHHHH II LLLLLLLLLLLLLLLLL MMM NNNNN OO PPPPPPPPPPP QQQQ RRRR SSSSSSSSSSSSSS + SEGUE DESCRIZIONE CAUSALE NEL CASO IN CUI NON SIANO STATI SUFFICIENTI 200 CARATTERI AAAAAAAAAAA BBBBBBBBBBBBBBBBB + + + + + 1 + DESCRIZIONE DELLA FORNITURA + 5.00 + 1.00 + 5.00 + 22.00 + SI + + + 22.00 + 5.00 + 1.10 + I + + + + TP01 + + MP01 + 2015-01-30 + 5.10 + + + + diff --git a/l10n_it_fatturapa_in/tests/data/IT05979361218_010.xml b/l10n_it_fatturapa_in/tests/data/IT05979361218_010.xml new file mode 100644 index 000000000000..4fb7be6875bb --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT05979361218_010.xml @@ -0,0 +1,101 @@ + + + + + + IT + 05979361218 + + 009 + FPA12 + UFPQ1O + + + + + + IT + 05979361218 + + + SOCIETA' ALPHA SRL + + RF19 + + + VIALE ROMA 543 + 07100 + SASSARI + SS + IT + + + + + 80213330584 + + DITTA BETA + + + + VIA TORINO 38-B + 00145 + ROMA + RM + IT + + + + + + + TD01 + EUR + 2014-12-18 + 14171 + + RT01 + 1.00 + 20.00 + A + + LA FATTURA FA RIFERIMENTO AD UNA OPERAZIONE AAAA BBBBBBBBBBBBBBBBBB CCC DDDDDDDDDDDDDDD E FFFFFFFFFFFFFFFFFFFF GGGGGGGGGG HHHHHHH II LLLLLLLLLLLLLLLLL MMM NNNNN OO PPPPPPPPPPP QQQQ RRRR SSSSSSSSSSSSSS + SEGUE DESCRIZIONE CAUSALE NEL CASO IN CUI NON SIANO STATI SUFFICIENTI 200 CARATTERI AAAAAAAAAAA BBBBBBBBBBBBBBBBB + + + 1 + 1/PF + 2014-12-18 + 1 + + + + + 1 + DESCRIZIONE DELLA FORNITURA + 5.00 + 1.00 + 5.00 + 22.00 + SI + + + 22.00 + 5.00 + 1.10 + I + + + + TP01 + + MP01 + 2015-01-30 + 5.10 + + + + diff --git a/l10n_it_fatturapa_in/tests/data/IT05979361218_011.xml b/l10n_it_fatturapa_in/tests/data/IT05979361218_011.xml new file mode 100644 index 000000000000..2382fbeb98d6 --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT05979361218_011.xml @@ -0,0 +1,131 @@ + + + + + + IT + 05979361218 + + 001 + FPA12 + UFPQ1O + + + + + IT + 05979361218 + + + SOCIETA' ALPHA BETA SRL + + Albo di test + TO + TO1258B + 2010-01-16 + RF02 + + + VIALE ROMA 543B + 07100 + SASSARI + SS + IT + + + + + 80213330584 + + AMMINISTRAZIONE BETA + + + + VIA TORINO 38-B + 00145 + ROMA + RM + IT + + + + + + IT + 3339130126 + + + Rappresentante fiscale + 1234567890123 + + + + + + + + TD01 + EUR + 2015-02-16 + 14021 + + TC22 + 0.00 + 3.00 + 3.00 + 0.00 + N4 + + Rif ordine MAPA: --- Nr. Identificativo Ordine 1234567 + + + 0.00 + 0.00 + + + + + 1 + Prodotto di test al giorno + 15.00 + Giorno(i) + 3.60 + 54.00 + 0.00 + N4 + + Vostro RIF + Riferimento + 3.00 + + + Vostro RIF + Riferimento2 + + + + 0.00 + N4 + 57.00 + 0.00 + Operazioni senza addebito imposta regime contribuenti minimi art.27 c.1-2 DL.98/11 + + + + TP01 + + MP05 + 2015-03-18 + 27.00 + + + MP05 + 2015-04-17 + 27.00 + + + + diff --git a/l10n_it_fatturapa_in/tests/data/IT05979361218_012.xml b/l10n_it_fatturapa_in/tests/data/IT05979361218_012.xml new file mode 100644 index 000000000000..6801be43b19a --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT05979361218_012.xml @@ -0,0 +1,94 @@ + + + + + + IT + 05979361218 + + 006 + FPA12 + UFPQ1O + + + + + IT + 05979361218 + + + SOCIETA' ALPHA BETA SRL + + RF02 + + + VIALE ROMA 543B + 07100 + SASSARI + SS + IT + + + + + 80213330584 + + AMMINISTRAZIONE BETA + + + + VIA TORINO 38-B + 00145 + ROMA + RM + IT + + + + + + + TD01 + EUR + 2019-05-11 + 14241 + 34.32 + Rif ordine 908 + + + + + 1 + USB4 + 1.00 + Pz. + 18.07 + 18.07 + 0.00 + N4 + + + 2 + USB + 1.00 + Pz. + 16.60 + 16.60 + 0.00 + N4 + + + 0.00 + N4 + -0.35 + 34.67 + 0.00 + I + Esenzione Art.8 comma 1 DPR 633/72 + + + + diff --git a/l10n_it_fatturapa_in/tests/data/IT05979361218_013.xml b/l10n_it_fatturapa_in/tests/data/IT05979361218_013.xml new file mode 100644 index 000000000000..9e5346afe016 --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT05979361218_013.xml @@ -0,0 +1,94 @@ + + + + + + IT + 05979361218 + + 006 + FPA12 + UFPQ1O + + + + + IT + 05979361218 + + + SOCIETA' ALPHA BETA SRL + + RF02 + + + VIALE ROMA 543B + 07100 + SASSARI + SS + IT + + + + + 80213330584 + + AMMINISTRAZIONE BETA + + + + VIA TORINO 38-B + 00145 + ROMA + RM + IT + + + + + + + TD01 + EUR + 2019-05-11 + A852S1 + 34.32 + -0.35 + Rif ordine 908 + + + + + 1 + USB4 + 1.00 + Pz. + 18.07 + 18.07 + 0.00 + N4 + + + 2 + USB + 1.00 + Pz. + 16.60 + 16.60 + 0.00 + N4 + + + 0.00 + N4 + 34.67 + 0.00 + I + Esenzione Art.8 comma 1 DPR 633/72 + + + + diff --git a/l10n_it_fatturapa_in/tests/data/IT05979361218_014.xml b/l10n_it_fatturapa_in/tests/data/IT05979361218_014.xml new file mode 100644 index 000000000000..6e1549a5638f --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT05979361218_014.xml @@ -0,0 +1,105 @@ + + + + + + IT + 05979361218 + + 00001 + FPR12 + 0000000 + + + + + + IT + 02780790107 + + + SOCIETA' ALPHA SRL + + RF01 + + + VIALE ROMA 543 + 07100 + SASSARI + SS + IT + + + + + 03533590174 + + BETA GAMMA + + + + VIA TORINO 38-B + 00145 + ROMA + RM + IT + + + + + + + TD01 + EUR + 2019-07-02 + FPR 16/19 + + RT01 + 284.05 + 11.50 + A + + + TC07 + 1.57 + 38.78 + 2470.00 + 0.00 + N2 + + 3013.40 + + + + + 1 + ACCONTO PROVVIGIONI + 1.00 + 2470.00 + 2470.00 + 22.00 + SI + + + 22.00 + 2470.00 + 543.40 + + + 0.00 + N2 + 38.78 + 0.00 + Escluso Art. 13 5C DPR 633/72 + + + + TP02 + + MP05 + 2019-07-02 + 2690.57 + + + + diff --git a/l10n_it_fatturapa_in/tests/data/IT05979361218_015.xml b/l10n_it_fatturapa_in/tests/data/IT05979361218_015.xml new file mode 100644 index 000000000000..5278088d2536 --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT05979361218_015.xml @@ -0,0 +1,94 @@ + + + + + + IT + 05979361218 + + 006 + FPA12 + UFPQ1O + + + + + IT + 05979361218 + + + SOCIETA' ALPHA BETA SRL + + RF02 + + + VIALE ROMA 543B + 07100 + SASSARI + SS + IT + + + + + 80213330584 + + AMMINISTRAZIONE BETA + + + + VIA TORINO 38-B + 00145 + ROMA + RM + IT + + + + + + + TD01 + EUR + 2019-05-11 + 14261 + 34.32 + Rif ordine 908 + + + + + 1 + USB4 + 1.00 + Pz. + 18.07 + 18.07 + 0.00 + N4 + + + 2 + USB + 1.00 + Pz. + 16.60 + 16.60 + 0.00 + N4 + + + 0.00 + N4 + -0.35 + 34.32 + 0.00 + I + Esenzione Art.8 comma 1 DPR 633/72 + + + + diff --git a/l10n_it_fatturapa_in/tests/data/IT05979361218_016.xml b/l10n_it_fatturapa_in/tests/data/IT05979361218_016.xml new file mode 100644 index 000000000000..992d2eb87363 --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT05979361218_016.xml @@ -0,0 +1,98 @@ + + + + + + IT + 05979361218 + + 006 + FPA12 + UFPQ1O + + + + + IT + 05979361218 + + + SOCIETA' ALPHA BETA SRL + + RF02 + + + VIALE ROMA 543B + 07100 + SASSARI + SS + IT + + + + + 80213330584 + + AMMINISTRAZIONE BETA + + + + VIA TORINO 38-B + 00145 + ROMA + RM + IT + + + + + + + TD01 + EUR + 2019-05-11 + 14461 + 18.07 + Rif ordine 908 + + + + + 1 + USB4 + 1.00 + Pz. + 18.07 + 18.07 + 0.00 + N4 + + + 2 + USB + 1.00 + Pz. + 16.60 + + SC + 100.00 + + 0.0000000 + 0.00 + N4 + + + 0.00 + N4 + -0.00 + 18.07 + 0.00 + I + Esenzione Art.8 comma 1 DPR 633/72 + + + + diff --git a/l10n_it_fatturapa_in/tests/data/IT05979361218_fake.xml.p7m b/l10n_it_fatturapa_in/tests/data/IT05979361218_fake.xml.p7m new file mode 100644 index 000000000000..8d1c8b69c3fc --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT05979361218_fake.xml.p7m @@ -0,0 +1 @@ + diff --git a/l10n_it_fatturapa_in/tests/data/IT05979361218_no_decl.xml b/l10n_it_fatturapa_in/tests/data/IT05979361218_no_decl.xml new file mode 100644 index 000000000000..7e45271d33f1 --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT05979361218_no_decl.xml @@ -0,0 +1,153 @@ + + + + + IT + 05979361218 + + 00001 + FPR12 + 0000000 + + + + + + IT + 02780790107 + + + SOCIETA' ALPHA SRL + + RF01 + + + VIALE ROMA 543 + 07100 + SASSARI + SS + IT + + + + + 03533590174 + + BETA GAMMA + + + + VIA TORINO 38-B + 00145 + ROMA + RM + IT + + + + + + + TD01 + EUR + 2014-12-18 + 14201 + LA FATTURA FA RIFERIMENTO AD UNA OPERAZIONE AAAA BBBBBBBBBBBBBBBBBB CCC DDDDDDDDDDDDDDD E FFFFFFFFFFFFFFFFFFFF GGGGGGGGGG HHHHHHH II LLLLLLLLLLLLLLLLL MMM NNNNN OO PPPPPPPPPPP QQQQ RRRR SSSSSSSSSSSSSS + SEGUE DESCRIZIONE CAUSALE NEL CASO IN CUI NON SIANO STATI SUFFICIENTI 200 CARATTERI AAAAAAAAAAA BBBBBBBBBBBBBBBBB + + + 1 + 66685 + 1 + + + + + IT + 04507990150 + + + Trasporto spa + + + 2012-10-22T16:46:12.000+02:00 + + + + + 1 + + INT + ART123 + + LA DESCRIZIONE DELLA FORNITURA PUO' SUPERARE I CENTO CARATTERI CHE RAPPRESENTAVANO IL PRECEDENTE LIMITE DIMENSIONALE. TALE LIMITE NELLA NUOVA VERSIONE E' STATO PORTATO A MILLE CARATTERI + 5.00 + 1.00 + 5.00 + 22.00 + + + 2 + FORNITURE VARIE PER UFFICIO + 10.00 + 2.00 + 20.00 + 22.00 + + + 22.00 + 25.00 + 5.50 + I + + + + TP01 + + MP01 + 2015-01-30 + 32.50 + + + + + + + TD01 + EUR + 2014-12-20 + 14202 + LA FATTURA FA RIFERIMENTO AD UNA OPERAZIONE AAAA BBBBBBBBBBBBBBBBBB CCC DDDDDDDDDDDDDDD E FFFFFFFFFFFFFFFFFFFF GGGGGGGGGG HHHHHHH II LLLLLLLLLLLLLLLLL MMM NNNNN OO PPPPPPPPPPP QQQQ RRRR SSSSSSSSSSSSSS + SEGUE DESCRIZIONE CAUSALE NEL CASO IN CUI NON SIANO STATI SUFFICIENTI 200 CARATTERI AAAAAAAAAAA BBBBBBBBBBBBBBBBB + + + 1 + 66685 + 1 + + + + + 1 + PRESTAZIONE DEL SEGUENTE SERVIZIO PROFESSIONALE: LA DESCRIZIONE DELLA PRESTAZIONE PUO' SUPERARE I CENTO CARATTERI CHE RAPPRESENTAVANO IL PRECEDENTE LIMITE DIMENSIONALE. TALE LIMITE NELLA NUOVA VERSIONE E' STATO PORTATO A MILLE CARATTERI + 2000.00 + 2000.00 + 22.00 + + + 22.00 + 2000.00 + 440.00 + I + + + + TP01 + + MP19 + 2015-01-28 + 2440.00 + + + + diff --git a/l10n_it_fatturapa_in/tests/data/IT05979361218_q0.xml b/l10n_it_fatturapa_in/tests/data/IT05979361218_q0.xml new file mode 100644 index 000000000000..ac699e8d4871 --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT05979361218_q0.xml @@ -0,0 +1,92 @@ + + + + + + IT + 05979361218 + + 006 + FPA12 + UFPQ1O + + + + + IT + 05979361218 + + + SOCIETA' ALPHA BETA SRL + + RF02 + + + VIALE ROMA 543B + 07100 + SASSARI + SS + IT + + + + + 80213330584 + + AMMINISTRAZIONE BETA + + + + VIA TORINO 38-B + 00145 + ROMA + RM + IT + + + + + + + TD01 + EUR + 2019-05-11 + 852S1 + 16.60 + Rif ordine 908 + + + + + 1 + USB4 + 0.00 + Pz. + 18.07 + 0.00 + 0.00 + N4 + + + 2 + USB + Pz. + 16.60 + 16.60 + 0.00 + N4 + + + 0.00 + N4 + 16.60 + 0.00 + I + Esenzione Art.8 comma 1 DPR 633/72 + + + + diff --git a/l10n_it_fatturapa_in/tests/data/IT05979361218_ripilogoiva.xml b/l10n_it_fatturapa_in/tests/data/IT05979361218_ripilogoiva.xml new file mode 100644 index 000000000000..3374b3294e2d --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/IT05979361218_ripilogoiva.xml @@ -0,0 +1,226 @@ + + + + + + IT + 05979361218 + + 00001 + FPR12 + 0000000 + + + + + + IT + 02780790107 + + + SOCIETA' ALPHA SRL + + RF01 + + + VIALE ROMA 543 + 07100 + SASSARI + SS + IT + + + + + 03533590174 + + BETA GAMMA + + + + VIA TORINO 38-B + 00145 + ROMA + RM + IT + + + + + + + TD01 + EUR + 2020-10-06 + GR20-900443E + 204.16 + + + 1 + GR20-900443E + 2020-10-06 + + + GR20-900443E + 2020-10-06 + + + GR20-900443E + 2020-10-06 + + + + + 1 + + POD + IT001E14607435 + + Imposte + 905.00 + kWh + 2020-09-01 + 2020-09-30 + 0.01249724 + 11.31000000 + 22.00 + + Ind.POD + VIA TRIESTE, 47 - 21020 BUGUGGIATE (VA) + + + + 2 + + POD + IT001E14607435 + + Spesa per trasporto, gestione contatore e oneri sistema + 4.900000 + kW + 2020-09-01 + 2020-09-30 + 4.99795918 + 24.49000000 + 22.00 + + Ind.POD + VIA TRIESTE, 47 - 21020 BUGUGGIATE (VA) + + + + 3 + + POD + IT001E14607435 + + Spesa per trasporto, gestione contatore e oneri sistema + 905.00 + kWh + 2020-09-01 + 2020-09-30 + 0.05601105 + 50.69000000 + 22.00 + + Ind.POD + VIA TRIESTE, 47 - 21020 BUGUGGIATE (VA) + + + + 4 + + POD + IT001E14607435 + + Spesa per trasporto, gestione contatore e oneri sistema + 1.00 + Mese + 2020-09-01 + 2020-09-30 + 4.23000000 + 4.23000000 + 22.00 + + Ind.POD + VIA TRIESTE, 47 - 21020 BUGUGGIATE (VA) + + + + 5 + + POD + IT001E14607435 + + Spesa per la materia energia + 1.00 + Mese + 2020-09-01 + 2020-09-30 + 0.01000000 + 0.01000000 + 22.00 + + Ind.POD + VIA TRIESTE, 47 - 21020 BUGUGGIATE (VA) + + + + 6 + + POD + IT001E14607435 + + Spesa per la materia energia + 905.00 + kWh + 2020-09-01 + 2020-09-30 + 0.08146961 + 73.73000000 + 22.00 + + Ind.POD + VIA TRIESTE, 47 - 21020 BUGUGGIATE (VA) + + + + 7 + Altre partite + 1.00 + Nr + 2020-09-01 + 2020-09-30 + 3.52000000 + 3.52000000 + 0.00 + N1 + + + 22.00 + 164.46 + 36.18 + I + + + 0.00 + N1 + 3.52 + 0.00 + Escluso Art.15 + + + + TP02 + + MP05 + 2020-10-06 + 30 + 2020-11-05 + 204.16 + Deutsche Bank + IT64C0310401600000000770885 + + + + diff --git a/l10n_it_fatturapa_in/tests/data/ITBNCMRA80A01D548T_20001.xml b/l10n_it_fatturapa_in/tests/data/ITBNCMRA80A01D548T_20001.xml new file mode 100644 index 000000000000..986c65bea2b9 --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/ITBNCMRA80A01D548T_20001.xml @@ -0,0 +1,132 @@ + + + + + + + IT + 01484710387 + + 00005 + FPR12 + 0000000 + + 05543534343 + info@yourcompany.example.com + + ufficio@pec.bizz.it + + + + + + IT + 01484710387 + + + Mario + Bianchi + Avvocato + + RF01 + + + Via Voltapaletto 12 + 44121 + Ferrara + FE + IT + + + + + + 04006460275 + + BIZZ SRL + + + + VIA TORINO 135 + 30100 + Venezia + VE + IT + + + + + + + + + + + TD01 + EUR + 2020-10-25 + 001 + + + RT01 + 23.00 + 20.00 + A + + + + TC01 + 4.00 + 4.60 + 115.00 + 22.00 + + + 122.91 + + + + + + + 1 + Competenze + 100.00 + 100.00 + 22.00 + SI + + + + 2 + Spese generali ( 15% ) + 15.00 + 15.00 + 22.00 + SI + + + + 22.00 + 119.60 + 26.31 + I + + + + + + TP02 + + MP05 + 2020-09-30 + 122.91 + FINECO BANK + IT37F0301503200000005796511 + UNCRITMMXXX + + + + + + diff --git a/l10n_it_fatturapa_in/tests/data/ITBNCMRA80A01D548T_20005.xml b/l10n_it_fatturapa_in/tests/data/ITBNCMRA80A01D548T_20005.xml new file mode 100644 index 000000000000..3ec1b7416528 --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/ITBNCMRA80A01D548T_20005.xml @@ -0,0 +1,132 @@ + + + + + + + IT + 01484710387 + + 00005 + FPR12 + 0000000 + + 05543534343 + info@yourcompany.example.com + + ufficio@pec.bizz.it + + + + + + IT + 01484710387 + + + Mario + Bianchi + Avvocato + + RF01 + + + Via Voltapaletto 12 + 44121 + Ferrara + FE + IT + + + + + + 04006460275 + + BIZZ SRL + + + + VIA TORINO 135 + 30100 + Venezia + VE + IT + + + + + + + + + + + TD01 + EUR + 2020-10-25 + 14441 + + + RT01 + 23.00 + 20.00 + A + + + + TC01 + 4.00 + 4.60 + 115.00 + 22.00 + + + 122.91 + + + + + + + 1 + Competenze + 100.00 + 100.00 + 22.00 + SI + + + + 2 + Spese generali ( 15% ) + 15.00 + 15.00 + 22.00 + SI + + + + 22.00 + 119.60 + 26.31 + I + + + + + + TP02 + + MP05 + 2020-09-30 + 122.91 + FINECO BANK + IT37F0301503200000005796511 + UNCRITMMXXX + + + + + + diff --git a/l10n_it_fatturapa_in/tests/data/ITNREGCM80H30D612D_20003.xml b/l10n_it_fatturapa_in/tests/data/ITNREGCM80H30D612D_20003.xml new file mode 100644 index 000000000000..ded42a8d5653 --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/ITNREGCM80H30D612D_20003.xml @@ -0,0 +1,132 @@ + + + + + + + IT + 06948880486 + + 00005 + FPR12 + 0000000 + + 05543534343 + info@yourcompany.example.com + + ufficio@pec.bizz.it + + + + + + IT + 06948880486 + + + GIACOMO + NERI + + RF01 + + + VIA DEI BOTTEGAI + 11 + 50123 + FIRENZE + FI + IT + + + + + + 04006460275 + + BIZZ SRL + + + + VIA TORINO 135 + 30100 + Venezia + VE + IT + + + + + + + + + + + + TD01 + EUR + 2020-10-25 + 003 + + + RT01 + 1.15 + 11.50 + R + + + + RT04 + 0.85 + 8.50 + R + + + + TC07 + 8.50 + 0.85 + 10.00 + 22.00 + SI + + + 10.20 + + + + + + + 1 + PROVVIGIONI + 10.00 + 10.00 + 22.00 + SI + + + 22.00 + 10.00 + 2.20 + I + + + + + + TP02 + + MP05 + 2020-09-30 + 10.20 + FINECO BANK + IT37F0301503200000005796533 + UNCRITMMXXX + + + + + + + diff --git a/l10n_it_fatturapa_in/tests/data/ITNREGCM80H30D612D_20004.xml b/l10n_it_fatturapa_in/tests/data/ITNREGCM80H30D612D_20004.xml new file mode 100644 index 000000000000..bb12ee227572 --- /dev/null +++ b/l10n_it_fatturapa_in/tests/data/ITNREGCM80H30D612D_20004.xml @@ -0,0 +1,131 @@ + + + + + + + IT + 06948880486 + + 00005 + FPR12 + 0000000 + + 05543534343 + info@yourcompany.example.com + + ufficio@pec.bizz.it + + + + + + IT + 06948880486 + + + GIACOMO + NERI + + RF01 + + + VIA DEI BOTTEGAI + 11 + 50123 + FIRENZE + FI + IT + + + + + + 04006460275 + + BIZZ SRL + + + + VIA TORINO 135 + 30100 + Venezia + VE + IT + + + + + + + + + + + + TD01 + EUR + 2020-10-25 + 14031 + + + RT01 + 1.15 + 11.50 + R + + + + RT04 + 0.85 + 8.50 + R + + + + TC07 + 8.50 + 0.85 + 10.00 + 22.00 + SI + + + 10.20 + + + + + + + 1 + PROVVIGIONI + 10.00 + 10.00 + 22.00 + + + 22.00 + 10.00 + 2.20 + I + + + + + + TP02 + + MP05 + 2020-09-30 + 10.20 + FINECO BANK + IT37F0301503200000005796533 + UNCRITMMXXX + + + + + + + diff --git a/l10n_it_fatturapa_in/tests/fatturapa_common.py b/l10n_it_fatturapa_in/tests/fatturapa_common.py new file mode 100644 index 000000000000..5a3d5328891a --- /dev/null +++ b/l10n_it_fatturapa_in/tests/fatturapa_common.py @@ -0,0 +1,247 @@ +import base64 +import tempfile + +from odoo.modules import get_module_resource +from odoo.tests import Form +from odoo.tests.common import SingleTransactionCase + + +class FatturapaCommon(SingleTransactionCase): + def getFile(self, filename, module_name=None): + if module_name is None: + module_name = "l10n_it_fatturapa_in" + path = get_module_resource(module_name, "tests", "data", filename) + with open(path, "rb") as test_data: + with tempfile.TemporaryFile() as out: + base64.encode(test_data, out) + out.seek(0) + return path, out.read() + + def create_wt(self): + return self.env["withholding.tax"].create( + { + "name": "1040", + "code": "1040", + "account_receivable_id": self.payable_account_id, + "account_payable_id": self.payable_account_id, + "payment_term": self.env.ref( + "account.account_payment_term_immediate" + ).id, + "rate_ids": [(0, 0, {"tax": 20.0})], + "payment_reason_id": self.env.ref("l10n_it_payment_reason.a").id, + } + ) + + def create_wt_23_20(self): + return self.env["withholding.tax"].create( + { + "name": "2320", + "code": "2320", + "account_receivable_id": self.payable_account_id, + "account_payable_id": self.payable_account_id, + "payment_term": self.env.ref( + "account.account_payment_term_immediate" + ).id, + "rate_ids": [(0, 0, {"tax": 23.0, "base": 0.2})], + "payment_reason_id": self.env.ref("l10n_it_payment_reason.a").id, + } + ) + + def create_wt_23_50(self): + return self.env["withholding.tax"].create( + { + "name": "2320", + "code": "2320", + "account_receivable_id": self.payable_account_id, + "account_payable_id": self.payable_account_id, + "payment_term": self.env.ref( + "account.account_payment_term_immediate" + ).id, + "rate_ids": [(0, 0, {"tax": 23.0, "base": 0.5})], + "payment_reason_id": self.env.ref("l10n_it_payment_reason.a").id, + } + ) + + def create_wt_26_20q(self): + return self.env["withholding.tax"].create( + { + "name": "2620q", + "code": "2620q", + "account_receivable_id": self.payable_account_id, + "account_payable_id": self.payable_account_id, + "payment_term": self.env.ref( + "account.account_payment_term_immediate" + ).id, + "rate_ids": [(0, 0, {"tax": 26.0, "base": 0.2})], + "payment_reason_id": self.env.ref("l10n_it_payment_reason.q").id, + } + ) + + def create_wt_26_40q(self): + return self.env["withholding.tax"].create( + { + "name": "2640q", + "code": "2640q", + "account_receivable_id": self.payable_account_id, + "account_payable_id": self.payable_account_id, + "payment_term": self.env.ref( + "account.account_payment_term_immediate" + ).id, + "rate_ids": [(0, 0, {"tax": 26.0, "base": 0.4})], + "payment_reason_id": self.env.ref("l10n_it_payment_reason.q").id, + } + ) + + def create_wt_27_20q(self): + return self.env["withholding.tax"].create( + { + "name": "2720q", + "code": "2720q", + "account_receivable_id": self.payable_account_id, + "account_payable_id": self.payable_account_id, + "payment_term": self.env.ref( + "account.account_payment_term_immediate" + ).id, + "rate_ids": [(0, 0, {"tax": 27.0, "base": 0.2})], + "payment_reason_id": self.env.ref("l10n_it_payment_reason.q").id, + } + ) + + def create_wt_4q(self): + return self.env["withholding.tax"].create( + { + "name": "4q", + "code": "4q", + "wt_types": "enasarco", + "account_receivable_id": self.payable_account_id, + "account_payable_id": self.payable_account_id, + "payment_term": self.env.ref( + "account.account_payment_term_immediate" + ).id, + "rate_ids": [(0, 0, {"tax": 4.0, "base": 1.0})], + "payment_reason_id": self.env.ref("l10n_it_payment_reason.q").id, + } + ) + + def create_res_bank(self): + return self.env["res.bank"].create( + { + "name": "Banca generica", + "bic": "BCITITMM", + } + ) + + def run_wizard( + self, + name, + file_name, + mode="import", + wiz_values=None, + module_name=None, + ): + if module_name is None: + module_name = "l10n_it_fatturapa_in" + attach_form = Form(self.attach_model) + attach_form.name = name + attach_form.datas = self.getFile(file_name, module_name=module_name)[1] + attach_id = attach_form.save().id + if mode == "import": + wizard_form = Form( + self.wizard_model.with_context( + active_ids=[attach_id], active_model="fatturapa.attachment.in" + ) + ) + wizard = wizard_form.save() + return wizard.importFatturaPA() + if mode == "link": + wizard_form = Form( + self.wizard_link_model.with_context( + active_ids=[attach_id], active_model="fatturapa.attachment.in" + ) + ) + wizard = wizard_form.save() + if wiz_values: + wiz_values.wizard_id = wizard + return wizard.link() + + def run_wizard_multi(self, file_name_list, module_name=None): + if module_name is None: + module_name = "l10n_it_fatturapa_in" + active_ids = [] + for file_name in file_name_list: + active_ids.append( + self.attach_model.create( + { + "name": file_name, + "datas": self.getFile(file_name, module_name)[1], + } + ).id + ) + wizard = self.wizard_model.with_context(active_ids=active_ids).create({}) + return wizard.importFatturaPA() + + def setUp(self): + super(FatturapaCommon, self).setUp() + self.wizard_model = self.env["wizard.import.fatturapa"] + self.wizard_link_model = self.env["wizard.link.to.invoice"] + self.data_model = self.env["ir.model.data"] + self.attach_model = self.env["fatturapa.attachment.in"] + self.invoice_model = self.env["account.move"] + self.payable_account_id = ( + self.env["account.account"] + .search( + [ + ( + "user_type_id", + "=", + self.env.ref("account.data_account_type_payable").id, + ) + ], + limit=1, + ) + .id + ) + self.headphones = self.env.ref("product.product_product_7_product_template") + self.imac = self.env.ref("product.product_product_8_product_template") + self.service = self.env.ref("product.product_product_1") + arrotondamenti_attivi_account_id = ( + self.env["account.account"] + .search( + [ + ( + "user_type_id", + "=", + self.env.ref("account.data_account_type_other_income").id, + ) + ], + limit=1, + ) + .id + ) + arrotondamenti_passivi_account_id = ( + self.env["account.account"] + .search( + [ + ( + "user_type_id", + "=", + self.env.ref("account.data_account_type_direct_costs").id, + ) + ], + limit=1, + ) + .id + ) + arrotondamenti_tax_id = self.env["account.tax"].search( + [("type_tax_use", "=", "purchase"), ("amount", "=", 0.0)], + order="sequence", + limit=1, + ) + self.env.company.arrotondamenti_attivi_account_id = ( + arrotondamenti_attivi_account_id + ) + self.env.company.arrotondamenti_passivi_account_id = ( + arrotondamenti_passivi_account_id + ) + self.env.company.arrotondamenti_tax_id = arrotondamenti_tax_id + self.env["res.lang"]._activate_lang("it_IT") diff --git a/l10n_it_fatturapa_in/tests/test_import_fatturapa_xml.py b/l10n_it_fatturapa_in/tests/test_import_fatturapa_xml.py new file mode 100644 index 000000000000..3550b66e5665 --- /dev/null +++ b/l10n_it_fatturapa_in/tests/test_import_fatturapa_xml.py @@ -0,0 +1,1091 @@ +from datetime import date + +from psycopg2 import IntegrityError + +from odoo.exceptions import UserError +from odoo.tests import Form +from odoo.tools import mute_logger + +from .fatturapa_common import FatturapaCommon + + +class TestDuplicatedAttachment(FatturapaCommon): + def test_duplicated_attachment(self): + """Attachment name must be unique""" + # This test breaks the current transaction + # and every test executed after this in the + # same transaction would fail. + # Note that all the tests in TestFatturaPAXMLValidation + # are executed in the same transaction. + self.run_wizard("test_duplicated", "IT02780790107_11005.xml") + with self.assertRaises(IntegrityError) as ie: + with mute_logger("odoo.sql_db"): + self.run_wizard("test_duplicated", "IT02780790107_11005.xml") + self.assertEqual(ie.exception.pgcode, "23505") + + +class TestFatturaPAXMLValidation(FatturapaCommon): + def setUp(self): + super(TestFatturaPAXMLValidation, self).setUp() + self.wt = self.create_wt_4q() + self.wtq = self.create_wt_27_20q() + self.wt4q = self.create_wt_26_40q() + self.wt2q = self.create_wt_26_20q() + self.invoice_model = self.env["account.move"] + self.wizard_link_inv_line_model = self.env["wizard.link.to.invoice.line"] + + def test_00_xml_import(self): + self.env.company.cassa_previdenziale_product_id = self.service.id + res = self.run_wizard("test0", "IT05979361218_001.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual(invoice.partner_id.register_code, "TO1258B") + self.assertEqual(invoice.partner_id.register_fiscalpos.code, "RF02") + self.assertEqual(invoice.ref, "FT/2015/0006") + self.assertEqual(invoice.payment_reference, "FT/2015/0006") + self.assertEqual(invoice.amount_total, 57.00) + self.assertEqual(invoice.gross_weight, 0.00) + self.assertEqual(invoice.net_weight, 0.00) + self.assertEqual(invoice.welfare_fund_ids[0].kind_id.code, "N4") + self.assertFalse(invoice.art73) + welfare_found = False + for line in invoice.invoice_line_ids: + if line.product_id.id == self.service.id: + self.assertEqual(line.price_unit, 3) + welfare_found = True + self.assertTrue(welfare_found) + self.assertTrue(len(invoice.e_invoice_line_ids) == 1) + self.assertEqual( + invoice.e_invoice_line_ids[0].name, "Prodotto di test al giorno" + ) + self.assertEqual(invoice.e_invoice_line_ids[0].qty, 15) + self.assertEqual(invoice.e_invoice_line_ids[0].uom, "Giorno(i)") + self.assertEqual(invoice.e_invoice_line_ids[0].unit_price, 3.6) + self.assertEqual(invoice.e_invoice_line_ids[0].total_price, 54) + self.assertEqual(invoice.e_invoice_line_ids[0].tax_amount, 0) + self.assertEqual(invoice.e_invoice_line_ids[0].tax_kind, "N4") + self.assertTrue(len(invoice.e_invoice_line_ids[0].other_data_ids) == 2) + self.assertEqual( + invoice.e_invoice_line_ids[0].other_data_ids[0].text_ref, "Riferimento" + ) + # allow following tests to reuse the same XML file + invoice.ref = invoice.payment_reference = "14001" + + def test_01_xml_import(self): + res = self.run_wizard("test1", "IT02780790107_11004.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual(invoice.ref, "123") + self.assertEqual(invoice.payment_reference, "123") + self.assertEqual(invoice.amount_untaxed, 34.00) + self.assertEqual(invoice.amount_tax, 7.48) + self.assertEqual(len(invoice.invoice_line_ids[0].tax_ids), 1) + self.assertEqual(invoice.invoice_line_ids[0].tax_ids[0].name, "22% e-bill") + self.assertEqual(invoice.fatturapa_summary_ids[0].amount_untaxed, 34.00) + self.assertEqual(invoice.fatturapa_summary_ids[0].amount_tax, 7.48) + self.assertEqual(invoice.fatturapa_summary_ids[0].payability, "D") + self.assertEqual(invoice.partner_id.name, "SOCIETA' ALPHA SRL") + self.assertEqual(invoice.partner_id.street, "VIALE ROMA 543") + self.assertEqual(invoice.partner_id.state_id.code, "SS") + self.assertEqual(invoice.partner_id.country_id.code, "IT") + self.assertEqual(invoice.partner_id.vat, "IT02780790107") + self.assertEqual(invoice.tax_representative_id.name, "Rappresentante fiscale") + self.assertEqual(invoice.welfare_fund_ids[0].welfare_rate_tax, 0.04) + order_related_doc = invoice.related_documents.filtered( + lambda rd: rd.type == "order" + ) + self.assertTrue(order_related_doc) + self.assertEqual(order_related_doc.cig, "456def") + self.assertEqual(order_related_doc.cup, "123abc") + self.assertEqual(invoice.welfare_fund_ids[0].welfare_amount_tax, 9) + self.assertFalse(invoice.welfare_fund_ids[0].welfare_taxable) + self.assertEqual(invoice.unit_weight, "KGM") + self.assertEqual(invoice.ftpa_incoterms, "DAP") + self.assertEqual(invoice.fiscal_document_type_id.code, "TD01") + self.assertTrue(invoice.art73) + # allow following tests to reuse the same XML file + invoice.ref = invoice.payment_reference = "14011" + + def test_02_xml_import(self): + res = self.run_wizard("test02", "IT05979361218_011.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual(invoice.intermediary.vat, "IT03339130126") + + def test_04_xml_import(self): + res = self.run_wizard("test4", "IT02780790107_11005.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual(invoice.ref, "124") + self.assertEqual(invoice.payment_reference, "124") + self.assertEqual(invoice.partner_id.name, "SOCIETA' ALPHA SRL") + self.assertEqual(invoice.invoice_line_ids[0].tax_ids[0].name, "22% e-bill") + self.assertEqual(invoice.invoice_line_ids[1].tax_ids[0].name, "22% e-bill") + self.assertEqual(invoice.invoice_line_ids[0].tax_ids[0].amount, 22) + self.assertEqual(invoice.invoice_line_ids[1].tax_ids[0].amount, 22) + self.assertEqual(invoice.invoice_line_ids[1].price_unit, 2) + self.assertTrue(len(invoice.e_invoice_line_ids) == 2) + for e_line in invoice.e_invoice_line_ids: + self.assertTrue(e_line.line_number in (1, 2)) + if e_line.line_number == 1: + self.assertEqual(e_line.cod_article_ids[0].name, "EAN") + self.assertEqual(e_line.cod_article_ids[0].code_val, "12345") + self.assertEqual( + invoice.inconsistencies, + u"Company Name field contains 'Societa' " + u"Alpha SRL'. Your System contains 'SOCIETA' ALPHA SRL'\n\n", + ) + # allow following test to reuse the same XML file + invoice.ref = invoice.payment_reference = "14041" + + def test_05_xml_import(self): + res = self.run_wizard("test5", "IT05979361218_003.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual(invoice.ref, "FT/2015/0008") + self.assertEqual(invoice.payment_reference, "FT/2015/0008") + self.assertEqual(invoice.sender, "TZ") + self.assertEqual(invoice.intermediary.name, "MARIO ROSSI") + self.assertEqual(invoice.intermediary.firstname, "MARIO") + self.assertEqual(invoice.intermediary.lastname, "ROSSI") + self.assertEqual( + invoice.e_invoice_line_ids[0].discount_rise_price_ids[0].name, "SC" + ) + self.assertEqual( + invoice.e_invoice_line_ids[0].discount_rise_price_ids[0].percentage, 10 + ) + self.assertEqual(invoice.amount_untaxed, 9) + self.assertEqual(invoice.amount_tax, 0) + self.assertEqual(invoice.amount_total, 9) + + def test_06_import_except(self): + # File not exist Exception + self.assertRaises(Exception, self.run_wizard, "test6_Exception", "") + # fake Signed file is passed , generate orm_exception + self.assertRaises( + UserError, + self.run_wizard, + "test6_orm_exception", + "IT05979361218_fake.xml.p7m", + ) + + def test_07_xml_import(self): + # 2 lines with quantity != 1 and discounts + res = self.run_wizard("test7", "IT05979361218_004.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual(invoice.ref, "FT/2015/0009") + self.assertEqual(invoice.payment_reference, "FT/2015/0009") + self.assertAlmostEqual(invoice.amount_untaxed, 1173.60) + self.assertEqual(invoice.amount_tax, 258.19) + self.assertEqual(invoice.amount_total, 1431.79) + self.assertAlmostEqual( + invoice.e_invoice_amount_untaxed, + invoice.amount_untaxed, + places=invoice.currency_id.decimal_places, + ) + self.assertAlmostEqual( + invoice.e_invoice_amount_tax, + invoice.amount_tax, + places=invoice.currency_id.decimal_places, + ) + self.assertEqual(invoice.e_invoice_validation_error, False) + self.assertEqual(invoice.invoice_line_ids[0].admin_ref, "D122353") + + def test_08_xml_import(self): + # using ImportoTotaleDocumento + res = self.run_wizard("test8", "IT05979361218_005.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual(invoice.ref, "FT/2015/0010") + self.assertEqual(invoice.payment_reference, "FT/2015/0010") + self.assertAlmostEqual(invoice.amount_total, 1288.61) + self.assertFalse(invoice.inconsistencies) + # allow following test to reuse the same XML file + invoice.ref = invoice.payment_reference = "14081" + + def test_08_xml_import_no_account(self): + """Check that a useful error message is raised when + the credit account is missing in purchase journal.""" + company = self.env.user.company_id + journal = self.wizard_model.get_purchase_journal(company) + journal_account = journal.default_account_id + journal.default_account_id = False + + expense_default_property = self.env["ir.property"]._get_property( + "property_account_expense_categ_id", + "product.category", + res_id=False, + ) + # Setting res_id disables the property from acting as default value + expense_default_property.res_id = 1 + with self.assertRaises(UserError) as ue: + res = self.run_wizard("test8_no_account", "IT05979361218_005.xml") + # allow following code to reuse the same XML file + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + invoice.ref = invoice.payment_reference = "14082" + self.assertIn(journal.display_name, ue.exception.args[0]) + self.assertIn(company.display_name, ue.exception.args[0]) + + discount_amount = -143.18 + + # Restore the property and import the invoice + expense_default_property.res_id = False + res = self.run_wizard("test8_with_property", "IT05979361218_005.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + invoice_lines = invoice.invoice_line_ids + discount_line = invoice_lines.filtered( + lambda line: line.price_unit == discount_amount + ) + self.assertEqual( + discount_line.account_id, + expense_default_property.get_by_record(), + ) + # allow following code to reuse the same XML file + invoice.ref = invoice.payment_reference = "14083" + + # Restore the property and import the invoice + journal.default_account_id = journal_account + res = self.run_wizard("test8_with_journal", "IT05979361218_005.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + invoice_lines = invoice.invoice_line_ids + discount_line = invoice_lines.filtered( + lambda line: line.price_unit == discount_amount + ) + self.assertEqual( + discount_line.account_id, + journal_account, + ) + self.assertTrue(invoice) + # allow following tests to reuse the same XML file + invoice.ref = invoice.payment_reference = "14084" + + def test_09_xml_import(self): + # using DatiGeneraliDocumento.ScontoMaggiorazione without + # ImportoTotaleDocumento + # add test file name case sensitive + res = self.run_wizard("test9", "IT05979361218_006.XML") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual(invoice.ref, "FT/2015/0011") + self.assertEqual(invoice.payment_reference, "FT/2015/0011") + self.assertAlmostEqual(invoice.amount_total, 1288.61) + self.assertEqual( + invoice.inconsistencies, + "Computed amount untaxed 1030.42 is different from" " summary data 1173.6", + ) + + def test_10_xml_import(self): + # Fix Date format + res = self.run_wizard("test6", "IT05979361218_007.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual(invoice.ref, "FT/2015/0009") + self.assertEqual(invoice.payment_reference, "FT/2015/0009") + self.assertEqual(invoice.invoice_date, date(2015, 3, 16)) + self.assertEqual( + invoice.fatturapa_payments[0].payment_methods[0].payment_due_date, + date(2015, 6, 3), + ) + self.assertEqual( + invoice.fatturapa_payments[0].payment_methods[0].fatturapa_pm_id.code, + "MP18", + ) + + def test_11_xml_import(self): + # DatiOrdineAcquisto with RiferimentoNumeroLinea referring to + # not existing invoice line + res = self.run_wizard("test11", "IT02780790107_11006.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual(len(invoice.invoice_line_ids[0].related_documents), 0) + self.assertEqual(invoice.invoice_line_ids[0].sequence, 1) + self.assertEqual(invoice.related_documents[0].type, "order") + self.assertEqual(invoice.related_documents[0].lineRef, 60) + # allow following tests to reuse the same XML file + invoice.ref = invoice.payment_reference = "14111" + + def test_12_xml_import(self): + res = self.run_wizard("test12", "IT05979361218_008.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual(invoice.payment_reference, "FT/2015/0012") + self.assertEqual(invoice.sender, "TZ") + self.assertEqual(invoice.intermediary.name, "MARIO ROSSI") + self.assertEqual(invoice.intermediary.firstname, "MARIO") + self.assertEqual(invoice.intermediary.lastname, "ROSSI") + + def test_13_xml_import(self): + # inconsistencies must not be duplicated + res = self.run_wizard_multi( + [ + "IT02780790107_11005.xml", + "IT02780790107_11006.xml", + ] + ) + invoice1_id = res.get("domain")[0][2][0] + invoice2_id = res.get("domain")[0][2][1] + invoice1 = self.invoice_model.browse(invoice1_id) + invoice2 = self.invoice_model.browse(invoice2_id) + self.assertEqual( + invoice1.inconsistencies, + u"Company Name field contains 'Societa' " + u"Alpha SRL'. Your System contains 'SOCIETA' ALPHA SRL'\n\n", + ) + self.assertEqual( + invoice2.inconsistencies, + u"Company Name field contains 'Societa' " + u"Alpha SRL'. Your System contains 'SOCIETA' ALPHA SRL'\n\n", + ) + + def test_14_xml_import(self): + # check: no tax code found , write inconsisteance and anyway + # create draft + res = self.run_wizard("test14", "IT02780790107_11007.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual(invoice.ref, "136") + self.assertEqual(invoice.payment_reference, "136") + self.assertEqual(invoice.partner_id.name, "SOCIETA' ALPHA SRL") + self.assertEqual(invoice.amount_untaxed, 25.00) + self.assertEqual(invoice.amount_tax, 0.0) + self.assertEqual( + invoice.inconsistencies, + u"Company Name field contains 'Societa' " + "Alpha SRL'. Your System contains 'SOCIETA' ALPHA SRL'\n\n" + u"XML contains tax with percentage '15.55'" + " but it does not exist in your system\n" + "XML contains tax with percentage '15.55'" + " but it does not exist in your system", + ) + + def test_15_xml_import(self): + self.wt = self.create_wt() + res = self.run_wizard("test15", "IT05979361218_009.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertAlmostEqual(invoice.withholding_tax_amount, 1) + self.assertAlmostEqual(invoice.amount_total, 6.1) + self.assertAlmostEqual(invoice.amount_net_pay, 5.1) + + def test_16_xml_import(self): + # file B2B downloaded from + # http://www.fatturapa.gov.it/export/fatturazione/it/a-3.htm + res = self.run_wizard("test16a", "IT01234567890_FPR03.xml") + invoice_ids = res.get("domain")[0][2] + invoices = self.invoice_model.browse(invoice_ids) + self.assertEqual(len(invoices), 2) + for invoice in invoices: + self.assertEqual(invoice.inconsistencies, "") + self.assertEqual(invoice.partner_id.name, "SOCIETA' ALPHA SRL") + self.assertTrue(invoice.ref in ("456", "123")) + self.assertTrue(invoice.payment_reference in ("456", "123")) + if invoice.ref == "123": + self.assertTrue(len(invoice.invoice_line_ids) == 2) + for line in invoice.invoice_line_ids: + self.assertFalse(line.product_id) + self.assertEqual(invoice.invoice_date_due, date(2015, 1, 30)) + if invoice.ref == "456": + self.assertTrue(len(invoice.invoice_line_ids) == 1) + for line in invoice.invoice_line_ids: + self.assertFalse(line.product_id) + self.assertEqual(invoice.invoice_date_due, date(2015, 1, 28)) + # allow following code to reuse the same XML file + invoices[0].ref = invoices[0].payment_reference = "14161" + invoices[1].ref = invoices[1].payment_reference = "14162" + + partner = invoice.partner_id + partner.e_invoice_default_product_id = self.imac.product_variant_ids[0].id + # I create a supplier code to be matched in XML + self.env["product.supplierinfo"].create( + { + "name": partner.id, + "product_tmpl_id": self.headphones.id, + "product_code": "ART123", + } + ) + res = self.run_wizard("test16b", "IT01234567890_FPR03.xml") + invoice_ids = res.get("domain")[0][2] + invoices = self.invoice_model.browse(invoice_ids) + for invoice in invoices: + self.assertTrue(invoice.ref in ("456", "123")) + self.assertTrue(invoice.payment_reference in ("456", "123")) + if invoice.ref == "123": + self.assertEqual( + invoice.invoice_line_ids[0].product_id.id, + self.headphones.product_variant_ids[0].id, + ) + else: + for line in invoice.invoice_line_ids: + self.assertEqual( + line.product_id.id, self.imac.product_variant_ids[0].id + ) + # allow following code to reuse the same XML file + invoices[0].ref = invoices[0].payment_reference = "14163" + invoices[1].ref = invoices[1].payment_reference = "14164" + + # change Livello di dettaglio Fatture elettroniche to Minimo + partner.e_invoice_detail_level = "0" + res = self.run_wizard("test16c", "IT01234567890_FPR03.xml") + invoice_ids = res.get("domain")[0][2] + invoices = self.invoice_model.browse(invoice_ids) + self.assertTrue(len(invoices) == 2) + for invoice in invoices: + self.assertTrue(len(invoice.invoice_line_ids) == 0) + # allow following tests to reuse the same XML file + invoices[0].ref = invoices[0].payment_reference = "14165" + invoices[1].ref = invoices[1].payment_reference = "14166" + + def test_03_xml_import(self): + # Testing CAdES signature + res = self.run_wizard("test18", "IT01234567890_FPR03.xml.p7m") + invoice_ids = res.get("domain")[0][2] + invoices = self.invoice_model.browse(invoice_ids) + self.assertEqual(len(invoices), 2) + for invoice in invoices: + self.assertEqual(invoice.inconsistencies, "") + self.assertEqual(invoice.partner_id.name, "SOCIETA' ALPHA SRL") + self.assertTrue(invoice.ref in ("456", "123")) + self.assertTrue(invoice.payment_reference in ("456", "123")) + if invoice.ref == "123": + self.assertTrue(len(invoice.invoice_line_ids) == 2) + if invoice.ref == "456": + self.assertTrue(len(invoice.invoice_line_ids) == 1) + # allow following tests to reuse the same XML file + invoices[0].ref = invoices[0].payment_reference = "14031" + invoices[1].ref = invoices[1].payment_reference = "14032" + + def test_17_xml_import(self): + res = self.run_wizard("test17", "IT05979361218_010.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual(invoice.related_documents[0].type, "invoice") + + def test_19_xml_import(self): + # Testing CAdES signature, base64 encoded + res = self.run_wizard( + "test19", + "IT01234567890_FPR03.base64.xml.p7m", + ) + invoice_ids = res.get("domain")[0][2] + invoices = self.invoice_model.browse(invoice_ids) + self.assertEqual(len(invoices), 2) + for invoice in invoices: + self.assertEqual(invoice.partner_id.name, "SOCIETA' ALPHA SRL") + self.assertEqual(invoice.partner_id.e_invoice_detail_level, "0") + self.assertTrue(invoice.ref in ("456", "123")) + self.assertTrue(invoice.payment_reference in ("456", "123")) + if invoice.ref == "123": + self.assertEqual( + invoice.inconsistencies, + "Computed amount untaxed 0.0 is different from summary " + "data 25.0", + ) + if invoice.ref == "456": + self.assertEqual( + invoice.inconsistencies, + "Computed amount untaxed 0.0 is different from summary " + "data 2000.0", + ) + # allow following tests to reuse the same XML file + invoices[0].ref = invoices[0].payment_reference = "14191" + invoices[1].ref = invoices[1].payment_reference = "14192" + + def test_20_xml_import(self): + # Testing xml without xml declaration (sent by Amazon) + res = self.run_wizard("test20", "IT05979361218_no_decl.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual(invoice.partner_id.name, "SOCIETA' ALPHA SRL") + + def test_21_xml_import(self): + supplier = self.env["res.partner"].search([("vat", "=", "IT02780790107")])[0] + # in order to make the system create the invoice lines + supplier.e_invoice_detail_level = "2" + res = self.run_wizard("test21", "IT01234567890_FPR04.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual(invoice.inconsistencies, "") + self.assertEqual(invoice.invoice_line_ids[2].price_unit, 0.0) + self.assertEqual(invoice.invoice_line_ids[2].discount, 0.0) + + def test_22_xml_import(self): + res = self.run_wizard("test22", "IT02780790107_11004_xml_doctor.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + + self.assertEqual(invoice.partner_id.name, "SOCIETA' ALPHA SRL") + + self.assertIn("removed timezone information", invoice.inconsistencies) + + # DatiGeneraliDocumento/Causale + self.assertIn(" ", invoice.narration) + + # DatiGeneraliDocumento/Data + self.assertEqual(invoice.invoice_date, date(2014, 12, 18)) + + # DatiTrasporto/IndirizzoResa/NumeroCivico + self.assertEqual( + invoice.delivery_address, "strada dei test, \n12042 - Bra\nCN IT" + ) + + # DatiTrasporto/DataOraConsegna + self.assertFalse(invoice.delivery_datetime) + + # DatiBeniServizi/DettaglioLinee/Descrizione + + # test commented because I'n not sure about expected behavior on 14.0 + # actually, name is recalculated based product (see + # account._move_autocomplete_invoice_lines_values) + # self.assertEqual(invoice.invoice_line_ids[0].name, " ") + + # DatiPagamento/DettaglioPagamento/DataDecorrenzaPenale + payment_data = self.env["fatturapa.payment.data"].search( + [("invoice_id", "=", invoice.id)] + ) + self.assertEqual( + payment_data[0].payment_methods[0].penalty_date, date(2015, 5, 1) + ) + # allow following tests to reuse the same XML file + invoice.ref = invoice.payment_reference = "14221" + + def test_23_xml_import(self): + # Testing CAdES signature, base64 encoded with newlines + res = self.run_wizard( + "test23", + "IT01234567890_FPR04.base64.xml.p7m", + ) + invoice_ids = res.get("domain")[0][2] + invoices = self.invoice_model.browse(invoice_ids) + self.assertEqual(len(invoices), 2) + # allow following tests to reuse the same XML file + invoices[0].ref = invoices[0].payment_reference = "14231" + invoices[1].ref = invoices[1].payment_reference = "14232" + + def test_24_xml_import(self): + res = self.run_wizard("test24", "IT05979361218_012.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual( + invoice.inconsistencies, + "Computed amount untaxed 34.32 is different from" " summary data 34.67", + ) + + def test_25_xml_import(self): + res = self.run_wizard("test25", "IT05979361218_013.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertAlmostEqual(invoice.e_invoice_amount_untaxed, 34.67) + self.assertEqual(invoice.e_invoice_amount_tax, 0.0) + self.assertEqual(invoice.e_invoice_amount_total, 34.32) + self.assertEqual(invoice.efatt_rounding, -0.35) + invoice.action_post() + move_line = False + for line in invoice.line_ids: + if ( + line.account_id.id + == self.env.company.arrotondamenti_attivi_account_id.id + ): + move_line = True + self.assertTrue(move_line) + + def test_26_xml_import(self): + res = self.run_wizard("test26", "IT05979361218_015.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertAlmostEqual(invoice.e_invoice_amount_untaxed, 34.32) + self.assertEqual(invoice.e_invoice_amount_tax, 0.0) + self.assertEqual(invoice.e_invoice_amount_total, 34.32) + + def test_30_xml_import(self): + self.env.company.cassa_previdenziale_product_id = self.service.id + res = self.run_wizard("test30", "IT05979361218_001.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + partner_id = invoice.partner_id + partner_id.write( + { + "street": "Viale Repubblica, 34", + "electronic_invoice_no_contact_update": True, + } + ) + # allow following tests to reuse the same XML file + invoice.ref = invoice.payment_reference = "14301" + + res = self.run_wizard("test30a", "IT05979361218_002.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual(invoice.partner_id.id, partner_id.id) + self.assertEqual(invoice.partner_id.street, "Viale Repubblica, 34") + # allow following tests to reuse the same XML file + invoice.ref = invoice.payment_reference = "14302" + + def test_31_xml_import(self): + res = self.run_wizard("test31", "IT01234567890_FPR05.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual(invoice.invoice_line_ids[1].discount, 100) + self.assertEqual(invoice.invoice_line_ids[1].price_subtotal, 0) + self.assertEqual(round(invoice.amount_total, 2), 12.2) + + def test_32_xml_import(self): + # Refund with positive total + res = self.run_wizard("test32", "IT01234567890_FPR06.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual(invoice.move_type, "in_refund") + self.assertEqual(invoice.amount_total, 18.3) + self.assertEqual(invoice.invoice_line_ids[0].price_unit, 2.0) + self.assertEqual(invoice.invoice_line_ids[0].quantity, 10.0) + self.assertEqual(invoice.invoice_line_ids[0].price_subtotal, 20.0) + self.assertEqual(invoice.invoice_line_ids[1].price_unit, -1.0) + self.assertEqual(invoice.invoice_line_ids[1].quantity, 5.0) + self.assertEqual(invoice.invoice_line_ids[1].price_subtotal, -5.0) + + def test_33_xml_import(self): + # Refund with negative total + res = self.run_wizard("test33", "IT01234567890_FPR07.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual(invoice.move_type, "in_refund") + self.assertEqual(round(invoice.amount_total, 2), 24.4) + self.assertEqual(invoice.invoice_line_ids[0].price_unit, 2.0) + self.assertEqual(invoice.invoice_line_ids[0].quantity, 10.0) + self.assertEqual(invoice.invoice_line_ids[0].price_subtotal, 20.0) + self.assertEqual(invoice.e_invoice_amount_untaxed, -20.0) + self.assertEqual(invoice.e_invoice_amount_tax, -4.4) + + def test_34_xml_import(self): + # No Ritenuta lines set + res = self.run_wizard("test34", "IT01234567890_FPR08.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertTrue(invoice.e_invoice_validation_error) + self.assertEqual( + invoice.e_invoice_validation_message, + "E-bill contains DatiRitenuta but no lines subjected to Ritenuta was " + "found. Please manually check Withholding tax Amount\nE-bill contains " + "ImportoRitenuta 360.0 but created invoice has got 0.0\n.", + ) + + def test_35_xml_import(self): + # creating 2350 before 2320, so odoo will use 2350 but e-invoices + # contains 2320: error message must appear + self.create_wt_23_50() + self.create_wt_23_20() + res = self.run_wizard("test35", "IT01234567890_FPR09.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertTrue(invoice.e_invoice_validation_error) + self.assertEqual( + invoice.e_invoice_validation_message, + "E-bill contains ImportoRitenuta 30.16 but created invoice has got " + "75.41\n.", + ) + + def test_36_xml_import(self): + # creating a res.bank and importing an XML without "IstitutoFinanziario" + self.create_res_bank() + res = self.run_wizard("test36", "IT01234567890_FPR10.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual( + invoice.fatturapa_payments[0].payment_methods[0].payment_bank.bank_id.bic, + "BCITITMM", + ) + self.assertEqual( + invoice.fatturapa_payments[0].payment_methods[0].payment_bank.bank_id.name, + "Banca generica", + ) + + def test_37_xml_import_dates(self): + self.env.user.lang = "it_IT" + res = self.run_wizard("test37", "IT02780790107_11004.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual(invoice.fatturapa_attachment_in_id.invoices_date, "18/12/2014") + # allow following tests to reuse the same XML file + invoice.ref = invoice.payment_reference = "14371" + + def test_38_xml_import_dates(self): + # file B2B downloaded from + # http://www.fatturapa.gov.it/export/fatturazione/it/a-3.htm + self.env.user.lang = "it_IT" + res = self.run_wizard("test38", "IT01234567890_FPR03.xml") + invoice_ids = res.get("domain")[0][2] + invoices = self.invoice_model.browse(invoice_ids) + self.assertEqual(len(invoices), 2) + self.assertEqual( + invoices[0].fatturapa_attachment_in_id.invoices_date, + "18/12/2014 20/12/2014", + ) + # allow following tests to reuse the same XML file + invoices[0].ref = invoices[0].payment_reference = "14381" + invoices[1].ref = invoices[1].payment_reference = "14382" + + def test_40_xml_import_withholding(self): + res = self.run_wizard("test40", "IT01234567890_FPR11.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertTrue(invoice.e_invoice_validation_error) + self.assertEqual( + invoice.e_invoice_validation_message, + "E-bill contains ImportoRitenuta 92.0 but created invoice has got " + "144.0\n.", + ) + + def test_41_xml_import_withholding(self): + res = self.run_wizard("test41", "IT01234567890_FPR12.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertTrue(len(invoice.ftpa_withholding_ids), 2) + self.assertAlmostEqual(invoice.amount_total, 1220.0) + self.assertAlmostEqual(invoice.withholding_tax_amount, 94.0) + self.assertAlmostEqual(invoice.amount_net_pay, 1126.0) + + def test_42_xml_import_withholding(self): + # cassa previdenziale sulla quale è applicata la ritenuta + res = self.run_wizard("test42", "IT01234567890_FPR13.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual(invoice.amount_total, 19032.0) + self.assertEqual(invoice.withholding_tax_amount, 3120.0) + self.assertEqual(invoice.amount_net_pay, 15912.0) + self.assertTrue(len(invoice.ftpa_withholding_ids), 1) + self.assertTrue(len(invoice.invoice_line_ids) == 2) + + def test_43_xml_import_withholding(self): + # Avvocato Mario Bianchi di Ferrara. + # Imponibile di 100+15% spese + res = self.run_wizard("test43", "ITBNCMRA80A01D548T_20001.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual(invoice.withholding_tax_amount, 23.0) + self.assertTrue(len(invoice.ftpa_withholding_ids), 1) + self.assertTrue(len(invoice.invoice_line_ids) == 3) + + def test_44_xml_import(self): + res = self.run_wizard("test44", "ITBNCMRA80A01D548T_20005.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertTrue(len(invoice.invoice_line_ids) == 3) + + def test_45_xml_import_no_duplicate_partner(self): + partner_id = self.env["res.partner"].search([("vat", "ilike", "05979361218")]) + if not partner_id: + # load bill (when this test is run by itself) + res = self.run_wizard("test45a", "IT05979361218_001.xml") + partner_id = self.env["res.partner"].search( + [("vat", "ilike", "05979361218")] + ) + # allow following code to reuse the same XML file + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + invoice.ref = invoice.payment_reference = "14451" + + # try and alter the vat of the existing partner + partner_id.write({"vat": " %s " % partner_id.vat}) + + # load bill (2nd time) + res = self.run_wizard("test45b", "IT05979361218_001.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + + # check for duplicates + self.assertEqual(invoice.partner_id.id, partner_id.id) + self.assertEqual( + len(self.env["res.partner"].search([("vat", "ilike", "05979361218")])), 1 + ) + + def test_46_xml_many_zeros(self): + res = self.run_wizard("test46", "IT05979361218_016.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual(invoice.amount_total, 18.07) + self.assertEqual(invoice.invoice_line_ids[0].price_unit, 18.07) + self.assertEqual(invoice.invoice_line_ids[0].quantity, 1.0) + self.assertEqual(invoice.invoice_line_ids[0].price_subtotal, 18.07) + self.assertEqual(invoice.invoice_line_ids[1].price_unit, 16.60) + self.assertEqual(invoice.invoice_line_ids[1].quantity, 1.0) + self.assertEqual(invoice.invoice_line_ids[1].price_subtotal, 0.0) + + def test_47_xml_import(self): + res = self.run_wizard("test47", "IT01234567890_FPR14.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertTrue(invoice.e_invoice_validation_error) + self.assertTrue( + "Untaxed amount (44480.0) does not match with e-bill untaxed amount " + "(44519.26)" in invoice.e_invoice_validation_message + ) + # Due to multiple SQL transactions, we cannot test the correct importation. + # IT01234567890_FPR14.xml should be tested manually + + def test_48_xml_import(self): + # my company bank account is the same as the one in XML: + # invoice creation must not be blocked + self.env["res.partner.bank"].create( + { + "acc_number": "IT59R0100003228000000000622", + "company_id": self.env.user.company_id.id, + "partner_id": self.env.user.company_id.partner_id.id, + } + ) + res = self.run_wizard("test48", "IT01234567890_FPR15.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertTrue( + "Bank account IT59R0100003228000000000622 already exists" + in invoice.inconsistencies + ) + + def test_01_xml_link(self): + """ + E-invoice lines are created. + Vendor Reference and Invoice Date are kept. + """ + + supplier = self.env["res.partner"].search( + [("vat", "=", "IT02780790107")], limit=1 + ) + invoice_form = Form( + self.invoice_model.with_context(default_move_type="in_invoice") + ) + invoice_form.partner_id = supplier + invoice_form.ref = "original_ref" + invoice_form.payment_reference = "original_ref" + invoice_form.invoice_date = date(2020, 1, 1) + orig_invoice = invoice_form.save() + wizard_line_form = Form(self.wizard_link_inv_line_model) + wizard_line_form.invoice_id = orig_invoice + line_id = wizard_line_form.save() + self.run_wizard( + "test_link_01", + "IT01234567890_FPR04.xml", + mode="link", + wiz_values=line_id, + ) + self.assertTrue(orig_invoice.e_invoice_line_ids) + self.assertFalse(orig_invoice.invoice_line_ids) + self.assertTrue(orig_invoice.e_invoice_validation_error) + self.assertEqual( + invoice_form.ref, + orig_invoice.ref, + ) + self.assertEqual( + invoice_form.payment_reference, + orig_invoice.payment_reference, + ) + + def test_02_xml_link(self): + """ + E-invoice lines are created. + Vendor Reference and Invoice Date are fetched from the XML. + """ + + supplier = self.env["res.partner"].search( + [("vat", "=", "IT02780790107")], limit=1 + ) + invoice_form = Form( + self.invoice_model.with_context(default_move_type="in_invoice") + ) + invoice_form.partner_id = supplier + orig_invoice = invoice_form.save() + wizard_line_form = Form(self.wizard_link_inv_line_model) + wizard_line_form.invoice_id = orig_invoice + line_id = wizard_line_form.save() + self.run_wizard( + "test_link_02", + "IT02780790107_11004.xml", + mode="link", + wiz_values=line_id, + ) + self.assertTrue(orig_invoice.e_invoice_line_ids) + self.assertFalse(orig_invoice.invoice_line_ids) + self.assertTrue(orig_invoice.e_invoice_validation_error) + self.assertTrue(orig_invoice.ref) + self.assertTrue(orig_invoice.payment_reference) + self.assertTrue(orig_invoice.invoice_date) + # allow following tests to reuse the same XML file + orig_invoice.ref = orig_invoice.payment_reference = "14021" + + def test_01_xml_zero_quantity_line(self): + res = self.run_wizard("test_zeroq_01", "IT05979361218_q0.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual(invoice.invoice_line_ids[0].quantity, 0) + self.assertEqual(invoice.invoice_line_ids[1].quantity, 1) + + def test_xml_import_summary_tax_rate(self): + # Invoice with positive total. Detail Level: '1' -- Tax Rate + supplier = self.env["res.partner"].search([("vat", "=", "IT02780790107")])[0] + # in order to make the system create the invoice lines + supplier.e_invoice_detail_level = "1" + res = self.run_wizard("test_summary_tax_rate", "IT05979361218_ripilogoiva.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual(invoice.amount_total, 204.16) + self.assertEqual(len(invoice.invoice_line_ids), 2) + + self.assertEqual(invoice.invoice_line_ids[0].price_unit, 164.46) + self.assertEqual(invoice.invoice_line_ids[0].quantity, 1.0) + self.assertEqual(invoice.invoice_line_ids[1].price_unit, 3.52) + self.assertEqual(invoice.invoice_line_ids[1].quantity, 1.0) + + +class TestFatturaPAEnasarco(FatturapaCommon): + def setUp(self): + super(TestFatturaPAEnasarco, self).setUp() + + self.invoice_model = self.env["account.move"] + + def test_01_xml_import_enasarco(self): + account_payable = self.env["account.account"].create( + { + "name": "Test WH tax", + "code": "whtaxpay2", + "user_type_id": self.env.ref("account.data_account_type_payable").id, + "reconcile": True, + } + ) + account_receivable = self.env["account.account"].create( + { + "name": "Test WH tax", + "code": "whtaxrec2", + "user_type_id": self.env.ref("account.data_account_type_receivable").id, + "reconcile": True, + } + ) + misc_journal = self.env["account.journal"].search([("code", "=", "MISC")]) + self.env["withholding.tax"].create( + { + "name": "Enasarco", + "code": "TC07", + "account_receivable_id": account_receivable.id, + "account_payable_id": account_payable.id, + "journal_id": misc_journal.id, + "payment_term": self.env.ref("account.account_payment_term_advance").id, + "wt_types": "enasarco", + "payment_reason_id": self.env.ref("l10n_it_payment_reason.r").id, + "rate_ids": [ + ( + 0, + 0, + { + "tax": 1.57, + "base": 1.0, + }, + ) + ], + } + ) + self.env["withholding.tax"].create( + { + "name": "Enasarco 8,50", + "code": "TC07", + "account_receivable_id": account_receivable.id, + "account_payable_id": account_payable.id, + "journal_id": misc_journal.id, + "payment_term": self.env.ref("account.account_payment_term_advance").id, + "wt_types": "enasarco", + "payment_reason_id": self.env.ref("l10n_it_payment_reason.r").id, + "rate_ids": [ + ( + 0, + 0, + { + "tax": 8.5, + "base": 1.0, + }, + ) + ], + } + ) + self.env["withholding.tax"].create( + { + "name": "1040/3", + "code": "1040", + "account_receivable_id": account_receivable.id, + "account_payable_id": account_payable.id, + "journal_id": misc_journal.id, + "payment_term": self.env.ref("account.account_payment_term_advance").id, + "wt_types": "ritenuta", + "payment_reason_id": self.env.ref("l10n_it_payment_reason.a").id, + "rate_ids": [ + ( + 0, + 0, + { + "tax": 11.50, + "base": 1.0, + }, + ) + ], + } + ) + self.env["withholding.tax"].create( + { + "name": "1040 R", + "code": "1040R", + "account_receivable_id": account_receivable.id, + "account_payable_id": account_payable.id, + "journal_id": misc_journal.id, + "payment_term": self.env.ref("account.account_payment_term_advance").id, + "wt_types": "ritenuta", + "payment_reason_id": self.env.ref("l10n_it_payment_reason.r").id, + "rate_ids": [ + ( + 0, + 0, + { + "tax": 11.50, + "base": 1.0, + }, + ) + ], + } + ) + # case with ENASARCO only in DatiCassaPrevidenziale and not in DatiRitenuta. + # This should not happen, but it is valid for SDI + res = self.run_wizard("test01", "IT05979361218_014.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual(invoice.partner_id.name, "SOCIETA' ALPHA SRL") + self.assertEqual(invoice.amount_untaxed, 2470.00) + self.assertEqual(invoice.amount_tax, 543.40) + self.assertEqual(invoice.amount_total, 3013.40) + self.assertEqual(invoice.amount_net_pay, 2729.35) + self.assertEqual(invoice.withholding_tax_amount, 284.05) + self.assertEqual(invoice.welfare_fund_ids[0].kind_id.code, "N2") + self.assertTrue(len(invoice.e_invoice_line_ids) == 1) + self.assertEqual(invoice.e_invoice_line_ids[0].name, "ACCONTO PROVVIGIONI") + self.assertEqual(invoice.e_invoice_line_ids[0].qty, 1.0) + self.assertEqual(invoice.e_invoice_line_ids[0].unit_price, 2470.0) + self.assertEqual(invoice.e_invoice_line_ids[0].total_price, 2470.0) + + def test_02_xml_import_enasarco(self): + # Giacomo Neri, agente di commercio di Firenze. + # Imponibile 10 + res = self.run_wizard("test02", "ITNREGCM80H30D612D_20003.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual(invoice.amount_untaxed, 10.0) + self.assertEqual(invoice.amount_tax, 2.2) + self.assertEqual(round(invoice.amount_total, 2), 12.2) + self.assertEqual(round(invoice.amount_net_pay, 2), 10.2) + self.assertTrue(len(invoice.invoice_line_ids) == 1) + + def test_03_xml_import_enasarco(self): + # Come sopra, ma senza "SI" in riga fattura + res = self.run_wizard("test03", "ITNREGCM80H30D612D_20004.xml") + invoice_id = res.get("domain")[0][2][0] + invoice = self.invoice_model.browse(invoice_id) + self.assertTrue( + "E-bill contains DatiRitenuta but no lines subjected to Ritenuta was found" + in invoice.e_invoice_validation_message + ) + self.assertEqual(round(invoice.amount_total, 2), 12.2) + self.assertEqual(round(invoice.amount_net_pay, 2), 12.2) diff --git a/l10n_it_fatturapa_in/views/account_view.xml b/l10n_it_fatturapa_in/views/account_view.xml new file mode 100644 index 000000000000..95f28157b48c --- /dev/null +++ b/l10n_it_fatturapa_in/views/account_view.xml @@ -0,0 +1,519 @@ + + + + + fatturapa.attachment.in.form + fatturapa.attachment.in + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+ +
+
+ + fatturapa.attachment.in.tree + fatturapa.attachment.in + + + + + + + + + + + + + + fatturapa.attachment.in.search + fatturapa.attachment.in + + + + + + + + + + Incoming E-bill Files + fatturapa.attachment.in + tree,form + {'search_default_to_register': True} + + + + + + account.move.fatturapa.in + account.move + + + + + + + + + + + account.invoice.fatturapa_in + account.move + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + fatturapa.article.code.tree + fatturapa.article.code + + + + + + + + + discount.rise.price.tree + discount.rise.price + + + + + + + + + + einvoice.line.other.data.tree + einvoice.line.other.data + + + + + + + + + +
diff --git a/l10n_it_fatturapa_in/views/company_view.xml b/l10n_it_fatturapa_in/views/company_view.xml new file mode 100644 index 000000000000..7f7af6ed331d --- /dev/null +++ b/l10n_it_fatturapa_in/views/company_view.xml @@ -0,0 +1,103 @@ + + + + + view_account_config_settings_ftpa_in + res.config.settings + + + +
+
+
+
+ Supplier Invoices + +
+ Default products used in electronic supplier invoices +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + diff --git a/l10n_it_fatturapa_in/views/partner_view.xml b/l10n_it_fatturapa_in/views/partner_view.xml new file mode 100644 index 000000000000..3ebd051fef05 --- /dev/null +++ b/l10n_it_fatturapa_in/views/partner_view.xml @@ -0,0 +1,33 @@ + + + + + partner.form.fatturapa.in + res.partner + + + + + + + + + + + + + + + + + + + + + diff --git a/l10n_it_fatturapa_in/wizard/__init__.py b/l10n_it_fatturapa_in/wizard/__init__.py new file mode 100644 index 000000000000..9fd3975db539 --- /dev/null +++ b/l10n_it_fatturapa_in/wizard/__init__.py @@ -0,0 +1,2 @@ +from . import wizard_import_fatturapa +from . import link_to_existing_invoice diff --git a/l10n_it_fatturapa_in/wizard/efattura.py b/l10n_it_fatturapa_in/wizard/efattura.py new file mode 100644 index 000000000000..830465453690 --- /dev/null +++ b/l10n_it_fatturapa_in/wizard/efattura.py @@ -0,0 +1,245 @@ +import logging +import re +from collections.abc import MutableMapping +from datetime import datetime + +import xmlschema +from lxml import etree + +from odoo.modules.module import get_module_resource + +_logger = logging.getLogger(__name__) +_logger.setLevel(logging.DEBUG) + +# XMLSchema del SdI +# Contiene un riferimento ad un'antica spec di xmldsig-core-schema.xsd, non presente +# nei vari XML Catalog recenti, es. sulla mia Fedora 33 +# $ fgrep xmldsig-core-schema.xsd /etc/xml/catalog +# # noqa: B950 +# # noqa: B950 +# L'assenza dell'entry nel Catalog fa sì che il documento venga scaricato +# ogni volta, e - a giudicare dalla lentezza nella risposta - qualcuno +# al w3.org ha notato la cosa (la lentezza è relativa a quel solo URL). +# +# Noi interpretiamo lo Schema due volte, per lxml, per le correzioni +# pre-verifica, e successivamente per xmlschema. Entrambe le librerie hanno +# modalità di modificare il comportamento di download delle import esterne. +# Il file xmldsig-core-schema.xsd locale è ottenuto dall'URL indicato dal SdI. +# Per lxml.etree, va creata al classe Resover. Per xmlschema, si indicano +# le locations aggiuntive. + +_XSD_SCHEMA = "Schema_del_file_xml_FatturaPA_versione_1.2.1.xsd" +_xml_schema_1_2_1 = get_module_resource("l10n_it_fatturapa", "data", "xsd", _XSD_SCHEMA) +_old_xsd_specs = get_module_resource( + "l10n_it_fatturapa", "data", "xsd", "xmldsig-core-schema.xsd" +) + +_logger = logging.getLogger(__name__) + + +def _schema_parse(): + # fix # noqa: B950 + class VeryOldXSDSpecResolverTYVMSdI(etree.Resolver): + def resolve(self, system_url, public_id, context): + if ( + system_url + == "http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/xmldsig-core-schema.xsd" # noqa: B950 + ): + _logger.info( + "mapping URL for %r to local file %r", + system_url, + _old_xsd_specs, + ) + return self.resolve_filename(self._old_xsd_specs, context) + else: + return super().resolve(system_url, public_id, context) + + parser = etree.XMLParser() + parser.resolvers.add(VeryOldXSDSpecResolverTYVMSdI()) + return etree.parse(_xml_schema_1_2_1, parser) + + +_root = _schema_parse() + +date_types = {} +datetime_types = {} + + +def get_parent_element(e): + for ancestor in e.iterancestors(): + if "name" in ancestor.attrib: + return ancestor + + +def get_type_query(e): + return "//*[@type='%s']" % e.attrib["name"] + + +def collect_element(target, element, parent=None): + if parent is None: + parent = get_parent_element(element) + + path = "//{}/{}".format(parent.attrib["name"], element.attrib["name"]) + mandatory = element.attrib.get("minOccurs") != "0" + if path not in target: + target[path] = mandatory + else: + assert target[path] == mandatory, ( + "Element %s is already present with different minOccurs value" % path + ) + + +def collect_elements_by_type_query(target, query): + for element in _root.xpath(query): + parent_type = get_parent_element(element) + for parent in _root.xpath(get_type_query(parent_type)): + collect_element(target, element, parent) + + +def collect_elements_by_type(target, element_type): + collect_elements_by_type_query(target, get_type_query(element_type)) + + +def collect_types(): + # simpleType, we look at the base of restriction + for element_type in _root.findall("//{*}simpleType"): + base = element_type.find("{*}restriction").attrib["base"] + + if base == "xs:date": + collect_elements_by_type(date_types, element_type) + elif base == "xs:dateTime": + collect_elements_by_type(datetime_types, element_type) + + # complexType containing xs:date children + collect_elements_by_type_query(date_types, "//*[@type='xs:date']") + + # complexType containing xs:dateTime children + collect_elements_by_type_query(datetime_types, "//*[@type='xs:dateTime']") + + +def parse_datetime(s): + m = re.match(r"(.*?)(\+|-)(\d+):(\d+)", s) + if m: + s = "".join(m.group(1, 2, 3, 4)) + return datetime.strptime(s, "%Y-%m-%dT%H:%M:%S.%f%z") + + +def _fix_xmlstring(xml_string): + """Possono arrivare dallo SdI URL con entity/caratteri aggiuntivi, + tronchiamo all'URL corretto. + + Sulla sintassi, il W3.org dice: + In general, however, users should assume that the namespace URI is + simply a name, not the address of a document on the Web. + Tuttavia, in questo caso, non è un namespace name deciso arbitrariamente + dall'utente che ha generato l'XML, ma uno specifico URI, + http://www.w3.org/2000/09/xmldsig, perché quello è il namespace previsto + dalle specifiche, anche se il software dell SdI non fa la verifica + dell'URI. + + Il controllo effettuato è che l'URI che arriva inizi per + http://www.w3.org/2000/09/xmldsig, e si tronca il resto. + + HACK2: 0.0000000 rappresentato come 0E-7 da decimal.Decimal + """ + + # xmlns:ds="http://www.w3.org/2000/09/xmldsig#"" + xml_string = xml_string.decode() + # HACK#1 - url invalido + xml_string = re.sub( + r'xmlns:ds="http://www.w3.org/2000/09/xmldsig([^"]*)"', + 'xmlns:ds="http://www.w3.org/2000/09/xmldsig#"', + xml_string, + ) + xml_string = re.sub( + r"xmlns:ds='http://www.w3.org/2000/09/xmldsig([^']*)'", + "xmlns:ds='http://www.w3.org/2000/09/xmldsig#'", + xml_string, + ) + return xml_string.encode() + + +def CreateFromDocument(xml_string): # noqa: C901 + # il codice seguente rimpiazza fatturapa.CreateFromDocument(xml_string) + class ObjectDict(MutableMapping): + def __getattr__(self, attr): + try: + return getattr(self.__dict__, attr) + except AttributeError: + return None + + def __getitem__(self, *attr, **kwattr): + return self.__dict__.__getitem__(*attr, **kwattr) + + def __setitem__(self, *attr, **kwattr): + return self.__dict__.__setitem__(*attr, **kwattr) + + def __delitem__(self, *attr, **kwattr): + return self.__dict__.__delitem__(*attr, **kwattr) + + def __iter__(self, *attr, **kwattr): + return self.__dict__.__iter__(*attr, **kwattr) + + def __len__(self, *attr, **kwattr): + return self.__dict__.__len__(*attr, **kwattr) + + # TODO: crearlo una tantum? + validator = xmlschema.XMLSchema( + _xml_schema_1_2_1, + locations={"http://www.w3.org/2000/09/xmldsig#": _old_xsd_specs}, + ) + + xml_string = _fix_xmlstring(xml_string) + root = etree.fromstring(xml_string) + + problems = [] + tree = etree.ElementTree(root) + + # remove timezone from type `xs:date` if any or + # pyxb will fail to compare with + for path, _mandatory in date_types.items(): + for element in root.xpath(path): + result = element.text.strip() + if len(result) > 10: + msg = ( + "removed timezone information from date only element " + "%s: %s" % (tree.getpath(element), element.text) + ) + problems.append(msg) + element.text = result[:10] + + # remove bogus dates accepted by ADE but not by python + for path, mandatory in datetime_types.items(): + for element in root.xpath(path): + try: + d = parse_datetime(element.text) + if d < parse_datetime("1970-01-01T00:00:00.000+0000"): + raise ValueError + except Exception as e: + element_path = tree.getpath(element) + if mandatory: + _logger.error( + "element %s is invalid but is mandatory: " + "%s" % (element_path, element.text) + ) + else: + element.getparent().remove(element) + msg = "removed invalid dateTime element {}: {} ({})".format( + element_path, + element.text, + e, + ) + problems.append(msg) + _logger.warning(msg) + + # fix trailing spaces in + for pec in root.xpath("//PECDestinatario"): + pec.text = pec.text.rstrip() + + validat = validator.to_dict(tree, dict_class=ObjectDict) + validat._xmldoctor = problems + return validat + + +collect_types() diff --git a/l10n_it_fatturapa_in/wizard/link_to_existing_invoice.py b/l10n_it_fatturapa_in/wizard/link_to_existing_invoice.py new file mode 100644 index 000000000000..7749f42ce2b9 --- /dev/null +++ b/l10n_it_fatturapa_in/wizard/link_to_existing_invoice.py @@ -0,0 +1,147 @@ +from odoo import api, fields, models +from odoo.exceptions import UserError +from odoo.tools.translate import _ + +from . import efattura + + +def get_invoice_obj(fatturapa_attachment): + xml_string = fatturapa_attachment.get_xml_string() + return efattura.CreateFromDocument(xml_string) + + +class WizardLinkToInvoiceLine(models.TransientModel): + _name = "wizard.link.to.invoice.line" + _description = "Link e-bill to bill" + + wizard_id = fields.Many2one( + comodel_name="wizard.link.to.invoice", + ) + e_invoice_nbr = fields.Integer( + string="Bill number in XML", + readonly=True, + ) + e_invoice_descr = fields.Text( + string="E-bill description", + readonly=True, + ) + invoice_id = fields.Many2one( + comodel_name="account.move", + ) + + def link(self): + self.ensure_one() + if not self.invoice_id: + return True + fatturapa_attachment = self.wizard_id.attachment_id + import_wiz = ( + self.env["wizard.import.fatturapa"] + .with_context( + active_ids=fatturapa_attachment.ids, + linked_invoice=self.invoice_id, + ) + .new( + { + "e_invoice_detail_level": "2", + } + ) + ) + fatt = get_invoice_obj(fatturapa_attachment) + FatturaBody = fatt.FatturaElettronicaBody[self.e_invoice_nbr] + cedentePrestatore = fatt.FatturaElettronicaHeader.CedentePrestatore + + self.invoice_id.fatturapa_attachment_in_id = fatturapa_attachment + + self.invoice_id.set_einvoice_data(FatturaBody) + + import_wiz.set_vendor_bill_data(FatturaBody, self.invoice_id) + + import_wiz.set_e_invoice_lines(FatturaBody, self.invoice_id) + + import_wiz.set_summary_data(FatturaBody, self.invoice_id) + + import_wiz.set_delivery_data(FatturaBody, self.invoice_id) + + import_wiz.set_payments_data( + FatturaBody, self.invoice_id, self.invoice_id.partner_id.id + ) + + import_wiz.set_activity_progress(FatturaBody, self.invoice_id) + + import_wiz.set_StabileOrganizzazione(cedentePrestatore, self.invoice_id) + + import_wiz.set_efatt_rounding(FatturaBody, self.invoice_id) + + import_wiz.set_art73(FatturaBody, self.invoice_id) + + import_wiz.set_attachments_data(FatturaBody, self.invoice_id) + + return True + + +class WizardLinkToInvoice(models.TransientModel): + _name = "wizard.link.to.invoice" + _description = "Link to Bill" + + attachment_id = fields.Many2one( + comodel_name="fatturapa.attachment.in", + ) + line_ids = fields.One2many( + comodel_name="wizard.link.to.invoice.line", + inverse_name="wizard_id", + ) + + @api.model + def _get_default_lines_vals(self, attachment): + fatt = get_invoice_obj(attachment) + invoice_model = self.env["account.move"] + line_vals = list() + descr_template = _( + "Bill number {bill_nbr} of {bill_date}.\n" + "Total no tax: {bill_no_tax}\n" + "Total tax: {bill_tax}" + ) + for nbr, FatturaBody in enumerate(fatt.FatturaElettronicaBody): + dati_generali_documento = FatturaBody.DatiGenerali.DatiGeneraliDocumento + dati_riepilogo = FatturaBody.DatiBeniServizi.DatiRiepilogo + line_vals.append( + { + "e_invoice_nbr": nbr, + "e_invoice_descr": descr_template.format( + bill_nbr=dati_generali_documento.Numero, + bill_date=dati_generali_documento.Data, + bill_no_tax=invoice_model.compute_xml_amount_untaxed( + FatturaBody + ), + bill_tax=invoice_model.compute_xml_amount_tax(dati_riepilogo), + ), + } + ) + return line_vals + + @api.model + def _get_default_attachment(self): + fatturapa_attachment_id = self.env.context.get("active_ids", []) + if len(fatturapa_attachment_id) != 1: + raise UserError(_("You can select only one XML file to link.")) + fatturapa_attachment_obj = self.env["fatturapa.attachment.in"] + attachment = fatturapa_attachment_obj.browse(fatturapa_attachment_id) + return attachment + + @api.model + def default_get(self, fields_list): + res = super(WizardLinkToInvoice, self).default_get(fields_list) + attachment = self._get_default_attachment() + lines_vals = self._get_default_lines_vals(attachment) + res.update( + { + "attachment_id": attachment.id, + "line_ids": [(0, 0, line_vals) for line_vals in lines_vals], + } + ) + return res + + def link(self): + self.ensure_one() + for line in self.line_ids: + line.link() diff --git a/l10n_it_fatturapa_in/wizard/link_to_existing_invoice.xml b/l10n_it_fatturapa_in/wizard/link_to_existing_invoice.xml new file mode 100644 index 000000000000..5e50077fe5e0 --- /dev/null +++ b/l10n_it_fatturapa_in/wizard/link_to_existing_invoice.xml @@ -0,0 +1,48 @@ + + + + + wizard_link_supplier_invoice + wizard.link.to.invoice + +
+ + + + + + + + + + + +
+
+
+
+
+ + + Link to existing supplier bills + wizard.link.to.invoice + + + form + new + + + +
diff --git a/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py b/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py new file mode 100644 index 000000000000..4ae605bbc5bb --- /dev/null +++ b/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py @@ -0,0 +1,1766 @@ +import logging +import re +from datetime import datetime + +from odoo import api, fields, models, registry +from odoo.exceptions import UserError +from odoo.tools import float_is_zero +from odoo.tools.translate import _ + +from odoo.addons.base_iban.models.res_partner_bank import pretty_iban + +from . import efattura + +_logger = logging.getLogger(__name__) + +WT_CODES_MAPPING = { + "RT01": "ritenuta", + "RT02": "ritenuta", + "RT03": "inps", + "RT04": "enasarco", + "RT05": "enpam", + "RT06": "other", +} + + +class WizardImportFatturapa(models.TransientModel): + _name = "wizard.import.fatturapa" + _description = "Import E-bill" + + e_invoice_detail_level = fields.Selection( + [ + ("0", "Minimum"), + ("1", "Tax rate"), + ("2", "Maximum"), + ], + string="E-bills Detail Level", + help="Minimum level: Bill is created with no lines; " + "User will have to create them, according to what specified in " + "the electronic bill.\n" + "Tax rate level: Rate level: an invoice line is created for each " + "rate present in the electronic invoice\n" + "Maximum level: every line contained in the electronic bill " + "will create a line in the bill.", + required=True, + ) + price_decimal_digits = fields.Integer( + "Prices decimal digits", + required=True, + help="Decimal digits used in prices computation. This is needed to correctly " + "import e-invoices with many decimal digits, not being forced to " + "increase decimal digits of all your prices. " + 'Otherwise, increase "Product Price" precision.', + ) + quantity_decimal_digits = fields.Integer( + "Quantities decimal digits", + required=True, + help='Decimal digits used for quantity field. See "Prices decimal digits".', + ) + discount_decimal_digits = fields.Integer( + "Discounts decimal digits", + required=True, + help='Decimal digits used for discount field. See "Prices decimal digits".', + ) + + @api.model + def default_get(self, fields): + res = super(WizardImportFatturapa, self).default_get(fields) + res["price_decimal_digits"] = self.env["decimal.precision"].precision_get( + "Product Price" + ) + res["quantity_decimal_digits"] = self.env["decimal.precision"].precision_get( + "Product Unit of Measure" + ) + res["discount_decimal_digits"] = self.env["decimal.precision"].precision_get( + "Discount" + ) + res["e_invoice_detail_level"] = "2" + fatturapa_attachment_ids = self.env.context.get("active_ids", False) + fatturapa_attachment_obj = self.env["fatturapa.attachment.in"] + partners = self.env["res.partner"] + for fatturapa_attachment_id in fatturapa_attachment_ids: + fatturapa_attachment = fatturapa_attachment_obj.browse( + fatturapa_attachment_id + ) + if fatturapa_attachment.in_invoice_ids: + raise UserError( + _("File %s is linked to bills yet.") % fatturapa_attachment.name + ) + partners |= fatturapa_attachment.xml_supplier_id + if len(partners) == 1: + res["e_invoice_detail_level"] = partners[0].e_invoice_detail_level + if partners[0].e_invoice_price_decimal_digits >= 0: + res["price_decimal_digits"] = partners[ + 0 + ].e_invoice_price_decimal_digits + if partners[0].e_invoice_quantity_decimal_digits >= 0: + res["quantity_decimal_digits"] = partners[ + 0 + ].e_invoice_quantity_decimal_digits + if partners[0].e_invoice_discount_decimal_digits >= 0: + res["discount_decimal_digits"] = partners[ + 0 + ].e_invoice_discount_decimal_digits + return res + + def CountryByCode(self, CountryCode): + country_model = self.env["res.country"] + return country_model.search([("code", "=", CountryCode)]) + + def ProvinceByCode(self, provinceCode): + province_model = self.env["res.country.state"] + return province_model.search( + [("code", "=", provinceCode), ("country_id.code", "=", "IT")] + ) + + def log_inconsistency(self, message): + inconsistencies = self.env.context.get("inconsistencies", "") + if inconsistencies: + inconsistencies += "\n" + inconsistencies += message + # convert to dict in order to be able to modify context + self.env.context = dict(self.env.context) + self.env.context.update(inconsistencies=inconsistencies) + + def check_partner_base_data(self, partner_id, DatiAnagrafici): + partner = self.env["res.partner"].browse(partner_id) + if ( + DatiAnagrafici.Anagrafica.Denominazione + and partner.name != DatiAnagrafici.Anagrafica.Denominazione + ): + self.log_inconsistency( + _("Company Name field contains '%s'." " Your System contains '%s'") + % (DatiAnagrafici.Anagrafica.Denominazione, partner.name) + ) + if ( + DatiAnagrafici.Anagrafica.Nome + and partner.firstname != DatiAnagrafici.Anagrafica.Nome + ): + self.log_inconsistency( + _("Name field contains '%s'." " Your System contains '%s'") + % (DatiAnagrafici.Anagrafica.Nome, partner.firstname) + ) + if ( + DatiAnagrafici.Anagrafica.Cognome + and partner.lastname != DatiAnagrafici.Anagrafica.Cognome + ): + self.log_inconsistency( + _("Surname field contains '%s'." " Your System contains '%s'") + % (DatiAnagrafici.Anagrafica.Cognome, partner.lastname) + ) + + def getPartnerBase(self, DatiAnagrafici): # noqa: C901 + if not DatiAnagrafici: + return False + partner_model = self.env["res.partner"] + cf = DatiAnagrafici.CodiceFiscale or False + vat = False + if DatiAnagrafici.IdFiscaleIVA: + # Format Italian VAT ID to always have 11 char + # to avoid validation error when creating the given partner + if DatiAnagrafici.IdFiscaleIVA.IdPaese.upper() == "IT": + vat = "{}{}".format( + DatiAnagrafici.IdFiscaleIVA.IdPaese.upper(), + DatiAnagrafici.IdFiscaleIVA.IdCodice.rjust(11, "0")[:11], + ) + else: + vat = "{}{}".format( + DatiAnagrafici.IdFiscaleIVA.IdPaese.upper(), + re.sub(r"\W+", "", DatiAnagrafici.IdFiscaleIVA.IdCodice).upper(), + ) + partners = partner_model + res_partner_rule = ( + self.env["ir.model.data"] + .sudo() + .xmlid_to_object("base.res_partner_rule", raise_if_not_found=False) + ) + if vat: + domain = [("vat", "=", vat)] + if ( + self.env.context.get("from_attachment") + and res_partner_rule + and res_partner_rule.active + ): + att = self.env.context.get("from_attachment") + domain.extend( + [ + "|", + ("company_id", "child_of", att.company_id.id), + ("company_id", "=", False), + ] + ) + partners = partner_model.search(domain) + if not partners and cf: + domain = [("fiscalcode", "=", cf)] + if ( + self.env.context.get("from_attachment") + and res_partner_rule + and res_partner_rule.active + ): + att = self.env.context.get("from_attachment") + domain.extend( + [ + "|", + ("company_id", "child_of", att.company_id.id), + ("company_id", "=", False), + ] + ) + partners = partner_model.search(domain) + commercial_partner_id = False + if len(partners) > 1: + for partner in partners: + if ( + commercial_partner_id + and partner.commercial_partner_id.id != commercial_partner_id + ): + raise UserError( + _( + "Two distinct partners with " + "VAT number %s or Fiscal Code %s already " + "present in db." % (vat, cf) + ) + ) + commercial_partner_id = partner.commercial_partner_id.id + if partners: + if not commercial_partner_id: + commercial_partner_id = partners[0].commercial_partner_id.id + self.check_partner_base_data(commercial_partner_id, DatiAnagrafici) + return commercial_partner_id + else: + # partner to be created + country_id = False + if DatiAnagrafici.IdFiscaleIVA: + CountryCode = DatiAnagrafici.IdFiscaleIVA.IdPaese + countries = self.CountryByCode(CountryCode) + if countries: + country_id = countries[0].id + else: + raise UserError( + _("Country Code %s not found in system.") % CountryCode + ) + vals = { + "vat": vat, + "fiscalcode": cf, + "is_company": ( + DatiAnagrafici.Anagrafica.Denominazione and True or False + ), + "eori_code": DatiAnagrafici.Anagrafica.CodEORI or "", + "country_id": country_id, + } + if DatiAnagrafici.Anagrafica.Nome: + vals["firstname"] = DatiAnagrafici.Anagrafica.Nome + if DatiAnagrafici.Anagrafica.Cognome: + vals["lastname"] = DatiAnagrafici.Anagrafica.Cognome + if DatiAnagrafici.Anagrafica.Denominazione: + vals["name"] = DatiAnagrafici.Anagrafica.Denominazione + + return partner_model.create(vals).id + + def getCedPrest(self, cedPrest): + partner_model = self.env["res.partner"] + partner_id = self.getPartnerBase(cedPrest.DatiAnagrafici) + no_contact_update = False + if partner_id: + no_contact_update = partner_model.browse( + partner_id + ).electronic_invoice_no_contact_update + fiscalPosModel = self.env["fatturapa.fiscal_position"] + if partner_id and not no_contact_update: + partner_company_id = partner_model.browse(partner_id).company_id.id + vals = { + "street": cedPrest.Sede.Indirizzo, + "zip": cedPrest.Sede.CAP, + "city": cedPrest.Sede.Comune, + "register": cedPrest.DatiAnagrafici.AlboProfessionale or "", + } + if cedPrest.DatiAnagrafici.ProvinciaAlbo: + ProvinciaAlbo = cedPrest.DatiAnagrafici.ProvinciaAlbo + prov = self.ProvinceByCode(ProvinciaAlbo) + if not prov: + self.log_inconsistency( + _("Register Province ( %s ) not present " "in your system") + % ProvinciaAlbo + ) + else: + vals["register_province"] = prov[0].id + if cedPrest.Sede.Provincia: + Provincia = cedPrest.Sede.Provincia + prov_sede = self.ProvinceByCode(Provincia) + if not prov_sede: + self.log_inconsistency( + _("Province ( %s ) not present in your system") % Provincia + ) + else: + vals["state_id"] = prov_sede[0].id + + vals["register_code"] = cedPrest.DatiAnagrafici.NumeroIscrizioneAlbo + vals["register_regdate"] = cedPrest.DatiAnagrafici.DataIscrizioneAlbo + + if cedPrest.DatiAnagrafici.RegimeFiscale: + rfPos = cedPrest.DatiAnagrafici.RegimeFiscale + FiscalPos = fiscalPosModel.search([("code", "=", rfPos)]) + if not FiscalPos: + raise UserError( + _("Tax Regime %s not present in your system.") % rfPos + ) + else: + vals["register_fiscalpos"] = FiscalPos[0].id + + if cedPrest.IscrizioneREA: + REA = cedPrest.IscrizioneREA + offices = self.ProvinceByCode(REA.Ufficio) + rea_nr = REA.NumeroREA + + if not offices: + office_id = False + self.log_inconsistency( + _( + "REA Office Province Code ( %s ) not present in " + "your system" + ) + % REA.Ufficio + ) + else: + office_id = offices[0].id + vals["rea_office"] = office_id + + rea_domain = [ + ("rea_code", "=", rea_nr), + ("company_id", "=", partner_company_id), + ("id", "!=", partner_id), + ] + if office_id: + rea_domain.append(("rea_office", "=", office_id)) + rea_partners = partner_model.search(rea_domain) + if rea_partners: + rea_names = ", ".join(rea_partners.mapped("name")) + p_name = partner_model.browse(partner_id).name + self.log_inconsistency( + _( + "Current invoice is from {} with REA Code" + " {}. Yet it seems that partners {} have the same" + " REA Code. This code should be unique; please fix" + " it.".format(p_name, rea_nr, rea_names) + ) + ) + else: + vals["rea_code"] = REA.NumeroREA + + vals["rea_capital"] = REA.CapitaleSociale or 0.0 + vals["rea_member_type"] = REA.SocioUnico or False + vals["rea_liquidation_state"] = REA.StatoLiquidazione or False + + if cedPrest.Contatti: + vals["phone"] = cedPrest.Contatti.Telefono + vals["email"] = cedPrest.Contatti.Email + partner_model.browse(partner_id).write(vals) + return partner_id + + def getCarrirerPartner(self, Carrier): + partner_model = self.env["res.partner"] + partner_id = self.getPartnerBase(Carrier.DatiAnagraficiVettore) + no_contact_update = False + if partner_id: + no_contact_update = partner_model.browse( + partner_id + ).electronic_invoice_no_contact_update + if partner_id and not no_contact_update: + vals = { + "license_number": Carrier.DatiAnagraficiVettore.NumeroLicenzaGuida + or "", + } + partner_model.browse(partner_id).write(vals) + return partner_id + + # move_line.tax_ids + def _prepare_generic_line_data(self, line): + retLine = {} + account_taxes = self.get_account_taxes(line.AliquotaIVA, line.Natura) + if account_taxes: + retLine["tax_ids"] = [(6, 0, [account_taxes[0].id])] + return retLine + + def get_account_taxes(self, AliquotaIVA, Natura): + account_tax_model = self.env["account.tax"] + # check if a default tax exists and generate def_purchase_tax object + ir_values = self.env["ir.default"] + company_id = self.env.company.id + supplier_taxes_ids = ir_values.get( + "product.product", "supplier_taxes_id", company_id=company_id + ) + def_purchase_tax = False + if supplier_taxes_ids: + def_purchase_tax = account_tax_model.browse(supplier_taxes_ids, limit=1) + if float(AliquotaIVA) == 0.0 and Natura: + account_taxes = account_tax_model.search( + [ + ("type_tax_use", "=", "purchase"), + ("kind_id.code", "=", Natura), + ("amount", "=", 0.0), + ], + order="sequence", + ) + if not account_taxes: + self.log_inconsistency( + _( + "No tax with percentage " + "%s and nature %s found. Please configure this tax." + ) + % (AliquotaIVA, Natura) + ) + if len(account_taxes) > 1: + self.log_inconsistency( + _( + "Too many taxes with percentage " + "%s and nature %s found. Tax %s with lower priority has " + "been set on invoice lines." + ) + % (AliquotaIVA, Natura, account_taxes[0].description) + ) + else: + account_taxes = account_tax_model.search( + [ + ("type_tax_use", "=", "purchase"), + ("amount", "=", float(AliquotaIVA)), + ("price_include", "=", False), + # partially deductible VAT must be set by user + ("children_tax_ids", "=", False), + ], + order="sequence", + ) + if not account_taxes: + self.log_inconsistency( + _( + "XML contains tax with percentage '%s' " + "but it does not exist in your system" + ) + % AliquotaIVA + ) + # check if there are multiple taxes with + # same percentage + if len(account_taxes) > 1: + # just logging because this is an usual case: see split payment + _logger.warning( + _( + "Too many taxes with percentage equals " + "to '%s'.\nFix it if required" + ) + % AliquotaIVA + ) + # if there are multiple taxes with same percentage + # and there is a default tax with this percentage, + # set taxes list equal to supplier_taxes_id, loaded before + if def_purchase_tax and def_purchase_tax.amount == (float(AliquotaIVA)): + account_taxes = def_purchase_tax + return account_taxes + + def get_line_product(self, line, partner): + product = False + supplier_info = self.env["product.supplierinfo"] + if len(line.CodiceArticolo or []) == 1: + supplier_code = line.CodiceArticolo[0].CodiceValore + supplier_infos = supplier_info.search( + [("product_code", "=", supplier_code), ("name", "=", partner.id)] + ) + if supplier_infos: + products = supplier_infos.mapped("product_id") + if len(products) == 1: + product = products[0] + else: + templates = supplier_infos.mapped("product_tmpl_id") + if len(templates) == 1: + product = templates.product_variant_ids[0] + if not product and partner.e_invoice_default_product_id: + product = partner.e_invoice_default_product_id + return product + + def adjust_accounting_data(self, product, line_vals): + account = self.get_credit_account(product) + line_vals["account_id"] = account.id + + new_tax = None + if len(product.product_tmpl_id.supplier_taxes_id) == 1: + new_tax = product.product_tmpl_id.supplier_taxes_id[0] + elif len(account.tax_ids) == 1: + new_tax = account.tax_ids[0] + line_tax_id = ( + line_vals.get("invoice_line_tax_ids") + and line_vals["invoice_line_tax_ids"][0][2][0] + ) + line_tax = self.env["account.tax"].browse(line_tax_id) + if new_tax and line_tax and new_tax != line_tax: + if new_tax._get_tax_amount() != line_tax._get_tax_amount(): + self.log_inconsistency( + _( + "XML contains tax %s. Product %s has tax %s. Using " + "the XML one" + ) + % (line_tax.name, product.name, new_tax.name) + ) + else: + # If product has the same amount of the one in XML, + # I use it. Typical case: 22% det 50% + line_vals["invoice_line_tax_ids"] = [(6, 0, [new_tax.id])] + + # move_line.tax_ids + # move_line.name + # move_line.sequence + # move_line.account_id + # move_line.price_unit + # move_line.quantity + def _prepareInvoiceLineAliquota(self, credit_account_id, line, nline): + retLine = {} + account_taxes = self.get_account_taxes(line.AliquotaIVA, line.Natura) + if account_taxes: + retLine["tax_ids"] = [(6, 0, [account_taxes[0].id])] + + retLine.update( + { + "name": "Riepilogo Aliquota {}".format(line.AliquotaIVA), + "sequence": nline, + "account_id": credit_account_id, + "price_unit": float(abs(line.ImponibileImporto)), + } + ) + return retLine + + # move_line.name + # move_line.sequence + # move_line.account_id + # move_line.price_unit + # move_line.quantity + # move_line.discount + # move_line.admin_ref + # move_line.invoice_line_tax_wt_ids + def _prepareInvoiceLine(self, credit_account_id, line, wt_founds=False): + retLine = self._prepare_generic_line_data(line) + retLine.update( + { + "name": line.Descrizione, + "sequence": int(line.NumeroLinea), + "account_id": credit_account_id, + "price_unit": float(line.PrezzoUnitario), + "exclude_from_invoice_tab": False, + } + ) + if line.Quantita is None: + retLine["quantity"] = 1.0 + else: + retLine["quantity"] = float(line.Quantita) + if ( + float(line.PrezzoUnitario) + and line.Quantita + and float(line.Quantita) + and line.ScontoMaggiorazione # Quantita not required + ): + retLine["discount"] = self._computeDiscount(line) + if line.RiferimentoAmministrazione: + retLine["admin_ref"] = line.RiferimentoAmministrazione + if wt_founds and line.Ritenuta: + retLine["invoice_line_tax_wt_ids"] = [(6, 0, [x.id for x in wt_founds])] + + return retLine + + def _prepareRelDocsLine(self, invoice_id, line, doc_type): + res = [] + lineref = line.RiferimentoNumeroLinea or False + IdDoc = line.IdDocumento or "Error" + Data = line.Data or False + NumItem = line.NumItem or "" + Code = line.CodiceCommessaConvenzione or "" + Cig = line.CodiceCIG or "" + Cup = line.CodiceCUP or "" + invoice_lineid = False + if lineref: + for numline in lineref: + invoice_lineid = False + invoice_line_model = self.env["account.move.line"] + invoice_lines = invoice_line_model.search( + [ + ("move_id", "=", invoice_id), + ("sequence", "=", int(numline)), + ] + ) + if invoice_lines: + invoice_lineid = invoice_lines[0].id + val = { + "type": doc_type, + "name": IdDoc, + "lineRef": numline, + "invoice_line_id": invoice_lineid, + "invoice_id": invoice_id, + "date": Data, + "numitem": NumItem, + "code": Code, + "cig": Cig, + "cup": Cup, + } + res.append(val) + else: + val = { + "type": doc_type, + "name": IdDoc, + "invoice_line_id": invoice_lineid, + "invoice_id": invoice_id, + "date": Data, + "numitem": NumItem, + "code": Code, + "cig": Cig, + "cup": Cup, + } + res.append(val) + return res + + def _prepareWelfareLine(self, invoice_id, line): + TipoCassa = line.TipoCassa or False + AlCassa = line.AlCassa and (float(line.AlCassa) / 100) or None + ImportoContributoCassa = ( + line.ImportoContributoCassa and float(line.ImportoContributoCassa) or None + ) + ImponibileCassa = line.ImponibileCassa and float(line.ImponibileCassa) or None + AliquotaIVA = line.AliquotaIVA and (float(line.AliquotaIVA) / 100) or None + Ritenuta = line.Ritenuta or "" + Natura = line.Natura or False + kind_id = False + if Natura: + kind = self.env["account.tax.kind"].search([("code", "=", Natura)]) + if not kind: + self.log_inconsistency(_("Tax kind %s not found") % Natura) + else: + kind_id = kind[0].id + + RiferimentoAmministrazione = line.RiferimentoAmministrazione or "" + WelfareTypeModel = self.env["welfare.fund.type"] + if not TipoCassa: + raise UserError(_("Welfare Fund is not defined.")) + WelfareType = WelfareTypeModel.search([("name", "=", TipoCassa)]) + + res = { + "welfare_rate_tax": AlCassa, + "welfare_amount_tax": ImportoContributoCassa, + "welfare_taxable": ImponibileCassa, + "welfare_Iva_tax": AliquotaIVA, + "subjected_withholding": Ritenuta, + "kind_id": kind_id, + "pa_line_code": RiferimentoAmministrazione, + "invoice_id": invoice_id, + } + if not WelfareType: + raise UserError( + _("Welfare Fund %s not present in your system.") % TipoCassa + ) + else: + res["name"] = WelfareType[0].id + + return res + + def _prepareDiscRisePriceLine(self, line_id, line): + Tipo = line.Tipo or False + Percentuale = line.Percentuale and float(line.Percentuale) or 0.0 + Importo = line.Importo and float(line.Importo) or 0.0 + res = { + "percentage": Percentuale, + "amount": Importo, + self.env.context.get("drtype"): line_id, + } + res["name"] = Tipo + + return res + + def _computeDiscount(self, DettaglioLinea): + line_total = float(DettaglioLinea.PrezzoTotale) + line_unit = line_total / float(DettaglioLinea.Quantita) + discount = (1 - (line_unit / float(DettaglioLinea.PrezzoUnitario))) * 100.0 + return discount + + def _addGlobalDiscount(self, invoice_id, DatiGeneraliDocumento): + discount = 0.0 + if ( + DatiGeneraliDocumento.ScontoMaggiorazione + and self.e_invoice_detail_level == "2" + ): + invoice = self.env["account.move"].browse(invoice_id) + for DiscRise in DatiGeneraliDocumento.ScontoMaggiorazione: + if DiscRise.Percentuale: + amount = invoice.amount_total * (float(DiscRise.Percentuale) / 100) + if DiscRise.Tipo == "SC": + discount -= amount + elif DiscRise.Tipo == "MG": + discount += amount + elif DiscRise.Importo: + if DiscRise.Tipo == "SC": + discount -= float(DiscRise.Importo) + elif DiscRise.Tipo == "MG": + discount += float(DiscRise.Importo) + company = invoice.company_id + global_discount_product = company.sconto_maggiorazione_product_id + credit_account = self.get_credit_account( + product=global_discount_product, + ) + line_vals = { + "move_id": invoice_id, + "name": _("Global bill discount from document general data"), + "account_id": credit_account.id, + "price_unit": discount, + "quantity": 1, + } + if global_discount_product: + line_vals["product_id"] = global_discount_product.id + line_vals["name"] = global_discount_product.name + self.adjust_accounting_data(global_discount_product, line_vals) + self.env["account.move.line"].with_context( + check_move_validity=False + ).create(line_vals) + return True + + def _createPaymentsLine(self, payment_id, line, partner_id, invoice): + details = line.DettaglioPagamento or False + if details: + PaymentModel = self.env["fatturapa.payment.detail"] + PaymentMethodModel = self.env["fatturapa.payment_method"] + BankModel = self.env["res.bank"] + PartnerBankModel = self.env["res.partner.bank"] + for dline in details: + method = PaymentMethodModel.search( + [("code", "=", dline.ModalitaPagamento)] + ) + if not method: + raise UserError( + _( + "Payment method %s is not defined in your system." + % dline.ModalitaPagamento + ) + ) + val = { + "recipient": dline.Beneficiario, + "fatturapa_pm_id": method[0].id, + "payment_term_start": dline.DataRiferimentoTerminiPagamento + or False, + "payment_days": dline.GiorniTerminiPagamento or 0, + "payment_due_date": dline.DataScadenzaPagamento or False, + "payment_amount": dline.ImportoPagamento or 0.0, + "post_office_code": dline.CodUfficioPostale or "", + "recepit_surname": dline.CognomeQuietanzante or "", + "recepit_name": dline.NomeQuietanzante or "", + "recepit_cf": dline.CFQuietanzante or "", + "recepit_title": dline.TitoloQuietanzante or "1", + "payment_bank_name": dline.IstitutoFinanziario or "", + "payment_bank_iban": dline.IBAN or "", + "payment_bank_abi": dline.ABI or "", + "payment_bank_cab": dline.CAB or "", + "payment_bank_bic": dline.BIC or "", + "payment_bank": False, + "prepayment_discount": dline.ScontoPagamentoAnticipato or 0.0, + "max_payment_date": dline.DataLimitePagamentoAnticipato or False, + "penalty_amount": dline.PenalitaPagamentiRitardati or 0.0, + "penalty_date": dline.DataDecorrenzaPenale or False, + "payment_code": dline.CodicePagamento or "", + "payment_data_id": payment_id, + } + bank = False + payment_bank_id = False + if dline.BIC: + banks = BankModel.search([("bic", "=", dline.BIC.strip())]) + if not banks: + if not dline.IstitutoFinanziario: + self.log_inconsistency( + _( + "Name of Bank with BIC '%s' is not set." + " Can't create bank" + ) + % dline.BIC + ) + else: + bank = BankModel.create( + { + "name": dline.IstitutoFinanziario, + "bic": dline.BIC, + } + ) + else: + bank = banks[0] + if dline.IBAN: + iban = dline.IBAN.strip() + SearchDom = [ + ("acc_number", "=", pretty_iban(iban)), + ("partner_id", "=", partner_id), + ] + payment_bank_id = False + payment_banks = PartnerBankModel.search(SearchDom) + if not payment_banks and not bank: + self.log_inconsistency( + _( + "BIC is required and not exist in Xml\n" + "Curr bank data is: \n" + "IBAN: %s\n" + "Bank Name: %s\n" + ) + % ( + iban or "", + dline.IstitutoFinanziario or "", + ) + ) + elif not payment_banks and bank: + existing_account = PartnerBankModel.search( + [ + ("acc_number", "=", iban), + ("company_id", "=", invoice.company_id.id), + ] + ) + if existing_account: + self.log_inconsistency( + _("Bank account %s already exists") % iban + ) + else: + payment_bank_id = PartnerBankModel.create( + { + "acc_number": iban, + "partner_id": partner_id, + "bank_id": bank.id, + "bank_name": dline.IstitutoFinanziario or bank.name, + "bank_bic": dline.BIC or bank.bic, + } + ).id + if payment_banks: + payment_bank_id = payment_banks[0].id + + if payment_bank_id: + val["payment_bank"] = payment_bank_id + PaymentModel.create(val) + return True + + # TODO sul partner? + def set_StabileOrganizzazione(self, CedentePrestatore, invoice): + if CedentePrestatore.StabileOrganizzazione: + invoice.efatt_stabile_organizzazione_indirizzo = ( + CedentePrestatore.StabileOrganizzazione.Indirizzo + ) + invoice.efatt_stabile_organizzazione_civico = ( + CedentePrestatore.StabileOrganizzazione.NumeroCivico + ) + invoice.efatt_stabile_organizzazione_cap = ( + CedentePrestatore.StabileOrganizzazione.CAP + ) + invoice.efatt_stabile_organizzazione_comune = ( + CedentePrestatore.StabileOrganizzazione.Comune + ) + invoice.efatt_stabile_organizzazione_provincia = ( + CedentePrestatore.StabileOrganizzazione.Provincia + ) + invoice.efatt_stabile_organizzazione_nazione = ( + CedentePrestatore.StabileOrganizzazione.Nazione + ) + + def get_purchase_journal(self, company): + journal_model = self.env["account.journal"] + journals = journal_model.search( + [("type", "=", "purchase"), ("company_id", "=", company.id)], limit=1 + ) + if not journals: + raise UserError( + _("Define a purchase journal " "for this company: '%s' (id: %d).") + % (company.name, company.id) + ) + return journals[0] + + def create_e_invoice_line(self, line): + vals = { + "line_number": int(line.NumeroLinea or 0), + "service_type": line.TipoCessionePrestazione, + "name": line.Descrizione, + "qty": float(line.Quantita or 0), + "uom": line.UnitaMisura, + "period_start_date": line.DataInizioPeriodo, + "period_end_date": line.DataFinePeriodo, + "unit_price": float(line.PrezzoUnitario or 0), + "total_price": float(line.PrezzoTotale or 0), + "tax_amount": float(line.AliquotaIVA or 0), + "wt_amount": line.Ritenuta, + "tax_kind": line.Natura, + "admin_ref": line.RiferimentoAmministrazione, + } + einvoiceline = self.env["einvoice.line"].create(vals) + if line.CodiceArticolo: + for caline in line.CodiceArticolo: + self.env["fatturapa.article.code"].create( + { + "name": caline.CodiceTipo or "", + "code_val": caline.CodiceValore or "", + "e_invoice_line_id": einvoiceline.id, + } + ) + if line.ScontoMaggiorazione: + for DiscRisePriceLine in line.ScontoMaggiorazione: + DiscRisePriceVals = self.with_context( + drtype="e_invoice_line_id" + )._prepareDiscRisePriceLine(einvoiceline.id, DiscRisePriceLine) + self.env["discount.rise.price"].create(DiscRisePriceVals) + if line.AltriDatiGestionali: + for dato in line.AltriDatiGestionali: + self.env["einvoice.line.other.data"].create( + { + "name": dato.TipoDato, + "text_ref": dato.RiferimentoTesto, + "num_ref": float(dato.RiferimentoNumero or 0), + "date_ref": dato.RiferimentoData, + "e_invoice_line_id": einvoiceline.id, + } + ) + return einvoiceline + + def get_credit_account(self, product=None): + """ + Try to get default credit account for invoice line looking in + + 1) product (if provided) + 2) purchase journal + 3) company default. + + :param product: Product whose expense account will be used + :return: The account found + """ + credit_account = self.env["account.account"].browse() + + # If there is a product, get its default expense account + if product: + template = product.product_tmpl_id + accounts_dict = template.get_product_accounts() + credit_account = accounts_dict["expense"] + + company = self.env.user.company_id + # Search in purchase journal + journal = self.get_purchase_journal(company) + if not credit_account: + credit_account = journal.default_account_id + + # Search in company defaults + if not credit_account: + credit_account = ( + self.env["ir.property"] + .with_company(company) + ._get("property_account_expense_categ_id", "product.category") + ) + + if not credit_account: + raise UserError( + _( + "Please configure Default Credit Account " + "in Journal '{journal}' " + "or check default expense account " + "for company '{company}'." + ).format( + journal=journal.display_name, + company=company.display_name, + ) + ) + + return credit_account + + def invoiceCreate(self, fatt, fatturapa_attachment, FatturaBody, partner_id): + partner_model = self.env["res.partner"] + invoice_model = self.env["account.move"] + currency_model = self.env["res.currency"] + ftpa_doctype_model = self.env["fiscal.document.type"] + rel_docs_model = self.env["fatturapa.related_document_type"] + + company = self.env.company + partner = partner_model.browse(partner_id) + + # currency 2.1.1.2 + currency = currency_model.search( + [("name", "=", FatturaBody.DatiGenerali.DatiGeneraliDocumento.Divisa)] + ) + if not currency: + raise UserError( + _( + "No currency found with code %s." + % FatturaBody.DatiGenerali.DatiGeneraliDocumento.Divisa + ) + ) + purchase_journal = self.get_purchase_journal(company) + credit_account = self.get_credit_account() + comment = "" + # 2.1.1 + docType_id = False + invtype = "in_invoice" + docType = FatturaBody.DatiGenerali.DatiGeneraliDocumento.TipoDocumento + if docType: + docType_record = ftpa_doctype_model.search([("code", "=", docType)]) + if docType_record: + docType_id = docType_record[0].id + else: + raise UserError(_("Document type %s not handled.") % docType) + if docType == "TD04": + invtype = "in_refund" + # 2.1.1.11 + causLst = FatturaBody.DatiGenerali.DatiGeneraliDocumento.Causale + if causLst: + for rel_doc in causLst: + comment += rel_doc + "\n" + + if fatturapa_attachment.e_invoice_received_date: + e_invoice_received_date = ( + fatturapa_attachment.e_invoice_received_date.date() + ) + else: + e_invoice_received_date = fatturapa_attachment.create_date.date() + + e_invoice_date = datetime.strptime( + FatturaBody.DatiGenerali.DatiGeneraliDocumento.Data, "%Y-%m-%d" + ).date() + + invoice_data = { + "e_invoice_received_date": e_invoice_received_date, + "date": e_invoice_received_date + if company.in_invoice_registration_date == "rec_date" + else e_invoice_date, + "fiscal_document_type_id": docType_id, + "sender": fatt.FatturaElettronicaHeader.SoggettoEmittente or False, + "move_type": invtype, + "partner_id": partner_id, + "currency_id": currency[0].id, + "journal_id": purchase_journal.id, + # 'origin': xmlData.datiOrdineAcquisto, + "fiscal_position_id": (partner.property_account_position_id.id or False), + "invoice_payment_term_id": partner.property_supplier_payment_term_id.id, + "company_id": company.id, + "fatturapa_attachment_in_id": fatturapa_attachment.id, + "narration": comment, + } + + # 2.1.1.12 + self.set_art73(FatturaBody, invoice_data) + + # 2.1.1.5 + wt_founds = self.set_withholding_tax(FatturaBody, invoice_data) + + self.set_e_invoice_lines(FatturaBody, invoice_data) + + invoice = invoice_model.create(invoice_data) + + invoice_lines = [] + # 2.2.1 + invoice_lines.extend( + self.set_invoice_line_ids( + FatturaBody, credit_account.id, partner, wt_founds, invoice + ) + ) + + # 2.1.1.7 + invoice_lines.extend( + self.set_welfares_fund(FatturaBody, credit_account.id, invoice, wt_founds) + ) + + # 2.1.1.10 + invoice_lines.extend(self.set_efatt_rounding(FatturaBody, invoice)) + + invoice.with_context(check_move_validity=False).update( + {"invoice_line_ids": [(6, 0, invoice_lines)]} + ) + + invoice._onchange_invoice_line_wt_ids() + invoice._recompute_dynamic_lines() + invoice.write(invoice._convert_to_write(invoice._cache)) + + rel_docs_dict = { + # 2.1.2 + "order": FatturaBody.DatiGenerali.DatiOrdineAcquisto, + # 2.1.3 + "contract": FatturaBody.DatiGenerali.DatiContratto, + # 2.1.4 + "agreement": FatturaBody.DatiGenerali.DatiConvenzione, + # 2.1.5 + "reception": FatturaBody.DatiGenerali.DatiRicezione, + # 2.1.6 + "invoice": FatturaBody.DatiGenerali.DatiFattureCollegate, + } + + for rel_doc_key, rel_doc_data in rel_docs_dict.items(): + if not rel_doc_data: + continue + for rel_doc in rel_doc_data: + doc_datas = self._prepareRelDocsLine(invoice.id, rel_doc, rel_doc_key) + for doc_data in doc_datas: + # Note for v12: must take advantage of batch creation + rel_docs_model.create(doc_data) + + # 2.1.7 + self.set_activity_progress(FatturaBody, invoice) + + # 2.1.8 + self.set_ddt_data(FatturaBody, invoice) + + # 2.1.9 + self.set_delivery_data(FatturaBody, invoice) + + # 2.2.2 + self.set_summary_data(FatturaBody, invoice) + + # 2.1.10 + self.set_parent_invoice_data(FatturaBody, invoice) + + # 2.3 + self.set_vehicles_data(FatturaBody, invoice) + + # 2.4 + self.set_payments_data(FatturaBody, invoice, partner_id) + + # 2.5 + self.set_attachments_data(FatturaBody, invoice) + + self._addGlobalDiscount( + invoice.id, FatturaBody.DatiGenerali.DatiGeneraliDocumento + ) + + if self.e_invoice_detail_level != "1": + self.set_roundings(FatturaBody, invoice) + + # compute the invoice + invoice.with_context( + check_move_validity=False + )._move_autocomplete_invoice_lines_values() + + self.set_vendor_bill_data(FatturaBody, invoice) + + # this can happen with refunds with negative amounts + invoice.process_negative_lines() + return invoice + + def set_vendor_bill_data(self, FatturaBody, invoice): + if not invoice.invoice_date: + invoice.update( + { + "invoice_date": datetime.strptime( + FatturaBody.DatiGenerali.DatiGeneraliDocumento.Data, "%Y-%m-%d" + ).date(), + } + ) + if not invoice.ref: + today = fields.Date.context_today(self) + x = invoice.line_ids.filtered( + lambda line: line.account_id.user_type_id.type + in ("receivable", "payable") + ).sorted(lambda line: line.date_maturity or today) + if x: + x[-1].name = FatturaBody.DatiGenerali.DatiGeneraliDocumento.Numero + invoice.ref = FatturaBody.DatiGenerali.DatiGeneraliDocumento.Numero + if not invoice.payment_reference: + invoice.payment_reference = invoice.ref + + def set_parent_invoice_data(self, FatturaBody, invoice): + ParentInvoice = FatturaBody.DatiGenerali.FatturaPrincipale + if ParentInvoice: + parentinv_vals = { + "related_invoice_code": ParentInvoice.NumeroFatturaPrincipale or "", + "related_invoice_date": ParentInvoice.DataFatturaPrincipale or False, + } + invoice.write(parentinv_vals) + + def set_vehicles_data(self, FatturaBody, invoice): + Vehicle = FatturaBody.DatiVeicoli + if Vehicle: + veicle_vals = { + "vehicle_registration": Vehicle.Data or False, + "total_travel": Vehicle.TotalePercorso or "", + } + invoice.write(veicle_vals) + + def set_attachments_data(self, FatturaBody, invoice): + invoice_id = invoice.id + AttachmentsData = FatturaBody.Allegati + if AttachmentsData: + self.env["fatturapa.attachment.in"].extract_attachments( + AttachmentsData, invoice_id + ) + + def set_ddt_data(self, FatturaBody, invoice): + invoice_id = invoice.id + DdtDatas = FatturaBody.DatiGenerali.DatiDDT + if not DdtDatas: + return + invoice_line_model = self.env["account.move.line"] + DdTModel = self.env["fatturapa.related_ddt"] + for DdtDataLine in DdtDatas: + if not DdtDataLine.RiferimentoNumeroLinea: + DdTModel.create( + { + "name": DdtDataLine.NumeroDDT or "", + "date": DdtDataLine.DataDDT or False, + "invoice_id": invoice_id, + } + ) + else: + for numline in DdtDataLine.RiferimentoNumeroLinea: + invoice_lines = invoice_line_model.search( + [ + ("move_id", "=", invoice_id), + ("sequence", "=", int(numline)), + ] + ) + invoice_lineid = False + if invoice_lines: + invoice_lineid = invoice_lines[0].id + DdTModel.create( + { + "name": DdtDataLine.NumeroDDT or "", + "date": DdtDataLine.DataDDT or False, + "invoice_id": invoice_id, + "invoice_line_id": invoice_lineid, + } + ) + + def set_art73(self, FatturaBody, invoice_data): + if FatturaBody.DatiGenerali.DatiGeneraliDocumento.Art73: + invoice_data["art73"] = True + + def set_roundings(self, FatturaBody, invoice): + rounding = 0.0 + if FatturaBody.DatiBeniServizi.DatiRiepilogo: + for summary in FatturaBody.DatiBeniServizi.DatiRiepilogo: + rounding += float(summary.Arrotondamento or 0.0) + if FatturaBody.DatiGenerali.DatiGeneraliDocumento: + summary = FatturaBody.DatiGenerali.DatiGeneraliDocumento + rounding += float(summary.Arrotondamento or 0.0) + + if rounding: + arrotondamenti_attivi_account_id = ( + self.env.company.arrotondamenti_attivi_account_id + ) + if not arrotondamenti_attivi_account_id: + raise UserError( + _("Round up account is not set " "in Accounting Settings") + ) + + arrotondamenti_passivi_account_id = ( + self.env.company.arrotondamenti_passivi_account_id + ) + if not arrotondamenti_passivi_account_id: + raise UserError( + _("Round down account is not set " "in Accounting Settings") + ) + + arrotondamenti_tax_id = self.env.company.arrotondamenti_tax_id + if not arrotondamenti_tax_id: + self.log_inconsistency(_("Round up and down tax is not set")) + + line_sequence = max(invoice.invoice_line_ids.mapped("sequence"), default=1) + line_vals = [] + for summary in FatturaBody.DatiBeniServizi.DatiRiepilogo: + # XXX fallisce cattivo se non trova l'imposta Arrotondamento + to_round = float(summary.Arrotondamento or 0.0) + if to_round != 0.0: + account_taxes = self.get_account_taxes( + summary.AliquotaIVA, summary.Natura + ) + arrotondamenti_account_id = ( + arrotondamenti_passivi_account_id.id + if to_round > 0.0 + else arrotondamenti_attivi_account_id.id + ) + invoice_line_tax_id = ( + account_taxes[0].id + if account_taxes + else arrotondamenti_tax_id.id + ) + name = _("Rounding down") if to_round > 0.0 else _("Rounding up") + line_sequence += 1 + upd_vals = { + "sequence": line_sequence, + "move_id": invoice.id, + "name": name, + "account_id": arrotondamenti_account_id, + "price_unit": to_round, + "exclude_from_invoice_tab": False, + "tax_ids": [(6, 0, [invoice_line_tax_id])], + } + # Valutare se in caso di importazione senza rounding sia meglio + # lavorare su debito e credito invece di + # mettere una tassa sul valore !! + # if to_round<0: + # upd_vals["debit"]= abs(to_round) + # else: + # upd_vals["credit"]= abs(to_round) + line_vals.append(upd_vals) + if line_vals: + self.env["account.move.line"].with_context( + check_move_validity=False + ).create(line_vals) + + def set_efatt_rounding(self, FatturaBody, invoice): + invoice_line_model = self.env["account.move.line"] + invoice_line_ids = [] + if FatturaBody.DatiGenerali.DatiGeneraliDocumento.Arrotondamento: + invoice.efatt_rounding = float( + FatturaBody.DatiGenerali.DatiGeneraliDocumento.Arrotondamento + ) + if invoice.efatt_rounding != 0: + if invoice.efatt_rounding > 0: + arrotondamenti_account_id = ( + self.env.user.company_id.arrotondamenti_passivi_account_id + ) + if not arrotondamenti_account_id: + raise UserError( + _("Round down account is not set " "in Accounting Settings") + ) + name = _("Rounding down") + else: + arrotondamenti_account_id = ( + self.env.user.company_id.arrotondamenti_attivi_account_id + ) + if not arrotondamenti_account_id: + raise UserError( + _("Round up account is not set " "in Accounting Settings") + ) + name = _("Rounding up") + upd_vals = { + "move_id": invoice.id, + "name": name, + "account_id": arrotondamenti_account_id.id, + "price_unit": invoice.efatt_rounding, + "quantity": 1, + "exclude_from_invoice_tab": False, + } + self.create_and_get_line_id( + invoice_line_ids, invoice_line_model, upd_vals + ) + return invoice_line_ids + + def set_activity_progress(self, FatturaBody, invoice): + invoice_id = invoice.id + SalDatas = FatturaBody.DatiGenerali.DatiSAL + if SalDatas: + SalModel = self.env["fatturapa.activity.progress"] + for SalDataLine in SalDatas: + SalModel.create( + { + "fatturapa_activity_progress": SalDataLine.RiferimentoFase or 0, + "invoice_id": invoice_id, + } + ) + + def _get_last_due_date(self, DatiPagamento): + dates = [] + for PaymentLine in DatiPagamento or []: + details = PaymentLine.DettaglioPagamento + if details: + for dline in details: + if dline.DataScadenzaPagamento: + dates.append(fields.Date.to_date(dline.DataScadenzaPagamento)) + dates.sort(reverse=True) + return dates + + def set_payments_data(self, FatturaBody, invoice, partner_id): + invoice_id = invoice.id + PaymentsData = FatturaBody.DatiPagamento + partner = self.env["res.partner"].browse(partner_id) + if not partner.property_supplier_payment_term_id: + due_dates = self._get_last_due_date(FatturaBody.DatiPagamento) + if due_dates: + self.env["account.move"].browse( + invoice_id + ).invoice_date_due = due_dates[0] + if PaymentsData: + PaymentDataModel = self.env["fatturapa.payment.data"] + PaymentTermsModel = self.env["fatturapa.payment_term"] + for PaymentLine in PaymentsData: + cond = PaymentLine.CondizioniPagamento or False + if not cond: + raise UserError(_("Payment method code not found in document.")) + terms = PaymentTermsModel.search([("code", "=", cond)]) + if not terms: + raise UserError(_("Payment method code %s is incorrect.") % cond) + else: + term_id = terms[0].id + PayDataId = PaymentDataModel.create( + {"payment_terms": term_id, "invoice_id": invoice_id} + ).id + self._createPaymentsLine(PayDataId, PaymentLine, partner_id, invoice) + + def set_withholding_tax(self, FatturaBody, invoice_data): + Withholdings = FatturaBody.DatiGenerali.DatiGeneraliDocumento.DatiRitenuta + if not Withholdings: + return None + invoice_data["ftpa_withholding_ids"] = [] + wt_founds = [] + for Withholding in Withholdings: + wts = self.env["withholding.tax"].search( + [("payment_reason_id.code", "=", Withholding.CausalePagamento)] + ) + if not wts: + raise UserError( + _( + "The bill contains withholding tax with " + "payment reason %s, " + "but such a tax is not found in your system. Please " + "set it." + ) + % Withholding.CausalePagamento + ) + + for wt in wts: + if ( + wt.tax == float(Withholding.AliquotaRitenuta) + and WT_CODES_MAPPING[Withholding.TipoRitenuta] == wt.wt_types + ): + wt_founds.append(wt) + break + else: + raise UserError( + _( + "No withholding tax found with " + "document payment reason %s, rate %s and type %s." + ) + % ( + Withholding.CausalePagamento, + Withholding.AliquotaRitenuta, + WT_CODES_MAPPING[Withholding.TipoRitenuta], + ) + ) + invoice_data["ftpa_withholding_ids"].append( + ( + 0, + 0, + { + "name": Withholding.TipoRitenuta, + "amount": Withholding.ImportoRitenuta, + }, + ) + ) + return wt_founds + + def set_welfares_fund(self, FatturaBody, credit_account_id, invoice, wt_founds): + invoice_line_model = self.env["account.move.line"] + invoice_line_ids = [] + if self.e_invoice_detail_level == "2": + + Welfares = ( + FatturaBody.DatiGenerali.DatiGeneraliDocumento.DatiCassaPrevidenziale + ) + if Welfares: + WelfareFundLineModel = self.env["welfare.fund.data.line"] + for welfareLine in Welfares: + WalfarLineVals = self._prepareWelfareLine(invoice.id, welfareLine) + WelfareFundLineModel.create(WalfarLineVals) + + if welfareLine.TipoCassa == "TC07": + continue + + line_vals = self._prepare_generic_line_data(welfareLine) + line_vals.update( + { + "name": _("Welfare Fund: %s") % welfareLine.TipoCassa, + "price_unit": float(welfareLine.ImportoContributoCassa), + "move_id": invoice.id, + "account_id": credit_account_id, + "quantity": 1, + } + ) + if welfareLine.Ritenuta: + if not wt_founds: + raise UserError( + _( + "Welfare Fund data %s has withholding tax but no " + "withholding tax was found in the system." + ) + % welfareLine.TipoCassa + ) + line_vals["invoice_line_tax_wt_ids"] = [ + (6, 0, [wt.id for wt in wt_founds]) + ] + if self.env.company.cassa_previdenziale_product_id: + cassa_previdenziale_product = ( + self.env.company.cassa_previdenziale_product_id + ) + line_vals["product_id"] = cassa_previdenziale_product.id + line_vals["name"] = cassa_previdenziale_product.name + self.adjust_accounting_data( + cassa_previdenziale_product, line_vals + ) + self.create_and_get_line_id( + invoice_line_ids, invoice_line_model, line_vals + ) + return invoice_line_ids + + def _convert_datetime(self, dtstring): + ret = False + try: + dt = datetime.strptime(dtstring, "%Y-%m-%dT%H:%M:%S") + if dt: + ret = dt.strftime("%Y-%m-%d %H:%M:%S") + except (TypeError, ValueError): + pass + return ret + + def set_delivery_data(self, FatturaBody, invoice): + Delivery = FatturaBody.DatiGenerali.DatiTrasporto + if Delivery: + delivery_id = self.getCarrirerPartner(Delivery) + delivery_dict = { + "carrier_id": delivery_id, + "transport_vehicle": Delivery.MezzoTrasporto or "", + "transport_reason": Delivery.CausaleTrasporto or "", + "number_items": Delivery.NumeroColli or 0, + "description": Delivery.Descrizione or "", + "unit_weight": Delivery.UnitaMisuraPeso or 0.0, + "gross_weight": Delivery.PesoLordo or 0.0, + "net_weight": Delivery.PesoNetto or 0.0, + "pickup_datetime": self._convert_datetime(Delivery.DataOraRitiro) + or False, + "transport_date": Delivery.DataInizioTrasporto or False, + "delivery_datetime": self._convert_datetime(Delivery.DataOraConsegna) + or False, + "delivery_address": "", + "ftpa_incoterms": Delivery.TipoResa, + } + + if Delivery.IndirizzoResa: + delivery_dict["delivery_address"] = "{}, {}\n{} - {}\n{} {}".format( + Delivery.IndirizzoResa.Indirizzo or "", + Delivery.IndirizzoResa.NumeroCivico or "", + Delivery.IndirizzoResa.CAP or "", + Delivery.IndirizzoResa.Comune or "", + Delivery.IndirizzoResa.Provincia or "", + Delivery.IndirizzoResa.Nazione or "", + ) + invoice.write(delivery_dict) + + def set_summary_data(self, FatturaBody, invoice): + invoice_id = invoice.id + Summary_datas = FatturaBody.DatiBeniServizi.DatiRiepilogo + summary_data_model = self.env["fatturapa.summary.data"] + if Summary_datas: + for summary in Summary_datas: + summary_line = { + "tax_rate": summary.AliquotaIVA or 0.0, + "non_taxable_nature": summary.Natura or False, + "incidental_charges": summary.SpeseAccessorie or 0.0, + "rounding": summary.Arrotondamento or 0.0, + "amount_untaxed": summary.ImponibileImporto or 0.0, + "amount_tax": summary.Imposta or 0.0, + "payability": summary.EsigibilitaIVA or False, + "law_reference": summary.RiferimentoNormativo or "", + "invoice_id": invoice_id, + } + summary_data_model.create(summary_line) + + def set_e_invoice_lines(self, FatturaBody, invoice_data): + e_invoice_lines = self.env["einvoice.line"].browse() + for line in FatturaBody.DatiBeniServizi.DettaglioLinee: + e_invoice_lines |= self.create_e_invoice_line(line) + if e_invoice_lines: + invoice_data["e_invoice_line_ids"] = [(6, 0, e_invoice_lines.ids)] + + def _set_invoice_lines( + self, product, invoice_line_data, invoice_lines, invoice_line_model + ): + + if product: + invoice_line_data["product_id"] = product.id + self.adjust_accounting_data(product, invoice_line_data) + self.create_and_get_line_id( + invoice_lines, invoice_line_model, invoice_line_data + ) + + # move_id + # account_id + def set_invoice_line_ids( + self, FatturaBody, credit_account_id, partner, wt_founds, invoice + ): + invoice_lines = [] + invoice_line_model = self.env["account.move.line"] + if self.e_invoice_detail_level == "1": + for nline, line in enumerate(FatturaBody.DatiBeniServizi.DatiRiepilogo): + invoice_line_data = self._prepareInvoiceLineAliquota( + credit_account_id, line, nline + ) + invoice_line_data["move_id"] = invoice.id + + product = partner.e_invoice_default_product_id + self._set_invoice_lines( + product, invoice_line_data, invoice_lines, invoice_line_model + ) + + elif self.e_invoice_detail_level == "2": + for line in FatturaBody.DatiBeniServizi.DettaglioLinee: + invoice_line_data = self._prepareInvoiceLine( + credit_account_id, line, wt_founds + ) + invoice_line_data["move_id"] = invoice.id + + product = self.get_line_product(line, partner) + self._set_invoice_lines( + product, invoice_line_data, invoice_lines, invoice_line_model + ) + return invoice_lines + + def check_invoice_amount(self, invoice, FatturaElettronicaBody): + dgd = FatturaElettronicaBody.DatiGenerali.DatiGeneraliDocumento + if dgd.ScontoMaggiorazione and dgd.ImportoTotaleDocumento: + # assuming that, if someone uses + # DatiGeneraliDocumento.ScontoMaggiorazione, also fills + # DatiGeneraliDocumento.ImportoTotaleDocumento + ImportoTotaleDocumento = float(dgd.ImportoTotaleDocumento) + if not float_is_zero( + invoice.amount_total - ImportoTotaleDocumento, precision_digits=2 + ): + self.log_inconsistency( + _("Bill total %s is different from " "document total amount %s") + % (invoice.amount_total, ImportoTotaleDocumento) + ) + else: + # else, we can only check DatiRiepilogo if + # DatiGeneraliDocumento.ScontoMaggiorazione is not present, + # because otherwise DatiRiepilogo and odoo invoice total would + # differ + amount_untaxed = invoice.compute_xml_amount_untaxed(FatturaElettronicaBody) + if not float_is_zero( + invoice.amount_untaxed - amount_untaxed, precision_digits=2 + ): + self.log_inconsistency( + _("Computed amount untaxed %s is different from" " summary data %s") + % (invoice.amount_untaxed, amount_untaxed) + ) + + def get_invoice_obj(self, fatturapa_attachment): + xml_string = fatturapa_attachment.get_xml_string() + return efattura.CreateFromDocument(xml_string) + + def create_and_get_line_id(self, invoice_line_ids, invoice_line_model, upd_vals): + invoice_line_id = ( + invoice_line_model.with_context(check_move_validity=False) + .create(upd_vals) + .id + ) + invoice_line_ids.append(invoice_line_id) + + def _set_decimal_precision(self, precision_name, field_name): + precision = self.env["decimal.precision"].search( + [("name", "=", precision_name)], limit=1 + ) + different_precisions = original_precision = None + if precision: + precision_id = precision.id + original_precision = precision.digits + different_precisions = self[field_name] != original_precision + if different_precisions: + with registry(self.env.cr.dbname).cursor() as new_cr: + # We need a new env (and cursor) because 'digits' property of Float + # fields is retrieved with a new LazyCursor, + # see class Float at odoo.fields, + # so we need to write (commit) to DB in order to make the new + # precision available + new_env = api.Environment(new_cr, self.env.uid, self.env.context) + new_precision = new_env["decimal.precision"].browse(precision_id) + new_precision.sudo().write({"digits": self[field_name]}) + new_cr.commit() + return precision, different_precisions, original_precision + + def _restore_original_precision(self, precision, original_precision): + with registry(self.env.cr.dbname).cursor() as new_cr: + new_env = api.Environment(new_cr, self.env.uid, self.env.context) + new_price_precision = new_env["decimal.precision"].browse(precision.id) + new_price_precision.sudo().write({"digits": original_precision}) + new_cr.commit() + + def importFatturaPA(self): + self.ensure_one() + fatturapa_attachment_obj = self.env["fatturapa.attachment.in"] + fatturapa_attachment_ids = self.env.context.get("active_ids", False) + + ( + price_precision, + different_price_precisions, + original_price_precision, + ) = self._set_decimal_precision("Product Price", "price_decimal_digits") + ( + qty_precision, + different_qty_precisions, + original_qty_precision, + ) = self._set_decimal_precision( + "Product Unit of Measure", "quantity_decimal_digits" + ) + ( + discount_precision, + different_discount_precisions, + original_discount_precision, + ) = self._set_decimal_precision("Discount", "discount_decimal_digits") + + new_invoices = [] + # convert to dict in order to be able to modify context + self.env.context = dict(self.env.context) + for fatturapa_attachment_id in fatturapa_attachment_ids: + self.env.context.update(inconsistencies="") + fatturapa_attachment = fatturapa_attachment_obj.browse( + fatturapa_attachment_id + ) + if fatturapa_attachment.in_invoice_ids: + raise UserError(_("File is linked to bills yet.")) + + fatt = self.get_invoice_obj(fatturapa_attachment) + cedentePrestatore = fatt.FatturaElettronicaHeader.CedentePrestatore + # 1.2 + partner_id = self.getCedPrest(cedentePrestatore) + # 1.3 + TaxRappresentative = fatt.FatturaElettronicaHeader.RappresentanteFiscale + # 1.5 + Intermediary = ( + fatt.FatturaElettronicaHeader.TerzoIntermediarioOSoggettoEmittente + ) + + generic_inconsistencies = "" + if self.env.context.get("inconsistencies"): + generic_inconsistencies = self.env.context["inconsistencies"] + "\n\n" + + xmlproblems = getattr(fatt, "_xmldoctor", None) + if xmlproblems: # None or [] + generic_inconsistencies += "\n".join(xmlproblems) + "\n\n" + + # 2 + for fattura in fatt.FatturaElettronicaBody: + + # reset inconsistencies + self.env.context.update(inconsistencies="") + + invoice = self.invoiceCreate( + fatt, fatturapa_attachment, fattura, partner_id + ) + + self.set_StabileOrganizzazione(cedentePrestatore, invoice) + if TaxRappresentative: + tax_partner_id = self.getPartnerBase( + TaxRappresentative.DatiAnagrafici + ) + invoice.write({"tax_representative_id": tax_partner_id}) + if Intermediary: + Intermediary_id = self.getPartnerBase(Intermediary.DatiAnagrafici) + invoice.write({"intermediary": Intermediary_id}) + new_invoices.append(invoice.id) + self.check_invoice_amount(invoice, fattura) + + invoice.set_einvoice_data(fattura) + + if self.env.context.get("inconsistencies"): + invoice_inconsistencies = self.env.context["inconsistencies"] + else: + invoice_inconsistencies = "" + invoice.inconsistencies = ( + generic_inconsistencies + invoice_inconsistencies + ) + + if price_precision and different_price_precisions: + self._restore_original_precision(price_precision, original_price_precision) + if qty_precision and different_qty_precisions: + self._restore_original_precision(qty_precision, original_qty_precision) + if discount_precision and different_discount_precisions: + self._restore_original_precision( + discount_precision, original_discount_precision + ) + + return { + "view_type": "form", + "name": "Electronic Bills", + "view_mode": "tree,form", + "res_model": "account.move", + "type": "ir.actions.act_window", + "domain": [("id", "in", new_invoices)], + } diff --git a/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa_view.xml b/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa_view.xml new file mode 100644 index 000000000000..b1549620168c --- /dev/null +++ b/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa_view.xml @@ -0,0 +1,39 @@ + + + + + + Electronic Bill Import + wizard.import.fatturapa + +
+ + + + + +
+
+
+
+
+
+ + + Import Electronic Bill + wizard.import.fatturapa + + + form + new + + + +
+
diff --git a/setup/l10n_it_fatturapa_in/odoo/addons/l10n_it_fatturapa_in b/setup/l10n_it_fatturapa_in/odoo/addons/l10n_it_fatturapa_in new file mode 120000 index 000000000000..179b6f48cfbf --- /dev/null +++ b/setup/l10n_it_fatturapa_in/odoo/addons/l10n_it_fatturapa_in @@ -0,0 +1 @@ +../../../../l10n_it_fatturapa_in \ No newline at end of file diff --git a/setup/l10n_it_fatturapa_in/setup.py b/setup/l10n_it_fatturapa_in/setup.py new file mode 100644 index 000000000000..28c57bb64031 --- /dev/null +++ b/setup/l10n_it_fatturapa_in/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +)