Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: slowness in reposting dependent vouchers. (backport #42282) #42292

Merged
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 33 additions & 1 deletion erpnext/stock/stock_ledger.py
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,8 @@ def repost_future_sle(
"posting_time": args[i].get("posting_time"),
"creation": args[i].get("creation"),
"distinct_item_warehouses": distinct_item_warehouses,
"items_to_be_repost": args,
"current_index": i,
},
allow_negative_stock=allow_negative_stock,
via_landed_cost_voucher=via_landed_cost_voucher,
Expand Down Expand Up @@ -685,11 +687,20 @@ def update_distinct_item_warehouses(self, dependant_sle):
self.distinct_item_warehouses[key] = val
self.new_items_found = True
else:
# Check if the dependent voucher is reposted
# If not, then do not add it to the list
if not self.is_dependent_voucher_reposted(dependant_sle):
return

existing_sle_posting_date = self.distinct_item_warehouses[key].get("sle", {}).get("posting_date")

dependent_voucher_detail_nos = self.get_dependent_voucher_detail_nos(key)

if getdate(dependant_sle.posting_date) < getdate(existing_sle_posting_date):
if dependent_voucher_detail_nos and dependant_sle.voucher_detail_no in set(
dependent_voucher_detail_nos
):
return

val.sle_changed = True
dependent_voucher_detail_nos.append(dependant_sle.voucher_detail_no)
val.dependent_voucher_detail_nos = dependent_voucher_detail_nos
Expand All @@ -703,6 +714,27 @@ def update_distinct_item_warehouses(self, dependant_sle):
val.dependent_voucher_detail_nos = dependent_voucher_detail_nos
self.distinct_item_warehouses[key] = val

def is_dependent_voucher_reposted(self, dependant_sle) -> bool:
# Return False if the dependent voucher is not reposted

if self.args.items_to_be_repost and self.args.current_index:
index = self.args.current_index
while index < len(self.args.items_to_be_repost):
if (
self.args.items_to_be_repost[index].get("item_code") == dependant_sle.item_code
and self.args.items_to_be_repost[index].get("warehouse") == dependant_sle.warehouse
):
if getdate(self.args.items_to_be_repost[index].get("posting_date")) > getdate(
dependant_sle.posting_date
):
self.args.items_to_be_repost[index]["posting_date"] = dependant_sle.posting_date

return False

index += 1

return True

def get_dependent_voucher_detail_nos(self, key):
if "dependent_voucher_detail_nos" not in self.distinct_item_warehouses[key]:
self.distinct_item_warehouses[key].dependent_voucher_detail_nos = []
Expand Down
Loading