- Some errors will never get fixed until user intervention, it doesn't make sense to run the CRON when there is such error. + some small improvements and esthetic changes - When we are in a CRON, we need to commit the changes between each call to web-service to avoid loss of data. - Small refactor of edi.document prepare_jobs and process_jobs - Added an arbitrary key to create the batches.
82 lines
4.0 KiB
Python
82 lines
4.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import api, models, fields, _
|
|
|
|
|
|
class AccountMove(models.Model):
|
|
_inherit = 'account.move'
|
|
|
|
edi_show_abandon_cancel_button = fields.Boolean(
|
|
compute='_compute_edi_show_abandon_cancel_button')
|
|
edi_error_message = fields.Html(compute='_compute_edi_error_message')
|
|
edi_blocking_level = fields.Selection(selection=[('info', 'Info'), ('warning', 'Warning'), ('error', 'Error')], compute='_compute_edi_error_message')
|
|
|
|
@api.depends(
|
|
'edi_document_ids',
|
|
'edi_document_ids.state',
|
|
'edi_document_ids.blocking_level',
|
|
'edi_document_ids.edi_format_id',
|
|
'edi_document_ids.edi_format_id.name')
|
|
def _compute_edi_web_services_to_process(self):
|
|
# OVERRIDE to take blocking_level into account
|
|
for move in self:
|
|
to_process = move.edi_document_ids.filtered(lambda d: d.state in ['to_send', 'to_cancel'] and d.blocking_level != 'error')
|
|
format_web_services = to_process.edi_format_id.filtered(lambda f: f._needs_web_services())
|
|
move.edi_web_services_to_process = ', '.join(f.name for f in format_web_services)
|
|
|
|
@api.depends(
|
|
'state',
|
|
'edi_document_ids.state',
|
|
'edi_document_ids.attachment_id')
|
|
def _compute_edi_show_abandon_cancel_button(self):
|
|
for move in self:
|
|
move.edi_show_abandon_cancel_button = any(doc.edi_format_id._needs_web_services()
|
|
and doc.state == 'to_cancel'
|
|
and move.is_invoice(include_receipts=True)
|
|
and doc.edi_format_id._is_required_for_invoice(move)
|
|
for doc in move.edi_document_ids)
|
|
|
|
@api.depends('edi_error_count', 'edi_document_ids.error', 'edi_document_ids.blocking_level')
|
|
def _compute_edi_error_message(self):
|
|
for move in self:
|
|
if move.edi_error_count == 0:
|
|
move.edi_error_message = None
|
|
move.edi_blocking_level = None
|
|
elif move.edi_error_count == 1:
|
|
error_doc = move.edi_document_ids.filtered(lambda d: d.error)
|
|
move.edi_error_message = error_doc.error
|
|
move.edi_blocking_level = error_doc.blocking_level
|
|
else:
|
|
error_levels = set([doc.blocking_level for doc in move.edi_document_ids])
|
|
if 'error' in error_levels:
|
|
move.edi_error_message = str(move.edi_error_count) + _(" Electronic invoicing error(s)")
|
|
move.edi_blocking_level = 'error'
|
|
elif 'warning' in error_levels:
|
|
move.edi_error_message = str(move.edi_error_count) + _(" Electronic invoicing warning(s)")
|
|
move.edi_blocking_level = 'warning'
|
|
else:
|
|
move.edi_error_message = str(move.edi_error_count) + _(" Electronic invoicing info(s)")
|
|
move.edi_blocking_level = 'info'
|
|
|
|
def action_retry_edi_documents_error(self):
|
|
self.edi_document_ids.write({'error': False, 'blocking_level': False})
|
|
self.action_process_edi_web_services()
|
|
|
|
def button_abandon_cancel_posted_posted_moves(self):
|
|
'''Cancel the request for cancellation of the EDI.
|
|
'''
|
|
documents = self.env['account.edi.document']
|
|
for move in self:
|
|
is_move_marked = False
|
|
for doc in move.edi_document_ids:
|
|
if doc.state == 'to_cancel' \
|
|
and move.is_invoice(include_receipts=True) \
|
|
and doc.edi_format_id._is_required_for_invoice(move):
|
|
documents |= doc
|
|
is_move_marked = True
|
|
if is_move_marked:
|
|
move.message_post(body=_("A request for cancellation of the EDI has been called off."))
|
|
|
|
documents.write({'state': 'sent'})
|