← Back to team overview

openobject-italia-core-devs team mailing list archive

[Merge] lp:~a-camilli/openobject-italia/7.0-spesometro into lp:openobject-italia/7.0

 

Alessandro Camilli has proposed merging lp:~a-camilli/openobject-italia/7.0-spesometro into lp:openobject-italia/7.0.

Requested reviews:
  OpenERP Italia core devs (openobject-italia-core-devs)

For more details, see:
https://code.launchpad.net/~a-camilli/openobject-italia/7.0-spesometro/+merge/211687

Spesometro v.7 
-- 
https://code.launchpad.net/~a-camilli/openobject-italia/7.0-spesometro/+merge/211687
Your team OpenERP Italia core devs is requested to review the proposed merge of lp:~a-camilli/openobject-italia/7.0-spesometro into lp:openobject-italia/7.0.
=== added directory 'l10n_it_spesometro'
=== added file 'l10n_it_spesometro/__init__.py'
--- l10n_it_spesometro/__init__.py	1970-01-01 00:00:00 +0000
+++ l10n_it_spesometro/__init__.py	2014-03-19 09:57:51 +0000
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#    
+#    Author: Alessandro Camilli (a.camilli@xxxxxxxx)
+#    Copyright (C) 2014
+#    Associazione OpenERP Italia (<http://www.openerp-italia.org>)
+#
+#    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 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 <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+import spesometro
+import wizard
\ No newline at end of file

=== added file 'l10n_it_spesometro/__openerp__.py'
--- l10n_it_spesometro/__openerp__.py	1970-01-01 00:00:00 +0000
+++ l10n_it_spesometro/__openerp__.py	2014-03-19 09:57:51 +0000
@@ -0,0 +1,49 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#    
+#    Author: Alessandro Camilli (a.camilli@xxxxxxxx)
+#    Copyright (C) 2014
+#    Associazione OpenERP Italia (<http://www.openerp-italia.org>)
+#    
+#    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 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 <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+{
+    'name': 'Spesometro - Comunicazione art.21',
+    'version': '0.2',
+    'category': 'Localisation/Italy',
+    'description': """Spesometro - Comunicazione art.21
+
+Functionalities:
+- Creazione comunicazione art.21 in forma Aggregata
+- Export file per agenzia delle entrate
+
+""",
+    'author': 'Alessandro Camilli',
+    'website': 'http://www.openerp-italia.org',
+    'license': 'AGPL-3',
+    "depends" : ['account', 'l10n_it_base'],
+    "data" : [
+              'security/ir.model.access.csv',
+              'spesometro_view.xml',
+              'wizard/wizard_crea_comunicazione_view.xml',
+              'wizard/wizard_default_view.xml',
+              'wizard/wizard_export_view.xml',
+        ],
+    "demo" : [],
+    "active": False,
+    "installable": True
+}
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+

=== added directory 'l10n_it_spesometro/security'
=== added file 'l10n_it_spesometro/security/ir.model.access.csv'
--- l10n_it_spesometro/security/ir.model.access.csv	1970-01-01 00:00:00 +0000
+++ l10n_it_spesometro/security/ir.model.access.csv	2014-03-19 09:57:51 +0000
@@ -0,0 +1,11 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+spesometro_comunicazione_user,spesometro_comunicazione user,model_spesometro_comunicazione,base.group_user,1,0,0,0
+spesometro_comunicazione_manager,spesometro_comunicazione manager,model_spesometro_comunicazione,account.group_account_manager,1,1,1,1
+spesometro_comunicazione_line_fa_user,spesometro_comunicazione_line_fa user,model_spesometro_comunicazione_line_fa,base.group_user,1,0,0,0
+spesometro_comunicazione_line_fa_manager,spesometro_comunicazione_line_fa manager,model_spesometro_comunicazione_line_fa,account.group_account_manager,1,1,1,1
+spesometro_comunicazione_line_bl_user,spesometro_comunicazione_line_bl user,model_spesometro_comunicazione_line_bl,base.group_user,1,0,0,0
+spesometro_comunicazione_line_bl_manager,spesometro_comunicazione_line_bl manager,model_spesometro_comunicazione_line_bl,account.group_account_manager,1,1,1,1
+spesometro_comunicazione_line_sa_user,spesometro_comunicazione_line_sa user,model_spesometro_comunicazione_line_sa,base.group_user,1,0,0,0
+spesometro_comunicazione_line_sa_manager,spesometro_comunicazione_line_sa manager,model_spesometro_comunicazione_line_sa,account.group_account_manager,1,1,1,1
+spesometro_configurazione_user,spesometro_configurazione user,model_spesometro_configurazione,base.group_user,1,0,0,0
+spesometro_configurazione_manager,spesometro_configurazione manager,model_spesometro_configurazione,account.group_account_manager,1,1,1,1
\ No newline at end of file

