← Back to team overview

openobject-italia-core-devs team mailing list archive

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

 

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

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

For more details, see:
https://code.launchpad.net/~a-camilli/openobject-italia/6.1-spesometro/+merge/210439
-- 
https://code.launchpad.net/~a-camilli/openobject-italia/6.1-spesometro/+merge/210439
Your team OpenERP Italia core devs is requested to review the proposed merge of lp:~a-camilli/openobject-italia/6.1-spesometro into lp:openobject-italia/6.1.
=== 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-11 15:37:50 +0000
@@ -0,0 +1,21 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#    
+#    Author: Alessandro Camilli (a.camilli@xxxxxxxx)
+#
+#    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-11 15:37:50 +0000
@@ -0,0 +1,48 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#    
+#    Author: Alessandro Camilli (a.camilli@xxxxxxxx)
+#
+#    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': '',
+    'license': 'AGPL-3',
+    "depends" : ['account', 'l10n_it_base', 'l10n_it_account'],
+    "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',
+              'sequence.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-11 15:37:50 +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/sequence.xml'
--- l10n_it_spesometro/sequence.xml	1970-01-01 00:00:00 +0000
+++ l10n_it_spesometro/sequence.xml	2014-03-11 15:37:50 +0000
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data>
+        <record id="seq_type_spesometro" model="ir.sequence.type">
+            <field name="name">Spesometro</field>
+            <field name="code">spesometro</field>
+        </record>
+        <record id="seq_spesometro" model="ir.sequence">
+            <field name="name">Spesometro</field>
+            <field name="code">spesometro</field>
+            <field name="prefix">/</field>
+        </record>
+    </data>
+</openerp>

