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

Proposed by Lorenzo Battistini
Status: Needs review
Proposed branch: lp:~openobject-italia-core-devs/openobject-italia/7.0-spesometro-core-devs
Merge into: lp:~openobject-italia-core-devs/openobject-italia/italian-addons-7.0
Diff against target: 3174 lines (+3102/-0)
13 files modified
l10n_it_spesometro/AUTHORS.txt (+2/-0)
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 (+1286/-0)
l10n_it_spesometro/spesometro_view.xml (+637/-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 (+726/-0)
l10n_it_spesometro/wizard/wizard_export_view.xml (+44/-0)
To merge this branch: bzr merge lp:~openobject-italia-core-devs/openobject-italia/7.0-spesometro-core-devs
Reviewer Review Type Date Requested Status
Lorenzo Battistini Needs Fixing
Nicola Malcontenti - Agile BG (community) Needs Fixing
Review via email: mp+212559@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Lorenzo Battistini (elbati) wrote :
239. By openerp <openerp@shs-av-dev>

modified wizard_export.py using _add_field routine and compatibility with python 2.6

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

Ciao, ho seguito il consiglio di Lorenzo e portato su questo branch le modifiche che avevo fatto in precedenza.
Sostanzialmente ho modificato la sintassi tra parentesi graffe delle format per mantenere la compatibilità con python 2.6 e ho utilizzato una routine che ho chiamato _add_field che dovrebbe snellire parecchio la generazione del file di testo da inviare all'agenzia delle entrate.(Per ora ho commentato il codice di Alessandro perchè mi serve come scheletro da seguire).
Lo scopo finale, nella nostra idea, è quello di rendere il tutto più parametrizzabile possibile.
Saluti. Valerio

Revision history for this message
Nicola Malcontenti - Agile BG (hurrin1c0) wrote :

Ciao Valerio,
Ho guardato il codice e noto che ci sono diversi "iÃÂ", sospetto che sia stato usato un charset diverso da utf-8.
Saluti.
-N.

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

> Ciao Valerio,
> Ho guardato il codice e noto che ci sono diversi "iÃÂ", sospetto che sia
> stato usato un charset diverso da utf-8.
> Saluti.
> -N.

Il charset è UTF-8, ne sono sicuro, per comodità l'avevo modificato con un editor poco avvezzo all'UTF-8 ed erano nati quei caratteri. Li sistemo a mano quando li trovo, comunque non sono pericolosi perchè si presentano solo nei commenti. Grazie della segnalazione.
Valerio

240. By Alessandro Camilli

Esclusione su conto imposta - 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.

241. By Alessandro Camilli
Revision history for this message
Lorenzo Battistini (elbati) wrote :

Come riferimento per chi volesse testare il modulo:
http://www.openforce.it/lo-spesometro-su-openerp/

Grazie ancora Alessandro

242. By Lorenzo Battistini

[FIX] Setting the `type` field is deprecated in the `ir.ui.view` model.

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

2014-05-29 14:37:07,720 30596 WARNING test_7 openerp.modules.loading: The model spesometro.comunicazione.line.fe has no access rules, consider adding one. E.g. access_spesometro_comunicazione_line_fe,access_spesometro_comunicazione_line_fe,model_spesometro_comunicazione_line_fe,,1,1,1,1
2014-05-29 14:37:07,720 30596 WARNING test_7 openerp.modules.loading: The model spesometro.comunicazione.line.fr has no access rules, consider adding one. E.g. access_spesometro_comunicazione_line_fr,access_spesometro_comunicazione_line_fr,model_spesometro_comunicazione_line_fr,,1,1,1,1
2014-05-29 14:37:07,720 30596 WARNING test_7 openerp.modules.loading: The model spesometro.comunicazione.line.ne has no access rules, consider adding one. E.g. access_spesometro_comunicazione_line_ne,access_spesometro_comunicazione_line_ne,model_spesometro_comunicazione_line_ne,,1,1,1,1
2014-05-29 14:37:07,721 30596 WARNING test_7 openerp.modules.loading: The model spesometro.comunicazione.line.nr has no access rules, consider adding one. E.g. access_spesometro_comunicazione_line_nr,access_spesometro_comunicazione_line_nr,model_spesometro_comunicazione_line_nr,,1,1,1,1
2014-05-29 14:37:07,721 30596 WARNING test_7 openerp.modules.loading: The model spesometro.comunicazione.line.df has no access rules, consider adding one. E.g. access_spesometro_comunicazione_line_df,access_spesometro_comunicazione_line_df,model_spesometro_comunicazione_line_df,,1,1,1,1
2014-05-29 14:37:07,721 30596 WARNING test_7 openerp.modules.loading: The model spesometro.comunicazione.line.fn has no access rules, consider adding one. E.g. access_spesometro_comunicazione_line_fn,access_spesometro_comunicazione_line_fn,model_spesometro_comunicazione_line_fn,,1,1,1,1
2014-05-29 14:37:07,721 30596 WARNING test_7 openerp.modules.loading: The model spesometro.comunicazione.line.se has no access rules, consider adding one. E.g. access_spesometro_comunicazione_line_se,access_spesometro_comunicazione_line_se,model_spesometro_comunicazione_line_se,,1,1,1,1
2014-05-29 14:37:07,721 30596 WARNING test_7 openerp.modules.loading: The model spesometro.comunicazione.line.tu has no access rules, consider adding one. E.g. access_spesometro_comunicazione_line_tu,access_spesometro_comunicazione_line_tu,model_spesometro_comunicazione_line_tu,,1,1,1,1

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

This project is now hosted on https://github.com/OCA/l10n-italy. Please move your proposal there. This guide may help you https://github.com/OCA/maintainers-tools/wiki/How-to-move-a-Merge-Proposal-to-GitHub

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

Unmerged revisions

242. By Lorenzo Battistini

[FIX] Setting the `type` field is deprecated in the `ir.ui.view` model.

241. By Alessandro Camilli
240. By Alessandro Camilli

Esclusione su conto imposta - 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.

239. By openerp <openerp@shs-av-dev>

modified wizard_export.py using _add_field routine and compatibility with python 2.6

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

Subscribers

People subscribed via source and target branches