=== added file 'l10n_it_spesometro/spesometro.py'
--- l10n_it_spesometro/spesometro.py	1970-01-01 00:00:00 +0000
+++ l10n_it_spesometro/spesometro.py	2014-03-19 09:57:51 +0000
@@ -0,0 +1,1276 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#    
+#    Author: Alessandro Camilli (a.camilli@xxxxxxxx)
+#    Copyright (C) 2014
+#    Associazione OpenERP Italia (<http://www.openerp-italia.org>)
+#
+#    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 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 <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+from osv import fields, orm
+from openerp.tools.translate import _
+import decimal_precision as dp 
+import datetime, time
+
+class res_country(orm.Model):
+    _inherit = "res.country"
+    _columns =  {
+        'codice_stato_agenzia_entrate': fields.char('Codice stato Agenzia Entrate', size=3)
+    }
+
+class account_journal(orm.Model): 
+    _inherit = "account.journal"
+    _columns =  {
+        'spesometro': fields.boolean('Da includere'),
+        'spesometro_operazione': fields.selection((('FA','Operazioni documentate da fattura'), 
+                                  ('SA','Operazioni senza fattura'),
+                                  ('BL1','Operazioni con paesi con fiscalità privilegiata'),
+                                  ('BL2','Operazioni con soggetti non residenti'),
+                                  ('BL3','Acquisti di servizi da soggetti non residenti'),
+                                  ('DR','Documento Riepilogativo')),
+                   'Operazione' ),
+        'spesometro_segno': fields.selection((('attiva','Attiva'), 
+                                  ('passiva','Passiva')),
+                   'Segno operaz.' ),
+        'spesometro_IVA_non_esposta': fields.boolean('IVA non esposta')
+    }
+
+class res_partner(orm.Model):
+    _inherit = "res.partner"
+    _columns =  {
+        'spesometro_escludi': fields.boolean('Escludi'),
+        'spesometro_operazione': fields.selection((('FA','Operazioni documentate da fattura'), 
+                                  ('SA','Operazioni senza fattura'),
+                                  ('BL1','Operazioni con paesi con fiscalità privilegiata'),
+                                  ('BL2','Operazioni con soggetti non residenti'),
+                                  ('BL3','Acquisti di servizi da soggetti non residenti'),
+                                  ('DR','Documento Riepilogativo')),
+                   'Operazione' ),
+        'spesometro_IVA_non_esposta': fields.boolean('IVA non esposta'),
+        'spesometro_leasing': fields.selection((('A','Autovettura'), 
+                                  ('B','Caravan'),
+                                  ('C','Altri veicoli'),
+                                  ('D','Unità da diporto'),
+                                  ('E','Aeromobili')),
+                   'Tipo Leasing' ),
+        'spesometro_tipo_servizio': fields.selection((('cessione','Cessione Beni'), 
+                                  ('servizi','Prestazione di servizi')),
+                    'Tipo servizio', help="Specificare per 'Operazioni con paesi con fiscalità privilegiata' "),
+    }
+    
+    _defaults = {
+        'spesometro_escludi' : False,
+    }
+
+class spesometro_configurazione(orm.Model):
+    
+    def _check_one_year(self, cr, uid, ids, context=None):
+        for element in self.browse(cr, uid, ids, context=context):
+            element_ids = self.search(cr, uid, [('anno','=', element.anno)], context=context)
+            if len(element_ids) > 1:
+                return False
+        return True
+    
+    _name = "spesometro.configurazione"
+    _description = "Spesometro - Configurazione"
+    _columns = {
+        'anno': fields.integer('Anno', size=4, required=True ),
+        'stato_san_marino': fields.many2one('res.country', 'Stato San Marino', required=True),
+        'quadro_fa_limite_importo': fields.float('Quadro FA - Limite importo'),
+        'quadro_fa_limite_importo_line': fields.float('Quadro FA - Limite importo singola operaz.'),
+        'quadro_sa_limite_importo': fields.float('Quadro SA - Limite importo'),
+        'quadro_sa_limite_importo_line': fields.float('Quadro SA - Limite importo singola operaz.'),
+        'quadro_bl_limite_importo': fields.float('Quadro BL - Limite importo'),
+        'quadro_bl_limite_importo_line': fields.float('Quadro BL - Limite importo singola operaz.'),
+        'quadro_se_limite_importo_line': fields.float('Quadro SE - Limite importo singola operaz.'),
+        }
+    _constraints = [
+        (_check_one_year, 'Error! Config for this year already exists.', ['anno']),
+    ]
+
+class spesometro_comunicazione(orm.Model):
+    
+    _name = "spesometro.comunicazione"
+    _description = "Spesometro - Comunicazione "
+    
+    def _tot_operation_number(self, cr, uid, ids, field_names, args, context=None):
+        res = {}
+        for com in self.browse(cr, uid, ids):
+            # Aggregate
+            tot_FA = len(com.line_FA_ids)
+            tot_SA = len(com.line_SA_ids)
+            tot_BL1 = 0
+            tot_BL2 = 0
+            tot_BL3 = 0
+            for line in com.line_BL_ids:
+                if line.operazione_fiscalita_privilegiata:
+                    tot_BL1 += 1
+                elif line.operazione_con_soggetti_non_residenti:
+                    tot_BL2 += 1
+                elif line.Acquisto_servizi_da_soggetti_non_residenti:
+                    tot_BL3 += 1
+            #Analitiche
+            tot_FE = 0 # Fatture emesse
+            tot_FE_R = 0 # Doc riepilogativi
+            for line in com.line_FE_ids:
+                if line.documento_riepilogativo:
+                    tot_FE_R += 1
+                else:
+                    tot_FE += 1
+            tot_FR = 0 # Fatture ricevute
+            tot_FR_R = 0 # Doc riepilogativi ricevuti
+            for line in com.line_FR_ids:
+                if line.documento_riepilogativo:
+                    tot_FR_R += 1
+                else:
+                    tot_FR += 1
+            tot_NE = len(com.line_NE_ids)
+            tot_NR = len(com.line_NR_ids)
+            tot_DF = len(com.line_DF_ids)
+            tot_FN = len(com.line_FN_ids)
+            tot_SE = len(com.line_SE_ids)
+            tot_TU = len(com.line_TU_ids)
+            
+            res[com.id] = {
+                    'totale_FA' : tot_FA,
+                    'totale_SA' : tot_SA,
+                    'totale_BL1' : tot_BL1,
+                    'totale_BL2' : tot_BL2,
+                    'totale_BL3' : tot_BL3,
+                    'totale_FE' : tot_FE,
+                    'totale_FE_R' : tot_FE_R,
+                    'totale_FR' : tot_FR,
+                    'totale_FR_r' : tot_FR_R,
+                    'totale_NE' : tot_NE,
+                    'totale_NR' : tot_NR,
+                    'totale_DF' : tot_DF,
+                    'totale_FN' : tot_FN,
+                    'totale_SE' : tot_SE,
+                    'totale_TU' : tot_TU,
+                    }
+        return res
+    
+    _columns = {
+        'company_id': fields.many2one('res.company', 'Azienda', required=True ),
+        'periodo': fields.selection((('anno','Annuale'), ('trimestre','Trimestrale'), ('mese','Mensile')),
+                   'Periodo', required=True),
+        'anno' : fields.integer('Anno', size=4, required=True),
+        'trimestre' : fields.integer('Trimestre', size=1 ),
+        'mese' : fields.selection((('1','Gennaio'), ('2','Febbraio'), ('3','Marzo'), ('4','Aprile'),
+                                   ('5','Maggio'), ('6','Giugno'), ('7','Luglio'), ('8','Agosto'),
+                                   ('9','Settembre'), ('10','Ottobre'), ('11','Novembre'), ('12','Dicembre'),
+                                   ),'Mese'),
+        'tipo': fields.selection((('ordinaria','Ordinaria'), ('sostitutiva','Sostitutiva'), ('annullamento','Annullamento')),
+                   'Tipo comunicazione', required=True),
+        'comunicazione_da_sostituire_annullare': fields.integer('Protocollo comunicaz. da sostituire/annullare'),
+        'documento_da_sostituire_annullare': fields.integer('Protocollo documento da sostituire/annullare'),
+        
+        'formato_dati': fields.selection((('aggregati','Dati Aggregati'), ('analitici','Dati Analitici')),
+                   'Formato dati', readonly=True ),
+                
+        'codice_fornitura': fields.char('Codice fornitura', readonly=True, size=5, help='Impostare a "NSP00" '),
+        'tipo_fornitore': fields.selection((('01','Invio propria comunicazione'), ('10','Intermediario')),
+                   'Tipo fornitore' ),
+        'codice_fiscale_fornitore': fields.char('Codice fiscale Fornitore', size=16, 
+                    help="Deve essere uguale al Codice fiscale dell'intermediario (campo 52 del record B) se presente, altrimenti al Codice fiscale del soggetto tenuto alla comunicazione (campo 41 del record B) se presente, altrimenti al Codice fiscale del soggetto obbligato (campo 2 del record B)"),
+        #
+        # Valori per comunicazione su più invii (non gestito)
+        'progressivo_telematico': fields.integer('Progressivo telematico', readonly=True),
+        'numero_totale_invii': fields.integer('Numero totale invii telematici', readonly=True),
+        #
+        # Soggetto a cui si riferisce la comunicazione
+        #
+        'soggetto_codice_fiscale': fields.char('Codice fiscale soggetto obbligato', size=16, 
+                    help="Soggetto cui si riferisce la comunicazione"),
+        'soggetto_partitaIVA': fields.char('Partita IVA', size=11),
+        'soggetto_codice_attivita': fields.char('Codice attività', size=6, help="Codice ATECO 2007"),
+        'soggetto_telefono': fields.char('Telefono', size=12),
+        'soggetto_fax': fields.char('Fax', size=12),
+        'soggetto_email': fields.char('E-mail', size=50),
+        'soggetto_forma_giuridica': fields.selection((('persona_giuridica','Persona Giuridica'), ('persona_fisica','Persona Fisica')),
+                   'Forma Giuridica'),
+        
+        'soggetto_pf_cognome': fields.char('Cognome', size=24, help=""),
+        'soggetto_pf_nome': fields.char('Nome', size=20, help=""),
+        'soggetto_pf_sesso': fields.selection((('M','M'), ('F','F')),'Sesso'),
+        'soggetto_pf_data_nascita': fields.date('Data di nascita'),
+        'soggetto_pf_comune_nascita': fields.char('Comune o stato estero di nascita', size=40),
+        'soggetto_pf_provincia_nascita': fields.char('Provincia', size=2),
+        'soggetto_pg_denominazione': fields.char('Denominazione', size=60),
+        
+        # Soggetto tenuto alla comunicazione
+        'soggetto_cm_forma_giuridica': fields.selection((('persona_giuridica','Persona Giuridica'), ('persona_fisica','Persona Fisica')),
+                   'Forma Giuridica'),
+        'soggetto_cm_codice_fiscale': fields.char('Codice Fiscale', size=16, help="Soggetto che effettua la comunicazione se diverso dal soggetto tenuto alla comunicazione"),
+        'soggetto_cm_pf_cognome': fields.char('Cognome', size=24, help=""),
+        'soggetto_cm_pf_nome': fields.char('Nome', size=20, help=""),
+        'soggetto_cm_pf_sesso': fields.selection((('M','M'), ('F','F')),'Sesso'),
+        'soggetto_cm_pf_data_nascita': fields.date('Data di nascita'),
+        'soggetto_cm_pf_comune_nascita': fields.char('Comune o stato estero di nascita', size=40),
+        'soggetto_cm_pf_provincia_nascita': fields.char('Provincia', size=2),
+        'soggetto_cm_pf_codice_carica': fields.integer('Codice Fiscale', size=2, help=""),
+        'soggetto_cm_pf_data_inizio_procedura': fields.date('Data inizio procedura'),
+        'soggetto_cm_pf_data_fine_procedura': fields.date('Data fine procedura'),
+        'soggetto_cm_pg_denominazione': fields.char('Denominazione', size=60),
+        
+        # Soggetto incaricato alla trasmissione
+        'soggetto_trasmissione_codice_fiscale': fields.char('Codice Fiscale', size=16, help="Intermediario che effettua la trasmissione telematica"),
+        'soggetto_trasmissione_numero_CAF': fields.integer('Nr iscrizione albo del C.A.F.', size=5, help="Intermediario che effettua la trasmissione telematica"),
+        'soggetto_trasmissione_impegno': fields.selection((('1','Soggetto obbligato'), ('2','Intermediario')),'Impegno trasmissione'),
+        'soggetto_trasmissione_data_impegno': fields.date('Data data impegno'),
+        
+        'line_FA_ids': fields.one2many('spesometro.comunicazione.line.fa', 'comunicazione_id', 'Quadri FA' ),
+        'line_SA_ids': fields.one2many('spesometro.comunicazione.line.sa', 'comunicazione_id', 'Quadri SA' ),
+        'line_BL_ids': fields.one2many('spesometro.comunicazione.line.bl', 'comunicazione_id', 'Quadri BL' ),
+        
+        'line_FE_ids': fields.one2many('spesometro.comunicazione.line.fe', 'comunicazione_id', 'Quadri FE' ),
+        'line_FR_ids': fields.one2many('spesometro.comunicazione.line.fr', 'comunicazione_id', 'Quadri FR' ),
+        'line_NE_ids': fields.one2many('spesometro.comunicazione.line.ne', 'comunicazione_id', 'Quadri NE' ),
+        'line_NR_ids': fields.one2many('spesometro.comunicazione.line.nr', 'comunicazione_id', 'Quadri NR' ),
+        'line_DF_ids': fields.one2many('spesometro.comunicazione.line.df', 'comunicazione_id', 'Quadri DF' ),
+        'line_FN_ids': fields.one2many('spesometro.comunicazione.line.fn', 'comunicazione_id', 'Quadri FN' ),
+        'line_SE_ids': fields.one2many('spesometro.comunicazione.line.se', 'comunicazione_id', 'Quadri SE' ),
+        'line_TU_ids': fields.one2many('spesometro.comunicazione.line.tu', 'comunicazione_id', 'Quadri TU' ),
+        
+        'totale_FA': fields.function(_tot_operation_number, string='Tot operazioni FA', type='integer', multi='operation_number', store=True),
+        'totale_SA': fields.function(_tot_operation_number, string='Tot operazioni SA', type='integer', multi='operation_number', store=True),
+        'totale_BL1': fields.function(_tot_operation_number, string='Tot operazioni BL - Paesi con fiscalita privilegiata', type='integer', multi='operation_number', store=True),
+        'totale_BL2': fields.function(_tot_operation_number, string='Tot operazioni BL - Soggetti non residenti', type='integer', multi='operation_number', store=True),
+        'totale_BL3': fields.function(_tot_operation_number, string='Tot operazioni BL - Acquisti servizi non soggetti non residenti', type='integer', multi='operation_number', store=True),
+        
+        'totale_FE': fields.function(_tot_operation_number, string='Tot operazioni FE', type='integer', multi='operation_number', store=True),
+        'totale_FE_R': fields.function(_tot_operation_number, string='Tot operazioni FE doc riepil.', type='integer', multi='operation_number', store=True),
+        'totale_FR': fields.function(_tot_operation_number, string='Tot operazioni FR', type='integer', multi='operation_number', store=True),
+        'totale_FR_R': fields.function(_tot_operation_number, string='Tot operazioni FR doc riepil.', type='integer', multi='operation_number', store=True),
+        'totale_NE': fields.function(_tot_operation_number, string='Tot operazioni NE', type='integer', multi='operation_number', store=True),
+        'totale_NR': fields.function(_tot_operation_number, string='Tot operazioni NR', type='integer', multi='operation_number', store=True),
+        'totale_DF': fields.function(_tot_operation_number, string='Tot operazioni DF', type='integer', multi='operation_number', store=True),
+        'totale_FN': fields.function(_tot_operation_number, string='Tot operazioni FN', type='integer', multi='operation_number', store=True),
+        'totale_SE': fields.function(_tot_operation_number, string='Tot operazioni SE', type='integer', multi='operation_number', store=True),
+        'totale_TU': fields.function(_tot_operation_number, string='Tot operazioni TU', type='integer', multi='operation_number', store=True),
+    }
+    
+    _default ={
+        'codice_fornitura': 'NSP00',
+        'tipo_fornitore': '01',
+        'formato_dati': 'aggregati',
+    }
+    
+    def onchange_trasmissione_impegno(self, cr, uid, ids, type, context=None):
+        res = {}
+        fiscalcode = False
+        if type == '1': # soggetto obbligato
+            fiscalcode = context.get('soggetto_codice_fiscale', False)
+        res = {
+               'value' : {'soggetto_trasmissione_codice_fiscale' : fiscalcode}
+               }
+        return res
+    
+    def partner_is_from_san_marino(self, cr, uid, move, invoice, arg):
+        # configurazione
+        anno_competenza = datetime.datetime.strptime(move.period_id.date_start, "%Y-%m-%d").year
+        configurazione_ids = self.pool.get('spesometro.configurazione').search(cr, uid, \
+                                                       [('anno', '=', anno_competenza)])
+        if not configurazione_ids:
+            raise orm.except_orm(_('Configurazione mancante!'),_("Configurare l'anno relativo alla comunicazione") )
+        configurazione = self.pool.get('spesometro.configurazione').browse(cr, uid, configurazione_ids[0])
+        stato_estero = False
+        address = self._get_partner_address_obj(cr, uid, move, invoice, arg)
+        if address and address.country_id and configurazione.stato_san_marino.id == address.country_id.id:
+            return True
+        else:
+            return False
+    
+    def _get_partner_address_obj(self, cr, uid, move, invoice, arg):
+        address = False
+        partner_address_obj = False
+        if move.partner_id.parent_id:
+            partner_address_obj = move.partner_id.parent_id 
+        else:
+            partner_address_obj = move.partner_id
+        return partner_address_obj
+    
+    def compute_invoice_amounts(self, cr, uid, move, invoice, arg):
+        '''
+        Calcolo totali documento. Dall'imponibile vanno esclusi gli importi esclusi, fuori campo o esenti
+        '''
+        res ={
+              'amount_untaxed' : 0,
+              'amount_tax' : 0,
+              'amount_total' : 0,
+              }
+        for line in invoice.tax_line:
+            if line.amount:
+                res['amount_untaxed'] += line.base
+                res['amount_tax'] += line.amount
+                res['amount_total'] += round(line.base + line.amount, 2)
+        return res
+            
+    def truncate_values(self, cr, uid, ids, context=None):
+        for com in self.browse(cr, uid, ids):
+            for line in com.line_FA_ids:
+                vals = {
+                    'attive_imponibile_non_esente': int(line.attive_imponibile_non_esente),
+                    'attive_imposta': int(line.attive_imposta),
+                    'attive_operazioni_iva_non_esposta': int(line.attive_operazioni_iva_non_esposta),
+                    'attive_note_variazione': int(line.attive_note_variazione),
+                    'attive_note_variazione_imposta': int(line.attive_note_variazione_imposta),
+                
+                    'passive_imponibile_non_esente': int(line.passive_imponibile_non_esente),
+                    'passive_imposta': int(line.passive_imposta),
+                    'passive_operazioni_iva_non_esposta': int(line.passive_operazioni_iva_non_esposta),
+                    'passive_note_variazione': int(line.passive_note_variazione),
+                    'passive_note_variazione_imposta': int(line.passive_note_variazione_imposta), 
+                    }
+                self.pool.get('spesometro.comunicazione.line.fa').write(cr, uid, [line.id], vals)
+                
+            for line in com.line_SA_ids:
+                vals = {
+                    'importo_complessivo': int(line.importo_complessivo),
+                    }
+                self.pool.get('spesometro.comunicazione.line.sa').write(cr, uid, [line.id], vals)
+                
+            for line in com.line_BL_ids:
+                vals = {
+                    'attive_importo_complessivo': int(line.attive_importo_complessivo),
+                    'attive_imposta': int(line.attive_imposta),
+                    'attive_non_sogg_cessione_beni': int(line.attive_non_sogg_cessione_beni),
+                    'attive_non_sogg_servizi': int(line.attive_non_sogg_servizi),
+                    'attive_note_variazione': int(line.attive_note_variazione),
+                    'attive_note_variazione_imposta': int(line.attive_note_variazione_imposta),
+                
+                    'passive_importo_complessivo': int(line.passive_importo_complessivo),
+                    'passive_imposta': int(line.passive_imposta),
+                    'passive_non_sogg_importo_complessivo': int(line.passive_non_sogg_importo_complessivo),
+                    'passive_note_variazione': int(line.passive_note_variazione),
+                    'passive_note_variazione_imposta': int(line.passive_note_variazione_imposta), 
+                    }
+                self.pool.get('spesometro.comunicazione.line.bl').write(cr, uid, [line.id], vals)
+                
+        return True
+    
+    def validate_lines(self, cr, uid, ids, context=None):
+        for com in self.browse(cr, uid, ids):
+            
+            # configurazione
+            configurazione_ids = self.pool.get('spesometro.configurazione').search(cr, uid, \
+                                                            [('anno', '=', com.anno)])
+            if not configurazione_ids:
+                raise orm.except_orm(_('Configurazione mancante!'),_("Configurare l'anno relativo alla comunicazione") )
+            configurazione = self.pool.get('spesometro.configurazione').browse(cr, uid, configurazione_ids[0])
+            
+            for line in com.line_FA_ids:
+                if configurazione.quadro_fa_limite_importo :
+                    if line.attive_imponibile_non_esente and \
+                        line.attive_imponibile_non_esente < configurazione.quadro_fa_limite_importo:
+                        self.pool.get('spesometro.comunicazione.line.fa').unlink(cr, uid, [line.id])    
+            
+            for line in com.line_SA_ids:
+                if configurazione.quadro_sa_limite_importo :
+                    if line.importo_complessivo and \
+                        line.importo_complessivo < configurazione.quadro_sa_limite_importo:            
+                        self.pool.get('spesometro.comunicazione.line.sa').unlink(cr, uid, [line.id])
+            
+            for line in com.line_BL_ids:
+                if configurazione.quadro_bl_limite_importo :
+                    importo_test = 0
+                    if line.attive_importo_complessivo :
+                        importo_test = line.attive_importo_complessivo
+                    elif line.attive_non_sogg_cessione_beni :
+                        importo_test = line.attive_non_sogg_cessione_beni
+                    elif line.attive_non_sogg_servizi :
+                        importo_test = line.attive_non_sogg_servizi
+                    
+                    if importo_test and \
+                        importo_test < configurazione.quadro_bl_limite_importo:            
+                        self.pool.get('spesometro.comunicazione.line.bl').unlink(cr, uid, [line.id])
+            
+            # Controllo formale comunicazione
+            # ... periodo in presenza di linee nel quadro SE
+            if com.line_SE_ids and not com.trimestre and not com.mese:
+                raise orm.except_orm(_('Perido Errato!'),_("In presenza di operazione nel qudro SE (Acquisti da San Marino) \
+                        sono ammessi solo periodi mensili/trimestrali") )
+        
+        return True
+    
+    def validate_operation(self, cr, uid, move, invoice, arg):
+            # configurazione
+            anno_competenza = datetime.datetime.strptime(move.period_id.date_start, "%Y-%m-%d").year
+            configurazione_ids = self.pool.get('spesometro.configurazione').search(cr, uid, \
+                                                           [('anno', '=', anno_competenza)])
+            if not configurazione_ids:
+                raise orm.except_orm(_('Configurazione mancante!'),_("Configurare l'anno relativo alla comunicazione") )
+            configurazione = self.pool.get('spesometro.configurazione').browse(cr, uid, configurazione_ids[0])
+            
+            doc_vals = self.pool.get('spesometro.comunicazione').compute_invoice_amounts(cr, uid, move, invoice, arg)
+            # Nessu quadro definito
+            if not arg['quadro']:
+                return False
+            # Quadro richiesto
+            if arg['quadro'] not in arg['quadri_richiesti']:
+                return False
+            # Valori minimi
+            if arg['quadro'] == 'FA':
+                if configurazione.quadro_fa_limite_importo_line :
+                    if not doc_vals.get('amount_untaxed', 0) or doc_vals.get('amount_untaxed', 0) < configurazione.quadro_fa_limite_importo_line:  
+                        return False
+            if arg['quadro'] == 'SA':
+                if configurazione.quadro_sa_limite_importo_line :
+                    if not doc_vals.get('amount_total', 0) or doc_vals.get('amount_total', 0) < configurazione.quadro_sa_limite_importo_line:  
+                        return False
+            if arg['quadro'] == 'BL':
+                if configurazione.quadro_bl_limite_importo_line :
+                    if not doc_vals.get('amount_total', 0) or doc_vals.get('amount_total', 0) < configurazione.quadro_bl_limite_importo_line: 
+                        return False
+            
+            if arg['quadro'] == 'SE':
+                if configurazione.quadro_se_limite_importo_line :
+                    if not doc_vals.get('amount_untaxed', 0) or doc_vals.get('amount_untaxed', 0) < configurazione.quadro_se_limite_importo_line: 
+                        return False
+            
+            # Operazioni con San Marino Escluse se richiesta forma aggregata
+            if arg['formato_dati'] == 'aggregati' and self.partner_is_from_san_marino(cr, uid, move, invoice, arg):
+                return False
+            
+            return True
+    
+    def get_define_quadro(self, cr, uid, move, invoice, arg):
+        
+        quadro = False
+        operazione = arg.get('operazione')
+        # Forma aggregata
+        if arg['formato_dati'] == 'aggregati':
+            if operazione == 'FA' or operazione == 'DR':
+                quadro = 'FA'
+            elif operazione == 'SA': # Operazioni senza fattura
+                quadro = 'SA'
+            elif (operazione == 'BL1') or (operazione == 'BL2') or (operazione == 'BL2'):
+                quadro = 'BL'
+        
+        # Forma analitica
+        if arg['formato_dati'] == 'analitici':
+            
+            # Priorità x San Marino -> quadro SE
+            if self.partner_is_from_san_marino(cr, uid, move, invoice, arg):
+                operazione = 'BL3'
+            
+            # Impostazioni anagrafiche partner
+            if operazione == 'FA' or operazione == 'DR':
+                if arg.get('segno') == 'attiva':
+                    quadro = 'FE'
+                elif arg.get('segno') == 'passiva':
+                    quadro = 'FR'
+            elif operazione == 'SA': # Operazioni senza fattura
+                quadro = 'DF'
+            elif operazione == 'BL2': #Operazioni con soggetti non residenti
+                quadro = 'FN'
+            elif operazione == 'BL1' or operazione == 'BL3': #Operazioni con paesi con fiscalità privilegiata - Acquisti di servizi da soggetti non residenti
+                quadro = 'SE'
+            # Note di variazione
+            if operazione == 'FE' and 'refund' in move.journal_id.type:
+                operazione = 'NE'
+            elif operazione == 'FR' and 'refund' in move.journal_id.type:
+                operazione = 'NR'
+        
+        return quadro
+    
+    
+    def genera_comunicazione(self, cr, uid, params, context=None):
+        
+        def _get_periods(cr, uid, params, context=None):
+            '''
+            Definizione periodi di competenza
+            '''
+            sql_select = "SELECT p.id FROM account_period p "
+            sql_where = " WHERE p.special = False "
+            search_params = {}
+            # Periodo annuale
+            if params.get('periodo') == 'anno':
+                period_date_start = datetime.date(params.get('anno') , 1, 1)
+                period_date_stop = datetime.date(params.get('anno') , 12, 31)
+                sql_where += " AND p.date_start >= date(%(period_date_start)s) AND p.date_stop <=date(%(period_date_stop)s) "
+                search_params.update({
+                        'period_date_start' : period_date_start,
+                        'period_date_stop' : period_date_stop
+                         })
+            # Periodo mensile
+            if params.get('periodo') == 'mese':
+                period_date_start = datetime.date(params.get('anno') , int(params.get('mese')), 1)
+                sql_where += " AND p.date_start = date(%(period_date_start)s) "
+                search_params.update({
+                        'period_date_start' : period_date_start,
+                         })
+            # Periodo trimestrale
+            if params.get('periodo') == 'trimestre':
+                if params.get('trimestre') == 1:
+                    period_date_start = datetime.date(params.get('anno') , 1, 1)
+                    period_date_start = datetime.date(params.get('anno') , 3, 31)
+                elif params.get('trimestre') == 2:
+                    period_date_start = datetime.date(params.get('anno') , 3, 1)
+                    period_date_start = datetime.date(params.get('anno') , 6, 30)
+                elif params.get('trimestre') == 2:
+                    period_date_start = datetime.date(params.get('anno') , 7, 1)
+                    period_date_start = datetime.date(params.get('anno') , 9, 30)
+                elif params.get('trimestre') == 2:
+                    period_date_start = datetime.date(params.get('anno') , 10, 1)
+                    period_date_start = datetime.date(params.get('anno') , 12, 31)
+                else:
+                    raise orm.except_orm(_('Dato errato!'),_("Errore nel valore del trimestre") )
+                sql_where += " AND p.date_start >= date(%(period_date_start)s) AND p.date_stop <=date(%(period_date_stop)s) "
+                search_params.update({
+                        'period_date_start' : period_date_start,
+                        'period_date_stop' : period_date_stop
+                         })
+                
+            sql = sql_select + sql_where
+            cr.execute(sql, search_params)
+            periods =  [i[0] for i in cr.fetchall()]
+            return periods
+            
+        def _genera_testata(cr, uid, params, context=None):
+            '''
+            Generazione testata dichiarazione
+            '''
+            company = self.pool.get('res.company').browse(cr, uid, params['company_id'])
+            # progressivo telematico :" il progressivo deve essere univoco e crescente (con incrementi di una unità per ogni file prodotto)"
+            if params['tipo'] == 'ordinaria':
+                com_search = [('tipo', '=', 'ordinaria')]
+                com_last_ids = self.search(cr, uid, com_search, order='progressivo_telematico desc', limit=1)
+                com_next_prg = 1
+                if com_last_ids:
+                    com_next_prg = self.browse(cr, uid, com_last_ids[0]).progressivo_telematico + 1
+            progressivo_telematico = com_next_prg
+            # vat
+            if company.partner_id.vat:
+                partita_iva = company.partner_id.vat[2:]
+            else:
+                partita_iva = '{:11s}'.format("".zfill(11))
+            # codice fiscale soggetto incaricato alla trasmissione
+            codice_fiscale_incaricato_trasmissione=''
+            if  params.get('tipo_fornitore') == '10' and params.get('partner_intermediario', False):
+                partner_intermediario = self.pool.get('res.partner').browse(cr, uid, params.get('partner_intermediario'))
+                codice_fiscale_incaricato_trasmissione = partner_intermediario.fiscalcode or False
+            # Soggetto con impegno alla trasmissione
+            if  params.get('tipo_fornitore') == '10':
+                soggetto_trasmissione_impegno = '2'
+            else:
+                soggetto_trasmissione_impegno = '1'
+            # Persona fisica o giuridica
+            # Considerazione: se se lunghezza codice fiscale < 16 allora c'è la P.Iva e quindi trattasi di soggetto giuridico
+            tipo_persona = 'persona_fisica'
+            if company.partner_id.fiscalcode and len(company.partner_id.fiscalcode) < 16:
+                tipo_persona = 'persona_giuridica'
+                
+            values = {
+                      'company_id' : company.id,
+                      'codice_fiscale_fornitore' : company.partner_id.fiscalcode,
+                      'tipo' : params.get('tipo', False),
+                      'periodo' : params.get('periodo', False),
+                      'anno' : params.get('anno', False),
+                      'mese' : params.get('mese', False),
+                      'trimestre' : params.get('trimestre', False),
+                      'progressivo_telematico' : progressivo_telematico or False,
+                      'tipo_fornitore' : params.get('tipo_fornitore', False),
+                      'formato_dati' : params.get('formato_dati', False),
+                      'soggetto_codice_fiscale' : company.partner_id and company.partner_id.fiscalcode or '',  
+                      'soggetto_partitaIVA' : partita_iva,
+                      'soggetto_telefono' : company.partner_id and company.partner_id.phone or '',  
+                      'soggetto_fax' : company.partner_id and company.partner_id.fax or '',  
+                      'soggetto_email' : company.partner_id and company.partner_id.email or '',
+                      'soggetto_forma_giuridica' : tipo_persona,  
+                      'soggetto_pg_denominazione' : company.partner_id and company.partner_id.name or company.name or '',
+                      'soggetto_cm_forma_giuridica' : tipo_persona,  
+                      'soggetto_cm_pg_denominazione' : company.partner_id and company.partner_id.name or company.name or '',
+                      'soggetto_trasmissione_codice_fiscale' : codice_fiscale_incaricato_trasmissione,  
+                      'soggetto_trasmissione_impegno' : soggetto_trasmissione_impegno,  
+                      }
+            comunicazione_id = self.create(cr, uid, values)
+            
+            return comunicazione_id
+        
+        
+        # Esistenza record di configurazione per l'anno della comunicazione
+        configurazione_ids = self.pool.get('spesometro.configurazione').search(cr, uid, [('anno', '=', params.get('anno'))])
+        if not configurazione_ids:
+            raise orm.except_orm(_('Configurazione mancante!'),_("Configurare l'anno relativo alla comunicazione") )
+        configurazione = self.pool.get('spesometro.configurazione').browse(cr, uid, configurazione_ids[0])
+        
+        # Testata comunicazione
+        comunicazione_id = _genera_testata(cr, uid, params, context=None)
+        
+        period_obj = self.pool.get('account.period')
+        journal_obj = self.pool.get('account.journal')
+        partner_obj = self.pool.get('res.partner')
+        account_move_obj = self.pool.get('account.move')
+        invoice_obj = self.pool.get('account.invoice')
+        # periods
+        period_ids = _get_periods(cr, uid, params, context=None)
+        # journal
+        journal_search = [('spesometro','=', True)]
+        journal_ids = journal_obj.search(cr, uid, journal_search, context=context)
+        # Partners to exclude
+        partner_search = [('spesometro_escludi','=', True)]
+        partner_to_exclude_ids = partner_obj.search(cr, uid, partner_search, context=context)
+        
+        move_search = [('company_id', '=', params['company_id']),('period_id','in', period_ids), ('journal_id','in', journal_ids), ('partner_id','not in', partner_to_exclude_ids)]
+        move_ids = account_move_obj.search(cr, uid, move_search, context=context)
+        
+        for move in self.pool.get('account.move').browse(cr, uid, move_ids):
+            # Test move validate
+            if not move.partner_id:
+                continue
+            
+            # Invoice
+            invoice_search = [('move_id','=', move.id)]
+            invoice_ids = invoice_obj.search(cr, uid, invoice_search, context=context)
+            if not invoice_ids:
+                continue
+            invoice = invoice_obj.browse(cr,uid, invoice_ids[0])
+            
+            # Config spesometro
+            operazione = False
+            operazione_iva_non_esposta = False
+            operazione = move.journal_id.spesometro_operazione
+            operazione_iva_non_esposta = move.journal_id.spesometro_IVA_non_esposta
+            segno = move.journal_id.spesometro_segno
+            if move.partner_id.spesometro_operazione:
+                operazione = move.partner_id.spesometro_operazione 
+                operazione_iva_non_esposta = move.partner_id.spesometro_IVA_non_esposta 
+            
+            arg = {
+                'comunicazione_id' : comunicazione_id,   
+                'segno' : segno,   
+                'operazione_iva_non_esposta' : operazione_iva_non_esposta,
+                'operazione' : operazione,
+                'formato_dati' : params['formato_dati'],
+                'quadri_richiesti' : params['quadri_richiesti'],
+                }
+            
+            # Quadro di competenza
+            quadro = self.get_define_quadro(cr, uid, move, invoice, arg)
+            
+            arg.update({'quadro': quadro})
+            
+            # Test operazione da includere nella comunicazione
+            if not self.validate_operation(cr, uid, move, invoice, arg):
+                continue
+            
+            if quadro == 'FA':
+                line_id = self.pool.get('spesometro.comunicazione.line.fa').add_line(cr, uid, move, invoice, arg)
+            if quadro == 'SA':
+                line_id = self.pool.get('spesometro.comunicazione.line.sa').add_line(cr, uid, move, invoice, arg)
+            if quadro == 'BL':
+                line_id = self.pool.get('spesometro.comunicazione.line.bl').add_line(cr, uid, move, invoice, arg)
+            if quadro == 'SE':
+                line_id = self.pool.get('spesometro.comunicazione.line.se').add_line(cr, uid, move, invoice, arg)
+        
+        # Arrotonda importi su valori raggruppati -> troncare i decimali
+        if params['formato_dati'] == 'aggregati':
+            self.truncate_values(cr, uid, [comunicazione_id])
+            
+        # Rimuove le linee che non rientrano nei limiti ed effettua un controllo formale sull'intera comunicazione
+        self.validate_lines(cr, uid, [comunicazione_id])
+        
+        # Update for compute totals
+        self.write(cr, uid, [comunicazione_id],{})
+        
+        return True
+    
+
+class spesometro_comunicazione_line_FA(orm.Model):
+    '''
+    QUADRO FA - Operazioni documentate da fattura esposte in forma aggregata
+    '''
+
+    _name = "spesometro.comunicazione.line.fa"
+    _description = "Spesometro - Comunicazione linee quadro FA"
+    _columns = {
+        'comunicazione_id': fields.many2one('spesometro.comunicazione', 'Comunicazione', ondelete='cascade'),
+        
+        'partner_id': fields.many2one('res.partner', 'Partner'),
+        'partita_iva': fields.char('Partita IVA', size=11),
+        'codice_fiscale': fields.char('Codice Fiscale', size=16),
+        'documento_riepilogativo': fields.boolean('Documento Riepilogativo'),
+        'noleggio': fields.selection((('A','Autovettura'), ('B','Caravan'), ('C','Altri Veicoli'), ('D','Unità  da diporto'), ('E','Aeromobii')),'Leasing'),
+        
+        'numero_operazioni_attive_aggregate': fields.integer('Nr op. attive', size=16),
+        'numero_operazioni_passive_aggregate': fields.integer('Nr op. passive', size=16),
+        
+        'attive_imponibile_non_esente': fields.float('Tot impon., non impon ed esenti', digits_compute=dp.get_precision('Account'), help="Totale operazioni imponibili, non imponibili ed esenti"),
+        'attive_imposta': fields.float(' Tot imposta', digits_compute=dp.get_precision('Account'), help="Totale imposta"),
+        'attive_operazioni_iva_non_esposta': fields.float('Totale operaz. IVA non esposta', digits_compute=dp.get_precision('Account'), help="Totale operazioni con IVA non esposta"),
+        'attive_note_variazione': fields.float('Totale note variazione', digits_compute=dp.get_precision('Account'), help="Totale note di variazione a debito per la controparte"),
+        'attive_note_variazione_imposta': fields.float('Totale imposta note variazione', digits_compute=dp.get_precision('Account'), help="Totale imposta sulle note di variazione a debito"),
+        
+        'passive_imponibile_non_esente': fields.float('Tot impon., non impon ed esenti', digits_compute=dp.get_precision('Account'), help="Totale operazioni imponibili, non imponibili ed esenti"),
+        'passive_imposta': fields.float('Totale imposta', digits_compute=dp.get_precision('Account'), help="Totale imposta"),
+        'passive_operazioni_iva_non_esposta': fields.float('Totale operaz. IVA non esposta', digits_compute=dp.get_precision('Account'), help="Totale operazioni con IVA non esposta"),
+        'passive_note_variazione': fields.float('Totale note variazione', digits_compute=dp.get_precision('Account'), help="Totale note di variazione a credito per la controparte"),
+        'passive_note_variazione_imposta': fields.float('Totale imposta note variazione', digits_compute=dp.get_precision('Account'), help="Totale imposta sulle note di variazione a credito"),
+        }
+    
+    
+    def add_line(self, cr, uid, move, invoice, arg):
+        comunicazione_lines_obj = self.pool.get('spesometro.comunicazione.line.fa')
+        comunicazione_id = arg.get('comunicazione_id', False)
+        com_line_search = [('comunicazione_id','=',comunicazione_id), ('partner_id', '=', move.partner_id.id)]
+        com_line_ids = self.search(cr, uid, com_line_search)
+        val = {}
+        # Valori documento
+        doc_vals = self.pool.get('spesometro.comunicazione').compute_invoice_amounts(cr, uid, move, invoice, arg)
+        # New partner
+        if not com_line_ids:
+            partita_iva =''
+            if move.partner_id.vat:
+                partita_iva = move.partner_id.vat[2:]
+            documento_riepilogativo = False
+            if arg['operazione'] == 'DR':
+                documento_riepilogativo = True
+            val = {
+                'comunicazione_id' : comunicazione_id,
+                'partner_id' : move.partner_id.id,
+                'partita_iva' : partita_iva,
+                'codice_fiscale' : move.partner_id.fiscalcode or '',
+                'noleggio' : move.partner_id.spesometro_leasing or '',
+                'documento_riepilogativo' : documento_riepilogativo,
+                }
+            # attive
+            if arg.get('segno', False) == 'attiva':
+                val['numero_operazioni_attive_aggregate'] = 1
+                if 'refund' in move.journal_id.type:
+                    val['attive_note_variazione'] = doc_vals.get('amount_untaxed', 0)
+                    val['attive_note_variazione_imposta'] = doc_vals.get('amount_tax', 0)
+                else:
+                    if arg.get('operazione_iva_non_esposta', False):
+                        val['attive_operazioni_iva_non_esposta' ] = doc_vals.get('amount_total', 0) 
+                    else:
+                        val['attive_imponibile_non_esente' ] = doc_vals.get('amount_untaxed', 0)
+                        val['attive_imposta'] =doc_vals.get('amount_tax', 0)
+            # passive         
+            else:
+                val['numero_operazioni_passive_aggregate'] = 1
+                if 'refund' in move.journal_id.type:
+                    val['passive_note_variazione'] = doc_vals.get('amount_untaxed', 0)
+                    val['passive_note_variazione_imposta'] = doc_vals.get('amount_tax', 0)
+                else:
+                    if arg.get('operazione_iva_non_esposta', False):
+                        val['passive_operazioni_iva_non_esposta' ] = doc_vals.get('amount_total', 0) 
+                    else:
+                        val['passive_imponibile_non_esente' ] = doc_vals.get('amount_untaxed', 0)
+                        val['passive_imposta' ] = doc_vals.get('amount_tax', 0)
+            
+        # Partner already exists
+        if com_line_ids:
+            for com_line in self.browse(cr, uid, com_line_ids):
+                # attive
+                if arg.get('segno', False) == 'attiva':
+                    val['numero_operazioni_attive_aggregate'] = com_line.numero_operazioni_attive_aggregate + 1
+                    if 'refund' in move.journal_id.type:
+                        val['attive_note_variazione'] = com_line.attive_note_variazione + doc_vals.get('amount_untaxed', 0)
+                        val['attive_note_variazione_imposta'] = com_line.attive_note_variazione_imposta + doc_vals.get('amount_tax', 0)
+                    else:
+                        if arg.get('operazione_iva_non_esposta', False):
+                            val['attive_operazioni_iva_non_esposta' ] = com_line.attive_operazioni_iva_non_esposta + doc_vals.get('amount_total', 0)
+                        else:
+                            val['attive_imponibile_non_esente' ] = com_line.attive_imponibile_non_esente + doc_vals.get('amount_untaxed', 0)
+                            val['attive_imposta' ] = com_line.attive_imposta + doc_vals.get('amount_tax', 0)
+                # passive         
+                else:
+                    val['numero_operazioni_passive_aggregate'] = com_line.numero_operazioni_passive_aggregate + 1
+                    if 'refund' in move.journal_id.type:
+                        val['passive_note_variazione'] = com_line.passive_note_variazione + doc_vals.get('amount_untaxed', 0)
+                        val['passive_note_variazione_imposta'] = com_line.passive_note_variazione_imposta + doc_vals.get('amount_tax', 0)
+                    else:
+                        if arg.get('operazione_iva_non_esposta', False):
+                            val['passive_operazioni_iva_non_esposta' ] = com_line.passive_operazioni_iva_non_esposta + doc_vals.get('amount_total', 0) 
+                        else:
+                            val['passive_imponibile_non_esente' ] = com_line.passive_imponibile_non_esente + doc_vals.get('amount_untaxed', 0)
+                            val['passive_imposta' ] = com_line.passive_imposta + doc_vals.get('amount_tax', 0)
+            
+        if com_line_ids:
+            line_id = com_line.id
+            self.write(cr, uid, [com_line.id], val)
+        else:
+            line_id = self.create(cr, uid, val)
+        
+        return line_id
+
+class spesometro_comunicazione_line_SA(orm.Model):
+    '''
+    QUADRO SA - Operazioni senza fattura esposte in forma aggregata
+    '''
+    _name = "spesometro.comunicazione.line.sa"
+    _description = "Spesometro - Comunicazione linee quadro SA"
+    _columns = {
+        'comunicazione_id': fields.many2one('spesometro.comunicazione', 'Comunicazione' , ondelete='cascade'),
+        'partner_id': fields.many2one('res.partner', 'Partner'),
+        'codice_fiscale': fields.char('Codice Fiscale', size=16),
+        
+        'numero_operazioni': fields.integer('Numero operazioni'),
+        'importo_complessivo': fields.float('Importo complessivo', digits_compute=dp.get_precision('Account')),
+        'noleggio': fields.selection((('A','Autovettura'), ('B','Caravan'), ('C','Altri Veicoli'), ('D','Unità  da diporto'), ('E','Aeromobii')),'Leasing'),
+        }
+    
+    def add_line(self, cr, uid, move, invoice, arg):
+        comunicazione_lines_obj = self.pool.get('spesometro.comunicazione.line.fa')
+        comunicazione_id = arg.get('comunicazione_id', False)
+        com_line_search = [('comunicazione_id','=',comunicazione_id), ('partner_id', '=', move.partner_id.id)]
+        com_line_ids = self.search(cr, uid, com_line_search)
+        val = {}
+        # Valori documento
+        doc_vals = self.pool.get('spesometro.comunicazione').compute_invoice_amounts(cr, uid, move, invoice, arg)
+        # New partner
+        if not com_line_ids:
+            val = {
+                'comunicazione_id' : comunicazione_id,
+                'partner_id' : move.partner_id.id,
+                'codice_fiscale' : move.partner_id.fiscalcode or False,
+                'noleggio' : move.partner_id.spesometro_leasing or False,
+                'numero_operazioni' : 1,
+                'importo_complessivo' : doc_vals.get('amount_total', 0),
+                }
+        # Partner already exists
+        if com_line_ids:
+            for com_line in self.browse(cr, uid, com_line_ids):
+                val['numero_operazioni'] = com_line.numero_operazioni + 1
+                val['importo_complessivo'] = com_line.importo_complessivo + doc_vals.get('amount_total', 0)
+            
+        if com_line_ids:
+            line_id = com_line.id
+            self.write(cr, uid, [com_line.id], val)
+        else:
+            line_id = self.create(cr, uid, val)
+        
+        return line_id
+
+class spesometro_comunicazione_line_BL(orm.Model):
+    '''
+    QUADRO BL
+    - Operazioni con paesi con fiscalità privilegiata (è obbligatorio compilare le sezioni BL001, BL002
+         e almeno un campo delle sezioni BL003, BL004, BL005, BL006, BL007, BL008)
+    - Operazioni con soggetti non residenti (è obbligatorio compilare le sezioni BL001, BL002 e almeno 
+        un campo delle sezioni BL003 e BL006)
+    - Acquisti di servizi da soggetti non residenti (è obbligatorio compilare le sezioni BL001, BL002 e 
+    almeno un campo della sezione BL006)
+    '''
+    _name = "spesometro.comunicazione.line.bl"
+    _description = "Spesometro - Comunicazione linee quadro BL"
+    _columns = {
+        'comunicazione_id': fields.many2one('spesometro.comunicazione', 'Comunicazione', ondelete='cascade'),
+        'partner_id': fields.many2one('res.partner', 'Partner'),
+        'codice_fiscale': fields.char('Codice Fiscale', size=16),
+        
+        'numero_operazioni': fields.integer('Numero operazioni'),
+        'importo_complessivo': fields.integer('Importo complessivo', digits_compute=dp.get_precision('Account')),
+        'noleggio': fields.selection((('A','Autovettura'), ('B','Caravan'), ('C','Altri Veicoli'), ('D','Unità  da diporto'), ('E','Aeromobii')),'Leasing'),
+        
+        'pf_cognome': fields.char('Cognome', size=24, help=""),
+        'pf_nome': fields.char('Nome', size=20, help=""),
+        'pf_data_nascita': fields.date('Data di nascita'),
+        'pf_comune_stato_nascita': fields.char('Comune o stato estero di nascita', size=40),
+        'pf_provincia_nascita': fields.char('Provincia', size=2),
+        'pf_codice_stato_estero': fields.char('Codice Stato Estero', size=3, help="Deve essere uno di quelli presenti nella tabella 'elenco dei paesi e\
+                    territori esteri' pubblicata nelle istruzioni del modello Unico"),
+        'pg_denominazione': fields.char('Denominazione/Ragione sociale', size=60),
+        'pg_citta_estera_sede_legale': fields.char('Città estera delle Sede legale', size=40),
+        'pg_codice_stato_estero': fields.char('Codice Stato Estero', size=3, help="Deve essere uno di quelli presenti nella tabella 'elenco dei paesi e\
+                    territori esteri' pubblicata nelle istruzioni del modello Unico"),
+        'pg_indirizzo_sede_legale': fields.char('Indirizzo sede legale', size=60),
+         
+        'codice_identificativo_IVA': fields.char('Codice identificativo IVA', size=16), 
+        'operazione_fiscalita_privilegiata': fields.boolean('Operazione con pesei con fiscalità privilegiata'), 
+        'operazione_con_soggetti_non_residenti': fields.boolean('Operazione con soggetto non residente'), 
+        'Acquisto_servizi_da_soggetti_non_residenti': fields.boolean('Acquisto di servizi da soggetti non residenti'), 
+        
+        'attive_importo_complessivo': fields.float('Tot operaz. attive impon., non impon ed esenti', digits_compute=dp.get_precision('Account'), help="Totale operazioni imponibili, non imponibili ed esenti"),
+        'attive_imposta': fields.float('Tot operaz. attive imposta', digits_compute=dp.get_precision('Account'), help="Totale imposta"),
+        'attive_non_sogg_cessione_beni': fields.float('Operaz.attive non soggette ad IVA - Cessione beni', digits_compute=dp.get_precision('Account'), help="Totale operazioni imponibili, non imponibili ed esenti"),
+        'attive_non_sogg_servizi': fields.float('Operaz.attive non soggette ad IVA - Servizi', digits_compute=dp.get_precision('Account'), help="Totale operazioni imponibili, non imponibili ed esenti"),
+        'attive_note_variazione': fields.float('Totale note variazione', digits_compute=dp.get_precision('Account'), help="Totale note di variazione a debito per la controparte"),
+        'attive_note_variazione_imposta': fields.float('Totale imposta note variazione', digits_compute=dp.get_precision('Account'), help="Totale imposta sulle note di variazione a debito"),
+        
+        'passive_importo_complessivo': fields.float('Tot operaz. passive impon., non impon ed esenti', digits_compute=dp.get_precision('Account'), help="Totale operazioni imponibili, non imponibili ed esenti"),
+        'passive_imposta': fields.float('Tot operaz. passive imposta', digits_compute=dp.get_precision('Account'), help="Totale imposta"),
+        'passive_non_sogg_importo_complessivo': fields.float('Operaz.passive non soggette ad IVA', digits_compute=dp.get_precision('Account'), help="Totale operazioni imponibili, non imponibili ed esenti"),
+        'passive_note_variazione': fields.float('Totale note variazione', digits_compute=dp.get_precision('Account'), help="Totale note di variazione a debito per la controparte"),
+        'passive_note_variazione_imposta': fields.float('Totale imposta note variazione', digits_compute=dp.get_precision('Account'), help="Totale imposta sulle note di variazione a debito"),
+        
+        }
+    
+    def add_line(self, cr, uid, move, invoice, arg):
+        comunicazione_lines_obj = self.pool.get('spesometro.comunicazione.line.bl')
+        comunicazione_id = arg.get('comunicazione_id', False)
+        com_line_search = [('comunicazione_id','=',comunicazione_id), ('partner_id', '=', move.partner_id.id)]
+        com_line_ids = self.search(cr, uid, com_line_search)
+        val = {}
+        # Valori documento
+        doc_vals = self.pool.get('spesometro.comunicazione').compute_invoice_amounts(cr, uid, move, invoice, arg)
+        # New partner
+        if not com_line_ids:
+            # p.iva
+            if move.partner_id.vat:
+                partita_iva = move.partner_id.vat[2:]
+            else:
+                partita_iva = '{:11s}'.format("".zfill(11))
+            # prov. nascita
+            prov_code = False
+            '''
+            >>>> mancano dati persona fisica
+            if move.partner_id.birth_city.name:
+                city_data = move.partner_id.address[0]._set_vals_city_data(cr, uid, {'city' : move.partner_id.birth_city.name})
+                prov_id = city_data.get('province_id', False)
+                if prov_id:
+                    prov = self.pool.get('res.province').borwse(cr, uid, prov_id)
+                    prov_nascita_code = prov.code
+            '''
+            
+            val = {
+                'comunicazione_id' : comunicazione_id,
+                'partner_id' : move.partner_id.id,
+                'codice_fiscale' : move.partner_id.fiscalcode or False,
+                'noleggio' : move.partner_id.spesometro_leasing or False,
+                
+                ##'pf_cognome' : move.partner_id.fiscalcode_surname or False,
+                ##'pf_nome' : move.partner_id.fiscalcode_firstname or False,
+                ##'pf_data_nascita' : move.partner_id.birth_date or False,
+                ##'pf_comune_stato_nascita' : move.partner_id.birth_city.name or False,
+                ##'pf_provincia_nascita' : prov_code or False,
+                ##'pf_codice_stato_estero' : move.partner_id.address[0].country_id.codice_stato_agenzia_entrate or '',
+                
+                'pg_denominazione' : move.partner_id.name or False,
+                'pg_citta_estera_sede_legale' : move.partner_id.address[0].city or False,
+                'pg_codice_stato_estero' : move.partner_id.address[0].country_id.codice_stato_agenzia_entrate or '',
+                'pg_indirizzo_sede_legale' : move.partner_id.address[0].street or False,
+                
+                'operazione_fiscalita_privilegiata' : False,
+                'operazione_con_soggetti_non_residenti' : False,
+                'Acquisto_servizi_da_soggetti_non_residenti' : False,
+                }
+            
+            if move.partner_id.spesometro_operazione == 'BL1':
+                val['operazione_fiscalita_privilegiata'] = True
+            elif move.partner_id.spesometro_operazione == 'BL2':
+                val['operazione_con_soggetti_non_residenti'] = True
+            elif move.partner_id.spesometro_operazione == 'BL3':
+                val['Acquisto_servizi_da_soggetti_non_residenti'] = True    
+            
+            # attive
+            if arg.get('segno', False) == 'attiva':
+                
+                if val['operazione_fiscalita_privilegiata'] or val['operazione_con_soggetti_non_residenti']:
+                    val['attive_importo_complessivo'] = doc_vals.get('amount_total', 0)
+                    val['attive_imposta'] = doc_vals.get('amount_tax', 0)
+                if val['operazione_fiscalita_privilegiata'] == True:
+                    if move.partner_id.spesometro_operazione == 'cessioni':
+                        val['attive_non_sogg_cessione_beni'] = doc_vals.get('amount_total', 0)
+                    else:
+                        val['attive_non_sogg_servizi'] = doc_vals.get('amount_total', 0)
+                if 'refund' in move.journal_id.type:
+                    val['attive_note_variazione'] = doc_vals.get('amount_untaxed', 0)
+                    val['attive_note_variazione_imposta'] = doc_vals.get('amount_tax', 0)
+            # passive         
+            else:
+                
+                if val['operazione_fiscalita_privilegiata'] or val['operazione_con_soggetti_non_residenti'] or val['Acquisto_servizi_da_soggetti_non_residenti']:
+                    val['passive_importo_complessivo'] = doc_vals.get('amount_total', 0)
+                    val['passive_imposta'] = doc_vals.get('amount_tax', 0)
+                if val['operazione_fiscalita_privilegiata'] == True:
+                    val['passive_non_sogg_importo_complessivo'] = doc_vals.get('amount_total', 0)
+                if 'refund' in move.journal_id.type:
+                    val['passive_note_variazione'] = doc_vals.get('amount_untaxed', 0)
+                    val['passive_note_variazione_imposta'] = doc_vals.get('amount_tax', 0)
+                
+        # Partner already exists
+        if com_line_ids:
+            for com_line in self.browse(cr, uid, com_line_ids):
+                # attive
+                if arg.get('segno', False) == 'attiva':
+                    
+                    if val['operazione_fiscalita_privilegiata'] or val['operazione_con_soggetti_non_residenti']:
+                        val['attive_importo_complessivo'] = com_line.attive_importo_complessivo + doc_vals.get('amount_total', 0)
+                        val['attive_imposta'] = com_line.attive_imposta + doc_vals.get('amount_tax', 0)
+                    if val['operazione_fiscalita_privilegiata'] == True:
+                        if move.partner_id.spesometro_operazione == 'cessioni':
+                            val['attive_non_sogg_cessione_beni'] = com_line.attive_non_sogg_cessione_beni + doc_vals.get('amount_total', 0)
+                        else:
+                            val['attive_non_sogg_servizi'] = com_line.attive_non_sogg_servizi + doc_vals.get('amount_total', 0)
+                    if 'refund' in move.journal_id.type:
+                        val['attive_note_variazione'] = com_line.attive_note_variazione + doc_vals.get('amount_untaxed', 0)
+                        val['attive_note_variazione_imposta'] = com_line.attive_note_variazione_imposta + doc_vals.get('amount_tax', 0)
+                        
+                # passive         
+                else:
+                    
+                    if val['operazione_fiscalita_privilegiata'] or val['operazione_con_soggetti_non_residenti'] or val['Acquisto_servizi_da_soggetti_non_residenti']:
+                        val['passive_importo_complessivo'] = com_line.passive_importo_complessivo + doc_vals.get('amount_total', 0)
+                        val['passive_imposta'] = com_line.passive_imposta + doc_vals.get('amount_tax', 0)
+                    if val['operazione_fiscalita_privilegiata'] == True:
+                        val['passive_non_sogg_importo_complessivo'] = com_line.passive_non_sogg_importo_complessivo + doc_vals.get('amount_total', 0)
+                    if 'refund' in move.journal_id.type:
+                        val['passive_note_variazione'] = com_line.passive_note_variazione + doc_vals.get('amount_untaxed', 0)
+                        val['passive_note_variazione_imposta'] = com_line.passive_note_variazione_imposta + doc_vals.get('amount_tax', 0)
+                
+        if com_line_ids:
+            line_id = com_line.id
+            self.write(cr, uid, [com_line.id], val)
+        else:
+            line_id = self.create(cr, uid, val)
+        
+        return line_id
+    
+class spesometro_comunicazione_line_FE(orm.Model):
+
+    _name = "spesometro.comunicazione.line.fe"
+    _description = "Spesometro - Comunicazione linee quadro FE"
+    _columns = {
+        'comunicazione_id': fields.many2one('spesometro.comunicazione', 'Comunicazione', ondelete='cascade'),
+        
+        'partner_id': fields.many2one('res.partner', 'Partner'),
+        'partita_iva': fields.char('Partita IVA', size=11),
+        'codice_fiscale': fields.char('Codice Fiscale', size=16),
+        'documento_riepilogativo': fields.boolean('Documento Riepilogativo'),
+        'noleggio': fields.selection((('A','Autovettura'), ('B','Caravan'), ('C','Altri Veicoli'), ('D','Unità  da diporto'), ('E','Aeromobii')),'Leasing'),
+        
+        'autofattura': fields.boolean('Autofattura'),
+        'data_documento': fields.date('Data documento'),
+        'data_registrazione': fields.date('Data registrazione'),
+        'numero_fattura': fields.char('Numero Fattura - Doc riepilog.', size=16),
+        
+        'importo': fields.float('Importo', digits_compute=dp.get_precision('Account')),
+        'imposta': fields.float('Imposta', digits_compute=dp.get_precision('Account')),
+        }
+    
+class spesometro_comunicazione_line_FR(orm.Model):
+
+    _name = "spesometro.comunicazione.line.fr"
+    _description = "Spesometro - Comunicazione linee quadro FR"
+    _columns = {
+        'comunicazione_id': fields.many2one('spesometro.comunicazione', 'Comunicazione', ondelete='cascade'),
+        
+        'partner_id': fields.many2one('res.partner', 'Partner'),
+        'partita_iva': fields.char('Partita IVA', size=11),
+        'documento_riepilogativo': fields.boolean('Documento Riepilogativo'),
+        'data_documento': fields.date('Data documento'),
+        'data_registrazione': fields.date('Data registrazione'),
+        'iva_non_esposta': fields.boolean('IVA non esposta'),
+        'reverse_charge': fields.boolean('Reverse charge'),
+        'autofattura': fields.boolean('Autofattura'),
+        
+        'importo': fields.float('Importo', digits_compute=dp.get_precision('Account')),
+        'imposta': fields.float('Imposta', digits_compute=dp.get_precision('Account')),
+        }
+
+class spesometro_comunicazione_line_NE(orm.Model):
+
+    _name = "spesometro.comunicazione.line.ne"
+    _description = "Spesometro - Comunicazione linee quadro NE"
+    _columns = {
+        'comunicazione_id': fields.many2one('spesometro.comunicazione', 'Comunicazione', ondelete='cascade'),
+        
+        'partner_id': fields.many2one('res.partner', 'Partner'),
+        'partita_iva': fields.char('Partita IVA', size=11),
+        'codice_fiscale': fields.char('Codice Fiscale', size=16),
+        'data_emissione': fields.date('Data emissione'),
+        'data_registrazione': fields.date('Data registrazione'),
+        'numero_nota': fields.char('Numero Nota', size=16),
+        
+        'importo': fields.float('Importo', digits_compute=dp.get_precision('Account')),
+        'imposta': fields.float('Imposta', digits_compute=dp.get_precision('Account')),
+        }
+
+class spesometro_comunicazione_line_NR(orm.Model):
+
+    _name = "spesometro.comunicazione.line.nr"
+    _description = "Spesometro - Comunicazione linee quadro NR"
+    _columns = {
+        'comunicazione_id': fields.many2one('spesometro.comunicazione', 'Comunicazione', ondelete='cascade'),
+        
+        'partner_id': fields.many2one('res.partner', 'Partner'),
+        'partita_iva': fields.char('Partita IVA', size=11),
+        'data_documento': fields.date('Data documento'),
+        'data_registrazione': fields.date('Data registrazione'),
+        
+        'importo': fields.float('Importo', digits_compute=dp.get_precision('Account')),
+        'imposta': fields.float('Imposta', digits_compute=dp.get_precision('Account')),
+        }
+    
+class spesometro_comunicazione_line_DF(orm.Model):
+
+    _name = "spesometro.comunicazione.line.df"
+    _description = "Spesometro - Comunicazione linee quadro DF"
+    _columns = {
+        'comunicazione_id': fields.many2one('spesometro.comunicazione', 'Comunicazione', ondelete='cascade'),
+        
+        'partner_id': fields.many2one('res.partner', 'Partner'),
+        'codice_fiscale': fields.char('Codice Fiscale', size=16),
+        'data_operazione': fields.date('Data operazione'),
+        
+        'importo': fields.float('Importo', digits_compute=dp.get_precision('Account')),
+        'noleggio': fields.selection((('A','Autovettura'), ('B','Caravan'), ('C','Altri Veicoli'), ('D','Unità  da diporto'), ('E','Aeromobii')),'Leasing'),
+        }     
+    
+class spesometro_comunicazione_line_FN(orm.Model):
+
+    _name = "spesometro.comunicazione.line.fn"
+    _description = "Spesometro - Comunicazione linee quadro FN"
+    _columns = {
+        'comunicazione_id': fields.many2one('spesometro.comunicazione', 'Comunicazione', ondelete='cascade'),
+        'partner_id': fields.many2one('res.partner', 'Partner'),
+        
+        'pf_cognome': fields.char('Cognome', size=24, help=""),
+        'pf_nome': fields.char('Nome', size=20, help=""),
+        'pf_data_nascita': fields.date('Data di nascita'),
+        'pf_comune_stato_nascita': fields.char('Comune o stato estero di nascita', size=40),
+        'pf_provincia_nascita': fields.char('Provincia', size=2),
+        'pf_codice_stato_estero_domicilio': fields.char('Codice Stato Estero del Domicilio', size=3, help="Deve essere uno di quelli presenti nella tabella 'elenco dei paesi e\
+                    territori esteri' pubblicata nelle istruzioni del modello Unico"),
+        
+        'pg_denominazione': fields.char('Denominazione/Ragione sociale', size=60),
+        'pg_citta_estera_sede_legale': fields.char('Città estera delle Sede legale', size=40),
+        'pg_codice_stato_estero_domicilio': fields.char('Codice Stato Estero del Domicilio', size=3, help="Deve essere uno di quelli presenti nella tabella 'elenco dei paesi e\
+                    territori esteri' pubblicata nelle istruzioni del modello Unico"),
+        'pg_indirizzo_sede_legale': fields.char('Indirizzo legale', size=40),
+        
+        'data_emissione': fields.date('Data emissione'),
+        'data_registrazione': fields.date('Data registrazione'),
+        'numero_fattura': fields.char('Numero Fattura/Doc riepilog.', size=16),
+        'noleggio': fields.selection((('A','Autovettura'), ('B','Caravan'), ('C','Altri Veicoli'), ('D','Unità  da diporto'), ('E','Aeromobii')),'Leasing'),
+        
+        'importo': fields.float('Importo', digits_compute=dp.get_precision('Account')),
+        'imposta': fields.float('Imposta', digits_compute=dp.get_precision('Account')),
+        }  
+    
+    
+class spesometro_comunicazione_line_SE(orm.Model):
+    '''
+    QUADRO SE - Acquisti di servizi da non residenti e Acquisti da operatori di San Marino
+    '''
+    _name = "spesometro.comunicazione.line.se"
+    _description = "Spesometro - Comunicazione linee quadro SE"
+    _columns = {
+        'comunicazione_id': fields.many2one('spesometro.comunicazione', 'Comunicazione', ondelete='cascade'),
+        'partner_id': fields.many2one('res.partner', 'Partner'),
+        
+        'pf_cognome': fields.char('Cognome', size=24, help=""),
+        'pf_nome': fields.char('Nome', size=20, help=""),
+        'pf_data_nascita': fields.date('Data di nascita'),
+        'pf_comune_stato_nascita': fields.char('Comune o stato estero di nascita', size=40),
+        'pf_provincia_nascita': fields.char('Provincia', size=2),
+        'pf_codice_stato_estero_domicilio': fields.char('Codice Stato Estero del Domicilio', size=3, help="Deve essere uno di quelli presenti nella tabella 'elenco dei paesi e\
+                    territori esteri' pubblicata nelle istruzioni del modello Unico"),
+        
+        'pg_denominazione': fields.char('Denominazione/Ragione sociale', size=60),
+        'pg_citta_estera_sede_legale': fields.char('Città estera delle Sede legale', size=40),
+        'pg_codice_stato_estero_domicilio': fields.char('Codice Stato Estero del Domicilio', size=3, help="Deve essere uno di quelli presenti nella tabella 'elenco dei paesi e\
+                    territori esteri' pubblicata nelle istruzioni del modello Unico"),
+        'pg_indirizzo_sede_legale': fields.char('Indirizzo legale', size=40),
+        
+        'codice_identificativo_IVA': fields.char('Codice Identificativo IVA (037=San Marino)', size=3),
+        'data_emissione': fields.date('Data emissione'),
+        'data_registrazione': fields.date('Data registrazione'),
+        'numero_fattura': fields.char('Numero Fattura/Doc riepilog.', size=16),
+        
+        'importo': fields.float('Importo/imponibile', digits_compute=dp.get_precision('Account')),
+        'imposta': fields.float('Imposta', digits_compute=dp.get_precision('Account')),
+        }
+    
+    def add_line(self, cr, uid, move, invoice, arg):
+        comunicazione_lines_obj = self.pool.get('spesometro.comunicazione.line.se')
+        comunicazione_id = arg.get('comunicazione_id', False)
+        com_line_search = [('comunicazione_id','=',comunicazione_id), ('partner_id', '=', move.partner_id.id)]
+        com_line_ids = self.search(cr, uid, com_line_search)
+        val = {}
+        # Valori documento
+        doc_vals = self.pool.get('spesometro.comunicazione').compute_invoice_amounts(cr, uid, move, invoice, arg)
+        # p.iva
+        if move.partner_id.vat:
+            partita_iva = move.partner_id.vat[2:]
+        else:
+            partita_iva = '{:11s}'.format("".zfill(11))
+        # prov. nascita
+        '''
+        >> dati persona fisica>> da aggiungere
+        prov_code = False
+        if move.partner_id.birth_city.name:
+            city_data = move.partner_id.address[0]._set_vals_city_data(cr, uid, {'city' : move.partner_id.birth_city.name})
+            prov_id = city_data.get('province_id', False)
+            if prov_id:
+                prov = self.pool.get('res.province').borwse(cr, uid, prov_id)
+                prov_nascita_code = prov.code
+        '''
+        # Indirizzo
+        address = self.pool.get('spesometro.comunicazione')._get_partner_address_obj(cr, uid, move, invoice, arg)
+        # Codice identificativo IVA -Da indicare esclusivamente per operazioni con San Marino (Codice Stato = 037)
+        codice_identificativo_iva=''
+        if self.pool.get('spesometro.comunicazione').partner_is_from_san_marino(cr, uid, move, invoice, arg):
+            codice_identificativo_iva = '037'
+        val = {
+            'comunicazione_id' : comunicazione_id,
+            'partner_id' : move.partner_id.id,
+            'codice_fiscale' : move.partner_id.fiscalcode or False,
+            'noleggio' : move.partner_id.spesometro_leasing or False,
+            
+            #'pf_cognome' : move.partner_id.fiscalcode_surname or False,
+            #'pf_nome' : move.partner_id.fiscalcode_firstname or False,
+            #'pf_data_nascita' : move.partner_id.birth_date or False,
+            #'pf_comune_stato_nascita' : move.partner_id.birth_city.name or False,
+            #'pf_provincia_nascita' : prov_code or False,
+            #'pf_codice_stato_estero_domicilio' : address.country_id.codice_stato_agenzia_entrate or codice_identificativo_iva or '',
+            
+            'pg_denominazione' : move.partner_id.name or False,
+            'pg_citta_estera_sede_legale' : address.city or False,
+            'pg_codice_stato_estero_domicilio' : address.country_id.codice_stato_agenzia_entrate or codice_identificativo_iva or '',
+            'pg_indirizzo_sede_legale' : address.street or False,
+            
+            'codice_identificativo_IVA' : codice_identificativo_iva,
+            
+            'data_emissione': move.date,
+            'data_registrazione': invoice.date_invoice or move.date,
+            'numero_fattura': move.name,
+            
+            'importo': doc_vals.get('amount_untaxed', 0),
+            'imposta': doc_vals.get('amount_tax', 0)
+            }
+        
+        line_id = self.create(cr, uid, val)
+        
+        return line_id  
+    
+class spesometro_comunicazione_line_TU(orm.Model):
+
+    _name = "spesometro.comunicazione.line.tu"
+    _description = "Spesometro - Comunicazione linee quadro TU"
+    _columns = {
+        'comunicazione_id': fields.many2one('spesometro.comunicazione', 'Comunicazione', ondelete='cascade'),
+        'partner_id': fields.many2one('res.partner', 'Partner'),
+        
+        'cognome': fields.char('Cognome', size=24, help=""),
+        'nome': fields.char('Nome', size=20, help=""),
+        'data_nascita': fields.date('Data di nascita'),
+        'comune_stato_nascita': fields.char('Comune o stato estero di nascita', size=40),
+        'provincia_nascita': fields.char('Provincia', size=2),
+        'citta_estera_residenza': fields.char('Città Estera di residenza', size=40),
+        'codice_stato_estero': fields.char('Codice Stato Estero', size=3, help="Deve essere uno di quelli presenti nella tabella 'elenco dei paesi e\
+                    territori esteri' pubblicata nelle istruzioni del modello Unico"),
+        'indirizzo_estero_residenza': fields.char('Indirizzo Estero di residenza', size=40),
+        
+        'data_emissione': fields.date('Data emissione'),
+        'data_registrazione': fields.date('Data registrazione'),
+        'numero_fattura': fields.char('Numero Fattura/Doc riepilog.', size=16),
+        
+        'importo': fields.float('Importo/imponibile', digits_compute=dp.get_precision('Account')),
+        'imposta': fields.float('Imposta', digits_compute=dp.get_precision('Account')),
+        }  

