Merge lp:~a-camilli/openobject-italia/7.0-spesometro into lp:~openobject-italia-core-devs/openobject-italia/italian-addons-7.0

Proposed by Alessandro Camilli
Status: Rejected
Rejected by: Lorenzo Battistini
Proposed branch: lp:~a-camilli/openobject-italia/7.0-spesometro
Merge into: lp:~openobject-italia-core-devs/openobject-italia/italian-addons-7.0
Diff against target: 3143 lines (+3077/-0)
12 files modified
l10n_it_spesometro/__init__.py (+23/-0)
l10n_it_spesometro/__openerp__.py (+49/-0)
l10n_it_spesometro/security/ir.model.access.csv (+11/-0)
l10n_it_spesometro/spesometro.py (+1276/-0)
l10n_it_spesometro/spesometro_view.xml (+628/-0)
l10n_it_spesometro/wizard/__init__.py (+25/-0)
l10n_it_spesometro/wizard/wizard_crea_comunicazione.py (+128/-0)
l10n_it_spesometro/wizard/wizard_crea_comunicazione_view.xml (+67/-0)
l10n_it_spesometro/wizard/wizard_default.py (+65/-0)
l10n_it_spesometro/wizard/wizard_default_view.xml (+39/-0)
l10n_it_spesometro/wizard/wizard_export.py (+722/-0)
l10n_it_spesometro/wizard/wizard_export_view.xml (+44/-0)
To merge this branch: bzr merge lp:~a-camilli/openobject-italia/7.0-spesometro
Reviewer Review Type Date Requested Status
Lorenzo Battistini Disapprove
Review via email: mp+211687@code.launchpad.net

Description of the change

Spesometro v.7

To post a comment you must log in.
Revision history for this message
Valerio Grosso (valeriogrosso) wrote :

Ciao Alessandro,
ho provato il modulo e sono riuscito a creare la Comunicazione ma poi non riesco ad esportarla su file.
Quando si apre la mascherina del wizard "Export spesometro" non ho modo di selezionare un file.
Ho provato a togliere il "readonly" sul campo 'file_spesometro' e a salvare su file scelto da me, ma continua a non fare nulla.
Qualche idea?

Revision history for this message
Lorenzo Battistini (elbati) wrote :

Ciao Alessandro,

potresti anche aggiungere nella descrizione del modulo una mini guida su come usarlo?

Grazie!

238. By Alessandro Camilli

fix file export

Revision history for this message
Alessandro Camilli (a-camilli) wrote :

> Ciao Alessandro,
> ho provato il modulo e sono riuscito a creare la Comunicazione ma poi non
> riesco ad esportarla su file.
> Quando si apre la mascherina del wizard "Export spesometro" non ho modo di
> selezionare un file.
> Ho provato a togliere il "readonly" sul campo 'file_spesometro' e a salvare su
> file scelto da me, ma continua a non fare nulla.
> Qualche idea?
Prova con le modifiche appena postate

Revision history for this message
Valerio Grosso (valeriogrosso) wrote :

Ciao Alessandro,
Ho modificato il nostro branch che trovi in ~zeroincombenze/openobject-italia/7.0-base-spesometro (revisione 240) con le modifiche al wizard e le modifiche per farlo funzionare con la nostra versione di python (2.6), ora riesco a scaricare sul pc il file!
Domani guardo le tue modifiche. Grazie del supporto.

Revision history for this message
Alessandro Camilli (a-camilli) wrote :

Non riesco a trovare il tuo ultimo commit(240). Nel branch che hai indicato l'ultimo commit è del 14/3 ed è il 239.

Revision history for this message
Valerio Grosso (valeriogrosso) wrote :

Ciao Alessandro, avevi ragione, il push non era andato a buon fine.
Adesso si vede su launchpad la revisione 240.

Revision history for this message
Valerio Grosso (valeriogrosso) wrote :

Ciao Alessandro, ho fatto altre modifiche, sempre nel nostro branch che trovi in ~zeroincombenze/openobject-italia/7.0-base-spesometro (revisione 241) del file wizard_export.py
Ho utilizzato una routine che ho chiamato _add_field che dovrebbe snellire molto la generazione del file di testo da inviare all'agenzia delle entrate. (per ora ho commentato il tuo codice perchè mi serve come scheletro da seguire). Lo scopo finale, nella nostra idea, è quello di rendere il tutto più parametrizzabile possibile.
Noi lunedì siamo operativi per supportarti, ma il 25,26 e 27 non ci saremo perchè siamo in fiera al bcom expo a Torino.
Saluti. Valerio

Revision history for this message
Lorenzo Battistini (elbati) wrote :

Ciao Valerio,

se vuoi proporre delle modifiche al branch di Alessandro puoi farne un branch con

bzr branch lp:~a-camilli/openobject-italia/7.0-spesometro lp:~zeroincombenze/openobject-italia/7.0-spesometro_improvements e fare le tue modifiche direttamente dentro lp:~zeroincombenze/openobject-italia/7.0-spesometro_improvements

Una volta caricate le modifiche, sulla pagina del tuo branch lp:~zeroincombenze/openobject-italia/7.0-spesometro_improvements puoi cliccare su 'Propose for merging' e impostare lp:~a-camilli/openobject-italia/7.0-spesometro come target.

Altrimenti, se volete lavorare su un unico branch, potete fare un branch con ~openobject-italia-core-devs come proprietario, così avete entrambi i diritti di scrittura sul branch e potete modificare entrambi un unico branch

Revision history for this message
Sergio Corato (icsergio) wrote :

Ciao Alessandro,
sarebbe buona norma passare il codice con flake8, in modo da renderlo conforme a PEP8 (come da nuove linee guida OCA)

Revision history for this message
Alessandro Camilli (a-camilli) wrote :

Ciao Valerio, riesci a fare come dice Lorenzo? Così ci muoviamo su un'unico branch, altrimenti rischiamo di intrecciarci con le modifiche. Grazie mille

Revision history for this message
Lorenzo Battistini (elbati) wrote :
review: Disapprove

Unmerged revisions

241. By Alessandro Camilli

 Tolta opzione store su funzioni che calcolano il totale e aggiunto controllo su export file per evitare che codice fiscale tenuto alla comunicazione, se presente, sia uguale a quello del soggetto obbligato.

240. By Alessandro Camilli

Esclusione su conto imposta

239. By Alessandro Camilli

esclusione su conto imposta

238. By Alessandro Camilli

fix file export

237. By Alessandro Camilli

