diff --git a/edi_core_oca/models/edi_backend.py b/edi_core_oca/models/edi_backend.py
index 037ead3e9..55e5f0c0f 100644
--- a/edi_core_oca/models/edi_backend.py
+++ b/edi_core_oca/models/edi_backend.py
@@ -62,6 +62,9 @@ class EDIBackend(models.Model):
Usecase: the web service you send the file to processes it on the fly.
"""
)
+ output_cancel_cannot_send_auto = fields.Boolean(
+ string="Automatically cancel the records that cannot be sent"
+ )
active = fields.Boolean(default=True)
company_id = fields.Many2one("res.company", string="Company")
auto_archive_records_after_days = fields.Integer(
@@ -225,7 +228,11 @@ def exchange_send(self, exchange_record):
# In case already sent: skip sending and check the state
check = self._output_check_send(exchange_record)
if not check:
- return self._failed_output_check_send_msg()
+ message = self._failed_output_check_send_msg(exchange_record=exchange_record)
+ if self.output_cancel_cannot_send_auto:
+ exchange_record.edi_exchange_state = "output_cancel"
+ exchange_record._notify_cancel(message)
+ return message
state = exchange_record.edi_exchange_state
error = traceback = False
message = None
@@ -675,7 +682,7 @@ def _is_valid_edi_action(self, action, raise_if_not=False):
raise
return False
- def _failed_output_check_send_msg(self):
+ def _failed_output_check_send_msg(self, exchange_record=None):
return "Nothing to do. Likely already sent."
def _get_exec_handler(self, exchange_record, action):
diff --git a/edi_core_oca/models/edi_exchange_record.py b/edi_core_oca/models/edi_exchange_record.py
index 685a98bb0..654b07b6c 100644
--- a/edi_core_oca/models/edi_exchange_record.py
+++ b/edi_core_oca/models/edi_exchange_record.py
@@ -97,6 +97,7 @@ class EDIExchangeRecord(models.Model):
("output_sent", "Sent"),
("output_sent_and_processed", "Sent and processed"),
("output_sent_and_error", "Sent and error"),
+ ("output_cancel", "Sending canceled"),
# input exchange states
("input_pending", "Waiting to be received"),
("input_received", "Received"),
@@ -423,6 +424,7 @@ def _exchange_status_messages(self):
),
"ack_received_error": self.env._("ACK file received but contains errors."),
"validate_ko": self.env._("Exchange not valid"),
+ "cancel": self.env._("Exchange canceled"),
}
def _exchange_status_message(self, key):
@@ -558,6 +560,12 @@ def _notify_error(self, message_key):
)
self._trigger_edi_event("error")
+ def _notify_cancel(self, message=None):
+ if message is None:
+ message = self._exchange_status_message("cancel")
+ self._notify_related_record(message)
+ self._trigger_edi_event("cancel")
+
def _notify_ack_received(self):
self._notify_related_record(self._exchange_status_message("ack_received"))
self._trigger_edi_event("done", suffix="ack_received")
diff --git a/edi_core_oca/tests/test_backend_output.py b/edi_core_oca/tests/test_backend_output.py
index 2d5e49810..3ecf0d0a6 100644
--- a/edi_core_oca/tests/test_backend_output.py
+++ b/edi_core_oca/tests/test_backend_output.py
@@ -133,3 +133,11 @@ def test_send_record_with_operational_error(self):
).exchange_send(self.record)
self.assertRecordValues(self.record, [{"edi_exchange_state": "output_pending"}])
self.assertFalse(self.record.exchange_error)
+
+ def test_send_auto_cancel(self):
+ self.backend.write({"output_cancel_cannot_send_auto": True})
+ self.record.write({"edi_exchange_state": "output_pending"})
+ with mock.patch.object(type(self.backend), "_output_check_send") as mocked:
+ mocked.return_value = False
+ self.backend.exchange_send(self.record)
+ self.assertRecordValues(self.record, [{"edi_exchange_state": "output_cancel"}])
diff --git a/edi_core_oca/views/edi_backend_views.xml b/edi_core_oca/views/edi_backend_views.xml
index 5c4aea4f4..183ed57cf 100644
--- a/edi_core_oca/views/edi_backend_views.xml
+++ b/edi_core_oca/views/edi_backend_views.xml
@@ -53,6 +53,7 @@
+