=== added file 'l10n_it_spesometro/spesometro_view.xml'
--- l10n_it_spesometro/spesometro_view.xml	1970-01-01 00:00:00 +0000
+++ l10n_it_spesometro/spesometro_view.xml	2014-03-19 09:57:51 +0000
@@ -0,0 +1,628 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data>
+        
+        <!--
+        PARTNER
+         -->
+		<record id="spesometro_account_partner_view_form" model="ir.ui.view">
+            <field name="name">spesometro.account.partner.view.form</field>
+            <field name="model">res.partner</field>
+            <field name="inherit_id" ref="base.view_partner_form"/>
+            <field name="arch" type="xml">
+                <xpath expr="//field[@name='bank_ids']" position="after">
+                    <group string="Comunicazione art.21" colspan="4">
+	                    <group colspan="2">
+		                	<field name="spesometro_escludi"/>
+		                	<field name="spesometro_operazione" attrs="{'invisible': [('spesometro_escludi', '=', True)]}"/>
+		                	<field name="spesometro_tipo_servizio" attrs="{'invisible': [('spesometro_operazione', '!=', 'BL1')], 'required': [('spesometro_operazione', '=', 'BL1')]}"/>
+		                </group>
+		                <group>
+		                	<field name="spesometro_IVA_non_esposta" attrs="{'invisible': ['|', ('spesometro_escludi', '=', True), ('spesometro_operazione', '!=', 'FA')]}" />
+		                </group>
+		                <group>
+		                	<field name="spesometro_leasing" attrs="{'invisible': [('spesometro_escludi', '=', True)]}" />
+		                </group>
+	                </group>
+           		</xpath>
+            </field>
+		</record>
+		
+        <!--
+        JOURNAL
+         -->
+        <record id="spesometro_account_journal_view_form" model="ir.ui.view">
+            <field name="name">spesometro.account.journal.view.form</field>
+            <field name="model">account.journal</field>
+            <field name="inherit_id" ref="account.view_account_journal_form"/>
+            <field name="arch" type="xml">
+                <xpath expr="//field[@name='sequence_id']" position="after">
+                    <group string="Comunicazione art.21" colspan="4">
+	                	<field name="spesometro"/>
+	                	<field name="spesometro_operazione" attrs="{'invisible': [('spesometro', '=', False)], 'required': [('spesometro', '=', True)]}"/>
+	                	<field name="spesometro_segno" attrs="{'invisible': ['|', ('spesometro', '=', False), ('spesometro_operazione', '=', 'SA')], 'required': [('spesometro_operazione', 'IN', ('FA','BL1','BL2','BL3') )]}" />
+	                	<field name="spesometro_IVA_non_esposta" attrs="{'invisible': ['|', ('spesometro', '=', False), ('spesometro_operazione', '=', 'SA')]}" />
+	                </group>
+           		</xpath>
+            </field>
+		</record>
+         
+        
+	    <!--
+        COUNTRY
+         -->
+        <record id="spesometro_res_country_view_form" model="ir.ui.view">
+            <field name="name">spesometro.res.country.view.form</field>
+            <field name="model">res.country</field>
+            <field name="inherit_id" ref="base.view_country_form"/>
+            <field name="arch" type="xml">
+                <xpath expr="//field[@name='address_format']" position="after">
+                    <group>
+	                	<field name="codice_stato_agenzia_entrate"/>
+	                </group>
+           		</xpath>
+            </field>
+		</record>
+		<record id="spesometro_res_country_view_tree" model="ir.ui.view">
+            <field name="name">spesometro.res.country.view.tree</field>
+            <field name="model">res.country</field>
+            <field name="inherit_id" ref="base.view_country_tree"/>
+            <field name="arch" type="xml">
+                <xpath expr="//field[@name='code']" position="after">
+	                	<field name="codice_stato_agenzia_entrate"/>
+           		</xpath>
+            </field>
+		</record>
+		
+        <!--
+        SPESOMETRO
+         -->
+        <menuitem id="menu_spesometro_main" 
+            name="Spesometro" parent="account.menu_account_end_year_treatments"/>
+		
+        <!--
+        Configurazione
+         -->
+         
+         <record id="spesometro_configurazione_view_tree" model="ir.ui.view">
+            <field name="name">spesometro.configurazione.view.tree</field>
+            <field name="model">spesometro.configurazione</field>
+            <field name="arch" type="xml">
+	            <tree string="Configurazione Spesometro">
+	            	<field name="anno"/>
+	            </tree>
+            </field>
+        </record>
+        <record id="spesometro_configurazione_view_form" model="ir.ui.view">
+            <field name="name">spesometro.configurazione.view.form</field>
+            <field name="model">spesometro.configurazione</field>
+            <field name="arch" type="xml">
+	            <form string="Configurazione Spesometro">
+	                <group>
+		            	<field name="anno"/>
+		            	<newline/>
+		            	<field name="stato_san_marino"/>
+	            	</group>
+	            	<newline/>
+	            	<group string="Quadri per dati in forma aggregata">
+		            	<group col="2">
+		            	   	<label string="Quadro FA - Operazioni documentate da fattura esposte in forma aggregata" colspan="2" />
+		            	    <field name="quadro_fa_limite_importo" />
+		            	    <field name="quadro_fa_limite_importo_line" />
+		            	</group>
+		            	<group col="2">
+		            	    <label string="Quadro SA - Operazioni senza fattura esposte in forma aggregata" colspan="2"/>
+		            	    <field name="quadro_sa_limite_importo" />
+		            	    <field name="quadro_sa_limite_importo_line" />
+		            	</group>
+		            	<group col="2">
+		            	    <label string="Quadro BL - Operazioni con paesi con fiscalità privilegiata - Operazioni con soggetti non residenti - Acquisti di servizi da soggetti non residenti " colspan="2"/>
+		            	    <field name="quadro_bl_limite_importo" />
+		            	    <field name="quadro_bl_limite_importo_line" />
+		            	</group>
+		            	<newline/>
+		            	<group string="Quadri per dati in forma analitica">
+			            	<group col="2">
+			            	    <label string="Quadro SE - Acquisti di servizi da non residenti e Acquisti da operatori di San Marino" colspan="2"/>
+			            	    <field name="quadro_se_limite_importo_line" />
+			            	</group>
+		            	</group>
+	            	</group>
+	            </form>
+            </field>
+        </record>
+        
+        <record id="spesometro_configurazione_action" model="ir.actions.act_window">
+            <field name="name">Configurazione Spesometro</field>
+            <field name="type">ir.actions.act_window</field>
+            <field name="res_model">spesometro.configurazione</field>
+            <field name="view_type">form</field>
+            <field name="view_mode">tree,form</field>
+        </record>
+        
+        <menuitem id="menu_spesometro_configurazione" action="spesometro_configurazione_action"
+            name="Configurazione Spesometro" parent="menu_spesometro_main" sequence="100"/>
+        
+        
+        <!-- 
+        Comunicazioni 
+         -->
+        <record id="spesometro_comunicazione_view_form" model="ir.ui.view">
+            <field name="name">spesometro.comunicazione.view.form</field>
+            <field name="model">spesometro.comunicazione</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <form string="Comunicazione">
+                	<group colspan="4">
+                		<field name="tipo"/>  
+                		<field name="progressivo_telematico"/>  
+                		<field name="periodo"/>
+                		<field name="anno"/>
+                		<field name="mese" attrs="{'invisible':[('periodo','!=','mese')], 'required':[('periodo','=','mese')]}"/>  
+                		<field name="trimestre" attrs="{'invisible':[('periodo','!=','trimestre')], 'required':[('periodo','=','trimestre')]}"/>
+                		<field name="tipo_fornitore" invisible="1"/>  
+                		<field name="comunicazione_da_sostituire_annullare" attrs="{'invisible':[('tipo','=','ordinaria')], 'required':[('tipo','!=','ordinaria')]}"/>  
+                		<field name="documento_da_sostituire_annullare" attrs="{'invisible':[('tipo','=','ordinaria')], 'required':[('comunicazione_da_sostituire_annullare','!=',0)]}"/>
+                		<newline/>
+                		<field name="formato_dati"/>  
+                	</group> 
+                		
+                    <newline/>
+                    <!--
+                    Soggetto comunicazione 
+                     -->
+                   	<notebook>
+                   	    <page string="Soggetto Obbligato">
+	                   		<group colspan="4">
+		                        <field name="soggetto_codice_fiscale"/>
+		                        <field name="soggetto_partitaIVA"/>  
+		                		<field name="soggetto_codice_attivita" required="1"/>  
+		                		<field name="soggetto_telefono"/>  
+		                		<field name="soggetto_fax"/>  
+		                		<field name="soggetto_email"/>  
+		                		<field name="soggetto_forma_giuridica"/>
+		                    </group>    
+		                    <group string="Dati persona giuridica" colspan="4" attrs="{'invisible':[('soggetto_forma_giuridica','!=','persona_giuridica')]}">
+			                		<field name="soggetto_pg_denominazione" attrs="{'required':[('soggetto_forma_giuridica','==','persona_giuridica')]}" />    
+			                </group>
+			                <group string="Dati persona fisica" colspan="4" attrs="{'invisible':[('soggetto_forma_giuridica','==','persona_giuridica')]}">
+			                		<field name="soggetto_pf_cognome" attrs="{'required':[('soggetto_forma_giuridica','!=','persona_giuridica')]}"/>  
+			                		<field name="soggetto_pf_nome" attrs="{'required':[('soggetto_forma_giuridica','!=','persona_giuridica')]}"/>  
+			                		<field name="soggetto_pf_sesso" attrs="{'required':[('soggetto_forma_giuridica','!=','persona_giuridica')]}"/>  
+			                		<field name="soggetto_pf_data_nascita" attrs="{'required':[('soggetto_forma_giuridica','!=','persona_giuridica')]}"/>  
+			                		<field name="soggetto_pf_comune_nascita" attrs="{'required':[('soggetto_forma_giuridica','!=','persona_giuridica')]}"/>  
+			                		<field name="soggetto_pf_provincia_nascita" attrs="{'required':[('soggetto_forma_giuridica','!=','persona_giuridica')]}"/>  
+			                </group>
+		                </page>
+		                
+                   	    <page string="Soggetto Tenuto alla comunicazione">
+	                   		<group colspan="4">
+		                		<field name="tipo_fornitore"/>
+		                		<field name="soggetto_cm_forma_giuridica"/>
+		                		<field name="soggetto_cm_codice_fiscale"/>
+		                    </group>    
+		                    <group string="Dati persona giuridica" colspan="4" attrs="{'invisible':[('soggetto_cm_forma_giuridica','!=','persona_giuridica')]}">
+			                		<field name="soggetto_cm_pg_denominazione" attrs="{'required':[('soggetto_cm_forma_giuridica','==','persona_giuridica')]}" />    
+			                </group>
+			                <group string="Dati persona fisica" colspan="4" attrs="{'invisible':[('soggetto_cm_forma_giuridica','==','persona_giuridica')]}">
+			                		<field name="soggetto_cm_pf_cognome" attrs="{'required':[('soggetto_cm_forma_giuridica','!=','persona_giuridica')]}"/>  
+			                		<field name="soggetto_cm_pf_nome" attrs="{'required':[('soggetto_cm_forma_giuridica','!=','persona_giuridica')]}"/>  
+			                		<field name="soggetto_cm_pf_sesso" attrs="{'required':[('soggetto_cm_forma_giuridica','!=','persona_giuridica')]}"/>  
+			                		<field name="soggetto_cm_pf_data_nascita" attrs="{'required':[('soggetto_cm_forma_giuridica','!=','persona_giuridica')]}"/>  
+			                		<field name="soggetto_cm_pf_comune_nascita" attrs="{'required':[('soggetto_cm_forma_giuridica','!=','persona_giuridica')]}"/>  
+			                		<field name="soggetto_cm_pf_provincia_nascita" attrs="{'required':[('soggetto_cm_forma_giuridica','!=','persona_giuridica')]}"/>  
+			                </group>
+		                </page>
+		                
+                   	    <page string="Incaricato alla trasmissione">
+	                   		<group colspan="4">
+	                   		    <field name="soggetto_trasmissione_codice_fiscale" attrs="{'required':[('tipo_fornitore','==','10')]}" />
+	                   		    <field name="soggetto_trasmissione_numero_CAF" />
+	                   		    <field name="soggetto_trasmissione_impegno" required="1" on_change="onchange_trasmissione_impegno(soggetto_trasmissione_impegno, context)" context="{'soggetto_codice_fiscale': soggetto_codice_fiscale}"/>
+	                   		    <field name="soggetto_trasmissione_data_impegno" attrs="{'required':[('soggetto_trasmissione_codice_fiscale','!=',False)]}"/>
+		                    </group>    
+		                </page>
+		                
+                   	</notebook>
+                   	<newline/>
+               <!-- 
+		        Quadri 
+		         -->
+                	<notebook>
+                	    <page string="Quadri FA">
+                	        <label string="FORMA AGGREGATA : Operazioni documentate da fattura esposte in forma aggregata" colspan="4"/>
+                	        <newline/>
+                	    	<field name="line_FA_ids" nolabel="1">
+                	    	    <tree>
+                	    	        <field name="partner_id"/>
+                	    	        <field name="numero_operazioni_attive_aggregate" string="Nr op. attive"/>
+                	    	        <field name="numero_operazioni_passive_aggregate" string="Nr op. passive"/>
+                	    	        <field name="noleggio"/>
+                	    	        <field name="attive_imponibile_non_esente" string="Attive : Impon., non impon, esente"/>
+                	    	        <field name="attive_imposta" string="Attive : imposta"/>
+                	    	        <field name="passive_imponibile_non_esente" string="Passive : Impon., non impon, esente"/>
+                	    	        <field name="passive_imposta" string="Passive : imposta"/>
+                	    	    </tree>
+                	    	</field>
+                	    </page>
+                	    <page string="Quadri SA">
+                	        <label string="FORMA AGGREGATA : Operazioni senza fattura esposte in forma aggregata" colspan="4"/>
+                	        <newline/>
+                	        <field name="line_SA_ids" nolabel="1">
+                	            <tree>
+                	    	        <field name="partner_id"/>
+                	    	        <field name="codice_fiscale"/>
+                	    	        <field name="numero_operazioni"/>
+                	    	        <field name="noleggio"/>
+                	    	        <field name="importo_complessivo"/>
+                	    	    </tree>
+                	        </field>
+                	    </page>
+                	    <page string="Quadri BL">
+                	        <label string="FORMA AGGREGATA : Operazioni con paesi con fiscalità privilegiata - Operazioni con soggetti non residenti 
+                	            - Acquisti di servizi da soggetti non residenti" colspan="4"/>
+                	        <newline/>
+                	        <field name="line_BL_ids" nolabel="1">
+                	        	<tree>
+                	    	        <field name="partner_id"/>
+                	    	        <field name="codice_fiscale"/>
+                	    	        <field name="noleggio"/>
+                	    	        <field name="pf_cognome"/>
+                	    	        <field name="pg_denominazione"/>
+                	    	        <field name="operazione_fiscalita_privilegiata"/>
+                	    	        <field name="operazione_con_soggetti_non_residenti"/>
+                	    	        <field name="Acquisto_servizi_da_soggetti_non_residenti"/>
+                	    	        <field name="attive_importo_complessivo"/>
+                	    	        <field name="passive_importo_complessivo"/>
+                	    	    </tree>
+                	        </field>
+                	    </page>
+                	    <page string="Quadri SE">
+                	        <label string="FORMA ANALITICA : Acquisti di servizi da non residenti e Acquisti da operatori di San Marino" colspan="4"/>
+                	        <newline/>
+                	        <field name="line_SE_ids" nolabel="1">
+                	        	<tree>
+                	    	        <field name="partner_id"/>
+                	    	        <field name="pf_cognome"/>
+                	    	        <field name="pg_denominazione"/>
+                	    	        <field name="numero_fattura"/>
+                	    	        <field name="data_emissione"/>
+                	    	        <field name="data_registrazione"/>
+                	    	        <field name="importo"/>
+                	    	        <field name="imposta"/>
+                	    	    </tree>
+                	        </field>
+                	    </page>
+                	    
+                	    <page string="Quadri FE">
+                	        <label string="FORMA ANALITICA : Fatture emesse e Documenti riepilogativi(Operazioni Attive)" colspan="4"/>
+                	        <newline/>
+                	        <field name="line_FE_ids" nolabel="1">
+                	        	<tree>
+                	    	        <field name="partner_id"/>
+                	    	        <field name="partita_iva"/>
+                	    	        <field name="codice_fiscale"/>
+                	    	        <field name="numero_fattura"/>
+                	    	        <field name="data_documento"/>
+                	    	        <field name="data_registrazione"/>
+                	    	        <field name="importo"/>
+                	    	        <field name="imposta"/>
+                	    	    </tree>
+                	        </field>
+                	    </page>
+                	    <page string="Quadri FR">
+                	        <label string="FORMA ANALITICA : Fatture ricevute e Documenti riepilogativi (Operazioni passive)" colspan="4"/>
+                	        <newline/>
+                	        <field name="line_FR_ids" nolabel="1">
+                	        	<tree>
+                	    	        <field name="partner_id"/>
+                	    	        <field name="partita_iva"/>
+                	    	        <field name="documento_riepilogativo"/>
+                	    	        <field name="data_documento"/>
+                	    	        <field name="data_registrazione"/>
+                	    	        <field name="importo"/>
+                	    	        <field name="imposta"/>
+                	    	    </tree>
+                	        </field>
+                	    </page>
+                	    <page string="Quadri NE">
+                	        <label string="FORMA ANALITICA : Note di variazione emesse" colspan="4"/>
+                	        <newline/>
+                	        <field name="line_NE_ids" nolabel="1">
+                	        	<tree>
+                	    	        <field name="partner_id"/>
+                	    	        <field name="partita_iva"/>
+                	    	        <field name="codice_fiscale"/>
+                	    	        <field name="numero_nota"/>
+                	    	        <field name="data_emissione"/>
+                	    	        <field name="data_registrazione"/>
+                	    	        <field name="importo"/>
+                	    	        <field name="imposta"/>
+                	    	    </tree>
+                	        </field>
+                	    </page>
+                	    <page string="Quadri NR">
+                	        <label string="FORMA ANALITICA : Note di variazione ricevute" colspan="4"/>
+                	        <newline/>
+                	        <field name="line_NR_ids" nolabel="1">
+                	        	<tree>
+                	    	        <field name="partner_id"/>
+                	    	        <field name="partita_iva"/>
+                	    	        <field name="data_documento"/>
+                	    	        <field name="data_registrazione"/>
+                	    	        <field name="importo"/>
+                	    	        <field name="imposta"/>
+                	    	    </tree>
+                	        </field>
+                	    </page>
+                	    <page string="Quadri DF">
+                	        <label string="FORMA ANALITICA :  Operazioni senza fattura" colspan="4"/>
+                	        <newline/>
+                	        <field name="line_DF_ids" nolabel="1">
+                	        	<tree>
+                	    	        <field name="partner_id"/>
+                	    	        <field name="codice_fiscale"/>
+                	    	        <field name="data_operazione"/>
+                	    	        <field name="importo"/>
+                	    	    </tree>
+                	        </field>
+                	    </page>
+                	    <page string="Quadri FN">
+                	        <label string="FORMA ANALITICA : Operazioni con soggetti non residenti (Operazioni attive)" colspan="4"/>
+                	        <newline/>
+                	        <field name="line_FN_ids" nolabel="1">
+                	        	<tree>
+                	    	        <field name="partner_id"/>
+                	    	        <field name="pf_cognome"/>
+                	    	        <field name="pf_nome"/>
+                	    	        <field name="pg_denominazione"/>
+                	    	        
+                	    	        <field name="numero_fattura"/>
+                	    	        <field name="data_emissione"/>
+                	    	        <field name="data_registrazione"/>
+                	    	        <field name="importo"/>
+                	    	        <field name="imposta"/>
+                	    	    </tree>
+                	        </field>
+                	    </page>
+                	    <page string="Quadri TU">
+                	        <label string="FORMA ANALITICA : Operazioni legate al turismo - Art. 3 comma 1 D.L. 16/2012" colspan="4"/>
+                	        <newline/>
+                	        <field name="line_TU_ids" nolabel="1">
+                	        	<tree>
+                	    	        <field name="partner_id"/>
+                	    	        <field name="cognome"/>
+                	    	        <field name="nome"/>
+                	    	        
+                	    	        <field name="numero_fattura"/>
+                	    	        <field name="data_emissione"/>
+                	    	        <field name="data_registrazione"/>
+                	    	        <field name="importo"/>
+                	    	        <field name="imposta"/>
+                	    	    </tree>
+                	        </field>
+                	    </page>
+                	</notebook>    
+                </form>
+            </field>
+        </record>
+         
+        <record id="spesometro_comunicazione_view_tree" model="ir.ui.view">
+            <field name="name">spesometro.comunicazione.view.tree</field>
+            <field name="model">spesometro.comunicazione</field>
+            <field name="type">tree</field>
+            <field name="arch" type="xml">
+                <tree string="Comunicazioni">
+                    <field name="progressivo_telematico"/>
+                    <field name="tipo"/>
+                    <field name="formato_dati"/>
+                    <field name="periodo"/>
+                    <field name="anno"/>
+                    <field name="mese"/>
+                    <field name="trimestre"/>
+                    <field name="soggetto_codice_fiscale"/>
+                </tree>
+            </field>
+        </record>
+        
+        <record model="ir.ui.view" id="spesometro_comunicazione_search">
+            <field name="name">salesman.commission.search</field>
+            <field name="model">spesometro.comunicazione</field>
+            <field name="type">search</field>
+            <field name="arch" type="xml">
+                <search string="Ricerca comunicazioni">
+                    <field name="anno"/>
+                    <newline/>
+                	<group expand="0" string="Group By...">
+                        <filter string="tipo" icon="terp-personal" domain="[]"  context="{'group_by':'tipo'}"/>
+                        <filter string="Periodo" icon="terp-go-month" domain="[]" context="{'group_by':'anno'}"/>
+                    </group>
+                </search>
+            </field>
+        </record>
+        
+        <record id="spesometro_comunicazione_action" model="ir.actions.act_window">
+            <field name="name">Comunicazioni</field>
+            <field name="type">ir.actions.act_window</field>
+            <field name="res_model">spesometro.comunicazione</field>
+            <field name="view_type">form</field>
+            <field name="view_mode">tree,form</field>
+            <field name="view_id" ref="spesometro_comunicazione_view_tree"/>
+            <!-- <field name="search_view_id" ref="spesometro_comunicazione_search" /> -->
+        </record>
+         
+        <menuitem id="menu_spesometro_comunicazione" action="spesometro_comunicazione_action"
+            name="Comunicazioni" parent="menu_spesometro_main"/>
+        
+        <!-- 
+        Quadro FA 
+         -->
+         <record id="spesometro_comunicazione_fa_view_form" model="ir.ui.view">
+            <field name="name">spesometro.comunicazione.fa.view.form</field>
+            <field name="model">spesometro.comunicazione.line.fa</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <form string="Quado FA - Linea">
+                    <group>
+                    	<field name="partner_id"/>
+                    	<newline/>
+                    	<field name="partita_iva"/>
+                    	<field name="codice_fiscale"/>
+                    	<field name="documento_riepilogativo"/>
+                    	<field name="noleggio"/>
+                    </group>
+                    <newline/>
+                   	<group string="Operazioni Attive">
+                   		<field name="numero_operazioni_attive_aggregate"/>    
+                   		<field name="attive_imponibile_non_esente"/>    
+                   		<field name="attive_imposta"/>    
+                   		<field name="attive_operazioni_iva_non_esposta"/>    
+                   		<field name="attive_note_variazione"/>    
+                   		<field name="attive_note_variazione_imposta"/>    
+                   	</group>
+                   	<newline/>
+                   	<group string="Operazioni Passive">
+                   		<field name="numero_operazioni_passive_aggregate"/>    
+                   		<field name="passive_imponibile_non_esente"/>    
+                   		<field name="passive_imposta"/>    
+                   		<field name="passive_operazioni_iva_non_esposta"/>    
+                   		<field name="passive_note_variazione"/>    
+                   		<field name="passive_note_variazione_imposta"/>    
+                   	</group>
+                   	  
+                </form>
+            </field>
+          </record>
+          
+         <!-- 
+        Quadro SA 
+         -->
+         <record id="spesometro_comunicazione_sa_view_form" model="ir.ui.view">
+            <field name="name">spesometro.comunicazione.sa.view.form</field>
+            <field name="model">spesometro.comunicazione.line.sa</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <form string="Quado SA - Linea">
+                    <group>
+                    	<field name="partner_id"/>
+                    	<newline/>
+                    	<field name="codice_fiscale"/>
+                    	<field name="noleggio"/>
+                    </group>
+                    <newline/>
+                   	<group>
+                   		<field name="numero_operazioni"/>    
+                   		<field name="importo_complessivo"/>    
+                   	</group>
+                </form>
+            </field>
+          </record>
+         
+         
+          <!-- 
+        Quadro BL 
+         -->
+         <record id="spesometro_comunicazione_bl_view_form" model="ir.ui.view">
+            <field name="name">spesometro.comunicazione.bl.view.form</field>
+            <field name="model">spesometro.comunicazione.line.bl</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <form string="Quado BL - Linea">
+                    <group>
+                    	<field name="partner_id"/>
+                    	<newline/>
+                    	<field name="codice_fiscale"/>
+                    	<field name="noleggio"/>
+                    	<field name="codice_identificativo_IVA"/>
+                    </group>
+                    <newline/>
+                    <group>
+                    	<field name="operazione_fiscalita_privilegiata"/>
+                    	<field name="operazione_con_soggetti_non_residenti"/>
+                    	<field name="Acquisto_servizi_da_soggetti_non_residenti"/>
+                    </group>
+                    <newline/>
+                    <notebook>
+	                    <page string="Persona Giuridica">
+                    		<field name="pg_denominazione"/>
+	                    	<field name="pg_citta_estera_sede_legale"/>
+	                    	<field name="pg_codice_stato_estero"/>
+	                    	<field name="pg_indirizzo_sede_legale"/>
+	                    </page>
+                    	<page string="Persona Fisica">
+                    		<field name="pf_cognome"/>
+	                    	<field name="pf_nome"/>
+	                    	<field name="pf_data_nascita"/>
+	                    	<field name="pf_comune_stato_nascita"/>
+	                    	<field name="pf_provincia_nascita"/>
+	                    	<field name="pf_codice_stato_estero"/>
+                    	</page>
+                    </notebook>
+                    <newline/>
+                   	<group string="Operazioni Attive">
+                   		<field name="attive_importo_complessivo"/>    
+                   		<field name="attive_imposta"/>    
+                   		<field name="attive_non_sogg_cessione_beni"/>    
+                   		<field name="attive_non_sogg_servizi"/>    
+                   		<field name="attive_note_variazione"/>    
+                   		<field name="attive_note_variazione_imposta"/>    
+                   	</group>
+                   	<newline/>
+                   	<group string="Operazioni Passive">
+                   		<field name="passive_importo_complessivo"/>    
+                   		<field name="passive_imposta"/>    
+                   		<field name="passive_non_sogg_importo_complessivo"/>    
+                   		<field name="passive_note_variazione"/>    
+                   		<field name="passive_note_variazione_imposta"/>    
+                   	</group>
+                </form>
+            </field>
+          </record>
+          
+         <!-- 
+        Quadro SE 
+         -->
+         <record id="spesometro_comunicazione_se_view_form" model="ir.ui.view">
+            <field name="name">spesometro.comunicazione.se.view.form</field>
+            <field name="model">spesometro.comunicazione.line.se</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <form string="Quado SE - Linea">
+                   	<group>
+	                    <group colspan="4">
+	                    	<field name="partner_id"/>
+	                    	<newline/>
+	                    	<field name="codice_identificativo_IVA"/>
+	                    </group>
+	                    <newline/>
+	                    <group string="Persona Giuridica" colspan="4">
+		                    <field name="pg_denominazione"/>
+			                <field name="pg_citta_estera_sede_legale"/>
+			                <field name="pg_codice_stato_estero_domicilio"/>
+			                <field name="pg_indirizzo_sede_legale"/>
+		                </group>
+		                <newline/>
+		                <group string="Persona Fisica" colspan="4">
+		                	<field name="pf_cognome"/>
+	                    	<field name="pf_nome"/>
+	                    	<field name="pf_data_nascita"/>
+	                    	<field name="pf_comune_stato_nascita"/>
+	                    	<field name="pf_provincia_nascita"/>
+	                    	<field name="pf_codice_stato_estero_domicilio"/>
+		                </group>
+	                    <newline/>
+	                   	<group string="Documento" colspan="4">
+	                   		<field name="data_emissione"/>    
+	                   		<field name="data_registrazione"/>    
+	                   		<field name="numero_fattura"/>
+	                   		<newline/>    
+	                   		<field name="importo"/>    
+	                   		<field name="imposta"/>    
+	                   	</group>
+                  	</group>
+                </form>
+            </field>
+          </record>
+         
+    </data>
+</openerp>

