From 57648a5c17ec375be6df8fb6ab726ad10a72a579 Mon Sep 17 00:00:00 2001 From: eLBati Date: Tue, 10 Jul 2018 07:57:12 +0200 Subject: [PATCH] porting l10n_it_fatturapa_in to 10 (REF withholding tax integration, invoice interface, fiscal document type ADD some DatiGeneraliDocumento fields) ADD _setTerzoIntermediarioOSoggettoEmittente to l10n_it_fatturapa_out --- l10n_it_fatturapa/__manifest__.py | 4 +- l10n_it_fatturapa/bindings/fatturapa_v_1_2.py | 15 +- l10n_it_fatturapa/data/fatturapa_data.xml | 4 + .../demo/account_invoice_fatturapa.xml | 39 +- l10n_it_fatturapa/i18n/it.po | 487 ++++----- l10n_it_fatturapa/models/account.py | 77 +- l10n_it_fatturapa/models/company.py | 4 +- l10n_it_fatturapa_in/README.rst | 94 ++ l10n_it_fatturapa_in/__init__.py | 19 - l10n_it_fatturapa_in/__manifest__.py | 27 + l10n_it_fatturapa_in/__openerp__.py | 94 -- l10n_it_fatturapa_in/i18n/it.po | 759 ++++++++------ l10n_it_fatturapa_in/models/__init__.py | 20 - l10n_it_fatturapa_in/models/account.py | 86 +- l10n_it_fatturapa_in/models/attachment.py | 40 +- l10n_it_fatturapa_in/readme/CONFIGURE.rst | 1 + l10n_it_fatturapa_in/readme/CONTRIBUTORS.rst | 3 + l10n_it_fatturapa_in/readme/DESCRIPTION.rst | 4 + l10n_it_fatturapa_in/readme/INSTALL.rst | 3 + l10n_it_fatturapa_in/readme/USAGE.rst | 3 + l10n_it_fatturapa_in/tests/__init__.py | 20 - .../tests/data/IT01234567890_11002.xml | 134 --- .../tests/data/IT02780790107_11003.xml | 172 --- .../tests/data/IT02780790107_11004.xml | 14 +- .../tests/data/IT02780790107_11005.xml | 25 +- .../tests/data/IT02780790107_11006.xml | 9 +- .../tests/data/IT02780790107_11007.xml | 12 +- .../tests/data/IT05979361218_001.xml | 15 +- .../tests/data/IT05979361218_002.xml | 15 +- .../tests/data/IT05979361218_003.xml | 15 +- .../tests/data/IT05979361218_004.xml | 15 +- .../tests/data/IT05979361218_005.xml | 13 +- .../tests/data/IT05979361218_006.XML | 13 +- .../tests/data/IT05979361218_007.xml | 17 +- .../tests/data/IT05979361218_008.xml | 13 +- .../tests/data/IT05979361218_009.xml | 95 ++ .../tests/test_import_fatturapa_xml.py | 251 +++-- l10n_it_fatturapa_in/views/account_view.xml | 485 ++++----- l10n_it_fatturapa_in/wizard/__init__.py | 19 - .../wizard/wizard_import_fatturapa.py | 980 ++++++++---------- .../wizard/wizard_import_fatturapa_view.xml | 15 +- .../tests/data/IT06363391001_00001.xml | 2 +- .../tests/data/IT06363391001_00002.xml | 2 +- .../tests/data/IT06363391001_00003.xml | 2 +- .../tests/data/IT06363391001_00004.xml | 2 +- .../tests/data/IT06363391001_00005.xml | 17 +- .../tests/test_fatturapa_xml_validation.py | 4 + .../wizard/wizard_export_fatturapa.py | 52 +- 48 files changed, 2006 insertions(+), 2205 deletions(-) create mode 100644 l10n_it_fatturapa_in/README.rst create mode 100644 l10n_it_fatturapa_in/__manifest__.py delete mode 100644 l10n_it_fatturapa_in/__openerp__.py create mode 100644 l10n_it_fatturapa_in/readme/CONFIGURE.rst create mode 100644 l10n_it_fatturapa_in/readme/CONTRIBUTORS.rst create mode 100644 l10n_it_fatturapa_in/readme/DESCRIPTION.rst create mode 100644 l10n_it_fatturapa_in/readme/INSTALL.rst create mode 100644 l10n_it_fatturapa_in/readme/USAGE.rst delete mode 100644 l10n_it_fatturapa_in/tests/data/IT01234567890_11002.xml delete mode 100644 l10n_it_fatturapa_in/tests/data/IT02780790107_11003.xml create mode 100644 l10n_it_fatturapa_in/tests/data/IT05979361218_009.xml diff --git a/l10n_it_fatturapa/__manifest__.py b/l10n_it_fatturapa/__manifest__.py index c318fa284235..677417bfc736 100644 --- a/l10n_it_fatturapa/__manifest__.py +++ b/l10n_it_fatturapa/__manifest__.py @@ -5,7 +5,7 @@ { 'name': 'Italian Localization - FatturaPA', - 'version': '10.0.1.0.0', + 'version': '10.0.2.0.0', 'category': 'Localization/Italy', 'summary': 'Electronic invoices', 'author': 'Davide Corio, Agile Business Group, Innoviu, ' @@ -21,6 +21,8 @@ 'base_iban', 'l10n_it_account_tax_kind', 'l10n_it_esigibilita_iva', + 'l10n_it_split_payment', + 'l10n_it_fiscal_document_type', ], "data": [ 'data/fatturapa_data.xml', diff --git a/l10n_it_fatturapa/bindings/fatturapa_v_1_2.py b/l10n_it_fatturapa/bindings/fatturapa_v_1_2.py index 6357b5c28e35..085d0b2e745c 100644 --- a/l10n_it_fatturapa/bindings/fatturapa_v_1_2.py +++ b/l10n_it_fatturapa/bindings/fatturapa_v_1_2.py @@ -1305,8 +1305,13 @@ class String60LatinType (pyxb.binding.datatypes.normalizedString): 2) _Documentation = None String60LatinType._CF_pattern = pyxb.binding.facets.CF_pattern() +# strings of blank spaces are allowed by SDI. +# {1,60} would produce +# SimpleFacetValueError: Type +# {http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2} +# String1000LatinType pattern constraint violated by value String60LatinType._CF_pattern.addPattern( - pattern='[\\p{IsBasicLatin}\\p{IsLatin-1Supplement}]{1,60}') + pattern='[\\p{IsBasicLatin}\\p{IsLatin-1Supplement}]{0,60}') String60LatinType._InitializeFacetMap(String60LatinType._CF_pattern) Namespace.addCategoryObject( 'typeBinding', @@ -1332,7 +1337,7 @@ class String80LatinType (pyxb.binding.datatypes.normalizedString): _Documentation = None String80LatinType._CF_pattern = pyxb.binding.facets.CF_pattern() String80LatinType._CF_pattern.addPattern( - pattern='[\\p{IsBasicLatin}\\p{IsLatin-1Supplement}]{1,80}') + pattern='[\\p{IsBasicLatin}\\p{IsLatin-1Supplement}]{0,80}') String80LatinType._InitializeFacetMap(String80LatinType._CF_pattern) Namespace.addCategoryObject( 'typeBinding', @@ -1359,7 +1364,7 @@ class String100LatinType (pyxb.binding.datatypes.normalizedString): _Documentation = None String100LatinType._CF_pattern = pyxb.binding.facets.CF_pattern() String100LatinType._CF_pattern.addPattern( - pattern='[\\p{IsBasicLatin}\\p{IsLatin-1Supplement}]{1,100}') + pattern='[\\p{IsBasicLatin}\\p{IsLatin-1Supplement}]{0,100}') String100LatinType._InitializeFacetMap(String100LatinType._CF_pattern) Namespace.addCategoryObject( 'typeBinding', @@ -1386,7 +1391,7 @@ class String200LatinType (pyxb.binding.datatypes.normalizedString): _Documentation = None String200LatinType._CF_pattern = pyxb.binding.facets.CF_pattern() String200LatinType._CF_pattern.addPattern( - pattern='[\\p{IsBasicLatin}\\p{IsLatin-1Supplement}]{1,200}') + pattern='[\\p{IsBasicLatin}\\p{IsLatin-1Supplement}]{0,200}') String200LatinType._InitializeFacetMap(String200LatinType._CF_pattern) Namespace.addCategoryObject( 'typeBinding', @@ -1413,7 +1418,7 @@ class String1000LatinType (pyxb.binding.datatypes.normalizedString): _Documentation = None String1000LatinType._CF_pattern = pyxb.binding.facets.CF_pattern() String1000LatinType._CF_pattern.addPattern( - pattern='[\\p{IsBasicLatin}\\p{IsLatin-1Supplement}]{1,1000}') + pattern='[\\p{IsBasicLatin}\\p{IsLatin-1Supplement}]{0,1000}') String1000LatinType._InitializeFacetMap(String1000LatinType._CF_pattern) Namespace.addCategoryObject( 'typeBinding', diff --git a/l10n_it_fatturapa/data/fatturapa_data.xml b/l10n_it_fatturapa/data/fatturapa_data.xml index 49987fe8126a..2dfa39193ee2 100644 --- a/l10n_it_fatturapa/data/fatturapa_data.xml +++ b/l10n_it_fatturapa/data/fatturapa_data.xml @@ -101,6 +101,10 @@ RF18 Altro + + RF19 + Regime forfettario (art.1, c.54-89, L. 190/2014) + diff --git a/l10n_it_fatturapa/demo/account_invoice_fatturapa.xml b/l10n_it_fatturapa/demo/account_invoice_fatturapa.xml index 9b673956b58c..b76e0b9129b0 100644 --- a/l10n_it_fatturapa/demo/account_invoice_fatturapa.xml +++ b/l10n_it_fatturapa/demo/account_invoice_fatturapa.xml @@ -6,6 +6,14 @@ 22% ftPA 22 22 + sale + + + + 22% ftPA acq + 22 acq + 22 + purchase @@ -13,6 +21,7 @@ 22 Split Payment 22 S + sale @@ -21,6 +30,16 @@ 0.00 regime contribuenti minimi art.27 c.1-2 DL.98/11 + sale + + + + Esente Acq + 00 Acq + 0.00 + + regime contribuenti minimi art.27 c.1-2 DL.98/11 + purchase @@ -68,7 +87,7 @@ IT06363391001 - 79SRAK + UFPQ1O @@ -91,7 +110,23 @@ www.mypa.it 00146089990 IT00146089990 - 79SRAK + UFPQ1O + + + + Intermediario + 0 + 1 + 1 + Torino + 10100 + + + Via Milano, 1 + info@mycompany.it + 123456789 + 03297040366 + IT03297040366 diff --git a/l10n_it_fatturapa/i18n/it.po b/l10n_it_fatturapa/i18n/it.po index a0a5709ea351..2a5088e04041 100644 --- a/l10n_it_fatturapa/i18n/it.po +++ b/l10n_it_fatturapa/i18n/it.po @@ -1,47 +1,19 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * l10n_it_fatturapa +# * l10n_it_fatturapa # -# Translators: -# OCA Transbot , 2017 -# Paolo Valier, 2018 msgid "" msgstr "" "Project-Id-Version: Odoo Server 10.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-11 12:21+0000\n" -"PO-Revision-Date: 2018-05-11 12:21+0000\n" -"Last-Translator: Paolo Valier, 2018\n" -"Language-Team: Italian (https://www.transifex.com/oca/teams/23907/it/)\n" -"Language: it\n" +"POT-Creation-Date: 2018-09-05 14:12+0000\n" +"PO-Revision-Date: 2018-09-05 14:12+0000\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: nplurals=2; plural=(n != 1);\n" - -#. module: l10n_it_fatturapa -#: model:account.tax,description:l10n_it_fatturapa.tax_00_e15 -#: model:account.tax,description:l10n_it_fatturapa.tax_00_minimi -#: model:account.tax,description:l10n_it_fatturapa.tax_00_ni -#: model:account.tax,description:l10n_it_fatturapa.tax_00_ns -#: model:account.tax,description:l10n_it_fatturapa.tax_00_rc -msgid "00" -msgstr "00" - -#. module: l10n_it_fatturapa -#: model:account.tax,description:l10n_it_fatturapa.tax_22 -msgid "22" -msgstr "22" - -#. module: l10n_it_fatturapa -#: model:account.tax,description:l10n_it_fatturapa.tax_22_SP -msgid "22 Split Payment" -msgstr "" - -#. module: l10n_it_fatturapa -#: model:account.tax,name:l10n_it_fatturapa.tax_22 -msgid "22% ftPA" -msgstr "" +"Plural-Forms: \n" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_payment_detail_payment_bank_abi @@ -56,12 +28,12 @@ msgstr "Progresso Attività" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_line_admin_ref msgid "Administration ref." -msgstr "" +msgstr "Rif. amministrazione" #. module: l10n_it_fatturapa #: selection:fatturapa.related_document_type,type:0 msgid "Agreement" -msgstr "" +msgstr "Agreement" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_discount_rise_price_amount @@ -71,20 +43,26 @@ msgstr "Importo" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_payment_detail_penalty_amount msgid "Amount of Penality" -msgstr "" +msgstr "Penalita Pagamenti Ritardati" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_faturapa_summary_data_amount_tax msgid "Amount tax" -msgstr "" +msgstr "Importo imposte" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_faturapa_summary_data_amount_untaxed msgid "Amount untaxed" -msgstr "" +msgstr "Importo imponibile" + +#. module: l10n_it_fatturapa +#: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_efatt_rounding +msgid "Arrotondamento" +msgstr "Arrotondamento" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_config_settings_fatturapa_art73 +#: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_art73 #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_res_company_fatturapa_art73 msgid "Art73" msgstr "Art73" @@ -101,7 +79,6 @@ msgstr "Nome Allegato" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_attachments_local_url -#: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_attachments_website_url msgid "Attachment URL" msgstr "URL Allegato" @@ -115,11 +92,21 @@ msgstr "BIC" msgid "Bank name" msgstr "Nome Banca" +#. module: l10n_it_fatturapa +#: model:ir.model.fields,help:l10n_it_fatturapa.field_account_invoice_efatt_stabile_organizzazione_indirizzo +msgid "Blocco da valorizzare nei casi di cedente / prestatore non residente, con stabile organizzazione in Italia. Indirizzo della stabile organizzazione in Italia (nome della via, piazza etc.)" +msgstr "Blocco da valorizzare nei casi di cedente / prestatore non residente, con stabile organizzazione in Italia. Indirizzo della stabile organizzazione in Italia (nome della via, piazza etc.)" + #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_payment_detail_payment_bank_cab msgid "CAB" msgstr "CAB" +#. module: l10n_it_fatturapa +#: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_efatt_stabile_organizzazione_cap +msgid "CAP Organizzazione" +msgstr "CAP Organizzazione" + #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_related_document_type_cig msgid "CIG Code" @@ -140,6 +127,11 @@ msgstr "Corriere" msgid "Checksum/SHA1" msgstr "Checksum/SHA1" +#. module: l10n_it_fatturapa +#: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_efatt_stabile_organizzazione_civico +msgid "Civico Organizzazione" +msgstr "Civico Organizzazione" + #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_document_type_code #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_fiscal_position_code @@ -149,6 +141,16 @@ msgstr "Checksum/SHA1" msgid "Code" msgstr "Codice" +#. module: l10n_it_fatturapa +#: model:ir.model.fields,help:l10n_it_fatturapa.field_account_invoice_efatt_stabile_organizzazione_cap +msgid "Codice Avviamento Postale" +msgstr "Codice Avviamento Postale" + +#. module: l10n_it_fatturapa +#: model:ir.model.fields,help:l10n_it_fatturapa.field_account_invoice_efatt_stabile_organizzazione_nazione +msgid "Codice della nazione espresso secondo lo standard ISO 3166-1 alpha-2 code" +msgstr "Codice della nazione espresso secondo lo standard ISO 3166-1 alpha-2 code" + #. module: l10n_it_fatturapa #: model:ir.model,name:l10n_it_fatturapa.model_res_company msgid "Companies" @@ -162,7 +164,17 @@ msgstr "Azienda" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_attachments_compression msgid "Compression" -msgstr "" +msgstr "Algoritmo Compressione" + +#. module: l10n_it_fatturapa +#: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_efatt_stabile_organizzazione_comune +msgid "Comune Organizzazione" +msgstr "Comune Organizzazione" + +#. module: l10n_it_fatturapa +#: model:ir.model.fields,help:l10n_it_fatturapa.field_account_invoice_efatt_stabile_organizzazione_comune +msgid "Comune relativo alla stabile organizzazione in Italia" +msgstr "Comune relativo alla stabile organizzazione in Italia" #. module: l10n_it_fatturapa #: model:ir.ui.view,arch_db:l10n_it_fatturapa.view_account_config_settings @@ -215,7 +227,7 @@ msgstr "Creato il" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_attachments_db_datas msgid "Database Data" -msgstr "" +msgstr "Dati Database" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_related_ddt_date @@ -223,20 +235,25 @@ msgstr "" msgid "Date" msgstr "Data" +#. module: l10n_it_fatturapa +#: model:ir.model.fields,help:l10n_it_fatturapa.field_res_company_fatturapa_sender_partner +msgid "Dati relativi al soggetto terzo che emette fattura per conto del cedente / prestatore" +msgstr "Dati relativi al soggetto terzo che emette fattura per conto del cedente / prestatore" + #. module: l10n_it_fatturapa #: selection:faturapa.summary.data,payability:0 msgid "Deferred payability" -msgstr "" +msgstr "Esigibilità differita" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_delivery_address msgid "Delivery Address" -msgstr "" +msgstr "Indirizzo di consegna" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_delivery_datetime msgid "Delivery Date Time" -msgstr "" +msgstr "Data e ora di consegna" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_description @@ -255,9 +272,9 @@ msgid "Discount" msgstr "Sconto" #. module: l10n_it_fatturapa -#: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_discount_rise_price_ids +#: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_line_discount_rise_price_ids msgid "Discount and Rise Price Details" -msgstr "" +msgstr "Dettagli sconto e maggiorazione" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_discount_rise_price_display_name @@ -279,7 +296,6 @@ msgid "Display Name" msgstr "Nome Visualizzato" #. module: l10n_it_fatturapa -#: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_doc_type #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_related_document_type_type msgid "Document Type" msgstr "Tipo Documento" @@ -288,7 +304,7 @@ msgstr "Tipo Documento" #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_related_ddt_name #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_related_document_type_name msgid "DocumentID" -msgstr "" +msgstr "DocumentID" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_res_partner_eori_code @@ -299,106 +315,92 @@ msgstr "Codice EORI" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_payment_detail_penalty_date msgid "Effective date of Penality" -msgstr "" - -#. module: l10n_it_fatturapa -#: model:account.tax,name:l10n_it_fatturapa.tax_00_e15 -msgid "Esculso Art. 15" -msgstr "" +msgstr "Data Decorrenza Penale" #. module: l10n_it_fatturapa -#: model:account.tax,name:l10n_it_fatturapa.tax_00_minimi -msgid "Esente" -msgstr "" +#: model:ir.model.fields,help:l10n_it_fatturapa.field_account_invoice_efatt_rounding +msgid "Eventuale arrotondamento sul totale documento (ammette anche il segno negativo)" +msgstr "Eventuale arrotondamento sul totale documento (ammette anche il segno negativo)" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_activity_progress_ids msgid "Fase of Activity Progress" -msgstr "" +msgstr "Fase dell'avanzamento attività" #. module: l10n_it_fatturapa #: model:ir.ui.menu,name:l10n_it_fatturapa.menu_fattura_pa_payables #: model:ir.ui.menu,name:l10n_it_fatturapa.menu_fattura_pa_receivables #: model:ir.ui.view,arch_db:l10n_it_fatturapa.view_account_config_settings msgid "Fattura PA" -msgstr "" +msgstr "Fattura PA" #. module: l10n_it_fatturapa #: model:ir.ui.view,arch_db:l10n_it_fatturapa.view_invoice_line_form_fatturapa #: model:ir.ui.view,arch_db:l10n_it_fatturapa.view_partner_form_fatturapa -#: model:ir.ui.view,arch_db:l10n_it_fatturapa.view_payment_term_form_fatturapa msgid "FatturaPA" -msgstr "" +msgstr "FatturaPA" #. module: l10n_it_fatturapa #: model:ir.model,name:l10n_it_fatturapa.model_discount_rise_price msgid "FatturaPA Discount Rise Price Data" -msgstr "" +msgstr "Dati sconto maggiorazione" #. module: l10n_it_fatturapa #: model:ir.model,name:l10n_it_fatturapa.model_fatturapa_document_type msgid "FatturaPA Document Type" -msgstr "" +msgstr "Tipo documento" #. module: l10n_it_fatturapa #: model:ir.model,name:l10n_it_fatturapa.model_fatturapa_fiscal_position msgid "FatturaPA Fiscal Position" -msgstr "" +msgstr "FatturaPA Fiscal Position" #. module: l10n_it_fatturapa #: model:ir.model,name:l10n_it_fatturapa.model_fatturapa_format msgid "FatturaPA Format" -msgstr "" +msgstr "FatturaPA Format" #. module: l10n_it_fatturapa #: model:ir.model,name:l10n_it_fatturapa.model_fatturapa_payment_data msgid "FatturaPA Payment Data" -msgstr "" +msgstr "FatturaPA Payment Data" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_fatturapa_payments msgid "FatturaPA Payment Datas" -msgstr "" +msgstr "FatturaPA Payment Datas" #. module: l10n_it_fatturapa -#: model:ir.model,name:l10n_it_fatturapa.model_fatturapa_payment_method -#: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_payment_term_fatturapa_pm_id #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_payment_data_payment_terms #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_payment_detail_fatturapa_pm_id msgid "FatturaPA Payment Method" -msgstr "" - -#. module: l10n_it_fatturapa -#: model:ir.model,name:l10n_it_fatturapa.model_fatturapa_payment_term -#: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_payment_term_fatturapa_pt_id -msgid "FatturaPA Payment Term" -msgstr "" +msgstr "FatturaPA Payment Method" #. module: l10n_it_fatturapa #: model:ir.model,name:l10n_it_fatturapa.model_fatturapa_related_ddt msgid "FatturaPA Related DdT" -msgstr "" +msgstr "FatturaPA Related DdT" #. module: l10n_it_fatturapa #: model:ir.model,name:l10n_it_fatturapa.model_fatturapa_related_document_type msgid "FatturaPA Related Document Type" -msgstr "" +msgstr "FatturaPA Related Document Type" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_fatturapa_summary_ids msgid "FatturaPA Summary Datas" -msgstr "" +msgstr "FatturaPA Summary Datas" #. module: l10n_it_fatturapa #: model:ir.model,name:l10n_it_fatturapa.model_welfare_fund_data_line msgid "FatturaPA Welfare Fund Data" -msgstr "" +msgstr "FatturaPA Welfare Fund Data" #. module: l10n_it_fatturapa #: model:ir.model,name:l10n_it_fatturapa.model_fatturapa_attachments #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_fatturapa_doc_attachments msgid "FatturaPA attachments" -msgstr "" +msgstr "FatturaPA attachments" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_attachments_datas @@ -408,13 +410,25 @@ msgstr "Contenuto del File" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_attachments_datas_fname msgid "File Name" -msgstr "Nome del File" +msgstr "Nome File" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_attachments_file_size msgid "File Size" msgstr "Dimensione File" +#. module: l10n_it_fatturapa +#: model:ir.model,name:l10n_it_fatturapa.model_fatturapa_payment_method +#: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_payment_term_fatturapa_pm_id +msgid "Fiscal Payment Method" +msgstr "Metodo pagamento fiscale" + +#. module: l10n_it_fatturapa +#: model:ir.model,name:l10n_it_fatturapa.model_fatturapa_payment_term +#: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_payment_term_fatturapa_pt_id +msgid "Fiscal Payment Term" +msgstr "Condizioni di pagamento fiscali" + #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_config_settings_fatturapa_fiscal_position_id #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_res_company_fatturapa_fiscal_position_id @@ -425,7 +439,7 @@ msgstr "Posizione Fiscale" #: model:ir.model.fields,help:l10n_it_fatturapa.field_account_config_settings_fatturapa_fiscal_position_id #: model:ir.model.fields,help:l10n_it_fatturapa.field_res_company_fatturapa_fiscal_position_id msgid "Fiscal position used by FatturaPA" -msgstr "" +msgstr "Posizione fiscale Fattura elettronica" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_attachments_format @@ -461,30 +475,45 @@ msgstr "IBAN" msgid "ID" msgstr "ID" +#. module: l10n_it_fatturapa +#: selection:faturapa.summary.data,non_taxable_nature:0 +msgid "IVA assolta in altro stato UE" +msgstr "IVA assolta in altro stato UE" + #. module: l10n_it_fatturapa #: selection:faturapa.summary.data,payability:0 msgid "Immediate payability" -msgstr "" +msgstr "Esigibilità immediata" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_faturapa_summary_data_incidental_charges msgid "Incidental Charges" -msgstr "" +msgstr "Spese Accessorie" + +#. module: l10n_it_fatturapa +#: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_ftpa_incoterms +msgid "Incoterms" +msgstr "Incoterms" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_attachments_index_content msgid "Indexed Content" -msgstr "" +msgstr "Contenuto Indicizzato" #. module: l10n_it_fatturapa -#: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_intermediary -msgid "Intermediary" -msgstr "" +#: model:ir.model.fields,help:l10n_it_fatturapa.field_account_invoice_art73 +msgid "Indica se il documento è stato emesso secondo modalità e termini stabiliti con decreto ministeriale ai sensi dell'articolo 73 del DPR 633/72 (ciò consente al cedente/prestatore l'emissione nello stesso anno di più documenti aventi stesso numero)" +msgstr "Indica se il documento è stato emesso secondo modalità e termini stabiliti con decreto ministeriale ai sensi dell'articolo 73 del DPR 633/72 (ciò consente al cedente/prestatore l'emissione nello stesso anno di più documenti aventi stesso numero)" #. module: l10n_it_fatturapa -#: model:account.tax,name:l10n_it_fatturapa.tax_00_rc -msgid "Inversione Contabile" -msgstr "" +#: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_efatt_stabile_organizzazione_indirizzo +msgid "Indirizzo Organizzazione" +msgstr "Indirizzo Organizzazione" + +#. module: l10n_it_fatturapa +#: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_intermediary +msgid "Intermediary" +msgstr "Intermediario" #. module: l10n_it_fatturapa #: model:ir.model,name:l10n_it_fatturapa.model_account_invoice @@ -499,7 +528,7 @@ msgstr "Riga Fattura" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_attachments_public msgid "Is public document" -msgstr "" +msgstr "È un documento pubblico" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_discount_rise_price___last_update @@ -561,18 +590,18 @@ msgstr "Ultima modifica il" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_faturapa_summary_data_law_reference msgid "Law reference" -msgstr "" +msgstr "Riferimento Normativo" #. module: l10n_it_fatturapa #: selection:account.invoice,ftpa_withholding_type:0 msgid "Legal Person" -msgstr "" +msgstr "Persona legale" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_config_settings_fatturapa_tax_representative #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_res_company_fatturapa_tax_representative msgid "Legal Tax Representative" -msgstr "" +msgstr "Rappresentante fiscale" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_res_partner_license_number @@ -584,7 +613,7 @@ msgstr "Codice Licenza" #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_related_ddt_lineRef #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_related_document_type_lineRef msgid "LineRef" -msgstr "" +msgstr "LineRef" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_res_company_fatturapa_rea_liquidation @@ -594,7 +623,7 @@ msgstr "Stato di liquidazione" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_payment_detail_max_payment_date msgid "Maximum date for Payment" -msgstr "" +msgstr "Data massima per il pagamento" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_res_company_fatturapa_rea_partner @@ -609,33 +638,33 @@ msgstr "Tipo Mime" #. module: l10n_it_fatturapa #: selection:account.invoice,ftpa_withholding_type:0 msgid "Natural Person" -msgstr "" +msgstr "Persona naturale" + +#. module: l10n_it_fatturapa +#: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_efatt_stabile_organizzazione_nazione +msgid "Nazione Organizzazione" +msgstr "Nazione Organizzazione" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_net_weight msgid "Net Weight" msgstr "Peso Netto" -#. module: l10n_it_fatturapa -#: model:account.tax,name:l10n_it_fatturapa.tax_00_ni -msgid "Non Imponibile" -msgstr "" - -#. module: l10n_it_fatturapa -#: model:account.tax,name:l10n_it_fatturapa.tax_00_ns -msgid "Non soggetto Iva" -msgstr "" - #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_faturapa_summary_data_non_taxable_nature #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_welfare_fund_data_line_kind_id msgid "Non taxable nature" -msgstr "" +msgstr "Non taxable nature" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_related_document_type_numitem msgid "NumItem" -msgstr "" +msgstr "NumItem" + +#. module: l10n_it_fatturapa +#: model:ir.model.fields,help:l10n_it_fatturapa.field_account_invoice_efatt_stabile_organizzazione_civico +msgid "Numero civico riferito all'indirizzo (non indicare se già presente nell'elemento informativo indirizzo)" +msgstr "Numero civico riferito all'indirizzo (non indicare se già presente nell'elemento informativo indirizzo)" #. module: l10n_it_fatturapa #: selection:fatturapa.related_document_type,type:0 @@ -645,18 +674,18 @@ msgstr "Ordine" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_related_document_type_code msgid "Order Agreement Code" -msgstr "" +msgstr "Order Agreement Code" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_res_partner_pa_partner_code #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_res_users_pa_partner_code msgid "PA Code for partner" -msgstr "" +msgstr "PA Code for partner" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_welfare_fund_data_line_pa_line_code msgid "PA Code for this record" -msgstr "" +msgstr "PA Code for this record" #. module: l10n_it_fatturapa #: model:ir.model,name:l10n_it_fatturapa.model_res_partner @@ -666,12 +695,12 @@ msgstr "Partner" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_payment_detail_payment_amount msgid "Payment Amount" -msgstr "" +msgstr "Importo pagamento" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_payment_detail_payment_bank msgid "Payment Bank" -msgstr "" +msgstr "Banca pagamento" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_payment_detail_account_move_line_id @@ -686,12 +715,12 @@ msgstr "Termine di pagamento" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_payment_detail_payment_days msgid "Payment Term Days" -msgstr "" +msgstr "Giorni termine di pagamento" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_payment_detail_payment_term_start msgid "Payment Term Start" -msgstr "" +msgstr "Inizio termine di pagamento" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_payment_detail_payment_code @@ -701,12 +730,12 @@ msgstr "Codice Pagamento" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_payment_detail_payment_due_date msgid "Payment due Date" -msgstr "" +msgstr "Scadenza pagamento" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_payment_data_payment_methods msgid "Payments Details" -msgstr "" +msgstr "Dettagli pagamento" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_discount_rise_price_percentage @@ -716,71 +745,76 @@ msgstr "Percentuale" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_pickup_datetime msgid "Pick up" -msgstr "" +msgstr "Pick up" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_payment_detail_post_office_code msgid "Post Office Code" -msgstr "" +msgstr "Post Office Code" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_payment_detail_prepayment_discount msgid "Prepayment Discount" -msgstr "" +msgstr "Prepayment Discount" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_res_partner_register #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_res_users_register msgid "Professional Register" -msgstr "" +msgstr "Professional Register" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_protocol_number msgid "Protocol Number" -msgstr "" +msgstr "Protocol Number" + +#. module: l10n_it_fatturapa +#: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_efatt_stabile_organizzazione_provincia +msgid "Provincia Organizzazione" +msgstr "Provincia Organizzazione" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_config_settings_fatturapa_pub_administration_ref #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_res_company_fatturapa_pub_administration_ref msgid "Public Administration Reference Code" -msgstr "" +msgstr "Public Administration Reference Code" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_res_company_fatturapa_rea_office msgid "REA office" -msgstr "" +msgstr "REA office" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_config_settings_fatturapa_rea_capital #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_res_company_fatturapa_rea_capital msgid "Rea Capital" -msgstr "" +msgstr "Rea Capital" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_config_settings_fatturapa_rea_partner msgid "Rea Copartner" -msgstr "" +msgstr "Rea Copartner" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_config_settings_fatturapa_rea_liquidation msgid "Rea Liquidation" -msgstr "" +msgstr "Stato Liquidazione" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_config_settings_fatturapa_rea_number #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_res_company_fatturapa_rea_number msgid "Rea Number" -msgstr "" +msgstr "Numero REA" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_config_settings_fatturapa_rea_office msgid "Rea Office" -msgstr "" +msgstr "Ufficio REA" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_transport_reason msgid "Reason" -msgstr "" +msgstr "Motivo" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_payment_detail_recepit_cf @@ -788,47 +822,47 @@ msgstr "" #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_payment_detail_recepit_surname #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_payment_detail_recepit_title msgid "Recepit payment partner contact" -msgstr "" +msgstr "Recepit payment partner contact" #. module: l10n_it_fatturapa #: selection:fatturapa.related_document_type,type:0 msgid "Reception" -msgstr "" +msgstr "Reception" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_payment_detail_recipient msgid "Recipient" -msgstr "" +msgstr "Destinatario" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_res_partner_register_code #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_res_users_register_code msgid "Register Code" -msgstr "" +msgstr "Register Code" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_res_partner_register_fiscalpos #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_res_users_register_fiscalpos msgid "Register Fiscal Position" -msgstr "" +msgstr "Register Fiscal Position" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_res_partner_register_province #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_res_users_register_province msgid "Register Province" -msgstr "" +msgstr "Register Province" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_res_partner_register_regdate #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_res_users_register_regdate msgid "Register Registration Date" -msgstr "" +msgstr "Register Registration Date" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_ftpa_related_ddts #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_line_ftpa_related_ddts msgid "Related DdT" -msgstr "" +msgstr "Related DdT" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_related_documents @@ -839,11 +873,12 @@ msgstr "Documenti Correlati" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_line_related_documents msgid "Related Documents Type" -msgstr "" +msgstr "Related Documents Type" #. module: l10n_it_fatturapa #: selection:fatturapa.related_document_type,type:0 #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_discount_rise_price_invoice_id +#: model:ir.model.fields,field_description:l10n_it_fatturapa.field_discount_rise_price_invoice_line_id #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_attachments_invoice_id #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_payment_data_invoice_id #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_related_ddt_invoice_id @@ -852,43 +887,43 @@ msgstr "" #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_faturapa_summary_data_invoice_id #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_welfare_fund_data_line_invoice_id msgid "Related Invoice" -msgstr "" +msgstr "Related Invoice" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_related_ddt_invoice_line_id #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_related_document_type_invoice_line_id msgid "Related Invoice Line" -msgstr "" +msgstr "Related Invoice Line" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_related_invoice_code msgid "Related invoice code" -msgstr "" +msgstr "Related invoice code" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_related_invoice_date msgid "Related invoice date" -msgstr "" +msgstr "Related invoice date" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_payment_detail_payment_data_id msgid "Related payments Data" -msgstr "" +msgstr "Related payments Data" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_attachments_res_field msgid "Resource Field" -msgstr "" +msgstr "Campo Risorsa" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_attachments_res_id msgid "Resource ID" -msgstr "" +msgstr "ID Risorsa" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_attachments_res_model msgid "Resource Model" -msgstr "" +msgstr "Modello della Risorsa" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_attachments_res_name @@ -898,22 +933,17 @@ msgstr "Nome Risorsa" #. module: l10n_it_fatturapa #: selection:discount.rise.price,name:0 msgid "Rise Price" -msgstr "" +msgstr "Rise Price" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_faturapa_summary_data_rounding msgid "Rounding" -msgstr "" - -#. module: l10n_it_fatturapa -#: model:account.tax,name:l10n_it_fatturapa.tax_22_SP -msgid "SP22%" -msgstr "" +msgstr "Rounding" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_sender msgid "Sender" -msgstr "" +msgstr "Sender" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_config_settings_fatturapa_sequence_id @@ -921,61 +951,72 @@ msgstr "" msgid "Sequence" msgstr "Sequenza" +#. module: l10n_it_fatturapa +#: model:ir.model.fields,help:l10n_it_fatturapa.field_account_invoice_efatt_stabile_organizzazione_provincia +msgid "Sigla della provincia di appartenenza del comune indicato nell'elemento informativo 1.2.3.4 . Da valorizzare se l'elemento informativo 1.2.3.6 è uguale a IT" +msgstr "Sigla della provincia di appartenenza del comune indicato nell'elemento informativo 1.2.3.4 . Da valorizzare se l'elemento informativo 1.2.3.6 è uguale a IT" + #. module: l10n_it_fatturapa #: selection:faturapa.summary.data,payability:0 msgid "Split payment" -msgstr "" +msgstr "Split payment" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_stamp_amount msgid "Stamp Amount" -msgstr "" +msgstr "Stamp Amount" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_fatturapa_attachments_store_fname msgid "Stored Filename" -msgstr "" +msgstr "Nome del File Registrato" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_welfare_fund_data_line_subjected_withholding -msgid "Subjected at Withholding" -msgstr "" +msgid "Subjected to Withholding" +msgstr "Subjected to Withholding" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_tax_representative_id msgid "Tax Rapresentative" -msgstr "" +msgstr "Tax Rapresentative" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_faturapa_summary_data_tax_rate msgid "Tax Rate" -msgstr "" +msgstr "Tax Rate" #. module: l10n_it_fatturapa #: model:ir.model.fields,help:l10n_it_fatturapa.field_fatturapa_attachments_res_model msgid "The database object this attachment will be attached to." -msgstr "" +msgstr "L'oggetto del database a cui verrà allegato questo allegato." #. module: l10n_it_fatturapa #: model:ir.model.fields,help:l10n_it_fatturapa.field_fatturapa_attachments_res_id msgid "The record id this is attached to." -msgstr "" +msgstr "The record id this is attached to." + +#. module: l10n_it_fatturapa +#: model:ir.model.fields,help:l10n_it_fatturapa.field_account_config_settings_fatturapa_sequence_id +#: model:ir.model.fields,help:l10n_it_fatturapa.field_res_company_fatturapa_sequence_id +msgid "The univocal progressive of the file is represented by an alphanumeric sequence of maximum length 5, its values are included in 'A'-'Z' and '0'-'9'" +msgstr "The univocal progressive of the file is represented by an alphanumeric sequence of maximum length 5, its values are included in 'A'-'Z' and '0'-'9'" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_config_settings_fatturapa_sender_partner #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_res_company_fatturapa_sender_partner msgid "Third Party/Sender" -msgstr "" +msgstr "Third Party/Sender" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_transport_date msgid "Transport Date" -msgstr "" +msgstr "Transport Date" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_total_travel msgid "Travel in hours or Km" -msgstr "" +msgstr "Travel in hours or Km" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_discount_rise_price_name @@ -990,94 +1031,78 @@ msgstr "Url" #. module: l10n_it_fatturapa #: model:ir.model.fields,help:l10n_it_fatturapa.field_account_config_settings_fatturapa_tax_representative -msgid "" -"Used when a foreign company needs to send invoices to anItalian PA and has a " -"tax representative in Italy" -msgstr "" +msgid "Used when a foreign company needs to send invoices to anItalian PA and has a tax representative in Italy" +msgstr "Used when a foreign company needs to send invoices to anItalian PA and has a tax representative in Italy" #. module: l10n_it_fatturapa #: model:ir.model.fields,help:l10n_it_fatturapa.field_account_config_settings_fatturapa_sender_partner -msgid "" -"Used when company sends invoices to a third party and they send invoices to " -"SDI" -msgstr "" +msgid "Used when company sends invoices to a third party and they send invoices to SDI" +msgstr "Used when company sends invoices to a third party and they send invoices to SDI" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_faturapa_summary_data_payability msgid "VAT payability" -msgstr "" +msgstr "VAT payability" #. module: l10n_it_fatturapa -#: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_transport_vaicle -msgid "Veicle" -msgstr "" +#: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_transport_vehicle +msgid "Vehicle" +msgstr "Vehicle" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_vaicle_registration msgid "Veicole Registration" -msgstr "" +msgstr "Veicole Registration" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_virtual_stamp msgid "Virtual Stamp" -msgstr "" +msgstr "Virtual Stamp" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_unit_weight msgid "Weight unit" -msgstr "" +msgstr "Weight unit" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_welfare_fund_data_line_welfare_Iva_tax msgid "Welfare tax" -msgstr "" +msgstr "Welfare tax" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_welfare_fund_data_line_welfare_amount_tax msgid "Welfare Amount tax" -msgstr "" +msgstr "Welfare Amount tax" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_welfare_fund_ids msgid "Welfare Fund" -msgstr "" +msgstr "Welfare Fund" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_welfare_fund_data_line_name msgid "Welfare Fund Type" -msgstr "" +msgstr "Welfare Fund Type" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_welfare_fund_data_line_welfare_rate_tax msgid "Welfare Rate tax" -msgstr "" +msgstr "Welfare Rate tax" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_welfare_fund_data_line_welfare_taxable msgid "Welfare Taxable" -msgstr "" - -#. module: l10n_it_fatturapa -#: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_ftpa_withholding_rate -msgid "Withholding rate" -msgstr "" - -#. module: l10n_it_fatturapa -#: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_ftpa_withholding_payment_reason -msgid "Withholding reason" -msgstr "" +msgstr "Welfare Taxable" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_ftpa_withholding_type msgid "Withholding type" -msgstr "" +msgstr "Withholding type" #. module: l10n_it_fatturapa #: model:ir.model.fields,help:l10n_it_fatturapa.field_fatturapa_attachments_type -msgid "" -"You can either upload a file from your computer or copy/paste an internet " -"link to your file." -msgstr "" +msgid "You can either upload a file from your computer or copy/paste an internet link to your file." +msgstr "Puoi inviare un file dal computer o copiare/incollare un indirizzo Internet che è collegato al tuo file." #. module: l10n_it_fatturapa #: model:ir.model,name:l10n_it_fatturapa.model_account_config_settings @@ -1087,92 +1112,80 @@ msgstr "account.config.settings" #. module: l10n_it_fatturapa #: selection:account.invoice,sender:0 msgid "assignee / partner" -msgstr "" +msgstr "assignee / partner" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_welfare_fund_type_description msgid "description" -msgstr "" +msgstr "description" #. module: l10n_it_fatturapa #: selection:faturapa.summary.data,non_taxable_nature:0 msgid "escluse ex art. 15" -msgstr "" +msgstr "escluse ex art. 15" #. module: l10n_it_fatturapa #: selection:faturapa.summary.data,non_taxable_nature:0 msgid "esenti" -msgstr "" +msgstr "esenti" #. module: l10n_it_fatturapa #: model:ir.model,name:l10n_it_fatturapa.model_fatturapa_payment_detail msgid "fatturapa.payment.detail" -msgstr "" +msgstr "fatturapa.payment.detail" #. module: l10n_it_fatturapa #: model:ir.model,name:l10n_it_fatturapa.model_faturapa_activity_progress msgid "faturapa.activity.progress" -msgstr "" +msgstr "faturapa.activity.progress" #. module: l10n_it_fatturapa #: model:ir.model,name:l10n_it_fatturapa.model_faturapa_summary_data msgid "faturapa.summary.data" -msgstr "" - -#. module: l10n_it_fatturapa -#: model:ir.model.fields,help:l10n_it_fatturapa.field_account_config_settings_fatturapa_sequence_id -#: model:ir.model.fields,help:l10n_it_fatturapa.field_res_company_fatturapa_sequence_id -msgid "" -"il progressivo univoco del file è rappresentato da una stringa alfanumerica " -"di lunghezza massima di 5 caratteri e con valori ammessi da “A” a “Z” e da " -"“0” a “9”." -msgstr "" +msgstr "faturapa.summary.data" #. module: l10n_it_fatturapa #: model:ir.model.fields,help:l10n_it_fatturapa.field_account_config_settings_fatturapa_art73 -msgid "" -"indicates whether the document has been issued in accordance with the terms " -"and conditions established by ministerial decree in accordance with Article " -"73 of Presidential Decree633/72 (this allows the company to issue the same " -"year more documents with the same number)" -msgstr "" +msgid "indicates whether the document has been issued in accordance with the terms and conditions established by ministerial decree in accordance with Article 73 of Presidential Decree633/72 (this allows the company to issue the same year more documents with the same number)" +msgstr "indicates whether the document has been issued in accordance with the terms and conditions established by ministerial decree in accordance with Article 73 of Presidential Decree633/72 (this allows the company to issue the same year more documents with the same number)" #. module: l10n_it_fatturapa #: selection:faturapa.summary.data,non_taxable_nature:0 msgid "inversione contabile (reverse charge)" -msgstr "" +msgstr "inversione contabile (reverse charge)" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_welfare_fund_type_name msgid "name" -msgstr "" +msgstr "name" #. module: l10n_it_fatturapa #: selection:faturapa.summary.data,non_taxable_nature:0 msgid "non imponibili" -msgstr "" +msgstr "non imponibili" #. module: l10n_it_fatturapa #: selection:faturapa.summary.data,non_taxable_nature:0 msgid "non soggette" -msgstr "" +msgstr "non soggette" #. module: l10n_it_fatturapa #: model:ir.model.fields,field_description:l10n_it_fatturapa.field_account_invoice_number_items msgid "number of items" -msgstr "" +msgstr "number of items" #. module: l10n_it_fatturapa #: selection:faturapa.summary.data,non_taxable_nature:0 msgid "regime del margine" -msgstr "" +msgstr "regime del margine" #. module: l10n_it_fatturapa #: selection:account.invoice,sender:0 msgid "third person" -msgstr "" +msgstr "third person" #. module: l10n_it_fatturapa #: model:ir.model,name:l10n_it_fatturapa.model_welfare_fund_type msgid "welfare fund type" -msgstr "" +msgstr "welfare fund type" + diff --git a/l10n_it_fatturapa/models/account.py b/l10n_it_fatturapa/models/account.py index 650f9269b573..c20c25385b80 100644 --- a/l10n_it_fatturapa/models/account.py +++ b/l10n_it_fatturapa/models/account.py @@ -143,7 +143,7 @@ class WelfareFundDataLine(models.Model): welfare_taxable = fields.Float('Welfare Taxable') welfare_Iva_tax = fields.Float('Welfare tax') subjected_withholding = fields.Char( - 'Subjected at Withholding', size=2) + 'Subjected to Withholding', size=2) pa_line_code = fields.Char('PA Code for this record', size=20) invoice_id = fields.Many2one( 'account.invoice', 'Related Invoice', @@ -160,10 +160,14 @@ class DiscountRisePrice(models.Model): [('SC', 'Discount'), ('MG', 'Rise Price')], 'Type') percentage = fields.Float('Percentage') amount = fields.Float('Amount') - invoice_id = fields.Many2one( + invoice_line_id = fields.Many2one( 'account.invoice.line', 'Related Invoice', ondelete='cascade', index=True ) + invoice_id = fields.Many2one( + 'account.invoice', 'Related Invoice', + ondelete='cascade', index=True + ) class FatturapaRelatedDocumentType(models.Model): @@ -266,6 +270,10 @@ class AccountInvoiceLine(models.Model): 'Related DdT' ) admin_ref = fields.Char('Administration ref.', size=20) + discount_rise_price_ids = fields.One2many( + 'discount.rise.price', 'invoice_line_id', + 'Discount and Rise Price Details' + ) class FaturapaSummaryData(models.Model): @@ -279,6 +287,7 @@ class FaturapaSummaryData(models.Model): ('N4', 'esenti'), ('N5', 'regime del margine'), ('N6', 'inversione contabile (reverse charge)'), + ('N7', 'IVA assolta in altro stato UE') ], string="Non taxable nature") incidental_charges = fields.Float('Incidental Charges') rounding = fields.Float('Rounding') @@ -311,21 +320,14 @@ class AccountInvoice(models.Model): # 1.6 sender = fields.Selection( [('CC', 'assignee / partner'), ('TZ', 'third person')], 'Sender') - # 2.1.1.1 - doc_type = fields.Many2one( - 'fatturapa.document_type', string="Document Type") # 2.1.1.5 # 2.1.1.5.1 ftpa_withholding_type = fields.Selection( [('RT01', 'Natural Person'), ('RT02', 'Legal Person')], 'Withholding type' ) - # 2.1.1.5.2 withholding_amount in module - # 2.1.1.5.3 - ftpa_withholding_rate = fields.Float('Withholding rate') - # 2.1.1.5.4 - ftpa_withholding_payment_reason = fields.Char( - 'Withholding reason', size=2) + # 2.1.1.5.2 2.1.1.5.3 2.1.1.5.4 mapped to l10n_it_withholding_tax fields + # 2.1.1.6 virtual_stamp = fields.Boolean('Virtual Stamp', default=False) stamp_amount = fields.Float('Stamp Amount') @@ -334,11 +336,6 @@ class AccountInvoice(models.Model): 'welfare.fund.data.line', 'invoice_id', 'Welfare Fund' ) - # 2.1.1.8 - discount_rise_price_ids = fields.One2many( - 'discount.rise.price', 'invoice_id', - 'Discount and Rise Price Details' - ) # 2.1.2 - 2.1.6 related_documents = fields.One2many( 'fatturapa.related_document_type', 'invoice_id', @@ -357,7 +354,7 @@ class AccountInvoice(models.Model): # 2.1.9 carrier_id = fields.Many2one( 'res.partner', string="Carrier") - transport_vaicle = fields.Char('Veicle', size=80) + transport_vehicle = fields.Char('Vehicle', size=80) transport_reason = fields.Char('Reason', size=80) number_items = fields.Integer('number of items') description = fields.Char('Description', size=100) @@ -368,6 +365,7 @@ class AccountInvoice(models.Model): transport_date = fields.Date('Transport Date') delivery_address = fields.Text('Delivery Address') delivery_datetime = fields.Datetime('Delivery Date Time') + ftpa_incoterms = fields.Char(string="Incoterms") # 2.1.10 related_invoice_code = fields.Char('Related invoice code') related_invoice_date = fields.Date('Related invoice date') @@ -390,3 +388,48 @@ class AccountInvoice(models.Model): 'fatturapa.attachments', 'invoice_id', 'FatturaPA attachments' ) + # 1.2.3 + efatt_stabile_organizzazione_indirizzo = fields.Char( + string="Indirizzo Organizzazione", + help="Blocco da valorizzare nei casi di cedente / prestatore non " + "residente, con stabile organizzazione in Italia. Indirizzo " + "della stabile organizzazione in Italia (nome della via, piazza " + "etc.)", + readonly=True) + efatt_stabile_organizzazione_civico = fields.Char( + string="Civico Organizzazione", + help="Numero civico riferito all'indirizzo (non indicare se già " + "presente nell'elemento informativo indirizzo)", + readonly=True) + efatt_stabile_organizzazione_cap = fields.Char( + string="CAP Organizzazione", + help="Codice Avviamento Postale", + readonly=True) + efatt_stabile_organizzazione_comune = fields.Char( + string="Comune Organizzazione", + help="Comune relativo alla stabile organizzazione in Italia", + readonly=True) + efatt_stabile_organizzazione_provincia = fields.Char( + string="Provincia Organizzazione", + help="Sigla della provincia di appartenenza del comune indicato " + "nell'elemento informativo 1.2.3.4 . Da valorizzare se " + "l'elemento informativo 1.2.3.6 è uguale a IT", + readonly=True) + efatt_stabile_organizzazione_nazione = fields.Char( + string="Nazione Organizzazione", + help="Codice della nazione espresso secondo lo standard " + "ISO 3166-1 alpha-2 code", + readonly=True) + # 2.1.1.10 + efatt_rounding = fields.Float( + "Arrotondamento", readonly=True, + help="Eventuale arrotondamento sul totale documento (ammette anche il " + "segno negativo)" + ) + art73 = fields.Boolean( + 'Art73', readonly=True, + help="Indica se il documento è stato emesso secondo modalità e " + "termini stabiliti con decreto ministeriale ai sensi " + "dell'articolo 73 del DPR 633/72 (ciò consente al " + "cedente/prestatore l'emissione nello stesso anno di più " + "documenti aventi stesso numero)") diff --git a/l10n_it_fatturapa/models/company.py b/l10n_it_fatturapa/models/company.py index cbf82371bfde..3bdf9ba92037 100644 --- a/l10n_it_fatturapa/models/company.py +++ b/l10n_it_fatturapa/models/company.py @@ -39,7 +39,9 @@ class ResCompany(models.Model): 'res.partner', 'Legal Tax Representative' ) fatturapa_sender_partner = fields.Many2one( - 'res.partner', 'Third Party/Sender' + 'res.partner', 'Third Party/Sender', + help="Dati relativi al soggetto terzo che emette fattura per conto " + "del cedente / prestatore" ) diff --git a/l10n_it_fatturapa_in/README.rst b/l10n_it_fatturapa_in/README.rst new file mode 100644 index 000000000000..402b2624249d --- /dev/null +++ b/l10n_it_fatturapa_in/README.rst @@ -0,0 +1,94 @@ +==================================================== +Italian Localization - Fattura Elettronica reception +==================================================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! 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/10.0/l10n_it_fatturapa_in + :alt: OCA/l10n-italy +.. |badge4| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/122/10.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| + +This module allows you to receive and parse the fatturaPA XML file version 1.2 +http://www.fatturapa.gov.it/export/fatturazione/en/normativa/f-2.htm +received from the Exchange System +http://www.fatturapa.gov.it/export/fatturazione/en/sdi.htm + +**Table of contents** + +.. contents:: + :local: + +Installation +============ + +odoo server must run on linux and be able to run command + +``openssl`` + +Configuration +============= + +See l10n_it_fatturapa + +Usage +===== + + * Go to knowledge -> Documents + * Create a Incoming fatturaPA file + * Run Import FatturaPA wizard + +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 + +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 index 823e6fcb9a56..574498c3b125 100644 --- a/l10n_it_fatturapa_in/__init__.py +++ b/l10n_it_fatturapa_in/__init__.py @@ -1,23 +1,4 @@ # -*- coding: utf-8 -*- -############################################################################## -# -# Copyright (C) 2015 AgileBG SAGL -# Copyright (C) 2015 innoviu Srl -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## from . import models from . import tests diff --git a/l10n_it_fatturapa_in/__manifest__.py b/l10n_it_fatturapa_in/__manifest__.py new file mode 100644 index 000000000000..d28b8ad293ca --- /dev/null +++ b/l10n_it_fatturapa_in/__manifest__.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# Copyright 2015 AgileBG SAGL +# Copyright 2015 innoviu Srl +# Copyright 2018 Lorenzo Battistini + +{ + 'name': 'Italian Localization - Fattura Elettronica reception', + 'version': '10.0.1.0.0', + 'category': 'Localization/Italy', + 'summary': 'Electronic invoices reception', + 'author': 'Agile Business Group, Innoviu, ' + 'Odoo Community Association (OCA)', + 'website': 'http://www.agilebg.com', + 'license': 'AGPL-3', + "depends": [ + 'l10n_it_fatturapa', + 'partner_firstname', + 'l10n_it_withholding_tax_causali', + ], + "data": [ + 'views/account_view.xml', + 'views/partner_view.xml', + 'wizard/wizard_import_fatturapa_view.xml', + 'security/ir.model.access.csv', + ], + "installable": True +} diff --git a/l10n_it_fatturapa_in/__openerp__.py b/l10n_it_fatturapa_in/__openerp__.py deleted file mode 100644 index 8a8013b893fc..000000000000 --- a/l10n_it_fatturapa_in/__openerp__.py +++ /dev/null @@ -1,94 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# Copyright (C) 2015 AgileBG SAGL -# Copyright (C) 2015 innoviu Srl -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## -{ - 'name': 'Italian Localization - FatturaPA reception', - 'version': '0.1', - 'category': 'Localization/Italy', - 'summary': 'Electronic invoices reception', - 'author': 'Agile Business Group, Innoviu, ' - 'Odoo Community Association (OCA)', - 'description': """ -.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg - :alt: License - - -Italian Localization - FatturaPA - Reception -============================================ - -This module allows you to receive and parse the fatturaPA XML file version 1.1 -http://www.fatturapa.gov.it/export/fatturazione/en/normativa/f-2.htm -received from the Exchange System -http://www.fatturapa.gov.it/export/fatturazione/en/sdi.htm - - -Configuration -============= - -See l10n_it_fatturapa - -Usage -===== - - * Go to knowledge -> Documents - * Create a Incoming fatturaPA file - * Run Import FatturaPA wizard - -Credits -======= - -Contributors ------------- - -* Lorenzo Battistini -* Roberto Onnis -* Alessio Gerace - -Maintainer ----------- - -.. image:: http://odoo-community.org/logo.png - :alt: Odoo Community Association - :target: http://odoo-community.org - -This module is maintained by the OCA. - -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. - -To contribute to this module, please visit http://odoo-community.org. -""", - 'website': 'http://www.agilebg.com', - 'license': 'AGPL-3', - "depends": [ - 'l10n_it_fatturapa', - 'partner_firstname', - 'stock_invoice_picking_incoterm', - 'l10n_it_withholding_tax', - ], - "data": [ - 'views/account_view.xml', - 'views/partner_view.xml', - 'wizard/wizard_import_fatturapa_view.xml', - 'security/ir.model.access.csv', - ], - "installable": True -} diff --git a/l10n_it_fatturapa_in/i18n/it.po b/l10n_it_fatturapa_in/i18n/it.po index 8ccb9628d9b1..20604c3a3245 100644 --- a/l10n_it_fatturapa_in/i18n/it.po +++ b/l10n_it_fatturapa_in/i18n/it.po @@ -1,570 +1,647 @@ -# Translation of OpenERP Server. +# Translation of Odoo Server. # This file contains the translation of the following modules: -# * l10n_it_fatturapa_in -# -# Translators: +# * l10n_it_fatturapa_in +# msgid "" msgstr "" -"Project-Id-Version: l10n-italy (7.0)\n" +"Project-Id-Version: Odoo Server 10.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-11-25 16:46+0000\n" -"PO-Revision-Date: 2015-11-18 17:08+0000\n" +"POT-Creation-Date: 2018-09-05 14:12+0000\n" +"PO-Revision-Date: 2018-09-05 14:12+0000\n" "Last-Translator: <>\n" -"Language-Team: Italian (http://www.transifex.com/oca/OCA-l10n-italy-7-0/language/it/)\n" +"Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" -"Language: it\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Plural-Forms: \n" #. module: l10n_it_fatturapa_in -#: field:account.invoice,fatturapa_attachment_in_id:0 -msgid "FatturaPA Import File" -msgstr "" +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1130 +#, python-format +msgid "ASN.1 structure is not parsable in DER" +msgstr "ASN.1 structure is not parsable in DER" #. module: l10n_it_fatturapa_in -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1229 +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1105 #, python-format -msgid "Parsing PEM to DER file %s" -msgstr "" +msgid "An error with command \"openssl asn1parse\" occurred: %s" +msgstr "An error with command \"openssl asn1parse\" occurred: %s" #. module: l10n_it_fatturapa_in -#: field:account.invoice.line,cod_article_ids:0 -msgid "Cod. Articles" -msgstr "" +#: model:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_line_form_fatturapa_in +msgid "Articles Code" +msgstr "Articles Code" #. module: l10n_it_fatturapa_in -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:97 +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in_ir_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_name +msgid "Attachment Name" +msgstr "Nome Allegato" + +#. 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/wizard/wizard_import_fatturapa.py:1012 #, python-format -msgid "DatiAnagrafici.Anagrafica.Cognome contains \"%s\". Your System contains \"%s\"" -msgstr "" +msgid "Attachment without name" +msgstr "Allegato senza nome" + +#. module: l10n_it_fatturapa_in +#: model: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:1208 -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1228 -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1235 -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1256 -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1263 +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:587 #, python-format -msgid "Errore" -msgstr "" +msgid "BIC is required and not exist in Xml\n" +"Curr bank data is: \n" +"IBAN: %s\n" +"Bank Name: %s\n" +"" +msgstr "BIC is required and not exist in Xml\n" +"Curr bank data is: \n" +"IBAN: %s\n" +"Bank Name: %s\n" +"" #. module: l10n_it_fatturapa_in -#: field:fatturapa.article.code,code_val:0 -msgid "Code Value" -msgstr "" +#: model:ir.ui.view,arch_db:l10n_it_fatturapa_in.wizard_import_fatturapa_form_view +msgid "Cancel" +msgstr "Annulla" #. module: l10n_it_fatturapa_in -#: view:res.partner:0 -msgid "FatturaPA Registration" -msgstr "" +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:823 +#, python-format +msgid "CassaPrevidenziale %s has Ritenuta but no withholding tax was found in the system" +msgstr "CassaPrevidenziale %s ha la ritenuta me nessuna ritenuta è stata trovata nel sistema" #. module: l10n_it_fatturapa_in -#: view:account.invoice:0 -msgid "Inconsistencies" -msgstr "" +#: 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 -#: selection:account.invoice.line,service_type:0 -msgid "sconto" -msgstr "" +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_article_code_name +msgid "Cod Type" +msgstr "Cod Type" #. module: l10n_it_fatturapa_in -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1257 -#, python-format -msgid "Signed Xml file %s" -msgstr "" +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_account_invoice_line_cod_article_ids +msgid "Cod. Articles" +msgstr "Cod. Articles" #. module: l10n_it_fatturapa_in -#: field:fatturapa.attachment.in,message_unread:0 -msgid "Unread Messages" -msgstr "" +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_article_code_code_val +msgid "Code Value" +msgstr "Code Value" #. module: l10n_it_fatturapa_in -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:771 +#: 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:1072 #, python-format -msgid "tipoDocumento %s not handled" -msgstr "" +msgid "Computed amount untaxed %s is different from DatiRiepilogo %s" +msgstr "L'imponibile calcolato %s è diverso da quello di DatiRiepilogo %s" #. module: l10n_it_fatturapa_in -#: view:account.invoice:0 -msgid "Related Documents " -msgstr "" +#: model:ir.ui.view,arch_db:l10n_it_fatturapa_in.wizard_import_fatturapa_form_view +msgid "Confirm?" +msgstr "Confirm?" #. module: l10n_it_fatturapa_in -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:311 +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:132 #, python-format -msgid "Too many taxes with percentage %s and nature %s found" -msgstr "" +msgid "Country Code %s not found in system" +msgstr "Codice nazione %s non trovato nel sistema" #. module: l10n_it_fatturapa_in -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1061 -#, python-format -msgid "Payment method Code %s is incorrect" -msgstr "" +#: 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 +msgid "Created by" +msgstr "Creato da" #. module: l10n_it_fatturapa_in -#: view:fatturapa.attachment.in:0 -msgid "History" -msgstr "" +#: 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 +msgid "Created on" +msgstr "Creato il" #. module: l10n_it_fatturapa_in -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:453 -#, python-format -msgid "TipoCassa is not defined " -msgstr "" +#: model:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_fatturapa_in_attachment_form +msgid "Creation" +msgstr "Creazione" #. module: l10n_it_fatturapa_in -#: field:fatturapa.attachment.in,message_ids:0 -msgid "Messages" -msgstr "" +#: 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.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Dati generali" +msgstr "Dati generali" #. module: l10n_it_fatturapa_in -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:248 +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:71 #, python-format -msgid "REA Office Code ( %s ) not present in system" -msgstr "" +msgid "DatiAnagrafici.Anagrafica.Cognome contains \"%s\". Your System contains \"%s\"" +msgstr "DatiAnagrafici.Anagrafica.Cognome contiene \"%s\". Il tuo database contiene \"%s\"" #. module: l10n_it_fatturapa_in -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1284 +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:54 #, python-format -msgid "File is linked to invoices yet" -msgstr "" +msgid "DatiAnagrafici.Anagrafica.Denominazione contains \"%s\". Your System contains \"%s\"" +msgstr "DatiAnagrafici.Anagrafica.Denominazione contiene \"%s\". Il tuo database contiene \"%s\"" #. module: l10n_it_fatturapa_in -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:232 -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:304 -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:310 -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:452 -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:561 -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:697 -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:743 -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1052 -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1060 -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1084 +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:62 #, python-format -msgid "Error!" -msgstr "" +msgid "DatiAnagrafici.Anagrafica.Nome contains \"%s\". Your System contains \"%s\"" +msgstr "DatiAnagrafici.Anagrafica.Nome contiene \"%s\". Il tuo database contiene \"%s\"" #. module: l10n_it_fatturapa_in -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:533 +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:642 #, python-format -msgid "Global invoice discount from DatiGeneraliDocumento" -msgstr "" +msgid "Define a purchase journal for this company: \"%s\" (id:%d)." +msgstr "Definire un sezionale di acquisto per questa azienda: \"%s\" (id:%d)." #. module: l10n_it_fatturapa_in -#: help:fatturapa.attachment.in,message_unread:0 -msgid "If checked new messages require your attention." -msgstr "" +#: model:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Delivery" +msgstr "Consegna" #. module: l10n_it_fatturapa_in -#: field:account.invoice.line,service_type:0 -msgid "Service Type" -msgstr "" +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in_description +msgid "Description" +msgstr "Descrizione" #. module: l10n_it_fatturapa_in -#: view:fatturapa.attachment.in:0 -#: model:ir.actions.act_window,name:l10n_it_fatturapa_in.action_wizard_import_fatturapa -#: model:ir.model,name:l10n_it_fatturapa_in.model_wizard_import_fatturapa -#: view:wizard.import.fatturapa:0 -msgid "Import FatturaPA" -msgstr "Importa FatturaPA" +#: model:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_line_form_fatturapa_in +msgid "Discount Rise Price" +msgstr "Sconto maggiorazione" #. module: l10n_it_fatturapa_in -#: help:fatturapa.attachment.in,message_summary:0 -msgid "" -"Holds the Chatter summary (number of messages, ...). This summary is " -"directly in html format in order to be inserted in kanban views." -msgstr "" +#: 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 +msgid "Display Name" +msgstr "Nome Visualizzato" #. module: l10n_it_fatturapa_in -#: view:account.invoice:0 -msgid "Related Documents" -msgstr "" +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_account_invoice_fatturapa_attachment_in_id +msgid "E-Invoice Import File" +msgstr "E-Invoice Import File" #. module: l10n_it_fatturapa_in -#: view:account.invoice:0 -msgid "Welfare Fund Details" -msgstr "" +#: model:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "E-invoice Inconsistencies" +msgstr "Inconsistenze fattura elettronica" #. module: l10n_it_fatturapa_in -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:698 -#, python-format -msgid "Define a purchase journal for this company: \"%s\" (id:%d)." -msgstr "" +#: model:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "E-invoice other info" +msgstr "Altre info fattura elettronica" #. module: l10n_it_fatturapa_in -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:562 -#, python-format -msgid "ModalitaPagamento %s not defined in your system" -msgstr "" +#: model:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Fattura PA V1.2 Schema" +msgstr "Fattura PA V1.2 Schema" #. module: l10n_it_fatturapa_in -#: field:fatturapa.attachment.in,message_follower_ids:0 -msgid "Followers" -msgstr "" +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_account_invoice_line_ftpa_uom +msgid "Fattura Pa Unit of Measure" +msgstr "Fattura Pa Unit of Measure" #. module: l10n_it_fatturapa_in -#: view:account.invoice:0 -msgid "Rise Price Discount" -msgstr "" +#: model:ir.model,name:l10n_it_fatturapa_in.model_fatturapa_article_code +msgid "FatturaPA Article Code" +msgstr "FatturaPA Article Code" #. module: l10n_it_fatturapa_in -#: view:account.invoice.line:0 -msgid "Articles Code" -msgstr "" +#: model:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_partner_form_fatturapa_in +msgid "FatturaPA Registration" +msgstr "FatturaPA Registration" #. module: l10n_it_fatturapa_in -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:132 -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:171 -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:212 -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:247 -#, python-format -msgid "Error !" -msgstr "" +#: model:ir.model,name:l10n_it_fatturapa_in.model_fatturapa_attachment_in +msgid "FatturaPA import File" +msgstr "Fattura PA Importazione File" #. module: l10n_it_fatturapa_in -#: view:account.invoice:0 -msgid "FatturaPA Payment" -msgstr "" +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in_datas +msgid "File Content" +msgstr "Contenuto del File" #. module: l10n_it_fatturapa_in -#: field:account.invoice.line,service_start:0 -msgid "Service start at" -msgstr "" +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in_datas_fname +msgid "File Name" +msgstr "Nome File" #. module: l10n_it_fatturapa_in -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:623 +#: 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:1176 #, python-format -msgid "Name of Bank with BIC \"%s\" is not set. Can't create bank" -msgstr "" +msgid "File is linked to invoices yet" +msgstr "Il file è già collegato a delle fatture" #. module: l10n_it_fatturapa_in -#: view:account.invoice:0 -msgid "Payments Details" -msgstr "" +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:483 +#, python-format +msgid "Global invoice discount from DatiGeneraliDocumento" +msgstr "Sconto globale da DatiGeneraliDocumento" #. module: l10n_it_fatturapa_in -#: field:fatturapa.attachment.in,in_invoice_ids:0 -msgid "In Invoices" -msgstr "" +#: model:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_fatturapa_in_attachment_form +msgid "History" +msgstr "Storico" #. module: l10n_it_fatturapa_in -#: view:account.invoice:0 -msgid "FatturaPA" -msgstr "" +#: 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 +msgid "ID" +msgstr "ID" #. module: l10n_it_fatturapa_in -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:135 -#, python-format -msgid "" -"Two distinct partners with Vat %s and Fiscalcode %s already present in db" -msgstr "" +#: model:ir.ui.view,arch_db:l10n_it_fatturapa_in.wizard_import_fatturapa_form_view +msgid "Import" +msgstr "Importa" #. module: l10n_it_fatturapa_in -#: field:account.invoice.line,ftpa_uom:0 -msgid "Fattura Pa Unit of Measure" -msgstr "" +#: model:ir.actions.act_window,name:l10n_it_fatturapa_in.action_wizard_import_fatturapa +#: model:ir.model,name:l10n_it_fatturapa_in.model_wizard_import_fatturapa +#: model:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_fatturapa_in_attachment_form +#: model:ir.ui.view,arch_db:l10n_it_fatturapa_in.wizard_import_fatturapa_form_view +msgid "Import FatturaPA" +msgstr "Importa FatturaPA" #. module: l10n_it_fatturapa_in -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:328 -#, python-format -msgid "" -"XML contains tax with percentage \"%s\" but it does not exist in your system" -msgstr "" +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_account_invoice_inconsistencies +msgid "Import Inconsistencies" +msgstr "Import Inconsistencies" #. module: l10n_it_fatturapa_in -#: view:fatturapa.attachment.in:0 -msgid "on" -msgstr "" +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in_in_invoice_ids +msgid "In Invoices" +msgstr "In Invoices" #. module: l10n_it_fatturapa_in -#: view:fatturapa.attachment.in:0 -msgid "Invoices" -msgstr "" +#: 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 fatturaPA files" +msgstr "Incoming fatturaPA files" #. module: l10n_it_fatturapa_in -#: view:fatturapa.attachment.in:0 -msgid "Xml Attachment" -msgstr "" +#: 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 +msgid "Invoice" +msgstr "Fattura" #. module: l10n_it_fatturapa_in #: model:ir.model,name:l10n_it_fatturapa_in.model_account_invoice_line msgid "Invoice Line" -msgstr "" +msgstr "Riga Fattura" #. module: l10n_it_fatturapa_in -#: field:fatturapa.article.code,invoice_line_id:0 -msgid "Related Invoice line" -msgstr "" +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1057 +#, python-format +msgid "Invoice total %s is different from ImportoTotaleDocumento %s" +msgstr "Il totale fattura %s è diverso da ImportoTotaleDocumento %s" #. module: l10n_it_fatturapa_in -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:84 -#, python-format -msgid "DatiAnagrafici.Anagrafica.Nome contains \"%s\". Your System contains \"%s\"" -msgstr "" +#: model:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_fatturapa_in_attachment_form +msgid "Invoices" +msgstr "Fatture" #. module: l10n_it_fatturapa_in -#: selection:account.invoice.line,service_type:0 -msgid "abbuono" -msgstr "" +#: 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 -#: field:fatturapa.attachment.in,ir_attachment_id:0 -msgid "Attachment" -msgstr "Allegato" +#: 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 +msgid "Last Modified on" +msgstr "Ultima modifica il" #. module: l10n_it_fatturapa_in -#: view:wizard.import.fatturapa:0 -msgid "Import" -msgstr "Importa" +#: 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 +msgid "Last Updated by" +msgstr "Ultima modifica di" + +#. module: l10n_it_fatturapa_in +#: 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 +msgid "Last Updated on" +msgstr "Ultima modifica il" #. module: l10n_it_fatturapa_in -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1120 +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:289 #, python-format -msgid "XML IPA code (%s) different from company IPA code (%s)" -msgstr "" +msgid "Line '%s': Too many taxes with percentage equals to \"%s\"\n" +"fix it if required" +msgstr "Riga '%s': Troppe imposte con aliquota uguale a\"%s\"\n" +"correggere se necessario" #. module: l10n_it_fatturapa_in -#: view:account.invoice.line:0 -msgid "Discount Rise Price" -msgstr "" +#: 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:account.invoice.line,service_type:0 -msgid "premio" -msgstr "" +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:505 +#, python-format +msgid "ModalitaPagamento %s not defined in your system" +msgstr "ModalitaPagamento %s not defined in your system" + +#. module: l10n_it_fatturapa_in +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:563 +#, python-format +msgid "Name of Bank with BIC \"%s\" is not set. Can't create bank" +msgstr "Il nome della banca con BIC \"%s\" non è impostato. Impossibile creare la banca" #. module: l10n_it_fatturapa_in -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:744 +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:679 #, python-format msgid "No currency found with code %s" -msgstr "" +msgstr "Nessuna valuta trovata con codice %s" #. module: l10n_it_fatturapa_in -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:213 +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:260 #, python-format -msgid "ProvinciaAlbo ( %s ) not present in system" -msgstr "" +msgid "No tax with percentage %s and nature %s found. Please configure this tax" +msgstr "Nessuna imposta con aliquota %s e natura %s trovata. Configurare questa imposta" #. module: l10n_it_fatturapa_in -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1053 +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:763 #, python-format -msgid "Payment method Code not found in document" -msgstr "" +msgid "No withholding tax found with Causale %s and rate %s" +msgstr "Nessuna ritenuta trovata con Causale %s e importo %s" #. module: l10n_it_fatturapa_in -#: field:fatturapa.attachment.in,message_is_follower:0 -msgid "Is a Follower" -msgstr "" +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1124 +#, python-format +msgid "Parsing PEM to DER file %s" +msgstr "Parsing PEM to DER file %s" #. module: l10n_it_fatturapa_in -#: field:account.invoice,inconsistencies:0 -msgid "Import Inconsistencies" -msgstr "" +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:995 +#, python-format +msgid "Payment method Code %s is incorrect" +msgstr "Codice metodo di oagamento %s non corretto" #. module: l10n_it_fatturapa_in -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:172 +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:990 #, python-format -msgid "Country Code %s not found in system" -msgstr "" +msgid "Payment method Code not found in document" +msgstr "Codice metodo di pagamento non trovato nel documento" #. module: l10n_it_fatturapa_in -#: model:ir.model,name:l10n_it_fatturapa_in.model_fatturapa_article_code -msgid "FatturaPA Article Code" -msgstr "" +#: model:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Payments" +msgstr "Pagamenti" #. module: l10n_it_fatturapa_in -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1085 -#, python-format -msgid "Attachment Name is Required" -msgstr "" +#: model:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Payments Details" +msgstr "Payments Details" #. module: l10n_it_fatturapa_in -#: field:fatturapa.attachment.in,message_summary:0 -msgid "Summary" -msgstr "" +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:179 +#, python-format +msgid "Provincia ( %s ) not present in system" +msgstr "Provincia ( %s ) non presente nel database" #. module: l10n_it_fatturapa_in -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:473 -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:770 -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1119 -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1284 +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:169 #, python-format -msgid "Error" -msgstr "Errore" +msgid "ProvinciaAlbo ( %s ) not present in system" +msgstr "ProvinciaAlbo ( %s ) non presente nel database" #. module: l10n_it_fatturapa_in -#: field:fatturapa.article.code,name:0 -msgid "Cod Type" -msgstr "" +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:209 +#, python-format +msgid "REA Office (Province) Code ( %s ) not present in system" +msgstr "Codice ufficio REA (Provincia) ( %s ) non presente nel database" #. module: l10n_it_fatturapa_in -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:305 +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:197 #, python-format -msgid "No tax with percentage %s and nature %s found" -msgstr "" +msgid "RegimeFiscale %s is not present in your system" +msgstr "RegimeFiscale %s non presente nel database" #. module: l10n_it_fatturapa_in -#: view:account.invoice:0 -msgid "Fattura PA V1.1 Schema" -msgstr "" +#: model:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Related Documents" +msgstr "Documenti Correlati" #. module: l10n_it_fatturapa_in -#: view:account.invoice:0 -msgid "Attachments" -msgstr "" +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_article_code_invoice_line_id +msgid "Related Invoice line" +msgstr "Related Invoice line" #. module: l10n_it_fatturapa_in -#: model:ir.model,name:l10n_it_fatturapa_in.model_account_invoice -msgid "Invoice" -msgstr "Fattura" +#: 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 -#: selection:account.invoice.line,service_type:0 -msgid "spesa accessoria" -msgstr "" +#: 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 -#: view:wizard.import.fatturapa:0 -msgid "Cancel" -msgstr "Annulla" +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in_res_model +msgid "Resource Model" +msgstr "Modello della Risorsa" #. module: l10n_it_fatturapa_in -#: view:account.invoice:0 -msgid "Summary Data" -msgstr "" +#: 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 -#: field:account.invoice.line,discount_rise_price_ids:0 -msgid "Discount and Rise Price Details" -msgstr "" +#: model:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "SAL data" +msgstr "Dati SAL" #. module: l10n_it_fatturapa_in -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:337 -#, python-format -msgid "" -"Line '%s': Too many taxes with percentage equals to \"%s\"\n" -"fix it if required" -msgstr "" +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_account_invoice_line_service_type +msgid "Service Type" +msgstr "Service Type" #. module: l10n_it_fatturapa_in -#: view:fatturapa.attachment.in:0 -msgid "Creation" -msgstr "" +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_account_invoice_line_service_end +msgid "Service end at" +msgstr "Service end at" #. module: l10n_it_fatturapa_in -#: view:account.invoice:0 -msgid "Welfare Fund" -msgstr "" +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_account_invoice_line_service_start +msgid "Service start at" +msgstr "Service start at" #. module: l10n_it_fatturapa_in -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1175 +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1150 #, python-format -msgid "Computed amount untaxed %s is different from DatiRiepilogo %s" -msgstr "" +msgid "Signed Xml file %s" +msgstr "Signed Xml file %s" #. module: l10n_it_fatturapa_in -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1264 +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1156 #, python-format msgid "Signed Xml file not decryptable" -msgstr "" +msgstr "Signed Xml file not decryptable" #. module: l10n_it_fatturapa_in -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1209 -#, python-format -msgid "Check PEM file %s" -msgstr "" +#: model:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Stabile Organizzazione" +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 del File Registrato" + +#. module: l10n_it_fatturapa_in +#: model:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Summary Data" +msgstr "Summary Data" #. module: l10n_it_fatturapa_in -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1158 +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:751 #, python-format -msgid "Invoice total %s is different from ImportoTotaleDocumento %s" -msgstr "" +msgid "Supplier invoice contains withholding tax with CausalePagamento %s, but such a tax is not found in your system. Please set it" +msgstr "Supplier invoice contains withholding tax with CausalePagamento %s, but such a tax is not found in your system. Please set it" #. module: l10n_it_fatturapa_in -#: model:ir.model,name:l10n_it_fatturapa_in.model_fatturapa_attachment_in -msgid "FatturaPA import File" -msgstr "Fattura PA Importazione File" +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:406 +#, python-format +msgid "Tax kind %s not found" +msgstr "Tipo imposta %s non trovato" #. module: l10n_it_fatturapa_in -#: view:account.invoice:0 -msgid "Delivery" -msgstr "" +#: 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à allegato questo allegato." #. module: l10n_it_fatturapa_in -#: view:account.invoice:0 -msgid "Progress Work" -msgstr "" +#: model:ir.model.fields,help:l10n_it_fatturapa_in.field_fatturapa_attachment_in_res_id +msgid "The record id this is attached to." +msgstr "The record id this is attached to." #. module: l10n_it_fatturapa_in -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:474 +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:433 #, python-format msgid "TipoCassa %s is not present in your system" -msgstr "" +msgstr "TipoCassa %s non presente nel database" #. module: l10n_it_fatturapa_in -#: view:wizard.import.fatturapa:0 -msgid "Confirm?" -msgstr "" +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:415 +#, python-format +msgid "TipoCassa is not defined " +msgstr "TipoCassa non definito " #. module: l10n_it_fatturapa_in -#: view:account.invoice:0 -msgid "FatturaPA attachments" -msgstr "" +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:265 +#, python-format +msgid "Too many taxes with percentage %s and nature %s found" +msgstr "Troppe imposte con aliquota %s e natura %s trovate" #. module: l10n_it_fatturapa_in -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:653 +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:104 #, 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 "" +msgid "Two distinct partners with Vat %s and Fiscalcode %s already present in db" +msgstr "2 differenti partner con P.IVA %s e codice fiscale %s sono già presenti nel database" #. module: l10n_it_fatturapa_in -#: view:account.invoice:0 -msgid "Payments" -msgstr "" +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in_type +msgid "Type" +msgstr "Tipo" #. module: l10n_it_fatturapa_in -#: field:account.invoice.line,service_end:0 -msgid "Service end at" -msgstr "" +#: model:ir.model.fields,field_description:l10n_it_fatturapa_in.field_fatturapa_attachment_in_url +msgid "Url" +msgstr "Url" #. module: l10n_it_fatturapa_in -#: help:fatturapa.attachment.in,message_ids:0 -msgid "Messages and communication history" -msgstr "" +#: model:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Welfare Fund" +msgstr "Welfare Fund" + +#. module: l10n_it_fatturapa_in +#: model:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_invoice_form_fatturapa_in +msgid "Welfare Fund Details" +msgstr "Welfare Fund Details" #. module: l10n_it_fatturapa_in -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:1236 +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:280 #, python-format -msgid "ASN.1 structure is not parsable in DER" -msgstr "" +msgid "XML contains tax with percentage \"%s\" but it does not exist in your system" +msgstr "L'XML contiene l'imposta con alquota \"%s\" ma questa non esiste nel database" #. 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 fatturaPA files" -msgstr "" +#: model:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_fatturapa_in_attachment_tree +msgid "Xml Attachment" +msgstr "Xml Attachment" #. module: l10n_it_fatturapa_in -#: view:account.invoice:0 -msgid "Results" -msgstr "" +#: 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 "Puoi inviare un file dal computer o copiare/incollare un indirizzo Internet che è collegato al tuo file." #. module: l10n_it_fatturapa_in -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:71 -#, python-format -msgid "" -"DatiAnagrafici.Anagrafica.Denominazione contains \"%s\". Your System " -"contains \"%s\"" -msgstr "" +#: selection:account.invoice.line,service_type:0 +msgid "abbuono" +msgstr "abbuono" + +#. module: l10n_it_fatturapa_in +#: model:ir.ui.view,arch_db:l10n_it_fatturapa_in.view_fatturapa_in_attachment_form +msgid "on" +msgstr "il" + +#. module: l10n_it_fatturapa_in +#: selection:account.invoice.line,service_type:0 +msgid "premio" +msgstr "premio" + +#. module: l10n_it_fatturapa_in +#: selection:account.invoice.line,service_type:0 +msgid "sconto" +msgstr "sconto" + +#. module: l10n_it_fatturapa_in +#: selection:account.invoice.line,service_type:0 +msgid "spesa accessoria" +msgstr "spesa accessoria" #. module: l10n_it_fatturapa_in -#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:233 +#: code:addons/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py:702 #, python-format -msgid "RegimeFiscale %s is not present in your system" -msgstr "" +msgid "tipoDocumento %s not handled" +msgstr "tipoDocumento %s non gestito" + diff --git a/l10n_it_fatturapa_in/models/__init__.py b/l10n_it_fatturapa_in/models/__init__.py index 98b75af48313..fd234fef852f 100644 --- a/l10n_it_fatturapa_in/models/__init__.py +++ b/l10n_it_fatturapa_in/models/__init__.py @@ -1,24 +1,4 @@ # -*- coding: utf-8 -*- -############################################################################## -# -# Copyright (C) 2015 AgileBG SAGL -# Copyright (C) 2015 innoviu Srl -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## - from . import attachment from . import account diff --git a/l10n_it_fatturapa_in/models/account.py b/l10n_it_fatturapa_in/models/account.py index 91a13940e8de..df69854ed864 100644 --- a/l10n_it_fatturapa_in/models/account.py +++ b/l10n_it_fatturapa_in/models/account.py @@ -1,75 +1,51 @@ # -*- coding: utf-8 -*- -############################################################################## -# -# Copyright (C) 2014 Davide Corio -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## -from openerp.osv import fields, orm +from odoo import fields, models -class account_invoice(orm.Model): +class AccountInvoice(models.Model): _inherit = "account.invoice" - _columns = { - 'fatturapa_attachment_in_id': fields.many2one( - 'fatturapa.attachment.in', 'FatturaPA Import File', - ondelete='restrict'), - 'inconsistencies': fields.text('Import Inconsistencies'), - } + fatturapa_attachment_in_id = fields.Many2one( + 'fatturapa.attachment.in', 'E-Invoice Import File', + ondelete='restrict') + inconsistencies = fields.Text('Import Inconsistencies') -class fatturapa_article_code(orm.Model): +class fatturapa_article_code(models.Model): # _position = ['2.2.1.3'] _name = "fatturapa.article.code" _description = 'FatturaPA Article Code' - _columns = { - 'name': fields.char('Cod Type', size=35), - 'code_val': fields.char('Code Value', size=35), - 'invoice_line_id': fields.many2one( - 'account.invoice.line', 'Related Invoice line', - ondelete='cascade', select=True - ) - } + name = fields.Char('Cod Type') + code_val = fields.Char('Code Value') + invoice_line_id = fields.Many2one( + 'account.invoice.line', 'Related Invoice line', + ondelete='cascade', index=True + ) -class account_invoice_line(orm.Model): +class account_invoice_line(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.invoice.line" - _columns = { - 'cod_article_ids': fields.one2many( - 'fatturapa.article.code', 'invoice_line_id', - 'Cod. Articles' - ), - 'service_type': fields.selection([ - ('SC', 'sconto'), - ('PR', 'premio'), - ('AB', 'abbuono'), - ('AC', 'spesa accessoria'), - ], string="Service Type"), - 'ftpa_uom': fields.char('Fattura Pa Unit of Measure', size=10), - 'service_start': fields.date('Service start at'), - 'service_end': fields.date('Service end at'), - 'discount_rise_price_ids': fields.one2many( - 'discount.rise.price', 'invoice_line_id', - 'Discount and Rise Price Details' - ), - } + cod_article_ids = fields.One2many( + 'fatturapa.article.code', 'invoice_line_id', + 'Cod. Articles' + ) + service_type = fields.Selection([ + ('SC', 'sconto'), + ('PR', 'premio'), + ('AB', 'abbuono'), + ('AC', 'spesa accessoria'), + ], string="Service Type") + ftpa_uom = fields.Char('Fattura Pa Unit of Measure') + service_start = fields.Date('Service start at') + service_end = fields.Date('Service end at') + discount_rise_price_ids = fields.One2many( + 'discount.rise.price', 'invoice_line_id', + 'Discount and Rise Price Details' + ) diff --git a/l10n_it_fatturapa_in/models/attachment.py b/l10n_it_fatturapa_in/models/attachment.py index 83d8767d2d67..2e8f02a0bf44 100644 --- a/l10n_it_fatturapa_in/models/attachment.py +++ b/l10n_it_fatturapa_in/models/attachment.py @@ -1,40 +1,20 @@ # -*- coding: utf-8 -*- -############################################################################## -# -# Copyright (C) 2015 AgileBG SAGL -# Copyright (C) 2015 innoviu Srl -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## -from openerp.osv import fields, orm +from odoo import fields, models, api -class FatturaPAAttachmentIn(orm.Model): +class FatturaPAAttachmentIn(models.Model): _name = "fatturapa.attachment.in" _description = "FatturaPA import File" _inherits = {'ir.attachment': 'ir_attachment_id'} _inherit = ['mail.thread'] - _columns = { - 'ir_attachment_id': fields.many2one( - 'ir.attachment', 'Attachment', required=True, ondelete="cascade"), - 'in_invoice_ids': fields.one2many( - 'account.invoice', 'fatturapa_attachment_in_id', - string="In Invoices", readonly=True), - } + ir_attachment_id = fields.Many2one( + 'ir.attachment', 'Attachment', required=True, ondelete="cascade") + in_invoice_ids = fields.One2many( + 'account.invoice', 'fatturapa_attachment_in_id', + string="In Invoices", readonly=True) - def set_name(self, cr, uid, ids, datas_fname, context=None): - return {'value': {'name': datas_fname}} + @api.onchange('datas_fname') + def onchagne_datas_fname(self): + self.name = self.datas_fname diff --git a/l10n_it_fatturapa_in/readme/CONFIGURE.rst b/l10n_it_fatturapa_in/readme/CONFIGURE.rst new file mode 100644 index 000000000000..c1454d1cef45 --- /dev/null +++ b/l10n_it_fatturapa_in/readme/CONFIGURE.rst @@ -0,0 +1 @@ +See l10n_it_fatturapa diff --git a/l10n_it_fatturapa_in/readme/CONTRIBUTORS.rst b/l10n_it_fatturapa_in/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000000..b3af0988acfe --- /dev/null +++ b/l10n_it_fatturapa_in/readme/CONTRIBUTORS.rst @@ -0,0 +1,3 @@ +* Lorenzo Battistini +* Roberto Onnis +* Alessio Gerace diff --git a/l10n_it_fatturapa_in/readme/DESCRIPTION.rst b/l10n_it_fatturapa_in/readme/DESCRIPTION.rst new file mode 100644 index 000000000000..7d88e59a1e81 --- /dev/null +++ b/l10n_it_fatturapa_in/readme/DESCRIPTION.rst @@ -0,0 +1,4 @@ +This module allows you to receive and parse the fatturaPA XML file version 1.2 +http://www.fatturapa.gov.it/export/fatturazione/en/normativa/f-2.htm +received from the Exchange System +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..08b502640871 --- /dev/null +++ b/l10n_it_fatturapa_in/readme/INSTALL.rst @@ -0,0 +1,3 @@ +odoo server must run on linux and be able to run command + +``openssl`` diff --git a/l10n_it_fatturapa_in/readme/USAGE.rst b/l10n_it_fatturapa_in/readme/USAGE.rst new file mode 100644 index 000000000000..f5db58b577a1 --- /dev/null +++ b/l10n_it_fatturapa_in/readme/USAGE.rst @@ -0,0 +1,3 @@ + * Go to knowledge -> Documents + * Create a Incoming fatturaPA file + * Run Import FatturaPA wizard diff --git a/l10n_it_fatturapa_in/tests/__init__.py b/l10n_it_fatturapa_in/tests/__init__.py index bea8e1ef33fa..2d2485f34333 100644 --- a/l10n_it_fatturapa_in/tests/__init__.py +++ b/l10n_it_fatturapa_in/tests/__init__.py @@ -1,23 +1,3 @@ # -*- coding: utf-8 -*- -############################################################################## -# -# Copyright (C) 2014 Alessio Gerace -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## from . import test_import_fatturapa_xml - -checks = [test_import_fatturapa_xml] diff --git a/l10n_it_fatturapa_in/tests/data/IT01234567890_11002.xml b/l10n_it_fatturapa_in/tests/data/IT01234567890_11002.xml deleted file mode 100644 index a5e9e02cc1b9..000000000000 --- a/l10n_it_fatturapa_in/tests/data/IT01234567890_11002.xml +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - IT - 01234567890 - - 00001 - SDI11 - AAAAAA - - - - - - IT - 02537410900 - - - SOCIETA' ALPHA SRL - - RF01 - - - VIALE ROMA 543 - 07100 - SASSARI - SS - IT - - - - - 02537410900 - - AMMINISTRAZIONE BETA - - - - 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 - 123abc - 456def - - - 1 - 123 - 2012-09-01 - 5 - 123abc - 456def - - - 1 - 123 - 5 - 123abc - 456def - - - 1 - 123 - 5 - 123abc - 456def - - - - - IT - 24681012141 - - - Trasporto spa - - - 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 - 27.00 - 5.95 - D - - - - TP01 - - MP01 - 2015-01-30 - 32.95 - - - - diff --git a/l10n_it_fatturapa_in/tests/data/IT02780790107_11003.xml b/l10n_it_fatturapa_in/tests/data/IT02780790107_11003.xml deleted file mode 100644 index c4b664bd73d4..000000000000 --- a/l10n_it_fatturapa_in/tests/data/IT02780790107_11003.xml +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - IT - 02780790107 - - 00001 - SDI11 - AAAAAA - - - - - - IT - 02780790107 - - - SOCIETA' ALPHA SRL - - RF01 - - - VIALE ROMA 543 - 07100 - SASSARI - SS - IT - - - - - 09876543210 - - AMMINISTRAZIONE BETA - - - - VIA TORINO 38-B - 00145 - ROMA - RM - IT - - - - - - - TD01 - EUR - 2014-12-23 - 125 - LA FATTURA FA RIFERIMENTO AD UNA OPERAZIONE AAAA BBBBBBBBBBBBBBBBBB CCC DDDDDDDDDDDDDDD E FFFFFFFFFFFFFFFFFFFF GGGGGGGGGG HHHHHHH II LLLLLLLLLLLLLLLLL - SEGUE DESCRIZIONE CAUSALE NEL CASO IN CUI NON SIANO STATI SUFFICIENTI 200 CARATTERI AAAAAAAAAAA BBBBBBBBBBBBBBBBB - - - 1 - 1 - 66685 - 1 - 123abc - 456def - - - 2 - 666852 - 2012-10-01 - 4 - 123cba2 - 456fed2 - - - 1 - 123 - 2012-09-01 - 5 - 123abc - 456def - - - 2 - 1232 - 2012-08-01 - 4 - 123abc2 - 456def2 - - - 1 - 2 - 123 - 5 - 123abc - 456def - - - 1 - 123 - 5 - 123abc - 456def - - - 1 - 123 - 2012-09-01 - 1 - 123abc - 456def - - - - - IT - 05714511002 - - - Trasporto spa - - - 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 - 27.00 - 5.95 - D - - - - TP01 - - MP01 - 2015-01-30 - 32.95 - - - - 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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 - - - test2.png - png - descrizione test 2 - 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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 b/l10n_it_fatturapa_in/tests/data/IT02780790107_11004.xml index 1bb43017a3b2..59524300a05c 100644 --- a/l10n_it_fatturapa_in/tests/data/IT02780790107_11004.xml +++ b/l10n_it_fatturapa_in/tests/data/IT02780790107_11004.xml @@ -1,5 +1,8 @@ - + @@ -7,8 +10,8 @@ 02780790107 00001 - SDI11 - 79SRAK + FPA12 + UFPQ1O @@ -88,6 +91,7 @@ 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 @@ -160,8 +164,8 @@ 22.00 - 25.00 - 5.50 + 34.00 + 7.48 D diff --git a/l10n_it_fatturapa_in/tests/data/IT02780790107_11005.xml b/l10n_it_fatturapa_in/tests/data/IT02780790107_11005.xml index d14bfb7c3095..8aba9de93e66 100644 --- a/l10n_it_fatturapa_in/tests/data/IT02780790107_11005.xml +++ b/l10n_it_fatturapa_in/tests/data/IT02780790107_11005.xml @@ -1,5 +1,8 @@ - + @@ -7,8 +10,8 @@ 02780790107 11005 - SDI11 - 79SRAK + FPA12 + UFPQ1O @@ -82,8 +85,8 @@ TC01 4.00 - 9.00 - 225.00 + 1.00 + 25.00 22.00 rif. amm @@ -156,15 +159,15 @@ 2 FORNITURE VARIE PER UFFICIO - 10.00 - 2.00 - 20.00 - 22.00 + 10.00 + 2.00 + 20.00 + 22.00 22.00 - 25.00 - 5.50 + 26.00 + 5.72 D diff --git a/l10n_it_fatturapa_in/tests/data/IT02780790107_11006.xml b/l10n_it_fatturapa_in/tests/data/IT02780790107_11006.xml index 969383576ed9..169d5f7e2a37 100644 --- a/l10n_it_fatturapa_in/tests/data/IT02780790107_11006.xml +++ b/l10n_it_fatturapa_in/tests/data/IT02780790107_11006.xml @@ -1,5 +1,8 @@ - + @@ -7,8 +10,8 @@ 02780790107 11005 - SDI11 - 79SRAK + FPA12 + UFPQ1O diff --git a/l10n_it_fatturapa_in/tests/data/IT02780790107_11007.xml b/l10n_it_fatturapa_in/tests/data/IT02780790107_11007.xml index 52f3df99f6c6..99e9fcb8507c 100644 --- a/l10n_it_fatturapa_in/tests/data/IT02780790107_11007.xml +++ b/l10n_it_fatturapa_in/tests/data/IT02780790107_11007.xml @@ -1,5 +1,8 @@ - + @@ -7,8 +10,8 @@ 02780790107 11007 - SDI11 - 79SRAK + FPA12 + UFPQ1O @@ -86,9 +89,8 @@ 15.55 - 26.00 25.00 - 5.50 + 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 index 07076657a068..8ac6bf1a0390 100644 --- a/l10n_it_fatturapa_in/tests/data/IT05979361218_001.xml +++ b/l10n_it_fatturapa_in/tests/data/IT05979361218_001.xml @@ -1,5 +1,8 @@ - - + + @@ -7,8 +10,8 @@ 05979361218 001 - SDI11 - 79SRAK + FPA12 + UFPQ1O @@ -85,7 +88,7 @@ 0.00 N4 - 54.00 + 57.00 0.00 Operazioni senza addebito imposta regime contribuenti minimi art.27 c.1-2 DL.98/11 @@ -104,4 +107,4 @@ - + diff --git a/l10n_it_fatturapa_in/tests/data/IT05979361218_002.xml b/l10n_it_fatturapa_in/tests/data/IT05979361218_002.xml index e264753a1e0a..7f1c3f08644b 100644 --- a/l10n_it_fatturapa_in/tests/data/IT05979361218_002.xml +++ b/l10n_it_fatturapa_in/tests/data/IT05979361218_002.xml @@ -1,5 +1,8 @@ - - + + @@ -7,8 +10,8 @@ 05979361218 002 - SDI11 - 79SRAK + FPA12 + UFPQ1O @@ -81,7 +84,7 @@ 0.00 N4 - 54.00 + 57.00 0.00 Operazioni senza addebito imposta regime contribuenti minimi art.27 c.1-2 DL.98/11 @@ -100,4 +103,4 @@ - + diff --git a/l10n_it_fatturapa_in/tests/data/IT05979361218_003.xml b/l10n_it_fatturapa_in/tests/data/IT05979361218_003.xml index 3f1f97c5f1a8..41d0e94a6410 100644 --- a/l10n_it_fatturapa_in/tests/data/IT05979361218_003.xml +++ b/l10n_it_fatturapa_in/tests/data/IT05979361218_003.xml @@ -1,5 +1,8 @@ - - + + @@ -7,8 +10,8 @@ 05979361218 003 - SDI11 - 79SRAK + FPA12 + UFPQ1O @@ -48,7 +51,7 @@ IT - 05979361228 + 03533590174 MRORSS90E25B111T @@ -92,4 +95,4 @@ - + diff --git a/l10n_it_fatturapa_in/tests/data/IT05979361218_004.xml b/l10n_it_fatturapa_in/tests/data/IT05979361218_004.xml index 1c2e8121e678..fc0442860da3 100644 --- a/l10n_it_fatturapa_in/tests/data/IT05979361218_004.xml +++ b/l10n_it_fatturapa_in/tests/data/IT05979361218_004.xml @@ -1,5 +1,8 @@ - - + + @@ -7,8 +10,8 @@ 05979361218 004 - SDI11 - 79SRAK + FPA12 + UFPQ1O @@ -48,7 +51,7 @@ IT - 05979361228 + 03533590174 MRORSS90E25B111T @@ -115,4 +118,4 @@ - + diff --git a/l10n_it_fatturapa_in/tests/data/IT05979361218_005.xml b/l10n_it_fatturapa_in/tests/data/IT05979361218_005.xml index dc9f4267c8d8..dfbee1c3f82c 100644 --- a/l10n_it_fatturapa_in/tests/data/IT05979361218_005.xml +++ b/l10n_it_fatturapa_in/tests/data/IT05979361218_005.xml @@ -1,5 +1,8 @@ - - + + @@ -7,8 +10,8 @@ 05979361218 005 - SDI11 - 79SRAK + FPA12 + UFPQ1O @@ -106,4 +109,4 @@ - + diff --git a/l10n_it_fatturapa_in/tests/data/IT05979361218_006.XML b/l10n_it_fatturapa_in/tests/data/IT05979361218_006.XML index e86b6765c2e6..d80f20d98b7a 100644 --- a/l10n_it_fatturapa_in/tests/data/IT05979361218_006.XML +++ b/l10n_it_fatturapa_in/tests/data/IT05979361218_006.XML @@ -1,5 +1,8 @@ - - + + @@ -7,8 +10,8 @@ 05979361218 006 - SDI11 - 79SRAK + FPA12 + UFPQ1O @@ -105,4 +108,4 @@ - + diff --git a/l10n_it_fatturapa_in/tests/data/IT05979361218_007.xml b/l10n_it_fatturapa_in/tests/data/IT05979361218_007.xml index f6385a9f6685..e4dccdf77f55 100644 --- a/l10n_it_fatturapa_in/tests/data/IT05979361218_007.xml +++ b/l10n_it_fatturapa_in/tests/data/IT05979361218_007.xml @@ -1,5 +1,8 @@ - - + + @@ -7,8 +10,8 @@ 05979361218 007 - SDI11 - 79SRAK + FPA12 + UFPQ1O @@ -50,7 +53,7 @@ TD01 EUR - 2015-03-16+02:00 + 2015-03-16 FT/2015/0009 Rif ordine MAPA: --- Nr. Identificativo Ordine 1234567 @@ -84,11 +87,11 @@ 2015-06-03+02:00 9.00 Bank Test - IT28V0100003245232200001200 + 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 index a054f728f770..719edafa35f9 100644 --- a/l10n_it_fatturapa_in/tests/data/IT05979361218_008.xml +++ b/l10n_it_fatturapa_in/tests/data/IT05979361218_008.xml @@ -1,5 +1,8 @@ - - + + @@ -7,8 +10,8 @@ 05979361218 008 - SDI11 - 79SRAK + FPA12 + UFPQ1O @@ -87,4 +90,4 @@ - + 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..d63d98fcd40c --- /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 + + + + \ No newline at end of file diff --git a/l10n_it_fatturapa_in/tests/test_import_fatturapa_xml.py b/l10n_it_fatturapa_in/tests/test_import_fatturapa_xml.py index e613cc138dfe..460bcbed2ebf 100644 --- a/l10n_it_fatturapa_in/tests/test_import_fatturapa_xml.py +++ b/l10n_it_fatturapa_in/tests/test_import_fatturapa_xml.py @@ -1,113 +1,103 @@ # -*- coding: utf-8 -*- -############################################################################## -# -# Copyright (C) 2014 Davide Corio -# Copyright (C) 2015 Lorenzo Battistini -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## import base64 import tempfile -import openerp.tests.common as test_common -from openerp import addons -from openerp.osv.orm import except_orm +from odoo.tests.common import SingleTransactionCase +from odoo.modules import get_module_resource +from odoo.exceptions import UserError -class TestFatturaPAXMLValidation(test_common.SingleTransactionCase): +class TestFatturaPAXMLValidation(SingleTransactionCase): def getFile(self, filename): - path = addons.get_module_resource('l10n_it_fatturapa_in', - 'tests', 'data', filename) + path = get_module_resource( + 'l10n_it_fatturapa_in', 'tests', 'data', filename) with open(path) 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').id, + 'rate_ids': [(0, 0, {'tax': 20.0})], + 'causale_pagamento_id': + self.env.ref('l10n_it_causali_pagamento.a').id, + }) + def setUp(self): super(TestFatturaPAXMLValidation, self).setUp() - self.wizard_model = self.registry('wizard.import.fatturapa') - self.data_model = self.registry('ir.model.data') - self.attach_model = self.registry('fatturapa.attachment.in') - self.invoice_model = self.registry('account.invoice') + self.wizard_model = self.env['wizard.import.fatturapa'] + self.data_model = self.env['ir.model.data'] + self.attach_model = self.env['fatturapa.attachment.in'] + self.invoice_model = self.env['account.invoice'] + self.payable_account_id = self.env['account.account'].search([ + ('user_type_id', '=', self.env.ref( + 'account.data_account_type_payable').id) + ], limit=1).id def run_wizard(self, name, file_name): - cr, uid = self.cr, self.uid - attach_id = self.attach_model .create( - cr, uid, + attach_id = self.attach_model.create( { 'name': name, 'datas': self.getFile(file_name)[1], 'datas_fname': file_name - }) - wizard_id = self.wizard_model.create(cr, uid, {}) - - return self.wizard_model.importFatturaPA( - cr, uid, wizard_id, context={'active_ids': [attach_id]}) + }).id + wizard = self.wizard_model.create({}) + return wizard.with_context(active_ids=[attach_id]).importFatturaPA() def run_wizard_multi(self, file_name_list): - cr, uid = self.cr, self.uid active_ids = [] for file_name in file_name_list: - active_ids.append(self.attach_model .create( - cr, uid, + active_ids.append(self.attach_model.create( { 'name': file_name, 'datas': self.getFile(file_name)[1], 'datas_fname': file_name - })) - wizard_id = self.wizard_model.create(cr, uid, {}) - - return self.wizard_model.importFatturaPA( - cr, uid, wizard_id, context={'active_ids': active_ids}) + }).id) + wizard = self.wizard_model.create({}) + return wizard.with_context(active_ids=active_ids).importFatturaPA() def test_00_xml_import(self): - cr, uid = self.cr, self.uid res = self.run_wizard('test0', 'IT05979361218_001.xml') invoice_id = res.get('domain')[0][2][0] - invoice = self.invoice_model.browse(cr, uid, invoice_id) + 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.supplier_invoice_number, 'FT/2015/0006') - self.assertEqual(invoice.amount_total, 54.00) + self.assertEqual(invoice.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) def test_01_xml_import(self): - cr, uid = self.cr, self.uid res = self.run_wizard('test1', 'IT02780790107_11004.xml') invoice_id = res.get('domain')[0][2][0] - invoice = self.invoice_model.browse(cr, uid, invoice_id) - self.assertEqual(invoice.supplier_invoice_number, '123') - self.assertEqual(invoice.amount_untaxed, 25.00) - self.assertEqual(invoice.amount_tax, 5.50) + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual(invoice.reference, '123') + self.assertEqual(invoice.amount_untaxed, 34.00) + self.assertEqual(invoice.amount_tax, 7.48) self.assertEqual( - len(invoice.invoice_line[0].invoice_line_tax_id), 1) + len(invoice.invoice_line_ids[0].invoice_line_tax_ids), 1) self.assertEqual( - invoice.invoice_line[0].invoice_line_tax_id[0].name, '22% ftPA') + invoice.invoice_line_ids[0].invoice_line_tax_ids[0].name, + '22% ftPA acq') self.assertEqual( - invoice.fatturapa_summary_ids[0].amount_untaxed, 25.00) + invoice.fatturapa_summary_ids[0].amount_untaxed, 34.00) self.assertEqual( - invoice.fatturapa_summary_ids[0].amount_tax, 5.50) + 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.province.code, "SS") + self.assertEqual(invoice.partner_id.state_id.code, "SS") self.assertEqual( invoice.tax_representative_id.name, "Rappresentante fiscale") self.assertEqual(invoice.welfare_fund_ids[0].welfare_rate_tax, 0.04) @@ -121,73 +111,74 @@ def test_01_xml_import(self): 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.incoterm.code, 'DAP') + self.assertEqual(invoice.ftpa_incoterms, 'DAP') + self.assertEqual(invoice.fiscal_document_type_id.code, 'TD01') + self.assertTrue(invoice.art73) - def test_02_xml_import(self): - cr, uid = self.cr, self.uid - res = self.run_wizard('test2', 'IT03638121008_X11111.xml') - invoice_id = res.get('domain')[0][2][0] - invoice = self.invoice_model.browse(cr, uid, invoice_id) - self.assertEqual(invoice.supplier_invoice_number, '00001') - self.assertEqual(invoice.amount_untaxed, 3) - self.assertEqual(invoice.amount_tax, 0.66) - self.assertEqual( - invoice.fatturapa_summary_ids[0].amount_untaxed, 3) - self.assertEqual( - invoice.fatturapa_summary_ids[0].amount_tax, 0.66) - self.assertEqual(invoice.partner_id.name, "Societa' alpha S.r.l.") + # def test_02_xml_import(self): + # res = self.run_wizard('test2', 'IT03638121008_X11111.xml') + # invoice_id = res.get('domain')[0][2][0] + # invoice = self.invoice_model.browse(invoice_id) + # self.assertEqual(invoice.supplier_invoice_number, '00001') + # self.assertEqual(invoice.amount_untaxed, 3) + # self.assertEqual(invoice.amount_tax, 0.66) + # self.assertEqual( + # invoice.fatturapa_summary_ids[0].amount_untaxed, 3) + # self.assertEqual( + # invoice.fatturapa_summary_ids[0].amount_tax, 0.66) + # self.assertEqual(invoice.partner_id.name, "Societa' alpha S.r.l.") - def test_03_xml_import(self): - cr, uid = self.cr, self.uid - res = self.run_wizard('test3', 'IT05979361218_002.xml.p7m') - invoice_id = res.get('domain')[0][2][0] - invoice = self.invoice_model.browse(cr, uid, invoice_id) - self.assertEqual(invoice.partner_id.register_code, 'TO1258B') - self.assertEqual( - invoice.partner_id.register_fiscalpos.code, 'RF02') - self.assertEqual(invoice.supplier_invoice_number, 'FT/2015/0007') - self.assertEqual(invoice.amount_total, 54.00) + # def test_03_xml_import(self): + # res = self.run_wizard('test3', 'IT05979361218_002.xml.p7m') + # 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.supplier_invoice_number, 'FT/2015/0007') + # self.assertEqual(invoice.amount_total, 54.00) def test_04_xml_import(self): - cr, uid = self.cr, self.uid res = self.run_wizard('test4', 'IT02780790107_11005.xml') invoice_id = res.get('domain')[0][2][0] - invoice = self.invoice_model.browse(cr, uid, invoice_id) - self.assertEqual(invoice.supplier_invoice_number, '124') + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual(invoice.reference, '124') self.assertEqual(invoice.partner_id.name, "SOCIETA' ALPHA SRL") self.assertEqual( - invoice.invoice_line[0].invoice_line_tax_id[0].name, '22% ftPA') + invoice.invoice_line_ids[0].invoice_line_tax_ids[0].name, + '22% ftPA acq') self.assertEqual( - invoice.invoice_line[1].invoice_line_tax_id[0].name, '22% ftPA') + invoice.invoice_line_ids[1].invoice_line_tax_ids[0].name, + '22% ftPA acq') self.assertEqual( - invoice.invoice_line[0].invoice_line_tax_id[0].amount, 0.22) + invoice.invoice_line_ids[0].invoice_line_tax_ids[0].amount, 22) self.assertEqual( - invoice.invoice_line[1].invoice_line_tax_id[0].amount, 0.22) + invoice.invoice_line_ids[1].invoice_line_tax_ids[0].amount, 22) self.assertEqual( - invoice.invoice_line[1].price_unit, 2) + invoice.invoice_line_ids[1].price_unit, 2) self.assertEqual( - invoice.invoice_line[0].cod_article_ids[0].name, 'EAN') + invoice.invoice_line_ids[0].cod_article_ids[0].name, 'EAN') self.assertEqual( - invoice.invoice_line[0].cod_article_ids[0].code_val, '12345') + invoice.invoice_line_ids[0].cod_article_ids[0].code_val, '12345') self.assertEqual( invoice.inconsistencies, u'DatiAnagrafici.Anagrafica.Denominazione contains "Societa\' ' 'Alpha SRL". Your System contains "SOCIETA\' ALPHA SRL"') def test_05_xml_import(self): - cr, uid = self.cr, self.uid res = self.run_wizard('test5', 'IT05979361218_003.xml') invoice_id = res.get('domain')[0][2][0] - invoice = self.invoice_model.browse(cr, uid, invoice_id) - self.assertEqual(invoice.supplier_invoice_number, 'FT/2015/0008') + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual(invoice.reference, 'FT/2015/0008') self.assertEqual(invoice.sender, 'TZ') self.assertEqual(invoice.intermediary.name, 'ROSSI MARIO') self.assertEqual(invoice.intermediary.firstname, 'MARIO') self.assertEqual(invoice.intermediary.lastname, 'ROSSI') self.assertEqual( - invoice.invoice_line[0].discount_rise_price_ids[0].name, 'SC') + invoice.invoice_line_ids[0].discount_rise_price_ids[0].name, 'SC') self.assertEqual( - invoice.invoice_line[0].discount_rise_price_ids[0].percentage, 10) + invoice.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) @@ -198,42 +189,39 @@ def test_06_import_except(self): Exception, self.run_wizard, 'test6_Exception', '') # fake Signed file is passed , generate orm_exception self.assertRaises( - except_orm, self.run_wizard, 'test6_orm_exception', + UserError, self.run_wizard, 'test6_orm_exception', 'IT05979361218_fake.xml.p7m' ) def test_07_xml_import(self): - cr, uid = self.cr, self.uid # 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(cr, uid, invoice_id) - self.assertEqual(invoice.supplier_invoice_number, 'FT/2015/0009') - self.assertEqual(invoice.amount_untaxed, 1173.60) + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual(invoice.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.assertEqual(invoice.invoice_line[0].admin_ref, 'D122353') + self.assertEqual(invoice.invoice_line_ids[0].admin_ref, 'D122353') def test_08_xml_import(self): - cr, uid = self.cr, self.uid # using ImportoTotaleDocumento res = self.run_wizard('test8', 'IT05979361218_005.xml') invoice_id = res.get('domain')[0][2][0] - invoice = self.invoice_model.browse(cr, uid, invoice_id) - self.assertEqual(invoice.supplier_invoice_number, 'FT/2015/0010') - self.assertEqual(invoice.amount_total, 1288.61) + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual(invoice.reference, 'FT/2015/0010') + self.assertAlmostEqual(invoice.amount_total, 1288.61) self.assertFalse(invoice.inconsistencies) def test_09_xml_import(self): - cr, uid = self.cr, self.uid # 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(cr, uid, invoice_id) - self.assertEqual(invoice.supplier_invoice_number, 'FT/2015/0011') - self.assertEqual(invoice.amount_total, 1288.61) + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual(invoice.reference, 'FT/2015/0011') + self.assertAlmostEqual(invoice.amount_total, 1288.61) self.assertEqual( invoice.inconsistencies, 'Computed amount untaxed 1030.42 is different from' @@ -241,11 +229,10 @@ def test_09_xml_import(self): def test_10_xml_import(self): # Fix Date format - cr, uid = self.cr, self.uid res = self.run_wizard('test6', 'IT05979361218_007.xml') invoice_id = res.get('domain')[0][2][0] - invoice = self.invoice_model.browse(cr, uid, invoice_id) - self.assertEqual(invoice.supplier_invoice_number, 'FT/2015/0009') + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual(invoice.reference, 'FT/2015/0009') self.assertEqual( invoice.date_invoice, '2015-03-16') self.assertEqual( @@ -261,25 +248,23 @@ def test_10_xml_import(self): def test_11_xml_import(self): # DatiOrdineAcquisto with RiferimentoNumeroLinea referring to # not existing invoice line - cr, uid = self.cr, self.uid res = self.run_wizard('test11', 'IT02780790107_11006.xml') invoice_id = res.get('domain')[0][2][0] - invoice = self.invoice_model.browse(cr, uid, invoice_id) + invoice = self.invoice_model.browse(invoice_id) self.assertEqual( - len(invoice.invoice_line[0].related_documents), 0) + len(invoice.invoice_line_ids[0].related_documents), 0) self.assertEqual( - invoice.invoice_line[0].sequence, 1) + invoice.invoice_line_ids[0].sequence, 1) self.assertEqual( invoice.related_documents[0].type, "order") self.assertEqual( invoice.related_documents[0].lineRef, 60) def test_12_xml_import(self): - cr, uid = self.cr, self.uid res = self.run_wizard('test12', 'IT05979361218_008.xml') invoice_id = res.get('domain')[0][2][0] - invoice = self.invoice_model.browse(cr, uid, invoice_id) - self.assertEqual(invoice.supplier_invoice_number, 'FT/2015/0012') + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual(invoice.reference, 'FT/2015/0012') self.assertEqual(invoice.sender, 'TZ') self.assertEqual(invoice.intermediary.name, 'ROSSI MARIO') self.assertEqual(invoice.intermediary.firstname, 'MARIO') @@ -287,15 +272,14 @@ def test_12_xml_import(self): def test_13_xml_import(self): # inconsistencies must not be duplicated - cr, uid = self.cr, self.uid res = self.run_wizard_multi([ 'IT02780790107_11005.xml', 'IT02780790107_11005.xml', ]) invoice1_id = res.get('domain')[0][2][0] invoice2_id = res.get('domain')[0][2][1] - invoice1 = self.invoice_model.browse(cr, uid, invoice1_id) - invoice2 = self.invoice_model.browse(cr, uid, invoice2_id) + invoice1 = self.invoice_model.browse(invoice1_id) + invoice2 = self.invoice_model.browse(invoice2_id) self.assertEqual( invoice1.inconsistencies, u'DatiAnagrafici.Anagrafica.Denominazione contains "Societa\' ' @@ -308,17 +292,13 @@ def test_13_xml_import(self): def test_14_xml_import(self): # check: no tax code found , write inconsisteance and anyway # create draft - cr, uid = self.cr, self.uid res = self.run_wizard('test14', 'IT02780790107_11007.xml') invoice_id = res.get('domain')[0][2][0] - invoice = self.invoice_model.browse(cr, uid, invoice_id) - self.assertEqual(invoice.supplier_invoice_number, '136') + invoice = self.invoice_model.browse(invoice_id) + self.assertEqual(invoice.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) - # check: filling check_total invoice field with summary data take from - # ''DatitRiepilogo' - self.assertEqual(invoice.check_total, 56.50) self.assertEqual( invoice.inconsistencies, u'DatiAnagrafici.Anagrafica.Denominazione contains "Societa\' ' @@ -327,3 +307,12 @@ def test_14_xml_import(self): ' 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.assertAlmostEquals(invoice.withholding_tax_amount, 1) + self.assertAlmostEquals(invoice.amount_total, 6.1) + self.assertAlmostEquals(invoice.amount_net_pay, 5.1) diff --git a/l10n_it_fatturapa_in/views/account_view.xml b/l10n_it_fatturapa_in/views/account_view.xml index 5074a2a50ac5..504517a9f7b5 100644 --- a/l10n_it_fatturapa_in/views/account_view.xml +++ b/l10n_it_fatturapa_in/views/account_view.xml @@ -1,147 +1,224 @@ - - + - - fatturapa.attachment.in.form - fatturapa.attachment.in - -
-
- - - - - - - - - -
- on - -
-
-
-
- - -
-
+ + fatturapa.attachment.in.form + fatturapa.attachment.in + +
+
+ + + + + + + + + +
+ on + +
+
+
+
+ + +
+
+
+
+ + fatturapa.attachment.in.tree + fatturapa.attachment.in + + + + + + + + + Incoming fatturaPA files + fatturapa.attachment.in + form + tree,form + + + + + + account.invoice.line.fatturapa.in + account.invoice.line + + + + - - - fatturapa.attachment.in.tree - fatturapa.attachment.in - - - - - + + - - - Incoming fatturaPA files - fatturapa.attachment.in - form - tree,form - - - - - - account.invoice.line.fatturapa.in - account.invoice.line - - - - - - - - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + account.invoice.fatturapa_in + account.invoice + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + - - - + + + + + + + +
+ + + + + + + + + + +
+
+
+ + + + - + + + + + + - - - + + + - - + + + + + + + -
-
-
- - - account.invoice.fatturapa_in - account.invoice - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -152,139 +229,33 @@ - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - -
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
-
+ + + + + + + + + + + + + + + + + + + + -
-
-
+ +
+ diff --git a/l10n_it_fatturapa_in/wizard/__init__.py b/l10n_it_fatturapa_in/wizard/__init__.py index a45fc832329f..4145cd7d37c8 100644 --- a/l10n_it_fatturapa_in/wizard/__init__.py +++ b/l10n_it_fatturapa_in/wizard/__init__.py @@ -1,22 +1,3 @@ # -*- coding: utf-8 -*- -############################################################################## -# -# Copyright (C) 2015 AgileBG SAGL -# Copyright (C) 2015 innoviu Srl -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## from . import wizard_import_fatturapa diff --git a/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py b/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py index c252b594faf9..1fc05c05f7f3 100644 --- a/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py +++ b/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py @@ -1,99 +1,73 @@ # -*- coding: utf-8 -*- -############################################################################## -# -# Copyright (C) 2015 AgileBG SAGL -# Copyright (C) 2015 innoviu Srl -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## + import base64 import os import shlex import subprocess -from openerp.osv import orm -from openerp.tools.translate import _ import logging +from odoo import models, api +from odoo.tools import float_is_zero +from odoo.tools.translate import _ +from odoo.exceptions import UserError - -from openerp.addons.l10n_it_fatturapa.bindings import fatturapa_v_1_1 -from openerp.addons.base_iban import base_iban +from odoo.addons.l10n_it_fatturapa.bindings import fatturapa_v_1_2 +from odoo.addons.base_iban.models.res_partner_bank import pretty_iban from lxml import etree _logger = logging.getLogger(__name__) -class WizardImportFatturapa(orm.TransientModel): +class WizardImportFatturapa(models.TransientModel): _name = "wizard.import.fatturapa" _description = "Import FatturaPA" - def saveAttachment(self, cr, uid, context=None): - if not context: - context = {} + def CountryByCode(self, CountryCode): + country_model = self.env['res.country'] + return country_model.search([('code', '=', CountryCode)]) - return False + def ProvinceByCode(self, provinceCode): + province_model = self.env['res.country.state'] + return province_model.search([ + ('code', '=', provinceCode), + ('country_id.code', '=', 'IT') + ]) - def CountryByCode(self, cr, uid, CountryCode, context=None): - country_model = self.pool['res.country'] - return country_model.search( - cr, uid, [('code', '=', CountryCode)], context=context) - - def ProvinceByCode(self, cr, uid, provinceCode, context=None): - province_model = self.pool['res.province'] - return province_model.search( - cr, uid, [('code', '=', provinceCode)], context=context) + def log_inconsistency(self, message): + inconsistencies = self.env.context.get('inconsistencies', '') + if inconsistencies: + inconsistencies += '\n' + inconsistencies += message + # we can't set + # self = self.with_context(inconsistencies=inconsistencies) + # because self is a locale variable. + # We use __dict__ to modify attributes of self + self.__dict__.update( + self.with_context(inconsistencies=inconsistencies).__dict__ + ) - def check_partner_base_data( - self, cr, uid, partner_id, DatiAnagrafici, context=None - ): - if context is None: - context = {} - partner = self.pool['res.partner'].browse( - cr, uid, partner_id, context=context) + 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 ): - if context.get('inconsistencies'): - context['inconsistencies'] += '\n' - context['inconsistencies'] += ( - _( - "DatiAnagrafici.Anagrafica.Denominazione contains \"%s\"." - " Your System contains \"%s\"" - ) - % (DatiAnagrafici.Anagrafica.Denominazione, partner.name) - ) + self.log_inconsistency(_( + "DatiAnagrafici.Anagrafica.Denominazione contains \"%s\"." + " Your System contains \"%s\"" + ) % (DatiAnagrafici.Anagrafica.Denominazione, partner.name)) if ( DatiAnagrafici.Anagrafica.Nome and partner.firstname != DatiAnagrafici.Anagrafica.Nome ): - if context.get('inconsistencies'): - context['inconsistencies'] += '\n' - context['inconsistencies'] += ( - _( - "DatiAnagrafici.Anagrafica.Nome contains \"%s\"." - " Your System contains \"%s\"" - ) - % (DatiAnagrafici.Anagrafica.Nome, partner.firstname) - ) + self.log_inconsistency(_( + "DatiAnagrafici.Anagrafica.Nome contains \"%s\"." + " Your System contains \"%s\"" + ) % (DatiAnagrafici.Anagrafica.Nome, partner.firstname)) if ( DatiAnagrafici.Anagrafica.Cognome and partner.lastname != DatiAnagrafici.Anagrafica.Cognome ): - if context.get('inconsistencies'): - context['inconsistencies'] += '\n' - context['inconsistencies'] += ( + self.log_inconsistency( _( "DatiAnagrafici.Anagrafica.Cognome contains \"%s\"." " Your System contains \"%s\"" @@ -101,10 +75,10 @@ def check_partner_base_data( % (DatiAnagrafici.Anagrafica.Cognome, partner.lastname) ) - def getPartnerBase(self, cr, uid, DatiAnagrafici, context=None): + def getPartnerBase(self, DatiAnagrafici): if not DatiAnagrafici: return False - partner_model = self.pool['res.partner'] + partner_model = self.env['res.partner'] cf = DatiAnagrafici.CodiceFiscale or False vat = False if DatiAnagrafici.IdFiscaleIVA: @@ -112,63 +86,49 @@ def getPartnerBase(self, cr, uid, DatiAnagrafici, context=None): DatiAnagrafici.IdFiscaleIVA.IdPaese, DatiAnagrafici.IdFiscaleIVA.IdCodice ) - partner_ids = partner_model.search( - cr, uid, - ['|', - ('vat', '=', vat or 0), - ('fiscalcode', '=', cf or 0), - ], - context=context) + partners = partner_model.search([ + '|', + ('vat', '=', vat or 0), + ('fiscalcode', '=', cf or 0), + ]) commercial_partner = False - if len(partner_ids) > 1: - for partner in partner_model.browse( - cr, uid, partner_ids, context=context - ): + if len(partners) > 1: + for partner in partners: if ( commercial_partner and partner.commercial_partner_id.id != commercial_partner ): - raise orm.except_orm( - _('Error !'), + raise UserError( _("Two distinct partners with " "Vat %s and Fiscalcode %s already present in db" % (vat, cf)) ) - commercial_partner = partner.commercial_partner_id.id - if not partner_ids: + if not partners: if DatiAnagrafici.Anagrafica.Denominazione: - partner_ids = partner_model.search( - cr, uid, - [('name', '=', DatiAnagrafici.Anagrafica.Denominazione)], - context=context) + partners = partner_model.search( + [('name', '=', DatiAnagrafici.Anagrafica.Denominazione)]) elif ( DatiAnagrafici.Anagrafica.Nome and DatiAnagrafici.Anagrafica.Cognome ): - partner_ids = partner_model.search( - cr, uid, - [ - ('firstname', '=', DatiAnagrafici.Anagrafica.Nome), - ('lastname', '=', DatiAnagrafici.Anagrafica.Cognome), - ], - context=context) - if partner_ids: - commercial_partner = partner_ids[0] - self.check_partner_base_data( - cr, uid, commercial_partner, DatiAnagrafici, context=context) - return commercial_partner + partners = partner_model.search([ + ('firstname', '=', DatiAnagrafici.Anagrafica.Nome), + ('lastname', '=', DatiAnagrafici.Anagrafica.Cognome), + ]) + if partners: + commercial_partner_id = partners[0].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 - country_ids = self.CountryByCode( - cr, uid, CountryCode, context=context) - if country_ids: - country_id = country_ids[0] + countries = self.CountryByCode(CountryCode) + if countries: + country_id = countries[0].id else: - raise orm.except_orm( - _('Error !'), + raise UserError( _("Country Code %s not found in system") % CountryCode ) vals = { @@ -188,14 +148,12 @@ def getPartnerBase(self, cr, uid, DatiAnagrafici, context=None): if DatiAnagrafici.Anagrafica.Denominazione: vals['name'] = DatiAnagrafici.Anagrafica.Denominazione - return partner_model.create(cr, uid, vals, context=context) + return partner_model.create(vals).id - def getCedPrest(self, cr, uid, cedPrest, context=None): - partner_model = self.pool['res.partner'] - partner_id = self.getPartnerBase( - cr, uid, cedPrest.DatiAnagrafici, context=context) - fiscalPosModel = self.pool['fatturapa.fiscal_position'] - vals = {} + def getCedPrest(self, cedPrest): + partner_model = self.env['res.partner'] + partner_id = self.getPartnerBase(cedPrest.DatiAnagrafici) + fiscalPosModel = self.env['fatturapa.fiscal_position'] if partner_id: vals = { 'street': cedPrest.Sede.Indirizzo, @@ -205,15 +163,24 @@ def getCedPrest(self, cr, uid, cedPrest, context=None): } if cedPrest.DatiAnagrafici.ProvinciaAlbo: ProvinciaAlbo = cedPrest.DatiAnagrafici.ProvinciaAlbo - prov_ids = self.ProvinceByCode( - cr, uid, ProvinciaAlbo, context=context) - if not prov_ids: - raise orm.except_orm( - _('Error !'), - _('ProvinciaAlbo ( %s ) not present in system') % - ProvinciaAlbo - ) - vals['register_province'] = prov_ids[0] + prov = self.ProvinceByCode(ProvinciaAlbo) + if not prov: + self.log_inconsistency( + _('ProvinciaAlbo ( %s ) not present in 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( + _('Provincia ( %s ) not present in system') + % Provincia + ) + else: + vals['state_id'] = prov_sede[0].id vals['register_code'] = ( cedPrest.DatiAnagrafici.NumeroIscrizioneAlbo) @@ -222,34 +189,31 @@ def getCedPrest(self, cr, uid, cedPrest, context=None): if cedPrest.DatiAnagrafici.RegimeFiscale: rfPos = cedPrest.DatiAnagrafici.RegimeFiscale - FiscalPosIds = fiscalPosModel.search( - cr, uid, - [('code', '=', rfPos)], - context=context + FiscalPos = fiscalPosModel.search( + [('code', '=', rfPos)] ) - if not FiscalPosIds: - raise orm.except_orm( - _('Error!'), + if not FiscalPos: + raise UserError( _('RegimeFiscale %s is not present in your system') % rfPos ) else: - vals['register_fiscalpos'] = FiscalPosIds[0] + vals['register_fiscalpos'] = FiscalPos[0].id if cedPrest.IscrizioneREA: REA = cedPrest.IscrizioneREA vals['rea_code'] = REA.NumeroREA - office_id = False - office_ids = self.ProvinceByCode( - cr, uid, REA.Ufficio, context=context) - if not office_ids: - raise orm.except_orm( - _('Error !'), - _('REA Office Code ( %s ) not present in system') % - REA.Ufficio - ) - office_id = office_ids[0] - vals['rea_office'] = office_id + offices = self.ProvinceByCode(REA.Ufficio) + if not offices: + self.log_inconsistency( + _( + 'REA Office (Province) Code ( %s ) not present in ' + 'system' + ) % REA.Ufficio + ) + else: + office_id = offices[0].id + vals['rea_office'] = office_id vals['rea_capital'] = REA.CapitaleSociale or 0.0 vals['rea_member_type'] = REA.SocioUnico or False vals['rea_liquidation_state'] = REA.StatoLiquidazione or False @@ -258,73 +222,61 @@ def getCedPrest(self, cr, uid, cedPrest, context=None): vals['phone'] = cedPrest.Contatti.Telefono vals['email'] = cedPrest.Contatti.Email vals['fax'] = cedPrest.Contatti.Fax - partner_model.write(cr, uid, partner_id, vals, context=context) + partner_model.browse(partner_id).write(vals) return partner_id - def getCarrirerPartner(self, cr, uid, Carrier, context=None): - partner_model = self.pool['res.partner'] - partner_id = self.getPartnerBase( - cr, uid, Carrier.DatiAnagraficiVettore, context=context) - vals = {} + def getCarrirerPartner(self, Carrier): + partner_model = self.env['res.partner'] + partner_id = self.getPartnerBase(Carrier.DatiAnagraficiVettore) if partner_id: vals = { 'license_number': Carrier.DatiAnagraficiVettore.NumeroLicenzaGuida or '', } - partner_model.write(cr, uid, partner_id, vals, context=context) + partner_model.browse(partner_id).write(vals) return partner_id - def _prepareInvoiceLine( - self, cr, uid, credit_account_id, line, context=None - ): - account_tax_model = self.pool['account.tax'] + def _prepare_generic_line_data(self, line): + retLine = {} + account_tax_model = self.env['account.tax'] # check if a default tax exists and generate def_purchase_tax object - ir_values = self.pool.get('ir.values') - company_id = self.pool.get('res.company')._company_default_get( - cr, uid, 'account.invoice.line', context=context - ) + ir_values = self.env['ir.values'] + company_id = self.env['res.company']._company_default_get( + 'account.invoice.line').id supplier_taxes_ids = ir_values.get_default( - cr, uid, 'product.product', 'supplier_taxes_id', - company_id=company_id - ) + 'product.product', 'supplier_taxes_id', company_id=company_id) def_purchase_tax = False if supplier_taxes_ids: - def_purchase_tax = account_tax_model.browse( - cr, uid, supplier_taxes_ids, context=context)[0] + def_purchase_tax = account_tax_model.browse(supplier_taxes_ids)[0] if float(line.AliquotaIVA) == 0.0 and line.Natura: - account_tax_ids = account_tax_model.search( - cr, uid, + account_taxes = account_tax_model.search( [ - ('type_tax_use', 'in', ('purchase', 'all')), - ('non_taxable_nature', '=', line.Natura), + ('type_tax_use', '=', 'purchase'), + ('kind_id.code', '=', line.Natura), ('amount', '=', 0.0), - ], context=context) - if not account_tax_ids: - raise orm.except_orm( - _('Error!'), + ]) + if not account_taxes: + raise UserError( _('No tax with percentage ' - '%s and nature %s found') + '%s and nature %s found. Please configure this tax') % (line.AliquotaIVA, line.Natura)) - if len(account_tax_ids) > 1: - raise orm.except_orm( - _('Error!'), + if len(account_taxes) > 1: + raise UserError( _('Too many taxes with percentage ' '%s and nature %s found') % (line.AliquotaIVA, line.Natura)) else: - account_tax_ids = account_tax_model.search( - cr, uid, + account_taxes = account_tax_model.search( [ - ('type_tax_use', 'in', ('purchase', 'all')), - ('amount', '=', float(line.AliquotaIVA) / 100), + ('type_tax_use', '=', 'purchase'), + ('amount', '=', float(line.AliquotaIVA)), ('price_include', '=', False), # partially deductible VAT must be set by user - ('child_ids', '=', False), - ], context=context) - if not account_tax_ids: - if context.get('inconsistencies'): - context['inconsistencies'] += '\n' - context['inconsistencies'] += ( + ('children_tax_ids', '=', False), + ] + ) + if not account_taxes: + self.log_inconsistency( _( 'XML contains tax with percentage "%s" ' 'but it does not exist in your system' @@ -332,7 +284,7 @@ def _prepareInvoiceLine( ) # check if there are multiple taxes with # same percentage - if len(account_tax_ids) > 1: + if len(account_taxes) > 1: # just logging because this is an usual case: see split payment _logger.warning(_( "Line '%s': Too many taxes with percentage equals " @@ -343,16 +295,20 @@ def _prepareInvoiceLine( # set taxes list equal to supplier_taxes_id, loaded before if ( def_purchase_tax and - def_purchase_tax.amount == (float(line.AliquotaIVA) / 100) + def_purchase_tax.amount == (float(line.AliquotaIVA)) ): - account_tax_ids = supplier_taxes_ids - retLine = { + account_taxes = def_purchase_tax + if account_taxes: + retLine['invoice_line_tax_ids'] = [(6, 0, [account_taxes[0].id])] + return retLine + + def _prepareInvoiceLine(self, credit_account_id, line, wt_found=False): + retLine = self._prepare_generic_line_data(line) + retLine.update({ 'name': line.Descrizione, 'sequence': int(line.NumeroLinea), 'account_id': credit_account_id, - } - if account_tax_ids: - retLine['invoice_line_tax_id'] = [(6, 0, [account_tax_ids[0]])] + }) if line.PrezzoUnitario: retLine['price_unit'] = float(line.PrezzoUnitario) if line.Quantita: @@ -371,16 +327,15 @@ def _prepareInvoiceLine( line.PrezzoTotale and line.PrezzoUnitario and line.Quantita and line.ScontoMaggiorazione ): - retLine['discount'] = self._computeDiscount( - cr, uid, line, context=context) + retLine['discount'] = self._computeDiscount(line) if line.RiferimentoAmministrazione: retLine['admin_ref'] = line.RiferimentoAmministrazione + if wt_found and line.Ritenuta: + retLine['invoice_line_tax_wt_ids'] = [(6, 0, [wt_found.id])] return retLine - def _prepareRelDocsLine( - self, cr, uid, invoice_id, line, type, context=None - ): + def _prepareRelDocsLine(self, invoice_id, line, type): res = [] lineref = line.RiferimentoNumeroLinea or False IdDoc = line.IdDocumento or 'Error' @@ -393,15 +348,14 @@ def _prepareRelDocsLine( if lineref: for numline in lineref: invoice_lineid = False - invoice_line_model = self.pool['account.invoice.line'] - invoice_line_ids = invoice_line_model.search( - cr, uid, + invoice_line_model = self.env['account.invoice.line'] + invoice_lines = invoice_line_model.search( [ ('invoice_id', '=', invoice_id), ('sequence', '=', int(numline)), - ], context=context) - if invoice_line_ids: - invoice_lineid = invoice_line_ids[0] + ]) + if invoice_lines: + invoice_lineid = invoice_lines[0].id val = { 'type': type, 'name': IdDoc, @@ -430,10 +384,7 @@ def _prepareRelDocsLine( res.append(val) return res - def _prepareWelfareLine( - self, cr, uid, invoice_id, line, context=None - ): - res = [] + def _prepareWelfareLine(self, invoice_id, line): TipoCassa = line.TipoCassa or False AlCassa = line.AlCassa and (float(line.AlCassa)/100) or None ImportoContributoCassa = ( @@ -445,17 +396,26 @@ def _prepareWelfareLine( 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.pool['welfare.fund.type'] + WelfareTypeModel = self.env['welfare.fund.type'] if not TipoCassa: - raise orm.except_orm( - _('Error!'), + raise UserError( _('TipoCassa is not defined ') ) - WelfareTypeId = WelfareTypeModel.search( - cr, uid, - [('name', '=', TipoCassa)], - context=context + WelfareType = WelfareTypeModel.search( + [('name', '=', TipoCassa)] ) res = { @@ -464,38 +424,32 @@ def _prepareWelfareLine( 'welfare_taxable': ImponibileCassa, 'welfare_Iva_tax': AliquotaIVA, 'subjected_withholding': Ritenuta, - 'fund_nature': Natura or False, + 'kind_id': kind_id, 'pa_line_code': RiferimentoAmministrazione, 'invoice_id': invoice_id, } - if not WelfareTypeId: - raise orm.except_orm( - _('Error'), + if not WelfareType: + raise UserError( _('TipoCassa %s is not present in your system') % TipoCassa) else: - res['name'] = WelfareTypeId[0] + res['name'] = WelfareType[0].id return res - def _prepareDiscRisePriceLine( - self, cr, uid, id, line, context=None - ): - res = [] + def _prepareDiscRisePriceLine(self, 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, - context.get('drtype'): id, + self.env.context.get('drtype'): id, } res['name'] = Tipo return res - def _computeDiscount( - self, cr, uid, DettaglioLinea, context=None - ): + def _computeDiscount(self, DettaglioLinea): line_total = float(DettaglioLinea.PrezzoTotale) line_unit = line_total / float(DettaglioLinea.Quantita) discount = ( @@ -503,14 +457,11 @@ def _computeDiscount( ) * 100.0 return discount - def _addGlobalDiscount( - self, cr, uid, invoice_id, DatiGeneraliDocumento, context=None - ): + def _addGlobalDiscount(self, invoice_id, DatiGeneraliDocumento): discount = 0.0 if DatiGeneraliDocumento.ScontoMaggiorazione: - invoice = self.pool['account.invoice'].browse( - cr, uid, invoice_id, context=context) - invoice.button_compute(context=context, set_total=True) + invoice = self.env['account.invoice'].browse(invoice_id) + invoice.compute_taxes() for DiscRise in DatiGeneraliDocumento.ScontoMaggiorazione: if DiscRise.Percentuale: amount = ( @@ -525,8 +476,7 @@ def _addGlobalDiscount( discount -= float(DiscRise.Importo) elif DiscRise.Tipo == 'MG': discount += float(DiscRise.Importo) - journal = self.get_purchase_journal( - cr, uid, invoice.company_id, context=context) + journal = self.get_purchase_journal(invoice.company_id) credit_account_id = journal.default_credit_account_id.id line_vals = { 'invoice_id': invoice_id, @@ -536,29 +486,22 @@ def _addGlobalDiscount( 'price_unit': discount, 'quantity': 1, } - self.pool['account.invoice.line'].create( - cr, uid, line_vals, context=context) + self.env['account.invoice.line'].create(line_vals) return True - def _createPayamentsLine( - self, cr, uid, payment_id, line, partner_id, - context=None - ): - PaymentModel = self.pool['fatturapa.payment.detail'] - PaymentMethodModel = self.pool['fatturapa.payment_method'] + def _createPayamentsLine(self, payment_id, line, partner_id): + PaymentModel = self.env['fatturapa.payment.detail'] + PaymentMethodModel = self.env['fatturapa.payment_method'] details = line.DettaglioPagamento or False if details: for dline in details: - BankModel = self.pool['res.bank'] - PartnerBankModel = self.pool['res.partner.bank'] - method_id = PaymentMethodModel.search( - cr, uid, - [('code', '=', dline.ModalitaPagamento)], - context=context + BankModel = self.env['res.bank'] + PartnerBankModel = self.env['res.partner.bank'] + method = PaymentMethodModel.search( + [('code', '=', dline.ModalitaPagamento)] ) - if not method_id: - raise orm.except_orm( - _('Error!'), + if not method: + raise UserError( _( 'ModalitaPagamento %s not defined in your system' % dline.ModalitaPagamento @@ -566,7 +509,7 @@ def _createPayamentsLine( ) val = { 'recipient': dline.Beneficiario, - 'fatturapa_pm_id': method_id[0], + 'fatturapa_pm_id': method[0].id, 'payment_term_start': dline.DataRiferimentoTerminiPagamento or False, 'payment_days': @@ -611,45 +554,36 @@ def _createPayamentsLine( bankid = False payment_bank_id = False if dline.BIC: - bankids = BankModel.search( - cr, uid, - [('bic', '=', dline.BIC.strip())], context=context + banks = BankModel.search( + [('bic', '=', dline.BIC.strip())] ) - if not bankids: + if not banks: if not dline.IstitutoFinanziario: - if context.get('inconsistencies'): - context['inconsistencies'] += '\n' - context['inconsistencies'] += ( + self.log_inconsistency( _("Name of Bank with BIC \"%s\" is not set." " Can't create bank") % dline.BIC ) else: bankid = BankModel.create( - cr, uid, { 'name': dline.IstitutoFinanziario, 'bic': dline.BIC, - }, - context=context - ) + } + ).id else: - bankid = bankids[0] + bankid = banks[0].id if dline.IBAN: SearchDom = [ - ('state', '=', 'iban'), ( 'acc_number', '=', - base_iban._pretty_iban(dline.IBAN.strip()) + pretty_iban(dline.IBAN.strip()) ), ('partner_id', '=', partner_id), ] payment_bank_id = False - payment_bank_ids = PartnerBankModel.search( - cr, uid, SearchDom, context=context) - if not payment_bank_ids and not bankid: - if context.get('inconsistencies'): - context['inconsistencies'] += '\n' - context['inconsistencies'] += ( + payment_banks = PartnerBankModel.search(SearchDom) + if not payment_banks and not bankid: + self.log_inconsistency( _( 'BIC is required and not exist in Xml\n' 'Curr bank data is: \n' @@ -661,93 +595,93 @@ def _createPayamentsLine( dline.IstitutoFinanziario or '' ) ) - - elif not payment_bank_ids and bankid: + elif not payment_banks and bankid: payment_bank_id = PartnerBankModel.create( - cr, uid, { - 'state': 'iban', 'acc_number': dline.IBAN.strip(), 'partner_id': partner_id, - 'bank': bankid, + 'bank_id': bankid, 'bank_name': dline.IstitutoFinanziario, 'bank_bic': dline.BIC - }, - context=context - ) - if payment_bank_ids: - payment_bank_id = payment_bank_ids[0] + } + ).id + if payment_banks: + payment_bank_id = payment_banks[0].id if payment_bank_id: val['payment_bank'] = payment_bank_id - PaymentModel.create(cr, uid, val, context=context) + PaymentModel.create(val) return True - def get_purchase_journal(self, cr, uid, company, context=None): - journal_model = self.pool['account.journal'] - journal_ids = journal_model.search( - cr, uid, + # 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, context=context) - if not journal_ids: - raise orm.except_orm( - _('Error!'), + limit=1) + if not journals: + raise UserError( _( 'Define a purchase journal ' 'for this company: "%s" (id:%d).' ) % (company.name, company.id) ) - purchase_journal = journal_model.browse( - cr, uid, journal_ids[0], context=context) - return purchase_journal + return journals[0] def invoiceCreate( - self, cr, uid, fatt, fatturapa_attachment, FatturaBody, - partner_id, context=None + self, fatt, fatturapa_attachment, FatturaBody, partner_id ): - if context is None: - context = {} - partner_model = self.pool['res.partner'] - invoice_model = self.pool['account.invoice'] - currency_model = self.pool['res.currency'] - invoice_line_model = self.pool['account.invoice.line'] - ftpa_doctype_poll = self.pool['fatturapa.document_type'] - rel_docs_model = self.pool['fatturapa.related_document_type'] - WelfareFundLineModel = self.pool['welfare.fund.data.line'] - DiscRisePriceModel = self.pool['discount.rise.price'] - SalModel = self.pool['faturapa.activity.progress'] - DdTModel = self.pool['fatturapa.related_ddt'] - PaymentDataModel = self.pool['fatturapa.payment.data'] - PaymentTermsModel = self.pool['fatturapa.payment_term'] - SummaryDatasModel = self.pool['faturapa.summary.data'] + partner_model = self.env['res.partner'] + invoice_model = self.env['account.invoice'] + currency_model = self.env['res.currency'] + invoice_line_model = self.env['account.invoice.line'] + ftpa_doctype_model = self.env['fiscal.document.type'] + rel_docs_model = self.env['fatturapa.related_document_type'] + WelfareFundLineModel = self.env['welfare.fund.data.line'] + DiscRisePriceModel = self.env['discount.rise.price'] + SalModel = self.env['faturapa.activity.progress'] + DdTModel = self.env['fatturapa.related_ddt'] + PaymentDataModel = self.env['fatturapa.payment.data'] + PaymentTermsModel = self.env['fatturapa.payment_term'] + SummaryDatasModel = self.env['faturapa.summary.data'] - company = self.pool['res.users'].browse( - cr, uid, uid, context=context).company_id - partner = partner_model.browse(cr, uid, partner_id, context=context) - pay_acc_id = partner.property_account_payable.id + company = self.env.user.company_id + partner = partner_model.browse(partner_id) + pay_acc_id = partner.property_account_payable_id.id # currency 2.1.1.2 - currency_id = currency_model.search( - cr, uid, + currency = currency_model.search( [ ( 'name', '=', FatturaBody.DatiGenerali.DatiGeneraliDocumento.Divisa ) - ], - context=context) - if not currency_id: - raise orm.except_orm( - _('Error!'), + ]) + if not currency: + raise UserError( _( 'No currency found with code %s' % FatturaBody.DatiGenerali.DatiGeneraliDocumento.Divisa ) ) - purchase_journal = self.get_purchase_journal( - cr, uid, company, context=context) + purchase_journal = self.get_purchase_journal(company) credit_account_id = purchase_journal.default_credit_account_id.id invoice_lines = [] comment = '' @@ -756,18 +690,15 @@ def invoiceCreate( invtype = 'in_invoice' docType = FatturaBody.DatiGenerali.DatiGeneraliDocumento.TipoDocumento if docType: - docType_ids = ftpa_doctype_poll.search( - cr, uid, + docType_record = ftpa_doctype_model.search( [ ('code', '=', docType) - ], - context=context + ] ) - if docType_ids: - docType_id = docType_ids[0] + if docType_record: + docType_id = docType_record[0].id else: - raise orm.except_orm( - _("Error"), + raise UserError( _("tipoDocumento %s not handled") % docType) if docType == 'TD04' or docType == 'TD05': @@ -777,158 +708,180 @@ def invoiceCreate( if causLst: for item in causLst: comment += item + '\n' - # 2.2.1 - CodeArts = self.pool['fatturapa.article.code'] - for line in FatturaBody.DatiBeniServizi.DettaglioLinee: - invoice_line_data = self._prepareInvoiceLine( - cr, uid, credit_account_id, line, context=context) - invoice_line_id = invoice_line_model.create( - cr, uid, invoice_line_data, context=context) - - if line.CodiceArticolo: - for caline in line.CodiceArticolo: - CodeArts.create( - cr, uid, - { - 'name': caline.CodiceTipo or '', - 'code_val': caline.CodiceValore or '', - 'invoice_line_id': invoice_line_id - }, - context=context - ) - if line.ScontoMaggiorazione: - context['drtype'] = 'invoice_line_id' - for DiscRisePriceLine in line.ScontoMaggiorazione: - DiscRisePriceVals = self._prepareDiscRisePriceLine( - cr, uid, invoice_line_id, DiscRisePriceLine, - context=context - ) - DiscRisePriceModel.create( - cr, uid, DiscRisePriceVals, context=context) - invoice_lines.append(invoice_line_id) invoice_data = { - 'doc_type': docType_id, + 'fiscal_document_type_id': docType_id, 'date_invoice': FatturaBody.DatiGenerali.DatiGeneraliDocumento.Data, - 'supplier_invoice_number': + 'reference': FatturaBody.DatiGenerali.DatiGeneraliDocumento.Numero, 'sender': fatt.FatturaElettronicaHeader.SoggettoEmittente or False, 'account_id': pay_acc_id, 'type': invtype, 'partner_id': partner_id, - 'currency_id': currency_id[0], + 'currency_id': currency[0].id, 'journal_id': purchase_journal.id, - 'invoice_line': [(6, 0, invoice_lines)], # 'origin': xmlData.datiOrdineAcquisto, - 'fiscal_position': False, - 'payment_term': False, + 'fiscal_position_id': False, + 'payment_term_id': False, 'company_id': company.id, 'fatturapa_attachment_in_id': fatturapa_attachment.id, 'comment': comment } + + # 2.1.1.10 + if FatturaBody.DatiGenerali.DatiGeneraliDocumento.Arrotondamento: + invoice_data['efatt_rounding'] = float( + FatturaBody.DatiGenerali.DatiGeneraliDocumento.Arrotondamento + ) + # 2.1.1.12 + if FatturaBody.DatiGenerali.DatiGeneraliDocumento.Art73: + invoice_data['art73'] = True + # 2.1.1.5 Withholding = FatturaBody.DatiGenerali.\ DatiGeneraliDocumento.DatiRitenuta + wt_found = None if Withholding: - invoice_data['withholding_amount'] = Withholding.ImportoRitenuta + wts = self.env['withholding.tax'].search([ + ('causale_pagamento_id.code', '=', + Withholding.CausalePagamento) + ]) + if not wts: + raise UserError(_( + "Supplier invoice contains withholding tax with " + "CausalePagamento %s, " + "but such a tax is not found in your system. Please " + "set it" + ) % Withholding.CausalePagamento) + wt_found = False + for wt in wts: + if wt.tax == float(Withholding.AliquotaRitenuta): + wt_found = wt + break + if not wt_found: + raise UserError(_( + "No withholding tax found with Causale %s and rate %s" + ) % ( + Withholding.CausalePagamento, Withholding.AliquotaRitenuta + )) invoice_data['ftpa_withholding_type'] = Withholding.TipoRitenuta - invoice_data['ftpa_withholding_rate'] = float( - Withholding.AliquotaRitenuta)/100 - invoice_data['ftpa_withholding_payment_reason'] = Withholding.\ - CausalePagamento + # 2.2.1 + CodeArts = self.env['fatturapa.article.code'] + for line in FatturaBody.DatiBeniServizi.DettaglioLinee: + invoice_line_data = self._prepareInvoiceLine( + credit_account_id, line, wt_found) + invoice_line_id = invoice_line_model.create(invoice_line_data).id + + if line.CodiceArticolo: + for caline in line.CodiceArticolo: + CodeArts.create( + { + 'name': caline.CodiceTipo or '', + 'code_val': caline.CodiceValore or '', + 'invoice_line_id': invoice_line_id + } + ) + if line.ScontoMaggiorazione: + for DiscRisePriceLine in line.ScontoMaggiorazione: + DiscRisePriceVals = self.with_context( + drtype='invoice_line_id' + )._prepareDiscRisePriceLine( + invoice_line_id, DiscRisePriceLine + ) + DiscRisePriceModel.create(DiscRisePriceVals) + invoice_lines.append(invoice_line_id) + invoice_data['invoice_line_ids'] = [(6, 0, invoice_lines)] # 2.1.1.6 Stamps = FatturaBody.DatiGenerali.\ DatiGeneraliDocumento.DatiBollo if Stamps: invoice_data['virtual_stamp'] = Stamps.BolloVirtuale invoice_data['stamp_amount'] = float(Stamps.ImportoBollo) - invoice_id = invoice_model.create( - cr, uid, invoice_data, context=context) + invoice = invoice_model.create(invoice_data) + invoice._onchange_invoice_line_wt_ids() + invoice.write(invoice._convert_to_write(invoice._cache)) + invoice_id = invoice.id - invoice = invoice_model.browse(cr, uid, invoice_id, context=context) # 2.1.1.7 Walfares = FatturaBody.DatiGenerali.\ DatiGeneraliDocumento.DatiCassaPrevidenziale if Walfares: for walfareLine in Walfares: WalferLineVals = self._prepareWelfareLine( - cr, uid, invoice_id, walfareLine, context=context) - WelfareFundLineModel.create( - cr, uid, WalferLineVals, context=context) - # 2.1.1.8 - DiscountRises = FatturaBody.DatiGenerali.\ - DatiGeneraliDocumento.ScontoMaggiorazione - if DiscountRises: - context['drtype'] = 'invoice_id' - for DiscRisePriceLine in DiscountRises: - DiscRisePriceVals = self._prepareDiscRisePriceLine( - cr, uid, invoice_id, DiscRisePriceLine, context=context) - DiscRisePriceModel.create( - cr, uid, DiscRisePriceVals, context=context) + invoice_id, walfareLine) + WelfareFundLineModel.create(WalferLineVals) + line_vals = self._prepare_generic_line_data(walfareLine) + line_vals.update({ + 'name': walfareLine.TipoCassa, + 'price_unit': float(walfareLine.ImportoContributoCassa), + 'invoice_id': invoice.id, + 'account_id': credit_account_id, + }) + if walfareLine.Ritenuta: + if not wt_found: + raise UserError(_( + "CassaPrevidenziale %s has Ritenuta but no " + "withholding tax was found in the system" + % walfareLine.TipoCassa)) + line_vals['invoice_line_tax_wt_ids'] = [ + (6, 0, [wt_found.id])] + self.env['account.invoice.line'].create(line_vals) # 2.1.2 relOrders = FatturaBody.DatiGenerali.DatiOrdineAcquisto if relOrders: for order in relOrders: doc_datas = self._prepareRelDocsLine( - cr, uid, invoice_id, order, 'order', context=context) + invoice_id, order, 'order') if doc_datas: for doc_data in doc_datas: - rel_docs_model.create( - cr, uid, doc_data, context=context) + rel_docs_model.create(doc_data) # 2.1.3 relContracts = FatturaBody.DatiGenerali.DatiContratto if relContracts: for contract in relContracts: doc_datas = self._prepareRelDocsLine( - cr, uid, invoice_id, contract, 'contract', context=context) + invoice_id, contract, 'contract') if doc_datas: for doc_data in doc_datas: - rel_docs_model.create( - cr, uid, doc_data, context=context) + rel_docs_model.create(doc_data) # 2.1.4 relAgreements = FatturaBody.DatiGenerali.DatiConvenzione if relAgreements: for agreement in relAgreements: doc_datas = self._prepareRelDocsLine( - cr, uid, invoice_id, agreement, - 'agreement', context=context) + invoice_id, agreement, 'agreement') if doc_datas: for doc_data in doc_datas: - rel_docs_model.create( - cr, uid, doc_data, context=context) + rel_docs_model.create(doc_data) # 2.1.5 relReceptions = FatturaBody.DatiGenerali.DatiRicezione if relReceptions: for reception in relReceptions: doc_datas = self._prepareRelDocsLine( - cr, uid, invoice_id, reception, - 'reception', context=context) + invoice_id, reception, 'reception') if doc_datas: for doc_data in doc_datas: - rel_docs_model.create( - cr, uid, doc_data, context=context) + rel_docs_model.create(doc_data) # 2.1.6 RelInvoices = FatturaBody.DatiGenerali.DatiFattureCollegate if RelInvoices: for invoice in RelInvoices: doc_datas = self._prepareRelDocsLine( - cr, uid, invoice_id, invoice, 'invoice', context=context) + invoice_id, invoice, 'invoice') if doc_datas: for doc_data in doc_datas: - rel_docs_model.create( - cr, uid, doc_data, context=context) + rel_docs_model.create(doc_data) # 2.1.7 SalDatas = FatturaBody.DatiGenerali.DatiSAL if SalDatas: for SalDataLine in SalDatas: SalModel.create( - cr, uid, { 'fatturapa_activity_progress': ( SalDataLine.RiferimentoFase or 0), 'invoice_id': invoice_id - }, context=context + } ) # 2.1.8 DdtDatas = FatturaBody.DatiGenerali.DatiDDT @@ -936,38 +889,34 @@ def invoiceCreate( for DdtDataLine in DdtDatas: if not DdtDataLine.RiferimentoNumeroLinea: DdTModel.create( - cr, uid, { 'name': DdtDataLine.NumeroDDT or '', 'date': DdtDataLine.DataDDT or False, 'invoice_id': invoice_id - }, context=context + } ) else: for numline in DdtDataLine.RiferimentoNumeroLinea: - invoice_line_ids = invoice_line_model.search( - cr, uid, + invoice_lines = invoice_line_model.search( [ ('invoice_id', '=', invoice_id), ('sequence', '=', int(numline)), - ], context=context) + ]) invoice_lineid = False - if invoice_line_ids: - invoice_lineid = invoice_line_ids[0] + if invoice_lines: + invoice_lineid = invoice_lines[0].id DdTModel.create( - cr, uid, { 'name': DdtDataLine.NumeroDDT or '', 'date': DdtDataLine.DataDDT or False, 'invoice_id': invoice_id, 'invoice_line_id': invoice_lineid - }, context=context + } ) # 2.1.9 Delivery = FatturaBody.DatiGenerali.DatiTrasporto if Delivery: - delivery_id = self.getCarrirerPartner( - cr, uid, Delivery, context=context) + delivery_id = self.getCarrirerPartner(Delivery) delivery_dict = { 'carrier_id': delivery_id, 'transport_vehicle': Delivery.MezzoTrasporto or '', @@ -981,6 +930,7 @@ def invoiceCreate( 'transport_date': Delivery.DataInizioTrasporto or False, 'delivery_datetime': Delivery.DataOraConsegna or False, 'delivery_address': '', + 'ftpa_incoterms': Delivery.TipoResa, } if Delivery.IndirizzoResa: @@ -994,16 +944,7 @@ def invoiceCreate( Delivery.IndirizzoResa.Nazione or '' ) ) - if Delivery.TipoResa: - StockModel = self.pool['stock.incoterms'] - stock_incoterm_id = StockModel.search( - cr, uid, [('code', '=', Delivery.TipoResa)], - context=context - ) - if stock_incoterm_id: - delivery_dict['incoterm'] = stock_incoterm_id[0] - invoice_model.write( - cr, uid, invoice_id, delivery_dict, context=context) + invoice.write(delivery_dict) # 2.2.2 Summary_datas = FatturaBody.DatiBeniServizi.DatiRiepilogo if Summary_datas: @@ -1011,7 +952,7 @@ def invoiceCreate( summary_line = { 'tax_rate': summary.AliquotaIVA or 0.0, 'non_taxable_nature': summary.Natura or False, - 'incidental charges': summary.SpeseAccessorie or 0.0, + '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, @@ -1019,8 +960,7 @@ def invoiceCreate( 'law_reference': summary.RiferimentoNormativo or '', 'invoice_id': invoice_id, } - SummaryDatasModel.create( - cr, uid, summary_line, context=context) + SummaryDatasModel.create(summary_line) # 2.1.10 ParentInvoice = FatturaBody.DatiGenerali.FatturaPrincipale @@ -1031,8 +971,7 @@ def invoiceCreate( 'related_invoice_date': ParentInvoice.DataFatturaPrincipale or False } - invoice_model.write( - cr, uid, invoice_id, parentinv_vals, context=context) + invoice.write(parentinv_vals) # 2.3 Vehicle = FatturaBody.DatiVeicoli if Vehicle: @@ -1040,52 +979,40 @@ def invoiceCreate( 'vehicle_registration': Vehicle.Data or False, 'total_travel': Vehicle.TotalePercorso or '', } - invoice_model.write( - cr, uid, invoice_id, veicle_vals, context=context) + invoice.write(veicle_vals) # 2.4 PaymentsData = FatturaBody.DatiPagamento if PaymentsData: for PaymentLine in PaymentsData: cond = PaymentLine.CondizioniPagamento or False if not cond: - raise orm.except_orm( - _('Error!'), + raise UserError( _('Payment method Code not found in document') ) - term_id = False - term_ids = PaymentTermsModel.search( - cr, uid, [('code', '=', cond)], context=context) - if not term_ids: - raise orm.except_orm( - _('Error!'), + terms = PaymentTermsModel.search([('code', '=', cond)]) + if not terms: + raise UserError( _('Payment method Code %s is incorrect') % cond ) else: - term_id = term_ids[0] + term_id = terms[0].id PayDataId = PaymentDataModel.create( - cr, uid, { 'payment_terms': term_id, 'invoice_id': invoice_id - }, - context=context - ) - self._createPayamentsLine( - cr, uid, PayDataId, PaymentLine, partner_id, - context=context - ) + } + ).id + self._createPayamentsLine(PayDataId, PaymentLine, partner_id) # 2.5 AttachmentsData = FatturaBody.Allegati if AttachmentsData: - AttachModel = self.pool['fatturapa.attachments'] + AttachModel = self.env['fatturapa.attachments'] for attach in AttachmentsData: if not attach.NomeAttachment: - raise orm.except_orm( - _('Error!'), - _('Attachment Name is Required') - ) + name = _("Attachment without name") + else: + name = attach.NomeAttachment content = attach.Attachment - name = attach.NomeAttachment _attach_dict = { 'name': name, 'datas': base64.b64encode(str(content)), @@ -1095,50 +1022,22 @@ def invoiceCreate( 'format': attach.FormatoAttachment or '', 'invoice_id': invoice_id, } - AttachModel.create( - cr, uid, _attach_dict, context=context) + AttachModel.create(_attach_dict) self._addGlobalDiscount( - cr, uid, invoice_id, - FatturaBody.DatiGenerali.DatiGeneraliDocumento, context=context) + invoice_id, FatturaBody.DatiGenerali.DatiGeneraliDocumento) # compute the invoice - invoice_model.button_compute( - cr, uid, [invoice_id], context=context, - set_total=True) + invoice.compute_taxes() return invoice_id - def check_CessionarioCommittente( - self, cr, uid, company, FatturaElettronicaHeader, context=None - ): - if ( - company.partner_id.ipa_code != - FatturaElettronicaHeader.DatiTrasmissione.CodiceDestinatario - ): - raise orm.except_orm( - _('Error'), - _('XML IPA code (%s) different from company IPA code (%s)') - % ( - FatturaElettronicaHeader.DatiTrasmissione. - CodiceDestinatario, company.partner_id.ipa_code)) - - def compute_xml_amount_untaxed(self, cr, uid, DatiRiepilogo, context=None): + def compute_xml_amount_untaxed(self, DatiRiepilogo): amount_untaxed = 0.0 for Riepilogo in DatiRiepilogo: amount_untaxed += float(Riepilogo.ImponibileImporto) return amount_untaxed - def check_invoice_amount( - self, cr, uid, invoice, FatturaElettronicaBody, context=None - ): - if context is None: - context = {} - - invoice.write( - { - 'check_total': FatturaElettronicaBody.DatiGenerali. - DatiGeneraliDocumento.ImportoTotaleDocumento - }, context=context) + def check_invoice_amount(self, invoice, FatturaElettronicaBody): if ( FatturaElettronicaBody.DatiGenerali.DatiGeneraliDocumento. ScontoMaggiorazione and @@ -1151,10 +1050,10 @@ def check_invoice_amount( ImportoTotaleDocumento = float( FatturaElettronicaBody.DatiGenerali.DatiGeneraliDocumento. ImportoTotaleDocumento) - if invoice.amount_total != ImportoTotaleDocumento: - if context.get('inconsistencies'): - context['inconsistencies'] += '\n' - context['inconsistencies'] += ( + if not float_is_zero( + invoice.amount_total-ImportoTotaleDocumento, precision_digits=2 + ): + self.log_inconsistency( _('Invoice total %s is different from ' 'ImportoTotaleDocumento %s') % (invoice.amount_total, ImportoTotaleDocumento) @@ -1162,16 +1061,14 @@ def check_invoice_amount( else: # else, we can only check DatiRiepilogo if # DatiGeneraliDocumento.ScontoMaggiorazione is not present, - # because otherwise DatiRiepilogo and openerp invoice total would + # because otherwise DatiRiepilogo and odoo invoice total would # differ amount_untaxed = self.compute_xml_amount_untaxed( - cr, uid, - FatturaElettronicaBody.DatiBeniServizi.DatiRiepilogo, - context=context) - if invoice.amount_untaxed != amount_untaxed: - if context.get('inconsistencies'): - context['inconsistencies'] += '\n' - context['inconsistencies'] += ( + FatturaElettronicaBody.DatiBeniServizi.DatiRiepilogo) + if not float_is_zero( + invoice.amount_untaxed-amount_untaxed, precision_digits=2 + ): + self.log_inconsistency( _('Computed amount untaxed %s is different from' ' DatiRiepilogo %s') % (invoice.amount_untaxed, amount_untaxed) @@ -1200,14 +1097,13 @@ def check_file_is_pem(self, p7m_file): cmd = shlex.split(strcmd) try: proc = subprocess.Popen(cmd, stdout=subprocess.PIPE) - stdoutdata, stderrdata = proc.communicate() + proc.communicate() if proc.wait() != 0: file_is_pem = False except Exception as e: - raise orm.except_orm( - _('Errore'), + raise UserError( _( - 'Check PEM file %s' + 'An error with command "openssl asn1parse" occurred: %s' ) % e.args ) return file_is_pem @@ -1224,15 +1120,13 @@ def parse_pem_2_der(self, pem_file, tmp_der_file): _logger.warning(stdoutdata) raise Exception(stderrdata) except Exception as e: - raise orm.except_orm( - _('Errore'), + raise UserError( _( 'Parsing PEM to DER file %s' ) % e.args ) if not os.path.isfile(tmp_der_file): - raise orm.except_orm( - _('Errore'), + raise UserError( _( 'ASN.1 structure is not parsable in DER' ) @@ -1252,36 +1146,34 @@ def decrypt_to_xml(self, signed_file, xml_file): _logger.warning(stdoutdata) raise Exception(stderrdata) except Exception as e: - raise orm.except_orm( - _('Errore'), + raise UserError( _( 'Signed Xml file %s' ) % e.args ) if not os.path.isfile(xml_file): - raise orm.except_orm( - _('Errore'), + raise UserError( _( 'Signed Xml file not decryptable' ) ) return xml_file - def importFatturaPA(self, cr, uid, ids, context=None): - if not context: - context = {} - context['inconsistencies'] = '' - fatturapa_attachment_obj = self.pool['fatturapa.attachment.in'] - fatturapa_attachment_ids = context.get('active_ids', False) - invoice_model = self.pool['account.invoice'] + @api.multi + def importFatturaPA(self): + fatturapa_attachment_obj = self.env['fatturapa.attachment.in'] + fatturapa_attachment_ids = self.env.context.get('active_ids', False) + invoice_model = self.env['account.invoice'] new_invoices = [] for fatturapa_attachment_id in fatturapa_attachment_ids: - ctx = context.copy() + self.__dict__.update( + self.with_context(inconsistencies='').__dict__ + ) fatturapa_attachment = fatturapa_attachment_obj.browse( - cr, uid, fatturapa_attachment_id, context=ctx) + fatturapa_attachment_id) if fatturapa_attachment.in_invoice_ids: - raise orm.except_orm( - _("Error"), _("File is linked to invoices yet")) + raise UserError( + _("File is linked to invoices yet")) # decrypt p7m file if fatturapa_attachment.datas_fname.lower().endswith('.p7m'): temp_file_name = ( @@ -1312,11 +1204,10 @@ def importFatturaPA(self, cr, uid, ids, context=None): xml_string = fatturapa_attachment.datas.decode('base64') xml_string = self.remove_xades_sign(xml_string) xml_string = self.strip_xml_content(xml_string) - fatt = fatturapa_v_1_1.CreateFromDocument(xml_string) + fatt = fatturapa_v_1_2.CreateFromDocument(xml_string) cedentePrestatore = fatt.FatturaElettronicaHeader.CedentePrestatore # 1.2 - partner_id = self.getCedPrest( - cr, uid, cedentePrestatore, context=ctx) + partner_id = self.getCedPrest(cedentePrestatore) # 1.3 TaxRappresentative = fatt.FatturaElettronicaHeader.\ RappresentanteFiscale @@ -1326,41 +1217,31 @@ def importFatturaPA(self, cr, uid, ids, context=None): # 2 for fattura in fatt.FatturaElettronicaBody: invoice_id = self.invoiceCreate( - cr, uid, fatt, fatturapa_attachment, fattura, - partner_id, context=ctx) + fatt, fatturapa_attachment, fattura, partner_id) + invoice = invoice_model.browse(invoice_id) + self.set_StabileOrganizzazione(cedentePrestatore, invoice) if TaxRappresentative: tax_partner_id = self.getPartnerBase( - cr, uid, TaxRappresentative.DatiAnagrafici, - context=ctx) - invoice_model.write( - cr, uid, invoice_id, + TaxRappresentative.DatiAnagrafici) + invoice.write( { 'tax_representative_id': tax_partner_id - }, context=ctx + } ) if Intermediary: Intermediary_id = self.getPartnerBase( - cr, uid, Intermediary.DatiAnagrafici, context=ctx) - invoice_model.write( - cr, uid, invoice_id, + Intermediary.DatiAnagrafici) + invoice.write( { 'intermediary': Intermediary_id - }, context=ctx + } ) new_invoices.append(invoice_id) - invoice = invoice_model.browse(cr, uid, invoice_id, ctx) - self.check_CessionarioCommittente( - cr, uid, invoice.company_id, fatt.FatturaElettronicaHeader, - context=ctx) - self.check_invoice_amount( - cr, uid, invoice, - fattura, - context=ctx) + self.check_invoice_amount(invoice, fattura) - if ctx.get('inconsistencies'): + if self.env.context.get('inconsistencies'): invoice.write( - {'inconsistencies': ctx['inconsistencies']}, - context=ctx) + {'inconsistencies': self.env.context['inconsistencies']}) return { 'view_type': 'form', @@ -1369,5 +1250,4 @@ def importFatturaPA(self, cr, uid, ids, context=None): 'res_model': 'account.invoice', 'type': 'ir.actions.act_window', 'domain': [('id', 'in', new_invoices)], - 'context': context } diff --git a/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa_view.xml b/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa_view.xml index ad207b533b44..a74d3c3e2f6f 100644 --- a/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa_view.xml +++ b/l10n_it_fatturapa_in/wizard/wizard_import_fatturapa_view.xml @@ -7,15 +7,12 @@ wizard.import.fatturapa
- - - - - -