From f27ec0a6cf1fed417bd5a9fbc0e19d1671de1df5 Mon Sep 17 00:00:00 2001 From: eLBati Date: Mon, 4 Nov 2019 15:30:25 +0100 Subject: [PATCH] REF encode_for_export function moved to l10n_it_account --- l10n_it_account/__init__.py | 1 + l10n_it_account/tools/__init__.py | 1 + l10n_it_account/tools/account_tools.py | 9 ++ .../__manifest__.py | 2 +- .../models/communication.py | 105 +++++++++--------- 5 files changed, 62 insertions(+), 56 deletions(-) create mode 100644 l10n_it_account/tools/__init__.py create mode 100644 l10n_it_account/tools/account_tools.py diff --git a/l10n_it_account/__init__.py b/l10n_it_account/__init__.py index 9906a3d1e0c2..9931b65d8b03 100644 --- a/l10n_it_account/__init__.py +++ b/l10n_it_account/__init__.py @@ -1,6 +1,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from . import models +from . import tools from odoo import api, SUPERUSER_ID diff --git a/l10n_it_account/tools/__init__.py b/l10n_it_account/tools/__init__.py new file mode 100644 index 000000000000..a954d99f2646 --- /dev/null +++ b/l10n_it_account/tools/__init__.py @@ -0,0 +1 @@ +from . import account_tools diff --git a/l10n_it_account/tools/account_tools.py b/l10n_it_account/tools/account_tools.py new file mode 100644 index 000000000000..379ef717f6a8 --- /dev/null +++ b/l10n_it_account/tools/account_tools.py @@ -0,0 +1,9 @@ +import re + +# compiled reg expression for whitespace characters substitution +reg_whitespace = re.compile(r'\s+') + + +def encode_for_export(string_to_encode, max_chars, encoding='latin'): + return reg_whitespace.sub(' ', string_to_encode).encode( + encoding, errors='replace').decode(encoding)[:max_chars] diff --git a/l10n_it_invoices_data_communication/__manifest__.py b/l10n_it_invoices_data_communication/__manifest__.py index 69a0fc38c07e..7b9a237359f1 100644 --- a/l10n_it_invoices_data_communication/__manifest__.py +++ b/l10n_it_invoices_data_communication/__manifest__.py @@ -16,7 +16,7 @@ 'depends': [ 'account', 'l10n_it_fiscal_document_type', 'l10n_it_codici_carica', 'l10n_it_fiscalcode', 'l10n_it_esigibilita_iva', - 'l10n_it_account_tax_kind', + 'l10n_it_account_tax_kind', 'l10n_it_account', 'intrastat_base' ], 'data': [ diff --git a/l10n_it_invoices_data_communication/models/communication.py b/l10n_it_invoices_data_communication/models/communication.py index 2bd96a4118e1..f2c70a295e33 100644 --- a/l10n_it_invoices_data_communication/models/communication.py +++ b/l10n_it_invoices_data_communication/models/communication.py @@ -2,6 +2,7 @@ from odoo import api, fields, models, _ from odoo.exceptions import ValidationError +from odoo.addons.l10n_it_account.tools.account_tools import encode_for_export from lxml import etree import re @@ -41,21 +42,12 @@ def check_normalized_string(value): return normalized -# compiled reg expression for whitespace characters substitution -reg_whitespace = re.compile(r'\s+') - - class ComunicazioneDatiIva(models.Model): _name = 'comunicazione.dati.iva' _description = 'Invoices data communication' _rec_name = 'identificativo' _inherit = ['mail.thread'] - @staticmethod - def encode(string_to_encode, max_chars, encoding='latin'): - return reg_whitespace.sub(' ', string_to_encode).encode( - encoding, errors='replace').decode(encoding)[:max_chars] - @api.model def _default_company(self): company_id = self._context.get( @@ -248,13 +240,14 @@ def _prepare_cedente_partner_id(self, partner, vals=None): # ----- Get fiscalcode vals['cedente_CodiceFiscale'] = \ partner.commercial_partner_id.fiscalcode or '' - vals['cedente_Denominazione'] = self.encode(partner.name, 80) + vals['cedente_Denominazione'] = encode_for_export(partner.name, 80) # Sede vals['cedente_sede_Indirizzo'] = '{} {}'.format( - self.encode(partner.street or '', 60), - self.encode(partner.street2 or '', 60)).strip() - vals['cedente_sede_Cap'] = self.encode(partner.zip or '', 5, encoding='ascii') - vals['cedente_sede_Comune'] = self.encode(partner.city or '', 60) + encode_for_export(partner.street or '', 60), + encode_for_export(partner.street2 or '', 60)).strip() + vals['cedente_sede_Cap'] = encode_for_export( + partner.zip or '', 5, encoding='ascii') + vals['cedente_sede_Comune'] = encode_for_export(partner.city or '', 60) vals['cedente_sede_Provincia'] = partner.state_id and \ partner.state_id.code or '' if partner.country_id: @@ -322,14 +315,14 @@ def _prepare_cessionario_partner_id(self, partner, vals=None): # ----- Get fiscalcode vals['cessionario_CodiceFiscale'] = \ partner.commercial_partner_id.fiscalcode or '' - vals['cessionario_Denominazione'] = self.encode(partner.name or '', 80) + vals['cessionario_Denominazione'] = encode_for_export(partner.name or '', 80) # Sede vals['cessionario_sede_Indirizzo'] = '{} {}'.format( - self.encode(partner.street or '', 60), - self.encode(partner.street2 or '', 60)).strip() + encode_for_export(partner.street or '', 60), + encode_for_export(partner.street2 or '', 60)).strip() vals['cessionario_sede_Cap'] = \ - self.encode(partner.zip or '', 5, encoding='ascii') - vals['cessionario_sede_Comune'] = self.encode(partner.city or '', 60) + encode_for_export(partner.zip or '', 5, encoding='ascii') + vals['cessionario_sede_Comune'] = encode_for_export(partner.city or '', 60) vals['cessionario_sede_Provincia'] = partner.state_id and \ partner.state_id.code or '' if partner.country_id: @@ -1387,19 +1380,19 @@ def _export_xml_get_dte(self): x_2_2_2_altri_identificativi, etree.QName("Denominazione")) x_2_2_2_1_altri_identificativi_denominazione.text = \ - self.encode(partner_invoice.cessionario_Denominazione or '', 80) + encode_for_export(partner_invoice.cessionario_Denominazione or '', 80) # ----- 2.2.2.2 - Nome x_2_2_2_2_nome = etree.SubElement( x_2_2_2_altri_identificativi, etree.QName("Nome")) x_2_2_2_2_nome.text = \ - self.encode(partner_invoice.cessionario_Nome or '', 60) + encode_for_export(partner_invoice.cessionario_Nome or '', 60) # ----- 2.2.2.3 - Cognome x_2_2_2_3_cognome = etree.SubElement( x_2_2_2_altri_identificativi, etree.QName("Cognome")) x_2_2_2_3_cognome.text = \ - self.encode(partner_invoice.cessionario_Cognome or '', 60) + encode_for_export(partner_invoice.cessionario_Cognome or '', 60) # ----- 2.2.2.4 - Sede x_2_2_2_4_sede = etree.SubElement( x_2_2_2_altri_identificativi, @@ -1409,27 +1402,28 @@ def _export_xml_get_dte(self): x_2_2_2_4_sede, etree.QName("Indirizzo")) x_2_2_2_4_1_indirizzo.text = \ - self.encode(partner_invoice.cessionario_sede_Indirizzo or '', 60) + encode_for_export(partner_invoice.cessionario_sede_Indirizzo or '', 60) # ----- 2.2.2.4.2 - Numero Civico x_2_2_2_4_2_numero_civico = etree.SubElement( x_2_2_2_4_sede, etree.QName("NumeroCivico")) x_2_2_2_4_2_numero_civico.text = \ - self.encode(partner_invoice.cessionario_sede_NumeroCivico or '', 8, - encoding='ascii') + encode_for_export( + partner_invoice.cessionario_sede_NumeroCivico or '', 8, + encoding='ascii') # ----- 2.2.2.4.3 - CAP x_2_2_2_4_3_cap = etree.SubElement( x_2_2_2_4_sede, etree.QName("CAP")) x_2_2_2_4_3_cap.text = \ - self.encode(partner_invoice.cessionario_sede_Cap or '', 5, - encoding='ascii') + encode_for_export(partner_invoice.cessionario_sede_Cap or '', 5, + encoding='ascii') # ----- 2.2.2.4.4 - Comune x_2_2_2_4_4_comune = etree.SubElement( x_2_2_2_4_sede, etree.QName("Comune")) x_2_2_2_4_4_comune.text = \ - self.encode(partner_invoice.cessionario_sede_Comune or '', 60) + encode_for_export(partner_invoice.cessionario_sede_Comune or '', 60) # ----- 2.2.2.4.5 - Provincia x_2_2_2_4_5_provincia = etree.SubElement( x_2_2_2_4_sede, @@ -1451,27 +1445,27 @@ def _export_xml_get_dte(self): x_2_2_2_5_stabile_organizzazione, etree.QName("Indirizzo")) x_2_2_2_5_1_indirizzo.text = \ - self.encode(partner_invoice.cessionario_so_Indirizzo or '', 60) + encode_for_export(partner_invoice.cessionario_so_Indirizzo or '', 60) # ----- 2.2.2.5.2 - Numero Civico x_2_2_2_5_2_numero_civico = etree.SubElement( x_2_2_2_5_stabile_organizzazione, etree.QName("NumeroCivico")) x_2_2_2_5_2_numero_civico.text = \ - self.encode(partner_invoice.cessionario_so_NumeroCivico or '', 8, - encoding='ascii') + encode_for_export(partner_invoice.cessionario_so_NumeroCivico or '', 8, + encoding='ascii') # ----- 2.2.2.5.3 - CAP x_2_2_2_5_3_cap = etree.SubElement( x_2_2_2_5_stabile_organizzazione, etree.QName("CAP")) x_2_2_2_5_3_cap.text = \ - self.encode(partner_invoice.cessionario_so_Cap or '', 5, - encoding='ascii') + encode_for_export(partner_invoice.cessionario_so_Cap or '', 5, + encoding='ascii') # ----- 2.2.2.5.4 - Comune x_2_2_2_5_4_comune = etree.SubElement( x_2_2_2_5_stabile_organizzazione, etree.QName("Comune")) x_2_2_2_5_4_comune.text = \ - self.encode(partner_invoice.cessionario_so_Comune or '', 60) + encode_for_export(partner_invoice.cessionario_so_Comune or '', 60) # ----- 2.2.2.5.5 - Provincia x_2_2_2_5_5_provincia = etree.SubElement( x_2_2_2_5_stabile_organizzazione, @@ -1511,19 +1505,20 @@ def _export_xml_get_dte(self): x_2_2_2_6_rappresentante_fiscale, etree.QName("Denominazione")) x_2_2_2_6_2_denominazione.text = \ - self.encode(partner_invoice.cessionario_rf_Denominazione or '', 80) + encode_for_export( + partner_invoice.cessionario_rf_Denominazione or '', 80) # ----- 2.2.2.6.3 - Nome x_2_2_2_6_3_nome = etree.SubElement( x_2_2_2_6_rappresentante_fiscale, etree.QName("Nome")) x_2_2_2_6_3_nome.text = \ - self.encode(partner_invoice.cessionario_rf_Nome or '', 60) + encode_for_export(partner_invoice.cessionario_rf_Nome or '', 60) # ----- 2.2.2.6.4 - Cognome x_2_2_2_6_4_cognome = etree.SubElement( x_2_2_2_6_rappresentante_fiscale, etree.QName("Cognome")) x_2_2_2_6_4_cognome.text = \ - self.encode(partner_invoice.cessionario_rf_Cognome or '', 60) + encode_for_export(partner_invoice.cessionario_rf_Cognome or '', 60) for invoice in partner_invoice.fatture_emesse_body_ids: # ----- 2.2.3 - Dati Fattura Body DTE @@ -1801,19 +1796,19 @@ def _export_xml_get_dtr(self): x_3_2_2_altri_identificativi, etree.QName("Denominazione")) x_3_2_2_1_altri_identificativi_denominazione.text = \ - self.encode(partner_invoice.cedente_Denominazione or '', 80) + encode_for_export(partner_invoice.cedente_Denominazione or '', 80) # ----- 2.2.2.2 - Nome x_3_2_2_2_nome = etree.SubElement( x_3_2_2_altri_identificativi, etree.QName("Nome")) x_3_2_2_2_nome.text = \ - self.encode(partner_invoice.cedente_Nome or '', 60) + encode_for_export(partner_invoice.cedente_Nome or '', 60) # ----- 2.2.2.3 - Cognome x_3_2_2_3_cognome = etree.SubElement( x_3_2_2_altri_identificativi, etree.QName("Cognome")) x_3_2_2_3_cognome.text = \ - self.encode(partner_invoice.cedente_Cognome or '', 60) + encode_for_export(partner_invoice.cedente_Cognome or '', 60) # ----- 2.2.2.4 - Sede x_3_2_2_4_sede = etree.SubElement( x_3_2_2_altri_identificativi, @@ -1823,27 +1818,27 @@ def _export_xml_get_dtr(self): x_3_2_2_4_sede, etree.QName("Indirizzo")) x_3_2_2_4_1_indirizzo.text = \ - self.encode(partner_invoice.cedente_sede_Indirizzo or '', 60) + encode_for_export(partner_invoice.cedente_sede_Indirizzo or '', 60) # ----- 2.2.2.4.2 - Numero Civico x_3_2_2_4_2_numero_civico = etree.SubElement( x_3_2_2_4_sede, etree.QName("NumeroCivico")) x_3_2_2_4_2_numero_civico.text = \ - self.encode(partner_invoice.cedente_sede_NumeroCivico or '', 8, - encoding='ascii') + encode_for_export(partner_invoice.cedente_sede_NumeroCivico or '', 8, + encoding='ascii') # ----- 2.2.2.4.3 - CAP x_3_2_2_4_3_cap = etree.SubElement( x_3_2_2_4_sede, etree.QName("CAP")) x_3_2_2_4_3_cap.text = \ - self.encode(partner_invoice.cedente_sede_Cap or '', 5, - encoding='ascii') + encode_for_export(partner_invoice.cedente_sede_Cap or '', 5, + encoding='ascii') # ----- 2.2.2.4.4 - Comune x_3_2_2_4_4_comune = etree.SubElement( x_3_2_2_4_sede, etree.QName("Comune")) x_3_2_2_4_4_comune.text = \ - self.encode(partner_invoice.cedente_sede_Comune or '', 60) + encode_for_export(partner_invoice.cedente_sede_Comune or '', 60) # ----- 2.2.2.4.5 - Provincia x_3_2_2_4_5_provincia = etree.SubElement( x_3_2_2_4_sede, @@ -1865,27 +1860,27 @@ def _export_xml_get_dtr(self): x_3_2_2_5_stabile_organizzazione, etree.QName("Indirizzo")) x_3_2_2_5_1_indirizzo.text = \ - self.encode(partner_invoice.cedente_so_Indirizzo or '', 60) + encode_for_export(partner_invoice.cedente_so_Indirizzo or '', 60) # ----- 2.2.2.5.2 - Numero Civico x_3_2_2_5_2_numero_civico = etree.SubElement( x_3_2_2_5_stabile_organizzazione, etree.QName("NumeroCivico")) x_3_2_2_5_2_numero_civico.text = \ - self.encode(partner_invoice.cedente_so_NumeroCivico or '', 8, - encoding='ascii') + encode_for_export(partner_invoice.cedente_so_NumeroCivico or '', 8, + encoding='ascii') # ----- 2.2.2.5.3 - CAP x_3_2_2_5_3_cap = etree.SubElement( x_3_2_2_5_stabile_organizzazione, etree.QName("CAP")) x_3_2_2_5_3_cap.text = \ - self.encode(partner_invoice.cedente_so_Cap or '', 5, - encoding='ascii') + encode_for_export(partner_invoice.cedente_so_Cap or '', 5, + encoding='ascii') # ----- 2.2.2.5.4 - Comune x_3_2_2_5_4_comune = etree.SubElement( x_3_2_2_5_stabile_organizzazione, etree.QName("Comune")) x_3_2_2_5_4_comune.text = \ - self.encode(partner_invoice.cedente_so_Comune or '', 60) + encode_for_export(partner_invoice.cedente_so_Comune or '', 60) # ----- 2.2.2.5.5 - Provincia x_3_2_2_5_5_provincia = etree.SubElement( x_3_2_2_5_stabile_organizzazione, @@ -1925,19 +1920,19 @@ def _export_xml_get_dtr(self): x_3_2_2_6_rappresentante_fiscale, etree.QName("Denominazione")) x_3_2_2_6_2_denominazione.text = \ - self.encode(partner_invoice.cedente_rf_Denominazione or '', 80) + encode_for_export(partner_invoice.cedente_rf_Denominazione or '', 80) # ----- 2.2.2.6.3 - Nome x_3_2_2_6_3_nome = etree.SubElement( x_3_2_2_6_rappresentante_fiscale, etree.QName("Nome")) x_3_2_2_6_3_nome.text = \ - self.encode(partner_invoice.cedente_rf_Nome or '', 60) + encode_for_export(partner_invoice.cedente_rf_Nome or '', 60) # ----- 2.2.2.6.4 - Cognome x_3_2_2_6_4_cognome = etree.SubElement( x_3_2_2_6_rappresentante_fiscale, etree.QName("Cognome")) x_3_2_2_6_4_cognome.text = \ - self.encode(partner_invoice.cedente_rf_Cognome or '', 60) + encode_for_export(partner_invoice.cedente_rf_Cognome or '', 60) for invoice in partner_invoice.fatture_ricevute_body_ids: # ----- 2.2.3 - Dati Fattura Body DTE