=== added directory 'l10n_it_spesometro/wizard'
=== added file 'l10n_it_spesometro/wizard/__init__.py'
--- l10n_it_spesometro/wizard/__init__.py	1970-01-01 00:00:00 +0000
+++ l10n_it_spesometro/wizard/__init__.py	2014-03-19 09:57:51 +0000
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#    
+#    Author: Alessandro Camilli (a.camilli@xxxxxxxx)
+#    Copyright (C) 2014
+#    Associazione OpenERP Italia (<http://www.openerp-italia.org>)
+#
+#    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 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 <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+import wizard_crea_comunicazione
+import wizard_default
+import wizard_export
\ No newline at end of file

=== added file 'l10n_it_spesometro/wizard/wizard_crea_comunicazione.py'
--- l10n_it_spesometro/wizard/wizard_crea_comunicazione.py	1970-01-01 00:00:00 +0000
+++ l10n_it_spesometro/wizard/wizard_crea_comunicazione.py	2014-03-19 09:57:51 +0000
@@ -0,0 +1,128 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#    
+#    Author: Alessandro Camilli (a.camilli@xxxxxxxx)
+#    Copyright (C) 2014
+#    Associazione OpenERP Italia (<http://www.openerp-italia.org>)
+#
+#    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 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 <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+from osv import fields,osv
+from tools.translate import _
+import time 
+
+class wizard_crea_comunicazione(osv.osv_memory):
+    
+    def default_get(self, cr, uid, fields, context=None):
+        
+        res = super(wizard_crea_comunicazione, self).default_get(cr, uid, fields, context=context)
+        
+        res['periodo'] = 'anno'
+        res['anno'] = int(time.strftime('%Y')) -1
+        res['tipo'] = 'ordinaria'
+        res['formato_dati'] = 'aggregati'
+        res['quadro_FA'] = True
+        res['quadro_SA'] = True
+        res['quadro_BL'] = True
+        res['quadro_SE'] = True
+        res['tipo_fornitore'] = '01'
+        
+        return res
+
+    _name = "wizard.spesometro.crea.comunicazione"
+    
+    _columns = {
+        'company_id': fields.many2one('res.company', 'Azienda', required=True ),
+        'periodo': fields.selection((('anno','Annuale'), ('trimestre','Trimestrale'), ('mese','Mensile')),
+                   'Periodo', required=True),
+        'anno' : fields.integer('Anno', size=4, required=True),
+        'trimestre' : fields.integer('Trimestre', size=1 ),
+        'mese' : fields.selection(((1,'Gennaio'), (2,'Febbraio'), (3,'Marzo'), (4,'Aprile'),
+                                   (5,'Maggio'), (6,'Giugno'), (7,'Luglio'), (8,'Agosto'),
+                                   (9,'Settembre'), (10,'Ottobre'), (11,'Novembre'), (12,'Dicembre'),
+                                   ),'Mese'),
+        
+        'tipo': fields.selection((('ordinaria','Ordinaria'), ('sostitutiva','Sostitutiva'), ('annullamento','Annullamento')),
+                   'Tipo comunicazione', required=True),
+        'comunicazione_da_sostituire_annullare': fields.integer('Protocollo comunicaz. da sostituire/annullare'),
+        'documento_da_sostituire_annullare': fields.integer('Protocollo documento da sostituire/annullare'),
+        'formato_dati': fields.selection((('aggregati','Aggregati'),('analitici','Analitici')),'Formato comunicazione', required=True),
+        'tipo_fornitore': fields.selection((('01','Soggetti che inviano la propria comunicazione'), ('10','Intermediari')),
+                   'Tipo fornitore', required=True),
+        'partner_intermediario': fields.many2one('res.partner', 'Intermediario'),
+        'quadro_FA': fields.boolean('Quadro FA', help="Operazioni documentate da fattura esposte in forma aggregata"),
+        'quadro_SA': fields.boolean('Quadro SA', help="Operazioni senza fattura esposte in forma aggregata"),
+        'quadro_BL': fields.boolean('Quadro BL', help="- Operazioni con paesi con fiscalità privilegiata - Operazioni con soggetti non residenti - Acquisti di servizi da soggetti non residenti "),
+        
+        'quadro_FE': fields.boolean('Quadro FE', help="Fatture emesse e Documenti riepilogativi (Operazioni attive)"),
+        'quadro_FR': fields.boolean('Quadro FR', help="Fatture ricevute e Documenti riepilogativi (Operazioni passive)"),
+        'quadro_NE': fields.boolean('Quadro NE', help="Note di variazione emesse"),
+        'quadro_NR': fields.boolean('Quadro NR', help="Note di variazioni ricevute"),
+        'quadro_DF': fields.boolean('Quadro DF', help="Operazioni senza fattura"),
+        'quadro_FN': fields.boolean('Quadro FN', help="Operazioni con soggetti non residenti (Operazioni attive)"),
+        'quadro_SE': fields.boolean('Quadro SE', help="Acquisti di servizi da non residenti e Acquisti da operatori di San Marino"),
+        'quadro_TU': fields.boolean('Quadro TU', help="Operazioni legate al turismo - Art. 3 comma 1 D.L. 16/2012"),
+    }
+    
+    def genera_comunicazione(self, cr, uid, ids, context=None):
+        
+        comunicazione_obj = self.pool.get('spesometro.comunicazione')
+        wizard = self.read(cr, uid, ids)[0]
+        
+        # Quadri richiesti:
+        quadri_richiesti = []
+        if wizard['quadro_FA']:
+            quadri_richiesti.append('FA')
+        if wizard['quadro_SA']:
+            quadri_richiesti.append('SA')
+        if wizard['quadro_BL']:
+            quadri_richiesti.append('BL')
+        if wizard['quadro_FE']:
+            quadri_richiesti.append('FE')
+        if wizard['quadro_FR']:
+            quadri_richiesti.append('FR')
+        if wizard['quadro_NE']:
+            quadri_richiesti.append('NE')
+        if wizard['quadro_NR']:
+            quadri_richiesti.append('NR')
+        if wizard['quadro_DF']:
+            quadri_richiesti.append('DF')
+        if wizard['quadro_FN']:
+            quadri_richiesti.append('FN')
+        if wizard['quadro_SE']:
+            quadri_richiesti.append('SE')
+        if wizard['quadro_TU']:
+            quadri_richiesti.append('TU')
+                
+        params ={
+               'company_id': wizard['company_id'][0],
+               'periodo': wizard['periodo'], 
+               'anno': wizard['anno'], 
+               'trimestre': wizard['trimestre'], 
+               'mese': wizard['mese'], 
+               'tipo': wizard['tipo'], 
+               'comunicazione_da_sostituire_annullare': wizard['comunicazione_da_sostituire_annullare'], 
+               'documento_da_sostituire_annullare': wizard['documento_da_sostituire_annullare'], 
+               'formato_dati': wizard['formato_dati'], 
+               'tipo_fornitore': wizard['tipo_fornitore'], 
+               'partner_intermediario': wizard['partner_intermediario'], 
+               'quadri_richiesti': quadri_richiesti, 
+               }
+        comunicazione_obj.genera_comunicazione(cr, uid, params, context=None)
+        
+        return {
+            'type': 'ir.actions.act_window_close',
+        }