Spesometro - Porting da v6.1

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== 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-20 14:19:55 +0000
@@ -0,0 +1,23 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# Author: Alessandro Camilli (a.camilli@yahoo.it)
5# Copyright (C) 2014
6# Associazione OpenERP Italia (<http://www.openerp-italia.org>)
7#
8# This program is free software: you can redistribute it and/or modify
9# it under the terms of the GNU Affero General Public License as published
10# by the Free Software Foundation, either version 3 of the License, or
11# (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU Affero General Public License
19# along with this program. If not, see <http://www.gnu.org/licenses/>.
20#
21##############################################################################
22import spesometro
23import wizard
0\ No newline at end of file24\ No newline at end of file
125
=== 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-20 14:19:55 +0000
@@ -0,0 +1,49 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# Author: Alessandro Camilli (a.camilli@yahoo.it)
5# Copyright (C) 2014
6# Associazione OpenERP Italia (<http://www.openerp-italia.org>)
7#
8# This program is free software: you can redistribute it and/or modify
9# it under the terms of the GNU Affero General Public License as published
10# by the Free Software Foundation, either version 3 of the License, or
11# (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU Affero General Public License
19# along with this program. If not, see <http://www.gnu.org/licenses/>.
20#
21##############################################################################
22{
23 'name': 'Spesometro - Comunicazione art.21',
24 'version': '0.2',
25 'category': 'Localisation/Italy',
26 'description': """Spesometro - Comunicazione art.21
27
28Functionalities:
29- Creazione comunicazione art.21 in forma Aggregata
30- Export file per agenzia delle entrate
31
32""",
33 'author': 'Alessandro Camilli',
34 'website': 'http://www.openerp-italia.org',
35 'license': 'AGPL-3',
36 "depends" : ['account', 'l10n_it_base'],
37 "data" : [
38 'security/ir.model.access.csv',
39 'spesometro_view.xml',
40 'wizard/wizard_crea_comunicazione_view.xml',
41 'wizard/wizard_default_view.xml',
42 'wizard/wizard_export_view.xml',
43 ],
44 "demo" : [],
45 "active": False,
46 "installable": True
47}
48# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
49
050
=== 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-20 14:19:55 +0000
@@ -0,0 +1,11 @@
1id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
2spesometro_comunicazione_user,spesometro_comunicazione user,model_spesometro_comunicazione,base.group_user,1,0,0,0
3spesometro_comunicazione_manager,spesometro_comunicazione manager,model_spesometro_comunicazione,account.group_account_manager,1,1,1,1
4spesometro_comunicazione_line_fa_user,spesometro_comunicazione_line_fa user,model_spesometro_comunicazione_line_fa,base.group_user,1,0,0,0
5spesometro_comunicazione_line_fa_manager,spesometro_comunicazione_line_fa manager,model_spesometro_comunicazione_line_fa,account.group_account_manager,1,1,1,1
6spesometro_comunicazione_line_bl_user,spesometro_comunicazione_line_bl user,model_spesometro_comunicazione_line_bl,base.group_user,1,0,0,0
7spesometro_comunicazione_line_bl_manager,spesometro_comunicazione_line_bl manager,model_spesometro_comunicazione_line_bl,account.group_account_manager,1,1,1,1
8spesometro_comunicazione_line_sa_user,spesometro_comunicazione_line_sa user,model_spesometro_comunicazione_line_sa,base.group_user,1,0,0,0
9spesometro_comunicazione_line_sa_manager,spesometro_comunicazione_line_sa manager,model_spesometro_comunicazione_line_sa,account.group_account_manager,1,1,1,1
10spesometro_configurazione_user,spesometro_configurazione user,model_spesometro_configurazione,base.group_user,1,0,0,0
11spesometro_configurazione_manager,spesometro_configurazione manager,model_spesometro_configurazione,account.group_account_manager,1,1,1,1
0\ No newline at end of file12\ No newline at end of file
113
=== 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-20 14:19:55 +0000
@@ -0,0 +1,1276 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# Author: Alessandro Camilli (a.camilli@yahoo.it)
5# Copyright (C) 2014
6# Associazione OpenERP Italia (<http://www.openerp-italia.org>)
7#
8# This program is free software: you can redistribute it and/or modify
9# it under the terms of the GNU Affero General Public License as published
10# by the Free Software Foundation, either version 3 of the License, or
11# (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU Affero General Public License
19# along with this program. If not, see <http://www.gnu.org/licenses/>.
20#
21##############################################################################
22
23from osv import fields, orm
24from openerp.tools.translate import _
25import decimal_precision as dp
26import datetime, time
27
28class res_country(orm.Model):
29 _inherit = "res.country"
30 _columns = {
31 'codice_stato_agenzia_entrate': fields.char('Codice stato Agenzia Entrate', size=3)
32 }
33
34class account_journal(orm.Model):
35 _inherit = "account.journal"
36 _columns = {
37 'spesometro': fields.boolean('Da includere'),
38 'spesometro_operazione': fields.selection((('FA','Operazioni documentate da fattura'),
39 ('SA','Operazioni senza fattura'),
40 ('BL1','Operazioni con paesi con fiscalità privilegiata'),
41 ('BL2','Operazioni con soggetti non residenti'),
42 ('BL3','Acquisti di servizi da soggetti non residenti'),
43 ('DR','Documento Riepilogativo')),
44 'Operazione' ),
45 'spesometro_segno': fields.selection((('attiva','Attiva'),
46 ('passiva','Passiva')),
47 'Segno operaz.' ),
48 'spesometro_IVA_non_esposta': fields.boolean('IVA non esposta')
49 }
50
51class res_partner(orm.Model):
52 _inherit = "res.partner"
53 _columns = {
54 'spesometro_escludi': fields.boolean('Escludi'),
55 'spesometro_operazione': fields.selection((('FA','Operazioni documentate da fattura'),
56 ('SA','Operazioni senza fattura'),
57 ('BL1','Operazioni con paesi con fiscalità privilegiata'),
58 ('BL2','Operazioni con soggetti non residenti'),
59 ('BL3','Acquisti di servizi da soggetti non residenti'),
60 ('DR','Documento Riepilogativo')),
61 'Operazione' ),
62 'spesometro_IVA_non_esposta': fields.boolean('IVA non esposta'),
63 'spesometro_leasing': fields.selection((('A','Autovettura'),
64 ('B','Caravan'),
65 ('C','Altri veicoli'),
66 ('D','Unità da diporto'),
67 ('E','Aeromobili')),
68 'Tipo Leasing' ),
69 'spesometro_tipo_servizio': fields.selection((('cessione','Cessione Beni'),
70 ('servizi','Prestazione di servizi')),
71 'Tipo servizio', help="Specificare per 'Operazioni con paesi con fiscalità privilegiata' "),
72 }
73
74 _defaults = {
75 'spesometro_escludi' : False,
76 }
77
78class spesometro_configurazione(orm.Model):
79
80 def _check_one_year(self, cr, uid, ids, context=None):
81 for element in self.browse(cr, uid, ids, context=context):
82 element_ids = self.search(cr, uid, [('anno','=', element.anno)], context=context)
83 if len(element_ids) > 1:
84 return False
85 return True
86
87 _name = "spesometro.configurazione"
88 _description = "Spesometro - Configurazione"
89 _columns = {
90 'anno': fields.integer('Anno', size=4, required=True ),
91 'stato_san_marino': fields.many2one('res.country', 'Stato San Marino', required=True),
92 'quadro_fa_limite_importo': fields.float('Quadro FA - Limite importo'),
93 'quadro_fa_limite_importo_line': fields.float('Quadro FA - Limite importo singola operaz.'),
94 'quadro_sa_limite_importo': fields.float('Quadro SA - Limite importo'),
95 'quadro_sa_limite_importo_line': fields.float('Quadro SA - Limite importo singola operaz.'),
96 'quadro_bl_limite_importo': fields.float('Quadro BL - Limite importo'),
97 'quadro_bl_limite_importo_line': fields.float('Quadro BL - Limite importo singola operaz.'),
98 'quadro_se_limite_importo_line': fields.float('Quadro SE - Limite importo singola operaz.'),
99 }
100 _constraints = [
101 (_check_one_year, 'Error! Config for this year already exists.', ['anno']),
102 ]
103
104class spesometro_comunicazione(orm.Model):
105
106 _name = "spesometro.comunicazione"
107 _description = "Spesometro - Comunicazione "
108
109 def _tot_operation_number(self, cr, uid, ids, field_names, args, context=None):
110 res = {}
111 for com in self.browse(cr, uid, ids):
112 # Aggregate
113 tot_FA = len(com.line_FA_ids)
114 tot_SA = len(com.line_SA_ids)
115 tot_BL1 = 0
116 tot_BL2 = 0
117 tot_BL3 = 0
118 for line in com.line_BL_ids:
119 if line.operazione_fiscalita_privilegiata:
120 tot_BL1 += 1
121 elif line.operazione_con_soggetti_non_residenti:
122 tot_BL2 += 1
123 elif line.Acquisto_servizi_da_soggetti_non_residenti:
124 tot_BL3 += 1
125 #Analitiche
126 tot_FE = 0 # Fatture emesse
127 tot_FE_R = 0 # Doc riepilogativi
128 for line in com.line_FE_ids:
129 if line.documento_riepilogativo:
130 tot_FE_R += 1
131 else:
132 tot_FE += 1
133 tot_FR = 0 # Fatture ricevute
134 tot_FR_R = 0 # Doc riepilogativi ricevuti
135 for line in com.line_FR_ids:
136 if line.documento_riepilogativo:
137 tot_FR_R += 1
138 else:
139 tot_FR += 1
140 tot_NE = len(com.line_NE_ids)
141 tot_NR = len(com.line_NR_ids)
142 tot_DF = len(com.line_DF_ids)
143 tot_FN = len(com.line_FN_ids)
144 tot_SE = len(com.line_SE_ids)
145 tot_TU = len(com.line_TU_ids)
146
147 res[com.id] = {
148 'totale_FA' : tot_FA,
149 'totale_SA' : tot_SA,
150 'totale_BL1' : tot_BL1,
151 'totale_BL2' : tot_BL2,
152 'totale_BL3' : tot_BL3,
153 'totale_FE' : tot_FE,
154 'totale_FE_R' : tot_FE_R,
155 'totale_FR' : tot_FR,
156 'totale_FR_r' : tot_FR_R,
157 'totale_NE' : tot_NE,
158 'totale_NR' : tot_NR,
159 'totale_DF' : tot_DF,
160 'totale_FN' : tot_FN,
161 'totale_SE' : tot_SE,
162 'totale_TU' : tot_TU,
163 }
164 return res
165
166 _columns = {
167 'company_id': fields.many2one('res.company', 'Azienda', required=True ),
168 'periodo': fields.selection((('anno','Annuale'), ('trimestre','Trimestrale'), ('mese','Mensile')),
169 'Periodo', required=True),
170 'anno' : fields.integer('Anno', size=4, required=True),
171 'trimestre' : fields.integer('Trimestre', size=1 ),
172 'mese' : fields.selection((('1','Gennaio'), ('2','Febbraio'), ('3','Marzo'), ('4','Aprile'),
173 ('5','Maggio'), ('6','Giugno'), ('7','Luglio'), ('8','Agosto'),
174 ('9','Settembre'), ('10','Ottobre'), ('11','Novembre'), ('12','Dicembre'),
175 ),'Mese'),
176 'tipo': fields.selection((('ordinaria','Ordinaria'), ('sostitutiva','Sostitutiva'), ('annullamento','Annullamento')),
177 'Tipo comunicazione', required=True),
178 'comunicazione_da_sostituire_annullare': fields.integer('Protocollo comunicaz. da sostituire/annullare'),
179 'documento_da_sostituire_annullare': fields.integer('Protocollo documento da sostituire/annullare'),
180
181 'formato_dati': fields.selection((('aggregati','Dati Aggregati'), ('analitici','Dati Analitici')),
182 'Formato dati', readonly=True ),
183
184 'codice_fornitura': fields.char('Codice fornitura', readonly=True, size=5, help='Impostare a "NSP00" '),
185 'tipo_fornitore': fields.selection((('01','Invio propria comunicazione'), ('10','Intermediario')),
186 'Tipo fornitore' ),
187 'codice_fiscale_fornitore': fields.char('Codice fiscale Fornitore', size=16,
188 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)"),
189 #
190 # Valori per comunicazione su più invii (non gestito)
191 'progressivo_telematico': fields.integer('Progressivo telematico', readonly=True),
192 'numero_totale_invii': fields.integer('Numero totale invii telematici', readonly=True),
193 #
194 # Soggetto a cui si riferisce la comunicazione
195 #
196 'soggetto_codice_fiscale': fields.char('Codice fiscale soggetto obbligato', size=16,
197 help="Soggetto cui si riferisce la comunicazione"),
198 'soggetto_partitaIVA': fields.char('Partita IVA', size=11),
199 'soggetto_codice_attivita': fields.char('Codice attività', size=6, help="Codice ATECO 2007"),
200 'soggetto_telefono': fields.char('Telefono', size=12),
201 'soggetto_fax': fields.char('Fax', size=12),
202 'soggetto_email': fields.char('E-mail', size=50),
203 'soggetto_forma_giuridica': fields.selection((('persona_giuridica','Persona Giuridica'), ('persona_fisica','Persona Fisica')),
204 'Forma Giuridica'),
205
206 'soggetto_pf_cognome': fields.char('Cognome', size=24, help=""),
207 'soggetto_pf_nome': fields.char('Nome', size=20, help=""),
208 'soggetto_pf_sesso': fields.selection((('M','M'), ('F','F')),'Sesso'),
209 'soggetto_pf_data_nascita': fields.date('Data di nascita'),
210 'soggetto_pf_comune_nascita': fields.char('Comune o stato estero di nascita', size=40),
211 'soggetto_pf_provincia_nascita': fields.char('Provincia', size=2),
212 'soggetto_pg_denominazione': fields.char('Denominazione', size=60),
213
214 # Soggetto tenuto alla comunicazione
215 'soggetto_cm_forma_giuridica': fields.selection((('persona_giuridica','Persona Giuridica'), ('persona_fisica','Persona Fisica')),
216 'Forma Giuridica'),
217 'soggetto_cm_codice_fiscale': fields.char('Codice Fiscale', size=16, help="Soggetto che effettua la comunicazione se diverso dal soggetto tenuto alla comunicazione"),
218 'soggetto_cm_pf_cognome': fields.char('Cognome', size=24, help=""),
219 'soggetto_cm_pf_nome': fields.char('Nome', size=20, help=""),
220 'soggetto_cm_pf_sesso': fields.selection((('M','M'), ('F','F')),'Sesso'),
221 'soggetto_cm_pf_data_nascita': fields.date('Data di nascita'),
222 'soggetto_cm_pf_comune_nascita': fields.char('Comune o stato estero di nascita', size=40),
223 'soggetto_cm_pf_provincia_nascita': fields.char('Provincia', size=2),
224 'soggetto_cm_pf_codice_carica': fields.integer('Codice Fiscale', size=2, help=""),
225 'soggetto_cm_pf_data_inizio_procedura': fields.date('Data inizio procedura'),
226 'soggetto_cm_pf_data_fine_procedura': fields.date('Data fine procedura'),
227 'soggetto_cm_pg_denominazione': fields.char('Denominazione', size=60),
228
229 # Soggetto incaricato alla trasmissione
230 'soggetto_trasmissione_codice_fiscale': fields.char('Codice Fiscale', size=16, help="Intermediario che effettua la trasmissione telematica"),
231 'soggetto_trasmissione_numero_CAF': fields.integer('Nr iscrizione albo del C.A.F.', size=5, help="Intermediario che effettua la trasmissione telematica"),
232 'soggetto_trasmissione_impegno': fields.selection((('1','Soggetto obbligato'), ('2','Intermediario')),'Impegno trasmissione'),
233 'soggetto_trasmissione_data_impegno': fields.date('Data data impegno'),
234
235 'line_FA_ids': fields.one2many('spesometro.comunicazione.line.fa', 'comunicazione_id', 'Quadri FA' ),
236 'line_SA_ids': fields.one2many('spesometro.comunicazione.line.sa', 'comunicazione_id', 'Quadri SA' ),
237 'line_BL_ids': fields.one2many('spesometro.comunicazione.line.bl', 'comunicazione_id', 'Quadri BL' ),
238
239 'line_FE_ids': fields.one2many('spesometro.comunicazione.line.fe', 'comunicazione_id', 'Quadri FE' ),
240 'line_FR_ids': fields.one2many('spesometro.comunicazione.line.fr', 'comunicazione_id', 'Quadri FR' ),
241 'line_NE_ids': fields.one2many('spesometro.comunicazione.line.ne', 'comunicazione_id', 'Quadri NE' ),
242 'line_NR_ids': fields.one2many('spesometro.comunicazione.line.nr', 'comunicazione_id', 'Quadri NR' ),
243 'line_DF_ids': fields.one2many('spesometro.comunicazione.line.df', 'comunicazione_id', 'Quadri DF' ),
244 'line_FN_ids': fields.one2many('spesometro.comunicazione.line.fn', 'comunicazione_id', 'Quadri FN' ),
245 'line_SE_ids': fields.one2many('spesometro.comunicazione.line.se', 'comunicazione_id', 'Quadri SE' ),
246 'line_TU_ids': fields.one2many('spesometro.comunicazione.line.tu', 'comunicazione_id', 'Quadri TU' ),
247
248 'totale_FA': fields.function(_tot_operation_number, string='Tot operazioni FA', type='integer', multi='operation_number', store=True),
249 'totale_SA': fields.function(_tot_operation_number, string='Tot operazioni SA', type='integer', multi='operation_number', store=True),
250 'totale_BL1': fields.function(_tot_operation_number, string='Tot operazioni BL - Paesi con fiscalita privilegiata', type='integer', multi='operation_number', store=True),
251 'totale_BL2': fields.function(_tot_operation_number, string='Tot operazioni BL - Soggetti non residenti', type='integer', multi='operation_number', store=True),
252 'totale_BL3': fields.function(_tot_operation_number, string='Tot operazioni BL - Acquisti servizi non soggetti non residenti', type='integer', multi='operation_number', store=True),
253
254 'totale_FE': fields.function(_tot_operation_number, string='Tot operazioni FE', type='integer', multi='operation_number', store=True),
255 'totale_FE_R': fields.function(_tot_operation_number, string='Tot operazioni FE doc riepil.', type='integer', multi='operation_number', store=True),
256 'totale_FR': fields.function(_tot_operation_number, string='Tot operazioni FR', type='integer', multi='operation_number', store=True),
257 'totale_FR_R': fields.function(_tot_operation_number, string='Tot operazioni FR doc riepil.', type='integer', multi='operation_number', store=True),
258 'totale_NE': fields.function(_tot_operation_number, string='Tot operazioni NE', type='integer', multi='operation_number', store=True),
259 'totale_NR': fields.function(_tot_operation_number, string='Tot operazioni NR', type='integer', multi='operation_number', store=True),
260 'totale_DF': fields.function(_tot_operation_number, string='Tot operazioni DF', type='integer', multi='operation_number', store=True),
261 'totale_FN': fields.function(_tot_operation_number, string='Tot operazioni FN', type='integer', multi='operation_number', store=True),
262 'totale_SE': fields.function(_tot_operation_number, string='Tot operazioni SE', type='integer', multi='operation_number', store=True),
263 'totale_TU': fields.function(_tot_operation_number, string='Tot operazioni TU', type='integer', multi='operation_number', store=True),
264 }
265
266 _default ={
267 'codice_fornitura': 'NSP00',
268 'tipo_fornitore': '01',
269 'formato_dati': 'aggregati',
270 }
271
272 def onchange_trasmissione_impegno(self, cr, uid, ids, type, context=None):
273 res = {}
274 fiscalcode = False
275 if type == '1': # soggetto obbligato
276 fiscalcode = context.get('soggetto_codice_fiscale', False)
277 res = {
278 'value' : {'soggetto_trasmissione_codice_fiscale' : fiscalcode}
279 }
280 return res
281
282 def partner_is_from_san_marino(self, cr, uid, move, invoice, arg):
283 # configurazione
284 anno_competenza = datetime.datetime.strptime(move.period_id.date_start, "%Y-%m-%d").year
285 configurazione_ids = self.pool.get('spesometro.configurazione').search(cr, uid, \
286 [('anno', '=', anno_competenza)])
287 if not configurazione_ids:
288 raise orm.except_orm(_('Configurazione mancante!'),_("Configurare l'anno relativo alla comunicazione") )
289 configurazione = self.pool.get('spesometro.configurazione').browse(cr, uid, configurazione_ids[0])
290 stato_estero = False
291 address = self._get_partner_address_obj(cr, uid, move, invoice, arg)
292 if address and address.country_id and configurazione.stato_san_marino.id == address.country_id.id:
293 return True
294 else:
295 return False
296
297 def _get_partner_address_obj(self, cr, uid, move, invoice, arg):
298 address = False
299 partner_address_obj = False
300 if move.partner_id.parent_id:
301 partner_address_obj = move.partner_id.parent_id
302 else:
303 partner_address_obj = move.partner_id
304 return partner_address_obj
305
306 def compute_invoice_amounts(self, cr, uid, move, invoice, arg):
307 '''
308 Calcolo totali documento. Dall'imponibile vanno esclusi gli importi esclusi, fuori campo o esenti
309 '''
310 res ={
311 'amount_untaxed' : 0,
312 'amount_tax' : 0,
313 'amount_total' : 0,
314 }
315 for line in invoice.tax_line:
316 if line.amount:
317 res['amount_untaxed'] += line.base
318 res['amount_tax'] += line.amount
319 res['amount_total'] += round(line.base + line.amount, 2)
320 return res
321
322 def truncate_values(self, cr, uid, ids, context=None):
323 for com in self.browse(cr, uid, ids):
324 for line in com.line_FA_ids:
325 vals = {
326 'attive_imponibile_non_esente': int(line.attive_imponibile_non_esente),
327 'attive_imposta': int(line.attive_imposta),
328 'attive_operazioni_iva_non_esposta': int(line.attive_operazioni_iva_non_esposta),
329 'attive_note_variazione': int(line.attive_note_variazione),
330 'attive_note_variazione_imposta': int(line.attive_note_variazione_imposta),
331
332 'passive_imponibile_non_esente': int(line.passive_imponibile_non_esente),
333 'passive_imposta': int(line.passive_imposta),
334 'passive_operazioni_iva_non_esposta': int(line.passive_operazioni_iva_non_esposta),
335 'passive_note_variazione': int(line.passive_note_variazione),
336 'passive_note_variazione_imposta': int(line.passive_note_variazione_imposta),
337 }
338 self.pool.get('spesometro.comunicazione.line.fa').write(cr, uid, [line.id], vals)
339
340 for line in com.line_SA_ids:
341 vals = {
342 'importo_complessivo': int(line.importo_complessivo),
343 }
344 self.pool.get('spesometro.comunicazione.line.sa').write(cr, uid, [line.id], vals)
345
346 for line in com.line_BL_ids:
347 vals = {
348 'attive_importo_complessivo': int(line.attive_importo_complessivo),
349 'attive_imposta': int(line.attive_imposta),
350 'attive_non_sogg_cessione_beni': int(line.attive_non_sogg_cessione_beni),
351 'attive_non_sogg_servizi': int(line.attive_non_sogg_servizi),
352 'attive_note_variazione': int(line.attive_note_variazione),
353 'attive_note_variazione_imposta': int(line.attive_note_variazione_imposta),
354
355 'passive_importo_complessivo': int(line.passive_importo_complessivo),
356 'passive_imposta': int(line.passive_imposta),
357 'passive_non_sogg_importo_complessivo': int(line.passive_non_sogg_importo_complessivo),
358 'passive_note_variazione': int(line.passive_note_variazione),
359 'passive_note_variazione_imposta': int(line.passive_note_variazione_imposta),
360 }
361 self.pool.get('spesometro.comunicazione.line.bl').write(cr, uid, [line.id], vals)
362
363 return True
364
365 def validate_lines(self, cr, uid, ids, context=None):
366 for com in self.browse(cr, uid, ids):
367
368 # configurazione
369 configurazione_ids = self.pool.get('spesometro.configurazione').search(cr, uid, \
370 [('anno', '=', com.anno)])
371 if not configurazione_ids:
372 raise orm.except_orm(_('Configurazione mancante!'),_("Configurare l'anno relativo alla comunicazione") )
373 configurazione = self.pool.get('spesometro.configurazione').browse(cr, uid, configurazione_ids[0])
374
375 for line in com.line_FA_ids:
376 if configurazione.quadro_fa_limite_importo :
377 if line.attive_imponibile_non_esente and \
378 line.attive_imponibile_non_esente < configurazione.quadro_fa_limite_importo:
379 self.pool.get('spesometro.comunicazione.line.fa').unlink(cr, uid, [line.id])
380
381 for line in com.line_SA_ids:
382 if configurazione.quadro_sa_limite_importo :
383 if line.importo_complessivo and \
384 line.importo_complessivo < configurazione.quadro_sa_limite_importo:
385 self.pool.get('spesometro.comunicazione.line.sa').unlink(cr, uid, [line.id])
386
387 for line in com.line_BL_ids:
388 if configurazione.quadro_bl_limite_importo :
389 importo_test = 0
390 if line.attive_importo_complessivo :
391 importo_test = line.attive_importo_complessivo
392 elif line.attive_non_sogg_cessione_beni :
393 importo_test = line.attive_non_sogg_cessione_beni
394 elif line.attive_non_sogg_servizi :
395 importo_test = line.attive_non_sogg_servizi
396
397 if importo_test and \
398 importo_test < configurazione.quadro_bl_limite_importo:
399 self.pool.get('spesometro.comunicazione.line.bl').unlink(cr, uid, [line.id])
400
401 # Controllo formale comunicazione
402 # ... periodo in presenza di linee nel quadro SE
403 if com.line_SE_ids and not com.trimestre and not com.mese:
404 raise orm.except_orm(_('Perido Errato!'),_("In presenza di operazione nel qudro SE (Acquisti da San Marino) \
405 sono ammessi solo periodi mensili/trimestrali") )
406
407 return True
408
409 def validate_operation(self, cr, uid, move, invoice, arg):
410 # configurazione
411 anno_competenza = datetime.datetime.strptime(move.period_id.date_start, "%Y-%m-%d").year
412 configurazione_ids = self.pool.get('spesometro.configurazione').search(cr, uid, \
413 [('anno', '=', anno_competenza)])
414 if not configurazione_ids:
415 raise orm.except_orm(_('Configurazione mancante!'),_("Configurare l'anno relativo alla comunicazione") )
416 configurazione = self.pool.get('spesometro.configurazione').browse(cr, uid, configurazione_ids[0])
417
418 doc_vals = self.pool.get('spesometro.comunicazione').compute_invoice_amounts(cr, uid, move, invoice, arg)
419 # Nessu quadro definito
420 if not arg['quadro']:
421 return False
422 # Quadro richiesto
423 if arg['quadro'] not in arg['quadri_richiesti']:
424 return False
425 # Valori minimi
426 if arg['quadro'] == 'FA':
427 if configurazione.quadro_fa_limite_importo_line :
428 if not doc_vals.get('amount_untaxed', 0) or doc_vals.get('amount_untaxed', 0) < configurazione.quadro_fa_limite_importo_line:
429 return False
430 if arg['quadro'] == 'SA':
431 if configurazione.quadro_sa_limite_importo_line :
432 if not doc_vals.get('amount_total', 0) or doc_vals.get('amount_total', 0) < configurazione.quadro_sa_limite_importo_line:
433 return False
434 if arg['quadro'] == 'BL':
435 if configurazione.quadro_bl_limite_importo_line :
436 if not doc_vals.get('amount_total', 0) or doc_vals.get('amount_total', 0) < configurazione.quadro_bl_limite_importo_line:
437 return False
438
439 if arg['quadro'] == 'SE':
440 if configurazione.quadro_se_limite_importo_line :
441 if not doc_vals.get('amount_untaxed', 0) or doc_vals.get('amount_untaxed', 0) < configurazione.quadro_se_limite_importo_line:
442 return False
443
444 # Operazioni con San Marino Escluse se richiesta forma aggregata
445 if arg['formato_dati'] == 'aggregati' and self.partner_is_from_san_marino(cr, uid, move, invoice, arg):
446 return False
447
448 return True
449
450 def get_define_quadro(self, cr, uid, move, invoice, arg):
451
452 quadro = False
453 operazione = arg.get('operazione')
454 # Forma aggregata
455 if arg['formato_dati'] == 'aggregati':
456 if operazione == 'FA' or operazione == 'DR':
457 quadro = 'FA'
458 elif operazione == 'SA': # Operazioni senza fattura
459 quadro = 'SA'
460 elif (operazione == 'BL1') or (operazione == 'BL2') or (operazione == 'BL2'):
461 quadro = 'BL'
462
463 # Forma analitica
464 if arg['formato_dati'] == 'analitici':
465
466 # Priorità x San Marino -> quadro SE
467 if self.partner_is_from_san_marino(cr, uid, move, invoice, arg):
468 operazione = 'BL3'
469
470 # Impostazioni anagrafiche partner
471 if operazione == 'FA' or operazione == 'DR':
472 if arg.get('segno') == 'attiva':
473 quadro = 'FE'
474 elif arg.get('segno') == 'passiva':
475 quadro = 'FR'
476 elif operazione == 'SA': # Operazioni senza fattura
477 quadro = 'DF'
478 elif operazione == 'BL2': #Operazioni con soggetti non residenti
479 quadro = 'FN'
480 elif operazione == 'BL1' or operazione == 'BL3': #Operazioni con paesi con fiscalità privilegiata - Acquisti di servizi da soggetti non residenti
481 quadro = 'SE'
482 # Note di variazione
483 if operazione == 'FE' and 'refund' in move.journal_id.type:
484 operazione = 'NE'
485 elif operazione == 'FR' and 'refund' in move.journal_id.type:
486 operazione = 'NR'
487
488 return quadro
489
490
491 def genera_comunicazione(self, cr, uid, params, context=None):
492
493 def _get_periods(cr, uid, params, context=None):
494 '''
495 Definizione periodi di competenza
496 '''
497 sql_select = "SELECT p.id FROM account_period p "
498 sql_where = " WHERE p.special = False "
499 search_params = {}
500 # Periodo annuale
501 if params.get('periodo') == 'anno':
502 period_date_start = datetime.date(params.get('anno') , 1, 1)
503 period_date_stop = datetime.date(params.get('anno') , 12, 31)
504 sql_where += " AND p.date_start >= date(%(period_date_start)s) AND p.date_stop <=date(%(period_date_stop)s) "
505 search_params.update({
506 'period_date_start' : period_date_start,
507 'period_date_stop' : period_date_stop
508 })
509 # Periodo mensile
510 if params.get('periodo') == 'mese':
511 period_date_start = datetime.date(params.get('anno') , int(params.get('mese')), 1)
512 sql_where += " AND p.date_start = date(%(period_date_start)s) "
513 search_params.update({
514 'period_date_start' : period_date_start,
515 })
516 # Periodo trimestrale
517 if params.get('periodo') == 'trimestre':
518 if params.get('trimestre') == 1:
519 period_date_start = datetime.date(params.get('anno') , 1, 1)
520 period_date_start = datetime.date(params.get('anno') , 3, 31)
521 elif params.get('trimestre') == 2:
522 period_date_start = datetime.date(params.get('anno') , 3, 1)
523 period_date_start = datetime.date(params.get('anno') , 6, 30)
524 elif params.get('trimestre') == 2:
525 period_date_start = datetime.date(params.get('anno') , 7, 1)
526 period_date_start = datetime.date(params.get('anno') , 9, 30)
527 elif params.get('trimestre') == 2:
528 period_date_start = datetime.date(params.get('anno') , 10, 1)
529 period_date_start = datetime.date(params.get('anno') , 12, 31)
530 else:
531 raise orm.except_orm(_('Dato errato!'),_("Errore nel valore del trimestre") )
532 sql_where += " AND p.date_start >= date(%(period_date_start)s) AND p.date_stop <=date(%(period_date_stop)s) "
533 search_params.update({
534 'period_date_start' : period_date_start,
535 'period_date_stop' : period_date_stop
536 })
537
538 sql = sql_select + sql_where
539 cr.execute(sql, search_params)
540 periods = [i[0] for i in cr.fetchall()]
541 return periods
542
543 def _genera_testata(cr, uid, params, context=None):
544 '''
545 Generazione testata dichiarazione
546 '''
547 company = self.pool.get('res.company').browse(cr, uid, params['company_id'])
548 # progressivo telematico :" il progressivo deve essere univoco e crescente (con incrementi di una unità per ogni file prodotto)"
549 if params['tipo'] == 'ordinaria':
550 com_search = [('tipo', '=', 'ordinaria')]
551 com_last_ids = self.search(cr, uid, com_search, order='progressivo_telematico desc', limit=1)
552 com_next_prg = 1
553 if com_last_ids:
554 com_next_prg = self.browse(cr, uid, com_last_ids[0]).progressivo_telematico + 1
555 progressivo_telematico = com_next_prg
556 # vat
557 if company.partner_id.vat:
558 partita_iva = company.partner_id.vat[2:]
559 else:
560 partita_iva = '{:11s}'.format("".zfill(11))
561 # codice fiscale soggetto incaricato alla trasmissione
562 codice_fiscale_incaricato_trasmissione=''
563 if params.get('tipo_fornitore') == '10' and params.get('partner_intermediario', False):
564 partner_intermediario = self.pool.get('res.partner').browse(cr, uid, params.get('partner_intermediario'))
565 codice_fiscale_incaricato_trasmissione = partner_intermediario.fiscalcode or False
566 # Soggetto con impegno alla trasmissione
567 if params.get('tipo_fornitore') == '10':
568 soggetto_trasmissione_impegno = '2'
569 else:
570 soggetto_trasmissione_impegno = '1'
571 # Persona fisica o giuridica
572 # Considerazione: se se lunghezza codice fiscale < 16 allora c'è la P.Iva e quindi trattasi di soggetto giuridico
573 tipo_persona = 'persona_fisica'
574 if company.partner_id.fiscalcode and len(company.partner_id.fiscalcode) < 16:
575 tipo_persona = 'persona_giuridica'
576
577 values = {
578 'company_id' : company.id,
579 'codice_fiscale_fornitore' : company.partner_id.fiscalcode,
580 'tipo' : params.get('tipo', False),
581 'periodo' : params.get('periodo', False),
582 'anno' : params.get('anno', False),
583 'mese' : params.get('mese', False),
584 'trimestre' : params.get('trimestre', False),
585 'progressivo_telematico' : progressivo_telematico or False,
586 'tipo_fornitore' : params.get('tipo_fornitore', False),
587 'formato_dati' : params.get('formato_dati', False),
588 'soggetto_codice_fiscale' : company.partner_id and company.partner_id.fiscalcode or '',
589 'soggetto_partitaIVA' : partita_iva,
590 'soggetto_telefono' : company.partner_id and company.partner_id.phone or '',
591 'soggetto_fax' : company.partner_id and company.partner_id.fax or '',
592 'soggetto_email' : company.partner_id and company.partner_id.email or '',
593 'soggetto_forma_giuridica' : tipo_persona,
594 'soggetto_pg_denominazione' : company.partner_id and company.partner_id.name or company.name or '',
595 'soggetto_cm_forma_giuridica' : tipo_persona,
596 'soggetto_cm_pg_denominazione' : company.partner_id and company.partner_id.name or company.name or '',
597 'soggetto_trasmissione_codice_fiscale' : codice_fiscale_incaricato_trasmissione,
598 'soggetto_trasmissione_impegno' : soggetto_trasmissione_impegno,
599 }
600 comunicazione_id = self.create(cr, uid, values)
601
602 return comunicazione_id
603
604
605 # Esistenza record di configurazione per l'anno della comunicazione
606 configurazione_ids = self.pool.get('spesometro.configurazione').search(cr, uid, [('anno', '=', params.get('anno'))])
607 if not configurazione_ids:
608 raise orm.except_orm(_('Configurazione mancante!'),_("Configurare l'anno relativo alla comunicazione") )
609 configurazione = self.pool.get('spesometro.configurazione').browse(cr, uid, configurazione_ids[0])
610
611 # Testata comunicazione
612 comunicazione_id = _genera_testata(cr, uid, params, context=None)
613
614 period_obj = self.pool.get('account.period')
615 journal_obj = self.pool.get('account.journal')
616 partner_obj = self.pool.get('res.partner')
617 account_move_obj = self.pool.get('account.move')
618 invoice_obj = self.pool.get('account.invoice')
619 # periods
620 period_ids = _get_periods(cr, uid, params, context=None)
621 # journal
622 journal_search = [('spesometro','=', True)]
623 journal_ids = journal_obj.search(cr, uid, journal_search, context=context)
624 # Partners to exclude
625 partner_search = [('spesometro_escludi','=', True)]
626 partner_to_exclude_ids = partner_obj.search(cr, uid, partner_search, context=context)
627
628 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)]
629 move_ids = account_move_obj.search(cr, uid, move_search, context=context)
630
631 for move in self.pool.get('account.move').browse(cr, uid, move_ids):
632 # Test move validate
633 if not move.partner_id:
634 continue
635
636 # Invoice
637 invoice_search = [('move_id','=', move.id)]
638 invoice_ids = invoice_obj.search(cr, uid, invoice_search, context=context)
639 if not invoice_ids:
640 continue
641 invoice = invoice_obj.browse(cr,uid, invoice_ids[0])
642
643 # Config spesometro
644 operazione = False
645 operazione_iva_non_esposta = False
646 operazione = move.journal_id.spesometro_operazione
647 operazione_iva_non_esposta = move.journal_id.spesometro_IVA_non_esposta
648 segno = move.journal_id.spesometro_segno
649 if move.partner_id.spesometro_operazione:
650 operazione = move.partner_id.spesometro_operazione
651 operazione_iva_non_esposta = move.partner_id.spesometro_IVA_non_esposta
652
653 arg = {
654 'comunicazione_id' : comunicazione_id,
655 'segno' : segno,
656 'operazione_iva_non_esposta' : operazione_iva_non_esposta,
657 'operazione' : operazione,
658 'formato_dati' : params['formato_dati'],
659 'quadri_richiesti' : params['quadri_richiesti'],
660 }
661
662 # Quadro di competenza
663 quadro = self.get_define_quadro(cr, uid, move, invoice, arg)
664
665 arg.update({'quadro': quadro})
666
667 # Test operazione da includere nella comunicazione
668 if not self.validate_operation(cr, uid, move, invoice, arg):
669 continue
670
671 if quadro == 'FA':
672 line_id = self.pool.get('spesometro.comunicazione.line.fa').add_line(cr, uid, move, invoice, arg)
673 if quadro == 'SA':
674 line_id = self.pool.get('spesometro.comunicazione.line.sa').add_line(cr, uid, move, invoice, arg)
675 if quadro == 'BL':
676 line_id = self.pool.get('spesometro.comunicazione.line.bl').add_line(cr, uid, move, invoice, arg)
677 if quadro == 'SE':
678 line_id = self.pool.get('spesometro.comunicazione.line.se').add_line(cr, uid, move, invoice, arg)
679
680 # Arrotonda importi su valori raggruppati -> troncare i decimali
681 if params['formato_dati'] == 'aggregati':
682 self.truncate_values(cr, uid, [comunicazione_id])
683
684 # Rimuove le linee che non rientrano nei limiti ed effettua un controllo formale sull'intera comunicazione
685 self.validate_lines(cr, uid, [comunicazione_id])
686
687 # Update for compute totals
688 self.write(cr, uid, [comunicazione_id],{})
689
690 return True
691
692
693class spesometro_comunicazione_line_FA(orm.Model):
694 '''
695 QUADRO FA - Operazioni documentate da fattura esposte in forma aggregata
696 '''
697
698 _name = "spesometro.comunicazione.line.fa"
699 _description = "Spesometro - Comunicazione linee quadro FA"
700 _columns = {
701 'comunicazione_id': fields.many2one('spesometro.comunicazione', 'Comunicazione', ondelete='cascade'),
702
703 'partner_id': fields.many2one('res.partner', 'Partner'),
704 'partita_iva': fields.char('Partita IVA', size=11),
705 'codice_fiscale': fields.char('Codice Fiscale', size=16),
706 'documento_riepilogativo': fields.boolean('Documento Riepilogativo'),
707 'noleggio': fields.selection((('A','Autovettura'), ('B','Caravan'), ('C','Altri Veicoli'), ('D','Unità da diporto'), ('E','Aeromobii')),'Leasing'),
708
709 'numero_operazioni_attive_aggregate': fields.integer('Nr op. attive', size=16),
710 'numero_operazioni_passive_aggregate': fields.integer('Nr op. passive', size=16),
711
712 '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"),
713 'attive_imposta': fields.float(' Tot imposta', digits_compute=dp.get_precision('Account'), help="Totale imposta"),
714 '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"),
715 'attive_note_variazione': fields.float('Totale note variazione', digits_compute=dp.get_precision('Account'), help="Totale note di variazione a debito per la controparte"),
716 '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"),
717
718 '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"),
719 'passive_imposta': fields.float('Totale imposta', digits_compute=dp.get_precision('Account'), help="Totale imposta"),
720 '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"),
721 'passive_note_variazione': fields.float('Totale note variazione', digits_compute=dp.get_precision('Account'), help="Totale note di variazione a credito per la controparte"),
722 '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"),
723 }
724
725
726 def add_line(self, cr, uid, move, invoice, arg):
727 comunicazione_lines_obj = self.pool.get('spesometro.comunicazione.line.fa')
728 comunicazione_id = arg.get('comunicazione_id', False)
729 com_line_search = [('comunicazione_id','=',comunicazione_id), ('partner_id', '=', move.partner_id.id)]
730 com_line_ids = self.search(cr, uid, com_line_search)
731 val = {}
732 # Valori documento
733 doc_vals = self.pool.get('spesometro.comunicazione').compute_invoice_amounts(cr, uid, move, invoice, arg)
734 # New partner
735 if not com_line_ids:
736 partita_iva =''
737 if move.partner_id.vat:
738 partita_iva = move.partner_id.vat[2:]
739 documento_riepilogativo = False
740 if arg['operazione'] == 'DR':
741 documento_riepilogativo = True
742 val = {
743 'comunicazione_id' : comunicazione_id,
744 'partner_id' : move.partner_id.id,
745 'partita_iva' : partita_iva,
746 'codice_fiscale' : move.partner_id.fiscalcode or '',
747 'noleggio' : move.partner_id.spesometro_leasing or '',
748 'documento_riepilogativo' : documento_riepilogativo,
749 }
750 # attive
751 if arg.get('segno', False) == 'attiva':
752 val['numero_operazioni_attive_aggregate'] = 1
753 if 'refund' in move.journal_id.type:
754 val['attive_note_variazione'] = doc_vals.get('amount_untaxed', 0)
755 val['attive_note_variazione_imposta'] = doc_vals.get('amount_tax', 0)
756 else:
757 if arg.get('operazione_iva_non_esposta', False):
758 val['attive_operazioni_iva_non_esposta' ] = doc_vals.get('amount_total', 0)
759 else:
760 val['attive_imponibile_non_esente' ] = doc_vals.get('amount_untaxed', 0)
761 val['attive_imposta'] =doc_vals.get('amount_tax', 0)
762 # passive
763 else:
764 val['numero_operazioni_passive_aggregate'] = 1
765 if 'refund' in move.journal_id.type:
766 val['passive_note_variazione'] = doc_vals.get('amount_untaxed', 0)
767 val['passive_note_variazione_imposta'] = doc_vals.get('amount_tax', 0)
768 else:
769 if arg.get('operazione_iva_non_esposta', False):
770 val['passive_operazioni_iva_non_esposta' ] = doc_vals.get('amount_total', 0)
771 else:
772 val['passive_imponibile_non_esente' ] = doc_vals.get('amount_untaxed', 0)
773 val['passive_imposta' ] = doc_vals.get('amount_tax', 0)
774
775 # Partner already exists
776 if com_line_ids:
777 for com_line in self.browse(cr, uid, com_line_ids):
778 # attive
779 if arg.get('segno', False) == 'attiva':
780 val['numero_operazioni_attive_aggregate'] = com_line.numero_operazioni_attive_aggregate + 1
781 if 'refund' in move.journal_id.type:
782 val['attive_note_variazione'] = com_line.attive_note_variazione + doc_vals.get('amount_untaxed', 0)
783 val['attive_note_variazione_imposta'] = com_line.attive_note_variazione_imposta + doc_vals.get('amount_tax', 0)
784 else:
785 if arg.get('operazione_iva_non_esposta', False):
786 val['attive_operazioni_iva_non_esposta' ] = com_line.attive_operazioni_iva_non_esposta + doc_vals.get('amount_total', 0)
787 else:
788 val['attive_imponibile_non_esente' ] = com_line.attive_imponibile_non_esente + doc_vals.get('amount_untaxed', 0)
789 val['attive_imposta' ] = com_line.attive_imposta + doc_vals.get('amount_tax', 0)
790 # passive
791 else:
792 val['numero_operazioni_passive_aggregate'] = com_line.numero_operazioni_passive_aggregate + 1
793 if 'refund' in move.journal_id.type:
794 val['passive_note_variazione'] = com_line.passive_note_variazione + doc_vals.get('amount_untaxed', 0)
795 val['passive_note_variazione_imposta'] = com_line.passive_note_variazione_imposta + doc_vals.get('amount_tax', 0)
796 else:
797 if arg.get('operazione_iva_non_esposta', False):
798 val['passive_operazioni_iva_non_esposta' ] = com_line.passive_operazioni_iva_non_esposta + doc_vals.get('amount_total', 0)
799 else:
800 val['passive_imponibile_non_esente' ] = com_line.passive_imponibile_non_esente + doc_vals.get('amount_untaxed', 0)
801 val['passive_imposta' ] = com_line.passive_imposta + doc_vals.get('amount_tax', 0)
802
803 if com_line_ids:
804 line_id = com_line.id
805 self.write(cr, uid, [com_line.id], val)
806 else:
807 line_id = self.create(cr, uid, val)
808
809 return line_id
810
811class spesometro_comunicazione_line_SA(orm.Model):
812 '''
813 QUADRO SA - Operazioni senza fattura esposte in forma aggregata
814 '''
815 _name = "spesometro.comunicazione.line.sa"
816 _description = "Spesometro - Comunicazione linee quadro SA"
817 _columns = {
818 'comunicazione_id': fields.many2one('spesometro.comunicazione', 'Comunicazione' , ondelete='cascade'),
819 'partner_id': fields.many2one('res.partner', 'Partner'),
820 'codice_fiscale': fields.char('Codice Fiscale', size=16),
821
822 'numero_operazioni': fields.integer('Numero operazioni'),
823 'importo_complessivo': fields.float('Importo complessivo', digits_compute=dp.get_precision('Account')),
824 'noleggio': fields.selection((('A','Autovettura'), ('B','Caravan'), ('C','Altri Veicoli'), ('D','Unità da diporto'), ('E','Aeromobii')),'Leasing'),
825 }
826
827 def add_line(self, cr, uid, move, invoice, arg):
828 comunicazione_lines_obj = self.pool.get('spesometro.comunicazione.line.fa')
829 comunicazione_id = arg.get('comunicazione_id', False)
830 com_line_search = [('comunicazione_id','=',comunicazione_id), ('partner_id', '=', move.partner_id.id)]
831 com_line_ids = self.search(cr, uid, com_line_search)
832 val = {}
833 # Valori documento
834 doc_vals = self.pool.get('spesometro.comunicazione').compute_invoice_amounts(cr, uid, move, invoice, arg)
835 # New partner
836 if not com_line_ids:
837 val = {
838 'comunicazione_id' : comunicazione_id,
839 'partner_id' : move.partner_id.id,
840 'codice_fiscale' : move.partner_id.fiscalcode or False,
841 'noleggio' : move.partner_id.spesometro_leasing or False,
842 'numero_operazioni' : 1,
843 'importo_complessivo' : doc_vals.get('amount_total', 0),
844 }
845 # Partner already exists
846 if com_line_ids:
847 for com_line in self.browse(cr, uid, com_line_ids):
848 val['numero_operazioni'] = com_line.numero_operazioni + 1
849 val['importo_complessivo'] = com_line.importo_complessivo + doc_vals.get('amount_total', 0)
850
851 if com_line_ids:
852 line_id = com_line.id
853 self.write(cr, uid, [com_line.id], val)
854 else:
855 line_id = self.create(cr, uid, val)
856
857 return line_id
858
859class spesometro_comunicazione_line_BL(orm.Model):
860 '''
861 QUADRO BL
862 - Operazioni con paesi con fiscalità privilegiata (è obbligatorio compilare le sezioni BL001, BL002
863 e almeno un campo delle sezioni BL003, BL004, BL005, BL006, BL007, BL008)
864 - Operazioni con soggetti non residenti (è obbligatorio compilare le sezioni BL001, BL002 e almeno
865 un campo delle sezioni BL003 e BL006)
866 - Acquisti di servizi da soggetti non residenti (è obbligatorio compilare le sezioni BL001, BL002 e
867 almeno un campo della sezione BL006)
868 '''
869 _name = "spesometro.comunicazione.line.bl"
870 _description = "Spesometro - Comunicazione linee quadro BL"
871 _columns = {
872 'comunicazione_id': fields.many2one('spesometro.comunicazione', 'Comunicazione', ondelete='cascade'),
873 'partner_id': fields.many2one('res.partner', 'Partner'),
874 'codice_fiscale': fields.char('Codice Fiscale', size=16),
875
876 'numero_operazioni': fields.integer('Numero operazioni'),
877 'importo_complessivo': fields.integer('Importo complessivo', digits_compute=dp.get_precision('Account')),
878 'noleggio': fields.selection((('A','Autovettura'), ('B','Caravan'), ('C','Altri Veicoli'), ('D','Unità da diporto'), ('E','Aeromobii')),'Leasing'),
879
880 'pf_cognome': fields.char('Cognome', size=24, help=""),
881 'pf_nome': fields.char('Nome', size=20, help=""),
882 'pf_data_nascita': fields.date('Data di nascita'),
883 'pf_comune_stato_nascita': fields.char('Comune o stato estero di nascita', size=40),
884 'pf_provincia_nascita': fields.char('Provincia', size=2),
885 'pf_codice_stato_estero': fields.char('Codice Stato Estero', size=3, help="Deve essere uno di quelli presenti nella tabella 'elenco dei paesi e\
886 territori esteri' pubblicata nelle istruzioni del modello Unico"),
887 'pg_denominazione': fields.char('Denominazione/Ragione sociale', size=60),
888 'pg_citta_estera_sede_legale': fields.char('Città estera delle Sede legale', size=40),
889 'pg_codice_stato_estero': fields.char('Codice Stato Estero', size=3, help="Deve essere uno di quelli presenti nella tabella 'elenco dei paesi e\
890 territori esteri' pubblicata nelle istruzioni del modello Unico"),
891 'pg_indirizzo_sede_legale': fields.char('Indirizzo sede legale', size=60),
892
893 'codice_identificativo_IVA': fields.char('Codice identificativo IVA', size=16),
894 'operazione_fiscalita_privilegiata': fields.boolean('Operazione con pesei con fiscalità privilegiata'),
895 'operazione_con_soggetti_non_residenti': fields.boolean('Operazione con soggetto non residente'),
896 'Acquisto_servizi_da_soggetti_non_residenti': fields.boolean('Acquisto di servizi da soggetti non residenti'),
897
898 '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"),
899 'attive_imposta': fields.float('Tot operaz. attive imposta', digits_compute=dp.get_precision('Account'), help="Totale imposta"),
900 '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"),
901 '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"),
902 'attive_note_variazione': fields.float('Totale note variazione', digits_compute=dp.get_precision('Account'), help="Totale note di variazione a debito per la controparte"),
903 '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"),
904
905 '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"),
906 'passive_imposta': fields.float('Tot operaz. passive imposta', digits_compute=dp.get_precision('Account'), help="Totale imposta"),
907 '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"),
908 'passive_note_variazione': fields.float('Totale note variazione', digits_compute=dp.get_precision('Account'), help="Totale note di variazione a debito per la controparte"),
909 '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"),
910
911 }
912
913 def add_line(self, cr, uid, move, invoice, arg):
914 comunicazione_lines_obj = self.pool.get('spesometro.comunicazione.line.bl')
915 comunicazione_id = arg.get('comunicazione_id', False)
916 com_line_search = [('comunicazione_id','=',comunicazione_id), ('partner_id', '=', move.partner_id.id)]
917 com_line_ids = self.search(cr, uid, com_line_search)
918 val = {}
919 # Valori documento
920 doc_vals = self.pool.get('spesometro.comunicazione').compute_invoice_amounts(cr, uid, move, invoice, arg)
921 # New partner
922 if not com_line_ids:
923 # p.iva
924 if move.partner_id.vat:
925 partita_iva = move.partner_id.vat[2:]
926 else:
927 partita_iva = '{:11s}'.format("".zfill(11))
928 # prov. nascita
929 prov_code = False
930 '''
931 >>>> mancano dati persona fisica
932 if move.partner_id.birth_city.name:
933 city_data = move.partner_id.address[0]._set_vals_city_data(cr, uid, {'city' : move.partner_id.birth_city.name})
934 prov_id = city_data.get('province_id', False)
935 if prov_id:
936 prov = self.pool.get('res.province').borwse(cr, uid, prov_id)
937 prov_nascita_code = prov.code
938 '''
939
940 val = {
941 'comunicazione_id' : comunicazione_id,
942 'partner_id' : move.partner_id.id,
943 'codice_fiscale' : move.partner_id.fiscalcode or False,
944 'noleggio' : move.partner_id.spesometro_leasing or False,
945
946 ##'pf_cognome' : move.partner_id.fiscalcode_surname or False,
947 ##'pf_nome' : move.partner_id.fiscalcode_firstname or False,
948 ##'pf_data_nascita' : move.partner_id.birth_date or False,
949 ##'pf_comune_stato_nascita' : move.partner_id.birth_city.name or False,
950 ##'pf_provincia_nascita' : prov_code or False,
951 ##'pf_codice_stato_estero' : move.partner_id.address[0].country_id.codice_stato_agenzia_entrate or '',
952
953 'pg_denominazione' : move.partner_id.name or False,
954 'pg_citta_estera_sede_legale' : move.partner_id.address[0].city or False,
955 'pg_codice_stato_estero' : move.partner_id.address[0].country_id.codice_stato_agenzia_entrate or '',
956 'pg_indirizzo_sede_legale' : move.partner_id.address[0].street or False,
957
958 'operazione_fiscalita_privilegiata' : False,
959 'operazione_con_soggetti_non_residenti' : False,
960 'Acquisto_servizi_da_soggetti_non_residenti' : False,
961 }
962
963 if move.partner_id.spesometro_operazione == 'BL1':
964 val['operazione_fiscalita_privilegiata'] = True
965 elif move.partner_id.spesometro_operazione == 'BL2':
966 val['operazione_con_soggetti_non_residenti'] = True
967 elif move.partner_id.spesometro_operazione == 'BL3':
968 val['Acquisto_servizi_da_soggetti_non_residenti'] = True
969
970 # attive
971 if arg.get('segno', False) == 'attiva':
972
973 if val['operazione_fiscalita_privilegiata'] or val['operazione_con_soggetti_non_residenti']:
974 val['attive_importo_complessivo'] = doc_vals.get('amount_total', 0)
975 val['attive_imposta'] = doc_vals.get('amount_tax', 0)
976 if val['operazione_fiscalita_privilegiata'] == True:
977 if move.partner_id.spesometro_operazione == 'cessioni':
978 val['attive_non_sogg_cessione_beni'] = doc_vals.get('amount_total', 0)
979 else:
980 val['attive_non_sogg_servizi'] = doc_vals.get('amount_total', 0)
981 if 'refund' in move.journal_id.type:
982 val['attive_note_variazione'] = doc_vals.get('amount_untaxed', 0)
983 val['attive_note_variazione_imposta'] = doc_vals.get('amount_tax', 0)
984 # passive
985 else:
986
987 if val['operazione_fiscalita_privilegiata'] or val['operazione_con_soggetti_non_residenti'] or val['Acquisto_servizi_da_soggetti_non_residenti']:
988 val['passive_importo_complessivo'] = doc_vals.get('amount_total', 0)
989 val['passive_imposta'] = doc_vals.get('amount_tax', 0)
990 if val['operazione_fiscalita_privilegiata'] == True:
991 val['passive_non_sogg_importo_complessivo'] = doc_vals.get('amount_total', 0)
992 if 'refund' in move.journal_id.type:
993 val['passive_note_variazione'] = doc_vals.get('amount_untaxed', 0)
994 val['passive_note_variazione_imposta'] = doc_vals.get('amount_tax', 0)
995
996 # Partner already exists
997 if com_line_ids:
998 for com_line in self.browse(cr, uid, com_line_ids):
999 # attive
1000 if arg.get('segno', False) == 'attiva':
1001
1002 if val['operazione_fiscalita_privilegiata'] or val['operazione_con_soggetti_non_residenti']:
1003 val['attive_importo_complessivo'] = com_line.attive_importo_complessivo + doc_vals.get('amount_total', 0)
1004 val['attive_imposta'] = com_line.attive_imposta + doc_vals.get('amount_tax', 0)
1005 if val['operazione_fiscalita_privilegiata'] == True:
1006 if move.partner_id.spesometro_operazione == 'cessioni':
1007 val['attive_non_sogg_cessione_beni'] = com_line.attive_non_sogg_cessione_beni + doc_vals.get('amount_total', 0)
1008 else:
1009 val['attive_non_sogg_servizi'] = com_line.attive_non_sogg_servizi + doc_vals.get('amount_total', 0)
1010 if 'refund' in move.journal_id.type:
1011 val['attive_note_variazione'] = com_line.attive_note_variazione + doc_vals.get('amount_untaxed', 0)
1012 val['attive_note_variazione_imposta'] = com_line.attive_note_variazione_imposta + doc_vals.get('amount_tax', 0)
1013
1014 # passive
1015 else:
1016
1017 if val['operazione_fiscalita_privilegiata'] or val['operazione_con_soggetti_non_residenti'] or val['Acquisto_servizi_da_soggetti_non_residenti']:
1018 val['passive_importo_complessivo'] = com_line.passive_importo_complessivo + doc_vals.get('amount_total', 0)
1019 val['passive_imposta'] = com_line.passive_imposta + doc_vals.get('amount_tax', 0)
1020 if val['operazione_fiscalita_privilegiata'] == True:
1021 val['passive_non_sogg_importo_complessivo'] = com_line.passive_non_sogg_importo_complessivo + doc_vals.get('amount_total', 0)
1022 if 'refund' in move.journal_id.type:
1023 val['passive_note_variazione'] = com_line.passive_note_variazione + doc_vals.get('amount_untaxed', 0)
1024 val['passive_note_variazione_imposta'] = com_line.passive_note_variazione_imposta + doc_vals.get('amount_tax', 0)
1025
1026 if com_line_ids:
1027 line_id = com_line.id
1028 self.write(cr, uid, [com_line.id], val)
1029 else:
1030 line_id = self.create(cr, uid, val)
1031
1032 return line_id
1033
1034class spesometro_comunicazione_line_FE(orm.Model):
1035
1036 _name = "spesometro.comunicazione.line.fe"
1037 _description = "Spesometro - Comunicazione linee quadro FE"
1038 _columns = {
1039 'comunicazione_id': fields.many2one('spesometro.comunicazione', 'Comunicazione', ondelete='cascade'),
1040
1041 'partner_id': fields.many2one('res.partner', 'Partner'),
1042 'partita_iva': fields.char('Partita IVA', size=11),
1043 'codice_fiscale': fields.char('Codice Fiscale', size=16),
1044 'documento_riepilogativo': fields.boolean('Documento Riepilogativo'),
1045 'noleggio': fields.selection((('A','Autovettura'), ('B','Caravan'), ('C','Altri Veicoli'), ('D','Unità da diporto'), ('E','Aeromobii')),'Leasing'),
1046
1047 'autofattura': fields.boolean('Autofattura'),
1048 'data_documento': fields.date('Data documento'),
1049 'data_registrazione': fields.date('Data registrazione'),
1050 'numero_fattura': fields.char('Numero Fattura - Doc riepilog.', size=16),
1051
1052 'importo': fields.float('Importo', digits_compute=dp.get_precision('Account')),
1053 'imposta': fields.float('Imposta', digits_compute=dp.get_precision('Account')),
1054 }
1055
1056class spesometro_comunicazione_line_FR(orm.Model):
1057
1058 _name = "spesometro.comunicazione.line.fr"
1059 _description = "Spesometro - Comunicazione linee quadro FR"
1060 _columns = {
1061 'comunicazione_id': fields.many2one('spesometro.comunicazione', 'Comunicazione', ondelete='cascade'),
1062
1063 'partner_id': fields.many2one('res.partner', 'Partner'),
1064 'partita_iva': fields.char('Partita IVA', size=11),
1065 'documento_riepilogativo': fields.boolean('Documento Riepilogativo'),
1066 'data_documento': fields.date('Data documento'),
1067 'data_registrazione': fields.date('Data registrazione'),
1068 'iva_non_esposta': fields.boolean('IVA non esposta'),
1069 'reverse_charge': fields.boolean('Reverse charge'),
1070 'autofattura': fields.boolean('Autofattura'),
1071
1072 'importo': fields.float('Importo', digits_compute=dp.get_precision('Account')),
1073 'imposta': fields.float('Imposta', digits_compute=dp.get_precision('Account')),
1074 }
1075
1076class spesometro_comunicazione_line_NE(orm.Model):
1077
1078 _name = "spesometro.comunicazione.line.ne"
1079 _description = "Spesometro - Comunicazione linee quadro NE"
1080 _columns = {
1081 'comunicazione_id': fields.many2one('spesometro.comunicazione', 'Comunicazione', ondelete='cascade'),
1082
1083 'partner_id': fields.many2one('res.partner', 'Partner'),
1084 'partita_iva': fields.char('Partita IVA', size=11),
1085 'codice_fiscale': fields.char('Codice Fiscale', size=16),
1086 'data_emissione': fields.date('Data emissione'),
1087 'data_registrazione': fields.date('Data registrazione'),
1088 'numero_nota': fields.char('Numero Nota', size=16),
1089
1090 'importo': fields.float('Importo', digits_compute=dp.get_precision('Account')),
1091 'imposta': fields.float('Imposta', digits_compute=dp.get_precision('Account')),
1092 }
1093
1094class spesometro_comunicazione_line_NR(orm.Model):
1095
1096 _name = "spesometro.comunicazione.line.nr"
1097 _description = "Spesometro - Comunicazione linee quadro NR"
1098 _columns = {
1099 'comunicazione_id': fields.many2one('spesometro.comunicazione', 'Comunicazione', ondelete='cascade'),
1100
1101 'partner_id': fields.many2one('res.partner', 'Partner'),
1102 'partita_iva': fields.char('Partita IVA', size=11),
1103 'data_documento': fields.date('Data documento'),
1104 'data_registrazione': fields.date('Data registrazione'),
1105
1106 'importo': fields.float('Importo', digits_compute=dp.get_precision('Account')),
1107 'imposta': fields.float('Imposta', digits_compute=dp.get_precision('Account')),
1108 }
1109
1110class spesometro_comunicazione_line_DF(orm.Model):
1111
1112 _name = "spesometro.comunicazione.line.df"
1113 _description = "Spesometro - Comunicazione linee quadro DF"
1114 _columns = {
1115 'comunicazione_id': fields.many2one('spesometro.comunicazione', 'Comunicazione', ondelete='cascade'),
1116
1117 'partner_id': fields.many2one('res.partner', 'Partner'),
1118 'codice_fiscale': fields.char('Codice Fiscale', size=16),
1119 'data_operazione': fields.date('Data operazione'),
1120
1121 'importo': fields.float('Importo', digits_compute=dp.get_precision('Account')),
1122 'noleggio': fields.selection((('A','Autovettura'), ('B','Caravan'), ('C','Altri Veicoli'), ('D','Unità da diporto'), ('E','Aeromobii')),'Leasing'),
1123 }
1124
1125class spesometro_comunicazione_line_FN(orm.Model):
1126
1127 _name = "spesometro.comunicazione.line.fn"
1128 _description = "Spesometro - Comunicazione linee quadro FN"
1129 _columns = {
1130 'comunicazione_id': fields.many2one('spesometro.comunicazione', 'Comunicazione', ondelete='cascade'),
1131 'partner_id': fields.many2one('res.partner', 'Partner'),
1132
1133 'pf_cognome': fields.char('Cognome', size=24, help=""),
1134 'pf_nome': fields.char('Nome', size=20, help=""),
1135 'pf_data_nascita': fields.date('Data di nascita'),
1136 'pf_comune_stato_nascita': fields.char('Comune o stato estero di nascita', size=40),
1137 'pf_provincia_nascita': fields.char('Provincia', size=2),
1138 'pf_codice_stato_estero_domicilio': fields.char('Codice Stato Estero del Domicilio', size=3, help="Deve essere uno di quelli presenti nella tabella 'elenco dei paesi e\
1139 territori esteri' pubblicata nelle istruzioni del modello Unico"),
1140
1141 'pg_denominazione': fields.char('Denominazione/Ragione sociale', size=60),
1142 'pg_citta_estera_sede_legale': fields.char('Città estera delle Sede legale', size=40),
1143 'pg_codice_stato_estero_domicilio': fields.char('Codice Stato Estero del Domicilio', size=3, help="Deve essere uno di quelli presenti nella tabella 'elenco dei paesi e\
1144 territori esteri' pubblicata nelle istruzioni del modello Unico"),
1145 'pg_indirizzo_sede_legale': fields.char('Indirizzo legale', size=40),
1146
1147 'data_emissione': fields.date('Data emissione'),
1148 'data_registrazione': fields.date('Data registrazione'),
1149 'numero_fattura': fields.char('Numero Fattura/Doc riepilog.', size=16),
1150 'noleggio': fields.selection((('A','Autovettura'), ('B','Caravan'), ('C','Altri Veicoli'), ('D','Unità da diporto'), ('E','Aeromobii')),'Leasing'),
1151
1152 'importo': fields.float('Importo', digits_compute=dp.get_precision('Account')),
1153 'imposta': fields.float('Imposta', digits_compute=dp.get_precision('Account')),
1154 }
1155
1156
1157class spesometro_comunicazione_line_SE(orm.Model):
1158 '''
1159 QUADRO SE - Acquisti di servizi da non residenti e Acquisti da operatori di San Marino
1160 '''
1161 _name = "spesometro.comunicazione.line.se"
1162 _description = "Spesometro - Comunicazione linee quadro SE"
1163 _columns = {
1164 'comunicazione_id': fields.many2one('spesometro.comunicazione', 'Comunicazione', ondelete='cascade'),
1165 'partner_id': fields.many2one('res.partner', 'Partner'),
1166
1167 'pf_cognome': fields.char('Cognome', size=24, help=""),
1168 'pf_nome': fields.char('Nome', size=20, help=""),
1169 'pf_data_nascita': fields.date('Data di nascita'),
1170 'pf_comune_stato_nascita': fields.char('Comune o stato estero di nascita', size=40),
1171 'pf_provincia_nascita': fields.char('Provincia', size=2),
1172 'pf_codice_stato_estero_domicilio': fields.char('Codice Stato Estero del Domicilio', size=3, help="Deve essere uno di quelli presenti nella tabella 'elenco dei paesi e\
1173 territori esteri' pubblicata nelle istruzioni del modello Unico"),
1174
1175 'pg_denominazione': fields.char('Denominazione/Ragione sociale', size=60),
1176 'pg_citta_estera_sede_legale': fields.char('Città estera delle Sede legale', size=40),
1177 'pg_codice_stato_estero_domicilio': fields.char('Codice Stato Estero del Domicilio', size=3, help="Deve essere uno di quelli presenti nella tabella 'elenco dei paesi e\
1178 territori esteri' pubblicata nelle istruzioni del modello Unico"),
1179 'pg_indirizzo_sede_legale': fields.char('Indirizzo legale', size=40),
1180
1181 'codice_identificativo_IVA': fields.char('Codice Identificativo IVA (037=San Marino)', size=3),
1182 'data_emissione': fields.date('Data emissione'),
1183 'data_registrazione': fields.date('Data registrazione'),
1184 'numero_fattura': fields.char('Numero Fattura/Doc riepilog.', size=16),
1185
1186 'importo': fields.float('Importo/imponibile', digits_compute=dp.get_precision('Account')),
1187 'imposta': fields.float('Imposta', digits_compute=dp.get_precision('Account')),
1188 }
1189
1190 def add_line(self, cr, uid, move, invoice, arg):
1191 comunicazione_lines_obj = self.pool.get('spesometro.comunicazione.line.se')
1192 comunicazione_id = arg.get('comunicazione_id', False)
1193 com_line_search = [('comunicazione_id','=',comunicazione_id), ('partner_id', '=', move.partner_id.id)]
1194 com_line_ids = self.search(cr, uid, com_line_search)
1195 val = {}
1196 # Valori documento
1197 doc_vals = self.pool.get('spesometro.comunicazione').compute_invoice_amounts(cr, uid, move, invoice, arg)
1198 # p.iva
1199 if move.partner_id.vat:
1200 partita_iva = move.partner_id.vat[2:]
1201 else:
1202 partita_iva = '{:11s}'.format("".zfill(11))
1203 # prov. nascita
1204 '''
1205 >> dati persona fisica>> da aggiungere
1206 prov_code = False
1207 if move.partner_id.birth_city.name:
1208 city_data = move.partner_id.address[0]._set_vals_city_data(cr, uid, {'city' : move.partner_id.birth_city.name})
1209 prov_id = city_data.get('province_id', False)
1210 if prov_id:
1211 prov = self.pool.get('res.province').borwse(cr, uid, prov_id)
1212 prov_nascita_code = prov.code
1213 '''
1214 # Indirizzo
1215 address = self.pool.get('spesometro.comunicazione')._get_partner_address_obj(cr, uid, move, invoice, arg)
1216 # Codice identificativo IVA -Da indicare esclusivamente per operazioni con San Marino (Codice Stato = 037)
1217 codice_identificativo_iva=''
1218 if self.pool.get('spesometro.comunicazione').partner_is_from_san_marino(cr, uid, move, invoice, arg):
1219 codice_identificativo_iva = '037'
1220 val = {
1221 'comunicazione_id' : comunicazione_id,
1222 'partner_id' : move.partner_id.id,
1223 'codice_fiscale' : move.partner_id.fiscalcode or False,
1224 'noleggio' : move.partner_id.spesometro_leasing or False,
1225
1226 #'pf_cognome' : move.partner_id.fiscalcode_surname or False,
1227 #'pf_nome' : move.partner_id.fiscalcode_firstname or False,
1228 #'pf_data_nascita' : move.partner_id.birth_date or False,
1229 #'pf_comune_stato_nascita' : move.partner_id.birth_city.name or False,
1230 #'pf_provincia_nascita' : prov_code or False,
1231 #'pf_codice_stato_estero_domicilio' : address.country_id.codice_stato_agenzia_entrate or codice_identificativo_iva or '',
1232
1233 'pg_denominazione' : move.partner_id.name or False,
1234 'pg_citta_estera_sede_legale' : address.city or False,
1235 'pg_codice_stato_estero_domicilio' : address.country_id.codice_stato_agenzia_entrate or codice_identificativo_iva or '',
1236 'pg_indirizzo_sede_legale' : address.street or False,
1237
1238 'codice_identificativo_IVA' : codice_identificativo_iva,
1239
1240 'data_emissione': move.date,
1241 'data_registrazione': invoice.date_invoice or move.date,
1242 'numero_fattura': move.name,
1243
1244 'importo': doc_vals.get('amount_untaxed', 0),
1245 'imposta': doc_vals.get('amount_tax', 0)
1246 }
1247
1248 line_id = self.create(cr, uid, val)
1249
1250 return line_id
1251
1252class spesometro_comunicazione_line_TU(orm.Model):
1253
1254 _name = "spesometro.comunicazione.line.tu"
1255 _description = "Spesometro - Comunicazione linee quadro TU"
1256 _columns = {
1257 'comunicazione_id': fields.many2one('spesometro.comunicazione', 'Comunicazione', ondelete='cascade'),
1258 'partner_id': fields.many2one('res.partner', 'Partner'),
1259
1260 'cognome': fields.char('Cognome', size=24, help=""),
1261 'nome': fields.char('Nome', size=20, help=""),
1262 'data_nascita': fields.date('Data di nascita'),
1263 'comune_stato_nascita': fields.char('Comune o stato estero di nascita', size=40),
1264 'provincia_nascita': fields.char('Provincia', size=2),
1265 'citta_estera_residenza': fields.char('Città Estera di residenza', size=40),
1266 'codice_stato_estero': fields.char('Codice Stato Estero', size=3, help="Deve essere uno di quelli presenti nella tabella 'elenco dei paesi e\
1267 territori esteri' pubblicata nelle istruzioni del modello Unico"),
1268 'indirizzo_estero_residenza': fields.char('Indirizzo Estero di residenza', size=40),
1269
1270 'data_emissione': fields.date('Data emissione'),
1271 'data_registrazione': fields.date('Data registrazione'),
1272 'numero_fattura': fields.char('Numero Fattura/Doc riepilog.', size=16),
1273
1274 'importo': fields.float('Importo/imponibile', digits_compute=dp.get_precision('Account')),
1275 'imposta': fields.float('Imposta', digits_compute=dp.get_precision('Account')),
1276 }
01277
=== 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-20 14:19:55 +0000
@@ -0,0 +1,628 @@
1<?xml version="1.0" encoding="utf-8"?>
2<openerp>
3 <data>
4
5 <!--
6 PARTNER
7 -->
8 <record id="spesometro_account_partner_view_form" model="ir.ui.view">
9 <field name="name">spesometro.account.partner.view.form</field>
10 <field name="model">res.partner</field>
11 <field name="inherit_id" ref="base.view_partner_form"/>
12 <field name="arch" type="xml">
13 <xpath expr="//field[@name='bank_ids']" position="after">
14 <group string="Comunicazione art.21" colspan="4">
15 <group colspan="2">
16 <field name="spesometro_escludi"/>
17 <field name="spesometro_operazione" attrs="{'invisible': [('spesometro_escludi', '=', True)]}"/>
18 <field name="spesometro_tipo_servizio" attrs="{'invisible': [('spesometro_operazione', '!=', 'BL1')], 'required': [('spesometro_operazione', '=', 'BL1')]}"/>
19 </group>
20 <group>
21 <field name="spesometro_IVA_non_esposta" attrs="{'invisible': ['|', ('spesometro_escludi', '=', True), ('spesometro_operazione', '!=', 'FA')]}" />
22 </group>
23 <group>
24 <field name="spesometro_leasing" attrs="{'invisible': [('spesometro_escludi', '=', True)]}" />
25 </group>
26 </group>
27 </xpath>
28 </field>
29 </record>
30
31 <!--
32 JOURNAL
33 -->
34 <record id="spesometro_account_journal_view_form" model="ir.ui.view">
35 <field name="name">spesometro.account.journal.view.form</field>
36 <field name="model">account.journal</field>
37 <field name="inherit_id" ref="account.view_account_journal_form"/>
38 <field name="arch" type="xml">
39 <xpath expr="//field[@name='sequence_id']" position="after">
40 <group string="Comunicazione art.21" colspan="4">
41 <field name="spesometro"/>
42 <field name="spesometro_operazione" attrs="{'invisible': [('spesometro', '=', False)], 'required': [('spesometro', '=', True)]}"/>
43 <field name="spesometro_segno" attrs="{'invisible': ['|', ('spesometro', '=', False), ('spesometro_operazione', '=', 'SA')], 'required': [('spesometro_operazione', 'IN', ('FA','BL1','BL2','BL3') )]}" />
44 <field name="spesometro_IVA_non_esposta" attrs="{'invisible': ['|', ('spesometro', '=', False), ('spesometro_operazione', '=', 'SA')]}" />
45 </group>
46 </xpath>
47 </field>
48 </record>
49
50
51 <!--
52 COUNTRY
53 -->
54 <record id="spesometro_res_country_view_form" model="ir.ui.view">
55 <field name="name">spesometro.res.country.view.form</field>
56 <field name="model">res.country</field>
57 <field name="inherit_id" ref="base.view_country_form"/>
58 <field name="arch" type="xml">
59 <xpath expr="//field[@name='address_format']" position="after">
60 <group>
61 <field name="codice_stato_agenzia_entrate"/>
62 </group>
63 </xpath>
64 </field>
65 </record>
66 <record id="spesometro_res_country_view_tree" model="ir.ui.view">
67 <field name="name">spesometro.res.country.view.tree</field>
68 <field name="model">res.country</field>
69 <field name="inherit_id" ref="base.view_country_tree"/>
70 <field name="arch" type="xml">
71 <xpath expr="//field[@name='code']" position="after">
72 <field name="codice_stato_agenzia_entrate"/>
73 </xpath>
74 </field>
75 </record>
76
77 <!--
78 SPESOMETRO
79 -->
80 <menuitem id="menu_spesometro_main"
81 name="Spesometro" parent="account.menu_account_end_year_treatments"/>
82
83 <!--
84 Configurazione
85 -->
86
87 <record id="spesometro_configurazione_view_tree" model="ir.ui.view">
88 <field name="name">spesometro.configurazione.view.tree</field>
89 <field name="model">spesometro.configurazione</field>
90 <field name="arch" type="xml">
91 <tree string="Configurazione Spesometro">
92 <field name="anno"/>
93 </tree>
94 </field>
95 </record>
96 <record id="spesometro_configurazione_view_form" model="ir.ui.view">
97 <field name="name">spesometro.configurazione.view.form</field>
98 <field name="model">spesometro.configurazione</field>
99 <field name="arch" type="xml">
100 <form string="Configurazione Spesometro">
101 <group>
102 <field name="anno"/>
103 <newline/>
104 <field name="stato_san_marino"/>
105 </group>
106 <newline/>
107 <group string="Quadri per dati in forma aggregata">
108 <group col="2">
109 <label string="Quadro FA - Operazioni documentate da fattura esposte in forma aggregata" colspan="2" />
110 <field name="quadro_fa_limite_importo" />
111 <field name="quadro_fa_limite_importo_line" />
112 </group>
113 <group col="2">
114 <label string="Quadro SA - Operazioni senza fattura esposte in forma aggregata" colspan="2"/>
115 <field name="quadro_sa_limite_importo" />
116 <field name="quadro_sa_limite_importo_line" />
117 </group>
118 <group col="2">
119 <label string="Quadro BL - Operazioni con paesi con fiscalità privilegiata - Operazioni con soggetti non residenti - Acquisti di servizi da soggetti non residenti " colspan="2"/>
120 <field name="quadro_bl_limite_importo" />
121 <field name="quadro_bl_limite_importo_line" />
122 </group>
123 <newline/>
124 <group string="Quadri per dati in forma analitica">
125 <group col="2">
126 <label string="Quadro SE - Acquisti di servizi da non residenti e Acquisti da operatori di San Marino" colspan="2"/>
127 <field name="quadro_se_limite_importo_line" />
128 </group>
129 </group>
130 </group>
131 </form>
132 </field>
133 </record>
134
135 <record id="spesometro_configurazione_action" model="ir.actions.act_window">
136 <field name="name">Configurazione Spesometro</field>
137 <field name="type">ir.actions.act_window</field>
138 <field name="res_model">spesometro.configurazione</field>
139 <field name="view_type">form</field>
140 <field name="view_mode">tree,form</field>
141 </record>
142
143 <menuitem id="menu_spesometro_configurazione" action="spesometro_configurazione_action"
144 name="Configurazione Spesometro" parent="menu_spesometro_main" sequence="100"/>
145
146
147 <!--
148 Comunicazioni
149 -->
150 <record id="spesometro_comunicazione_view_form" model="ir.ui.view">
151 <field name="name">spesometro.comunicazione.view.form</field>
152 <field name="model">spesometro.comunicazione</field>
153 <field name="type">form</field>
154 <field name="arch" type="xml">
155 <form string="Comunicazione">
156 <group colspan="4">
157 <field name="tipo"/>
158 <field name="progressivo_telematico"/>
159 <field name="periodo"/>
160 <field name="anno"/>
161 <field name="mese" attrs="{'invisible':[('periodo','!=','mese')], 'required':[('periodo','=','mese')]}"/>
162 <field name="trimestre" attrs="{'invisible':[('periodo','!=','trimestre')], 'required':[('periodo','=','trimestre')]}"/>
163 <field name="tipo_fornitore" invisible="1"/>
164 <field name="comunicazione_da_sostituire_annullare" attrs="{'invisible':[('tipo','=','ordinaria')], 'required':[('tipo','!=','ordinaria')]}"/>
165 <field name="documento_da_sostituire_annullare" attrs="{'invisible':[('tipo','=','ordinaria')], 'required':[('comunicazione_da_sostituire_annullare','!=',0)]}"/>
166 <newline/>
167 <field name="formato_dati"/>
168 </group>
169
170 <newline/>
171 <!--
172 Soggetto comunicazione
173 -->
174 <notebook>
175 <page string="Soggetto Obbligato">
176 <group colspan="4">
177 <field name="soggetto_codice_fiscale"/>
178 <field name="soggetto_partitaIVA"/>
179 <field name="soggetto_codice_attivita" required="1"/>
180 <field name="soggetto_telefono"/>
181 <field name="soggetto_fax"/>
182 <field name="soggetto_email"/>
183 <field name="soggetto_forma_giuridica"/>
184 </group>
185 <group string="Dati persona giuridica" colspan="4" attrs="{'invisible':[('soggetto_forma_giuridica','!=','persona_giuridica')]}">
186 <field name="soggetto_pg_denominazione" attrs="{'required':[('soggetto_forma_giuridica','==','persona_giuridica')]}" />
187 </group>
188 <group string="Dati persona fisica" colspan="4" attrs="{'invisible':[('soggetto_forma_giuridica','==','persona_giuridica')]}">
189 <field name="soggetto_pf_cognome" attrs="{'required':[('soggetto_forma_giuridica','!=','persona_giuridica')]}"/>
190 <field name="soggetto_pf_nome" attrs="{'required':[('soggetto_forma_giuridica','!=','persona_giuridica')]}"/>
191 <field name="soggetto_pf_sesso" attrs="{'required':[('soggetto_forma_giuridica','!=','persona_giuridica')]}"/>
192 <field name="soggetto_pf_data_nascita" attrs="{'required':[('soggetto_forma_giuridica','!=','persona_giuridica')]}"/>
193 <field name="soggetto_pf_comune_nascita" attrs="{'required':[('soggetto_forma_giuridica','!=','persona_giuridica')]}"/>
194 <field name="soggetto_pf_provincia_nascita" attrs="{'required':[('soggetto_forma_giuridica','!=','persona_giuridica')]}"/>
195 </group>
196 </page>
197
198 <page string="Soggetto Tenuto alla comunicazione">
199 <group colspan="4">
200 <field name="tipo_fornitore"/>
201 <field name="soggetto_cm_forma_giuridica"/>
202 <field name="soggetto_cm_codice_fiscale"/>
203 </group>
204 <group string="Dati persona giuridica" colspan="4" attrs="{'invisible':[('soggetto_cm_forma_giuridica','!=','persona_giuridica')]}">
205 <field name="soggetto_cm_pg_denominazione" attrs="{'required':[('soggetto_cm_forma_giuridica','==','persona_giuridica')]}" />
206 </group>
207 <group string="Dati persona fisica" colspan="4" attrs="{'invisible':[('soggetto_cm_forma_giuridica','==','persona_giuridica')]}">
208 <field name="soggetto_cm_pf_cognome" attrs="{'required':[('soggetto_cm_forma_giuridica','!=','persona_giuridica')]}"/>
209 <field name="soggetto_cm_pf_nome" attrs="{'required':[('soggetto_cm_forma_giuridica','!=','persona_giuridica')]}"/>
210 <field name="soggetto_cm_pf_sesso" attrs="{'required':[('soggetto_cm_forma_giuridica','!=','persona_giuridica')]}"/>
211 <field name="soggetto_cm_pf_data_nascita" attrs="{'required':[('soggetto_cm_forma_giuridica','!=','persona_giuridica')]}"/>
212 <field name="soggetto_cm_pf_comune_nascita" attrs="{'required':[('soggetto_cm_forma_giuridica','!=','persona_giuridica')]}"/>
213 <field name="soggetto_cm_pf_provincia_nascita" attrs="{'required':[('soggetto_cm_forma_giuridica','!=','persona_giuridica')]}"/>
214 </group>
215 </page>
216
217 <page string="Incaricato alla trasmissione">
218 <group colspan="4">
219 <field name="soggetto_trasmissione_codice_fiscale" attrs="{'required':[('tipo_fornitore','==','10')]}" />
220 <field name="soggetto_trasmissione_numero_CAF" />
221 <field name="soggetto_trasmissione_impegno" required="1" on_change="onchange_trasmissione_impegno(soggetto_trasmissione_impegno, context)" context="{'soggetto_codice_fiscale': soggetto_codice_fiscale}"/>
222 <field name="soggetto_trasmissione_data_impegno" attrs="{'required':[('soggetto_trasmissione_codice_fiscale','!=',False)]}"/>
223 </group>
224 </page>
225
226 </notebook>
227 <newline/>
228 <!--
229 Quadri
230 -->
231 <notebook>
232 <page string="Quadri FA">
233 <label string="FORMA AGGREGATA : Operazioni documentate da fattura esposte in forma aggregata" colspan="4"/>
234 <newline/>
235 <field name="line_FA_ids" nolabel="1">
236 <tree>
237 <field name="partner_id"/>
238 <field name="numero_operazioni_attive_aggregate" string="Nr op. attive"/>
239 <field name="numero_operazioni_passive_aggregate" string="Nr op. passive"/>
240 <field name="noleggio"/>
241 <field name="attive_imponibile_non_esente" string="Attive : Impon., non impon, esente"/>
242 <field name="attive_imposta" string="Attive : imposta"/>
243 <field name="passive_imponibile_non_esente" string="Passive : Impon., non impon, esente"/>
244 <field name="passive_imposta" string="Passive : imposta"/>
245 </tree>
246 </field>
247 </page>
248 <page string="Quadri SA">
249 <label string="FORMA AGGREGATA : Operazioni senza fattura esposte in forma aggregata" colspan="4"/>
250 <newline/>
251 <field name="line_SA_ids" nolabel="1">
252 <tree>
253 <field name="partner_id"/>
254 <field name="codice_fiscale"/>
255 <field name="numero_operazioni"/>
256 <field name="noleggio"/>
257 <field name="importo_complessivo"/>
258 </tree>
259 </field>
260 </page>
261 <page string="Quadri BL">
262 <label string="FORMA AGGREGATA : Operazioni con paesi con fiscalità privilegiata - Operazioni con soggetti non residenti
263 - Acquisti di servizi da soggetti non residenti" colspan="4"/>
264 <newline/>
265 <field name="line_BL_ids" nolabel="1">
266 <tree>
267 <field name="partner_id"/>
268 <field name="codice_fiscale"/>
269 <field name="noleggio"/>
270 <field name="pf_cognome"/>
271 <field name="pg_denominazione"/>
272 <field name="operazione_fiscalita_privilegiata"/>
273 <field name="operazione_con_soggetti_non_residenti"/>
274 <field name="Acquisto_servizi_da_soggetti_non_residenti"/>
275 <field name="attive_importo_complessivo"/>
276 <field name="passive_importo_complessivo"/>
277 </tree>
278 </field>
279 </page>
280 <page string="Quadri SE">
281 <label string="FORMA ANALITICA : Acquisti di servizi da non residenti e Acquisti da operatori di San Marino" colspan="4"/>
282 <newline/>
283 <field name="line_SE_ids" nolabel="1">
284 <tree>
285 <field name="partner_id"/>
286 <field name="pf_cognome"/>
287 <field name="pg_denominazione"/>
288 <field name="numero_fattura"/>
289 <field name="data_emissione"/>
290 <field name="data_registrazione"/>
291 <field name="importo"/>
292 <field name="imposta"/>
293 </tree>
294 </field>
295 </page>
296
297 <page string="Quadri FE">
298 <label string="FORMA ANALITICA : Fatture emesse e Documenti riepilogativi(Operazioni Attive)" colspan="4"/>
299 <newline/>
300 <field name="line_FE_ids" nolabel="1">
301 <tree>
302 <field name="partner_id"/>
303 <field name="partita_iva"/>
304 <field name="codice_fiscale"/>
305 <field name="numero_fattura"/>
306 <field name="data_documento"/>
307 <field name="data_registrazione"/>
308 <field name="importo"/>
309 <field name="imposta"/>
310 </tree>
311 </field>
312 </page>
313 <page string="Quadri FR">
314 <label string="FORMA ANALITICA : Fatture ricevute e Documenti riepilogativi (Operazioni passive)" colspan="4"/>
315 <newline/>
316 <field name="line_FR_ids" nolabel="1">
317 <tree>
318 <field name="partner_id"/>
319 <field name="partita_iva"/>
320 <field name="documento_riepilogativo"/>
321 <field name="data_documento"/>
322 <field name="data_registrazione"/>
323 <field name="importo"/>
324 <field name="imposta"/>
325 </tree>
326 </field>
327 </page>
328 <page string="Quadri NE">
329 <label string="FORMA ANALITICA : Note di variazione emesse" colspan="4"/>
330 <newline/>
331 <field name="line_NE_ids" nolabel="1">
332 <tree>
333 <field name="partner_id"/>
334 <field name="partita_iva"/>
335 <field name="codice_fiscale"/>
336 <field name="numero_nota"/>
337 <field name="data_emissione"/>
338 <field name="data_registrazione"/>
339 <field name="importo"/>
340 <field name="imposta"/>
341 </tree>
342 </field>
343 </page>
344 <page string="Quadri NR">
345 <label string="FORMA ANALITICA : Note di variazione ricevute" colspan="4"/>
346 <newline/>
347 <field name="line_NR_ids" nolabel="1">
348 <tree>
349 <field name="partner_id"/>
350 <field name="partita_iva"/>
351 <field name="data_documento"/>
352 <field name="data_registrazione"/>
353 <field name="importo"/>
354 <field name="imposta"/>
355 </tree>
356 </field>
357 </page>
358 <page string="Quadri DF">
359 <label string="FORMA ANALITICA : Operazioni senza fattura" colspan="4"/>
360 <newline/>
361 <field name="line_DF_ids" nolabel="1">
362 <tree>
363 <field name="partner_id"/>
364 <field name="codice_fiscale"/>
365 <field name="data_operazione"/>
366 <field name="importo"/>
367 </tree>
368 </field>
369 </page>
370 <page string="Quadri FN">
371 <label string="FORMA ANALITICA : Operazioni con soggetti non residenti (Operazioni attive)" colspan="4"/>
372 <newline/>
373 <field name="line_FN_ids" nolabel="1">
374 <tree>
375 <field name="partner_id"/>
376 <field name="pf_cognome"/>
377 <field name="pf_nome"/>
378 <field name="pg_denominazione"/>
379
380 <field name="numero_fattura"/>
381 <field name="data_emissione"/>
382 <field name="data_registrazione"/>
383 <field name="importo"/>
384 <field name="imposta"/>
385 </tree>
386 </field>
387 </page>
388 <page string="Quadri TU">
389 <label string="FORMA ANALITICA : Operazioni legate al turismo - Art. 3 comma 1 D.L. 16/2012" colspan="4"/>
390 <newline/>
391 <field name="line_TU_ids" nolabel="1">
392 <tree>
393 <field name="partner_id"/>
394 <field name="cognome"/>
395 <field name="nome"/>
396
397 <field name="numero_fattura"/>
398 <field name="data_emissione"/>
399 <field name="data_registrazione"/>
400 <field name="importo"/>
401 <field name="imposta"/>
402 </tree>
403 </field>
404 </page>
405 </notebook>
406 </form>
407 </field>
408 </record>
409
410 <record id="spesometro_comunicazione_view_tree" model="ir.ui.view">
411 <field name="name">spesometro.comunicazione.view.tree</field>
412 <field name="model">spesometro.comunicazione</field>
413 <field name="type">tree</field>
414 <field name="arch" type="xml">
415 <tree string="Comunicazioni">
416 <field name="progressivo_telematico"/>
417 <field name="tipo"/>
418 <field name="formato_dati"/>
419 <field name="periodo"/>
420 <field name="anno"/>
421 <field name="mese"/>
422 <field name="trimestre"/>
423 <field name="soggetto_codice_fiscale"/>
424 </tree>
425 </field>
426 </record>
427
428 <record model="ir.ui.view" id="spesometro_comunicazione_search">
429 <field name="name">salesman.commission.search</field>
430 <field name="model">spesometro.comunicazione</field>
431 <field name="type">search</field>
432 <field name="arch" type="xml">
433 <search string="Ricerca comunicazioni">
434 <field name="anno"/>
435 <newline/>
436 <group expand="0" string="Group By...">
437 <filter string="tipo" icon="terp-personal" domain="[]" context="{'group_by':'tipo'}"/>
438 <filter string="Periodo" icon="terp-go-month" domain="[]" context="{'group_by':'anno'}"/>
439 </group>
440 </search>
441 </field>
442 </record>
443
444 <record id="spesometro_comunicazione_action" model="ir.actions.act_window">
445 <field name="name">Comunicazioni</field>
446 <field name="type">ir.actions.act_window</field>
447 <field name="res_model">spesometro.comunicazione</field>
448 <field name="view_type">form</field>
449 <field name="view_mode">tree,form</field>
450 <field name="view_id" ref="spesometro_comunicazione_view_tree"/>
451 <!-- <field name="search_view_id" ref="spesometro_comunicazione_search" /> -->
452 </record>
453
454 <menuitem id="menu_spesometro_comunicazione" action="spesometro_comunicazione_action"
455 name="Comunicazioni" parent="menu_spesometro_main"/>
456
457 <!--
458 Quadro FA
459 -->
460 <record id="spesometro_comunicazione_fa_view_form" model="ir.ui.view">
461 <field name="name">spesometro.comunicazione.fa.view.form</field>
462 <field name="model">spesometro.comunicazione.line.fa</field>
463 <field name="type">form</field>
464 <field name="arch" type="xml">
465 <form string="Quado FA - Linea">
466 <group>
467 <field name="partner_id"/>
468 <newline/>
469 <field name="partita_iva"/>
470 <field name="codice_fiscale"/>
471 <field name="documento_riepilogativo"/>
472 <field name="noleggio"/>
473 </group>
474 <newline/>
475 <group string="Operazioni Attive">
476 <field name="numero_operazioni_attive_aggregate"/>
477 <field name="attive_imponibile_non_esente"/>
478 <field name="attive_imposta"/>
479 <field name="attive_operazioni_iva_non_esposta"/>
480 <field name="attive_note_variazione"/>
481 <field name="attive_note_variazione_imposta"/>
482 </group>
483 <newline/>
484 <group string="Operazioni Passive">
485 <field name="numero_operazioni_passive_aggregate"/>
486 <field name="passive_imponibile_non_esente"/>
487 <field name="passive_imposta"/>
488 <field name="passive_operazioni_iva_non_esposta"/>
489 <field name="passive_note_variazione"/>
490 <field name="passive_note_variazione_imposta"/>
491 </group>
492
493 </form>
494 </field>
495 </record>
496
497 <!--
498 Quadro SA
499 -->
500 <record id="spesometro_comunicazione_sa_view_form" model="ir.ui.view">
501 <field name="name">spesometro.comunicazione.sa.view.form</field>
502 <field name="model">spesometro.comunicazione.line.sa</field>
503 <field name="type">form</field>
504 <field name="arch" type="xml">
505 <form string="Quado SA - Linea">
506 <group>
507 <field name="partner_id"/>
508 <newline/>
509 <field name="codice_fiscale"/>
510 <field name="noleggio"/>
511 </group>
512 <newline/>
513 <group>
514 <field name="numero_operazioni"/>
515 <field name="importo_complessivo"/>
516 </group>
517 </form>
518 </field>
519 </record>
520
521
522 <!--
523 Quadro BL
524 -->
525 <record id="spesometro_comunicazione_bl_view_form" model="ir.ui.view">
526 <field name="name">spesometro.comunicazione.bl.view.form</field>
527 <field name="model">spesometro.comunicazione.line.bl</field>
528 <field name="type">form</field>
529 <field name="arch" type="xml">
530 <form string="Quado BL - Linea">
531 <group>
532 <field name="partner_id"/>
533 <newline/>
534 <field name="codice_fiscale"/>
535 <field name="noleggio"/>
536 <field name="codice_identificativo_IVA"/>
537 </group>
538 <newline/>
539 <group>
540 <field name="operazione_fiscalita_privilegiata"/>
541 <field name="operazione_con_soggetti_non_residenti"/>
542 <field name="Acquisto_servizi_da_soggetti_non_residenti"/>
543 </group>
544 <newline/>
545 <notebook>
546 <page string="Persona Giuridica">
547 <field name="pg_denominazione"/>
548 <field name="pg_citta_estera_sede_legale"/>
549 <field name="pg_codice_stato_estero"/>
550 <field name="pg_indirizzo_sede_legale"/>
551 </page>
552 <page string="Persona Fisica">
553 <field name="pf_cognome"/>
554 <field name="pf_nome"/>
555 <field name="pf_data_nascita"/>
556 <field name="pf_comune_stato_nascita"/>
557 <field name="pf_provincia_nascita"/>
558 <field name="pf_codice_stato_estero"/>
559 </page>
560 </notebook>
561 <newline/>
562 <group string="Operazioni Attive">
563 <field name="attive_importo_complessivo"/>
564 <field name="attive_imposta"/>
565 <field name="attive_non_sogg_cessione_beni"/>
566 <field name="attive_non_sogg_servizi"/>
567 <field name="attive_note_variazione"/>
568 <field name="attive_note_variazione_imposta"/>
569 </group>
570 <newline/>
571 <group string="Operazioni Passive">
572 <field name="passive_importo_complessivo"/>
573 <field name="passive_imposta"/>
574 <field name="passive_non_sogg_importo_complessivo"/>
575 <field name="passive_note_variazione"/>
576 <field name="passive_note_variazione_imposta"/>
577 </group>
578 </form>
579 </field>
580 </record>
581
582 <!--
583 Quadro SE
584 -->
585 <record id="spesometro_comunicazione_se_view_form" model="ir.ui.view">
586 <field name="name">spesometro.comunicazione.se.view.form</field>
587 <field name="model">spesometro.comunicazione.line.se</field>
588 <field name="type">form</field>
589 <field name="arch" type="xml">
590 <form string="Quado SE - Linea">
591 <group>
592 <group colspan="4">
593 <field name="partner_id"/>
594 <newline/>
595 <field name="codice_identificativo_IVA"/>
596 </group>
597 <newline/>
598 <group string="Persona Giuridica" colspan="4">
599 <field name="pg_denominazione"/>
600 <field name="pg_citta_estera_sede_legale"/>
601 <field name="pg_codice_stato_estero_domicilio"/>
602 <field name="pg_indirizzo_sede_legale"/>
603 </group>
604 <newline/>
605 <group string="Persona Fisica" colspan="4">
606 <field name="pf_cognome"/>
607 <field name="pf_nome"/>
608 <field name="pf_data_nascita"/>
609 <field name="pf_comune_stato_nascita"/>
610 <field name="pf_provincia_nascita"/>
611 <field name="pf_codice_stato_estero_domicilio"/>
612 </group>
613 <newline/>
614 <group string="Documento" colspan="4">
615 <field name="data_emissione"/>
616 <field name="data_registrazione"/>
617 <field name="numero_fattura"/>
618 <newline/>
619 <field name="importo"/>
620 <field name="imposta"/>
621 </group>
622 </group>
623 </form>
624 </field>
625 </record>
626
627 </data>
628</openerp>
0629
=== 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-20 14:19:55 +0000
@@ -0,0 +1,25 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# Author: Alessandro Camilli (a.camilli@yahoo.it)
5# Copyright (C) 2014
6# Associazione OpenERP Italia (<http://www.openerp-italia.org>)
7#
8# This program is free software: you can redistribute it and/or modify
9# it under the terms of the GNU Affero General Public License as published
10# by the Free Software Foundation, either version 3 of the License, or
11# (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU Affero General Public License
19# along with this program. If not, see <http://www.gnu.org/licenses/>.
20#
21##############################################################################
22
23import wizard_crea_comunicazione
24import wizard_default
25import wizard_export
0\ No newline at end of file26\ No newline at end of file
127
=== 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-20 14:19:55 +0000
@@ -0,0 +1,128 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# Author: Alessandro Camilli (a.camilli@yahoo.it)
5# Copyright (C) 2014
6# Associazione OpenERP Italia (<http://www.openerp-italia.org>)
7#
8# This program is free software: you can redistribute it and/or modify
9# it under the terms of the GNU Affero General Public License as published
10# by the Free Software Foundation, either version 3 of the License, or
11# (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU Affero General Public License
19# along with this program. If not, see <http://www.gnu.org/licenses/>.
20#
21##############################################################################
22
23from osv import fields,osv
24from tools.translate import _
25import time
26
27class wizard_crea_comunicazione(osv.osv_memory):
28
29 def default_get(self, cr, uid, fields, context=None):
30
31 res = super(wizard_crea_comunicazione, self).default_get(cr, uid, fields, context=context)
32
33 res['periodo'] = 'anno'
34 res['anno'] = int(time.strftime('%Y')) -1
35 res['tipo'] = 'ordinaria'
36 res['formato_dati'] = 'aggregati'
37 res['quadro_FA'] = True
38 res['quadro_SA'] = True
39 res['quadro_BL'] = True
40 res['quadro_SE'] = True
41 res['tipo_fornitore'] = '01'
42
43 return res
44
45 _name = "wizard.spesometro.crea.comunicazione"
46
47 _columns = {
48 'company_id': fields.many2one('res.company', 'Azienda', required=True ),
49 'periodo': fields.selection((('anno','Annuale'), ('trimestre','Trimestrale'), ('mese','Mensile')),
50 'Periodo', required=True),
51 'anno' : fields.integer('Anno', size=4, required=True),
52 'trimestre' : fields.integer('Trimestre', size=1 ),
53 'mese' : fields.selection(((1,'Gennaio'), (2,'Febbraio'), (3,'Marzo'), (4,'Aprile'),
54 (5,'Maggio'), (6,'Giugno'), (7,'Luglio'), (8,'Agosto'),
55 (9,'Settembre'), (10,'Ottobre'), (11,'Novembre'), (12,'Dicembre'),
56 ),'Mese'),
57
58 'tipo': fields.selection((('ordinaria','Ordinaria'), ('sostitutiva','Sostitutiva'), ('annullamento','Annullamento')),
59 'Tipo comunicazione', required=True),
60 'comunicazione_da_sostituire_annullare': fields.integer('Protocollo comunicaz. da sostituire/annullare'),
61 'documento_da_sostituire_annullare': fields.integer('Protocollo documento da sostituire/annullare'),
62 'formato_dati': fields.selection((('aggregati','Aggregati'),('analitici','Analitici')),'Formato comunicazione', required=True),
63 'tipo_fornitore': fields.selection((('01','Soggetti che inviano la propria comunicazione'), ('10','Intermediari')),
64 'Tipo fornitore', required=True),
65 'partner_intermediario': fields.many2one('res.partner', 'Intermediario'),
66 'quadro_FA': fields.boolean('Quadro FA', help="Operazioni documentate da fattura esposte in forma aggregata"),
67 'quadro_SA': fields.boolean('Quadro SA', help="Operazioni senza fattura esposte in forma aggregata"),
68 'quadro_BL': fields.boolean('Quadro BL', help="- Operazioni con paesi con fiscalità privilegiata - Operazioni con soggetti non residenti - Acquisti di servizi da soggetti non residenti "),
69
70 'quadro_FE': fields.boolean('Quadro FE', help="Fatture emesse e Documenti riepilogativi (Operazioni attive)"),
71 'quadro_FR': fields.boolean('Quadro FR', help="Fatture ricevute e Documenti riepilogativi (Operazioni passive)"),
72 'quadro_NE': fields.boolean('Quadro NE', help="Note di variazione emesse"),
73 'quadro_NR': fields.boolean('Quadro NR', help="Note di variazioni ricevute"),
74 'quadro_DF': fields.boolean('Quadro DF', help="Operazioni senza fattura"),
75 'quadro_FN': fields.boolean('Quadro FN', help="Operazioni con soggetti non residenti (Operazioni attive)"),
76 'quadro_SE': fields.boolean('Quadro SE', help="Acquisti di servizi da non residenti e Acquisti da operatori di San Marino"),
77 'quadro_TU': fields.boolean('Quadro TU', help="Operazioni legate al turismo - Art. 3 comma 1 D.L. 16/2012"),
78 }
79
80 def genera_comunicazione(self, cr, uid, ids, context=None):
81
82 comunicazione_obj = self.pool.get('spesometro.comunicazione')
83 wizard = self.read(cr, uid, ids)[0]
84
85 # Quadri richiesti:
86 quadri_richiesti = []
87 if wizard['quadro_FA']:
88 quadri_richiesti.append('FA')
89 if wizard['quadro_SA']:
90 quadri_richiesti.append('SA')
91 if wizard['quadro_BL']:
92 quadri_richiesti.append('BL')
93 if wizard['quadro_FE']:
94 quadri_richiesti.append('FE')
95 if wizard['quadro_FR']:
96 quadri_richiesti.append('FR')
97 if wizard['quadro_NE']:
98 quadri_richiesti.append('NE')
99 if wizard['quadro_NR']:
100 quadri_richiesti.append('NR')
101 if wizard['quadro_DF']:
102 quadri_richiesti.append('DF')
103 if wizard['quadro_FN']:
104 quadri_richiesti.append('FN')
105 if wizard['quadro_SE']:
106 quadri_richiesti.append('SE')
107 if wizard['quadro_TU']:
108 quadri_richiesti.append('TU')
109
110 params ={
111 'company_id': wizard['company_id'][0],
112 'periodo': wizard['periodo'],
113 'anno': wizard['anno'],
114 'trimestre': wizard['trimestre'],
115 'mese': wizard['mese'],
116 'tipo': wizard['tipo'],
117 'comunicazione_da_sostituire_annullare': wizard['comunicazione_da_sostituire_annullare'],
118 'documento_da_sostituire_annullare': wizard['documento_da_sostituire_annullare'],
119 'formato_dati': wizard['formato_dati'],
120 'tipo_fornitore': wizard['tipo_fornitore'],
121 'partner_intermediario': wizard['partner_intermediario'],
122 'quadri_richiesti': quadri_richiesti,
123 }
124 comunicazione_obj.genera_comunicazione(cr, uid, params, context=None)
125
126 return {
127 'type': 'ir.actions.act_window_close',
128 }
0129
=== 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-20 14:19:55 +0000
@@ -0,0 +1,67 @@
1<?xml version="1.0" encoding="utf-8"?>
2<openerp>
3 <data>
4
5 <record id="wizard_spesometro_crea_comunicazione" model="ir.ui.view">
6 <field name="name">Crea comunicazione</field>
7 <field name="model">wizard.spesometro.crea.comunicazione</field>
8 <field name="type">form</field>
9 <field name="arch" type="xml">
10 <form string="Dati comunicazione">
11 <field name="company_id"/>
12 <newline/>
13 <field name="tipo_fornitore"/>
14 <field name="partner_intermediario" attrs="{'invisible': [('tipo_fornitore', '=', '01')], 'required': [('tipo_fornitore', '=', '10')]}"/>
15 <newline/>
16 <separator colspan="4"/>
17 <field name="periodo"/>
18 <field name="anno"/>
19 <field name="trimestre" attrs="{'invisible': [('periodo', '!=', 'trimestre')], 'required': [('periodo', '=', 'trimestre')]}"/>
20 <field name="mese" attrs="{'invisible': [('periodo', '!=', 'mese')], 'required': [('periodo', '=', 'mese')]}"/>
21 <separator colspan="4"/>
22 <field name="tipo"/>
23 <field name="comunicazione_da_sostituire_annullare" attrs="{'invisible': [('tipo', '=', 'ordinaria')]}" />
24 <field name="documento_da_sostituire_annullare" attrs="{'invisible': [('tipo', '=', 'ordinaria')]}"/>
25 <field name="formato_dati"/>
26 <newline/>
27 <group colspan="2">
28 <field name="quadro_FA" attrs="{'invisible': [('formato_dati', '!=', 'aggregati')]}" />
29 <field name="quadro_SA" attrs="{'invisible': [('formato_dati', '!=', 'aggregati')]}" />
30
31 <field name="quadro_SE" attrs="{'invisible': [('formato_dati', '!=', 'analitici')]}"/>
32 <field name="quadro_FE" attrs="{'invisible': [('formato_dati', '!=', 'analitici')]}" readonly="1"/>
33 <field name="quadro_FR" attrs="{'invisible': [('formato_dati', '!=', 'analitici')]}" readonly="1"/>
34 <field name="quadro_NE" attrs="{'invisible': [('formato_dati', '!=', 'analitici')]}" readonly="1"/>
35 </group>
36 <group colspan="2">
37 <field name="quadro_BL" attrs="{'invisible': [('formato_dati', '!=', 'aggregati')]}" />
38
39 <field name="quadro_NR" attrs="{'invisible': [('formato_dati', '!=', 'analitici')]}" readonly="1"/>
40 <field name="quadro_DF" attrs="{'invisible': [('formato_dati', '!=', 'analitici')]}" readonly="1"/>
41 <field name="quadro_FN" attrs="{'invisible': [('formato_dati', '!=', 'analitici')]}" readonly="1"/>
42 <field name="quadro_TU" attrs="{'invisible': [('formato_dati', '!=', 'analitici')]}" readonly="1"/>
43 </group>
44 <group colspan="4">
45 <separator colspan="4"/>
46 <button icon="gtk-cancel" special="cancel" string="Cancel"/>
47 <button icon="gtk-ok" name="genera_comunicazione" string="Crea" type="object"/>
48 </group>
49 </form>
50 </field>
51 </record>
52
53 <record id="wizard_spesometro_crea_comunicazione_action" model="ir.actions.act_window">
54 <field name="name">Nuova comunicazione</field>
55 <field name="type">ir.actions.act_window</field>
56 <field name="res_model">wizard.spesometro.crea.comunicazione</field>
57 <field name="view_type">form</field>
58 <field name="view_mode">form</field>
59 <field name="target">new</field>
60 <field name="view_id" ref="wizard_spesometro_crea_comunicazione"/>
61 <!-- <field name="search_view_id" ref="spesometro_comunicazione_search" /> -->
62 </record>
63
64 <menuitem id="menu_spesometro_crea_comunicazione" action="wizard_spesometro_crea_comunicazione_action"
65 name="Nuova comunicazione" parent="menu_spesometro_main"/>
66 </data>
67</openerp>
068
=== 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-20 14:19:55 +0000
@@ -0,0 +1,65 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# Author: Alessandro Camilli (a.camilli@yahoo.it)
5# Copyright (C) 2014
6# Associazione OpenERP Italia (<http://www.openerp-italia.org>)
7#
8# This program is free software: you can redistribute it and/or modify
9# it under the terms of the GNU Affero General Public License as published
10# by the Free Software Foundation, either version 3 of the License, or
11# (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU Affero General Public License
19# along with this program. If not, see <http://www.gnu.org/licenses/>.
20#
21##############################################################################
22
23from osv import fields,osv
24from tools.translate import _
25import time
26
27class wizard_spesometro_default(osv.osv_memory):
28
29 def default_get(self, cr, uid, fields, context=None):
30
31 res = super(wizard_spesometro_default, self).default_get(cr, uid, fields, context=context)
32 res = {
33 'partner_spesometro_escludi' : False,
34 'partner_spesometro_operazione' : 'FA'
35 }
36 return res
37
38 _name = "wizard.spesometro.default"
39
40 _columns = {
41 'partner_spesometro_escludi': fields.boolean('Da Escludere'),
42 'partner_spesometro_operazione': fields.selection((('FA','Operazioni documentate da fattura'),
43 ('SA','Operazioni senza fattura'),
44 ('BL1','Operazioni con paesi con fiscalit� privilegiata'),
45 ('BL2','Operazioni con soggetti non residenti'),
46 ('BL3','Acquisti di servizi da soggetti non residenti')),
47 'Operazione' ),
48 }
49
50
51 def setting_default(self, cr, uid, ids, context=None):
52
53 partners_obj = self.pool.get('res.partner')
54 wizard = self.read(cr, uid, ids)[0]
55 vals = {
56 'spesometro_escludi': wizard.get('partner_spesometro_escludi'),
57 'spesometro_operazione': wizard.get('partner_spesometro_operazione'),
58 }
59
60 partners_ids = partners_obj.search(cr, uid, [('id','!=', 0)], context=context)
61 partners_obj.write(cr, uid, partners_ids, vals)
62
63 return {
64 'type': 'ir.actions.act_window_close',
65 }
066
=== 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-20 14:19:55 +0000
@@ -0,0 +1,39 @@
1<?xml version="1.0" encoding="utf-8"?>
2<openerp>
3 <data>
4
5 <record id="wizard_spesometro_default_view" model="ir.ui.view">
6 <field name="name">Spesometro default</field>
7 <field name="model">wizard.spesometro.default</field>
8 <field name="type">form</field>
9 <field name="arch" type="xml">
10 <form string="Dati comunicazione">
11 <group string="Partner">
12 <field name="partner_spesometro_escludi"/>
13 <field name="partner_spesometro_operazione"/>
14 </group>
15
16 <newline/>
17 <group colspan="4">
18 <separator colspan="4"/>
19 <button icon="gtk-cancel" special="cancel" string="Cancel"/>
20 <button icon="gtk-ok" name="setting_default" string="Imposta default" type="object"/>
21 </group>
22 </form>
23 </field>
24 </record>
25
26 <record id="wizard_spesometro_default_action" model="ir.actions.act_window">
27 <field name="name">Spesometro default</field>
28 <field name="type">ir.actions.act_window</field>
29 <field name="res_model">wizard.spesometro.default</field>
30 <field name="view_type">form</field>
31 <field name="view_mode">form</field>
32 <field name="target">new</field>
33 <field name="view_id" ref="wizard_spesometro_default_view"/>
34 </record>
35
36 <menuitem id="menu_spesometro_default" action="wizard_spesometro_default_action"
37 name="Impostazione Default" parent="menu_spesometro_main"/>
38 </data>
39</openerp>
040
=== 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-20 14:19:55 +0000
@@ -0,0 +1,722 @@
1# -*- coding: utf-8 -*-
2#################################################################################
3# Author: Alessandro Camilli (a.camilli@yahoo.it)
4# Copyright (C) 2014
5# Associazione OpenERP Italia (<http://www.openerp-italia.org>)
6#
7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU General Public License as published by
9# the Free Software Foundation, either version 3 of the License, or
10# (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU General Public License for more details.
16#
17# You should have received a copy of the GNU General Public License
18# along with this program. If not, see <http://www.gnu.org/licenses/>.
19#
20##############################################################################
21
22from osv import fields,osv
23from tools.translate import _
24from datetime import datetime
25from StringIO import StringIO
26import base64
27from decimal import *
28
29class wizard_spesometro_export(osv.osv_memory):
30
31 _name = "wizard.spesometro.export"
32 _description = 'Use this wizard to export fiscal file'
33 _columns={
34 'file_spesometro': fields.binary('File spesometro', readonly=True),
35 }
36
37 def _split_string_positional_field(self, string):
38 '''
39 Da manuale:
40 Con riferimento ai campi non posizionali, nel caso in cui la lunghezza del dato da inserire
41 ecceda i 16 caratteri disponibili, dovrà essere inserito un ulteriore elemento con un identico
42 campo-codice e con un campo-valore il cui primo carattere dovrà essere impostato con il simbolo “+”,
43 mentre i successivi quindici potranno essere utilizzati per la continuazione del dato da inserire.
44 Tale situazione può verificarsi solo per alcuni campi con formato AN.
45 '''
46 # Prima parte:
47 res = []
48 res.append(string[:16])
49 length = 15
50 # Parte in eccesso:
51 str_eccesso = string[16:]
52 str_split = [str_eccesso[i:i+length] for i in range(0, len(str_eccesso), length)]
53 for s in str_split:
54 new_string = '+' + s
55 res.append(new_string)
56 return res
57
58 def _record_A(self, cr, uid, comunicazione, context=None):
59
60 if not comunicazione.soggetto_trasmissione_codice_fiscale:
61 raise osv.except_osv(_('Errore comunicazione!'),_("Manca il codice fiscale dell'incaricato alla trasmissione"))
62
63 rcd = "A"
64 rcd += '{:14s}'.format("") # Filler
65 rcd += "NSP00" # codice fornitura
66 rcd += comunicazione.tipo_fornitore # 01 - Soggetti che inviano la propria comunicazione 10 -Intermediari
67 rcd += '{:16s}'.format(comunicazione.soggetto_trasmissione_codice_fiscale) # cd fiscale (se intermediaro va messo quello dell'intermediario)
68 rcd += '{:483s}'.format("")# Filler
69 #rcd += '{:4s}'.format(str(comunicazione.progressivo_telematico).zfill(4)) # dich.su più invii: Progressivo dell'invio telematico
70 rcd += '{:4s}'.format("0".zfill(4)) # dich.su più invii: Progressivo dell'invio telematico
71 rcd += '{:4s}'.format("0".zfill(4)) # dich.su più invii: Numero totale degli invii telematici
72 rcd += '{:100s}'.format("") # Filler
73 rcd += '{:1068s}'.format("") # Filler
74 rcd += '{:200s}'.format("") # Filler
75 rcd += "A" # Impostare al valore "A"
76 rcd += "\r" #
77 rcd += "\n" #
78
79 return rcd
80
81 def _record_B(self, cr, uid, comunicazione, context=None):
82 rcd = "B"
83 rcd += '{:16s}'.format(comunicazione.soggetto_codice_fiscale)
84 rcd += '{:8s}'.format("1".zfill(8)) # Progressivo modulo - vale 1
85 rcd += '{:3s}'.format("") # Spazio a disposizione dell'utente
86 rcd += '{:25s}'.format("") # Filler
87 rcd += '{:20s}'.format("") # Spazio a disposizione dell'utente
88 rcd += '{:16s}'.format("") # Identificativo del produttore del software (codice fiscale)
89 # tipo comunicazione ( alterntative: ordinaria,sostitutiva o di annullamento )
90 if comunicazione.tipo == 'ordinaria':
91 rcd += "1"
92 else:
93 rcd += "0"
94 if comunicazione.tipo == 'sostitutiva':
95 rcd += "1"
96 else:
97 rcd += "0"
98 if comunicazione.tipo == 'annullamento':
99 rcd += "1"
100 else:
101 rcd += "0"
102 # campi x annullamento e sostituzione
103 if comunicazione.comunicazione_da_sostituire_annullare == 0:
104 rcd += '{:17s}'.format("".zfill(17))
105 else:
106 rcd += '{:17s}'.format(str(comunicazione_da_sostituire_annullare).zfill(17))
107 if comunicazione.documento_da_sostituire_annullare == 0:
108 rcd += '{:6s}'.format("".zfill(6))
109 else:
110 rcd += '{:6s}'.format(str(comunicazione.documento_da_sostituire_annullare).zfill(6))
111 # formato dati: aggregata o analitica (caselle alternative)
112 if comunicazione.formato_dati == 'aggregati':
113 rcd += "10"
114 else:
115 rcd += "01"
116 # Quadri compilati
117 if comunicazione.line_FA_ids :
118 rcd += "1"
119 else:
120 rcd += "0"
121 if comunicazione.line_SA_ids :
122 rcd += "1"
123 else:
124 rcd += "0"
125 if comunicazione.line_BL_ids :
126 rcd += "1"
127 else:
128 rcd += "0"
129 #if comunicazione.quadro_FE :
130 # rcd += "1"
131 #else:
132 rcd += "0"
133 #if comunicazione.quadro_FR :
134 # rcd += "1"
135 #else:
136 rcd += "0"
137 #if comunicazione.quadro_NE :
138 # rcd += "1"
139 #else:
140 rcd += "0"
141 #if comunicazione.quadro_NR :
142 # rcd += "1"
143 #else:
144 rcd += "0"
145 #if comunicazione.quadro_DF :
146 # rcd += "1"
147 #else:
148 rcd += "0"
149 #if comunicazione.quadro_FN :
150 # rcd += "1"
151 #else:
152 rcd += "0"
153 if comunicazione.line_SE_ids :
154 rcd += "1"
155 else:
156 rcd += "0"
157 #if comunicazione.quadro_TU :
158 # rcd += "1"
159 #else:
160 rcd += "0"
161
162 rcd += "1" # Quadro TA - RIEPILOGO
163 #Partita IVA , Codice Attività e riferimenti del Soggetto cui si riferisce la comunicazione
164 rcd += '{:11s}'.format(comunicazione.soggetto_partitaIVA) # PARTITA IVA
165 if not comunicazione.soggetto_codice_attivita:
166 raise osv.except_osv(_('Errore comunicazione!'),_("Manca il codice attività"))
167 rcd += '{:6s}'.format(comunicazione.soggetto_codice_attivita) # CODICE attività (6 caratteri) --> obbligatorio
168 tel = comunicazione.soggetto_telefono
169 rcd += '{:12s}'.format(tel.replace(' ','') or '') # telefono
170 fax = comunicazione.soggetto_fax
171 rcd += '{:12s}'.format(fax.replace(' ','') or '') # fax
172 rcd += '{:50s}'.format(comunicazione.soggetto_email or '') # ind posta elettronica
173 # Dati Anagrafici del Soggetto cui si riferisce la comunicazione - Persona Fisica
174 if comunicazione.soggetto_forma_giuridica == 'persona_fisica':
175 if not comunicazione.soggetto_pf_cognome or not comunicazione.soggetto_pf_nome or not comunicazione.soggetto_pf_sesso \
176 or not comunicazione.soggetto_pf_data_nascita or not comunicazione.soggetto_pf_comune_nascita or not comunicazione.soggetto_pf_provincia_nascita:
177 raise osv.except_osv(_('Errore comunicazione!'),_("Soggetto obbligato: Inserire tutti i dati della persona fisica"))
178 rcd += '{:24s}'.format(comunicazione.soggetto_pf_cognome) # cognome
179 rcd += '{:20s}'.format(comunicazione.soggetto_pf_nome) # nome
180 rcd += '{:1s}'.format(comunicazione.soggetto_pf_sesso) # sesso
181 rcd += '{:8s}'.format(datetime.strptime(comunicazione.soggetto_pf_data_nascita, "%Y-%m-%d").strftime("%d%m%Y")) # data nascita
182 rcd += '{:40s}'.format(comunicazione.soggetto_pf_comune_nascita) # comune di nascita
183 rcd += '{:2s}'.format(comunicazione.soggetto_pf_provincia_nascita) # provincia comune di nascita
184 rcd += '{:60s}'.format("") # persona giuridica
185 else:
186 if not comunicazione.soggetto_pg_denominazione:
187 raise osv.except_osv(_('Errore comunicazione!'),_("Soggetto obbligato: Inserire tutti i dati della persona giuridica"))
188 rcd += '{:24s}'.format("") # cognome
189 rcd += '{:20s}'.format("") # nome
190 rcd += '{:1s}'.format("") # sesso
191 rcd += '{:8s}'.format("".zfill(8)) # data nascita
192 rcd += '{:40s}'.format("") # comune di nascita
193 rcd += '{:2s}'.format("") # provincia comune di nascita
194 rcd += '{:60s}'.format(comunicazione.soggetto_pg_denominazione) # persona giuridica
195
196 rcd += '{:4d}'.format(comunicazione.anno) # anno riferimento
197 # Mese di riferimento : Da valorizzare obbligatoriamente solo se presenti Acquisti da Operatori di San Marino. In tutti gli altri casi non deve essere compilato
198 if comunicazione.periodo == 'trimestre' and comunicazione.trimestre:
199 rcd += '{:2s}'.format( str(comunicazione.trimestre) + "T")
200 elif comunicazione.periodo == 'mese' and comunicazione.mese:
201 rcd += '{:2s}'.format( str(comunicazione.mese).zfill(2))
202 else:
203 rcd += '{:2s}'.format("")
204 # Dati del Soggetto tenuto alla comunicazione (soggetto che effettua la comunicazione, se diverso dal soggetto cui si riferisce la comunicazione)
205 rcd += '{:16s}'.format(comunicazione.soggetto_cm_codice_fiscale or "")
206 rcd += '{:2s}'.format(comunicazione.tipo_fornitore or "01") # codice carica
207 rcd += '{:8s}'.format("".zfill(8)) # data inizio procedura
208 rcd += '{:8s}'.format("".zfill(8)) # data fine procedura
209 # Dati anagrafici del soggetto tenuto alla comunicazione - Persona fisica
210 # (Obbligatorio e da compilare solo se si tratta di Persona Fisica. )
211 if comunicazione.soggetto_cm_forma_giuridica == 'persona_fisica':
212 if not comunicazione.soggetto_cm_pf_cognome or not comunicazione.soggetto_cm_pf_nome or not comunicazione.soggetto_cm_pf_sesso \
213 or not comunicazione.soggetto_cm_pf_data_nascita or not comunicazione.soggetto_cm_pf_comune_nascita or not comunicazione.soggetto_cm_pf_provincia_nascita:
214 raise osv.except_osv(_('Errore comunicazione!'),_("Soggetto tenuto alla comunicazione: Inserire tutti i dati della persona fisica"))
215 rcd += '{:24s}'.format(comunicazione.soggetto_cm_pf_cognome) # cognome
216 rcd += '{:20s}'.format(comunicazione.soggetto_cm_pf_nome) # nome
217 rcd += '{:1s}'.format(comunicazione.soggetto_cm_pf_sesso) # sesso
218 rcd += '{:8s}'.format(datetime.strptime(comunicazione.soggetto_cm_pf_data_nascita, "%Y-%m-%d").strftime("%d%m%Y")) # data nascita
219 rcd += '{:40s}'.format(comunicazione.soggetto_cm_pf_comune_nascita) # comune di nascita
220 rcd += '{:2s}'.format(comunicazione.soggetto_cm_pf_provincia_nascita) # provincia comune di nascita
221 rcd += '{:60s}'.format("") # persona giuridica
222 else:
223 if not comunicazione.soggetto_cm_pg_denominazione:
224 raise osv.except_osv(_('Errore comunicazione!'),_("Soggetto tenuto alla comunicazione: Inserire tutti i dati della persona giuridica"))
225 rcd += '{:24s}'.format("") # cognome
226 rcd += '{:20s}'.format("") # nome
227 rcd += '{:1s}'.format("") # sesso
228 rcd += '{:8s}'.format("".zfill(8)) # data nascita
229 rcd += '{:40s}'.format("") # comune di nascita
230 rcd += '{:2s}'.format("") # provincia comune di nascita
231 rcd += '{:60s}'.format(comunicazione.soggetto_cm_pg_denominazione) # persona giuridica
232
233 # Impegno alla trasmissione telematica
234 if comunicazione.tipo_fornitore == '10' and not comunicazione.soggetto_trasmissione_codice_fiscale:
235 raise osv.except_osv(_('Errore comunicazione!'),_("Manca il codice fiscale dell'intermediario incaricato alla trasmissione telematica"))
236 rcd += '{:16s}'.format(comunicazione.soggetto_trasmissione_codice_fiscale or '') # Codice fiscale dell'intermediario
237 rcd += '{:5s}'.format(str(comunicazione.soggetto_trasmissione_numero_CAF).zfill(5)) # Numero di iscrizione all'albo del C.A.F.
238 rcd += '{:1s}'.format(comunicazione.soggetto_trasmissione_impegno)# Impegno a trasmettere in via telematica la comunicazione
239 # Dato obbligatorio Vale 1 se la comunicazione è stata predisposta dal soggetto obbligato
240 # Vale 2 se è stata predisposta dall'intermediario.
241 rcd += '{:1s}'.format("") # Filler
242 if not comunicazione.soggetto_trasmissione_data_impegno:
243 raise osv.except_osv(_('Errore comunicazione!'),_("Manca la data dell'impegno alla trasmissione"))
244 rcd += '{:8s}'.format(datetime.strptime(comunicazione.soggetto_trasmissione_data_impegno, "%Y-%m-%d").strftime("%d%m%Y")) # Data dell'impegno
245 # Spazio riservato al Servizio telematico
246 rcd += '{:1258s}'.format("") # Filler
247 rcd += '{:20s}'.format("") # Spazio riservato al Servizio Telematico
248 rcd += '{:18s}'.format("") # Filler
249 # Ultimi caratteri di controllo
250 rcd += "A" # Impostare al valore "A"
251 rcd += "\r" #
252 rcd += "\n" #
253
254 return rcd
255
256 def _record_C_FA(self, cr, uid, line, prog_modulo, prog_sezione, context=None):
257 prog_sezione = str(prog_sezione).zfill(3)
258
259 rcd = "C"
260 rcd += '{:16s}'.format(line.comunicazione_id.soggetto_codice_fiscale) # codice fiscale soggetto obbligato
261 rcd += '{:8s}'.format(str(prog_modulo).zfill(8)) # Progressivo modulo
262 rcd += '{:3s}'.format("") # Filler
263 rcd += '{:25s}'.format("") # Filler
264 rcd += '{:20s}'.format("") # Spazio utente
265 rcd += '{:16s}'.format("") # Filler
266
267 # QUADRO FA
268 # Partita iva o codice fiscale presenti se non si tratta di documento riepilogativo(ES: scheda carburante)
269 if not line.partita_iva and not line.codice_fiscale and not line.documento_riepilogativo:
270 raise osv.except_osv(_('Errore comunicazione!'),_("Inserire Codice Fiscale o partita IVA su partner %s") % (line.partner_id.name,))
271 # Doc. riepilogativo : non ammessi codice fiscale o partita iva
272 if line.documento_riepilogativo and (line.partita_iva or line.codice_fiscale) :
273 raise osv.except_osv(_('Errore comunicazione!'),_("Documento riepilogativo per partner %s, togliere Codice Fiscale E partita IVA") % (line.partner_id.name,))
274
275 if line.partita_iva:
276 rcd += '{:8s}'.format("FA" + prog_sezione + "001" )
277 rcd += '{:16s}'.format(line.partita_iva)
278 elif line.codice_fiscale:
279 rcd += '{:8s}'.format("FA" + prog_sezione + "002" )
280 rcd += '{:16s}'.format(line.codice_fiscale)
281 if line.documento_riepilogativo:
282 rcd += '{:8s}'.format("FA" + prog_sezione + "003" ) + '{:>16s}'.format('1')
283 # Numero operazioni attive aggregate
284 if line.numero_operazioni_attive_aggregate > 0:
285 rcd += '{:8s}'.format("FA" + prog_sezione + "004" ) + '{:16d}'.format(line.numero_operazioni_attive_aggregate)
286 # Numero operazioni passive aggregate
287 if line.numero_operazioni_passive_aggregate > 0:
288 rcd += '{:8s}'.format("FA" + prog_sezione + "005" ) + '{:16d}'.format(line.numero_operazioni_passive_aggregate)
289 # Noleggio / Leasing
290 if line.noleggio:
291 rcd += '{:8s}'.format("FA" + prog_sezione + "006" ) + '{:16s}'.format(line.noleggio)
292
293 # OPERAZIONI ATTIVE
294 if line.attive_imponibile_non_esente > 0:
295 rcd += '{:8s}'.format("FA" + prog_sezione + "007" ) + '{:16.0f}'.format(line.attive_imponibile_non_esente)
296 # Totale imposta
297 if line.attive_imposta > 0:
298 rcd += '{:8s}'.format("FA" + prog_sezione + "008" ) + '{:16.0f}'.format(line.attive_imposta)
299 # Totale operazioni con IVA non esposta
300 if line.attive_operazioni_iva_non_esposta > 0:
301 rcd += '{:8s}'.format("FA" + prog_sezione + "009" ) + '{:16.0f}'.format(line.attive_operazioni_iva_non_esposta)
302 # Totale note di variazione a debito per la controparte
303 if line.attive_note_variazione > 0:
304 rcd += '{:8s}'.format("FA" + prog_sezione + "010" ) + '{:16.0f}'.format(line.attive_note_variazione)
305 if line.attive_note_variazione_imposta > 0:
306 rcd += '{:8s}'.format("FA" + prog_sezione + "011" ) + '{:16.0f}'.format(line.attive_note_variazione_imposta)
307
308 # OPERAZIONI PASSIVE
309 # Totale operazioni imponibili, non imponibili ed esenti
310 if line.passive_imponibile_non_esente > 0:
311 rcd += '{:8s}'.format("FA" + prog_sezione + "012" ) + '{:16.0f}'.format(line.passive_imponibile_non_esente)
312 if line.passive_imposta > 0:
313 rcd += '{:8s}'.format("FA" + prog_sezione + "013" ) + '{:16.0f}'.format(line.passive_imposta)
314 if line.passive_operazioni_iva_non_esposta > 0:
315 rcd += '{:8s}'.format("FA" + prog_sezione + "014" ) + '{:16.0f}'.format(line.passive_operazioni_iva_non_esposta)
316 if line.passive_note_variazione > 0:
317 rcd += '{:8s}'.format("FA" + prog_sezione + "015" ) + '{:16.0f}'.format(line.passive_note_variazione)
318 if line.passive_note_variazione_imposta > 0:
319 rcd += '{:8s}'.format("FA" + prog_sezione + "016" ) + '{:16.0f}'.format(line.passive_note_variazione_imposta)
320
321 # riempio fino a 1900 caratteri
322 rcd += " " * (1897 -len(rcd))
323 # Ultimi caratteri di controllo
324 rcd += "A" # Impostare al valore "A"
325 rcd += "\r" #
326 rcd += "\n" #
327
328 return rcd
329
330 def _record_C_SA(self, cr, uid, line, prog_modulo, prog_sezione, context=None):
331 prog_sezione = str(prog_sezione).zfill(3)
332
333 if not line.codice_fiscale:
334 raise osv.except_osv(_('Errore comunicazione!'),_("Manca codice fiscale su partner %s") % (line.partner_id.name,))
335 rcd = "C"
336 rcd += '{:16s}'.format(line.comunicazione_id.soggetto_codice_fiscale) # codice fiscale soggetto obbligato
337 rcd += '{:8s}'.format(str(prog_modulo).zfill(8)) # Progressivo modulo
338 rcd += '{:3s}'.format("") # Filler
339 rcd += '{:25s}'.format("") # Filler
340 rcd += '{:20s}'.format("") # Spazio utente
341 rcd += '{:16s}'.format("") # Filler
342
343 rcd += '{:8s}'.format("SA" + prog_sezione + "001" ) + '{:16s}'.format(line.codice_fiscale)
344 if line.numero_operazioni:
345 rcd += '{:8s}'.format("SA" + prog_sezione + "002" ) + '{:16d}'.format(line.numero_operazioni)
346 if line.importo_complessivo:
347 rcd += '{:8s}'.format("SA" + prog_sezione + "003" ) + '{:16.0f}'.format(line.importo_complessivo)
348 if line.noleggio:
349 rcd += '{:8s}'.format("SA" + prog_sezione + "004" ) + '{:16s}'.format(line.noleggio)
350
351 # riempio fino a 1900 caratteri
352 rcd += " " * (1897 -len(rcd))
353 # Ultimi caratteri di controllo
354 rcd += "A" # Impostare al valore "A"
355 rcd += "\r" #
356 rcd += "\n" #
357
358 return rcd
359
360 def _record_C_BL(self, cr, uid, line, prog_modulo, prog_sezione, context=None):
361
362 prog_sezione = str(prog_sezione).zfill(3)
363
364 # Controlli
365 # ...Operazioni con paesi con fiscalità privilegiata (è obbligatorio compilare le sezioni BL001, BL002 e almeno un campo delle sezioni BL003, BL004, BL005, BL006, BL007, BL008)
366 if line.operazione_fiscalita_privilegiata:
367 if (not line.pf_cognome or not line.pf_nome) and not line.pg_denominazione:
368 raise osv.except_osv(_("Errore quadro BL"), _(" - Partner %s! Cognome e nome obbligatori oppure ragione sociale per soggetto giuridico") % (line.partner_id.name ,) )
369 # ...Operazioni con soggetti non residenti (è obbligatorio compilare le sezioni BL001, BL002 e almeno un campo delle sezioni BL003 e BL006)
370 if line.operazione_con_soggetti_non_residenti:
371 if (not line.pf_cognome or not line.pf_nome) and not line.pg_denominazione:
372 raise osv.except_osv(_("Errore quadro BL"), _(" - Partner %s! Cognome e nome obbligatori oppure ragione sociale per soggetto giuridico") % (line.partner_id.name ,) )
373 if line.pf_cognome and not line.pf_data_nascita and not line.pf_codice_stato_estero:
374 raise osv.except_osv(_("Errore quadro BL - Partner %s! Inserire alemno uno dei seguenti valori: \
375 Pers.Fisica-Data di nascita, Pers.Fisica-Codice Stato") % (line.partner_id.name ,) )
376 # ...Acquisti di servizi da soggetti non residenti (è obbligatorio compilare le sezioni BL001, BL002 e almeno un campo della sezione BL006)
377 if line.Acquisto_servizi_da_soggetti_non_residenti:
378 if (not line.pf_cognome or not line.pf_nome) and not line.pg_denominazione:
379 raise osv.except_osv(_("Errore quadro BL"), _(" - Partner %s! Cognome e nome obbligatori oppure ragione sociale per soggetto giuridico") % (line.partner_id.name ,) )
380 if line.pf_cognome and not line.pf_data_nascita and not line.pf_codice_stato_estero:
381 raise osv.except_osv(_("Errore quadro BL"), _(" - Partner %s! Inserire alemno uno dei seguenti valori: \
382 Pers.Fisica-Data di nascita, Pers.Fisica-Codice Stato") % (line.partner_id.name ,) )
383
384 rcd = "C"
385 rcd += '{:16s}'.format(line.comunicazione_id.soggetto_codice_fiscale) # codice fiscale soggetto obbligato
386 rcd += '{:8s}'.format(str(prog_modulo).zfill(8)) # Progressivo modulo
387 rcd += '{:3s}'.format("") # Filler
388 rcd += '{:25s}'.format("") # Filler
389 rcd += '{:20s}'.format("") # Spazio utente
390 rcd += '{:16s}'.format("") # Filler
391
392 # Dati anagrafici
393 # .. persona fisica
394 if line.pf_cognome:
395 if not line.pf_nome or not line.pf_data_nascita or not line.pf_comune_stato_nascita or not line.pf_provincia_nascita \
396 or not line.pf_codice_stato_estero:
397 raise osv.except_osv('Error', _('Completare dati persona fisica nel quadro BL del partner: %s') %(line.partner_id.name,))
398 str_split = self._split_string_positional_field(line.pf_cognome)
399 for s in str_split:
400 rcd += '{:8s}'.format("BL" + "001" + "001" ) + '{:16s}'.format(s)
401 str_split = self._split_string_positional_field(line.pf_nome)
402 for s in str_split:
403 rcd += '{:8s}'.format("BL" + "001" + "002" ) + '{:16s}'.format(s)
404 rcd += '{:8s}'.format("BL" + "001" + "003" ) + '{:16s}'.format(datetime.strptime(line.pf_data_nascita, "%Y-%m-%d").strftime("%d%m%Y")) # Data di nascita
405 str_split = self._split_string_positional_field(line.pf_comune_stato_nascita)
406 for s in str_split:
407 rcd += '{:8s}'.format("BL" + "001" + "004" ) + '{:16s}'.format(s)
408 rcd += '{:8s}'.format("BL" + "001" + "005" ) + '{:16s}'.format(line.pf_provincia_nascita)
409 rcd += '{:8s}'.format("BL" + "001" + "006" ) + '{:>16s}'.format(line.pf_codice_stato_estero)
410 # .. persona giuridica
411 if line.pg_denominazione:
412 if not line.pg_citta_estera_sede_legale or not line.pg_codice_stato_estero or not line.pg_indirizzo_sede_legale:
413 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,))
414 str_split = self._split_string_positional_field(line.pg_denominazione)
415 for s in str_split:
416 rcd += '{:8s}'.format("BL" + "001" + "007" ) + '{:16s}'.format(s)
417 str_split = self._split_string_positional_field(line.pg_citta_estera_sede_legale)
418 for s in str_split:
419 rcd += '{:8s}'.format("BL" + "001" + "008" ) + '{:16s}'.format(s)
420 rcd += '{:8s}'.format("BL" + "001" + "009" ) + '{:>16s}'.format(line.pg_codice_stato_estero)
421 str_split = self._split_string_positional_field(line.pg_indirizzo_sede_legale)
422 for s in str_split:
423 rcd += '{:8s}'.format("BL" + "001" + "010" ) + '{:16s}'.format(s)
424 # Codice identificativo IVA
425 if line.codice_identificativo_IVA:
426 rcd += '{:8s}'.format("BL" + "002" + "001" ) + '{:16s}'.format(line.codice_identificativo_IVA or '')
427 # Operazioni con paesi con fiscalità privilegiata
428 rcd += '{:8s}'.format("BL" + "002" + "002" )
429 if line.operazione_fiscalita_privilegiata:
430 rcd += '{:>16s}'.format("1")
431 else:
432 rcd += '{:>16s}'.format("0")
433
434 # Operazioni con soggetti non residenti
435 rcd += '{:8s}'.format("BL" + "002" + "003" )
436 if line.operazione_con_soggetti_non_residenti:
437 rcd += '{:>16s}'.format("1")
438 else:
439 rcd += '{:>16s}'.format("0")
440 # Acquisti di servizi da soggetti non residenti
441 rcd += '{:8s}'.format("BL" + "002" + "004" )
442 if line.Acquisto_servizi_da_soggetti_non_residenti:
443 rcd += '{:>16s}'.format("1")
444 else:
445 rcd += '{:>16s}'.format("0")
446
447
448 # OPERAZIONI ATTIVE
449 if line.attive_importo_complessivo > 0:
450 rcd += '{:8s}'.format("BL" + "003" + "001" ) + '{:16.0f}'.format(line.attive_importo_complessivo)
451 if line.attive_imposta > 0:
452 rcd += '{:8s}'.format("BL" + "003" + "002" ) + '{:16.0f}'.format(line.attive_imposta)
453
454 if line.operazione_fiscalita_privilegiata:
455 if line.attive_non_sogg_cessione_beni > 0:
456 rcd += '{:8s}'.format("BL" + "004" + "001" ) + '{:16.0f}'.format(line.attive_non_sogg_cessione_beni)
457 if line.attive_non_sogg_servizi > 0:
458 rcd += '{:8s}'.format("BL" + "004" + "002" ) + '{:16.0f}'.format(line.attive_non_sogg_servizi)
459 if line.attive_note_variazione > 0:
460 rcd += '{:8s}'.format("BL" + "005" + "001" ) + '{:16.0f}'.format(line.attive_note_variazione)
461 if line.attive_note_variazione_imposta > 0:
462 rcd += '{:8s}'.format("BL" + "005" + "002" ) + '{:16.0f}'.format(line.attive_note_variazione_imposta)
463
464 # OPERAZIONI PASSIVE
465 if line.passive_importo_complessivo > 0:
466 rcd += '{:8s}'.format("BL" + "006" + "001" ) + '{:16.0f}'.format(line.passive_importo_complessivo)
467 if line.passive_imposta > 0:
468 rcd += '{:8s}'.format("BL" + "006" + "002" ) + '{:16.0f}'.format(line.passive_imposta)
469
470 if line.operazione_fiscalita_privilegiata:
471 if line.passive_non_sogg_importo_complessivo > 0:
472 rcd += '{:8s}'.format("BL" + "007" + "001" ) + '{:16.0f}'.format(line.passive_non_sogg_importo_complessivo)
473 if line.passive_note_variazione > 0:
474 rcd += '{:8s}'.format("BL" + "008" + "001" ) + '{:16.0f}'.format(line.passive_note_variazione)
475 if line.passive_note_variazione_imposta > 0:
476 rcd += '{:8s}'.format("BL" + "008" + "002" ) + '{:16.0f}'.format(line.passive_note_variazione_imposta)
477
478 # riempio fino a 1900 caratteri
479 rcd += " " * (1897 -len(rcd))
480 # Ultimi caratteri di controllo
481 rcd += "A" # Impostare al valore "A"
482 rcd += "\r" #
483 rcd += "\n" #
484
485 return rcd
486
487 def _record_D_SE(self, cr, uid, line, prog_modulo, prog_sezione, context=None):
488
489 prog_sezione = str(prog_sezione).zfill(3)
490
491 # Controlli
492 # ...Cognome o Ragione sociale
493 if (not line.pf_cognome or not line.pf_nome) and not line.pg_denominazione:
494 raise osv.except_osv(_("Errore quadro SE"), _(" - Partner %s! Cognome e nome obbligatori oppure ragione sociale per soggetto giuridico") % (line.partner_id.name ,) )
495 # ...
496 if line.pf_cognome and not line.pf_data_nascita and not line.pf_codice_stato_estero:
497 raise osv.except_osv(_("Errore quadro SE - Partner %s! Inserire alemno uno dei seguenti valori: \
498 Pers.Fisica-Data di nascita, Pers.Fisica-Codice Stato") % (line.partner_id.name ,) )
499
500 rcd = "D"
501 rcd += '{:16s}'.format(line.comunicazione_id.soggetto_codice_fiscale) # codice fiscale soggetto obbligato
502 rcd += '{:8s}'.format(str(prog_modulo).zfill(8)) # Progressivo modulo
503 rcd += '{:3s}'.format("") # Filler
504 rcd += '{:25s}'.format("") # Filler
505 rcd += '{:20s}'.format("") # Spazio utente
506 rcd += '{:16s}'.format("") # Filler
507
508 # Dati anagrafici
509 # .. persona fisica
510 if line.pf_cognome:
511 if not line.pf_nome or not line.pf_data_nascita or not line.pf_comune_stato_nascita or not line.pf_provincia_nascita \
512 or not line.pf_codice_stato_estero:
513 raise osv.except_osv('Error', _('Completare dati persona fisica nel quadro SE del partner: %s') %(line.partner_id.name,))
514 str_split = self._split_string_positional_field(line.pf_cognome)
515 for s in str_split:
516 rcd += '{:8s}'.format("SE" + prog_sezione + "001" ) + '{:16s}'.format(s)
517 str_split = self._split_string_positional_field(line.pf_nome)
518 for s in str_split:
519 rcd += '{:8s}'.format("SE" + prog_sezione + "002" ) + '{:16s}'.format(s)
520 rcd += '{:8s}'.format("SE" + prog_sezione + "003" ) + '{:16s}'.format(datetime.strptime(line.pf_data_nascita, "%Y-%m-%d").strftime("%d%m%Y")) # Data di nascita
521 str_split = self._split_string_positional_field(line.pf_comune_stato_nascita)
522 for s in str_split:
523 rcd += '{:8s}'.format("SE" + prog_sezione + "004" ) + '{:16s}'.format(s)
524 rcd += '{:8s}'.format("SE" + prog_sezione + "005" ) + '{:16s}'.format(line.pf_provincia_nascita)
525 rcd += '{:8s}'.format("SE" + prog_sezione + "006" ) + '{:>16s}'.format(line.pf_codice_stato_estero_domicilio)
526 # .. persona giuridica
527 if line.pg_denominazione:
528 if not line.pg_citta_estera_sede_legale or not line.pg_codice_stato_estero_domicilio or not line.pg_indirizzo_sede_legale:
529 raise osv.except_osv('Error', _('Completare dati persona giuridica nel quadro SE del partner: %s : Citta estera - Codice Stato estero - Indirizzo') %(line.partner_id.name,))
530 str_split = self._split_string_positional_field(line.pg_denominazione)
531 for s in str_split:
532 rcd += '{:8s}'.format("SE" + prog_sezione + "007" ) + '{:16s}'.format(s)
533 str_split = self._split_string_positional_field(line.pg_citta_estera_sede_legale)
534 for s in str_split:
535 rcd += '{:8s}'.format("SE" + prog_sezione + "008" ) + '{:16s}'.format(s)
536 rcd += '{:8s}'.format("SE" + prog_sezione + "009" ) + '{:>16s}'.format(line.pg_codice_stato_estero_domicilio)
537 str_split = self._split_string_positional_field(line.pg_indirizzo_sede_legale)
538 for s in str_split:
539 rcd += '{:8s}'.format("SE" + prog_sezione + "010" ) + '{:16s}'.format(s)
540 # Codice identificativo IVA
541 if line.codice_identificativo_IVA:
542 rcd += '{:8s}'.format("SE" + prog_sezione + "011" ) + '{:16s}'.format(line.codice_identificativo_IVA)
543 # Dati documento
544 rcd += '{:8s}'.format("SE" + prog_sezione + "012" ) + '{:>16s}'.format(datetime.strptime(line.data_emissione, "%Y-%m-%d").strftime("%d%m%Y"))
545 rcd += '{:8s}'.format("SE" + prog_sezione + "013" ) + '{:>16s}'.format(datetime.strptime(line.data_registrazione, "%Y-%m-%d").strftime("%d%m%Y"))
546 rcd += '{:8s}'.format("SE" + prog_sezione + "014" ) + '{:16s}'.format(line.numero_fattura)
547
548 if line.importo > 0:
549 rcd += '{:8s}'.format("SE" + prog_sezione + "015" ) + '{:16.0f}'.format(line.importo)
550 if line.imposta > 0:
551 rcd += '{:8s}'.format("SE" + prog_sezione + "016" ) + '{:16.0f}'.format(line.imposta)
552
553 # riempio fino a 1900 caratteri
554 rcd += " " * (1897 -len(rcd))
555 # Ultimi caratteri di controllo
556 rcd += "A" # Impostare al valore "A"
557 rcd += "\r" #
558 rcd += "\n" #
559
560 return rcd
561
562
563 def _record_E(self, cr, uid, comunicazione, prog_modulo, context=None):
564 rcd = "E"
565 rcd += '{:16s}'.format(comunicazione.soggetto_codice_fiscale)
566 #rcd += '{:8d}'.format(prog_modulo) # Progressivo modulo
567 rcd += '{:8s}'.format(str(prog_modulo).zfill(8)) # Progressivo modulo
568 rcd += '{:3s}'.format("") # Filler
569 rcd += '{:25s}'.format("") # Filler
570 rcd += '{:20s}'.format("") # Filler
571 rcd += '{:16s}'.format("") # Filler
572 # Aggregate
573 if comunicazione.totale_FA:
574 rcd += '{:8s}'.format("TA001001") + '{:16d}'.format(comunicazione.totale_FA)
575 if comunicazione.totale_SA:
576 rcd += '{:8s}'.format("TA002001") + '{:16d}'.format(comunicazione.totale_SA)
577 if comunicazione.totale_BL1:
578 rcd += '{:8s}'.format("TA003001") + '{:16d}'.format(comunicazione.totale_BL1)
579 if comunicazione.totale_BL2:
580 rcd += '{:8s}'.format("TA003002") + '{:16d}'.format(comunicazione.totale_BL2)
581 if comunicazione.totale_BL3:
582 rcd += '{:8s}'.format("TA003003") + '{:16d}'.format(comunicazione.totale_BL3)
583 # Analitiche
584 if comunicazione.totale_FE:
585 rcd += '{:8s}'.format("TA004001") + '{:16d}'.format(comunicazione.totale_FE)
586 if comunicazione.totale_FE_R:
587 rcd += '{:8s}'.format("TA004002") + '{:16d}'.format(comunicazione.totale_FE_R)
588 if comunicazione.totale_FR:
589 rcd += '{:8s}'.format("TA005001") + '{:16d}'.format(comunicazione.totale_FR)
590 if comunicazione.totale_FR_R:
591 rcd += '{:8s}'.format("TA005002") + '{:16d}'.format(comunicazione.totale_FR_R)
592 if comunicazione.totale_NE:
593 rcd += '{:8s}'.format("TA006001") + '{:16d}'.format(comunicazione.totale_NE)
594 if comunicazione.totale_NR:
595 rcd += '{:8s}'.format("TA007001") + '{:16d}'.format(comunicazione.totale_NR)
596 if comunicazione.totale_DF:
597 rcd += '{:8s}'.format("TA008001") + '{:16d}'.format(comunicazione.totale_DF)
598 if comunicazione.totale_FN:
599 rcd += '{:8s}'.format("TA009001") + '{:16d}'.format(comunicazione.totale_FN)
600 if comunicazione.totale_SE:
601 rcd += '{:8s}'.format("TA010001") + '{:16d}'.format(comunicazione.totale_SE)
602 if comunicazione.totale_TU:
603 rcd += '{:8s}'.format("TA011001") + '{:16d}'.format(comunicazione.totale_TU)
604
605 rcd += " " * (1897 -len(rcd))
606
607 # Ultimi caratteri di controllo
608 rcd += "A" # Impostare al valore "A"
609 rcd += "\r" #
610 rcd += "\n" #
611 return rcd
612
613 def _record_Z(self, cr, uid, args, context=None):
614 rcd = "Z"
615 rcd += '{:14s}'.format("") # filler
616 rcd += '{:9s}'.format(str(args.get('numero_record_B')).zfill(9))
617 rcd += '{:9s}'.format(str(args.get('numero_record_C')).zfill(9))
618 rcd += '{:9s}'.format(str(args.get('numero_record_D')).zfill(9))
619 rcd += '{:9s}'.format(str(args.get('numero_record_E')).zfill(9))
620 rcd += " " * 1846
621 # Ultimi caratteri di controllo
622 rcd += "A" # Impostare al valore "A"
623 rcd += "\r" #
624 rcd += "\n" #
625 return rcd
626
627 def execute_export(self, cr, uid, ids, context=None):
628 if len(ids) > 1:
629 raise osv.except_osv('Error', _('Only one comunication'))
630
631 numero_record_B = 0
632 numero_record_C = 0
633 numero_record_D = 0
634 numero_record_E = 0
635
636 comunicazione_id = context.get('active_id', False)
637 comunicazione = self.pool.get('spesometro.comunicazione').browse(cr, uid, comunicazione_id)
638
639 # Testata
640 content = self._record_A(cr, uid, comunicazione, context=context)
641 numero_record_B += 1
642 content += self._record_B(cr, uid, comunicazione, context=context)
643
644 # Dettaglio
645 progressivo_modulo = 0
646 progressivo_sezione = 0
647 sezione_max = 3
648 # .. quadro FA
649 for line in comunicazione.line_FA_ids:
650 progressivo_modulo +=1
651 progressivo_sezione +=1
652 if progressivo_sezione > sezione_max :
653 progressivo_sezione = 1
654 content += self._record_C_FA(cr, uid, line, progressivo_modulo, progressivo_sezione, context=context)
655 numero_record_C += 1
656 # .. quadro SA
657 progressivo_sezione = 0
658 sezione_max = 10
659 for line in comunicazione.line_SA_ids:
660 progressivo_modulo +=1
661 progressivo_sezione +=1
662 if progressivo_sezione > sezione_max :
663 progressivo_sezione = 1
664 content += self._record_C_SA(cr, uid, line, progressivo_modulo, progressivo_sezione, context=context)
665 numero_record_C += 1
666
667 # .. quadro BL
668 progressivo_sezione = 0
669 sezione_max = 1
670 for line in comunicazione.line_BL_ids:
671 progressivo_modulo +=1
672 progressivo_sezione +=1
673 if progressivo_sezione > sezione_max :
674 progressivo_sezione = 1
675 content += self._record_C_BL(cr, uid, line, progressivo_modulo, progressivo_sezione, context=context)
676 numero_record_C += 1
677
678 # .. quadro SE
679 progressivo_sezione = 0
680 sezione_max = 3
681 for line in comunicazione.line_SE_ids:
682 progressivo_modulo +=1
683 progressivo_sezione +=1
684 if progressivo_sezione > sezione_max :
685 progressivo_sezione = 1
686 content += self._record_D_SE(cr, uid, line, progressivo_modulo, progressivo_sezione, context=context)
687 numero_record_D += 1
688
689 # Riepilogo
690 progressivo_modulo = 1
691 content += self._record_E(cr, uid, comunicazione, progressivo_modulo, context=context)
692 numero_record_E += 1
693
694 # Coda
695 args = {
696 'numero_record_B' : numero_record_B,
697 'numero_record_C' : numero_record_C,
698 'numero_record_D' : numero_record_D,
699 'numero_record_E' : numero_record_E,
700 }
701 content += self._record_Z(cr, uid, args, context=None)
702
703 out=base64.encodestring(content.encode("utf8"))
704
705 self.write(cr, uid, ids, {'file_spesometro':out}, context=context)
706
707 model_data_obj = self.pool.get('ir.model.data')
708 view_rec = model_data_obj.get_object_reference(cr, uid, 'l10n_it_spesometro', 'wizard_spesometro_export_view')
709 view_id = view_rec and view_rec[1] or False
710
711 return {
712 'view_type': 'form',
713 'view_id' : [view_id],
714 'view_mode': 'form',
715 'res_model': 'wizard.spesometro.export',
716 'res_id': ids[0],
717 'type': 'ir.actions.act_window',
718 'target': 'new',
719 'context': context,
720 }
721
722# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
0\ No newline at end of file723\ No newline at end of file
1724
=== 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-20 14:19:55 +0000
@@ -0,0 +1,44 @@
1<?xml version="1.0" encoding="utf-8"?>
2<openerp>
3 <data>
4 <!--
5 Form
6 -->
7 <record id="wizard_spesometro_export_view" model="ir.ui.view">
8 <field name="name">wizard.spesometro.export.view</field>
9 <field name="model">wizard.spesometro.export</field>
10 <field name="arch" type="xml">
11 <form string="Params">
12 <group>
13 <field name="file_spesometro" readonly="1"/>
14 <separator colspan="4" />
15 <button name="execute_export" string="Export" type="object" icon="gtk-execute" />
16 </group>
17 </form>
18 </field>
19 </record>
20
21 <!-- ACTION -->
22 <record id="wizard_spesometro_export_action" model="ir.actions.act_window">
23 <field name="name">Export spesometro</field>
24 <field name="res_model">wizard.spesometro.export</field>
25 <field name="src_model">spesometro.comunicazione</field>
26 <field name="view_type">form</field>
27 <field name="view_mode">form</field>
28 <field name="view_id" ref="wizard_spesometro_export_view"/>
29 <field name="help">Crea file spesometro - Comunicazione art.21 </field>
30 <field name="target">new</field>
31 </record>
32
33 <act_window name="Export spesometro"
34 res_model="wizard.spesometro.export"
35 src_model="spesometro.comunicazione"
36 view_mode="form"
37 target="new"
38 context="{'search_default_in_location':1}"
39 key2="client_action_multi"
40 view_id="wizard_spesometro_export_view"
41 id="wizard_spesometro_export_action2"/>
42
43 </data>
44</openerp>

Subscribers

People subscribed via source and target branches