=== 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-11 15:37:50 +0000
@@ -0,0 +1,754 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#    
+#    Copyright (C) 2013 Alessandro Camilli
+#
+#    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, osv
+from openerp.tools.translate import _
+import decimal_precision as dp
+
+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')),
+                   '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')),
+                   '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,
+        'spesometro_operazione' : 'FA'
+    }
+
+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, [('fiscalyear_id','=', element.fiscalyear_id.id)], context=context)
+            if len(element_ids) > 1:
+                return False
+        return True
+    
+    _name = "spesometro.configurazione"
+    _description = "Spesometro - Configurazione"
+    _columns = {
+        'fiscalyear_id': fields.many2one('account.fiscalyear', 'Anno', required=True ),
+        'quadro_fa_limite_importo': fields.float('Quadro FA - Limite importo'),
+        'quadro_sa_limite_importo': fields.float('Quadro SA - Limite importo'),
+        'quadro_bl_limite_importo': fields.float('Quadro BL - Limite importo'),
+        }
+    _constraints = [
+        (_check_one_year, 'Error! Config for this year already exists.', ['fiscalyear_id']),
+    ]
+
+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):
+            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
+            res[com.id] = {
+                    'totale_FA' : tot_FA,
+                    'totale_SA' : tot_SA,
+                    'totale_BL1' : tot_BL1,
+                    'totale_BL2' : tot_BL2,
+                    'totale_BL3' : tot_BL3,
+                    }
+        return res
+    
+    _columns = {
+        'company_id': fields.many2one('res.company', 'Azienda', required=True ),
+        'fiscalyear_id': fields.many2one('account.fiscalyear', 'Anno', required=True ),
+        'mese_trimestre_riferimento': fields.char('Mese/Trimestre riferimento', size=2),
+        '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 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' ),
+        
+        '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),
+    }
+    
+    _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 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, [('fiscalyear_id', '=', com.fiscalyear_id.id)])
+            if not configurazione_ids:
+                raise osv.except_osv(_('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])
+        
+        return True
+    
+    def genera_comunicazione(self, cr, uid, params, context=None):
+        
+        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
+            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
+            else:
+                codice_fiscale_incaricato_trasmissione = company.partner_id.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 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),
+                      'fiscalyear_id' : params.get('fiscalyear_id', 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.address[0].phone or '',  
+                      'soggetto_fax' : company.partner_id and company.partner_id.address[0].fax or '',  
+                      'soggetto_email' : company.partner_id and company.partner_id.address[0].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_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, [('fiscalyear_id', '=', params.get('fiscalyear_id'))])
+        if not configurazione_ids:
+            raise osv.except_osv(_('Configurazione mancante!'),_("Configurare l'anno relativo alla comunicazione") )
+        configurazione = self.pool.get('spesometro.configurazione').browse(cr, uid, configurazione_ids[0])
+        
+        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 of year
+        period_search = [('fiscalyear_id', '=', params['fiscalyear_id']),('special', '=', False)]
+        period_ids = period_obj.search(cr, uid, period_search, context=context)
+        # 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 
+            
+            quadro = ""
+            # Forma aggregata
+            if params['formato_dati'] == 'aggregati':
+                if operazione == 'FA':
+                    quadro = 'FA'
+                elif operazione == 'SA':
+                    quadro = 'SA'
+                elif (operazione == 'BL1') or (operazione == 'BL2') or (operazione == 'BL2'):
+                    quadro = 'BL'
+            
+            # Forma analitica
+            # >> da completare>>>
+            
+            arg = {
+                'comunicazione_id' : comunicazione_id,   
+                'segno' : segno,   
+                'operazione_iva_non_esposta' : operazione_iva_non_esposta
+                }
+            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)
+        
+        # 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
+        self.validate_lines(cr, uid, [comunicazione_id])
+        
+        # Update for compoute totals
+        self.write(cr, uid, [comunicazione_id],{})
+        
+        return True
+    
+
+class spesometro_comunicazione_line_FA(orm.Model):
+
+    _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),
+        '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 = {}
+        # New partner
+        if not com_line_ids:
+            partita_IVA =''
+            if move.partner_id.vat:
+                partita_IVA = move.partner_id.vat[2:]
+            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 '',
+                }
+            # attive
+            if arg.get('segno', False) == 'attiva':
+                val['numero_operazioni_attive_aggregate'] = 1
+                if 'refund' in move.journal_id.type:
+                    val['attive_note_variazione'] = invoice.amount_untaxed
+                    val['attive_note_variazione_imposta'] = invoice.amount_tax
+                else:
+                    if arg.get('operazione_iva_non_esposta', False):
+                        val['attive_operazioni_iva_non_esposta' ] = invoice.amount_total 
+                    else:
+                        val['attive_imponibile_non_esente' ] = invoice.amount_untaxed
+                        val['attive_imposta'] =invoice.amount_tax
+            # passive         
+            else:
+                val['numero_operazioni_passive_aggregate'] = 1
+                if 'refund' in move.journal_id.type:
+                    val['passive_note_variazione'] = invoice.amount_untaxed
+                    val['passive_note_variazione_imposta'] = invoice.amount_tax
+                else:
+                    if arg.get('operazione_iva_non_esposta', False):
+                        val['passive_operazioni_iva_non_esposta' ] = invoice.amount_total 
+                    else:
+                        val['passive_imponibile_non_esente' ] = invoice.amount_untaxed
+                        val['passive_imposta' ] = invoice.amount_tax
+            
+        # 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 + invoice.amount_untaxed
+                        val['attive_note_variazione_imposta'] = com_line.attive_note_variazione_imposta + invoice.amount_tax
+                    else:
+                        if arg.get('operazione_iva_non_esposta', False):
+                            val['attive_operazioni_iva_non_esposta' ] = com_line.attive_operazioni_iva_non_esposta + invoice.amount_total 
+                        else:
+                            val['attive_imponibile_non_esente' ] = com_line.attive_imponibile_non_esente + invoice.amount_untaxed
+                            val['attive_imposta' ] = com_line.attive_imposta + invoice.amount_tax
+                # 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 + invoice.amount_untaxed
+                        val['passive_note_variazione_imposta'] = com_line.passive_note_variazione_imposta + invoice.amount_tax
+                    else:
+                        if arg.get('operazione_iva_non_esposta', False):
+                            val['passive_operazioni_iva_non_esposta' ] = com_line.passive_operazioni_iva_non_esposta + invoice.amount_total 
+                        else:
+                            val['passive_imponibile_non_esente' ] = com_line.passive_imponibile_non_esente + invoice.amount_untaxed
+                            val['passive_imposta' ] = com_line.passive_imposta + invoice.amount_tax
+            
+        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):
+
+    _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 = {}
+        # 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' : invoice.amount_total,
+                }
+        # 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 + invoice.amount_total
+            
+        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):
+
+    _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 = {}
+        
+        # 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
+            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'] = invoice.amount_total
+                    val['attive_imposta'] = invoice.amount_tax
+                if val['operazione_fiscalita_privilegiata'] == True:
+                    if move.partner_id.spesometro_operazione == 'cessioni':
+                        val['attive_non_sogg_cessione_beni'] = invoice.amount_total
+                    else:
+                        val['attive_non_sogg_servizi'] = invoice.amount_total
+                if 'refund' in move.journal_id.type:
+                    val['attive_note_variazione'] = invoice.amount_untaxed
+                    val['attive_note_variazione_imposta'] = invoice.amount_tax
+            # 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'] = invoice.amount_total
+                    val['passive_imposta'] = invoice.amount_tax
+                if val['operazione_fiscalita_privilegiata'] == True:
+                    val['passive_non_sogg_importo_complessivo'] = invoice.amount_total
+                if 'refund' in move.journal_id.type:
+                    val['passive_note_variazione'] = invoice.amount_untaxed
+                    val['passive_note_variazione_imposta'] = invoice.amount_tax
+                
+        # 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 + invoice.amount_total
+                        val['attive_imposta'] = com_line.attive_imposta + invoice.amount_tax
+                    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 + invoice.amount_total
+                        else:
+                            val['attive_non_sogg_servizi'] = com_line.attive_non_sogg_servizi + invoice.amount_total
+                    if 'refund' in move.journal_id.type:
+                        val['attive_note_variazione'] = com_line.attive_note_variazione + invoice.amount_untaxed
+                        val['attive_note_variazione_imposta'] = com_line.attive_note_variazione_imposta + invoice.amount_tax
+                        
+                # 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 + invoice.amount_total
+                        val['passive_imposta'] = com_line.passive_imposta + invoice.amount_tax
+                    if val['operazione_fiscalita_privilegiata'] == True:
+                        val['passive_non_sogg_importo_complessivo'] = com_line.passive_non_sogg_importo_complessivo + invoice.amount_total
+                    if 'refund' in move.journal_id.type:
+                        val['passive_note_variazione'] = com_line.passive_note_variazione + invoice.amount_untaxed
+                        val['passive_note_variazione_imposta'] = com_line.passive_note_variazione_imposta + invoice.amount_tax
+                
+        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

