summaryrefslogtreecommitdiff
path: root/addons/account_edi_extended/models/account_move.py
diff options
context:
space:
mode:
Diffstat (limited to 'addons/account_edi_extended/models/account_move.py')
-rw-r--r--addons/account_edi_extended/models/account_move.py81
1 files changed, 81 insertions, 0 deletions
diff --git a/addons/account_edi_extended/models/account_move.py b/addons/account_edi_extended/models/account_move.py
new file mode 100644
index 00000000..4f81822a
--- /dev/null
+++ b/addons/account_edi_extended/models/account_move.py
@@ -0,0 +1,81 @@
+# -*- 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'})