Se non la scrivo qui non saprei dove
Oggi pomeriggio dopo i test di accettazione del nuovo (rompiballe e definito da incompetenti) spesometro decido che è il caso di implementare l'ultima funzione che manca, l'update delle fatture.
Preso da un'embolo di pazzia decido che il codice precedente è troppo prolisso ed astruso, ne son sicuro fra qualche giorno avrò dimenticato diverse cose e poi la manutenzione sarà un casino cosi' (me idiota) ottimizzo il tutto per passare a questo:
def _create_dati_fattura(self,update=False):
if update:
filter_func_dtr = lambda \
r: r.trasmission_count > 0 and r.company_id.id == company.id and type in self.IN_INVOICE
filter_func_dte = lambda \
r: r.trasmission_count > 0 and r.company_id.id == company.id and type in self.OUT_INVOICE
else:
filter_func_dtr = lambda \
r: r.company_id.id == company.id and type in self.IN_INVOICE
filter_func_dte = lambda \
r: r.company_id.id == company.id and type in self.OUT_INVOICE
companies = self.env['account.invoice'].browse(
self.env.context['active_ids']
).mapped('company_id')
def _make_trasmission(company,type):
partners = self.env['account.invoice'].browse(
self.env.context['active_ids']
).filtered(filter_func_dtr if type == 'DTR' else filter_func_dte).mapped('partner_id')
position = 1
need_recursion = False
if partners and len(partners) > 0:
dati_fattura = self._make_header(company,type=type)
filename = '{}_DF_{}'.format(
company.vat,
dati_fattura.DatiFatturaHeader.ProgressivoInvio
)
if type == 'DRT':
t_type = 'drt' if not update else 'mdtr'
else:
t_type = 'dre' if not update else 'mdte'
trasmission = self.env['l10n_it_vat.datifattura_trasmission'].create(
{'name': filename,
'type': t_type}
)
if update and type == 'DTR':
dati_fattura.DTR.Rettifica = RettificaType()
elif update and type == 'DTE':
dati_fattura.DTE.Rettifica = RettificaType()
else:
return
for partner in partners:
if type == 'DTR':
prestatore = self._cedenteprestatoredtr_fromodoo(partner)
else:
prestatore = self._cessionariocommittentedte_fromodoo(partner)
invoices = self.env['account.invoice'].browse(
self.env.context['active_ids']
).filtered(filter_func_dtr if type == 'DTR' else filter_func_dte
).filtered(lambda r: r.partner_id.id == partner.id)
number_invoice = len(invoices)
for invoice in invoices:
if type == 'DTR':
prestatore.DatiFatturaBodyDTR.append(self._make_invoice_body(invoice))
else:
prestatore.DatiFatturaBodyDTE.append(self._make_invoice_body(invoice))
self.env['l10n_it_vat.account_invoice_datifatture_line'].create(
{'invoice_id': invoice.id,
'position': position,
'company_id': company.id,
'trasmission_id': trasmission.id,
'type': 'new' if not update else 'upd'
}
)
number_invoice -= 1
if number_invoice < 0:
need_recursion = True
break
if type == 'DTR':
dati_fattura.DTR.CedentePrestatoreDTR.append(prestatore)
else:
dati_fattura.DTE.CessionarioCommittenteDTE.append(prestatore)
try:
datas = base64.b64encode(dati_fattura.toprettyxml(encoding="UTF-8"))
self.env['ir.attachment'].create(
{'name': filename,
'datas_fname': '{}.xml'.format(filename),
'datas': datas,
'res_model': 'l10n_it_vat.datifattura_trasmission',
'res_id': trasmission.id
}
)
except pyxb.ValidationError as ve:
print ve.details()
raise UserError(ve.details())
if need_recursion:
_make_trasmission(company,type)
for company in companies:
_make_trasmission(company,'DTR')
_make_trasmission(company, 'DTE')
Mi direte, e bhe? .....
Mi accorgo solo ora che la rettifica si puo' fare solo per un file alla volta
.... in altre parole codice da buttare ....
Ma chi azzo ha scritto queste specifiche prive di logica ....
Vabbuo ben mi sta cosi' la prossima volta controllo meglio ed evito di supporre che AdE abbiano un cervello.
Scusate lo sfogo.