=== 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-11 15:37:50 +0000
@@ -0,0 +1,427 @@
+<?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="before">
+                    <separator 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 colspan="2">
+	                	<field name="spesometro_IVA_non_esposta" attrs="{'invisible': ['|', ('spesometro_escludi', '=', True), ('spesometro_operazione', '!=', 'FA')]}" />
+	                	<field name="spesometro_leasing" attrs="{'invisible': [('spesometro_escludi', '=', True)]}" />
+	                </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">
+                    <separator 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')]}" />
+           		</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">
+	                	<field name="codice_stato_agenzia_entrate"/>
+           		</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="type">tree</field>
+            <field name="arch" type="xml">
+	            <tree string="Configurazione Spesometro">
+	            	<field name="fiscalyear_id"/>
+	            </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="type">form</field>
+            <field name="arch" type="xml">
+	            <form>
+	                <group>
+		            	<field name="fiscalyear_id"/>
+	            	</group>
+	            	<newline/>
+	            	<group string="Quadro FA">
+	            	    <field name="quadro_fa_limite_importo" />
+	            	</group>
+	            	<group string="Quadro SA">
+	            	    <field name="quadro_sa_limite_importo" />
+	            	</group>
+	            	<group string="Quadro BL">
+	            	    <field name="quadro_bl_limite_importo" />
+	            	</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>
+                	<group colspan="4">
+                		<field name="tipo"/>  
+                		<field name="progressivo_telematico"/>  
+                		<field name="fiscalyear_id"/>  
+                		<field name="mese_trimestre_riferimento"/>
+                		<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)]}"/>  
+                	</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 attrs="{'invisible':[('soggetto_forma_giuridica','!=','persona_giuridica')]}">
+		                        	<separator string="Dati persona giuridica" colspan="4"/>
+			                		<field name="soggetto_pg_denominazione" attrs="{'required':[('soggetto_forma_giuridica','==','persona_giuridica')]}" />    
+			                </group>
+			                <group attrs="{'invisible':[('soggetto_forma_giuridica','==','persona_giuridica')]}">
+			                    	<separator string="Dati persona fisica" colspan="4"/>
+			                		<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 attrs="{'invisible':[('soggetto_cm_forma_giuridica','!=','persona_giuridica')]}">
+		                        	<separator string="Dati persona giuridica" colspan="4"/>
+			                		<field name="soggetto_cm_pg_denominazione" attrs="{'required':[('soggetto_cm_forma_giuridica','==','persona_giuridica')]}" />    
+			                </group>
+			                <group attrs="{'invisible':[('soggetto_cm_forma_giuridica','==','persona_giuridica')]}">
+			                    	<separator string="Dati persona fisica" colspan="4"/>
+			                		<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">
+                	    	<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">
+                	        <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">
+                	        <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>
+                	</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="fiscalyear_id"/>
+                    <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="fiscalyear_id"/>
+                    <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':'fiscalyear_id'}"/>
+                    </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="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>
+         
+         
+    </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-11 15:37:50 +0000
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#    
+#    Author: Alessandro Camilli (a.camilli@xxxxxxxx)
+#
+#    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-11 15:37:50 +0000
@@ -0,0 +1,77 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#    
+#    Author: Alessandro Camilli (a.camilli@xxxxxxxx)
+#    All Rights Reserved
+#
+#    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['tipo'] = 'ordinaria'
+        res['formato_dati'] = 'aggregati'
+        res['tipo_fornitore'] = '01'
+        return res
+
+    _name = "wizard.spesometro.crea.comunicazione"
+    
+    _columns = {
+        'company_id': fields.many2one('res.company', 'Azienda', required=True ),
+        'anno': fields.many2one('account.fiscalyear', 'Anno', required=True ),
+        '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'),
+    }
+    
+    _default ={
+    }
+    
+    
+    
+    def genera_comunicazione(self, cr, uid, ids, context=None):
+        
+        comunicazione_obj = self.pool.get('spesometro.comunicazione')
+        wizard = self.read(cr, uid, ids)[0]
+        params ={
+               'company_id': wizard['company_id'][0],
+               'fiscalyear_id': wizard['anno'][0],
+               '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'], 
+               }
+        comunicazione_obj.genera_comunicazione(cr, uid, params, context=None)
+        
+        return {
+            'type': 'ir.actions.act_window_close',
+        }
+
+wizard_crea_comunicazione()