=== added file 'l10n_it_spesometro/wizard/wizard_crea_comunicazione_view.xml'
--- l10n_it_spesometro/wizard/wizard_crea_comunicazione_view.xml	1970-01-01 00:00:00 +0000
+++ l10n_it_spesometro/wizard/wizard_crea_comunicazione_view.xml	2014-03-19 09:57:51 +0000
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data>
+
+        <record id="wizard_spesometro_crea_comunicazione" model="ir.ui.view">
+            <field name="name">Crea comunicazione</field>
+            <field name="model">wizard.spesometro.crea.comunicazione</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <form string="Dati comunicazione">
+                    <field name="company_id"/>
+                    <newline/>
+                    <field name="tipo_fornitore"/>
+                    <field name="partner_intermediario" attrs="{'invisible': [('tipo_fornitore', '=', '01')], 'required': [('tipo_fornitore', '=', '10')]}"/>
+                    <newline/>
+                    <separator colspan="4"/>
+                    <field name="periodo"/>
+                    <field name="anno"/>
+                    <field name="trimestre" attrs="{'invisible': [('periodo', '!=', 'trimestre')], 'required': [('periodo', '=', 'trimestre')]}"/>
+                    <field name="mese" attrs="{'invisible': [('periodo', '!=', 'mese')], 'required': [('periodo', '=', 'mese')]}"/>
+                    <separator colspan="4"/>
+                    <field name="tipo"/>
+                    <field name="comunicazione_da_sostituire_annullare" attrs="{'invisible': [('tipo', '=', 'ordinaria')]}" />
+                    <field name="documento_da_sostituire_annullare" attrs="{'invisible': [('tipo', '=', 'ordinaria')]}"/>
+                    <field name="formato_dati"/>
+                    <newline/>
+                    <group colspan="2">
+                        <field name="quadro_FA" attrs="{'invisible': [('formato_dati', '!=', 'aggregati')]}" />
+                        <field name="quadro_SA" attrs="{'invisible': [('formato_dati', '!=', 'aggregati')]}" />
+                        
+	        			<field name="quadro_SE" attrs="{'invisible': [('formato_dati', '!=', 'analitici')]}"/>
+	        			<field name="quadro_FE" attrs="{'invisible': [('formato_dati', '!=', 'analitici')]}" readonly="1"/>
+	        			<field name="quadro_FR" attrs="{'invisible': [('formato_dati', '!=', 'analitici')]}" readonly="1"/>
+	        			<field name="quadro_NE" attrs="{'invisible': [('formato_dati', '!=', 'analitici')]}" readonly="1"/>
+                    </group>
+                    <group colspan="2">
+                        <field name="quadro_BL" attrs="{'invisible': [('formato_dati', '!=', 'aggregati')]}" />
+                        
+                        <field name="quadro_NR" attrs="{'invisible': [('formato_dati', '!=', 'analitici')]}" readonly="1"/>
+	        			<field name="quadro_DF" attrs="{'invisible': [('formato_dati', '!=', 'analitici')]}" readonly="1"/>
+	        			<field name="quadro_FN" attrs="{'invisible': [('formato_dati', '!=', 'analitici')]}" readonly="1"/>
+	        			<field name="quadro_TU" attrs="{'invisible': [('formato_dati', '!=', 'analitici')]}" readonly="1"/>
+                    </group>
+                    <group colspan="4">
+                        <separator colspan="4"/>
+                        <button icon="gtk-cancel" special="cancel" string="Cancel"/>
+                        <button icon="gtk-ok" name="genera_comunicazione" string="Crea" type="object"/>
+                    </group>
+                </form>
+            </field>
+        </record>
+        
+      	<record id="wizard_spesometro_crea_comunicazione_action" model="ir.actions.act_window">
+            <field name="name">Nuova comunicazione</field>
+            <field name="type">ir.actions.act_window</field>
+            <field name="res_model">wizard.spesometro.crea.comunicazione</field>
+            <field name="view_type">form</field>
+            <field name="view_mode">form</field>
+            <field name="target">new</field>
+            <field name="view_id" ref="wizard_spesometro_crea_comunicazione"/>
+            <!-- <field name="search_view_id" ref="spesometro_comunicazione_search" /> -->
+        </record>
+         
+        <menuitem id="menu_spesometro_crea_comunicazione" action="wizard_spesometro_crea_comunicazione_action"
+            name="Nuova comunicazione" parent="menu_spesometro_main"/>
+    </data>
+</openerp>

