diff --git a/l10n_it_fatturapa_pec/__manifest__.py b/l10n_it_fatturapa_pec/__manifest__.py index 59507ac87927..66a79a9762d1 100644 --- a/l10n_it_fatturapa_pec/__manifest__.py +++ b/l10n_it_fatturapa_pec/__manifest__.py @@ -7,7 +7,7 @@ { 'name': 'Italian Localization - Fattura elettronica - Supporto PEC', - 'version': '12.0.1.2.0', + 'version': '12.0.1.3.0', 'category': 'Localization/Italy', 'summary': 'Invio fatture elettroniche tramite PEC', 'author': 'Openforce Srls Unipersonale, Odoo Community Association (OCA)', @@ -25,7 +25,8 @@ 'views/fatturapa_attachment_out.xml', 'wizard/send_pec_view.xml', 'views/fetchmail_view.xml', - 'security/ir.model.access.csv' + 'security/ir.model.access.csv', + 'data/fetchmail_data.xml', ], 'installable': True } diff --git a/l10n_it_fatturapa_pec/data/fetchmail_data.xml b/l10n_it_fatturapa_pec/data/fetchmail_data.xml new file mode 100644 index 000000000000..e3bd0201e9b3 --- /dev/null +++ b/l10n_it_fatturapa_pec/data/fetchmail_data.xml @@ -0,0 +1,9 @@ + + + + + fetchmail.pec.max.retry + 5 + + + diff --git a/l10n_it_fatturapa_pec/models/fetchmail.py b/l10n_it_fatturapa_pec/models/fetchmail.py index dcf4c8a51361..d45a4ea72a58 100644 --- a/l10n_it_fatturapa_pec/models/fetchmail.py +++ b/l10n_it_fatturapa_pec/models/fetchmail.py @@ -3,7 +3,7 @@ # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). import logging -from odoo import models, api, fields +from odoo import models, api, fields, _ _logger = logging.getLogger(__name__) MAX_POP_MESSAGES = 50 @@ -17,6 +17,7 @@ def _default_e_inv_notify_partner_ids(self): last_pec_error_message = fields.Text( "Last PEC Error Message", readonly=True) + pec_error_count = fields.Integer("PEC error count", readonly=True) e_inv_notify_partner_ids = fields.Many2many( "res.partner", string="Contacts to notify", help="Contacts to notify when PEC message can't be processed", @@ -46,6 +47,7 @@ def fetch_mail(self): additional_context['server_type'] = server.type imap_server = None pop_server = None + error_raised = False if server.type == 'imap': try: imap_server = server.connect() @@ -71,11 +73,9 @@ def fetch_mail(self): server.type, server.name, exc_info=True ) # Here is where we need to intervene. - # Setting to draft prevents new e-invoices to - # be sent via PEC - server.state = 'draft' server.last_pec_error_message = str(e) - break + error_raised = True + continue imap_server.store(num, '+FLAGS', '\\Seen') # We need to commit because message is processed: # Possible next exceptions, out of try, should not @@ -86,8 +86,8 @@ def fetch_mail(self): "General failure when trying to fetch mail from " "%s server %s.", server.type, server.name, exc_info=True) - server.state = 'draft' server.last_pec_error_message = str(e) + error_raised = True finally: if imap_server: imap_server.close() @@ -122,9 +122,9 @@ def fetch_mail(self): server.type, server.name, exc_info=True ) # See the comments in the IMAP part - server.state = 'draft' + error_raised = True server.last_pec_error_message = str(e) - break + continue self._cr.commit() if num_messages < MAX_POP_MESSAGES: break @@ -135,10 +135,48 @@ def fetch_mail(self): " server %s.", server.type, server.name, exc_info=True) # See the comments in the IMAP part - server.state = 'draft' + error_raised = True server.last_pec_error_message = str(e) finally: if pop_server: pop_server.quit() + if error_raised: + server.pec_error_count += 1 + max_retry = self.env['ir.config_parameter'].get_param( + 'fetchmail.pec.max.retry') + if server.pec_error_count > int(max_retry): + # Setting to draft prevents new e-invoices to + # be sent via PEC. + # Resetting server state only after N fails. + # So that the system can try to fetch again after + # temporary connection errors + server.state = 'draft' + server.notify_about_server_reset() + else: + server.pec_error_count = 0 server.write({'date': fields.Datetime.now()}) return True + + def notify_about_server_reset(self): + if self.e_inv_notify_partner_ids: + self.env['mail.mail'].create({ + 'subject': _( + "Fetchmail PEC server [%s] reset" + ) % self.name, + 'body_html': _( + "

" + "PEC server %s has been reset. Last error message is

" + "

%s

" + ) % (self.name, self.last_pec_error_message), + 'recipient_ids': [( + 6, 0, + self.e_inv_notify_partner_ids.ids + )] + }) + _logger.info( + 'Notifying partners %s about PEC server %s reset' + % (self.e_inv_notify_partner_ids.ids, self.name) + ) + else: + _logger.error( + "Can't notify anyone about PEC server %s reset" % self.name) diff --git a/l10n_it_fatturapa_pec/views/fetchmail_view.xml b/l10n_it_fatturapa_pec/views/fetchmail_view.xml index 7381f203a1c1..abc98942651d 100644 --- a/l10n_it_fatturapa_pec/views/fetchmail_view.xml +++ b/l10n_it_fatturapa_pec/views/fetchmail_view.xml @@ -9,6 +9,9 @@ + + +