From 457846e34c472bad2ae1cc1e728c570241c23ed9 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Thu, 11 May 2023 23:17:09 +0530 Subject: [PATCH] fix: enqueue submit/cancel action for stock entry to avoid time out error (cherry picked from commit 7a3801578cb3cf6fbaa6fc35814fc97e73820dcd) --- .../stock/doctype/stock_entry/stock_entry.py | 44 ++++++++++++++++++- .../doctype/stock_entry/test_stock_entry.py | 30 ++++++++++++- 2 files changed, 72 insertions(+), 2 deletions(-) diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py index 2e89078440f1..2dbfeadf0f41 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/stock_entry.py @@ -9,7 +9,17 @@ from frappe import _ from frappe.model.mapper import get_mapped_doc from frappe.query_builder.functions import Sum -from frappe.utils import cint, comma_or, cstr, flt, format_time, formatdate, getdate, nowdate +from frappe.utils import ( + cint, + comma_or, + cstr, + flt, + format_time, + formatdate, + getdate, + month_diff, + nowdate, +) import erpnext from erpnext.accounts.general_ledger import process_gl_map @@ -154,6 +164,38 @@ def validate(self): self.reset_default_field_value("from_warehouse", "items", "s_warehouse") self.reset_default_field_value("to_warehouse", "items", "t_warehouse") + def submit(self): + if self.is_enqueue_action(): + frappe.msgprint( + _( + "The task has been enqueued as a background job. In case there is any issue on processing in background, the system will add a comment about the error on this Stock Reconciliation and revert to the Draft stage" + ) + ) + self.queue_action("submit", timeout=2000) + else: + self._submit() + + def cancel(self): + if self.is_enqueue_action(): + frappe.msgprint( + _( + "The task has been enqueued as a background job. In case there is any issue on processing in background, the system will add a comment about the error on this Stock Reconciliation and revert to the Submitted stage" + ) + ) + self.queue_action("cancel", timeout=2000) + else: + self._cancel() + + def is_enqueue_action(self, force=False) -> bool: + if force: + return True + + # If line items are more than 100 or record is older than 6 months + if len(self.items) > 100 or month_diff(nowdate(), self.posting_date) > 6: + return True + + return False + def on_submit(self): self.update_stock_ledger() diff --git a/erpnext/stock/doctype/stock_entry/test_stock_entry.py b/erpnext/stock/doctype/stock_entry/test_stock_entry.py index c43a1b1b81e8..9a748abb3be3 100644 --- a/erpnext/stock/doctype/stock_entry/test_stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/test_stock_entry.py @@ -5,7 +5,7 @@ import frappe from frappe.permissions import add_user_permission, remove_user_permission from frappe.tests.utils import FrappeTestCase, change_settings -from frappe.utils import add_days, flt, nowdate, nowtime, today +from frappe.utils import add_days, add_to_date, flt, nowdate, nowtime, today from erpnext.accounts.doctype.account.test_account import get_inventory_account from erpnext.stock.doctype.item.test_item import ( @@ -1707,6 +1707,34 @@ def test_negative_stock_reco(self): self.assertRaises(frappe.ValidationError, sr_doc.submit) + def test_enqueue_action(self): + item_code = "Test Enqueue Item - 001" + create_item(item_code=item_code, is_stock_item=1, valuation_rate=10) + + doc = make_stock_entry( + item_code=item_code, + posting_date=add_to_date(today(), months=-7), + posting_time="00:00:00", + purpose="Material Receipt", + qty=10, + to_warehouse="_Test Warehouse - _TC", + do_not_submit=True, + ) + + self.assertTrue(doc.is_enqueue_action()) + + doc = make_stock_entry( + item_code=item_code, + posting_date=today(), + posting_time="00:00:00", + purpose="Material Receipt", + qty=10, + to_warehouse="_Test Warehouse - _TC", + do_not_submit=True, + ) + + self.assertFalse(doc.is_enqueue_action()) + def make_serialized_item(**args): args = frappe._dict(args)