perf: skip unnecessary item-wh reposts
Using basic idea that repost with older posting date will also take care of subsequent posting dates... When Item-WH reposts are queued: 1. If another repost with same item-wh but older posting date exists then skip current one. 2. If another repost with same item-wh but newer posting date exists then skip another one.
This commit is contained in:
parent
1d3842f03a
commit
0d0e24a5f5
@ -64,7 +64,7 @@
|
|||||||
"in_standard_filter": 1,
|
"in_standard_filter": 1,
|
||||||
"label": "Status",
|
"label": "Status",
|
||||||
"no_copy": 1,
|
"no_copy": 1,
|
||||||
"options": "Queued\nIn Progress\nCompleted\nFailed",
|
"options": "Queued\nIn Progress\nCompleted\nSkipped\nFailed",
|
||||||
"read_only": 1
|
"read_only": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -2,10 +2,21 @@
|
|||||||
# For license information, please see license.txt
|
# For license information, please see license.txt
|
||||||
|
|
||||||
|
|
||||||
|
import datetime
|
||||||
|
|
||||||
import frappe
|
import frappe
|
||||||
from frappe import _
|
from frappe import _
|
||||||
from frappe.model.document import Document
|
from frappe.model.document import Document
|
||||||
from frappe.utils import cint, get_link_to_form, get_weekday, now, nowtime, today
|
from frappe.utils import (
|
||||||
|
cint,
|
||||||
|
get_datetime,
|
||||||
|
get_link_to_form,
|
||||||
|
get_time,
|
||||||
|
get_weekday,
|
||||||
|
now,
|
||||||
|
nowtime,
|
||||||
|
today,
|
||||||
|
)
|
||||||
from frappe.utils.user import get_users_with_role
|
from frappe.utils.user import get_users_with_role
|
||||||
from rq.timeouts import JobTimeoutException
|
from rq.timeouts import JobTimeoutException
|
||||||
|
|
||||||
@ -19,7 +30,7 @@ from erpnext.stock.stock_ledger import repost_future_sle
|
|||||||
|
|
||||||
class RepostItemValuation(Document):
|
class RepostItemValuation(Document):
|
||||||
def validate(self):
|
def validate(self):
|
||||||
self.set_status()
|
self.set_status(write=False)
|
||||||
self.reset_field_values()
|
self.reset_field_values()
|
||||||
self.set_company()
|
self.set_company()
|
||||||
|
|
||||||
@ -37,12 +48,17 @@ class RepostItemValuation(Document):
|
|||||||
elif self.warehouse:
|
elif self.warehouse:
|
||||||
self.company = frappe.get_cached_value("Warehouse", self.warehouse, "company")
|
self.company = frappe.get_cached_value("Warehouse", self.warehouse, "company")
|
||||||
|
|
||||||
def set_status(self, status=None):
|
def set_status(self, status=None, write=True):
|
||||||
|
status = status or self.status
|
||||||
if not status:
|
if not status:
|
||||||
status = 'Queued'
|
self.status = 'Queued'
|
||||||
self.db_set('status', status)
|
else:
|
||||||
|
self.status = status
|
||||||
|
if write:
|
||||||
|
self.db_set('status', self.status)
|
||||||
|
|
||||||
def on_submit(self):
|
def on_submit(self):
|
||||||
|
self.deduplicate_similar_repost()
|
||||||
if not frappe.flags.in_test:
|
if not frappe.flags.in_test:
|
||||||
return
|
return
|
||||||
|
|
||||||
@ -55,6 +71,35 @@ class RepostItemValuation(Document):
|
|||||||
frappe.enqueue(repost, timeout=1800, queue='long',
|
frappe.enqueue(repost, timeout=1800, queue='long',
|
||||||
job_name='repost_sle', now=True, doc=self)
|
job_name='repost_sle', now=True, doc=self)
|
||||||
|
|
||||||
|
def deduplicate_similar_repost(self):
|
||||||
|
""" Deduplicate similar reposts based on item-warehouse-posting combination."""
|
||||||
|
if self.based_on != "Item and Warehouse":
|
||||||
|
return
|
||||||
|
|
||||||
|
queued = frappe.db.get_value(
|
||||||
|
"Repost Item Valuation",
|
||||||
|
filters={
|
||||||
|
"docstatus": 1,
|
||||||
|
"status": "Queued",
|
||||||
|
"item_code": self.item_code,
|
||||||
|
"warehouse": self.warehouse,
|
||||||
|
"based_on": self.based_on,
|
||||||
|
"name": ("!=", self.name)
|
||||||
|
},
|
||||||
|
fieldname=["name", "posting_date", "posting_time"],
|
||||||
|
as_dict=True
|
||||||
|
)
|
||||||
|
if not queued:
|
||||||
|
return
|
||||||
|
|
||||||
|
posting_timestamp = datetime.datetime.combine(get_datetime(self.posting_date), get_time(self.posting_time))
|
||||||
|
queued_timestamp = datetime.datetime.combine(get_datetime(queued.posting_date), get_time(queued.posting_time))
|
||||||
|
|
||||||
|
if posting_timestamp > queued_timestamp:
|
||||||
|
self.set_status("Skipped")
|
||||||
|
else:
|
||||||
|
frappe.db.set_value("Repost Item Valuation", queued.name, "status", "Skipped")
|
||||||
|
|
||||||
|
|
||||||
def on_doctype_update():
|
def on_doctype_update():
|
||||||
frappe.db.add_index("Repost Item Valuation", ["warehouse", "item_code"], "item_warehouse")
|
frappe.db.add_index("Repost Item Valuation", ["warehouse", "item_code"], "item_warehouse")
|
||||||
@ -136,7 +181,8 @@ def repost_entries():
|
|||||||
|
|
||||||
for row in riv_entries:
|
for row in riv_entries:
|
||||||
doc = frappe.get_doc('Repost Item Valuation', row.name)
|
doc = frappe.get_doc('Repost Item Valuation', row.name)
|
||||||
repost(doc)
|
if doc.status in ('Queued', 'In Progress'):
|
||||||
|
repost(doc)
|
||||||
|
|
||||||
riv_entries = get_repost_item_valuation_entries()
|
riv_entries = get_repost_item_valuation_entries()
|
||||||
if riv_entries:
|
if riv_entries:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user