=== added file 'l10n_it_spesometro/wizard/wizard_default.py'
--- l10n_it_spesometro/wizard/wizard_default.py	1970-01-01 00:00:00 +0000
+++ l10n_it_spesometro/wizard/wizard_default.py	2014-03-19 09:57:51 +0000
@@ -0,0 +1,65 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#    
+#    Author: Alessandro Camilli (a.camilli@xxxxxxxx)
+#    Copyright (C) 2014
+#    Associazione OpenERP Italia (<http://www.openerp-italia.org>)
+#
+#    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 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 <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+from osv import fields,osv
+from tools.translate import _
+import time
+
+class wizard_spesometro_default(osv.osv_memory):
+    
+    def default_get(self, cr, uid, fields, context=None):
+        
+        res = super(wizard_spesometro_default, self).default_get(cr, uid, fields, context=context)
+        res = {
+               'partner_spesometro_escludi' : False,
+               'partner_spesometro_operazione' : 'FA'
+               }
+        return res
+
+    _name = "wizard.spesometro.default"
+    
+    _columns = {
+        'partner_spesometro_escludi': fields.boolean('Da Escludere'),
+        'partner_spesometro_operazione': fields.selection((('FA','Operazioni documentate da fattura'), 
+                                  ('SA','Operazioni senza fattura'),
+                                  ('BL1','Operazioni con paesi con fiscalit� privilegiata'),
+                                  ('BL2','Operazioni con soggetti non residenti'),
+                                  ('BL3','Acquisti di servizi da soggetti non residenti')),
+                   'Operazione' ),
+    }
+    
+    
+    def setting_default(self, cr, uid, ids, context=None):
+        
+        partners_obj = self.pool.get('res.partner')
+        wizard = self.read(cr, uid, ids)[0]
+        vals = {
+            'spesometro_escludi': wizard.get('partner_spesometro_escludi'),
+            'spesometro_operazione': wizard.get('partner_spesometro_operazione'),
+            }
+        
+        partners_ids = partners_obj.search(cr, uid, [('id','!=', 0)], context=context)
+        partners_obj.write(cr, uid, partners_ids, vals)
+        
+        return {
+            'type': 'ir.actions.act_window_close',
+        }

=== added file 'l10n_it_spesometro/wizard/wizard_default_view.xml'
--- l10n_it_spesometro/wizard/wizard_default_view.xml	1970-01-01 00:00:00 +0000
+++ l10n_it_spesometro/wizard/wizard_default_view.xml	2014-03-19 09:57:51 +0000
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data>
+
+        <record id="wizard_spesometro_default_view" model="ir.ui.view">
+            <field name="name">Spesometro default</field>
+            <field name="model">wizard.spesometro.default</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <form string="Dati comunicazione">
+                    <group string="Partner">
+                    <field name="partner_spesometro_escludi"/>
+                    <field name="partner_spesometro_operazione"/>
+                    </group>
+                    
+                    <newline/>
+                    <group colspan="4">
+                        <separator colspan="4"/>
+                        <button icon="gtk-cancel" special="cancel" string="Cancel"/>
+                        <button icon="gtk-ok" name="setting_default" string="Imposta default" type="object"/>
+                    </group>
+                </form>
+            </field>
+        </record>
+        
+      	<record id="wizard_spesometro_default_action" model="ir.actions.act_window">
+            <field name="name">Spesometro default</field>
+            <field name="type">ir.actions.act_window</field>
+            <field name="res_model">wizard.spesometro.default</field>
+            <field name="view_type">form</field>
+            <field name="view_mode">form</field>
+            <field name="target">new</field>
+            <field name="view_id" ref="wizard_spesometro_default_view"/>
+        </record>
+         
+        <menuitem id="menu_spesometro_default" action="wizard_spesometro_default_action"
+            name="Impostazione Default" parent="menu_spesometro_main"/>
+    </data>
+</openerp>

