11# Part of Odoo. See LICENSE file for full copyright and licensing details.
22
3- from base64 import b64encode
3+ from base64 import b64encode , b64decode
44from collections import defaultdict
55from datetime import datetime
66import logging
@@ -82,12 +82,7 @@ class AccountMove(models.Model):
8282 )
8383 l10n_it_edi_transaction = fields .Char (copy = False , string = "FatturaPA Transaction" )
8484 l10n_it_edi_attachment_file = fields .Binary (copy = False , attachment = True )
85- l10n_it_edi_attachment_id = fields .Many2one (
86- comodel_name = 'ir.attachment' ,
87- string = "FatturaPA Attachment" ,
88- compute = lambda self : self ._compute_linked_attachment_id ('l10n_it_edi_attachment_id' , 'l10n_it_edi_attachment_file' ),
89- depends = ['l10n_it_edi_attachment_file' ],
90- )
85+ l10n_it_edi_attachment_name = fields .Char (string = "FatturaPA Attachment" )
9186 l10n_it_edi_proxy_mode = fields .Selection (related = "company_id.l10n_it_edi_proxy_user_id.edi_mode" , depends = ['company_id' ])
9287 l10n_it_edi_button_label = fields .Char (compute = "_compute_l10n_it_edi_button_label" )
9388 l10n_it_edi_is_self_invoice = fields .Boolean (compute = "_compute_l10n_it_edi_is_self_invoice" )
@@ -374,9 +369,10 @@ def action_l10n_it_edi_send(self):
374369 }
375370
376371 attachment_vals = self ._l10n_it_edi_get_attachment_values (pdf_values = None )
377- self .env ['ir.attachment' ].create (attachment_vals )
378- self .invalidate_recordset (fnames = ['l10n_it_edi_attachment_id' , 'l10n_it_edi_attachment_file' ])
379- self .message_post (attachment_ids = self .l10n_it_edi_attachment_id .ids )
372+ self .l10n_it_edi_attachment_file = b64encode (attachment_vals ['raw' ])
373+ self .l10n_it_edi_attachment_name = attachment_vals ['name' ]
374+ self .invalidate_recordset (fnames = ['l10n_it_edi_attachment_name' , 'l10n_it_edi_attachment_file' ])
375+ self .message_post (attachments = [(self .l10n_it_edi_attachment_name , attachment_vals ['raw' ])])
380376 self ._l10n_it_edi_send ({self : attachment_vals })
381377 self .is_move_sent = True
382378
@@ -398,18 +394,18 @@ def _get_invoice_legal_documents(self, filetype, allow_fallback=False):
398394 # EXTENDS 'account'
399395 self .ensure_one ()
400396 if filetype == 'fatturapa' :
401- if fatturapa_attachment := self .l10n_it_edi_attachment_id :
397+ if fatturapa_attachment := self .l10n_it_edi_attachment_file :
402398 return {
403- 'filename' : fatturapa_attachment . name ,
399+ 'filename' : self . l10n_it_edi_attachment_name ,
404400 'filetype' : 'xml' ,
405- 'content' : fatturapa_attachment . raw ,
401+ 'content' : b64decode ( fatturapa_attachment ) ,
406402 }
407403 return super ()._get_invoice_legal_documents (filetype , allow_fallback = allow_fallback )
408404
409405 def get_extra_print_items (self ):
410406 # EXTENDS 'account' - add possibility to download all FatturaPA XML files
411407 print_items = super ().get_extra_print_items ()
412- if self .l10n_it_edi_attachment_id :
408+ if self .filtered ( 'l10n_it_edi_attachment_file' ) :
413409 print_items .append ({
414410 'key' : 'download_xml_fatturapa' ,
415411 'description' : _ ('XML FatturaPA' ),
@@ -418,7 +414,7 @@ def get_extra_print_items(self):
418414 return print_items
419415
420416 def action_invoice_download_fatturapa (self ):
421- if invoices_with_fatturapa := self .filtered ('l10n_it_edi_attachment_id ' ):
417+ if invoices_with_fatturapa := self .filtered ('l10n_it_edi_attachment_file ' ):
422418 return {
423419 'type' : 'ir.actions.act_url' ,
424420 'url' : f'/account/download_invoice_documents/{ "," .join (map (str , invoices_with_fatturapa .ids ))} /fatturapa' ,
@@ -1376,16 +1372,11 @@ def _l10n_it_edi_import_invoice(self, invoice, data, is_new):
13761372 })]
13771373
13781374 for element in tree .xpath ('.//Allegati' ):
1379- attachment_64 = self .env ['ir.attachment' ].create ({
1380- 'name' : get_text (element , './/NomeAttachment' ),
1381- 'datas' : str .encode (get_text (element , './/Attachment' )),
1382- 'type' : 'binary' ,
1383- 'res_model' : 'account.move' ,
1384- 'res_id' : self .id ,
1385- })
1375+ self .l10n_it_edi_attachment_name = get_text (element , './/NomeAttachment' )
1376+ self .l10n_it_edi_attachment_file = b64decode (get_text (element , './/Attachment' ))
13861377 self .sudo ().message_post (
13871378 body = (_ ("Attachment from XML" )),
1388- attachment_ids = [ attachment_64 . id ],
1379+ attachments = [( self . l10n_it_edi_attachment_name , self . l10n_it_edi_attachment_file ) ],
13891380 )
13901381
13911382 for message in message_to_log :
@@ -1822,7 +1813,7 @@ def _l10n_it_edi_update_send_state(self):
18221813 proxy_user = self .company_id .l10n_it_edi_proxy_user_id
18231814 if proxy_user .edi_mode == 'demo' :
18241815 for move in self :
1825- filename = move .l10n_it_edi_attachment_id and move . l10n_it_edi_attachment_id . name or '???'
1816+ filename = move .l10n_it_edi_attachment_name or '???'
18261817 self ._l10n_it_edi_write_send_state (
18271818 transformed_notification = {
18281819 'l10n_it_edi_state' : 'forwarded' ,
@@ -1916,8 +1907,8 @@ def _l10n_it_edi_transform_notification(self, parsed_notification):
19161907 filename = parsed_notification .get ('filename' )
19171908 errors = parsed_notification .get ('errors' , [])
19181909 date = parsed_notification .get ('date' , fields .Date .today ())
1919- if not filename and self .l10n_it_edi_attachment_id :
1920- filename = self .l10n_it_edi_attachment_id . name
1910+ if not filename and self .l10n_it_edi_attachment_name :
1911+ filename = self .l10n_it_edi_attachment_name
19211912 outcome = parsed_notification .get ('outcome' , False )
19221913 if not outcome :
19231914 new_state = state_map .get (sdi_state , False )
0 commit comments