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
1=== added directory 'l10n_it_spesometro'
2=== added file 'l10n_it_spesometro/__init__.py'
3--- l10n_it_spesometro/__init__.py 1970-01-01 00:00:00 +0000
4+++ l10n_it_spesometro/__init__.py 2014-03-20 14:19:55 +0000
5@@ -0,0 +1,23 @@
6+# -*- coding: utf-8 -*-
7+##############################################################################
8+#
9+# Author: Alessandro Camilli (a.camilli@yahoo.it)
10+# Copyright (C) 2014
11+# Associazione OpenERP Italia (<http://www.openerp-italia.org>)
12+#
13+# This program is free software: you can redistribute it and/or modify
14+# it under the terms of the GNU Affero General Public License as published
15+# by the Free Software Foundation, either version 3 of the License, or
16+# (at your option) any later version.
17+#
18+# This program is distributed in the hope that it will be useful,
19+# but WITHOUT ANY WARRANTY; without even the implied warranty of
20+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21+# GNU General Public License for more details.
22+#
23+# You should have received a copy of the GNU Affero General Public License
24+# along with this program. If not, see <http://www.gnu.org/licenses/>.
25+#
26+##############################################################################
27+import spesometro
28+import wizard
29\ No newline at end of file
30
31=== added file 'l10n_it_spesometro/__openerp__.py'
32--- l10n_it_spesometro/__openerp__.py 1970-01-01 00:00:00 +0000
33+++ l10n_it_spesometro/__openerp__.py 2014-03-20 14:19:55 +0000
34@@ -0,0 +1,49 @@
35+# -*- coding: utf-8 -*-
36+##############################################################################
37+#
38+# Author: Alessandro Camilli (a.camilli@yahoo.it)
39+# Copyright (C) 2014
40+# Associazione OpenERP Italia (<http://www.openerp-italia.org>)
41+#
42+# This program is free software: you can redistribute it and/or modify
43+# it under the terms of the GNU Affero General Public License as published
44+# by the Free Software Foundation, either version 3 of the License, or
45+# (at your option) any later version.
46+#
47+# This program is distributed in the hope that it will be useful,
48+# but WITHOUT ANY WARRANTY; without even the implied warranty of
49+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
50+# GNU General Public License for more details.
51+#
52+# You should have received a copy of the GNU Affero General Public License
53+# along with this program. If not, see <http://www.gnu.org/licenses/>.
54+#
55+##############################################################################
56+{
57+ 'name': 'Spesometro - Comunicazione art.21',
58+ 'version': '0.2',
59+ 'category': 'Localisation/Italy',
60+ 'description': """Spesometro - Comunicazione art.21
61+
62+Functionalities:
63+- Creazione comunicazione art.21 in forma Aggregata
64+- Export file per agenzia delle entrate
65+
66+""",
67+ 'author': 'Alessandro Camilli',
68+ 'website': 'http://www.openerp-italia.org',
69+ 'license': 'AGPL-3',
70+ "depends" : ['account', 'l10n_it_base'],
71+ "data" : [
72+ 'security/ir.model.access.csv',
73+ 'spesometro_view.xml',
74+ 'wizard/wizard_crea_comunicazione_view.xml',
75+ 'wizard/wizard_default_view.xml',
76+ 'wizard/wizard_export_view.xml',
77+ ],
78+ "demo" : [],
79+ "active": False,
80+ "installable": True
81+}
82+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
83+
84
85=== added directory 'l10n_it_spesometro/security'
86=== added file 'l10n_it_spesometro/security/ir.model.access.csv'
87--- l10n_it_spesometro/security/ir.model.access.csv 1970-01-01 00:00:00 +0000
88+++ l10n_it_spesometro/security/ir.model.access.csv 2014-03-20 14:19:55 +0000
89@@ -0,0 +1,11 @@
90+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
91+spesometro_comunicazione_user,spesometro_comunicazione user,model_spesometro_comunicazione,base.group_user,1,0,0,0
92+spesometro_comunicazione_manager,spesometro_comunicazione manager,model_spesometro_comunicazione,account.group_account_manager,1,1,1,1
93+spesometro_comunicazione_line_fa_user,spesometro_comunicazione_line_fa user,model_spesometro_comunicazione_line_fa,base.group_user,1,0,0,0
94+spesometro_comunicazione_line_fa_manager,spesometro_comunicazione_line_fa manager,model_spesometro_comunicazione_line_fa,account.group_account_manager,1,1,1,1
95+spesometro_comunicazione_line_bl_user,spesometro_comunicazione_line_bl user,model_spesometro_comunicazione_line_bl,base.group_user,1,0,0,0
96+spesometro_comunicazione_line_bl_manager,spesometro_comunicazione_line_bl manager,model_spesometro_comunicazione_line_bl,account.group_account_manager,1,1,1,1
97+spesometro_comunicazione_line_sa_user,spesometro_comunicazione_line_sa user,model_spesometro_comunicazione_line_sa,base.group_user,1,0,0,0
98+spesometro_comunicazione_line_sa_manager,spesometro_comunicazione_line_sa manager,model_spesometro_comunicazione_line_sa,account.group_account_manager,1,1,1,1
99+spesometro_configurazione_user,spesometro_configurazione user,model_spesometro_configurazione,base.group_user,1,0,0,0
100+spesometro_configurazione_manager,spesometro_configurazione manager,model_spesometro_configurazione,account.group_account_manager,1,1,1,1
101\ No newline at end of file
102
103=== added file 'l10n_it_spesometro/spesometro.py'
104--- l10n_it_spesometro/spesometro.py 1970-01-01 00:00:00 +0000
105+++ l10n_it_spesometro/spesometro.py 2014-03-20 14:19:55 +0000
106@@ -0,0 +1,1276 @@
107+# -*- coding: utf-8 -*-
108+##############################################################################
109+#
110+# Author: Alessandro Camilli (a.camilli@yahoo.it)
111+# Copyright (C) 2014
112+# Associazione OpenERP Italia (<http://www.openerp-italia.org>)
113+#
114+# This program is free software: you can redistribute it and/or modify
115+# it under the terms of the GNU Affero General Public License as published
116+# by the Free Software Foundation, either version 3 of the License, or
117+# (at your option) any later version.
118+#
119+# This program is distributed in the hope that it will be useful,
120+# but WITHOUT ANY WARRANTY; without even the implied warranty of
121+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
122+# GNU General Public License for more details.
123+#
124+# You should have received a copy of the GNU Affero General Public License
125+# along with this program. If not, see <http://www.gnu.org/licenses/>.
126+#
127+##############################################################################
128+
129+from osv import fields, orm
130+from openerp.tools.translate import _
131+import decimal_precision as dp
132+import datetime, time
133+
134+class res_country(orm.Model):
135+ _inherit = "res.country"
136+ _columns = {
137+ 'codice_stato_agenzia_entrate': fields.char('Codice stato Agenzia Entrate', size=3)
138+ }
139+
140+class account_journal(orm.Model):
141+ _inherit = "account.journal"
142+ _columns = {
143+ 'spesometro': fields.boolean('Da includere'),
144+ 'spesometro_operazione': fields.selection((('FA','Operazioni documentate da fattura'),
145+ ('SA','Operazioni senza fattura'),
146+ ('BL1','Operazioni con paesi con fiscalità privilegiata'),
147+ ('BL2','Operazioni con soggetti non residenti'),
148+ ('BL3','Acquisti di servizi da soggetti non residenti'),
149+ ('DR','Documento Riepilogativo')),
150+ 'Operazione' ),
151+ 'spesometro_segno': fields.selection((('attiva','Attiva'),
152+ ('passiva','Passiva')),
153+ 'Segno operaz.' ),
154+ 'spesometro_IVA_non_esposta': fields.boolean('IVA non esposta')
155+ }
156+
157+class res_partner(orm.Model):
158+ _inherit = "res.partner"
159+ _columns = {
160+ 'spesometro_escludi': fields.boolean('Escludi'),
161+ 'spesometro_operazione': fields.selection((('FA','Operazioni documentate da fattura'),
162+ ('SA','Operazioni senza fattura'),
163+ ('BL1','Operazioni con paesi con fiscalità privilegiata'),
164+ ('BL2','Operazioni con soggetti non residenti'),
165+ ('BL3','Acquisti di servizi da soggetti non residenti'),
166+ ('DR','Documento Riepilogativo')),
167+ 'Operazione' ),
168+ 'spesometro_IVA_non_esposta': fields.boolean('IVA non esposta'),
169+ 'spesometro_leasing': fields.selection((('A','Autovettura'),
170+ ('B','Caravan'),
171+ ('C','Altri veicoli'),
172+ ('D','Unità da diporto'),
173+ ('E','Aeromobili')),
174+ 'Tipo Leasing' ),
175+ 'spesometro_tipo_servizio': fields.selection((('cessione','Cessione Beni'),
176+ ('servizi','Prestazione di servizi')),
177+ 'Tipo servizio', help="Specificare per 'Operazioni con paesi con fiscalità privilegiata' "),
178+ }
179+
180+ _defaults = {
181+ 'spesometro_escludi' : False,
182+ }
183+
184+class spesometro_configurazione(orm.Model):
185+
186+ def _check_one_year(self, cr, uid, ids, context=None):
187+ for element in self.browse(cr, uid, ids, context=context):
188+ element_ids = self.search(cr, uid, [('anno','=', element.anno)], context=context)
189+ if len(element_ids) > 1:
190+ return False
191+ return True
192+
193+ _name = "spesometro.configurazione"
194+ _description = "Spesometro - Configurazione"
195+ _columns = {
196+ 'anno': fields.integer('Anno', size=4, required=True ),
197+ 'stato_san_marino': fields.many2one('res.country', 'Stato San Marino', required=True),
198+ 'quadro_fa_limite_importo': fields.float('Quadro FA - Limite importo'),
199+ 'quadro_fa_limite_importo_line': fields.float('Quadro FA - Limite importo singola operaz.'),
200+ 'quadro_sa_limite_importo': fields.float('Quadro SA - Limite importo'),
201+ 'quadro_sa_limite_importo_line': fields.float('Quadro SA - Limite importo singola operaz.'),
202+ 'quadro_bl_limite_importo': fields.float('Quadro BL - Limite importo'),
203+ 'quadro_bl_limite_importo_line': fields.float('Quadro BL - Limite importo singola operaz.'),
204+ 'quadro_se_limite_importo_line': fields.float('Quadro SE - Limite importo singola operaz.'),
205+ }
206+ _constraints = [
207+ (_check_one_year, 'Error! Config for this year already exists.', ['anno']),
208+ ]
209+
210+class spesometro_comunicazione(orm.Model):
211+
212+ _name = "spesometro.comunicazione"
213+ _description = "Spesometro - Comunicazione "
214+
215+ def _tot_operation_number(self, cr, uid, ids, field_names, args, context=None):
216+ res = {}
217+ for com in self.browse(cr, uid, ids):
218+ # Aggregate
219+ tot_FA = len(com.line_FA_ids)
220+ tot_SA = len(com.line_SA_ids)
221+ tot_BL1 = 0
222+ tot_BL2 = 0
223+ tot_BL3 = 0
224+ for line in com.line_BL_ids:
225+ if line.operazione_fiscalita_privilegiata:
226+ tot_BL1 += 1
227+ elif line.operazione_con_soggetti_non_residenti:
228+ tot_BL2 += 1
229+ elif line.Acquisto_servizi_da_soggetti_non_residenti:
230+ tot_BL3 += 1
231+ #Analitiche
232+ tot_FE = 0 # Fatture emesse
233+ tot_FE_R = 0 # Doc riepilogativi
234+ for line in com.line_FE_ids:
235+ if line.documento_riepilogativo:
236+ tot_FE_R += 1
237+ else:
238+ tot_FE += 1
239+ tot_FR = 0 # Fatture ricevute
240+ tot_FR_R = 0 # Doc riepilogativi ricevuti
241+ for line in com.line_FR_ids:
242+ if line.documento_riepilogativo:
243+ tot_FR_R += 1
244+ else:
245+ tot_FR += 1
246+ tot_NE = len(com.line_NE_ids)
247+ tot_NR = len(com.line_NR_ids)
248+ tot_DF = len(com.line_DF_ids)
249+ tot_FN = len(com.line_FN_ids)
250+ tot_SE = len(com.line_SE_ids)
251+ tot_TU = len(com.line_TU_ids)
252+
253+ res[com.id] = {
254+ 'totale_FA' : tot_FA,
255+ 'totale_SA' : tot_SA,
256+ 'totale_BL1' : tot_BL1,
257+ 'totale_BL2' : tot_BL2,
258+ 'totale_BL3' : tot_BL3,
259+ 'totale_FE' : tot_FE,
260+ 'totale_FE_R' : tot_FE_R,
261+ 'totale_FR' : tot_FR,
262+ 'totale_FR_r' : tot_FR_R,
263+ 'totale_NE' : tot_NE,
264+ 'totale_NR' : tot_NR,
265+ 'totale_DF' : tot_DF,
266+ 'totale_FN' : tot_FN,
267+ 'totale_SE' : tot_SE,
268+ 'totale_TU' : tot_TU,
269+ }
270+ return res
271+
272+ _columns = {
273+ 'company_id': fields.many2one('res.company', 'Azienda', required=True ),
274+ 'periodo': fields.selection((('anno','Annuale'), ('trimestre','Trimestrale'), ('mese','Mensile')),
275+ 'Periodo', required=True),
276+ 'anno' : fields.integer('Anno', size=4, required=True),
277+ 'trimestre' : fields.integer('Trimestre', size=1 ),
278+ 'mese' : fields.selection((('1','Gennaio'), ('2','Febbraio'), ('3','Marzo'), ('4','Aprile'),
279+ ('5','Maggio'), ('6','Giugno'), ('7','Luglio'), ('8','Agosto'),
280+ ('9','Settembre'), ('10','Ottobre'), ('11','Novembre'), ('12','Dicembre'),
281+ ),'Mese'),
282+ 'tipo': fields.selection((('ordinaria','Ordinaria'), ('sostitutiva','Sostitutiva'), ('annullamento','Annullamento')),
283+ 'Tipo comunicazione', required=True),
284+ 'comunicazione_da_sostituire_annullare': fields.integer('Protocollo comunicaz. da sostituire/annullare'),
285+ 'documento_da_sostituire_annullare': fields.integer('Protocollo documento da sostituire/annullare'),
286+
287+ 'formato_dati': fields.selection((('aggregati','Dati Aggregati'), ('analitici','Dati Analitici')),
288+ 'Formato dati', readonly=True ),
289+
290+ 'codice_fornitura': fields.char('Codice fornitura', readonly=True, size=5, help='Impostare a "NSP00" '),
291+ 'tipo_fornitore': fields.selection((('01','Invio propria comunicazione'), ('10','Intermediario')),
292+ 'Tipo fornitore' ),
293+ 'codice_fiscale_fornitore': fields.char('Codice fiscale Fornitore', size=16,
294+ 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)"),
295+ #
296+ # Valori per comunicazione su più invii (non gestito)
297+ 'progressivo_telematico': fields.integer('Progressivo telematico', readonly=True),
298+ 'numero_totale_invii': fields.integer('Numero totale invii telematici', readonly=True),
299+ #
300+ # Soggetto a cui si riferisce la comunicazione
301+ #
302+ 'soggetto_codice_fiscale': fields.char('Codice fiscale soggetto obbligato', size=16,
303+ help="Soggetto cui si riferisce la comunicazione"),
304+ 'soggetto_partitaIVA': fields.char('Partita IVA', size=11),
305+ 'soggetto_codice_attivita': fields.char('Codice attività', size=6, help="Codice ATECO 2007"),
306+ 'soggetto_telefono': fields.char('Telefono', size=12),
307+ 'soggetto_fax': fields.char('Fax', size=12),
308+ 'soggetto_email': fields.char('E-mail', size=50),
309+ 'soggetto_forma_giuridica': fields.selection((('persona_giuridica','Persona Giuridica'), ('persona_fisica','Persona Fisica')),
310+ 'Forma Giuridica'),
311+
312+ 'soggetto_pf_cognome': fields.char('Cognome', size=24, help=""),
313+ 'soggetto_pf_nome': fields.char('Nome', size=20, help=""),
314+ 'soggetto_pf_sesso': fields.selection((('M','M'), ('F','F')),'Sesso'),
315+ 'soggetto_pf_data_nascita': fields.date('Data di nascita'),
316+ 'soggetto_pf_comune_nascita': fields.char('Comune o stato estero di nascita', size=40),
317+ 'soggetto_pf_provincia_nascita': fields.char('Provincia', size=2),
318+ 'soggetto_pg_denominazione': fields.char('Denominazione', size=60),
319+
320+ # Soggetto tenuto alla comunicazione
321+ 'soggetto_cm_forma_giuridica': fields.selection((('persona_giuridica','Persona Giuridica'), ('persona_fisica','Persona Fisica')),
322+ 'Forma Giuridica'),
323+ 'soggetto_cm_codice_fiscale': fields.char('Codice Fiscale', size=16, help="Soggetto che effettua la comunicazione se diverso dal soggetto tenuto alla comunicazione"),
324+ 'soggetto_cm_pf_cognome': fields.char('Cognome', size=24, help=""),
325+ 'soggetto_cm_pf_nome': fields.char('Nome', size=20, help=""),
326+ 'soggetto_cm_pf_sesso': fields.selection((('M','M'), ('F','F')),'Sesso'),
327+ 'soggetto_cm_pf_data_nascita': fields.date('Data di nascita'),
328+ 'soggetto_cm_pf_comune_nascita': fields.char('Comune o stato estero di nascita', size=40),
329+ 'soggetto_cm_pf_provincia_nascita': fields.char('Provincia', size=2),
330+ 'soggetto_cm_pf_codice_carica': fields.integer('Codice Fiscale', size=2, help=""),
331+ 'soggetto_cm_pf_data_inizio_procedura': fields.date('Data inizio procedura'),
332+ 'soggetto_cm_pf_data_fine_procedura': fields.date('Data fine procedura'),
333+ 'soggetto_cm_pg_denominazione': fields.char('Denominazione', size=60),
334+
335+ # Soggetto incaricato alla trasmissione
336+ 'soggetto_trasmissione_codice_fiscale': fields.char('Codice Fiscale', size=16, help="Intermediario che effettua la trasmissione telematica"),
337+ 'soggetto_trasmissione_numero_CAF': fields.integer('Nr iscrizione albo del C.A.F.', size=5, help="Intermediario che effettua la trasmissione telematica"),
338+ 'soggetto_trasmissione_impegno': fields.selection((('1','Soggetto obbligato'), ('2','Intermediario')),'Impegno trasmissione'),
339+ 'soggetto_trasmissione_data_impegno': fields.date('Data data impegno'),
340+
341+ 'line_FA_ids': fields.one2many('spesometro.comunicazione.line.fa', 'comunicazione_id', 'Quadri FA' ),
342+ 'line_SA_ids': fields.one2many('spesometro.comunicazione.line.sa', 'comunicazione_id', 'Quadri SA' ),
343+ 'line_BL_ids': fields.one2many('spesometro.comunicazione.line.bl', 'comunicazione_id', 'Quadri BL' ),
344+
345+ 'line_FE_ids': fields.one2many('spesometro.comunicazione.line.fe', 'comunicazione_id', 'Quadri FE' ),
346+ 'line_FR_ids': fields.one2many('spesometro.comunicazione.line.fr', 'comunicazione_id', 'Quadri FR' ),
347+ 'line_NE_ids': fields.one2many('spesometro.comunicazione.line.ne', 'comunicazione_id', 'Quadri NE' ),
348+ 'line_NR_ids': fields.one2many('spesometro.comunicazione.line.nr', 'comunicazione_id', 'Quadri NR' ),
349+ 'line_DF_ids': fields.one2many('spesometro.comunicazione.line.df', 'comunicazione_id', 'Quadri DF' ),
350+ 'line_FN_ids': fields.one2many('spesometro.comunicazione.line.fn', 'comunicazione_id', 'Quadri FN' ),
351+ 'line_SE_ids': fields.one2many('spesometro.comunicazione.line.se', 'comunicazione_id', 'Quadri SE' ),
352+ 'line_TU_ids': fields.one2many('spesometro.comunicazione.line.tu', 'comunicazione_id', 'Quadri TU' ),
353+
354+ 'totale_FA': fields.function(_tot_operation_number, string='Tot operazioni FA', type='integer', multi='operation_number', store=True),
355+ 'totale_SA': fields.function(_tot_operation_number, string='Tot operazioni SA', type='integer', multi='operation_number', store=True),
356+ 'totale_BL1': fields.function(_tot_operation_number, string='Tot operazioni BL - Paesi con fiscalita privilegiata', type='integer', multi='operation_number', store=True),
357+ 'totale_BL2': fields.function(_tot_operation_number, string='Tot operazioni BL - Soggetti non residenti', type='integer', multi='operation_number', store=True),
358+ 'totale_BL3': fields.function(_tot_operation_number, string='Tot operazioni BL - Acquisti servizi non soggetti non residenti', type='integer', multi='operation_number', store=True),
359+
360+ 'totale_FE': fields.function(_tot_operation_number, string='Tot operazioni FE', type='integer', multi='operation_number', store=True),
361+ 'totale_FE_R': fields.function(_tot_operation_number, string='Tot operazioni FE doc riepil.', type='integer', multi='operation_number', store=True),
362+ 'totale_FR': fields.function(_tot_operation_number, string='Tot operazioni FR', type='integer', multi='operation_number', store=True),
363+ 'totale_FR_R': fields.function(_tot_operation_number, string='Tot operazioni FR doc riepil.', type='integer', multi='operation_number', store=True),
364+ 'totale_NE': fields.function(_tot_operation_number, string='Tot operazioni NE', type='integer', multi='operation_number', store=True),
365+ 'totale_NR': fields.function(_tot_operation_number, string='Tot operazioni NR', type='integer', multi='operation_number', store=True),
366+ 'totale_DF': fields.function(_tot_operation_number, string='Tot operazioni DF', type='integer', multi='operation_number', store=True),
367+ 'totale_FN': fields.function(_tot_operation_number, string='Tot operazioni FN', type='integer', multi='operation_number', store=True),
368+ 'totale_SE': fields.function(_tot_operation_number, string='Tot operazioni SE', type='integer', multi='operation_number', store=True),
369+ 'totale_TU': fields.function(_tot_operation_number, string='Tot operazioni TU', type='integer', multi='operation_number', store=True),
370+ }
371+
372+ _default ={
373+ 'codice_fornitura': 'NSP00',
374+ 'tipo_fornitore': '01',
375+ 'formato_dati': 'aggregati',
376+ }
377+
378+ def onchange_trasmissione_impegno(self, cr, uid, ids, type, context=None):
379+ res = {}
380+ fiscalcode = False
381+ if type == '1': # soggetto obbligato
382+ fiscalcode = context.get('soggetto_codice_fiscale', False)
383+ res = {
384+ 'value' : {'soggetto_trasmissione_codice_fiscale' : fiscalcode}
385+ }
386+ return res
387+
388+ def partner_is_from_san_marino(self, cr, uid, move, invoice, arg):
389+ # configurazione
390+ anno_competenza = datetime.datetime.strptime(move.period_id.date_start, "%Y-%m-%d").year
391+ configurazione_ids = self.pool.get('spesometro.configurazione').search(cr, uid, \
392+ [('anno', '=', anno_competenza)])
393+ if not configurazione_ids:
394+ raise orm.except_orm(_('Configurazione mancante!'),_("Configurare l'anno relativo alla comunicazione") )
395+ configurazione = self.pool.get('spesometro.configurazione').browse(cr, uid, configurazione_ids[0])
396+ stato_estero = False
397+ address = self._get_partner_address_obj(cr, uid, move, invoice, arg)
398+ if address and address.country_id and configurazione.stato_san_marino.id == address.country_id.id:
399+ return True
400+ else:
401+ return False
402+
403+ def _get_partner_address_obj(self, cr, uid, move, invoice, arg):
404+ address = False
405+ partner_address_obj = False
406+ if move.partner_id.parent_id:
407+ partner_address_obj = move.partner_id.parent_id
408+ else:
409+ partner_address_obj = move.partner_id
410+ return partner_address_obj
411+
412+ def compute_invoice_amounts(self, cr, uid, move, invoice, arg):
413+ '''
414+ Calcolo totali documento. Dall'imponibile vanno esclusi gli importi esclusi, fuori campo o esenti
415+ '''
416+ res ={
417+ 'amount_untaxed' : 0,
418+ 'amount_tax' : 0,
419+ 'amount_total' : 0,
420+ }
421+ for line in invoice.tax_line:
422+ if line.amount:
423+ res['amount_untaxed'] += line.base
424+ res['amount_tax'] += line.amount
425+ res['amount_total'] += round(line.base + line.amount, 2)
426+ return res
427+
428+ def truncate_values(self, cr, uid, ids, context=None):
429+ for com in self.browse(cr, uid, ids):
430+ for line in com.line_FA_ids:
431+ vals = {
432+ 'attive_imponibile_non_esente': int(line.attive_imponibile_non_esente),
433+ 'attive_imposta': int(line.attive_imposta),
434+ 'attive_operazioni_iva_non_esposta': int(line.attive_operazioni_iva_non_esposta),
435+ 'attive_note_variazione': int(line.attive_note_variazione),
436+ 'attive_note_variazione_imposta': int(line.attive_note_variazione_imposta),
437+
438+ 'passive_imponibile_non_esente': int(line.passive_imponibile_non_esente),
439+ 'passive_imposta': int(line.passive_imposta),
440+ 'passive_operazioni_iva_non_esposta': int(line.passive_operazioni_iva_non_esposta),
441+ 'passive_note_variazione': int(line.passive_note_variazione),
442+ 'passive_note_variazione_imposta': int(line.passive_note_variazione_imposta),
443+ }
444+ self.pool.get('spesometro.comunicazione.line.fa').write(cr, uid, [line.id], vals)
445+
446+ for line in com.line_SA_ids:
447+ vals = {
448+ 'importo_complessivo': int(line.importo_complessivo),
449+ }
450+ self.pool.get('spesometro.comunicazione.line.sa').write(cr, uid, [line.id], vals)
451+
452+ for line in com.line_BL_ids:
453+ vals = {
454+ 'attive_importo_complessivo': int(line.attive_importo_complessivo),
455+ 'attive_imposta': int(line.attive_imposta),
456+ 'attive_non_sogg_cessione_beni': int(line.attive_non_sogg_cessione_beni),
457+ 'attive_non_sogg_servizi': int(line.attive_non_sogg_servizi),
458+ 'attive_note_variazione': int(line.attive_note_variazione),
459+ 'attive_note_variazione_imposta': int(line.attive_note_variazione_imposta),
460+
461+ 'passive_importo_complessivo': int(line.passive_importo_complessivo),
462+ 'passive_imposta': int(line.passive_imposta),
463+ 'passive_non_sogg_importo_complessivo': int(line.passive_non_sogg_importo_complessivo),
464+ 'passive_note_variazione': int(line.passive_note_variazione),
465+ 'passive_note_variazione_imposta': int(line.passive_note_variazione_imposta),
466+ }
467+ self.pool.get('spesometro.comunicazione.line.bl').write(cr, uid, [line.id], vals)
468+
469+ return True
470+
471+ def validate_lines(self, cr, uid, ids, context=None):
472+ for com in self.browse(cr, uid, ids):
473+
474+ # configurazione
475+ configurazione_ids = self.pool.get('spesometro.configurazione').search(cr, uid, \
476+ [('anno', '=', com.anno)])
477+ if not configurazione_ids:
478+ raise orm.except_orm(_('Configurazione mancante!'),_("Configurare l'anno relativo alla comunicazione") )
479+ configurazione = self.pool.get('spesometro.configurazione').browse(cr, uid, configurazione_ids[0])
480+
481+ for line in com.line_FA_ids:
482+ if configurazione.quadro_fa_limite_importo :
483+ if line.attive_imponibile_non_esente and \
484+ line.attive_imponibile_non_esente < configurazione.quadro_fa_limite_importo:
485+ self.pool.get('spesometro.comunicazione.line.fa').unlink(cr, uid, [line.id])
486+
487+ for line in com.line_SA_ids:
488+ if configurazione.quadro_sa_limite_importo :
489+ if line.importo_complessivo and \
490+ line.importo_complessivo < configurazione.quadro_sa_limite_importo:
491+ self.pool.get('spesometro.comunicazione.line.sa').unlink(cr, uid, [line.id])
492+
493+ for line in com.line_BL_ids:
494+ if configurazione.quadro_bl_limite_importo :
495+ importo_test = 0
496+ if line.attive_importo_complessivo :
497+ importo_test = line.attive_importo_complessivo
498+ elif line.attive_non_sogg_cessione_beni :
499+ importo_test = line.attive_non_sogg_cessione_beni
500+ elif line.attive_non_sogg_servizi :
501+ importo_test = line.attive_non_sogg_servizi
502+
503+ if importo_test and \
504+ importo_test < configurazione.quadro_bl_limite_importo:
505+ self.pool.get('spesometro.comunicazione.line.bl').unlink(cr, uid, [line.id])
506+
507+ # Controllo formale comunicazione
508+ # ... periodo in presenza di linee nel quadro SE
509+ if com.line_SE_ids and not com.trimestre and not com.mese:
510+ raise orm.except_orm(_('Perido Errato!'),_("In presenza di operazione nel qudro SE (Acquisti da San Marino) \
511+ sono ammessi solo periodi mensili/trimestrali") )
512+
513+ return True
514+
515+ def validate_operation(self, cr, uid, move, invoice, arg):
516+ # configurazione
517+ anno_competenza = datetime.datetime.strptime(move.period_id.date_start, "%Y-%m-%d").year
518+ configurazione_ids = self.pool.get('spesometro.configurazione').search(cr, uid, \
519+ [('anno', '=', anno_competenza)])
520+ if not configurazione_ids:
521+ raise orm.except_orm(_('Configurazione mancante!'),_("Configurare l'anno relativo alla comunicazione") )
522+ configurazione = self.pool.get('spesometro.configurazione').browse(cr, uid, configurazione_ids[0])
523+
524+ doc_vals = self.pool.get('spesometro.comunicazione').compute_invoice_amounts(cr, uid, move, invoice, arg)
525+ # Nessu quadro definito
526+ if not arg['quadro']:
527+ return False
528+ # Quadro richiesto
529+ if arg['quadro'] not in arg['quadri_richiesti']:
530+ return False
531+ # Valori minimi
532+ if arg['quadro'] == 'FA':
533+ if configurazione.quadro_fa_limite_importo_line :
534+ if not doc_vals.get('amount_untaxed', 0) or doc_vals.get('amount_untaxed', 0) < configurazione.quadro_fa_limite_importo_line:
535+ return False
536+ if arg['quadro'] == 'SA':
537+ if configurazione.quadro_sa_limite_importo_line :
538+ if not doc_vals.get('amount_total', 0) or doc_vals.get('amount_total', 0) < configurazione.quadro_sa_limite_importo_line:
539+ return False
540+ if arg['quadro'] == 'BL':
541+ if configurazione.quadro_bl_limite_importo_line :
542+ if not doc_vals.get('amount_total', 0) or doc_vals.get('amount_total', 0) < configurazione.quadro_bl_limite_importo_line:
543+ return False
544+
545+ if arg['quadro'] == 'SE':
546+ if configurazione.quadro_se_limite_importo_line :
547+ if not doc_vals.get('amount_untaxed', 0) or doc_vals.get('amount_untaxed', 0) < configurazione.quadro_se_limite_importo_line:
548+ return False
549+
550+ # Operazioni con San Marino Escluse se richiesta forma aggregata
551+ if arg['formato_dati'] == 'aggregati' and self.partner_is_from_san_marino(cr, uid, move, invoice, arg):
552+ return False
553+
554+ return True
555+
556+ def get_define_quadro(self, cr, uid, move, invoice, arg):
557+
558+ quadro = False
559+ operazione = arg.get('operazione')
560+ # Forma aggregata
561+ if arg['formato_dati'] == 'aggregati':
562+ if operazione == 'FA' or operazione == 'DR':
563+ quadro = 'FA'
564+ elif operazione == 'SA': # Operazioni senza fattura
565+ quadro = 'SA'
566+ elif (operazione == 'BL1') or (operazione == 'BL2') or (operazione == 'BL2'):
567+ quadro = 'BL'
568+
569+ # Forma analitica
570+ if arg['formato_dati'] == 'analitici':
571+
572+ # Priorità x San Marino -> quadro SE
573+ if self.partner_is_from_san_marino(cr, uid, move, invoice, arg):
574+ operazione = 'BL3'
575+
576+ # Impostazioni anagrafiche partner
577+ if operazione == 'FA' or operazione == 'DR':
578+ if arg.get('segno') == 'attiva':
579+ quadro = 'FE'
580+ elif arg.get('segno') == 'passiva':
581+ quadro = 'FR'
582+ elif operazione == 'SA': # Operazioni senza fattura
583+ quadro = 'DF'
584+ elif operazione == 'BL2': #Operazioni con soggetti non residenti
585+ quadro = 'FN'
586+ elif operazione == 'BL1' or operazione == 'BL3': #Operazioni con paesi con fiscalità privilegiata - Acquisti di servizi da soggetti non residenti
587+ quadro = 'SE'
588+ # Note di variazione
589+ if operazione == 'FE' and 'refund' in move.journal_id.type:
590+ operazione = 'NE'
591+ elif operazione == 'FR' and 'refund' in move.journal_id.type:
592+ operazione = 'NR'
593+
594+ return quadro
595+
596+
597+ def genera_comunicazione(self, cr, uid, params, context=None):
598+
599+ def _get_periods(cr, uid, params, context=None):
600+ '''
601+ Definizione periodi di competenza
602+ '''
603+ sql_select = "SELECT p.id FROM account_period p "
604+ sql_where = " WHERE p.special = False "
605+ search_params = {}
606+ # Periodo annuale
607+ if params.get('periodo') == 'anno':
608+ period_date_start = datetime.date(params.get('anno') , 1, 1)
609+ period_date_stop = datetime.date(params.get('anno') , 12, 31)
610+ sql_where += " AND p.date_start >= date(%(period_date_start)s) AND p.date_stop <=date(%(period_date_stop)s) "
611+ search_params.update({
612+ 'period_date_start' : period_date_start,
613+ 'period_date_stop' : period_date_stop
614+ })
615+ # Periodo mensile
616+ if params.get('periodo') == 'mese':
617+ period_date_start = datetime.date(params.get('anno') , int(params.get('mese')), 1)
618+ sql_where += " AND p.date_start = date(%(period_date_start)s) "
619+ search_params.update({
620+ 'period_date_start' : period_date_start,
621+ })
622+ # Periodo trimestrale
623+ if params.get('periodo') == 'trimestre':
624+ if params.get('trimestre') == 1:
625+ period_date_start = datetime.date(params.get('anno') , 1, 1)
626+ period_date_start = datetime.date(params.get('anno') , 3, 31)
627+ elif params.get('trimestre') == 2:
628+ period_date_start = datetime.date(params.get('anno') , 3, 1)
629+ period_date_start = datetime.date(params.get('anno') , 6, 30)
630+ elif params.get('trimestre') == 2:
631+ period_date_start = datetime.date(params.get('anno') , 7, 1)
632+ period_date_start = datetime.date(params.get('anno') , 9, 30)
633+ elif params.get('trimestre') == 2:
634+ period_date_start = datetime.date(params.get('anno') , 10, 1)
635+ period_date_start = datetime.date(params.get('anno') , 12, 31)
636+ else:
637+ raise orm.except_orm(_('Dato errato!'),_("Errore nel valore del trimestre") )
638+ sql_where += " AND p.date_start >= date(%(period_date_start)s) AND p.date_stop <=date(%(period_date_stop)s) "
639+ search_params.update({
640+ 'period_date_start' : period_date_start,
641+ 'period_date_stop' : period_date_stop
642+ })
643+
644+ sql = sql_select + sql_where
645+ cr.execute(sql, search_params)
646+ periods = [i[0] for i in cr.fetchall()]
647+ return periods
648+
649+ def _genera_testata(cr, uid, params, context=None):
650+ '''
651+ Generazione testata dichiarazione
652+ '''
653+ company = self.pool.get('res.company').browse(cr, uid, params['company_id'])
654+ # progressivo telematico :" il progressivo deve essere univoco e crescente (con incrementi di una unità per ogni file prodotto)"
655+ if params['tipo'] == 'ordinaria':
656+ com_search = [('tipo', '=', 'ordinaria')]
657+ com_last_ids = self.search(cr, uid, com_search, order='progressivo_telematico desc', limit=1)
658+ com_next_prg = 1
659+ if com_last_ids:
660+ com_next_prg = self.browse(cr, uid, com_last_ids[0]).progressivo_telematico + 1
661+ progressivo_telematico = com_next_prg
662+ # vat
663+ if company.partner_id.vat:
664+ partita_iva = company.partner_id.vat[2:]
665+ else:
666+ partita_iva = '{:11s}'.format("".zfill(11))
667+ # codice fiscale soggetto incaricato alla trasmissione
668+ codice_fiscale_incaricato_trasmissione=''
669+ if params.get('tipo_fornitore') == '10' and params.get('partner_intermediario', False):
670+ partner_intermediario = self.pool.get('res.partner').browse(cr, uid, params.get('partner_intermediario'))
671+ codice_fiscale_incaricato_trasmissione = partner_intermediario.fiscalcode or False
672+ # Soggetto con impegno alla trasmissione
673+ if params.get('tipo_fornitore') == '10':
674+ soggetto_trasmissione_impegno = '2'
675+ else:
676+ soggetto_trasmissione_impegno = '1'
677+ # Persona fisica o giuridica
678+ # Considerazione: se se lunghezza codice fiscale < 16 allora c'è la P.Iva e quindi trattasi di soggetto giuridico
679+ tipo_persona = 'persona_fisica'
680+ if company.partner_id.fiscalcode and len(company.partner_id.fiscalcode) < 16:
681+ tipo_persona = 'persona_giuridica'
682+
683+ values = {
684+ 'company_id' : company.id,
685+ 'codice_fiscale_fornitore' : company.partner_id.fiscalcode,
686+ 'tipo' : params.get('tipo', False),
687+ 'periodo' : params.get('periodo', False),
688+ 'anno' : params.get('anno', False),
689+ 'mese' : params.get('mese', False),
690+ 'trimestre' : params.get('trimestre', False),
691+ 'progressivo_telematico' : progressivo_telematico or False,
692+ 'tipo_fornitore' : params.get('tipo_fornitore', False),
693+ 'formato_dati' : params.get('formato_dati', False),
694+ 'soggetto_codice_fiscale' : company.partner_id and company.partner_id.fiscalcode or '',
695+ 'soggetto_partitaIVA' : partita_iva,
696+ 'soggetto_telefono' : company.partner_id and company.partner_id.phone or '',
697+ 'soggetto_fax' : company.partner_id and company.partner_id.fax or '',
698+ 'soggetto_email' : company.partner_id and company.partner_id.email or '',
699+ 'soggetto_forma_giuridica' : tipo_persona,
700+ 'soggetto_pg_denominazione' : company.partner_id and company.partner_id.name or company.name or '',
701+ 'soggetto_cm_forma_giuridica' : tipo_persona,
702+ 'soggetto_cm_pg_denominazione' : company.partner_id and company.partner_id.name or company.name or '',
703+ 'soggetto_trasmissione_codice_fiscale' : codice_fiscale_incaricato_trasmissione,
704+ 'soggetto_trasmissione_impegno' : soggetto_trasmissione_impegno,
705+ }
706+ comunicazione_id = self.create(cr, uid, values)
707+
708+ return comunicazione_id
709+
710+
711+ # Esistenza record di configurazione per l'anno della comunicazione
712+ configurazione_ids = self.pool.get('spesometro.configurazione').search(cr, uid, [('anno', '=', params.get('anno'))])
713+ if not configurazione_ids:
714+ raise orm.except_orm(_('Configurazione mancante!'),_("Configurare l'anno relativo alla comunicazione") )
715+ configurazione = self.pool.get('spesometro.configurazione').browse(cr, uid, configurazione_ids[0])
716+
717+ # Testata comunicazione
718+ comunicazione_id = _genera_testata(cr, uid, params, context=None)
719+
720+ period_obj = self.pool.get('account.period')
721+ journal_obj = self.pool.get('account.journal')
722+ partner_obj = self.pool.get('res.partner')
723+ account_move_obj = self.pool.get('account.move')
724+ invoice_obj = self.pool.get('account.invoice')
725+ # periods
726+ period_ids = _get_periods(cr, uid, params, context=None)
727+ # journal
728+ journal_search = [('spesometro','=', True)]
729+ journal_ids = journal_obj.search(cr, uid, journal_search, context=context)
730+ # Partners to exclude
731+ partner_search = [('spesometro_escludi','=', True)]
732+ partner_to_exclude_ids = partner_obj.search(cr, uid, partner_search, context=context)
733+
734+ 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)]
735+ move_ids = account_move_obj.search(cr, uid, move_search, context=context)
736+
737+ for move in self.pool.get('account.move').browse(cr, uid, move_ids):
738+ # Test move validate
739+ if not move.partner_id:
740+ continue
741+
742+ # Invoice
743+ invoice_search = [('move_id','=', move.id)]
744+ invoice_ids = invoice_obj.search(cr, uid, invoice_search, context=context)
745+ if not invoice_ids:
746+ continue
747+ invoice = invoice_obj.browse(cr,uid, invoice_ids[0])
748+
749+ # Config spesometro
750+ operazione = False
751+ operazione_iva_non_esposta = False
752+ operazione = move.journal_id.spesometro_operazione
753+ operazione_iva_non_esposta = move.journal_id.spesometro_IVA_non_esposta
754+ segno = move.journal_id.spesometro_segno
755+ if move.partner_id.spesometro_operazione:
756+ operazione = move.partner_id.spesometro_operazione
757+ operazione_iva_non_esposta = move.partner_id.spesometro_IVA_non_esposta
758+
759+ arg = {
760+ 'comunicazione_id' : comunicazione_id,
761+ 'segno' : segno,
762+ 'operazione_iva_non_esposta' : operazione_iva_non_esposta,
763+ 'operazione' : operazione,
764+ 'formato_dati' : params['formato_dati'],
765+ 'quadri_richiesti' : params['quadri_richiesti'],
766+ }
767+
768+ # Quadro di competenza
769+ quadro = self.get_define_quadro(cr, uid, move, invoice, arg)
770+
771+ arg.update({'quadro': quadro})
772+
773+ # Test operazione da includere nella comunicazione
774+ if not self.validate_operation(cr, uid, move, invoice, arg):
775+ continue
776+
777+ if quadro == 'FA':
778+ line_id = self.pool.get('spesometro.comunicazione.line.fa').add_line(cr, uid, move, invoice, arg)
779+ if quadro == 'SA':
780+ line_id = self.pool.get('spesometro.comunicazione.line.sa').add_line(cr, uid, move, invoice, arg)
781+ if quadro == 'BL':
782+ line_id = self.pool.get('spesometro.comunicazione.line.bl').add_line(cr, uid, move, invoice, arg)
783+ if quadro == 'SE':
784+ line_id = self.pool.get('spesometro.comunicazione.line.se').add_line(cr, uid, move, invoice, arg)
785+
786+ # Arrotonda importi su valori raggruppati -> troncare i decimali
787+ if params['formato_dati'] == 'aggregati':
788+ self.truncate_values(cr, uid, [comunicazione_id])
789+
790+ # Rimuove le linee che non rientrano nei limiti ed effettua un controllo formale sull'intera comunicazione
791+ self.validate_lines(cr, uid, [comunicazione_id])
792+
793+ # Update for compute totals
794+ self.write(cr, uid, [comunicazione_id],{})
795+
796+ return True
797+
798+
799+class spesometro_comunicazione_line_FA(orm.Model):
800+ '''
801+ QUADRO FA - Operazioni documentate da fattura esposte in forma aggregata
802+ '''
803+
804+ _name = "spesometro.comunicazione.line.fa"
805+ _description = "Spesometro - Comunicazione linee quadro FA"
806+ _columns = {
807+ 'comunicazione_id': fields.many2one('spesometro.comunicazione', 'Comunicazione', ondelete='cascade'),
808+
809+ 'partner_id': fields.many2one('res.partner', 'Partner'),
810+ 'partita_iva': fields.char('Partita IVA', size=11),
811+ 'codice_fiscale': fields.char('Codice Fiscale', size=16),
812+ 'documento_riepilogativo': fields.boolean('Documento Riepilogativo'),
813+ 'noleggio': fields.selection((('A','Autovettura'), ('B','Caravan'), ('C','Altri Veicoli'), ('D','Unità da diporto'), ('E','Aeromobii')),'Leasing'),
814+
815+ 'numero_operazioni_attive_aggregate': fields.integer('Nr op. attive', size=16),
816+ 'numero_operazioni_passive_aggregate': fields.integer('Nr op. passive', size=16),
817+
818+ '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"),
819+ 'attive_imposta': fields.float(' Tot imposta', digits_compute=dp.get_precision('Account'), help="Totale imposta"),
820+ '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"),
821+ 'attive_note_variazione': fields.float('Totale note variazione', digits_compute=dp.get_precision('Account'), help="Totale note di variazione a debito per la controparte"),
822+ '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"),
823+
824+ '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"),
825+ 'passive_imposta': fields.float('Totale imposta', digits_compute=dp.get_precision('Account'), help="Totale imposta"),
826+ '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"),
827+ 'passive_note_variazione': fields.float('Totale note variazione', digits_compute=dp.get_precision('Account'), help="Totale note di variazione a credito per la controparte"),
828+ '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"),
829+ }
830+
831+
832+ def add_line(self, cr, uid, move, invoice, arg):
833+ comunicazione_lines_obj = self.pool.get('spesometro.comunicazione.line.fa')
834+ comunicazione_id = arg.get('comunicazione_id', False)
835+ com_line_search = [('comunicazione_id','=',comunicazione_id), ('partner_id', '=', move.partner_id.id)]
836+ com_line_ids = self.search(cr, uid, com_line_search)
837+ val = {}
838+ # Valori documento
839+ doc_vals = self.pool.get('spesometro.comunicazione').compute_invoice_amounts(cr, uid, move, invoice, arg)
840+ # New partner
841+ if not com_line_ids:
842+ partita_iva =''
843+ if move.partner_id.vat:
844+ partita_iva = move.partner_id.vat[2:]
845+ documento_riepilogativo = False
846+ if arg['operazione'] == 'DR':
847+ documento_riepilogativo = True
848+ val = {
849+ 'comunicazione_id' : comunicazione_id,
850+ 'partner_id' : move.partner_id.id,
851+ 'partita_iva' : partita_iva,
852+ 'codice_fiscale' : move.partner_id.fiscalcode or '',
853+ 'noleggio' : move.partner_id.spesometro_leasing or '',
854+ 'documento_riepilogativo' : documento_riepilogativo,
855+ }
856+ # attive
857+ if arg.get('segno', False) == 'attiva':
858+ val['numero_operazioni_attive_aggregate'] = 1
859+ if 'refund' in move.journal_id.type:
860+ val['attive_note_variazione'] = doc_vals.get('amount_untaxed', 0)
861+ val['attive_note_variazione_imposta'] = doc_vals.get('amount_tax', 0)
862+ else:
863+ if arg.get('operazione_iva_non_esposta', False):
864+ val['attive_operazioni_iva_non_esposta' ] = doc_vals.get('amount_total', 0)
865+ else:
866+ val['attive_imponibile_non_esente' ] = doc_vals.get('amount_untaxed', 0)
867+ val['attive_imposta'] =doc_vals.get('amount_tax', 0)
868+ # passive
869+ else:
870+ val['numero_operazioni_passive_aggregate'] = 1
871+ if 'refund' in move.journal_id.type:
872+ val['passive_note_variazione'] = doc_vals.get('amount_untaxed', 0)
873+ val['passive_note_variazione_imposta'] = doc_vals.get('amount_tax', 0)
874+ else:
875+ if arg.get('operazione_iva_non_esposta', False):
876+ val['passive_operazioni_iva_non_esposta' ] = doc_vals.get('amount_total', 0)
877+ else:
878+ val['passive_imponibile_non_esente' ] = doc_vals.get('amount_untaxed', 0)
879+ val['passive_imposta' ] = doc_vals.get('amount_tax', 0)
880+
881+ # Partner already exists
882+ if com_line_ids:
883+ for com_line in self.browse(cr, uid, com_line_ids):
884+ # attive
885+ if arg.get('segno', False) == 'attiva':
886+ val['numero_operazioni_attive_aggregate'] = com_line.numero_operazioni_attive_aggregate + 1
887+ if 'refund' in move.journal_id.type:
888+ val['attive_note_variazione'] = com_line.attive_note_variazione + doc_vals.get('amount_untaxed', 0)
889+ val['attive_note_variazione_imposta'] = com_line.attive_note_variazione_imposta + doc_vals.get('amount_tax', 0)
890+ else:
891+ if arg.get('operazione_iva_non_esposta', False):
892+ val['attive_operazioni_iva_non_esposta' ] = com_line.attive_operazioni_iva_non_esposta + doc_vals.get('amount_total', 0)
893+ else:
894+ val['attive_imponibile_non_esente' ] = com_line.attive_imponibile_non_esente + doc_vals.get('amount_untaxed', 0)
895+ val['attive_imposta' ] = com_line.attive_imposta + doc_vals.get('amount_tax', 0)
896+ # passive
897+ else:
898+ val['numero_operazioni_passive_aggregate'] = com_line.numero_operazioni_passive_aggregate + 1
899+ if 'refund' in move.journal_id.type:
900+ val['passive_note_variazione'] = com_line.passive_note_variazione + doc_vals.get('amount_untaxed', 0)
901+ val['passive_note_variazione_imposta'] = com_line.passive_note_variazione_imposta + doc_vals.get('amount_tax', 0)
902+ else:
903+ if arg.get('operazione_iva_non_esposta', False):
904+ val['passive_operazioni_iva_non_esposta' ] = com_line.passive_operazioni_iva_non_esposta + doc_vals.get('amount_total', 0)
905+ else:
906+ val['passive_imponibile_non_esente' ] = com_line.passive_imponibile_non_esente + doc_vals.get('amount_untaxed', 0)
907+ val['passive_imposta' ] = com_line.passive_imposta + doc_vals.get('amount_tax', 0)
908+
909+ if com_line_ids:
910+ line_id = com_line.id
911+ self.write(cr, uid, [com_line.id], val)
912+ else:
913+ line_id = self.create(cr, uid, val)
914+
915+ return line_id
916+
917+class spesometro_comunicazione_line_SA(orm.Model):
918+ '''
919+ QUADRO SA - Operazioni senza fattura esposte in forma aggregata
920+ '''
921+ _name = "spesometro.comunicazione.line.sa"
922+ _description = "Spesometro - Comunicazione linee quadro SA"
923+ _columns = {
924+ 'comunicazione_id': fields.many2one('spesometro.comunicazione', 'Comunicazione' , ondelete='cascade'),
925+ 'partner_id': fields.many2one('res.partner', 'Partner'),
926+ 'codice_fiscale': fields.char('Codice Fiscale', size=16),
927+
928+ 'numero_operazioni': fields.integer('Numero operazioni'),
929+ 'importo_complessivo': fields.float('Importo complessivo', digits_compute=dp.get_precision('Account')),
930+ 'noleggio': fields.selection((('A','Autovettura'), ('B','Caravan'), ('C','Altri Veicoli'), ('D','Unità da diporto'), ('E','Aeromobii')),'Leasing'),
931+ }
932+
933+ def add_line(self, cr, uid, move, invoice, arg):
934+ comunicazione_lines_obj = self.pool.get('spesometro.comunicazione.line.fa')
935+ comunicazione_id = arg.get('comunicazione_id', False)
936+ com_line_search = [('comunicazione_id','=',comunicazione_id), ('partner_id', '=', move.partner_id.id)]
937+ com_line_ids = self.search(cr, uid, com_line_search)
938+ val = {}
939+ # Valori documento
940+ doc_vals = self.pool.get('spesometro.comunicazione').compute_invoice_amounts(cr, uid, move, invoice, arg)
941+ # New partner
942+ if not com_line_ids:
943+ val = {
944+ 'comunicazione_id' : comunicazione_id,
945+ 'partner_id' : move.partner_id.id,
946+ 'codice_fiscale' : move.partner_id.fiscalcode or False,
947+ 'noleggio' : move.partner_id.spesometro_leasing or False,
948+ 'numero_operazioni' : 1,
949+ 'importo_complessivo' : doc_vals.get('amount_total', 0),
950+ }
951+ # Partner already exists
952+ if com_line_ids:
953+ for com_line in self.browse(cr, uid, com_line_ids):
954+ val['numero_operazioni'] = com_line.numero_operazioni + 1
955+ val['importo_complessivo'] = com_line.importo_complessivo + doc_vals.get('amount_total', 0)
956+
957+ if com_line_ids:
958+ line_id = com_line.id
959+ self.write(cr, uid, [com_line.id], val)
960+ else:
961+ line_id = self.create(cr, uid, val)
962+
963+ return line_id
964+
965+class spesometro_comunicazione_line_BL(orm.Model):
966+ '''
967+ QUADRO BL
968+ - Operazioni con paesi con fiscalità privilegiata (è obbligatorio compilare le sezioni BL001, BL002
969+ e almeno un campo delle sezioni BL003, BL004, BL005, BL006, BL007, BL008)
970+ - Operazioni con soggetti non residenti (è obbligatorio compilare le sezioni BL001, BL002 e almeno
971+ un campo delle sezioni BL003 e BL006)
972+ - Acquisti di servizi da soggetti non residenti (è obbligatorio compilare le sezioni BL001, BL002 e
973+ almeno un campo della sezione BL006)
974+ '''
975+ _name = "spesometro.comunicazione.line.bl"
976+ _description = "Spesometro - Comunicazione linee quadro BL"
977+ _columns = {
978+ 'comunicazione_id': fields.many2one('spesometro.comunicazione', 'Comunicazione', ondelete='cascade'),
979+ 'partner_id': fields.many2one('res.partner', 'Partner'),
980+ 'codice_fiscale': fields.char('Codice Fiscale', size=16),
981+
982+ 'numero_operazioni': fields.integer('Numero operazioni'),
983+ 'importo_complessivo': fields.integer('Importo complessivo', digits_compute=dp.get_precision('Account')),
984+ 'noleggio': fields.selection((('A','Autovettura'), ('B','Caravan'), ('C','Altri Veicoli'), ('D','Unità da diporto'), ('E','Aeromobii')),'Leasing'),
985+
986+ 'pf_cognome': fields.char('Cognome', size=24, help=""),
987+ 'pf_nome': fields.char('Nome', size=20, help=""),
988+ 'pf_data_nascita': fields.date('Data di nascita'),
989+ 'pf_comune_stato_nascita': fields.char('Comune o stato estero di nascita', size=40),
990+ 'pf_provincia_nascita': fields.char('Provincia', size=2),
991+ 'pf_codice_stato_estero': fields.char('Codice Stato Estero', size=3, help="Deve essere uno di quelli presenti nella tabella 'elenco dei paesi e\
992+ territori esteri' pubblicata nelle istruzioni del modello Unico"),
993+ 'pg_denominazione': fields.char('Denominazione/Ragione sociale', size=60),
994+ 'pg_citta_estera_sede_legale': fields.char('Città estera delle Sede legale', size=40),
995+ 'pg_codice_stato_estero': fields.char('Codice Stato Estero', size=3, help="Deve essere uno di quelli presenti nella tabella 'elenco dei paesi e\
996+ territori esteri' pubblicata nelle istruzioni del modello Unico"),
997+ 'pg_indirizzo_sede_legale': fields.char('Indirizzo sede legale', size=60),
998+
999+ 'codice_identificativo_IVA': fields.char('Codice identificativo IVA', size=16),
1000+ 'operazione_fiscalita_privilegiata': fields.boolean('Operazione con pesei con fiscalità privilegiata'),
1001+ 'operazione_con_soggetti_non_residenti': fields.boolean('Operazione con soggetto non residente'),
1002+ 'Acquisto_servizi_da_soggetti_non_residenti': fields.boolean('Acquisto di servizi da soggetti non residenti'),
1003+
1004+ '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"),
1005+ 'attive_imposta': fields.float('Tot operaz. attive imposta', digits_compute=dp.get_precision('Account'), help="Totale imposta"),
1006+ '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"),
1007+ '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"),
1008+ 'attive_note_variazione': fields.float('Totale note variazione', digits_compute=dp.get_precision('Account'), help="Totale note di variazione a debito per la controparte"),
1009+ '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"),
1010+
1011+ '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"),
1012+ 'passive_imposta': fields.float('Tot operaz. passive imposta', digits_compute=dp.get_precision('Account'), help="Totale imposta"),
1013+ '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"),
1014+ 'passive_note_variazione': fields.float('Totale note variazione', digits_compute=dp.get_precision('Account'), help="Totale note di variazione a debito per la controparte"),
1015+ '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"),
1016+
1017+ }
1018+
1019+ def add_line(self, cr, uid, move, invoice, arg):
1020+ comunicazione_lines_obj = self.pool.get('spesometro.comunicazione.line.bl')
1021+ comunicazione_id = arg.get('comunicazione_id', False)
1022+ com_line_search = [('comunicazione_id','=',comunicazione_id), ('partner_id', '=', move.partner_id.id)]
1023+ com_line_ids = self.search(cr, uid, com_line_search)
1024+ val = {}
1025+ # Valori documento
1026+ doc_vals = self.pool.get('spesometro.comunicazione').compute_invoice_amounts(cr, uid, move, invoice, arg)
1027+ # New partner
1028+ if not com_line_ids:
1029+ # p.iva
1030+ if move.partner_id.vat:
1031+ partita_iva = move.partner_id.vat[2:]
1032+ else:
1033+ partita_iva = '{:11s}'.format("".zfill(11))
1034+ # prov. nascita
1035+ prov_code = False
1036+ '''
1037+ >>>> mancano dati persona fisica
1038+ if move.partner_id.birth_city.name:
1039+ city_data = move.partner_id.address[0]._set_vals_city_data(cr, uid, {'city' : move.partner_id.birth_city.name})
1040+ prov_id = city_data.get('province_id', False)
1041+ if prov_id:
1042+ prov = self.pool.get('res.province').borwse(cr, uid, prov_id)
1043+ prov_nascita_code = prov.code
1044+ '''
1045+
1046+ val = {
1047+ 'comunicazione_id' : comunicazione_id,
1048+ 'partner_id' : move.partner_id.id,
1049+ 'codice_fiscale' : move.partner_id.fiscalcode or False,
1050+ 'noleggio' : move.partner_id.spesometro_leasing or False,
1051+
1052+ ##'pf_cognome' : move.partner_id.fiscalcode_surname or False,
1053+ ##'pf_nome' : move.partner_id.fiscalcode_firstname or False,
1054+ ##'pf_data_nascita' : move.partner_id.birth_date or False,
1055+ ##'pf_comune_stato_nascita' : move.partner_id.birth_city.name or False,
1056+ ##'pf_provincia_nascita' : prov_code or False,
1057+ ##'pf_codice_stato_estero' : move.partner_id.address[0].country_id.codice_stato_agenzia_entrate or '',
1058+
1059+ 'pg_denominazione' : move.partner_id.name or False,
1060+ 'pg_citta_estera_sede_legale' : move.partner_id.address[0].city or False,
1061+ 'pg_codice_stato_estero' : move.partner_id.address[0].country_id.codice_stato_agenzia_entrate or '',
1062+ 'pg_indirizzo_sede_legale' : move.partner_id.address[0].street or False,
1063+
1064+ 'operazione_fiscalita_privilegiata' : False,
1065+ 'operazione_con_soggetti_non_residenti' : False,
1066+ 'Acquisto_servizi_da_soggetti_non_residenti' : False,
1067+ }
1068+
1069+ if move.partner_id.spesometro_operazione == 'BL1':
1070+ val['operazione_fiscalita_privilegiata'] = True
1071+ elif move.partner_id.spesometro_operazione == 'BL2':
1072+ val['operazione_con_soggetti_non_residenti'] = True
1073+ elif move.partner_id.spesometro_operazione == 'BL3':
1074+ val['Acquisto_servizi_da_soggetti_non_residenti'] = True
1075+
1076+ # attive
1077+ if arg.get('segno', False) == 'attiva':
1078+
1079+ if val['operazione_fiscalita_privilegiata'] or val['operazione_con_soggetti_non_residenti']:
1080+ val['attive_importo_complessivo'] = doc_vals.get('amount_total', 0)
1081+ val['attive_imposta'] = doc_vals.get('amount_tax', 0)
1082+ if val['operazione_fiscalita_privilegiata'] == True:
1083+ if move.partner_id.spesometro_operazione == 'cessioni':
1084+ val['attive_non_sogg_cessione_beni'] = doc_vals.get('amount_total', 0)
1085+ else:
1086+ val['attive_non_sogg_servizi'] = doc_vals.get('amount_total', 0)
1087+ if 'refund' in move.journal_id.type:
1088+ val['attive_note_variazione'] = doc_vals.get('amount_untaxed', 0)
1089+ val['attive_note_variazione_imposta'] = doc_vals.get('amount_tax', 0)
1090+ # passive
1091+ else:
1092+
1093+ if val['operazione_fiscalita_privilegiata'] or val['operazione_con_soggetti_non_residenti'] or val['Acquisto_servizi_da_soggetti_non_residenti']:
1094+ val['passive_importo_complessivo'] = doc_vals.get('amount_total', 0)
1095+ val['passive_imposta'] = doc_vals.get('amount_tax', 0)
1096+ if val['operazione_fiscalita_privilegiata'] == True:
1097+ val['passive_non_sogg_importo_complessivo'] = doc_vals.get('amount_total', 0)
1098+ if 'refund' in move.journal_id.type:
1099+ val['passive_note_variazione'] = doc_vals.get('amount_untaxed', 0)
1100+ val['passive_note_variazione_imposta'] = doc_vals.get('amount_tax', 0)
1101+
1102+ # Partner already exists
1103+ if com_line_ids:
1104+ for com_line in self.browse(cr, uid, com_line_ids):
1105+ # attive
1106+ if arg.get('segno', False) == 'attiva':
1107+
1108+ if val['operazione_fiscalita_privilegiata'] or val['operazione_con_soggetti_non_residenti']:
1109+ val['attive_importo_complessivo'] = com_line.attive_importo_complessivo + doc_vals.get('amount_total', 0)
1110+ val['attive_imposta'] = com_line.attive_imposta + doc_vals.get('amount_tax', 0)
1111+ if val['operazione_fiscalita_privilegiata'] == True:
1112+ if move.partner_id.spesometro_operazione == 'cessioni':
1113+ val['attive_non_sogg_cessione_beni'] = com_line.attive_non_sogg_cessione_beni + doc_vals.get('amount_total', 0)
1114+ else:
1115+ val['attive_non_sogg_servizi'] = com_line.attive_non_sogg_servizi + doc_vals.get('amount_total', 0)
1116+ if 'refund' in move.journal_id.type:
1117+ val['attive_note_variazione'] = com_line.attive_note_variazione + doc_vals.get('amount_untaxed', 0)
1118+ val['attive_note_variazione_imposta'] = com_line.attive_note_variazione_imposta + doc_vals.get('amount_tax', 0)
1119+
1120+ # passive
1121+ else:
1122+
1123+ if val['operazione_fiscalita_privilegiata'] or val['operazione_con_soggetti_non_residenti'] or val['Acquisto_servizi_da_soggetti_non_residenti']:
1124+ val['passive_importo_complessivo'] = com_line.passive_importo_complessivo + doc_vals.get('amount_total', 0)
1125+ val['passive_imposta'] = com_line.passive_imposta + doc_vals.get('amount_tax', 0)
1126+ if val['operazione_fiscalita_privilegiata'] == True:
1127+ val['passive_non_sogg_importo_complessivo'] = com_line.passive_non_sogg_importo_complessivo + doc_vals.get('amount_total', 0)
1128+ if 'refund' in move.journal_id.type:
1129+ val['passive_note_variazione'] = com_line.passive_note_variazione + doc_vals.get('amount_untaxed', 0)
1130+ val['passive_note_variazione_imposta'] = com_line.passive_note_variazione_imposta + doc_vals.get('amount_tax', 0)
1131+
1132+ if com_line_ids:
1133+ line_id = com_line.id
1134+ self.write(cr, uid, [com_line.id], val)
1135+ else:
1136+ line_id = self.create(cr, uid, val)
1137+
1138+ return line_id
1139+
1140+class spesometro_comunicazione_line_FE(orm.Model):
1141+
1142+ _name = "spesometro.comunicazione.line.fe"
1143+ _description = "Spesometro - Comunicazione linee quadro FE"
1144+ _columns = {
1145+ 'comunicazione_id': fields.many2one('spesometro.comunicazione', 'Comunicazione', ondelete='cascade'),
1146+
1147+ 'partner_id': fields.many2one('res.partner', 'Partner'),
1148+ 'partita_iva': fields.char('Partita IVA', size=11),
1149+ 'codice_fiscale': fields.char('Codice Fiscale', size=16),
1150+ 'documento_riepilogativo': fields.boolean('Documento Riepilogativo'),
1151+ 'noleggio': fields.selection((('A','Autovettura'), ('B','Caravan'), ('C','Altri Veicoli'), ('D','Unità da diporto'), ('E','Aeromobii')),'Leasing'),
1152+
1153+ 'autofattura': fields.boolean('Autofattura'),
1154+ 'data_documento': fields.date('Data documento'),
1155+ 'data_registrazione': fields.date('Data registrazione'),
1156+ 'numero_fattura': fields.char('Numero Fattura - Doc riepilog.', size=16),
1157+
1158+ 'importo': fields.float('Importo', digits_compute=dp.get_precision('Account')),
1159+ 'imposta': fields.float('Imposta', digits_compute=dp.get_precision('Account')),
1160+ }
1161+
1162+class spesometro_comunicazione_line_FR(orm.Model):
1163+
1164+ _name = "spesometro.comunicazione.line.fr"
1165+ _description = "Spesometro - Comunicazione linee quadro FR"
1166+ _columns = {
1167+ 'comunicazione_id': fields.many2one('spesometro.comunicazione', 'Comunicazione', ondelete='cascade'),
1168+
1169+ 'partner_id': fields.many2one('res.partner', 'Partner'),
1170+ 'partita_iva': fields.char('Partita IVA', size=11),
1171+ 'documento_riepilogativo': fields.boolean('Documento Riepilogativo'),
1172+ 'data_documento': fields.date('Data documento'),
1173+ 'data_registrazione': fields.date('Data registrazione'),
1174+ 'iva_non_esposta': fields.boolean('IVA non esposta'),
1175+ 'reverse_charge': fields.boolean('Reverse charge'),
1176+ 'autofattura': fields.boolean('Autofattura'),
1177+
1178+ 'importo': fields.float('Importo', digits_compute=dp.get_precision('Account')),
1179+ 'imposta': fields.float('Imposta', digits_compute=dp.get_precision('Account')),
1180+ }
1181+
1182+class spesometro_comunicazione_line_NE(orm.Model):
1183+
1184+ _name = "spesometro.comunicazione.line.ne"
1185+ _description = "Spesometro - Comunicazione linee quadro NE"
1186+ _columns = {
1187+ 'comunicazione_id': fields.many2one('spesometro.comunicazione', 'Comunicazione', ondelete='cascade'),
1188+
1189+ 'partner_id': fields.many2one('res.partner', 'Partner'),
1190+ 'partita_iva': fields.char('Partita IVA', size=11),
1191+ 'codice_fiscale': fields.char('Codice Fiscale', size=16),
1192+ 'data_emissione': fields.date('Data emissione'),
1193+ 'data_registrazione': fields.date('Data registrazione'),
1194+ 'numero_nota': fields.char('Numero Nota', size=16),
1195+
1196+ 'importo': fields.float('Importo', digits_compute=dp.get_precision('Account')),
1197+ 'imposta': fields.float('Imposta', digits_compute=dp.get_precision('Account')),
1198+ }
1199+
1200+class spesometro_comunicazione_line_NR(orm.Model):
1201+
1202+ _name = "spesometro.comunicazione.line.nr"
1203+ _description = "Spesometro - Comunicazione linee quadro NR"
1204+ _columns = {
1205+ 'comunicazione_id': fields.many2one('spesometro.comunicazione', 'Comunicazione', ondelete='cascade'),
1206+
1207+ 'partner_id': fields.many2one('res.partner', 'Partner'),
1208+ 'partita_iva': fields.char('Partita IVA', size=11),
1209+ 'data_documento': fields.date('Data documento'),
1210+ 'data_registrazione': fields.date('Data registrazione'),
1211+
1212+ 'importo': fields.float('Importo', digits_compute=dp.get_precision('Account')),
1213+ 'imposta': fields.float('Imposta', digits_compute=dp.get_precision('Account')),
1214+ }
1215+
1216+class spesometro_comunicazione_line_DF(orm.Model):
1217+
1218+ _name = "spesometro.comunicazione.line.df"
1219+ _description = "Spesometro - Comunicazione linee quadro DF"
1220+ _columns = {
1221+ 'comunicazione_id': fields.many2one('spesometro.comunicazione', 'Comunicazione', ondelete='cascade'),
1222+
1223+ 'partner_id': fields.many2one('res.partner', 'Partner'),
1224+ 'codice_fiscale': fields.char('Codice Fiscale', size=16),
1225+ 'data_operazione': fields.date('Data operazione'),
1226+
1227+ 'importo': fields.float('Importo', digits_compute=dp.get_precision('Account')),
1228+ 'noleggio': fields.selection((('A','Autovettura'), ('B','Caravan'), ('C','Altri Veicoli'), ('D','Unità da diporto'), ('E','Aeromobii')),'Leasing'),
1229+ }
1230+
1231+class spesometro_comunicazione_line_FN(orm.Model):
1232+
1233+ _name = "spesometro.comunicazione.line.fn"
1234+ _description = "Spesometro - Comunicazione linee quadro FN"
1235+ _columns = {
1236+ 'comunicazione_id': fields.many2one('spesometro.comunicazione', 'Comunicazione', ondelete='cascade'),
1237+ 'partner_id': fields.many2one('res.partner', 'Partner'),
1238+
1239+ 'pf_cognome': fields.char('Cognome', size=24, help=""),
1240+ 'pf_nome': fields.char('Nome', size=20, help=""),
1241+ 'pf_data_nascita': fields.date('Data di nascita'),
1242+ 'pf_comune_stato_nascita': fields.char('Comune o stato estero di nascita', size=40),
1243+ 'pf_provincia_nascita': fields.char('Provincia', size=2),
1244+ '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\
1245+ territori esteri' pubblicata nelle istruzioni del modello Unico"),
1246+
1247+ 'pg_denominazione': fields.char('Denominazione/Ragione sociale', size=60),
1248+ 'pg_citta_estera_sede_legale': fields.char('Città estera delle Sede legale', size=40),
1249+ '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\
1250+ territori esteri' pubblicata nelle istruzioni del modello Unico"),
1251+ 'pg_indirizzo_sede_legale': fields.char('Indirizzo legale', size=40),
1252+
1253+ 'data_emissione': fields.date('Data emissione'),
1254+ 'data_registrazione': fields.date('Data registrazione'),
1255+ 'numero_fattura': fields.char('Numero Fattura/Doc riepilog.', size=16),
1256+ 'noleggio': fields.selection((('A','Autovettura'), ('B','Caravan'), ('C','Altri Veicoli'), ('D','Unità da diporto'), ('E','Aeromobii')),'Leasing'),
1257+
1258+ 'importo': fields.float('Importo', digits_compute=dp.get_precision('Account')),
1259+ 'imposta': fields.float('Imposta', digits_compute=dp.get_precision('Account')),
1260+ }
1261+
1262+
1263+class spesometro_comunicazione_line_SE(orm.Model):
1264+ '''
1265+ QUADRO SE - Acquisti di servizi da non residenti e Acquisti da operatori di San Marino
1266+ '''
1267+ _name = "spesometro.comunicazione.line.se"
1268+ _description = "Spesometro - Comunicazione linee quadro SE"
1269+ _columns = {
1270+ 'comunicazione_id': fields.many2one('spesometro.comunicazione', 'Comunicazione', ondelete='cascade'),
1271+ 'partner_id': fields.many2one('res.partner', 'Partner'),
1272+
1273+ 'pf_cognome': fields.char('Cognome', size=24, help=""),
1274+ 'pf_nome': fields.char('Nome', size=20, help=""),
1275+ 'pf_data_nascita': fields.date('Data di nascita'),
1276+ 'pf_comune_stato_nascita': fields.char('Comune o stato estero di nascita', size=40),
1277+ 'pf_provincia_nascita': fields.char('Provincia', size=2),
1278+ '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\
1279+ territori esteri' pubblicata nelle istruzioni del modello Unico"),
1280+
1281+ 'pg_denominazione': fields.char('Denominazione/Ragione sociale', size=60),
1282+ 'pg_citta_estera_sede_legale': fields.char('Città estera delle Sede legale', size=40),
1283+ '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\
1284+ territori esteri' pubblicata nelle istruzioni del modello Unico"),
1285+ 'pg_indirizzo_sede_legale': fields.char('Indirizzo legale', size=40),
1286+
1287+ 'codice_identificativo_IVA': fields.char('Codice Identificativo IVA (037=San Marino)', size=3),
1288+ 'data_emissione': fields.date('Data emissione'),
1289+ 'data_registrazione': fields.date('Data registrazione'),
1290+ 'numero_fattura': fields.char('Numero Fattura/Doc riepilog.', size=16),
1291+
1292+ 'importo': fields.float('Importo/imponibile', digits_compute=dp.get_precision('Account')),
1293+ 'imposta': fields.float('Imposta', digits_compute=dp.get_precision('Account')),
1294+ }
1295+
1296+ def add_line(self, cr, uid, move, invoice, arg):
1297+ comunicazione_lines_obj = self.pool.get('spesometro.comunicazione.line.se')
1298+ comunicazione_id = arg.get('comunicazione_id', False)
1299+ com_line_search = [('comunicazione_id','=',comunicazione_id), ('partner_id', '=', move.partner_id.id)]
1300+ com_line_ids = self.search(cr, uid, com_line_search)
1301+ val = {}
1302+ # Valori documento
1303+ doc_vals = self.pool.get('spesometro.comunicazione').compute_invoice_amounts(cr, uid, move, invoice, arg)
1304+ # p.iva
1305+ if move.partner_id.vat:
1306+ partita_iva = move.partner_id.vat[2:]
1307+ else:
1308+ partita_iva = '{:11s}'.format("".zfill(11))
1309+ # prov. nascita
1310+ '''
1311+ >> dati persona fisica>> da aggiungere
1312+ prov_code = False
1313+ if move.partner_id.birth_city.name:
1314+ city_data = move.partner_id.address[0]._set_vals_city_data(cr, uid, {'city' : move.partner_id.birth_city.name})
1315+ prov_id = city_data.get('province_id', False)
1316+ if prov_id:
1317+ prov = self.pool.get('res.province').borwse(cr, uid, prov_id)
1318+ prov_nascita_code = prov.code
1319+ '''
1320+ # Indirizzo
1321+ address = self.pool.get('spesometro.comunicazione')._get_partner_address_obj(cr, uid, move, invoice, arg)
1322+ # Codice identificativo IVA -Da indicare esclusivamente per operazioni con San Marino (Codice Stato = 037)
1323+ codice_identificativo_iva=''
1324+ if self.pool.get('spesometro.comunicazione').partner_is_from_san_marino(cr, uid, move, invoice, arg):
1325+ codice_identificativo_iva = '037'
1326+ val = {
1327+ 'comunicazione_id' : comunicazione_id,
1328+ 'partner_id' : move.partner_id.id,
1329+ 'codice_fiscale' : move.partner_id.fiscalcode or False,
1330+ 'noleggio' : move.partner_id.spesometro_leasing or False,
1331+
1332+ #'pf_cognome' : move.partner_id.fiscalcode_surname or False,
1333+ #'pf_nome' : move.partner_id.fiscalcode_firstname or False,
1334+ #'pf_data_nascita' : move.partner_id.birth_date or False,
1335+ #'pf_comune_stato_nascita' : move.partner_id.birth_city.name or False,
1336+ #'pf_provincia_nascita' : prov_code or False,
1337+ #'pf_codice_stato_estero_domicilio' : address.country_id.codice_stato_agenzia_entrate or codice_identificativo_iva or '',
1338+
1339+ 'pg_denominazione' : move.partner_id.name or False,
1340+ 'pg_citta_estera_sede_legale' : address.city or False,
1341+ 'pg_codice_stato_estero_domicilio' : address.country_id.codice_stato_agenzia_entrate or codice_identificativo_iva or '',
1342+ 'pg_indirizzo_sede_legale' : address.street or False,
1343+
1344+ 'codice_identificativo_IVA' : codice_identificativo_iva,
1345+
1346+ 'data_emissione': move.date,
1347+ 'data_registrazione': invoice.date_invoice or move.date,
1348+ 'numero_fattura': move.name,
1349+
1350+ 'importo': doc_vals.get('amount_untaxed', 0),
1351+ 'imposta': doc_vals.get('amount_tax', 0)
1352+ }
1353+
1354+ line_id = self.create(cr, uid, val)
1355+
1356+ return line_id
1357+
1358+class spesometro_comunicazione_line_TU(orm.Model):
1359+
1360+ _name = "spesometro.comunicazione.line.tu"
1361+ _description = "Spesometro - Comunicazione linee quadro TU"
1362+ _columns = {
1363+ 'comunicazione_id': fields.many2one('spesometro.comunicazione', 'Comunicazione', ondelete='cascade'),
1364+ 'partner_id': fields.many2one('res.partner', 'Partner'),
1365+
1366+ 'cognome': fields.char('Cognome', size=24, help=""),
1367+ 'nome': fields.char('Nome', size=20, help=""),
1368+ 'data_nascita': fields.date('Data di nascita'),
1369+ 'comune_stato_nascita': fields.char('Comune o stato estero di nascita', size=40),
1370+ 'provincia_nascita': fields.char('Provincia', size=2),
1371+ 'citta_estera_residenza': fields.char('Città Estera di residenza', size=40),
1372+ 'codice_stato_estero': fields.char('Codice Stato Estero', size=3, help="Deve essere uno di quelli presenti nella tabella 'elenco dei paesi e\
1373+ territori esteri' pubblicata nelle istruzioni del modello Unico"),
1374+ 'indirizzo_estero_residenza': fields.char('Indirizzo Estero di residenza', size=40),
1375+
1376+ 'data_emissione': fields.date('Data emissione'),
1377+ 'data_registrazione': fields.date('Data registrazione'),
1378+ 'numero_fattura': fields.char('Numero Fattura/Doc riepilog.', size=16),
1379+
1380+ 'importo': fields.float('Importo/imponibile', digits_compute=dp.get_precision('Account')),
1381+ 'imposta': fields.float('Imposta', digits_compute=dp.get_precision('Account')),
1382+ }
1383
1384=== added file 'l10n_it_spesometro/spesometro_view.xml'
1385--- l10n_it_spesometro/spesometro_view.xml 1970-01-01 00:00:00 +0000
1386+++ l10n_it_spesometro/spesometro_view.xml 2014-03-20 14:19:55 +0000
1387@@ -0,0 +1,628 @@
1388+<?xml version="1.0" encoding="utf-8"?>
1389+<openerp>
1390+ <data>
1391+
1392+ <!--
1393+ PARTNER
1394+ -->
1395+ <record id="spesometro_account_partner_view_form" model="ir.ui.view">
1396+ <field name="name">spesometro.account.partner.view.form</field>
1397+ <field name="model">res.partner</field>
1398+ <field name="inherit_id" ref="base.view_partner_form"/>
1399+ <field name="arch" type="xml">
1400+ <xpath expr="//field[@name='bank_ids']" position="after">
1401+ <group string="Comunicazione art.21" colspan="4">
1402+ <group colspan="2">
1403+ <field name="spesometro_escludi"/>
1404+ <field name="spesometro_operazione" attrs="{'invisible': [('spesometro_escludi', '=', True)]}"/>
1405+ <field name="spesometro_tipo_servizio" attrs="{'invisible': [('spesometro_operazione', '!=', 'BL1')], 'required': [('spesometro_operazione', '=', 'BL1')]}"/>
1406+ </group>
1407+ <group>
1408+ <field name="spesometro_IVA_non_esposta" attrs="{'invisible': ['|', ('spesometro_escludi', '=', True), ('spesometro_operazione', '!=', 'FA')]}" />
1409+ </group>
1410+ <group>
1411+ <field name="spesometro_leasing" attrs="{'invisible': [('spesometro_escludi', '=', True)]}" />
1412+ </group>
1413+ </group>
1414+ </xpath>
1415+ </field>
1416+ </record>
1417+
1418+ <!--
1419+ JOURNAL
1420+ -->
1421+ <record id="spesometro_account_journal_view_form" model="ir.ui.view">
1422+ <field name="name">spesometro.account.journal.view.form</field>
1423+ <field name="model">account.journal</field>
1424+ <field name="inherit_id" ref="account.view_account_journal_form"/>
1425+ <field name="arch" type="xml">
1426+ <xpath expr="//field[@name='sequence_id']" position="after">
1427+ <group string="Comunicazione art.21" colspan="4">
1428+ <field name="spesometro"/>
1429+ <field name="spesometro_operazione" attrs="{'invisible': [('spesometro', '=', False)], 'required': [('spesometro', '=', True)]}"/>
1430+ <field name="spesometro_segno" attrs="{'invisible': ['|', ('spesometro', '=', False), ('spesometro_operazione', '=', 'SA')], 'required': [('spesometro_operazione', 'IN', ('FA','BL1','BL2','BL3') )]}" />
1431+ <field name="spesometro_IVA_non_esposta" attrs="{'invisible': ['|', ('spesometro', '=', False), ('spesometro_operazione', '=', 'SA')]}" />
1432+ </group>
1433+ </xpath>
1434+ </field>
1435+ </record>
1436+
1437+
1438+ <!--
1439+ COUNTRY
1440+ -->
1441+ <record id="spesometro_res_country_view_form" model="ir.ui.view">
1442+ <field name="name">spesometro.res.country.view.form</field>
1443+ <field name="model">res.country</field>
1444+ <field name="inherit_id" ref="base.view_country_form"/>
1445+ <field name="arch" type="xml">
1446+ <xpath expr="//field[@name='address_format']" position="after">
1447+ <group>
1448+ <field name="codice_stato_agenzia_entrate"/>
1449+ </group>
1450+ </xpath>
1451+ </field>
1452+ </record>
1453+ <record id="spesometro_res_country_view_tree" model="ir.ui.view">
1454+ <field name="name">spesometro.res.country.view.tree</field>
1455+ <field name="model">res.country</field>
1456+ <field name="inherit_id" ref="base.view_country_tree"/>
1457+ <field name="arch" type="xml">
1458+ <xpath expr="//field[@name='code']" position="after">
1459+ <field name="codice_stato_agenzia_entrate"/>
1460+ </xpath>
1461+ </field>
1462+ </record>
1463+
1464+ <!--
1465+ SPESOMETRO
1466+ -->
1467+ <menuitem id="menu_spesometro_main"
1468+ name="Spesometro" parent="account.menu_account_end_year_treatments"/>
1469+
1470+ <!--
1471+ Configurazione
1472+ -->
1473+
1474+ <record id="spesometro_configurazione_view_tree" model="ir.ui.view">
1475+ <field name="name">spesometro.configurazione.view.tree</field>
1476+ <field name="model">spesometro.configurazione</field>
1477+ <field name="arch" type="xml">
1478+ <tree string="Configurazione Spesometro">
1479+ <field name="anno"/>
1480+ </tree>
1481+ </field>
1482+ </record>
1483+ <record id="spesometro_configurazione_view_form" model="ir.ui.view">
1484+ <field name="name">spesometro.configurazione.view.form</field>
1485+ <field name="model">spesometro.configurazione</field>
1486+ <field name="arch" type="xml">
1487+ <form string="Configurazione Spesometro">
1488+ <group>
1489+ <field name="anno"/>
1490+ <newline/>
1491+ <field name="stato_san_marino"/>
1492+ </group>
1493+ <newline/>
1494+ <group string="Quadri per dati in forma aggregata">
1495+ <group col="2">
1496+ <label string="Quadro FA - Operazioni documentate da fattura esposte in forma aggregata" colspan="2" />
1497+ <field name="quadro_fa_limite_importo" />
1498+ <field name="quadro_fa_limite_importo_line" />
1499+ </group>
1500+ <group col="2">
1501+ <label string="Quadro SA - Operazioni senza fattura esposte in forma aggregata" colspan="2"/>
1502+ <field name="quadro_sa_limite_importo" />
1503+ <field name="quadro_sa_limite_importo_line" />
1504+ </group>
1505+ <group col="2">
1506+ <label string="Quadro BL - Operazioni con paesi con fiscalità privilegiata - Operazioni con soggetti non residenti - Acquisti di servizi da soggetti non residenti " colspan="2"/>
1507+ <field name="quadro_bl_limite_importo" />
1508+ <field name="quadro_bl_limite_importo_line" />
1509+ </group>
1510+ <newline/>
1511+ <group string="Quadri per dati in forma analitica">
1512+ <group col="2">
1513+ <label string="Quadro SE - Acquisti di servizi da non residenti e Acquisti da operatori di San Marino" colspan="2"/>
1514+ <field name="quadro_se_limite_importo_line" />
1515+ </group>
1516+ </group>
1517+ </group>
1518+ </form>
1519+ </field>
1520+ </record>
1521+
1522+ <record id="spesometro_configurazione_action" model="ir.actions.act_window">
1523+ <field name="name">Configurazione Spesometro</field>
1524+ <field name="type">ir.actions.act_window</field>
1525+ <field name="res_model">spesometro.configurazione</field>
1526+ <field name="view_type">form</field>
1527+ <field name="view_mode">tree,form</field>
1528+ </record>
1529+
1530+ <menuitem id="menu_spesometro_configurazione" action="spesometro_configurazione_action"
1531+ name="Configurazione Spesometro" parent="menu_spesometro_main" sequence="100"/>
1532+
1533+
1534+ <!--
1535+ Comunicazioni
1536+ -->
1537+ <record id="spesometro_comunicazione_view_form" model="ir.ui.view">
1538+ <field name="name">spesometro.comunicazione.view.form</field>
1539+ <field name="model">spesometro.comunicazione</field>
1540+ <field name="type">form</field>
1541+ <field name="arch" type="xml">
1542+ <form string="Comunicazione">
1543+ <group colspan="4">
1544+ <field name="tipo"/>
1545+ <field name="progressivo_telematico"/>
1546+ <field name="periodo"/>
1547+ <field name="anno"/>
1548+ <field name="mese" attrs="{'invisible':[('periodo','!=','mese')], 'required':[('periodo','=','mese')]}"/>
1549+ <field name="trimestre" attrs="{'invisible':[('periodo','!=','trimestre')], 'required':[('periodo','=','trimestre')]}"/>
1550+ <field name="tipo_fornitore" invisible="1"/>
1551+ <field name="comunicazione_da_sostituire_annullare" attrs="{'invisible':[('tipo','=','ordinaria')], 'required':[('tipo','!=','ordinaria')]}"/>
1552+ <field name="documento_da_sostituire_annullare" attrs="{'invisible':[('tipo','=','ordinaria')], 'required':[('comunicazione_da_sostituire_annullare','!=',0)]}"/>
1553+ <newline/>
1554+ <field name="formato_dati"/>
1555+ </group>
1556+
1557+ <newline/>
1558+ <!--
1559+ Soggetto comunicazione
1560+ -->
1561+ <notebook>
1562+ <page string="Soggetto Obbligato">
1563+ <group colspan="4">
1564+ <field name="soggetto_codice_fiscale"/>
1565+ <field name="soggetto_partitaIVA"/>
1566+ <field name="soggetto_codice_attivita" required="1"/>
1567+ <field name="soggetto_telefono"/>
1568+ <field name="soggetto_fax"/>
1569+ <field name="soggetto_email"/>
1570+ <field name="soggetto_forma_giuridica"/>
1571+ </group>
1572+ <group string="Dati persona giuridica" colspan="4" attrs="{'invisible':[('soggetto_forma_giuridica','!=','persona_giuridica')]}">
1573+ <field name="soggetto_pg_denominazione" attrs="{'required':[('soggetto_forma_giuridica','==','persona_giuridica')]}" />
1574+ </group>
1575+ <group string="Dati persona fisica" colspan="4" attrs="{'invisible':[('soggetto_forma_giuridica','==','persona_giuridica')]}">
1576+ <field name="soggetto_pf_cognome" attrs="{'required':[('soggetto_forma_giuridica','!=','persona_giuridica')]}"/>
1577+ <field name="soggetto_pf_nome" attrs="{'required':[('soggetto_forma_giuridica','!=','persona_giuridica')]}"/>
1578+ <field name="soggetto_pf_sesso" attrs="{'required':[('soggetto_forma_giuridica','!=','persona_giuridica')]}"/>
1579+ <field name="soggetto_pf_data_nascita" attrs="{'required':[('soggetto_forma_giuridica','!=','persona_giuridica')]}"/>
1580+ <field name="soggetto_pf_comune_nascita" attrs="{'required':[('soggetto_forma_giuridica','!=','persona_giuridica')]}"/>
1581+ <field name="soggetto_pf_provincia_nascita" attrs="{'required':[('soggetto_forma_giuridica','!=','persona_giuridica')]}"/>
1582+ </group>
1583+ </page>
1584+
1585+ <page string="Soggetto Tenuto alla comunicazione">
1586+ <group colspan="4">
1587+ <field name="tipo_fornitore"/>
1588+ <field name="soggetto_cm_forma_giuridica"/>
1589+ <field name="soggetto_cm_codice_fiscale"/>
1590+ </group>
1591+ <group string="Dati persona giuridica" colspan="4" attrs="{'invisible':[('soggetto_cm_forma_giuridica','!=','persona_giuridica')]}">
1592+ <field name="soggetto_cm_pg_denominazione" attrs="{'required':[('soggetto_cm_forma_giuridica','==','persona_giuridica')]}" />
1593+ </group>
1594+ <group string="Dati persona fisica" colspan="4" attrs="{'invisible':[('soggetto_cm_forma_giuridica','==','persona_giuridica')]}">
1595+ <field name="soggetto_cm_pf_cognome" attrs="{'required':[('soggetto_cm_forma_giuridica','!=','persona_giuridica')]}"/>
1596+ <field name="soggetto_cm_pf_nome" attrs="{'required':[('soggetto_cm_forma_giuridica','!=','persona_giuridica')]}"/>
1597+ <field name="soggetto_cm_pf_sesso" attrs="{'required':[('soggetto_cm_forma_giuridica','!=','persona_giuridica')]}"/>
1598+ <field name="soggetto_cm_pf_data_nascita" attrs="{'required':[('soggetto_cm_forma_giuridica','!=','persona_giuridica')]}"/>
1599+ <field name="soggetto_cm_pf_comune_nascita" attrs="{'required':[('soggetto_cm_forma_giuridica','!=','persona_giuridica')]}"/>
1600+ <field name="soggetto_cm_pf_provincia_nascita" attrs="{'required':[('soggetto_cm_forma_giuridica','!=','persona_giuridica')]}"/>
1601+ </group>
1602+ </page>
1603+
1604+ <page string="Incaricato alla trasmissione">
1605+ <group colspan="4">
1606+ <field name="soggetto_trasmissione_codice_fiscale" attrs="{'required':[('tipo_fornitore','==','10')]}" />
1607+ <field name="soggetto_trasmissione_numero_CAF" />
1608+ <field name="soggetto_trasmissione_impegno" required="1" on_change="onchange_trasmissione_impegno(soggetto_trasmissione_impegno, context)" context="{'soggetto_codice_fiscale': soggetto_codice_fiscale}"/>
1609+ <field name="soggetto_trasmissione_data_impegno" attrs="{'required':[('soggetto_trasmissione_codice_fiscale','!=',False)]}"/>
1610+ </group>
1611+ </page>
1612+
1613+ </notebook>
1614+ <newline/>
1615+ <!--
1616+ Quadri
1617+ -->
1618+ <notebook>
1619+ <page string="Quadri FA">
1620+ <label string="FORMA AGGREGATA : Operazioni documentate da fattura esposte in forma aggregata" colspan="4"/>
1621+ <newline/>
1622+ <field name="line_FA_ids" nolabel="1">
1623+ <tree>
1624+ <field name="partner_id"/>
1625+ <field name="numero_operazioni_attive_aggregate" string="Nr op. attive"/>
1626+ <field name="numero_operazioni_passive_aggregate" string="Nr op. passive"/>
1627+ <field name="noleggio"/>
1628+ <field name="attive_imponibile_non_esente" string="Attive : Impon., non impon, esente"/>
1629+ <field name="attive_imposta" string="Attive : imposta"/>
1630+ <field name="passive_imponibile_non_esente" string="Passive : Impon., non impon, esente"/>
1631+ <field name="passive_imposta" string="Passive : imposta"/>
1632+ </tree>
1633+ </field>
1634+ </page>
1635+ <page string="Quadri SA">
1636+ <label string="FORMA AGGREGATA : Operazioni senza fattura esposte in forma aggregata" colspan="4"/>
1637+ <newline/>
1638+ <field name="line_SA_ids" nolabel="1">
1639+ <tree>
1640+ <field name="partner_id"/>
1641+ <field name="codice_fiscale"/>
1642+ <field name="numero_operazioni"/>
1643+ <field name="noleggio"/>
1644+ <field name="importo_complessivo"/>
1645+ </tree>
1646+ </field>
1647+ </page>
1648+ <page string="Quadri BL">
1649+ <label string="FORMA AGGREGATA : Operazioni con paesi con fiscalità privilegiata - Operazioni con soggetti non residenti
1650+ - Acquisti di servizi da soggetti non residenti" colspan="4"/>
1651+ <newline/>
1652+ <field name="line_BL_ids" nolabel="1">
1653+ <tree>
1654+ <field name="partner_id"/>
1655+ <field name="codice_fiscale"/>
1656+ <field name="noleggio"/>
1657+ <field name="pf_cognome"/>
1658+ <field name="pg_denominazione"/>
1659+ <field name="operazione_fiscalita_privilegiata"/>
1660+ <field name="operazione_con_soggetti_non_residenti"/>
1661+ <field name="Acquisto_servizi_da_soggetti_non_residenti"/>
1662+ <field name="attive_importo_complessivo"/>
1663+ <field name="passive_importo_complessivo"/>
1664+ </tree>
1665+ </field>
1666+ </page>
1667+ <page string="Quadri SE">
1668+ <label string="FORMA ANALITICA : Acquisti di servizi da non residenti e Acquisti da operatori di San Marino" colspan="4"/>
1669+ <newline/>
1670+ <field name="line_SE_ids" nolabel="1">
1671+ <tree>
1672+ <field name="partner_id"/>
1673+ <field name="pf_cognome"/>
1674+ <field name="pg_denominazione"/>
1675+ <field name="numero_fattura"/>
1676+ <field name="data_emissione"/>
1677+ <field name="data_registrazione"/>
1678+ <field name="importo"/>
1679+ <field name="imposta"/>
1680+ </tree>
1681+ </field>
1682+ </page>
1683+
1684+ <page string="Quadri FE">
1685+ <label string="FORMA ANALITICA : Fatture emesse e Documenti riepilogativi(Operazioni Attive)" colspan="4"/>
1686+ <newline/>
1687+ <field name="line_FE_ids" nolabel="1">
1688+ <tree>
1689+ <field name="partner_id"/>
1690+ <field name="partita_iva"/>
1691+ <field name="codice_fiscale"/>
1692+ <field name="numero_fattura"/>
1693+ <field name="data_documento"/>
1694+ <field name="data_registrazione"/>
1695+ <field name="importo"/>
1696+ <field name="imposta"/>
1697+ </tree>
1698+ </field>
1699+ </page>
1700+ <page string="Quadri FR">
1701+ <label string="FORMA ANALITICA : Fatture ricevute e Documenti riepilogativi (Operazioni passive)" colspan="4"/>
1702+ <newline/>
1703+ <field name="line_FR_ids" nolabel="1">
1704+ <tree>
1705+ <field name="partner_id"/>
1706+ <field name="partita_iva"/>
1707+ <field name="documento_riepilogativo"/>
1708+ <field name="data_documento"/>
1709+ <field name="data_registrazione"/>
1710+ <field name="importo"/>
1711+ <field name="imposta"/>
1712+ </tree>
1713+ </field>
1714+ </page>
1715+ <page string="Quadri NE">
1716+ <label string="FORMA ANALITICA : Note di variazione emesse" colspan="4"/>
1717+ <newline/>
1718+ <field name="line_NE_ids" nolabel="1">
1719+ <tree>
1720+ <field name="partner_id"/>
1721+ <field name="partita_iva"/>
1722+ <field name="codice_fiscale"/>
1723+ <field name="numero_nota"/>
1724+ <field name="data_emissione"/>
1725+ <field name="data_registrazione"/>
1726+ <field name="importo"/>
1727+ <field name="imposta"/>
1728+ </tree>
1729+ </field>
1730+ </page>
1731+ <page string="Quadri NR">
1732+ <label string="FORMA ANALITICA : Note di variazione ricevute" colspan="4"/>
1733+ <newline/>
1734+ <field name="line_NR_ids" nolabel="1">
1735+ <tree>
1736+ <field name="partner_id"/>
1737+ <field name="partita_iva"/>
1738+ <field name="data_documento"/>
1739+ <field name="data_registrazione"/>
1740+ <field name="importo"/>
1741+ <field name="imposta"/>
1742+ </tree>
1743+ </field>
1744+ </page>
1745+ <page string="Quadri DF">
1746+ <label string="FORMA ANALITICA : Operazioni senza fattura" colspan="4"/>
1747+ <newline/>
1748+ <field name="line_DF_ids" nolabel="1">
1749+ <tree>
1750+ <field name="partner_id"/>
1751+ <field name="codice_fiscale"/>
1752+ <field name="data_operazione"/>
1753+ <field name="importo"/>
1754+ </tree>
1755+ </field>
1756+ </page>
1757+ <page string="Quadri FN">
1758+ <label string="FORMA ANALITICA : Operazioni con soggetti non residenti (Operazioni attive)" colspan="4"/>
1759+ <newline/>
1760+ <field name="line_FN_ids" nolabel="1">
1761+ <tree>
1762+ <field name="partner_id"/>
1763+ <field name="pf_cognome"/>
1764+ <field name="pf_nome"/>
1765+ <field name="pg_denominazione"/>
1766+
1767+ <field name="numero_fattura"/>
1768+ <field name="data_emissione"/>
1769+ <field name="data_registrazione"/>
1770+ <field name="importo"/>
1771+ <field name="imposta"/>
1772+ </tree>
1773+ </field>
1774+ </page>
1775+ <page string="Quadri TU">
1776+ <label string="FORMA ANALITICA : Operazioni legate al turismo - Art. 3 comma 1 D.L. 16/2012" colspan="4"/>
1777+ <newline/>
1778+ <field name="line_TU_ids" nolabel="1">
1779+ <tree>
1780+ <field name="partner_id"/>
1781+ <field name="cognome"/>
1782+ <field name="nome"/>
1783+
1784+ <field name="numero_fattura"/>
1785+ <field name="data_emissione"/>
1786+ <field name="data_registrazione"/>
1787+ <field name="importo"/>
1788+ <field name="imposta"/>
1789+ </tree>
1790+ </field>
1791+ </page>
1792+ </notebook>
1793+ </form>
1794+ </field>
1795+ </record>
1796+
1797+ <record id="spesometro_comunicazione_view_tree" model="ir.ui.view">
1798+ <field name="name">spesometro.comunicazione.view.tree</field>
1799+ <field name="model">spesometro.comunicazione</field>
1800+ <field name="type">tree</field>
1801+ <field name="arch" type="xml">
1802+ <tree string="Comunicazioni">
1803+ <field name="progressivo_telematico"/>
1804+ <field name="tipo"/>
1805+ <field name="formato_dati"/>
1806+ <field name="periodo"/>
1807+ <field name="anno"/>
1808+ <field name="mese"/>
1809+ <field name="trimestre"/>
1810+ <field name="soggetto_codice_fiscale"/>
1811+ </tree>
1812+ </field>
1813+ </record>
1814+
1815+ <record model="ir.ui.view" id="spesometro_comunicazione_search">
1816+ <field name="name">salesman.commission.search</field>
1817+ <field name="model">spesometro.comunicazione</field>
1818+ <field name="type">search</field>
1819+ <field name="arch" type="xml">
1820+ <search string="Ricerca comunicazioni">
1821+ <field name="anno"/>
1822+ <newline/>
1823+ <group expand="0" string="Group By...">
1824+ <filter string="tipo" icon="terp-personal" domain="[]" context="{'group_by':'tipo'}"/>
1825+ <filter string="Periodo" icon="terp-go-month" domain="[]" context="{'group_by':'anno'}"/>
1826+ </group>
1827+ </search>
1828+ </field>
1829+ </record>
1830+
1831+ <record id="spesometro_comunicazione_action" model="ir.actions.act_window">
1832+ <field name="name">Comunicazioni</field>
1833+ <field name="type">ir.actions.act_window</field>
1834+ <field name="res_model">spesometro.comunicazione</field>
1835+ <field name="view_type">form</field>
1836+ <field name="view_mode">tree,form</field>
1837+ <field name="view_id" ref="spesometro_comunicazione_view_tree"/>
1838+ <!-- <field name="search_view_id" ref="spesometro_comunicazione_search" /> -->
1839+ </record>
1840+
1841+ <menuitem id="menu_spesometro_comunicazione" action="spesometro_comunicazione_action"
1842+ name="Comunicazioni" parent="menu_spesometro_main"/>
1843+
1844+ <!--
1845+ Quadro FA
1846+ -->
1847+ <record id="spesometro_comunicazione_fa_view_form" model="ir.ui.view">
1848+ <field name="name">spesometro.comunicazione.fa.view.form</field>
1849+ <field name="model">spesometro.comunicazione.line.fa</field>
1850+ <field name="type">form</field>
1851+ <field name="arch" type="xml">
1852+ <form string="Quado FA - Linea">
1853+ <group>
1854+ <field name="partner_id"/>
1855+ <newline/>
1856+ <field name="partita_iva"/>
1857+ <field name="codice_fiscale"/>
1858+ <field name="documento_riepilogativo"/>
1859+ <field name="noleggio"/>
1860+ </group>
1861+ <newline/>
1862+ <group string="Operazioni Attive">
1863+ <field name="numero_operazioni_attive_aggregate"/>
1864+ <field name="attive_imponibile_non_esente"/>
1865+ <field name="attive_imposta"/>
1866+ <field name="attive_operazioni_iva_non_esposta"/>
1867+ <field name="attive_note_variazione"/>
1868+ <field name="attive_note_variazione_imposta"/>
1869+ </group>
1870+ <newline/>
1871+ <group string="Operazioni Passive">
1872+ <field name="numero_operazioni_passive_aggregate"/>
1873+ <field name="passive_imponibile_non_esente"/>
1874+ <field name="passive_imposta"/>
1875+ <field name="passive_operazioni_iva_non_esposta"/>
1876+ <field name="passive_note_variazione"/>
1877+ <field name="passive_note_variazione_imposta"/>
1878+ </group>
1879+
1880+ </form>
1881+ </field>
1882+ </record>
1883+
1884+ <!--
1885+ Quadro SA
1886+ -->
1887+ <record id="spesometro_comunicazione_sa_view_form" model="ir.ui.view">
1888+ <field name="name">spesometro.comunicazione.sa.view.form</field>
1889+ <field name="model">spesometro.comunicazione.line.sa</field>
1890+ <field name="type">form</field>
1891+ <field name="arch" type="xml">
1892+ <form string="Quado SA - Linea">
1893+ <group>
1894+ <field name="partner_id"/>
1895+ <newline/>
1896+ <field name="codice_fiscale"/>
1897+ <field name="noleggio"/>
1898+ </group>
1899+ <newline/>
1900+ <group>
1901+ <field name="numero_operazioni"/>
1902+ <field name="importo_complessivo"/>
1903+ </group>
1904+ </form>
1905+ </field>
1906+ </record>
1907+
1908+
1909+ <!--
1910+ Quadro BL
1911+ -->
1912+ <record id="spesometro_comunicazione_bl_view_form" model="ir.ui.view">
1913+ <field name="name">spesometro.comunicazione.bl.view.form</field>
1914+ <field name="model">spesometro.comunicazione.line.bl</field>
1915+ <field name="type">form</field>
1916+ <field name="arch" type="xml">
1917+ <form string="Quado BL - Linea">
1918+ <group>
1919+ <field name="partner_id"/>
1920+ <newline/>
1921+ <field name="codice_fiscale"/>
1922+ <field name="noleggio"/>
1923+ <field name="codice_identificativo_IVA"/>
1924+ </group>
1925+ <newline/>
1926+ <group>
1927+ <field name="operazione_fiscalita_privilegiata"/>
1928+ <field name="operazione_con_soggetti_non_residenti"/>
1929+ <field name="Acquisto_servizi_da_soggetti_non_residenti"/>
1930+ </group>
1931+ <newline/>
1932+ <notebook>
1933+ <page string="Persona Giuridica">
1934+ <field name="pg_denominazione"/>
1935+ <field name="pg_citta_estera_sede_legale"/>
1936+ <field name="pg_codice_stato_estero"/>
1937+ <field name="pg_indirizzo_sede_legale"/>
1938+ </page>
1939+ <page string="Persona Fisica">
1940+ <field name="pf_cognome"/>
1941+ <field name="pf_nome"/>
1942+ <field name="pf_data_nascita"/>
1943+ <field name="pf_comune_stato_nascita"/>
1944+ <field name="pf_provincia_nascita"/>
1945+ <field name="pf_codice_stato_estero"/>
1946+ </page>
1947+ </notebook>
1948+ <newline/>
1949+ <group string="Operazioni Attive">
1950+ <field name="attive_importo_complessivo"/>
1951+ <field name="attive_imposta"/>
1952+ <field name="attive_non_sogg_cessione_beni"/>
1953+ <field name="attive_non_sogg_servizi"/>
1954+ <field name="attive_note_variazione"/>
1955+ <field name="attive_note_variazione_imposta"/>
1956+ </group>
1957+ <newline/>
1958+ <group string="Operazioni Passive">
1959+ <field name="passive_importo_complessivo"/>
1960+ <field name="passive_imposta"/>
1961+ <field name="passive_non_sogg_importo_complessivo"/>
1962+ <field name="passive_note_variazione"/>
1963+ <field name="passive_note_variazione_imposta"/>
1964+ </group>
1965+ </form>
1966+ </field>
1967+ </record>
1968+
1969+ <!--
1970+ Quadro SE
1971+ -->
1972+ <record id="spesometro_comunicazione_se_view_form" model="ir.ui.view">
1973+ <field name="name">spesometro.comunicazione.se.view.form</field>
1974+ <field name="model">spesometro.comunicazione.line.se</field>
1975+ <field name="type">form</field>
1976+ <field name="arch" type="xml">
1977+ <form string="Quado SE - Linea">
1978+ <group>
1979+ <group colspan="4">
1980+ <field name="partner_id"/>
1981+ <newline/>
1982+ <field name="codice_identificativo_IVA"/>
1983+ </group>
1984+ <newline/>
1985+ <group string="Persona Giuridica" colspan="4">
1986+ <field name="pg_denominazione"/>
1987+ <field name="pg_citta_estera_sede_legale"/>
1988+ <field name="pg_codice_stato_estero_domicilio"/>
1989+ <field name="pg_indirizzo_sede_legale"/>
1990+ </group>
1991+ <newline/>
1992+ <group string="Persona Fisica" colspan="4">
1993+ <field name="pf_cognome"/>
1994+ <field name="pf_nome"/>
1995+ <field name="pf_data_nascita"/>
1996+ <field name="pf_comune_stato_nascita"/>
1997+ <field name="pf_provincia_nascita"/>
1998+ <field name="pf_codice_stato_estero_domicilio"/>
1999+ </group>
2000+ <newline/>
2001+ <group string="Documento" colspan="4">
2002+ <field name="data_emissione"/>
2003+ <field name="data_registrazione"/>
2004+ <field name="numero_fattura"/>
2005+ <newline/>
2006+ <field name="importo"/>
2007+ <field name="imposta"/>
2008+ </group>
2009+ </group>
2010+ </form>
2011+ </field>
2012+ </record>
2013+
2014+ </data>
2015+</openerp>
2016
2017=== added directory 'l10n_it_spesometro/wizard'
2018=== added file 'l10n_it_spesometro/wizard/__init__.py'
2019--- l10n_it_spesometro/wizard/__init__.py 1970-01-01 00:00:00 +0000
2020+++ l10n_it_spesometro/wizard/__init__.py 2014-03-20 14:19:55 +0000
2021@@ -0,0 +1,25 @@
2022+# -*- coding: utf-8 -*-
2023+##############################################################################
2024+#
2025+# Author: Alessandro Camilli (a.camilli@yahoo.it)
2026+# Copyright (C) 2014
2027+# Associazione OpenERP Italia (<http://www.openerp-italia.org>)
2028+#
2029+# This program is free software: you can redistribute it and/or modify
2030+# it under the terms of the GNU Affero General Public License as published
2031+# by the Free Software Foundation, either version 3 of the License, or
2032+# (at your option) any later version.
2033+#
2034+# This program is distributed in the hope that it will be useful,
2035+# but WITHOUT ANY WARRANTY; without even the implied warranty of
2036+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2037+# GNU General Public License for more details.
2038+#
2039+# You should have received a copy of the GNU Affero General Public License
2040+# along with this program. If not, see <http://www.gnu.org/licenses/>.
2041+#
2042+##############################################################################
2043+
2044+import wizard_crea_comunicazione
2045+import wizard_default
2046+import wizard_export
2047\ No newline at end of file
2048
2049=== added file 'l10n_it_spesometro/wizard/wizard_crea_comunicazione.py'
2050--- l10n_it_spesometro/wizard/wizard_crea_comunicazione.py 1970-01-01 00:00:00 +0000
2051+++ l10n_it_spesometro/wizard/wizard_crea_comunicazione.py 2014-03-20 14:19:55 +0000
2052@@ -0,0 +1,128 @@
2053+# -*- coding: utf-8 -*-
2054+##############################################################################
2055+#
2056+# Author: Alessandro Camilli (a.camilli@yahoo.it)
2057+# Copyright (C) 2014
2058+# Associazione OpenERP Italia (<http://www.openerp-italia.org>)
2059+#
2060+# This program is free software: you can redistribute it and/or modify
2061+# it under the terms of the GNU Affero General Public License as published
2062+# by the Free Software Foundation, either version 3 of the License, or
2063+# (at your option) any later version.
2064+#
2065+# This program is distributed in the hope that it will be useful,
2066+# but WITHOUT ANY WARRANTY; without even the implied warranty of
2067+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2068+# GNU General Public License for more details.
2069+#
2070+# You should have received a copy of the GNU Affero General Public License
2071+# along with this program. If not, see <http://www.gnu.org/licenses/>.
2072+#
2073+##############################################################################
2074+
2075+from osv import fields,osv
2076+from tools.translate import _
2077+import time
2078+
2079+class wizard_crea_comunicazione(osv.osv_memory):
2080+
2081+ def default_get(self, cr, uid, fields, context=None):
2082+
2083+ res = super(wizard_crea_comunicazione, self).default_get(cr, uid, fields, context=context)
2084+
2085+ res['periodo'] = 'anno'
2086+ res['anno'] = int(time.strftime('%Y')) -1
2087+ res['tipo'] = 'ordinaria'
2088+ res['formato_dati'] = 'aggregati'
2089+ res['quadro_FA'] = True
2090+ res['quadro_SA'] = True
2091+ res['quadro_BL'] = True
2092+ res['quadro_SE'] = True
2093+ res['tipo_fornitore'] = '01'
2094+
2095+ return res
2096+
2097+ _name = "wizard.spesometro.crea.comunicazione"
2098+
2099+ _columns = {
2100+ 'company_id': fields.many2one('res.company', 'Azienda', required=True ),
2101+ 'periodo': fields.selection((('anno','Annuale'), ('trimestre','Trimestrale'), ('mese','Mensile')),
2102+ 'Periodo', required=True),
2103+ 'anno' : fields.integer('Anno', size=4, required=True),
2104+ 'trimestre' : fields.integer('Trimestre', size=1 ),
2105+ 'mese' : fields.selection(((1,'Gennaio'), (2,'Febbraio'), (3,'Marzo'), (4,'Aprile'),
2106+ (5,'Maggio'), (6,'Giugno'), (7,'Luglio'), (8,'Agosto'),
2107+ (9,'Settembre'), (10,'Ottobre'), (11,'Novembre'), (12,'Dicembre'),
2108+ ),'Mese'),
2109+
2110+ 'tipo': fields.selection((('ordinaria','Ordinaria'), ('sostitutiva','Sostitutiva'), ('annullamento','Annullamento')),
2111+ 'Tipo comunicazione', required=True),
2112+ 'comunicazione_da_sostituire_annullare': fields.integer('Protocollo comunicaz. da sostituire/annullare'),
2113+ 'documento_da_sostituire_annullare': fields.integer('Protocollo documento da sostituire/annullare'),
2114+ 'formato_dati': fields.selection((('aggregati','Aggregati'),('analitici','Analitici')),'Formato comunicazione', required=True),
2115+ 'tipo_fornitore': fields.selection((('01','Soggetti che inviano la propria comunicazione'), ('10','Intermediari')),
2116+ 'Tipo fornitore', required=True),
2117+ 'partner_intermediario': fields.many2one('res.partner', 'Intermediario'),
2118+ 'quadro_FA': fields.boolean('Quadro FA', help="Operazioni documentate da fattura esposte in forma aggregata"),
2119+ 'quadro_SA': fields.boolean('Quadro SA', help="Operazioni senza fattura esposte in forma aggregata"),
2120+ '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 "),
2121+
2122+ 'quadro_FE': fields.boolean('Quadro FE', help="Fatture emesse e Documenti riepilogativi (Operazioni attive)"),
2123+ 'quadro_FR': fields.boolean('Quadro FR', help="Fatture ricevute e Documenti riepilogativi (Operazioni passive)"),
2124+ 'quadro_NE': fields.boolean('Quadro NE', help="Note di variazione emesse"),
2125+ 'quadro_NR': fields.boolean('Quadro NR', help="Note di variazioni ricevute"),
2126+ 'quadro_DF': fields.boolean('Quadro DF', help="Operazioni senza fattura"),
2127+ 'quadro_FN': fields.boolean('Quadro FN', help="Operazioni con soggetti non residenti (Operazioni attive)"),
2128+ 'quadro_SE': fields.boolean('Quadro SE', help="Acquisti di servizi da non residenti e Acquisti da operatori di San Marino"),
2129+ 'quadro_TU': fields.boolean('Quadro TU', help="Operazioni legate al turismo - Art. 3 comma 1 D.L. 16/2012"),
2130+ }
2131+
2132+ def genera_comunicazione(self, cr, uid, ids, context=None):
2133+
2134+ comunicazione_obj = self.pool.get('spesometro.comunicazione')
2135+ wizard = self.read(cr, uid, ids)[0]
2136+
2137+ # Quadri richiesti:
2138+ quadri_richiesti = []
2139+ if wizard['quadro_FA']:
2140+ quadri_richiesti.append('FA')
2141+ if wizard['quadro_SA']:
2142+ quadri_richiesti.append('SA')
2143+ if wizard['quadro_BL']:
2144+ quadri_richiesti.append('BL')
2145+ if wizard['quadro_FE']:
2146+ quadri_richiesti.append('FE')
2147+ if wizard['quadro_FR']:
2148+ quadri_richiesti.append('FR')
2149+ if wizard['quadro_NE']:
2150+ quadri_richiesti.append('NE')
2151+ if wizard['quadro_NR']:
2152+ quadri_richiesti.append('NR')
2153+ if wizard['quadro_DF']:
2154+ quadri_richiesti.append('DF')
2155+ if wizard['quadro_FN']:
2156+ quadri_richiesti.append('FN')
2157+ if wizard['quadro_SE']:
2158+ quadri_richiesti.append('SE')
2159+ if wizard['quadro_TU']:
2160+ quadri_richiesti.append('TU')
2161+
2162+ params ={
2163+ 'company_id': wizard['company_id'][0],
2164+ 'periodo': wizard['periodo'],
2165+ 'anno': wizard['anno'],
2166+ 'trimestre': wizard['trimestre'],
2167+ 'mese': wizard['mese'],
2168+ 'tipo': wizard['tipo'],
2169+ 'comunicazione_da_sostituire_annullare': wizard['comunicazione_da_sostituire_annullare'],
2170+ 'documento_da_sostituire_annullare': wizard['documento_da_sostituire_annullare'],
2171+ 'formato_dati': wizard['formato_dati'],
2172+ 'tipo_fornitore': wizard['tipo_fornitore'],
2173+ 'partner_intermediario': wizard['partner_intermediario'],
2174+ 'quadri_richiesti': quadri_richiesti,
2175+ }
2176+ comunicazione_obj.genera_comunicazione(cr, uid, params, context=None)
2177+
2178+ return {
2179+ 'type': 'ir.actions.act_window_close',
2180+ }
2181
2182=== added file 'l10n_it_spesometro/wizard/wizard_crea_comunicazione_view.xml'
2183--- l10n_it_spesometro/wizard/wizard_crea_comunicazione_view.xml 1970-01-01 00:00:00 +0000
2184+++ l10n_it_spesometro/wizard/wizard_crea_comunicazione_view.xml 2014-03-20 14:19:55 +0000
2185@@ -0,0 +1,67 @@
2186+<?xml version="1.0" encoding="utf-8"?>
2187+<openerp>
2188+ <data>
2189+
2190+ <record id="wizard_spesometro_crea_comunicazione" model="ir.ui.view">
2191+ <field name="name">Crea comunicazione</field>
2192+ <field name="model">wizard.spesometro.crea.comunicazione</field>
2193+ <field name="type">form</field>
2194+ <field name="arch" type="xml">
2195+ <form string="Dati comunicazione">
2196+ <field name="company_id"/>
2197+ <newline/>
2198+ <field name="tipo_fornitore"/>
2199+ <field name="partner_intermediario" attrs="{'invisible': [('tipo_fornitore', '=', '01')], 'required': [('tipo_fornitore', '=', '10')]}"/>
2200+ <newline/>
2201+ <separator colspan="4"/>
2202+ <field name="periodo"/>
2203+ <field name="anno"/>
2204+ <field name="trimestre" attrs="{'invisible': [('periodo', '!=', 'trimestre')], 'required': [('periodo', '=', 'trimestre')]}"/>
2205+ <field name="mese" attrs="{'invisible': [('periodo', '!=', 'mese')], 'required': [('periodo', '=', 'mese')]}"/>
2206+ <separator colspan="4"/>
2207+ <field name="tipo"/>
2208+ <field name="comunicazione_da_sostituire_annullare" attrs="{'invisible': [('tipo', '=', 'ordinaria')]}" />
2209+ <field name="documento_da_sostituire_annullare" attrs="{'invisible': [('tipo', '=', 'ordinaria')]}"/>
2210+ <field name="formato_dati"/>
2211+ <newline/>
2212+ <group colspan="2">
2213+ <field name="quadro_FA" attrs="{'invisible': [('formato_dati', '!=', 'aggregati')]}" />
2214+ <field name="quadro_SA" attrs="{'invisible': [('formato_dati', '!=', 'aggregati')]}" />
2215+
2216+ <field name="quadro_SE" attrs="{'invisible': [('formato_dati', '!=', 'analitici')]}"/>
2217+ <field name="quadro_FE" attrs="{'invisible': [('formato_dati', '!=', 'analitici')]}" readonly="1"/>
2218+ <field name="quadro_FR" attrs="{'invisible': [('formato_dati', '!=', 'analitici')]}" readonly="1"/>
2219+ <field name="quadro_NE" attrs="{'invisible': [('formato_dati', '!=', 'analitici')]}" readonly="1"/>
2220+ </group>
2221+ <group colspan="2">
2222+ <field name="quadro_BL" attrs="{'invisible': [('formato_dati', '!=', 'aggregati')]}" />
2223+
2224+ <field name="quadro_NR" attrs="{'invisible': [('formato_dati', '!=', 'analitici')]}" readonly="1"/>
2225+ <field name="quadro_DF" attrs="{'invisible': [('formato_dati', '!=', 'analitici')]}" readonly="1"/>
2226+ <field name="quadro_FN" attrs="{'invisible': [('formato_dati', '!=', 'analitici')]}" readonly="1"/>
2227+ <field name="quadro_TU" attrs="{'invisible': [('formato_dati', '!=', 'analitici')]}" readonly="1"/>
2228+ </group>
2229+ <group colspan="4">
2230+ <separator colspan="4"/>
2231+ <button icon="gtk-cancel" special="cancel" string="Cancel"/>
2232+ <button icon="gtk-ok" name="genera_comunicazione" string="Crea" type="object"/>
2233+ </group>
2234+ </form>
2235+ </field>
2236+ </record>
2237+
2238+ <record id="wizard_spesometro_crea_comunicazione_action" model="ir.actions.act_window">
2239+ <field name="name">Nuova comunicazione</field>
2240+ <field name="type">ir.actions.act_window</field>
2241+ <field name="res_model">wizard.spesometro.crea.comunicazione</field>
2242+ <field name="view_type">form</field>
2243+ <field name="view_mode">form</field>
2244+ <field name="target">new</field>
2245+ <field name="view_id" ref="wizard_spesometro_crea_comunicazione"/>
2246+ <!-- <field name="search_view_id" ref="spesometro_comunicazione_search" /> -->
2247+ </record>
2248+
2249+ <menuitem id="menu_spesometro_crea_comunicazione" action="wizard_spesometro_crea_comunicazione_action"
2250+ name="Nuova comunicazione" parent="menu_spesometro_main"/>
2251+ </data>
2252+</openerp>
2253
2254=== added file 'l10n_it_spesometro/wizard/wizard_default.py'
2255--- l10n_it_spesometro/wizard/wizard_default.py 1970-01-01 00:00:00 +0000
2256+++ l10n_it_spesometro/wizard/wizard_default.py 2014-03-20 14:19:55 +0000
2257@@ -0,0 +1,65 @@
2258+# -*- coding: utf-8 -*-
2259+##############################################################################
2260+#
2261+# Author: Alessandro Camilli (a.camilli@yahoo.it)
2262+# Copyright (C) 2014
2263+# Associazione OpenERP Italia (<http://www.openerp-italia.org>)
2264+#
2265+# This program is free software: you can redistribute it and/or modify
2266+# it under the terms of the GNU Affero General Public License as published
2267+# by the Free Software Foundation, either version 3 of the License, or
2268+# (at your option) any later version.
2269+#
2270+# This program is distributed in the hope that it will be useful,
2271+# but WITHOUT ANY WARRANTY; without even the implied warranty of
2272+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2273+# GNU General Public License for more details.
2274+#
2275+# You should have received a copy of the GNU Affero General Public License
2276+# along with this program. If not, see <http://www.gnu.org/licenses/>.
2277+#
2278+##############################################################################
2279+
2280+from osv import fields,osv
2281+from tools.translate import _
2282+import time
2283+
2284+class wizard_spesometro_default(osv.osv_memory):
2285+
2286+ def default_get(self, cr, uid, fields, context=None):
2287+
2288+ res = super(wizard_spesometro_default, self).default_get(cr, uid, fields, context=context)
2289+ res = {
2290+ 'partner_spesometro_escludi' : False,
2291+ 'partner_spesometro_operazione' : 'FA'
2292+ }
2293+ return res
2294+
2295+ _name = "wizard.spesometro.default"
2296+
2297+ _columns = {
2298+ 'partner_spesometro_escludi': fields.boolean('Da Escludere'),
2299+ 'partner_spesometro_operazione': fields.selection((('FA','Operazioni documentate da fattura'),
2300+ ('SA','Operazioni senza fattura'),
2301+ ('BL1','Operazioni con paesi con fiscalit� privilegiata'),
2302+ ('BL2','Operazioni con soggetti non residenti'),
2303+ ('BL3','Acquisti di servizi da soggetti non residenti')),
2304+ 'Operazione' ),
2305+ }
2306+
2307+
2308+ def setting_default(self, cr, uid, ids, context=None):
2309+
2310+ partners_obj = self.pool.get('res.partner')
2311+ wizard = self.read(cr, uid, ids)[0]
2312+ vals = {
2313+ 'spesometro_escludi': wizard.get('partner_spesometro_escludi'),
2314+ 'spesometro_operazione': wizard.get('partner_spesometro_operazione'),
2315+ }
2316+
2317+ partners_ids = partners_obj.search(cr, uid, [('id','!=', 0)], context=context)
2318+ partners_obj.write(cr, uid, partners_ids, vals)
2319+
2320+ return {
2321+ 'type': 'ir.actions.act_window_close',
2322+ }
2323
2324=== added file 'l10n_it_spesometro/wizard/wizard_default_view.xml'
2325--- l10n_it_spesometro/wizard/wizard_default_view.xml 1970-01-01 00:00:00 +0000
2326+++ l10n_it_spesometro/wizard/wizard_default_view.xml 2014-03-20 14:19:55 +0000
2327@@ -0,0 +1,39 @@
2328+<?xml version="1.0" encoding="utf-8"?>
2329+<openerp>
2330+ <data>
2331+
2332+ <record id="wizard_spesometro_default_view" model="ir.ui.view">
2333+ <field name="name">Spesometro default</field>
2334+ <field name="model">wizard.spesometro.default</field>
2335+ <field name="type">form</field>
2336+ <field name="arch" type="xml">
2337+ <form string="Dati comunicazione">
2338+ <group string="Partner">
2339+ <field name="partner_spesometro_escludi"/>
2340+ <field name="partner_spesometro_operazione"/>
2341+ </group>
2342+
2343+ <newline/>
2344+ <group colspan="4">
2345+ <separator colspan="4"/>
2346+ <button icon="gtk-cancel" special="cancel" string="Cancel"/>
2347+ <button icon="gtk-ok" name="setting_default" string="Imposta default" type="object"/>
2348+ </group>
2349+ </form>
2350+ </field>
2351+ </record>
2352+
2353+ <record id="wizard_spesometro_default_action" model="ir.actions.act_window">
2354+ <field name="name">Spesometro default</field>
2355+ <field name="type">ir.actions.act_window</field>
2356+ <field name="res_model">wizard.spesometro.default</field>
2357+ <field name="view_type">form</field>
2358+ <field name="view_mode">form</field>
2359+ <field name="target">new</field>
2360+ <field name="view_id" ref="wizard_spesometro_default_view"/>
2361+ </record>
2362+
2363+ <menuitem id="menu_spesometro_default" action="wizard_spesometro_default_action"
2364+ name="Impostazione Default" parent="menu_spesometro_main"/>
2365+ </data>
2366+</openerp>
2367
2368=== added file 'l10n_it_spesometro/wizard/wizard_export.py'
2369--- l10n_it_spesometro/wizard/wizard_export.py 1970-01-01 00:00:00 +0000
2370+++ l10n_it_spesometro/wizard/wizard_export.py 2014-03-20 14:19:55 +0000
2371@@ -0,0 +1,722 @@
2372+# -*- coding: utf-8 -*-
2373+#################################################################################
2374+# Author: Alessandro Camilli (a.camilli@yahoo.it)
2375+# Copyright (C) 2014
2376+# Associazione OpenERP Italia (<http://www.openerp-italia.org>)
2377+#
2378+# This program is free software: you can redistribute it and/or modify
2379+# it under the terms of the GNU General Public License as published by
2380+# the Free Software Foundation, either version 3 of the License, or
2381+# (at your option) any later version.
2382+#
2383+# This program is distributed in the hope that it will be useful,
2384+# but WITHOUT ANY WARRANTY; without even the implied warranty of
2385+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2386+# GNU General Public License for more details.
2387+#
2388+# You should have received a copy of the GNU General Public License
2389+# along with this program. If not, see <http://www.gnu.org/licenses/>.
2390+#
2391+##############################################################################
2392+
2393+from osv import fields,osv
2394+from tools.translate import _
2395+from datetime import datetime
2396+from StringIO import StringIO
2397+import base64
2398+from decimal import *
2399+
2400+class wizard_spesometro_export(osv.osv_memory):
2401+
2402+ _name = "wizard.spesometro.export"
2403+ _description = 'Use this wizard to export fiscal file'
2404+ _columns={
2405+ 'file_spesometro': fields.binary('File spesometro', readonly=True),
2406+ }
2407+
2408+ def _split_string_positional_field(self, string):
2409+ '''
2410+ Da manuale:
2411+ Con riferimento ai campi non posizionali, nel caso in cui la lunghezza del dato da inserire
2412+ ecceda i 16 caratteri disponibili, dovrà essere inserito un ulteriore elemento con un identico
2413+ campo-codice e con un campo-valore il cui primo carattere dovrà essere impostato con il simbolo “+”,
2414+ mentre i successivi quindici potranno essere utilizzati per la continuazione del dato da inserire.
2415+ Tale situazione può verificarsi solo per alcuni campi con formato AN.
2416+ '''
2417+ # Prima parte:
2418+ res = []
2419+ res.append(string[:16])
2420+ length = 15
2421+ # Parte in eccesso:
2422+ str_eccesso = string[16:]
2423+ str_split = [str_eccesso[i:i+length] for i in range(0, len(str_eccesso), length)]
2424+ for s in str_split:
2425+ new_string = '+' + s
2426+ res.append(new_string)
2427+ return res
2428+
2429+ def _record_A(self, cr, uid, comunicazione, context=None):
2430+
2431+ if not comunicazione.soggetto_trasmissione_codice_fiscale:
2432+ raise osv.except_osv(_('Errore comunicazione!'),_("Manca il codice fiscale dell'incaricato alla trasmissione"))
2433+
2434+ rcd = "A"
2435+ rcd += '{:14s}'.format("") # Filler
2436+ rcd += "NSP00" # codice fornitura
2437+ rcd += comunicazione.tipo_fornitore # 01 - Soggetti che inviano la propria comunicazione 10 -Intermediari
2438+ rcd += '{:16s}'.format(comunicazione.soggetto_trasmissione_codice_fiscale) # cd fiscale (se intermediaro va messo quello dell'intermediario)
2439+ rcd += '{:483s}'.format("")# Filler
2440+ #rcd += '{:4s}'.format(str(comunicazione.progressivo_telematico).zfill(4)) # dich.su più invii: Progressivo dell'invio telematico
2441+ rcd += '{:4s}'.format("0".zfill(4)) # dich.su più invii: Progressivo dell'invio telematico
2442+ rcd += '{:4s}'.format("0".zfill(4)) # dich.su più invii: Numero totale degli invii telematici
2443+ rcd += '{:100s}'.format("") # Filler
2444+ rcd += '{:1068s}'.format("") # Filler
2445+ rcd += '{:200s}'.format("") # Filler
2446+ rcd += "A" # Impostare al valore "A"
2447+ rcd += "\r" #
2448+ rcd += "\n" #
2449+
2450+ return rcd
2451+
2452+ def _record_B(self, cr, uid, comunicazione, context=None):
2453+ rcd = "B"
2454+ rcd += '{:16s}'.format(comunicazione.soggetto_codice_fiscale)
2455+ rcd += '{:8s}'.format("1".zfill(8)) # Progressivo modulo - vale 1
2456+ rcd += '{:3s}'.format("") # Spazio a disposizione dell'utente
2457+ rcd += '{:25s}'.format("") # Filler
2458+ rcd += '{:20s}'.format("") # Spazio a disposizione dell'utente
2459+ rcd += '{:16s}'.format("") # Identificativo del produttore del software (codice fiscale)
2460+ # tipo comunicazione ( alterntative: ordinaria,sostitutiva o di annullamento )
2461+ if comunicazione.tipo == 'ordinaria':
2462+ rcd += "1"
2463+ else:
2464+ rcd += "0"
2465+ if comunicazione.tipo == 'sostitutiva':
2466+ rcd += "1"
2467+ else:
2468+ rcd += "0"
2469+ if comunicazione.tipo == 'annullamento':
2470+ rcd += "1"
2471+ else:
2472+ rcd += "0"
2473+ # campi x annullamento e sostituzione
2474+ if comunicazione.comunicazione_da_sostituire_annullare == 0:
2475+ rcd += '{:17s}'.format("".zfill(17))
2476+ else:
2477+ rcd += '{:17s}'.format(str(comunicazione_da_sostituire_annullare).zfill(17))
2478+ if comunicazione.documento_da_sostituire_annullare == 0:
2479+ rcd += '{:6s}'.format("".zfill(6))
2480+ else:
2481+ rcd += '{:6s}'.format(str(comunicazione.documento_da_sostituire_annullare).zfill(6))
2482+ # formato dati: aggregata o analitica (caselle alternative)
2483+ if comunicazione.formato_dati == 'aggregati':
2484+ rcd += "10"
2485+ else:
2486+ rcd += "01"
2487+ # Quadri compilati
2488+ if comunicazione.line_FA_ids :
2489+ rcd += "1"
2490+ else:
2491+ rcd += "0"
2492+ if comunicazione.line_SA_ids :
2493+ rcd += "1"
2494+ else:
2495+ rcd += "0"
2496+ if comunicazione.line_BL_ids :
2497+ rcd += "1"
2498+ else:
2499+ rcd += "0"
2500+ #if comunicazione.quadro_FE :
2501+ # rcd += "1"
2502+ #else:
2503+ rcd += "0"
2504+ #if comunicazione.quadro_FR :
2505+ # rcd += "1"
2506+ #else:
2507+ rcd += "0"
2508+ #if comunicazione.quadro_NE :
2509+ # rcd += "1"
2510+ #else:
2511+ rcd += "0"
2512+ #if comunicazione.quadro_NR :
2513+ # rcd += "1"
2514+ #else:
2515+ rcd += "0"
2516+ #if comunicazione.quadro_DF :
2517+ # rcd += "1"
2518+ #else:
2519+ rcd += "0"
2520+ #if comunicazione.quadro_FN :
2521+ # rcd += "1"
2522+ #else:
2523+ rcd += "0"
2524+ if comunicazione.line_SE_ids :
2525+ rcd += "1"
2526+ else:
2527+ rcd += "0"
2528+ #if comunicazione.quadro_TU :
2529+ # rcd += "1"
2530+ #else:
2531+ rcd += "0"
2532+
2533+ rcd += "1" # Quadro TA - RIEPILOGO
2534+ #Partita IVA , Codice Attività e riferimenti del Soggetto cui si riferisce la comunicazione
2535+ rcd += '{:11s}'.format(comunicazione.soggetto_partitaIVA) # PARTITA IVA
2536+ if not comunicazione.soggetto_codice_attivita:
2537+ raise osv.except_osv(_('Errore comunicazione!'),_("Manca il codice attività"))
2538+ rcd += '{:6s}'.format(comunicazione.soggetto_codice_attivita) # CODICE attività (6 caratteri) --> obbligatorio
2539+ tel = comunicazione.soggetto_telefono
2540+ rcd += '{:12s}'.format(tel.replace(' ','') or '') # telefono
2541+ fax = comunicazione.soggetto_fax
2542+ rcd += '{:12s}'.format(fax.replace(' ','') or '') # fax
2543+ rcd += '{:50s}'.format(comunicazione.soggetto_email or '') # ind posta elettronica
2544+ # Dati Anagrafici del Soggetto cui si riferisce la comunicazione - Persona Fisica
2545+ if comunicazione.soggetto_forma_giuridica == 'persona_fisica':
2546+ if not comunicazione.soggetto_pf_cognome or not comunicazione.soggetto_pf_nome or not comunicazione.soggetto_pf_sesso \
2547+ or not comunicazione.soggetto_pf_data_nascita or not comunicazione.soggetto_pf_comune_nascita or not comunicazione.soggetto_pf_provincia_nascita:
2548+ raise osv.except_osv(_('Errore comunicazione!'),_("Soggetto obbligato: Inserire tutti i dati della persona fisica"))
2549+ rcd += '{:24s}'.format(comunicazione.soggetto_pf_cognome) # cognome
2550+ rcd += '{:20s}'.format(comunicazione.soggetto_pf_nome) # nome
2551+ rcd += '{:1s}'.format(comunicazione.soggetto_pf_sesso) # sesso
2552+ rcd += '{:8s}'.format(datetime.strptime(comunicazione.soggetto_pf_data_nascita, "%Y-%m-%d").strftime("%d%m%Y")) # data nascita
2553+ rcd += '{:40s}'.format(comunicazione.soggetto_pf_comune_nascita) # comune di nascita
2554+ rcd += '{:2s}'.format(comunicazione.soggetto_pf_provincia_nascita) # provincia comune di nascita
2555+ rcd += '{:60s}'.format("") # persona giuridica
2556+ else:
2557+ if not comunicazione.soggetto_pg_denominazione:
2558+ raise osv.except_osv(_('Errore comunicazione!'),_("Soggetto obbligato: Inserire tutti i dati della persona giuridica"))
2559+ rcd += '{:24s}'.format("") # cognome
2560+ rcd += '{:20s}'.format("") # nome
2561+ rcd += '{:1s}'.format("") # sesso
2562+ rcd += '{:8s}'.format("".zfill(8)) # data nascita
2563+ rcd += '{:40s}'.format("") # comune di nascita
2564+ rcd += '{:2s}'.format("") # provincia comune di nascita
2565+ rcd += '{:60s}'.format(comunicazione.soggetto_pg_denominazione) # persona giuridica
2566+
2567+ rcd += '{:4d}'.format(comunicazione.anno) # anno riferimento
2568+ # Mese di riferimento : Da valorizzare obbligatoriamente solo se presenti Acquisti da Operatori di San Marino. In tutti gli altri casi non deve essere compilato
2569+ if comunicazione.periodo == 'trimestre' and comunicazione.trimestre:
2570+ rcd += '{:2s}'.format( str(comunicazione.trimestre) + "T")
2571+ elif comunicazione.periodo == 'mese' and comunicazione.mese:
2572+ rcd += '{:2s}'.format( str(comunicazione.mese).zfill(2))
2573+ else:
2574+ rcd += '{:2s}'.format("")
2575+ # Dati del Soggetto tenuto alla comunicazione (soggetto che effettua la comunicazione, se diverso dal soggetto cui si riferisce la comunicazione)
2576+ rcd += '{:16s}'.format(comunicazione.soggetto_cm_codice_fiscale or "")
2577+ rcd += '{:2s}'.format(comunicazione.tipo_fornitore or "01") # codice carica
2578+ rcd += '{:8s}'.format("".zfill(8)) # data inizio procedura
2579+ rcd += '{:8s}'.format("".zfill(8)) # data fine procedura
2580+ # Dati anagrafici del soggetto tenuto alla comunicazione - Persona fisica
2581+ # (Obbligatorio e da compilare solo se si tratta di Persona Fisica. )
2582+ if comunicazione.soggetto_cm_forma_giuridica == 'persona_fisica':
2583+ if not comunicazione.soggetto_cm_pf_cognome or not comunicazione.soggetto_cm_pf_nome or not comunicazione.soggetto_cm_pf_sesso \
2584+ or not comunicazione.soggetto_cm_pf_data_nascita or not comunicazione.soggetto_cm_pf_comune_nascita or not comunicazione.soggetto_cm_pf_provincia_nascita:
2585+ raise osv.except_osv(_('Errore comunicazione!'),_("Soggetto tenuto alla comunicazione: Inserire tutti i dati della persona fisica"))
2586+ rcd += '{:24s}'.format(comunicazione.soggetto_cm_pf_cognome) # cognome
2587+ rcd += '{:20s}'.format(comunicazione.soggetto_cm_pf_nome) # nome
2588+ rcd += '{:1s}'.format(comunicazione.soggetto_cm_pf_sesso) # sesso
2589+ rcd += '{:8s}'.format(datetime.strptime(comunicazione.soggetto_cm_pf_data_nascita, "%Y-%m-%d").strftime("%d%m%Y")) # data nascita
2590+ rcd += '{:40s}'.format(comunicazione.soggetto_cm_pf_comune_nascita) # comune di nascita
2591+ rcd += '{:2s}'.format(comunicazione.soggetto_cm_pf_provincia_nascita) # provincia comune di nascita
2592+ rcd += '{:60s}'.format("") # persona giuridica
2593+ else:
2594+ if not comunicazione.soggetto_cm_pg_denominazione:
2595+ raise osv.except_osv(_('Errore comunicazione!'),_("Soggetto tenuto alla comunicazione: Inserire tutti i dati della persona giuridica"))
2596+ rcd += '{:24s}'.format("") # cognome
2597+ rcd += '{:20s}'.format("") # nome
2598+ rcd += '{:1s}'.format("") # sesso
2599+ rcd += '{:8s}'.format("".zfill(8)) # data nascita
2600+ rcd += '{:40s}'.format("") # comune di nascita
2601+ rcd += '{:2s}'.format("") # provincia comune di nascita
2602+ rcd += '{:60s}'.format(comunicazione.soggetto_cm_pg_denominazione) # persona giuridica
2603+
2604+ # Impegno alla trasmissione telematica
2605+ if comunicazione.tipo_fornitore == '10' and not comunicazione.soggetto_trasmissione_codice_fiscale:
2606+ raise osv.except_osv(_('Errore comunicazione!'),_("Manca il codice fiscale dell'intermediario incaricato alla trasmissione telematica"))
2607+ rcd += '{:16s}'.format(comunicazione.soggetto_trasmissione_codice_fiscale or '') # Codice fiscale dell'intermediario
2608+ rcd += '{:5s}'.format(str(comunicazione.soggetto_trasmissione_numero_CAF).zfill(5)) # Numero di iscrizione all'albo del C.A.F.
2609+ rcd += '{:1s}'.format(comunicazione.soggetto_trasmissione_impegno)# Impegno a trasmettere in via telematica la comunicazione
2610+ # Dato obbligatorio Vale 1 se la comunicazione è stata predisposta dal soggetto obbligato
2611+ # Vale 2 se è stata predisposta dall'intermediario.
2612+ rcd += '{:1s}'.format("") # Filler
2613+ if not comunicazione.soggetto_trasmissione_data_impegno:
2614+ raise osv.except_osv(_('Errore comunicazione!'),_("Manca la data dell'impegno alla trasmissione"))
2615+ rcd += '{:8s}'.format(datetime.strptime(comunicazione.soggetto_trasmissione_data_impegno, "%Y-%m-%d").strftime("%d%m%Y")) # Data dell'impegno
2616+ # Spazio riservato al Servizio telematico
2617+ rcd += '{:1258s}'.format("") # Filler
2618+ rcd += '{:20s}'.format("") # Spazio riservato al Servizio Telematico
2619+ rcd += '{:18s}'.format("") # Filler
2620+ # Ultimi caratteri di controllo
2621+ rcd += "A" # Impostare al valore "A"
2622+ rcd += "\r" #
2623+ rcd += "\n" #
2624+
2625+ return rcd
2626+
2627+ def _record_C_FA(self, cr, uid, line, prog_modulo, prog_sezione, context=None):
2628+ prog_sezione = str(prog_sezione).zfill(3)
2629+
2630+ rcd = "C"
2631+ rcd += '{:16s}'.format(line.comunicazione_id.soggetto_codice_fiscale) # codice fiscale soggetto obbligato
2632+ rcd += '{:8s}'.format(str(prog_modulo).zfill(8)) # Progressivo modulo
2633+ rcd += '{:3s}'.format("") # Filler
2634+ rcd += '{:25s}'.format("") # Filler
2635+ rcd += '{:20s}'.format("") # Spazio utente
2636+ rcd += '{:16s}'.format("") # Filler
2637+
2638+ # QUADRO FA
2639+ # Partita iva o codice fiscale presenti se non si tratta di documento riepilogativo(ES: scheda carburante)
2640+ if not line.partita_iva and not line.codice_fiscale and not line.documento_riepilogativo:
2641+ raise osv.except_osv(_('Errore comunicazione!'),_("Inserire Codice Fiscale o partita IVA su partner %s") % (line.partner_id.name,))
2642+ # Doc. riepilogativo : non ammessi codice fiscale o partita iva
2643+ if line.documento_riepilogativo and (line.partita_iva or line.codice_fiscale) :
2644+ raise osv.except_osv(_('Errore comunicazione!'),_("Documento riepilogativo per partner %s, togliere Codice Fiscale E partita IVA") % (line.partner_id.name,))
2645+
2646+ if line.partita_iva:
2647+ rcd += '{:8s}'.format("FA" + prog_sezione + "001" )
2648+ rcd += '{:16s}'.format(line.partita_iva)
2649+ elif line.codice_fiscale:
2650+ rcd += '{:8s}'.format("FA" + prog_sezione + "002" )
2651+ rcd += '{:16s}'.format(line.codice_fiscale)
2652+ if line.documento_riepilogativo:
2653+ rcd += '{:8s}'.format("FA" + prog_sezione + "003" ) + '{:>16s}'.format('1')
2654+ # Numero operazioni attive aggregate
2655+ if line.numero_operazioni_attive_aggregate > 0:
2656+ rcd += '{:8s}'.format("FA" + prog_sezione + "004" ) + '{:16d}'.format(line.numero_operazioni_attive_aggregate)
2657+ # Numero operazioni passive aggregate
2658+ if line.numero_operazioni_passive_aggregate > 0:
2659+ rcd += '{:8s}'.format("FA" + prog_sezione + "005" ) + '{:16d}'.format(line.numero_operazioni_passive_aggregate)
2660+ # Noleggio / Leasing
2661+ if line.noleggio:
2662+ rcd += '{:8s}'.format("FA" + prog_sezione + "006" ) + '{:16s}'.format(line.noleggio)
2663+
2664+ # OPERAZIONI ATTIVE
2665+ if line.attive_imponibile_non_esente > 0:
2666+ rcd += '{:8s}'.format("FA" + prog_sezione + "007" ) + '{:16.0f}'.format(line.attive_imponibile_non_esente)
2667+ # Totale imposta
2668+ if line.attive_imposta > 0:
2669+ rcd += '{:8s}'.format("FA" + prog_sezione + "008" ) + '{:16.0f}'.format(line.attive_imposta)
2670+ # Totale operazioni con IVA non esposta
2671+ if line.attive_operazioni_iva_non_esposta > 0:
2672+ rcd += '{:8s}'.format("FA" + prog_sezione + "009" ) + '{:16.0f}'.format(line.attive_operazioni_iva_non_esposta)
2673+ # Totale note di variazione a debito per la controparte
2674+ if line.attive_note_variazione > 0:
2675+ rcd += '{:8s}'.format("FA" + prog_sezione + "010" ) + '{:16.0f}'.format(line.attive_note_variazione)
2676+ if line.attive_note_variazione_imposta > 0:
2677+ rcd += '{:8s}'.format("FA" + prog_sezione + "011" ) + '{:16.0f}'.format(line.attive_note_variazione_imposta)
2678+
2679+ # OPERAZIONI PASSIVE
2680+ # Totale operazioni imponibili, non imponibili ed esenti
2681+ if line.passive_imponibile_non_esente > 0:
2682+ rcd += '{:8s}'.format("FA" + prog_sezione + "012" ) + '{:16.0f}'.format(line.passive_imponibile_non_esente)
2683+ if line.passive_imposta > 0:
2684+ rcd += '{:8s}'.format("FA" + prog_sezione + "013" ) + '{:16.0f}'.format(line.passive_imposta)
2685+ if line.passive_operazioni_iva_non_esposta > 0:
2686+ rcd += '{:8s}'.format("FA" + prog_sezione + "014" ) + '{:16.0f}'.format(line.passive_operazioni_iva_non_esposta)
2687+ if line.passive_note_variazione > 0:
2688+ rcd += '{:8s}'.format("FA" + prog_sezione + "015" ) + '{:16.0f}'.format(line.passive_note_variazione)
2689+ if line.passive_note_variazione_imposta > 0:
2690+ rcd += '{:8s}'.format("FA" + prog_sezione + "016" ) + '{:16.0f}'.format(line.passive_note_variazione_imposta)
2691+
2692+ # riempio fino a 1900 caratteri
2693+ rcd += " " * (1897 -len(rcd))
2694+ # Ultimi caratteri di controllo
2695+ rcd += "A" # Impostare al valore "A"
2696+ rcd += "\r" #
2697+ rcd += "\n" #
2698+
2699+ return rcd
2700+
2701+ def _record_C_SA(self, cr, uid, line, prog_modulo, prog_sezione, context=None):
2702+ prog_sezione = str(prog_sezione).zfill(3)
2703+
2704+ if not line.codice_fiscale:
2705+ raise osv.except_osv(_('Errore comunicazione!'),_("Manca codice fiscale su partner %s") % (line.partner_id.name,))
2706+ rcd = "C"
2707+ rcd += '{:16s}'.format(line.comunicazione_id.soggetto_codice_fiscale) # codice fiscale soggetto obbligato
2708+ rcd += '{:8s}'.format(str(prog_modulo).zfill(8)) # Progressivo modulo
2709+ rcd += '{:3s}'.format("") # Filler
2710+ rcd += '{:25s}'.format("") # Filler
2711+ rcd += '{:20s}'.format("") # Spazio utente
2712+ rcd += '{:16s}'.format("") # Filler
2713+
2714+ rcd += '{:8s}'.format("SA" + prog_sezione + "001" ) + '{:16s}'.format(line.codice_fiscale)
2715+ if line.numero_operazioni:
2716+ rcd += '{:8s}'.format("SA" + prog_sezione + "002" ) + '{:16d}'.format(line.numero_operazioni)
2717+ if line.importo_complessivo:
2718+ rcd += '{:8s}'.format("SA" + prog_sezione + "003" ) + '{:16.0f}'.format(line.importo_complessivo)
2719+ if line.noleggio:
2720+ rcd += '{:8s}'.format("SA" + prog_sezione + "004" ) + '{:16s}'.format(line.noleggio)
2721+
2722+ # riempio fino a 1900 caratteri
2723+ rcd += " " * (1897 -len(rcd))
2724+ # Ultimi caratteri di controllo
2725+ rcd += "A" # Impostare al valore "A"
2726+ rcd += "\r" #
2727+ rcd += "\n" #
2728+
2729+ return rcd
2730+
2731+ def _record_C_BL(self, cr, uid, line, prog_modulo, prog_sezione, context=None):
2732+
2733+ prog_sezione = str(prog_sezione).zfill(3)
2734+
2735+ # Controlli
2736+ # ...Operazioni con paesi con fiscalità privilegiata (è obbligatorio compilare le sezioni BL001, BL002 e almeno un campo delle sezioni BL003, BL004, BL005, BL006, BL007, BL008)
2737+ if line.operazione_fiscalita_privilegiata:
2738+ if (not line.pf_cognome or not line.pf_nome) and not line.pg_denominazione:
2739+ raise osv.except_osv(_("Errore quadro BL"), _(" - Partner %s! Cognome e nome obbligatori oppure ragione sociale per soggetto giuridico") % (line.partner_id.name ,) )
2740+ # ...Operazioni con soggetti non residenti (è obbligatorio compilare le sezioni BL001, BL002 e almeno un campo delle sezioni BL003 e BL006)
2741+ if line.operazione_con_soggetti_non_residenti:
2742+ if (not line.pf_cognome or not line.pf_nome) and not line.pg_denominazione:
2743+ raise osv.except_osv(_("Errore quadro BL"), _(" - Partner %s! Cognome e nome obbligatori oppure ragione sociale per soggetto giuridico") % (line.partner_id.name ,) )
2744+ if line.pf_cognome and not line.pf_data_nascita and not line.pf_codice_stato_estero:
2745+ raise osv.except_osv(_("Errore quadro BL - Partner %s! Inserire alemno uno dei seguenti valori: \
2746+ Pers.Fisica-Data di nascita, Pers.Fisica-Codice Stato") % (line.partner_id.name ,) )
2747+ # ...Acquisti di servizi da soggetti non residenti (è obbligatorio compilare le sezioni BL001, BL002 e almeno un campo della sezione BL006)
2748+ if line.Acquisto_servizi_da_soggetti_non_residenti:
2749+ if (not line.pf_cognome or not line.pf_nome) and not line.pg_denominazione:
2750+ raise osv.except_osv(_("Errore quadro BL"), _(" - Partner %s! Cognome e nome obbligatori oppure ragione sociale per soggetto giuridico") % (line.partner_id.name ,) )
2751+ if line.pf_cognome and not line.pf_data_nascita and not line.pf_codice_stato_estero:
2752+ raise osv.except_osv(_("Errore quadro BL"), _(" - Partner %s! Inserire alemno uno dei seguenti valori: \
2753+ Pers.Fisica-Data di nascita, Pers.Fisica-Codice Stato") % (line.partner_id.name ,) )
2754+
2755+ rcd = "C"
2756+ rcd += '{:16s}'.format(line.comunicazione_id.soggetto_codice_fiscale) # codice fiscale soggetto obbligato
2757+ rcd += '{:8s}'.format(str(prog_modulo).zfill(8)) # Progressivo modulo
2758+ rcd += '{:3s}'.format("") # Filler
2759+ rcd += '{:25s}'.format("") # Filler
2760+ rcd += '{:20s}'.format("") # Spazio utente
2761+ rcd += '{:16s}'.format("") # Filler
2762+
2763+ # Dati anagrafici
2764+ # .. persona fisica
2765+ if line.pf_cognome:
2766+ if not line.pf_nome or not line.pf_data_nascita or not line.pf_comune_stato_nascita or not line.pf_provincia_nascita \
2767+ or not line.pf_codice_stato_estero:
2768+ raise osv.except_osv('Error', _('Completare dati persona fisica nel quadro BL del partner: %s') %(line.partner_id.name,))
2769+ str_split = self._split_string_positional_field(line.pf_cognome)
2770+ for s in str_split:
2771+ rcd += '{:8s}'.format("BL" + "001" + "001" ) + '{:16s}'.format(s)
2772+ str_split = self._split_string_positional_field(line.pf_nome)
2773+ for s in str_split:
2774+ rcd += '{:8s}'.format("BL" + "001" + "002" ) + '{:16s}'.format(s)
2775+ rcd += '{:8s}'.format("BL" + "001" + "003" ) + '{:16s}'.format(datetime.strptime(line.pf_data_nascita, "%Y-%m-%d").strftime("%d%m%Y")) # Data di nascita
2776+ str_split = self._split_string_positional_field(line.pf_comune_stato_nascita)
2777+ for s in str_split:
2778+ rcd += '{:8s}'.format("BL" + "001" + "004" ) + '{:16s}'.format(s)
2779+ rcd += '{:8s}'.format("BL" + "001" + "005" ) + '{:16s}'.format(line.pf_provincia_nascita)
2780+ rcd += '{:8s}'.format("BL" + "001" + "006" ) + '{:>16s}'.format(line.pf_codice_stato_estero)
2781+ # .. persona giuridica
2782+ if line.pg_denominazione:
2783+ if not line.pg_citta_estera_sede_legale or not line.pg_codice_stato_estero or not line.pg_indirizzo_sede_legale:
2784+ 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,))
2785+ str_split = self._split_string_positional_field(line.pg_denominazione)
2786+ for s in str_split:
2787+ rcd += '{:8s}'.format("BL" + "001" + "007" ) + '{:16s}'.format(s)
2788+ str_split = self._split_string_positional_field(line.pg_citta_estera_sede_legale)
2789+ for s in str_split:
2790+ rcd += '{:8s}'.format("BL" + "001" + "008" ) + '{:16s}'.format(s)
2791+ rcd += '{:8s}'.format("BL" + "001" + "009" ) + '{:>16s}'.format(line.pg_codice_stato_estero)
2792+ str_split = self._split_string_positional_field(line.pg_indirizzo_sede_legale)
2793+ for s in str_split:
2794+ rcd += '{:8s}'.format("BL" + "001" + "010" ) + '{:16s}'.format(s)
2795+ # Codice identificativo IVA
2796+ if line.codice_identificativo_IVA:
2797+ rcd += '{:8s}'.format("BL" + "002" + "001" ) + '{:16s}'.format(line.codice_identificativo_IVA or '')
2798+ # Operazioni con paesi con fiscalità privilegiata
2799+ rcd += '{:8s}'.format("BL" + "002" + "002" )
2800+ if line.operazione_fiscalita_privilegiata:
2801+ rcd += '{:>16s}'.format("1")
2802+ else:
2803+ rcd += '{:>16s}'.format("0")
2804+
2805+ # Operazioni con soggetti non residenti
2806+ rcd += '{:8s}'.format("BL" + "002" + "003" )
2807+ if line.operazione_con_soggetti_non_residenti:
2808+ rcd += '{:>16s}'.format("1")
2809+ else:
2810+ rcd += '{:>16s}'.format("0")
2811+ # Acquisti di servizi da soggetti non residenti
2812+ rcd += '{:8s}'.format("BL" + "002" + "004" )
2813+ if line.Acquisto_servizi_da_soggetti_non_residenti:
2814+ rcd += '{:>16s}'.format("1")
2815+ else:
2816+ rcd += '{:>16s}'.format("0")
2817+
2818+
2819+ # OPERAZIONI ATTIVE
2820+ if line.attive_importo_complessivo > 0:
2821+ rcd += '{:8s}'.format("BL" + "003" + "001" ) + '{:16.0f}'.format(line.attive_importo_complessivo)
2822+ if line.attive_imposta > 0:
2823+ rcd += '{:8s}'.format("BL" + "003" + "002" ) + '{:16.0f}'.format(line.attive_imposta)
2824+
2825+ if line.operazione_fiscalita_privilegiata:
2826+ if line.attive_non_sogg_cessione_beni > 0:
2827+ rcd += '{:8s}'.format("BL" + "004" + "001" ) + '{:16.0f}'.format(line.attive_non_sogg_cessione_beni)
2828+ if line.attive_non_sogg_servizi > 0:
2829+ rcd += '{:8s}'.format("BL" + "004" + "002" ) + '{:16.0f}'.format(line.attive_non_sogg_servizi)
2830+ if line.attive_note_variazione > 0:
2831+ rcd += '{:8s}'.format("BL" + "005" + "001" ) + '{:16.0f}'.format(line.attive_note_variazione)
2832+ if line.attive_note_variazione_imposta > 0:
2833+ rcd += '{:8s}'.format("BL" + "005" + "002" ) + '{:16.0f}'.format(line.attive_note_variazione_imposta)
2834+
2835+ # OPERAZIONI PASSIVE
2836+ if line.passive_importo_complessivo > 0:
2837+ rcd += '{:8s}'.format("BL" + "006" + "001" ) + '{:16.0f}'.format(line.passive_importo_complessivo)
2838+ if line.passive_imposta > 0:
2839+ rcd += '{:8s}'.format("BL" + "006" + "002" ) + '{:16.0f}'.format(line.passive_imposta)
2840+
2841+ if line.operazione_fiscalita_privilegiata:
2842+ if line.passive_non_sogg_importo_complessivo > 0:
2843+ rcd += '{:8s}'.format("BL" + "007" + "001" ) + '{:16.0f}'.format(line.passive_non_sogg_importo_complessivo)
2844+ if line.passive_note_variazione > 0:
2845+ rcd += '{:8s}'.format("BL" + "008" + "001" ) + '{:16.0f}'.format(line.passive_note_variazione)
2846+ if line.passive_note_variazione_imposta > 0:
2847+ rcd += '{:8s}'.format("BL" + "008" + "002" ) + '{:16.0f}'.format(line.passive_note_variazione_imposta)
2848+
2849+ # riempio fino a 1900 caratteri
2850+ rcd += " " * (1897 -len(rcd))
2851+ # Ultimi caratteri di controllo
2852+ rcd += "A" # Impostare al valore "A"
2853+ rcd += "\r" #
2854+ rcd += "\n" #
2855+
2856+ return rcd
2857+
2858+ def _record_D_SE(self, cr, uid, line, prog_modulo, prog_sezione, context=None):
2859+
2860+ prog_sezione = str(prog_sezione).zfill(3)
2861+
2862+ # Controlli
2863+ # ...Cognome o Ragione sociale
2864+ if (not line.pf_cognome or not line.pf_nome) and not line.pg_denominazione:
2865+ raise osv.except_osv(_("Errore quadro SE"), _(" - Partner %s! Cognome e nome obbligatori oppure ragione sociale per soggetto giuridico") % (line.partner_id.name ,) )
2866+ # ...
2867+ if line.pf_cognome and not line.pf_data_nascita and not line.pf_codice_stato_estero:
2868+ raise osv.except_osv(_("Errore quadro SE - Partner %s! Inserire alemno uno dei seguenti valori: \
2869+ Pers.Fisica-Data di nascita, Pers.Fisica-Codice Stato") % (line.partner_id.name ,) )
2870+
2871+ rcd = "D"
2872+ rcd += '{:16s}'.format(line.comunicazione_id.soggetto_codice_fiscale) # codice fiscale soggetto obbligato
2873+ rcd += '{:8s}'.format(str(prog_modulo).zfill(8)) # Progressivo modulo
2874+ rcd += '{:3s}'.format("") # Filler
2875+ rcd += '{:25s}'.format("") # Filler
2876+ rcd += '{:20s}'.format("") # Spazio utente
2877+ rcd += '{:16s}'.format("") # Filler
2878+
2879+ # Dati anagrafici
2880+ # .. persona fisica
2881+ if line.pf_cognome:
2882+ if not line.pf_nome or not line.pf_data_nascita or not line.pf_comune_stato_nascita or not line.pf_provincia_nascita \
2883+ or not line.pf_codice_stato_estero:
2884+ raise osv.except_osv('Error', _('Completare dati persona fisica nel quadro SE del partner: %s') %(line.partner_id.name,))
2885+ str_split = self._split_string_positional_field(line.pf_cognome)
2886+ for s in str_split:
2887+ rcd += '{:8s}'.format("SE" + prog_sezione + "001" ) + '{:16s}'.format(s)
2888+ str_split = self._split_string_positional_field(line.pf_nome)
2889+ for s in str_split:
2890+ rcd += '{:8s}'.format("SE" + prog_sezione + "002" ) + '{:16s}'.format(s)
2891+ 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
2892+ str_split = self._split_string_positional_field(line.pf_comune_stato_nascita)
2893+ for s in str_split:
2894+ rcd += '{:8s}'.format("SE" + prog_sezione + "004" ) + '{:16s}'.format(s)
2895+ rcd += '{:8s}'.format("SE" + prog_sezione + "005" ) + '{:16s}'.format(line.pf_provincia_nascita)
2896+ rcd += '{:8s}'.format("SE" + prog_sezione + "006" ) + '{:>16s}'.format(line.pf_codice_stato_estero_domicilio)
2897+ # .. persona giuridica
2898+ if line.pg_denominazione:
2899+ if not line.pg_citta_estera_sede_legale or not line.pg_codice_stato_estero_domicilio or not line.pg_indirizzo_sede_legale:
2900+ 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,))
2901+ str_split = self._split_string_positional_field(line.pg_denominazione)
2902+ for s in str_split:
2903+ rcd += '{:8s}'.format("SE" + prog_sezione + "007" ) + '{:16s}'.format(s)
2904+ str_split = self._split_string_positional_field(line.pg_citta_estera_sede_legale)
2905+ for s in str_split:
2906+ rcd += '{:8s}'.format("SE" + prog_sezione + "008" ) + '{:16s}'.format(s)
2907+ rcd += '{:8s}'.format("SE" + prog_sezione + "009" ) + '{:>16s}'.format(line.pg_codice_stato_estero_domicilio)
2908+ str_split = self._split_string_positional_field(line.pg_indirizzo_sede_legale)
2909+ for s in str_split:
2910+ rcd += '{:8s}'.format("SE" + prog_sezione + "010" ) + '{:16s}'.format(s)
2911+ # Codice identificativo IVA
2912+ if line.codice_identificativo_IVA:
2913+ rcd += '{:8s}'.format("SE" + prog_sezione + "011" ) + '{:16s}'.format(line.codice_identificativo_IVA)
2914+ # Dati documento
2915+ rcd += '{:8s}'.format("SE" + prog_sezione + "012" ) + '{:>16s}'.format(datetime.strptime(line.data_emissione, "%Y-%m-%d").strftime("%d%m%Y"))
2916+ rcd += '{:8s}'.format("SE" + prog_sezione + "013" ) + '{:>16s}'.format(datetime.strptime(line.data_registrazione, "%Y-%m-%d").strftime("%d%m%Y"))
2917+ rcd += '{:8s}'.format("SE" + prog_sezione + "014" ) + '{:16s}'.format(line.numero_fattura)
2918+
2919+ if line.importo > 0:
2920+ rcd += '{:8s}'.format("SE" + prog_sezione + "015" ) + '{:16.0f}'.format(line.importo)
2921+ if line.imposta > 0:
2922+ rcd += '{:8s}'.format("SE" + prog_sezione + "016" ) + '{:16.0f}'.format(line.imposta)
2923+
2924+ # riempio fino a 1900 caratteri
2925+ rcd += " " * (1897 -len(rcd))
2926+ # Ultimi caratteri di controllo
2927+ rcd += "A" # Impostare al valore "A"
2928+ rcd += "\r" #
2929+ rcd += "\n" #
2930+
2931+ return rcd
2932+
2933+
2934+ def _record_E(self, cr, uid, comunicazione, prog_modulo, context=None):
2935+ rcd = "E"
2936+ rcd += '{:16s}'.format(comunicazione.soggetto_codice_fiscale)
2937+ #rcd += '{:8d}'.format(prog_modulo) # Progressivo modulo
2938+ rcd += '{:8s}'.format(str(prog_modulo).zfill(8)) # Progressivo modulo
2939+ rcd += '{:3s}'.format("") # Filler
2940+ rcd += '{:25s}'.format("") # Filler
2941+ rcd += '{:20s}'.format("") # Filler
2942+ rcd += '{:16s}'.format("") # Filler
2943+ # Aggregate
2944+ if comunicazione.totale_FA:
2945+ rcd += '{:8s}'.format("TA001001") + '{:16d}'.format(comunicazione.totale_FA)
2946+ if comunicazione.totale_SA:
2947+ rcd += '{:8s}'.format("TA002001") + '{:16d}'.format(comunicazione.totale_SA)
2948+ if comunicazione.totale_BL1:
2949+ rcd += '{:8s}'.format("TA003001") + '{:16d}'.format(comunicazione.totale_BL1)
2950+ if comunicazione.totale_BL2:
2951+ rcd += '{:8s}'.format("TA003002") + '{:16d}'.format(comunicazione.totale_BL2)
2952+ if comunicazione.totale_BL3:
2953+ rcd += '{:8s}'.format("TA003003") + '{:16d}'.format(comunicazione.totale_BL3)
2954+ # Analitiche
2955+ if comunicazione.totale_FE:
2956+ rcd += '{:8s}'.format("TA004001") + '{:16d}'.format(comunicazione.totale_FE)
2957+ if comunicazione.totale_FE_R:
2958+ rcd += '{:8s}'.format("TA004002") + '{:16d}'.format(comunicazione.totale_FE_R)
2959+ if comunicazione.totale_FR:
2960+ rcd += '{:8s}'.format("TA005001") + '{:16d}'.format(comunicazione.totale_FR)
2961+ if comunicazione.totale_FR_R:
2962+ rcd += '{:8s}'.format("TA005002") + '{:16d}'.format(comunicazione.totale_FR_R)
2963+ if comunicazione.totale_NE:
2964+ rcd += '{:8s}'.format("TA006001") + '{:16d}'.format(comunicazione.totale_NE)
2965+ if comunicazione.totale_NR:
2966+ rcd += '{:8s}'.format("TA007001") + '{:16d}'.format(comunicazione.totale_NR)
2967+ if comunicazione.totale_DF:
2968+ rcd += '{:8s}'.format("TA008001") + '{:16d}'.format(comunicazione.totale_DF)
2969+ if comunicazione.totale_FN:
2970+ rcd += '{:8s}'.format("TA009001") + '{:16d}'.format(comunicazione.totale_FN)
2971+ if comunicazione.totale_SE:
2972+ rcd += '{:8s}'.format("TA010001") + '{:16d}'.format(comunicazione.totale_SE)
2973+ if comunicazione.totale_TU:
2974+ rcd += '{:8s}'.format("TA011001") + '{:16d}'.format(comunicazione.totale_TU)
2975+
2976+ rcd += " " * (1897 -len(rcd))
2977+
2978+ # Ultimi caratteri di controllo
2979+ rcd += "A" # Impostare al valore "A"
2980+ rcd += "\r" #
2981+ rcd += "\n" #
2982+ return rcd
2983+
2984+ def _record_Z(self, cr, uid, args, context=None):
2985+ rcd = "Z"
2986+ rcd += '{:14s}'.format("") # filler
2987+ rcd += '{:9s}'.format(str(args.get('numero_record_B')).zfill(9))
2988+ rcd += '{:9s}'.format(str(args.get('numero_record_C')).zfill(9))
2989+ rcd += '{:9s}'.format(str(args.get('numero_record_D')).zfill(9))
2990+ rcd += '{:9s}'.format(str(args.get('numero_record_E')).zfill(9))
2991+ rcd += " " * 1846
2992+ # Ultimi caratteri di controllo
2993+ rcd += "A" # Impostare al valore "A"
2994+ rcd += "\r" #
2995+ rcd += "\n" #
2996+ return rcd
2997+
2998+ def execute_export(self, cr, uid, ids, context=None):
2999+ if len(ids) > 1:
3000+ raise osv.except_osv('Error', _('Only one comunication'))
3001+
3002+ numero_record_B = 0
3003+ numero_record_C = 0
3004+ numero_record_D = 0
3005+ numero_record_E = 0
3006+
3007+ comunicazione_id = context.get('active_id', False)
3008+ comunicazione = self.pool.get('spesometro.comunicazione').browse(cr, uid, comunicazione_id)
3009+
3010+ # Testata
3011+ content = self._record_A(cr, uid, comunicazione, context=context)
3012+ numero_record_B += 1
3013+ content += self._record_B(cr, uid, comunicazione, context=context)
3014+
3015+ # Dettaglio
3016+ progressivo_modulo = 0
3017+ progressivo_sezione = 0
3018+ sezione_max = 3
3019+ # .. quadro FA
3020+ for line in comunicazione.line_FA_ids:
3021+ progressivo_modulo +=1
3022+ progressivo_sezione +=1
3023+ if progressivo_sezione > sezione_max :
3024+ progressivo_sezione = 1
3025+ content += self._record_C_FA(cr, uid, line, progressivo_modulo, progressivo_sezione, context=context)
3026+ numero_record_C += 1
3027+ # .. quadro SA
3028+ progressivo_sezione = 0
3029+ sezione_max = 10
3030+ for line in comunicazione.line_SA_ids:
3031+ progressivo_modulo +=1
3032+ progressivo_sezione +=1
3033+ if progressivo_sezione > sezione_max :
3034+ progressivo_sezione = 1
3035+ content += self._record_C_SA(cr, uid, line, progressivo_modulo, progressivo_sezione, context=context)
3036+ numero_record_C += 1
3037+
3038+ # .. quadro BL
3039+ progressivo_sezione = 0
3040+ sezione_max = 1
3041+ for line in comunicazione.line_BL_ids:
3042+ progressivo_modulo +=1
3043+ progressivo_sezione +=1
3044+ if progressivo_sezione > sezione_max :
3045+ progressivo_sezione = 1
3046+ content += self._record_C_BL(cr, uid, line, progressivo_modulo, progressivo_sezione, context=context)
3047+ numero_record_C += 1
3048+
3049+ # .. quadro SE
3050+ progressivo_sezione = 0
3051+ sezione_max = 3
3052+ for line in comunicazione.line_SE_ids:
3053+ progressivo_modulo +=1
3054+ progressivo_sezione +=1
3055+ if progressivo_sezione > sezione_max :
3056+ progressivo_sezione = 1
3057+ content += self._record_D_SE(cr, uid, line, progressivo_modulo, progressivo_sezione, context=context)
3058+ numero_record_D += 1
3059+
3060+ # Riepilogo
3061+ progressivo_modulo = 1
3062+ content += self._record_E(cr, uid, comunicazione, progressivo_modulo, context=context)
3063+ numero_record_E += 1
3064+
3065+ # Coda
3066+ args = {
3067+ 'numero_record_B' : numero_record_B,
3068+ 'numero_record_C' : numero_record_C,
3069+ 'numero_record_D' : numero_record_D,
3070+ 'numero_record_E' : numero_record_E,
3071+ }
3072+ content += self._record_Z(cr, uid, args, context=None)
3073+
3074+ out=base64.encodestring(content.encode("utf8"))
3075+
3076+ self.write(cr, uid, ids, {'file_spesometro':out}, context=context)
3077+
3078+ model_data_obj = self.pool.get('ir.model.data')
3079+ view_rec = model_data_obj.get_object_reference(cr, uid, 'l10n_it_spesometro', 'wizard_spesometro_export_view')
3080+ view_id = view_rec and view_rec[1] or False
3081+
3082+ return {
3083+ 'view_type': 'form',
3084+ 'view_id' : [view_id],
3085+ 'view_mode': 'form',
3086+ 'res_model': 'wizard.spesometro.export',
3087+ 'res_id': ids[0],
3088+ 'type': 'ir.actions.act_window',
3089+ 'target': 'new',
3090+ 'context': context,
3091+ }
3092+
3093+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
3094\ No newline at end of file
3095
3096=== added file 'l10n_it_spesometro/wizard/wizard_export_view.xml'
3097--- l10n_it_spesometro/wizard/wizard_export_view.xml 1970-01-01 00:00:00 +0000
3098+++ l10n_it_spesometro/wizard/wizard_export_view.xml 2014-03-20 14:19:55 +0000
3099@@ -0,0 +1,44 @@
3100+<?xml version="1.0" encoding="utf-8"?>
3101+<openerp>
3102+ <data>
3103+ <!--
3104+ Form
3105+ -->
3106+ <record id="wizard_spesometro_export_view" model="ir.ui.view">
3107+ <field name="name">wizard.spesometro.export.view</field>
3108+ <field name="model">wizard.spesometro.export</field>
3109+ <field name="arch" type="xml">
3110+ <form string="Params">
3111+ <group>
3112+ <field name="file_spesometro" readonly="1"/>
3113+ <separator colspan="4" />
3114+ <button name="execute_export" string="Export" type="object" icon="gtk-execute" />
3115+ </group>
3116+ </form>
3117+ </field>
3118+ </record>
3119+
3120+ <!-- ACTION -->
3121+ <record id="wizard_spesometro_export_action" model="ir.actions.act_window">
3122+ <field name="name">Export spesometro</field>
3123+ <field name="res_model">wizard.spesometro.export</field>
3124+ <field name="src_model">spesometro.comunicazione</field>
3125+ <field name="view_type">form</field>
3126+ <field name="view_mode">form</field>
3127+ <field name="view_id" ref="wizard_spesometro_export_view"/>
3128+ <field name="help">Crea file spesometro - Comunicazione art.21 </field>
3129+ <field name="target">new</field>
3130+ </record>
3131+
3132+ <act_window name="Export spesometro"
3133+ res_model="wizard.spesometro.export"
3134+ src_model="spesometro.comunicazione"
3135+ view_mode="form"
3136+ target="new"
3137+ context="{'search_default_in_location':1}"
3138+ key2="client_action_multi"
3139+ view_id="wizard_spesometro_export_view"
3140+ id="wizard_spesometro_export_action2"/>
3141+
3142+ </data>
3143+</openerp>

Subscribers

People subscribed via source and target branches