=== added file 'l10n_it_spesometro/wizard/wizard_export.py'
--- l10n_it_spesometro/wizard/wizard_export.py	1970-01-01 00:00:00 +0000
+++ l10n_it_spesometro/wizard/wizard_export.py	2014-03-19 09:57:51 +0000
@@ -0,0 +1,706 @@
+# -*- coding: utf-8 -*-
+#################################################################################
+#    Author: Alessandro Camilli (a.camilli@xxxxxxxx)
+#    Copyright (C) 2014
+#    Associazione OpenERP Italia (<http://www.openerp-italia.org>)
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU 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 General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+from osv import fields,osv
+from tools.translate import _
+from datetime import datetime
+from StringIO import StringIO
+import base64
+from decimal import *
+
+class wizard_spesometro_export(osv.osv_memory):
+    
+    _name = "wizard.spesometro.export"
+    _description = 'Use this wizard to export fiscal file'
+    _columns={
+        'file_spesometro': fields.binary('File spesometro', readonly=True),
+    }
+    
+    def _split_string_positional_field(self, string):
+        '''
+        Da manuale:
+        Con riferimento ai campi non posizionali, nel caso in cui la lunghezza del dato da inserire 
+        ecceda i 16 caratteri disponibili, dovrà essere inserito un ulteriore elemento con un identico 
+        campo-codice e con un campo-valore il cui primo carattere dovrà essere impostato con il simbolo “+”, 
+        mentre i successivi quindici potranno essere utilizzati per la continuazione del dato da inserire. 
+        Tale situazione può verificarsi solo per alcuni campi con formato AN.
+        '''
+        # Prima parte:
+        res = []
+        res.append(string[:16])
+        length = 15
+        # Parte in eccesso:
+        str_eccesso = string[16:]
+        str_split = [str_eccesso[i:i+length] for i in range(0, len(str_eccesso), length)]
+        for s in str_split:
+            new_string = '+' + s
+            res.append(new_string)
+        return res
+    
+    def _record_A(self, cr, uid, comunicazione, context=None):
+        
+        if not comunicazione.soggetto_trasmissione_codice_fiscale:
+            raise osv.except_osv(_('Errore comunicazione!'),_("Manca il codice fiscale dell'incaricato alla trasmissione"))
+        
+        rcd = "A"
+        rcd += '{:14s}'.format("") # Filler 
+        rcd += "NSP00" # codice fornitura 
+        rcd += comunicazione.tipo_fornitore # 01 - Soggetti che inviano la propria comunicazione 10 -Intermediari
+        rcd += '{:16s}'.format(comunicazione.soggetto_trasmissione_codice_fiscale) # cd fiscale  (se intermediaro va messo quello dell'intermediario)
+        rcd += '{:483s}'.format("")# Filler 
+        #rcd += '{:4s}'.format(str(comunicazione.progressivo_telematico).zfill(4)) # dich.su più invii: Progressivo dell'invio telematico 
+        rcd += '{:4s}'.format("0".zfill(4)) # dich.su più invii: Progressivo dell'invio telematico 
+        rcd += '{:4s}'.format("0".zfill(4)) # dich.su più invii: Numero totale degli invii telematici
+        rcd += '{:100s}'.format("") # Filler 
+        rcd += '{:1068s}'.format("") # Filler
+        rcd += '{:200s}'.format("") # Filler 
+        rcd += "A" # Impostare al valore "A"
+        rcd += "\r" # 
+        rcd += "\n" # 
+        
+        return rcd
+
+    def _record_B(self, cr, uid, comunicazione, context=None):
+        rcd = "B"
+        rcd += '{:16s}'.format(comunicazione.soggetto_codice_fiscale)    
+        rcd += '{:8s}'.format("1".zfill(8)) # Progressivo modulo - vale 1    
+        rcd += '{:3s}'.format("") #  Spazio a disposizione dell'utente
+        rcd += '{:25s}'.format("")  # Filler 
+        rcd += '{:20s}'.format("")  #  Spazio a disposizione dell'utente
+        rcd += '{:16s}'.format("")  #  Identificativo del produttore del software (codice fiscale)
+        # tipo comunicazione ( alterntative: ordinaria,sostitutiva o  di annullamento )
+        if comunicazione.tipo == 'ordinaria':
+            rcd += "1" 
+        else:
+            rcd += "0"
+        if comunicazione.tipo == 'sostitutiva':
+            rcd += "1" 
+        else:
+            rcd += "0"
+        if comunicazione.tipo == 'annullamento':
+            rcd += "1" 
+        else:
+            rcd += "0"
+        # campi x annullamento e sostituzione
+        if comunicazione.comunicazione_da_sostituire_annullare == 0:
+            rcd += '{:17s}'.format("".zfill(17))
+        else: 
+            rcd += '{:17s}'.format(str(comunicazione_da_sostituire_annullare).zfill(17))
+        if comunicazione.documento_da_sostituire_annullare == 0:
+            rcd += '{:6s}'.format("".zfill(6))
+        else:
+            rcd += '{:6s}'.format(str(comunicazione.documento_da_sostituire_annullare).zfill(6))
+        # formato dati: aggregata o analitica (caselle alternative)
+        if comunicazione.formato_dati == 'aggregati':
+            rcd += "10" 
+        else:
+            rcd += "01" 
+        # Quadri compilati
+        if comunicazione.line_FA_ids :
+            rcd += "1" 
+        else:
+            rcd += "0"
+        if comunicazione.line_SA_ids :
+            rcd += "1" 
+        else:
+            rcd += "0"
+        if comunicazione.line_BL_ids :
+            rcd += "1" 
+        else:
+            rcd += "0"
+        #if comunicazione.quadro_FE :
+        #    rcd += "1" 
+        #else:
+        rcd += "0"  
+        #if comunicazione.quadro_FR :
+        #    rcd += "1" 
+        #else:
+        rcd += "0"
+        #if comunicazione.quadro_NE :
+        #    rcd += "1" 
+        #else:
+        rcd += "0"  
+        #if comunicazione.quadro_NR :
+        #    rcd += "1" 
+        #else:
+        rcd += "0"
+        #if comunicazione.quadro_DF :
+        #    rcd += "1" 
+        #else:
+        rcd += "0"
+        #if comunicazione.quadro_FN :
+        #    rcd += "1" 
+        #else:
+        rcd += "0"  
+        if comunicazione.line_SE_ids :
+            rcd += "1" 
+        else:
+            rcd += "0"
+        #if comunicazione.quadro_TU :
+        #    rcd += "1" 
+        #else:
+        rcd += "0"  
+        
+        rcd += "1" #  Quadro TA  - RIEPILOGO
+        #Partita IVA , Codice Attività e riferimenti del Soggetto cui si riferisce la comunicazione
+        rcd += '{:11s}'.format(comunicazione.soggetto_partitaIVA) # PARTITA IVA
+        if not comunicazione.soggetto_codice_attivita:
+                raise osv.except_osv(_('Errore comunicazione!'),_("Manca il codice attività"))
+        rcd += '{:6s}'.format(comunicazione.soggetto_codice_attivita) # CODICE attività  (6 caratteri) --> obbligatorio
+        tel = comunicazione.soggetto_telefono
+        rcd += '{:12s}'.format(tel.replace(' ','') or '') # telefono
+        fax = comunicazione.soggetto_fax
+        rcd += '{:12s}'.format(fax.replace(' ','') or '') # fax
+        rcd += '{:50s}'.format(comunicazione.soggetto_email or '') # ind posta elettronica
+        # Dati Anagrafici del Soggetto cui si riferisce la comunicazione - Persona Fisica
+        if comunicazione.soggetto_forma_giuridica == 'persona_fisica':
+            if not comunicazione.soggetto_pf_cognome or not comunicazione.soggetto_pf_nome or not comunicazione.soggetto_pf_sesso \
+                or not comunicazione.soggetto_pf_data_nascita or not comunicazione.soggetto_pf_comune_nascita or not comunicazione.soggetto_pf_provincia_nascita:
+                raise osv.except_osv(_('Errore comunicazione!'),_("Soggetto obbligato: Inserire tutti i dati della persona fisica"))
+            rcd += '{:24s}'.format(comunicazione.soggetto_pf_cognome)  # cognome
+            rcd += '{:20s}'.format(comunicazione.soggetto_pf_nome)  # nome
+            rcd += '{:1s}'.format(comunicazione.soggetto_pf_sesso) # sesso
+            rcd += '{:8s}'.format(datetime.strptime(comunicazione.soggetto_pf_data_nascita, "%Y-%m-%d").strftime("%d%m%Y")) # data nascita
+            rcd += '{:40s}'.format(comunicazione.soggetto_pf_comune_nascita)  # comune di nascita
+            rcd += '{:2s}'.format(comunicazione.soggetto_pf_provincia_nascita) # provincia comune di nascita
+            rcd += '{:60s}'.format("") # persona giuridica
+        else:
+            if not comunicazione.soggetto_pg_denominazione:
+                raise osv.except_osv(_('Errore comunicazione!'),_("Soggetto obbligato: Inserire tutti i dati della persona giuridica"))
+            rcd += '{:24s}'.format("")  # cognome
+            rcd += '{:20s}'.format("")  # nome
+            rcd += '{:1s}'.format("") # sesso
+            rcd += '{:8s}'.format("".zfill(8)) # data nascita
+            rcd += '{:40s}'.format("")  # comune di nascita
+            rcd += '{:2s}'.format("") # provincia comune di nascita
+            rcd += '{:60s}'.format(comunicazione.soggetto_pg_denominazione) # persona giuridica
+        
+        rcd += '{:4d}'.format(comunicazione.anno) # anno riferimento
+        # Mese di riferimento : Da valorizzare obbligatoriamente solo se presenti Acquisti da Operatori di San Marino. In tutti gli altri casi non deve essere compilato
+        if comunicazione.periodo == 'trimestre' and comunicazione.trimestre:
+            rcd += '{:2s}'.format( str(comunicazione.trimestre) + "T")
+        elif comunicazione.periodo == 'mese' and comunicazione.mese:
+            rcd += '{:2s}'.format( str(comunicazione.mese).zfill(2))
+        else:
+            rcd += '{:2s}'.format("")  
+        # Dati del Soggetto tenuto alla comunicazione (soggetto che effettua la comunicazione, se diverso dal soggetto cui si riferisce la comunicazione)
+        rcd += '{:16s}'.format(comunicazione.soggetto_cm_codice_fiscale or "") 
+        rcd += '{:2s}'.format(comunicazione.tipo_fornitore or "01") # codice carica 
+        rcd += '{:8s}'.format("".zfill(8)) # data inizio procedura 
+        rcd += '{:8s}'.format("".zfill(8)) # data fine procedura
+        # Dati anagrafici del soggetto tenuto alla comunicazione - Persona fisica
+        # (Obbligatorio e da compilare solo se si tratta di Persona Fisica. )
+        if comunicazione.soggetto_cm_forma_giuridica == 'persona_fisica':
+            if not comunicazione.soggetto_cm_pf_cognome or not comunicazione.soggetto_cm_pf_nome or not comunicazione.soggetto_cm_pf_sesso \
+                or not comunicazione.soggetto_cm_pf_data_nascita or not comunicazione.soggetto_cm_pf_comune_nascita or not comunicazione.soggetto_cm_pf_provincia_nascita:
+                raise osv.except_osv(_('Errore comunicazione!'),_("Soggetto tenuto alla comunicazione: Inserire tutti i dati della persona fisica"))
+            rcd += '{:24s}'.format(comunicazione.soggetto_cm_pf_cognome) # cognome
+            rcd += '{:20s}'.format(comunicazione.soggetto_cm_pf_nome) # nome
+            rcd += '{:1s}'.format(comunicazione.soggetto_cm_pf_sesso)  # sesso
+            rcd += '{:8s}'.format(datetime.strptime(comunicazione.soggetto_cm_pf_data_nascita, "%Y-%m-%d").strftime("%d%m%Y")) # data nascita
+            rcd += '{:40s}'.format(comunicazione.soggetto_cm_pf_comune_nascita) # comune di nascita
+            rcd += '{:2s}'.format(comunicazione.soggetto_cm_pf_provincia_nascita) # provincia comune di nascita
+            rcd += '{:60s}'.format("") # persona giuridica
+        else:
+            if not comunicazione.soggetto_cm_pg_denominazione:
+                raise osv.except_osv(_('Errore comunicazione!'),_("Soggetto tenuto alla comunicazione: Inserire tutti i dati della persona giuridica"))
+            rcd += '{:24s}'.format("") # cognome
+            rcd += '{:20s}'.format("") # nome
+            rcd += '{:1s}'.format("")  # sesso
+            rcd += '{:8s}'.format("".zfill(8)) # data nascita
+            rcd += '{:40s}'.format("") # comune di nascita
+            rcd += '{:2s}'.format("") # provincia comune di nascita
+            rcd += '{:60s}'.format(comunicazione.soggetto_cm_pg_denominazione) # persona giuridica
+            
+        # Impegno alla trasmissione telematica
+        if comunicazione.tipo_fornitore == '10' and not comunicazione.soggetto_trasmissione_codice_fiscale:
+            raise osv.except_osv(_('Errore comunicazione!'),_("Manca il codice fiscale dell'intermediario incaricato alla trasmissione telematica"))
+        rcd += '{:16s}'.format(comunicazione.soggetto_trasmissione_codice_fiscale or '') # Codice fiscale dell'intermediario 
+        rcd += '{:5s}'.format(str(comunicazione.soggetto_trasmissione_numero_CAF).zfill(5)) # Numero di iscrizione all'albo del C.A.F.
+        rcd += '{:1s}'.format(comunicazione.soggetto_trasmissione_impegno)# Impegno a trasmettere in via telematica la comunicazione 
+                    # Dato obbligatorio Vale 1 se la comunicazione è stata predisposta dal soggetto obbligato
+                    # Vale 2 se è stata predisposta dall'intermediario. 
+        rcd += '{:1s}'.format("") # Filler
+        if not comunicazione.soggetto_trasmissione_data_impegno:
+            raise osv.except_osv(_('Errore comunicazione!'),_("Manca la data dell'impegno alla trasmissione"))
+        rcd += '{:8s}'.format(datetime.strptime(comunicazione.soggetto_trasmissione_data_impegno, "%Y-%m-%d").strftime("%d%m%Y")) # Data dell'impegno
+        # Spazio riservato al Servizio telematico
+        rcd += '{:1258s}'.format("") # Filler
+        rcd += '{:20s}'.format("") # Spazio riservato al Servizio Telematico 
+        rcd += '{:18s}'.format("") # Filler
+        # Ultimi caratteri di controllo
+        rcd += "A"  # Impostare al valore "A"
+        rcd += "\r" # 
+        rcd += "\n" # 
+        
+        return rcd
+        
+    def _record_C_FA(self, cr, uid, line, prog_modulo, prog_sezione, context=None):
+        prog_sezione = str(prog_sezione).zfill(3)
+        
+        rcd = "C"
+        rcd += '{:16s}'.format(line.comunicazione_id.soggetto_codice_fiscale) # codice fiscale soggetto obbligato
+        rcd += '{:8s}'.format(str(prog_modulo).zfill(8)) # Progressivo modulo 
+        rcd += '{:3s}'.format("") # Filler 
+        rcd += '{:25s}'.format("") # Filler 
+        rcd += '{:20s}'.format("") # Spazio utente 
+        rcd += '{:16s}'.format("") # Filler 
+        
+        # QUADRO FA
+        # Partita iva o codice fiscale presenti se non si tratta di documento riepilogativo(ES: scheda carburante)
+        if not line.partita_iva and not line.codice_fiscale and not line.documento_riepilogativo:
+            raise osv.except_osv(_('Errore comunicazione!'),_("Inserire Codice Fiscale o partita IVA su partner %s") % (line.partner_id.name,))
+        # Doc. riepilogativo : non ammessi codice fiscale o partita iva
+        if line.documento_riepilogativo and (line.partita_iva or line.codice_fiscale) :
+            raise osv.except_osv(_('Errore comunicazione!'),_("Documento riepilogativo per partner %s, togliere Codice Fiscale E partita IVA") % (line.partner_id.name,))
+        
+        if line.partita_iva:
+            rcd += '{:8s}'.format("FA" + prog_sezione + "001" )
+            rcd += '{:16s}'.format(line.partita_iva) 
+        elif line.codice_fiscale:
+            rcd += '{:8s}'.format("FA" + prog_sezione + "002" )
+            rcd += '{:16s}'.format(line.codice_fiscale)
+        if line.documento_riepilogativo:
+            rcd += '{:8s}'.format("FA" + prog_sezione + "003" ) + '{:>16s}'.format('1')
+        # Numero operazioni attive aggregate 
+        if line.numero_operazioni_attive_aggregate > 0:
+            rcd += '{:8s}'.format("FA" + prog_sezione + "004" ) + '{:16d}'.format(line.numero_operazioni_attive_aggregate)
+        # Numero operazioni passive aggregate 
+        if line.numero_operazioni_passive_aggregate > 0:
+            rcd += '{:8s}'.format("FA" + prog_sezione + "005" ) + '{:16d}'.format(line.numero_operazioni_passive_aggregate)
+        # Noleggio / Leasing
+        if line.noleggio:
+            rcd += '{:8s}'.format("FA" + prog_sezione + "006" ) + '{:16s}'.format(line.noleggio)
+            
+        # OPERAZIONI ATTIVE
+        if line.attive_imponibile_non_esente > 0:
+            rcd += '{:8s}'.format("FA" + prog_sezione + "007" ) + '{:16.0f}'.format(line.attive_imponibile_non_esente)
+        # Totale imposta
+        if line.attive_imposta > 0:
+            rcd += '{:8s}'.format("FA" + prog_sezione + "008" ) + '{:16.0f}'.format(line.attive_imposta)
+        # Totale operazioni con IVA non esposta
+        if line.attive_operazioni_iva_non_esposta > 0:
+            rcd += '{:8s}'.format("FA" + prog_sezione + "009" ) + '{:16.0f}'.format(line.attive_operazioni_iva_non_esposta)
+        # Totale note di variazione a debito per la controparte
+        if line.attive_note_variazione > 0:
+            rcd += '{:8s}'.format("FA" + prog_sezione + "010" ) + '{:16.0f}'.format(line.attive_note_variazione)
+        if line.attive_note_variazione_imposta > 0:
+            rcd += '{:8s}'.format("FA" + prog_sezione + "011" ) + '{:16.0f}'.format(line.attive_note_variazione_imposta)
+        
+        # OPERAZIONI PASSIVE
+        # Totale operazioni imponibili, non imponibili ed esenti
+        if line.passive_imponibile_non_esente > 0:
+            rcd += '{:8s}'.format("FA" + prog_sezione + "012" ) + '{:16.0f}'.format(line.passive_imponibile_non_esente)
+        if line.passive_imposta > 0:
+            rcd += '{:8s}'.format("FA" + prog_sezione + "013" ) + '{:16.0f}'.format(line.passive_imposta)
+        if line.passive_operazioni_iva_non_esposta > 0:
+            rcd += '{:8s}'.format("FA" + prog_sezione + "014" ) + '{:16.0f}'.format(line.passive_operazioni_iva_non_esposta)
+        if line.passive_note_variazione > 0:
+            rcd += '{:8s}'.format("FA" + prog_sezione + "015" ) + '{:16.0f}'.format(line.passive_note_variazione)
+        if line.passive_note_variazione_imposta > 0:
+            rcd += '{:8s}'.format("FA" + prog_sezione + "016" ) + '{:16.0f}'.format(line.passive_note_variazione_imposta)
+
+        # riempio fino a 1900 caratteri
+        rcd += " " * (1897 -len(rcd))
+        # Ultimi caratteri di controllo
+        rcd += "A"  # Impostare al valore "A"
+        rcd += "\r" # 
+        rcd += "\n" # 
+        
+        return rcd
+    
+    def _record_C_SA(self, cr, uid, line, prog_modulo, prog_sezione, context=None):
+        prog_sezione = str(prog_sezione).zfill(3)
+        
+        if not line.codice_fiscale:
+            raise osv.except_osv(_('Errore comunicazione!'),_("Manca codice fiscale su partner %s") % (line.partner_id.name,))
+        rcd = "C"
+        rcd += '{:16s}'.format(line.comunicazione_id.soggetto_codice_fiscale) # codice fiscale soggetto obbligato
+        rcd += '{:8s}'.format(str(prog_modulo).zfill(8)) # Progressivo modulo 
+        rcd += '{:3s}'.format("") # Filler 
+        rcd += '{:25s}'.format("") # Filler 
+        rcd += '{:20s}'.format("") # Spazio utente 
+        rcd += '{:16s}'.format("") # Filler 
+        
+        rcd += '{:8s}'.format("SA" + prog_sezione + "001" ) + '{:16s}'.format(line.codice_fiscale)
+        if line.numero_operazioni:
+            rcd += '{:8s}'.format("SA" + prog_sezione + "002" ) + '{:16d}'.format(line.numero_operazioni)
+        if line.importo_complessivo:
+            rcd += '{:8s}'.format("SA" + prog_sezione + "003" ) + '{:16.0f}'.format(line.importo_complessivo) 
+        if line.noleggio:
+            rcd += '{:8s}'.format("SA" + prog_sezione + "004" ) + '{:16s}'.format(line.noleggio) 
+
+        # riempio fino a 1900 caratteri
+        rcd += " " * (1897 -len(rcd))
+        # Ultimi caratteri di controllo
+        rcd += "A"  # Impostare al valore "A"
+        rcd += "\r" # 
+        rcd += "\n" # 
+        
+        return rcd
+    
+    def _record_C_BL(self, cr, uid, line, prog_modulo, prog_sezione, context=None):
+        
+        prog_sezione = str(prog_sezione).zfill(3)
+        
+        # Controlli
+        # ...Operazioni con paesi con fiscalità privilegiata (è obbligatorio compilare le sezioni BL001, BL002 e almeno un campo delle sezioni BL003, BL004, BL005, BL006, BL007, BL008)
+        if line.operazione_fiscalita_privilegiata:
+            if (not line.pf_cognome or not line.pf_nome) and not line.pg_denominazione:
+                raise osv.except_osv(_("Errore quadro BL"), _(" - Partner %s! Cognome e nome obbligatori oppure ragione sociale per soggetto giuridico") % (line.partner_id.name ,) )
+        # ...Operazioni con soggetti non residenti (è obbligatorio compilare le sezioni BL001, BL002 e almeno un campo delle sezioni BL003 e BL006)
+        if line.operazione_con_soggetti_non_residenti:
+            if (not line.pf_cognome or not line.pf_nome) and not line.pg_denominazione:
+                raise osv.except_osv(_("Errore quadro BL"), _(" - Partner %s! Cognome e nome obbligatori oppure ragione sociale per soggetto giuridico") % (line.partner_id.name ,) )
+            if line.pf_cognome and not line.pf_data_nascita and not line.pf_codice_stato_estero:
+                raise osv.except_osv(_("Errore quadro BL - Partner %s! Inserire alemno uno dei seguenti valori: \
+                    Pers.Fisica-Data di nascita, Pers.Fisica-Codice Stato") % (line.partner_id.name ,) )
+        # ...Acquisti di servizi da soggetti non residenti (è obbligatorio compilare le sezioni BL001, BL002 e almeno un campo della sezione BL006) 
+        if line.Acquisto_servizi_da_soggetti_non_residenti:
+            if (not line.pf_cognome or not line.pf_nome) and not line.pg_denominazione:
+                raise osv.except_osv(_("Errore quadro BL"), _(" - Partner %s! Cognome e nome obbligatori oppure ragione sociale per soggetto giuridico") % (line.partner_id.name ,) )
+            if line.pf_cognome and not line.pf_data_nascita and not line.pf_codice_stato_estero:
+                raise osv.except_osv(_("Errore quadro BL"), _(" - Partner %s! Inserire alemno uno dei seguenti valori: \
+                    Pers.Fisica-Data di nascita, Pers.Fisica-Codice Stato") % (line.partner_id.name ,) )
+        
+        rcd = "C"
+        rcd += '{:16s}'.format(line.comunicazione_id.soggetto_codice_fiscale) # codice fiscale soggetto obbligato
+        rcd += '{:8s}'.format(str(prog_modulo).zfill(8)) # Progressivo modulo 
+        rcd += '{:3s}'.format("") # Filler 
+        rcd += '{:25s}'.format("") # Filler 
+        rcd += '{:20s}'.format("") # Spazio utente 
+        rcd += '{:16s}'.format("") # Filler 
+        
+        # Dati anagrafici
+        # .. persona fisica
+        if line.pf_cognome:
+            if not line.pf_nome or not line.pf_data_nascita or not line.pf_comune_stato_nascita or not line.pf_provincia_nascita \
+                or not line.pf_codice_stato_estero:
+                raise osv.except_osv('Error', _('Completare dati persona fisica nel quadro BL del partner: %s') %(line.partner_id.name,))
+            str_split = self._split_string_positional_field(line.pf_cognome)
+            for s in str_split:
+                rcd += '{:8s}'.format("BL" + "001" + "001" ) + '{:16s}'.format(s)
+            str_split = self._split_string_positional_field(line.pf_nome)
+            for s in str_split:
+                rcd += '{:8s}'.format("BL" + "001" + "002" )  + '{:16s}'.format(s)
+            rcd += '{:8s}'.format("BL" + "001" + "003" ) + '{:16s}'.format(datetime.strptime(line.pf_data_nascita, "%Y-%m-%d").strftime("%d%m%Y")) # Data di nascita
+            str_split = self._split_string_positional_field(line.pf_comune_stato_nascita)
+            for s in str_split:
+                rcd += '{:8s}'.format("BL" + "001" + "004" ) + '{:16s}'.format(s)
+            rcd += '{:8s}'.format("BL" + "001" + "005" ) + '{:16s}'.format(line.pf_provincia_nascita)
+            rcd += '{:8s}'.format("BL" + "001" + "006" ) + '{:>16s}'.format(line.pf_codice_stato_estero)
+        # .. persona giuridica
+        if line.pg_denominazione:
+            if not line.pg_citta_estera_sede_legale or not line.pg_codice_stato_estero or not line.pg_indirizzo_sede_legale:
+                raise osv.except_osv('Error', _('Completare dati persona giuridica nel quadro BL del partner: %s : Citta estera - Codice Stato estero - Indirizzo') %(line.partner_id.name,))
+            str_split = self._split_string_positional_field(line.pg_denominazione)
+            for s in str_split:
+                rcd += '{:8s}'.format("BL" + "001" + "007" ) + '{:16s}'.format(s)
+            str_split = self._split_string_positional_field(line.pg_citta_estera_sede_legale)
+            for s in str_split:
+                rcd += '{:8s}'.format("BL" + "001" + "008" ) + '{:16s}'.format(s)
+            rcd += '{:8s}'.format("BL" + "001" + "009" ) + '{:>16s}'.format(line.pg_codice_stato_estero)
+            str_split = self._split_string_positional_field(line.pg_indirizzo_sede_legale)
+            for s in str_split:
+                rcd += '{:8s}'.format("BL" + "001" + "010" ) + '{:16s}'.format(s)
+        # Codice identificativo IVA
+        if line.codice_identificativo_IVA:
+            rcd += '{:8s}'.format("BL" + "002" + "001" ) + '{:16s}'.format(line.codice_identificativo_IVA or '')
+        # Operazioni con paesi con fiscalità privilegiata
+        rcd += '{:8s}'.format("BL" + "002" + "002" )
+        if line.operazione_fiscalita_privilegiata:
+            rcd += '{:>16s}'.format("1")
+        else:
+            rcd += '{:>16s}'.format("0")
+            
+        # Operazioni con soggetti non residenti
+        rcd += '{:8s}'.format("BL" + "002" + "003" ) 
+        if line.operazione_con_soggetti_non_residenti:
+            rcd += '{:>16s}'.format("1")
+        else:
+            rcd += '{:>16s}'.format("0")
+        # Acquisti di servizi da soggetti non residenti
+        rcd += '{:8s}'.format("BL" + "002" + "004" )
+        if line.Acquisto_servizi_da_soggetti_non_residenti:
+            rcd += '{:>16s}'.format("1")
+        else:
+            rcd += '{:>16s}'.format("0")
+            
+            
+        # OPERAZIONI ATTIVE
+        if line.attive_importo_complessivo > 0:
+            rcd += '{:8s}'.format("BL" + "003" + "001" ) + '{:16.0f}'.format(line.attive_importo_complessivo)
+        if line.attive_imposta > 0:
+            rcd += '{:8s}'.format("BL" + "003" + "002" ) + '{:16.0f}'.format(line.attive_imposta)
+        
+        if line.operazione_fiscalita_privilegiata:
+            if line.attive_non_sogg_cessione_beni > 0:
+                rcd += '{:8s}'.format("BL" + "004" + "001" ) + '{:16.0f}'.format(line.attive_non_sogg_cessione_beni)
+            if line.attive_non_sogg_servizi > 0:
+                rcd += '{:8s}'.format("BL" + "004" + "002" ) + '{:16.0f}'.format(line.attive_non_sogg_servizi)
+            if line.attive_note_variazione > 0:
+                rcd += '{:8s}'.format("BL" + "005" + "001" ) + '{:16.0f}'.format(line.attive_note_variazione)
+            if line.attive_note_variazione_imposta > 0:
+                rcd += '{:8s}'.format("BL" + "005" + "002" ) + '{:16.0f}'.format(line.attive_note_variazione_imposta)
+        
+        # OPERAZIONI PASSIVE
+        if line.passive_importo_complessivo > 0:
+            rcd += '{:8s}'.format("BL" + "006" + "001" ) + '{:16.0f}'.format(line.passive_importo_complessivo)
+        if line.passive_imposta > 0:
+            rcd += '{:8s}'.format("BL" + "006" + "002" ) + '{:16.0f}'.format(line.passive_imposta)
+        
+        if line.operazione_fiscalita_privilegiata:
+            if line.passive_non_sogg_importo_complessivo > 0:
+                rcd += '{:8s}'.format("BL" + "007" + "001" ) + '{:16.0f}'.format(line.passive_non_sogg_importo_complessivo)
+            if line.passive_note_variazione > 0:
+                rcd += '{:8s}'.format("BL" + "008" + "001" ) + '{:16.0f}'.format(line.passive_note_variazione)
+            if line.passive_note_variazione_imposta > 0:
+                rcd += '{:8s}'.format("BL" + "008" + "002" ) + '{:16.0f}'.format(line.passive_note_variazione_imposta)
+        
+        # riempio fino a 1900 caratteri
+        rcd += " " * (1897 -len(rcd))
+        # Ultimi caratteri di controllo
+        rcd += "A"  # Impostare al valore "A"
+        rcd += "\r" # 
+        rcd += "\n" # 
+        
+        return rcd
+    
+    def _record_D_SE(self, cr, uid, line, prog_modulo, prog_sezione, context=None):
+        
+        prog_sezione = str(prog_sezione).zfill(3)
+        
+        # Controlli
+        # ...Cognome o Ragione sociale
+        if (not line.pf_cognome or not line.pf_nome) and not line.pg_denominazione:
+            raise osv.except_osv(_("Errore quadro SE"), _(" - Partner %s! Cognome e nome obbligatori oppure ragione sociale per soggetto giuridico") % (line.partner_id.name ,) )
+        # ...
+        if line.pf_cognome and not line.pf_data_nascita and not line.pf_codice_stato_estero:
+            raise osv.except_osv(_("Errore quadro SE - Partner %s! Inserire alemno uno dei seguenti valori: \
+                Pers.Fisica-Data di nascita, Pers.Fisica-Codice Stato") % (line.partner_id.name ,) )
+        
+        rcd = "D"
+        rcd += '{:16s}'.format(line.comunicazione_id.soggetto_codice_fiscale) # codice fiscale soggetto obbligato
+        rcd += '{:8s}'.format(str(prog_modulo).zfill(8)) # Progressivo modulo 
+        rcd += '{:3s}'.format("") # Filler 
+        rcd += '{:25s}'.format("") # Filler 
+        rcd += '{:20s}'.format("") # Spazio utente 
+        rcd += '{:16s}'.format("") # Filler 
+        
+        # Dati anagrafici
+        # .. persona fisica
+        if line.pf_cognome:
+            if not line.pf_nome or not line.pf_data_nascita or not line.pf_comune_stato_nascita or not line.pf_provincia_nascita \
+                or not line.pf_codice_stato_estero:
+                raise osv.except_osv('Error', _('Completare dati persona fisica nel quadro SE del partner: %s') %(line.partner_id.name,))
+            str_split = self._split_string_positional_field(line.pf_cognome)
+            for s in str_split:
+                rcd += '{:8s}'.format("SE" + prog_sezione + "001" ) + '{:16s}'.format(s)
+            str_split = self._split_string_positional_field(line.pf_nome)
+            for s in str_split:
+                rcd += '{:8s}'.format("SE" + prog_sezione + "002" )  + '{:16s}'.format(s)
+            rcd += '{:8s}'.format("SE" + prog_sezione + "003" ) + '{:16s}'.format(datetime.strptime(line.pf_data_nascita, "%Y-%m-%d").strftime("%d%m%Y")) # Data di nascita
+            str_split = self._split_string_positional_field(line.pf_comune_stato_nascita)
+            for s in str_split:
+                rcd += '{:8s}'.format("SE" + prog_sezione + "004" ) + '{:16s}'.format(s)
+            rcd += '{:8s}'.format("SE" + prog_sezione + "005" ) + '{:16s}'.format(line.pf_provincia_nascita)
+            rcd += '{:8s}'.format("SE" + prog_sezione + "006" ) + '{:>16s}'.format(line.pf_codice_stato_estero_domicilio)
+        # .. persona giuridica
+        if line.pg_denominazione:
+            if not line.pg_citta_estera_sede_legale or not line.pg_codice_stato_estero_domicilio or not line.pg_indirizzo_sede_legale:
+                raise osv.except_osv('Error', _('Completare dati persona giuridica nel quadro SE del partner: %s : Citta estera - Codice Stato estero - Indirizzo') %(line.partner_id.name,))
+            str_split = self._split_string_positional_field(line.pg_denominazione)
+            for s in str_split:
+                rcd += '{:8s}'.format("SE" + prog_sezione + "007" ) + '{:16s}'.format(s)
+            str_split = self._split_string_positional_field(line.pg_citta_estera_sede_legale)
+            for s in str_split:
+                rcd += '{:8s}'.format("SE" + prog_sezione + "008" ) + '{:16s}'.format(s)
+            rcd += '{:8s}'.format("SE" + prog_sezione + "009" ) + '{:>16s}'.format(line.pg_codice_stato_estero_domicilio)
+            str_split = self._split_string_positional_field(line.pg_indirizzo_sede_legale)
+            for s in str_split:
+                rcd += '{:8s}'.format("SE" + prog_sezione + "010" ) + '{:16s}'.format(s)
+        # Codice identificativo IVA
+        if line.codice_identificativo_IVA:
+            rcd += '{:8s}'.format("SE" + prog_sezione + "011" ) + '{:16s}'.format(line.codice_identificativo_IVA)
+        # Dati documento
+        rcd += '{:8s}'.format("SE" + prog_sezione + "012" ) + '{:>16s}'.format(datetime.strptime(line.data_emissione, "%Y-%m-%d").strftime("%d%m%Y")) 
+        rcd += '{:8s}'.format("SE" + prog_sezione + "013" ) + '{:>16s}'.format(datetime.strptime(line.data_registrazione, "%Y-%m-%d").strftime("%d%m%Y")) 
+        rcd += '{:8s}'.format("SE" + prog_sezione + "014" ) + '{:16s}'.format(line.numero_fattura) 
+        
+        if line.importo > 0:
+            rcd += '{:8s}'.format("SE" + prog_sezione + "015" ) + '{:16.0f}'.format(line.importo)
+        if line.imposta > 0:
+            rcd += '{:8s}'.format("SE" + prog_sezione + "016" ) + '{:16.0f}'.format(line.imposta)
+        
+        # riempio fino a 1900 caratteri
+        rcd += " " * (1897 -len(rcd))
+        # Ultimi caratteri di controllo
+        rcd += "A"  # Impostare al valore "A"
+        rcd += "\r" # 
+        rcd += "\n" # 
+        
+        return rcd
+    
+   
+    def _record_E(self, cr, uid, comunicazione, prog_modulo, context=None):
+        rcd = "E"
+        rcd += '{:16s}'.format(comunicazione.soggetto_codice_fiscale)  
+        #rcd += '{:8d}'.format(prog_modulo) # Progressivo modulo 
+        rcd += '{:8s}'.format(str(prog_modulo).zfill(8)) # Progressivo modulo 
+        rcd += '{:3s}'.format("") # Filler 
+        rcd += '{:25s}'.format("") # Filler 
+        rcd += '{:20s}'.format("") # Filler 
+        rcd += '{:16s}'.format("") # Filler 
+        # Aggregate
+        if comunicazione.totale_FA:
+            rcd += '{:8s}'.format("TA001001") + '{:16d}'.format(comunicazione.totale_FA)
+        if comunicazione.totale_SA:
+            rcd += '{:8s}'.format("TA002001") + '{:16d}'.format(comunicazione.totale_SA)
+        if comunicazione.totale_BL1:
+            rcd += '{:8s}'.format("TA003001") + '{:16d}'.format(comunicazione.totale_BL1)
+        if comunicazione.totale_BL2:
+            rcd += '{:8s}'.format("TA003002") + '{:16d}'.format(comunicazione.totale_BL2)
+        if comunicazione.totale_BL3:
+            rcd += '{:8s}'.format("TA003003") + '{:16d}'.format(comunicazione.totale_BL3)
+        # Analitiche
+        if comunicazione.totale_FE:
+            rcd += '{:8s}'.format("TA004001") + '{:16d}'.format(comunicazione.totale_FE)
+        if comunicazione.totale_FE_R:
+            rcd += '{:8s}'.format("TA004002") + '{:16d}'.format(comunicazione.totale_FE_R)
+        if comunicazione.totale_FR:
+            rcd += '{:8s}'.format("TA005001") + '{:16d}'.format(comunicazione.totale_FR)
+        if comunicazione.totale_FR_R:
+            rcd += '{:8s}'.format("TA005002") + '{:16d}'.format(comunicazione.totale_FR_R)
+        if comunicazione.totale_NE:
+            rcd += '{:8s}'.format("TA006001") + '{:16d}'.format(comunicazione.totale_NE)
+        if comunicazione.totale_NR:
+            rcd += '{:8s}'.format("TA007001") + '{:16d}'.format(comunicazione.totale_NR)
+        if comunicazione.totale_DF:
+            rcd += '{:8s}'.format("TA008001") + '{:16d}'.format(comunicazione.totale_DF)
+        if comunicazione.totale_FN:
+            rcd += '{:8s}'.format("TA009001") + '{:16d}'.format(comunicazione.totale_FN)
+        if comunicazione.totale_SE:
+            rcd += '{:8s}'.format("TA010001") + '{:16d}'.format(comunicazione.totale_SE)
+        if comunicazione.totale_TU:
+            rcd += '{:8s}'.format("TA011001") + '{:16d}'.format(comunicazione.totale_TU)
+        
+        rcd += " " * (1897 -len(rcd))
+        
+        # Ultimi caratteri di controllo
+        rcd += "A"  # Impostare al valore "A"
+        rcd += "\r" # 
+        rcd += "\n" # 
+        return rcd 
+            
+    def _record_Z(self, cr, uid, args, context=None):
+        rcd = "Z"
+        rcd += '{:14s}'.format("") # filler
+        rcd += '{:9s}'.format(str(args.get('numero_record_B')).zfill(9))
+        rcd += '{:9s}'.format(str(args.get('numero_record_C')).zfill(9))
+        rcd += '{:9s}'.format(str(args.get('numero_record_D')).zfill(9))
+        rcd += '{:9s}'.format(str(args.get('numero_record_E')).zfill(9))
+        rcd += " " * 1846
+        # Ultimi caratteri di controllo
+        rcd += "A"  # Impostare al valore "A"
+        rcd += "\r" # 
+        rcd += "\n" # 
+        return rcd
+            
+    def execute_export(self, cr, uid, ids, context=None):
+        if len(ids) > 1:
+            raise osv.except_osv('Error', _('Only one comunication'))
+        
+        numero_record_B = 0
+        numero_record_C = 0
+        numero_record_D = 0
+        numero_record_E = 0
+        
+        comunicazione_id = context.get('active_id', False)
+        comunicazione = self.pool.get('spesometro.comunicazione').browse(cr, uid, comunicazione_id)
+        
+        # Testata
+        content = self._record_A(cr, uid, comunicazione, context=context)
+        numero_record_B += 1
+        content += self._record_B(cr, uid, comunicazione, context=context)
+        
+        # Dettaglio
+        progressivo_modulo = 0
+        progressivo_sezione = 0
+        sezione_max = 3
+        # .. quadro FA
+        for line in comunicazione.line_FA_ids:
+            progressivo_modulo +=1
+            progressivo_sezione +=1
+            if progressivo_sezione > sezione_max :
+                progressivo_sezione = 1
+            content += self._record_C_FA(cr, uid, line, progressivo_modulo, progressivo_sezione, context=context)
+            numero_record_C += 1
+        # .. quadro SA
+        progressivo_sezione = 0
+        sezione_max = 10
+        for line in comunicazione.line_SA_ids:
+            progressivo_modulo +=1
+            progressivo_sezione +=1
+            if progressivo_sezione > sezione_max :
+                progressivo_sezione = 1
+            content += self._record_C_SA(cr, uid, line, progressivo_modulo, progressivo_sezione, context=context)
+            numero_record_C += 1
+        
+        # .. quadro BL
+        progressivo_sezione = 0
+        sezione_max = 1
+        for line in comunicazione.line_BL_ids:
+            progressivo_modulo +=1
+            progressivo_sezione +=1
+            if progressivo_sezione > sezione_max :
+                progressivo_sezione = 1
+            content += self._record_C_BL(cr, uid, line, progressivo_modulo, progressivo_sezione, context=context)
+            numero_record_C += 1
+        
+        # .. quadro SE
+        progressivo_sezione = 0
+        sezione_max = 3
+        for line in comunicazione.line_SE_ids:
+            progressivo_modulo +=1
+            progressivo_sezione +=1
+            if progressivo_sezione > sezione_max :
+                progressivo_sezione = 1
+            content += self._record_D_SE(cr, uid, line, progressivo_modulo, progressivo_sezione, context=context)
+            numero_record_D += 1
+        
+        # Riepilogo
+        progressivo_modulo = 1
+        content += self._record_E(cr, uid, comunicazione, progressivo_modulo, context=context)
+        numero_record_E += 1
+        
+        # Coda
+        args = {
+                'numero_record_B' : numero_record_B,
+                'numero_record_C' : numero_record_C,
+                'numero_record_D' : numero_record_D,
+                'numero_record_E' : numero_record_E,
+                }
+        content += self._record_Z(cr, uid, args, context=None)
+        
+        out=base64.encodestring(content.encode("utf8"))
+        return self.write(cr, uid, ids, {'file_spesometro':out}, context=context)
+       
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
\ No newline at end of file