=== 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-11 15:37:50 +0000
@@ -0,0 +1,45 @@
+<?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="anno"/>
+                    <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/>
+                    <field name="tipo_fornitore"/>
+                    <field name="partner_intermediario" attrs="{'invisible': [('tipo_fornitore', '=', '01')], 'required': [('tipo_fornitore', '=', '10')]}"/>
+                    <newline/>
+                    <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-11 15:37:50 +0000
@@ -0,0 +1,66 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#    
+#    Author: Alessandro Camilli (a.camilli@xxxxxxxx)
+#    All Rights Reserved
+#
+#    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')
+        import pdb
+        pdb.set_trace()
+        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-11 15:37:50 +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-11 15:37:50 +0000
@@ -0,0 +1,586 @@
+# -*- coding: utf-8 -*-
+#################################################################################
+#    Author: Alessandro Camilli a.camilli@xxxxxxxx
+#
+#    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),
+    }
+    _default ={
+    }
+    
+    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):
+        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.quadro_SE :
+        #    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 += '{:4s}'.format(comunicazione.fiscalyear_id.name) # anno riferimento
+        rcd += '{:2s}'.format("")  # Mese di riferimento : Da valorizzare obbligatoriamente solo se presenti Acquisti da Operatori di San Marino. In tutti gli altri casi non deve essere compilato
+        # 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
+        # FA001
+        # Partita iva o codice fiscale
+        if not line.partita_IVA and not line.codice_fiscale:
+            raise osv.except_osv(_('Errore comunicazione!'),_("Inserire Codice Fiscale o partita IVA su partner %s") % (line.partner_id.name,))
+        
+        if line.partita_IVA:
+            rcd += '{:8s}'.format("FA" + prog_sezione + "001" )
+            rcd += '{:16s}'.format(line.partita_IVA) 
+        else:
+            rcd += '{:8s}'.format("FA" + prog_sezione + "002" )
+            rcd += '{:16s}'.format(line.codice_fiscale)
+        # 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" ) + '{:1s}'.format(line.noleggio)
+            
+        # OPERAZIONI ATTIVE
+        if line.attive_imponibile_non_esente > 0:
+            rcd += '{:8s}'.format("FA" + prog_sezione + "007" ) + '{:16d}'.format(int(line.attive_imponibile_non_esente))
+        # Totale imposta
+        if line.attive_imposta > 0:
+            rcd += '{:8s}'.format("FA" + prog_sezione + "008" ) + '{:16d}'.format(int(line.attive_imposta))
+        # Totale operazioni con IVA non esposta
+        if line.attive_operazioni_iva_non_esposta > 0:
+            rcd += '{:8s}'.format("FA" + prog_sezione + "009" ) + '{:16d}'.format(int(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" ) + '{:16d}'.format(int(line.attive_note_variazione))
+        if line.attive_note_variazione_imposta > 0:
+            rcd += '{:8s}'.format("FA" + prog_sezione + "011" ) + '{:16d}'.format(int(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" ) + '{:16d}'.format(int(line.passive_imponibile_non_esente))
+        if line.passive_imposta > 0:
+            rcd += '{:8s}'.format("FA" + prog_sezione + "013" ) + '{:16d}'.format(int(line.passive_imposta))
+        if line.passive_operazioni_iva_non_esposta > 0:
+            rcd += '{:8s}'.format("FA" + prog_sezione + "014" ) + '{:16.0f}'.format(int(line.passive_operazioni_iva_non_esposta))
+        if line.passive_note_variazione > 0:
+            rcd += '{:8s}'.format("FA" + prog_sezione + "015" ) + '{:16.0f}'.format(int(line.passive_note_variazione))
+        if line.passive_note_variazione_imposta > 0:
+            rcd += '{:8s}'.format("FA" + prog_sezione + "016" ) + '{:16.0f}'.format(int(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" ) + '{:16d}'.format(int(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" ) + '{:16d}'.format(int(line.attive_importo_complessivo))
+        if line.attive_imposta > 0:
+            rcd += '{:8s}'.format("BL" + "003" + "002" ) + '{:16d}'.format(int(line.attive_imposta))
+        
+        if line.operazione_fiscalita_privilegiata:
+            if line.attive_non_sogg_cessione_beni > 0:
+                rcd += '{:8s}'.format("BL" + "004" + "001" ) + '{:16d}'.format(int(line.attive_non_sogg_cessione_beni))
+            if line.attive_non_sogg_servizi > 0:
+                rcd += '{:8s}'.format("BL" + "004" + "002" ) + '{:16d}'.format(int(line.attive_non_sogg_servizi))
+            if line.attive_note_variazione > 0:
+                rcd += '{:8s}'.format("BL" + "005" + "001" ) + '{:16d}'.format(int(line.attive_note_variazione))
+            if line.attive_note_variazione_imposta > 0:
+                rcd += '{:8s}'.format("BL" + "005" + "002" ) + '{:16d}'.format(int(line.attive_note_variazione_imposta))
+        
+        # OPERAZIONI PASSIVE
+        if line.passive_importo_complessivo > 0:
+            rcd += '{:8s}'.format("BL" + "006" + "001" ) + '{:16d}'.format(int(line.passive_importo_complessivo))
+        if line.passive_imposta > 0:
+            rcd += '{:8s}'.format("BL" + "006" + "002" ) + '{:16d}'.format(int(line.passive_imposta))
+        
+        if line.operazione_fiscalita_privilegiata:
+            if line.passive_non_sogg_importo_complessivo > 0:
+                rcd += '{:8s}'.format("BL" + "007" + "001" ) + '{:16d}'.format(int(line.passive_non_sogg_importo_complessivo))
+            if line.passive_note_variazione > 0:
+                rcd += '{:8s}'.format("BL" + "008" + "001" ) + '{:16d}'.format(int(line.passive_note_variazione))
+            if line.passive_note_variazione_imposta > 0:
+                rcd += '{:8s}'.format("BL" + "008" + "002" ) + '{:16d}'.format(int(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_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 
+        
+        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)
+        
+        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_modulo = 0
+        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_modulo = 0
+        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
+        
+        # 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-11 15:37:50 +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