=== added file 'l10n_it_spesometro/wizard/wizard_export_view.xml'
--- l10n_it_spesometro/wizard/wizard_export_view.xml	1970-01-01 00:00:00 +0000
+++ l10n_it_spesometro/wizard/wizard_export_view.xml	2014-03-19 09:57:51 +0000
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data>
+    	<!-- 
+		Form           
+		-->
+        <record id="wizard_spesometro_export_view" model="ir.ui.view">
+	        <field name="name">wizard.spesometro.export.view</field>
+	        <field name="model">wizard.spesometro.export</field>
+	        <field name="type">form</field>
+	        <field name="arch" type="xml">
+		        <form string="Params">
+		        	<!--<field name="file_to_import" />
+		        	<separator colspan="4" />-->
+		        	<field name="file_spesometro" readonly="1"/>
+		        	<separator colspan="4" />
+		            <button name="execute_export" string="Export" type="object" icon="gtk-execute" />
+		      	</form>
+	        </field>
+    	</record>
+
+        <!-- ACTION -->
+        <record id="wizard_spesometro_export_action" model="ir.actions.act_window">
+			<field name="name">Export spesometro</field>
+	        <field name="res_model">wizard.spesometro.export</field>
+	        <field name="src_model">spesometro.comunicazione</field>
+	        <field name="view_type">form</field>
+	        <field name="view_mode">form</field>
+	        <field name="view_id" ref="wizard_spesometro_export_view"/>
+	        <field name="help">Crea file spesometro - Comunicazione art.21 </field>
+	        <field name="target">new</field>
+    	</record>
+    	
+        <act_window name="Export spesometro"   
+            res_model="wizard.spesometro.export"
+            src_model="spesometro.comunicazione"
+            view_mode="form"
+            target="new"
+            context="{'search_default_in_location':1}" 
+            key2="client_action_multi"    
+            view_id="wizard_spesometro_export_view"    
+            id="wizard_spesometro_export_action2"/>   
+    	
+    </data>
+</openerp>


Follow ups