Skip to content

Commit

Permalink
Merge pull request #36091 from frappe/mergify/bp/version-14/pr-36089
Browse files Browse the repository at this point in the history
fix: circular dependency during reposting causing timeout error (backport #36088) (backport #36089)
  • Loading branch information
rohitwaghchaure authored Jul 11, 2023
2 parents 2b72d14 + 026c608 commit a5a41f7
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 3 deletions.
32 changes: 32 additions & 0 deletions erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py
Original file line number Diff line number Diff line change
Expand Up @@ -1908,6 +1908,32 @@ def test_purchase_receipt_with_backdated_landed_cost_voucher(self):
ste5.reload()
self.assertEqual(ste5.items[0].valuation_rate, 275.00)

ste6 = make_stock_entry(
purpose="Material Transfer",
posting_date=add_days(today(), -3),
source=warehouse1,
target=warehouse,
item_code=item_code,
qty=20,
company=pr.company,
)

ste6.reload()
self.assertEqual(ste6.items[0].valuation_rate, 275.00)

ste7 = make_stock_entry(
purpose="Material Transfer",
posting_date=add_days(today(), -3),
source=warehouse,
target=warehouse1,
item_code=item_code,
qty=20,
company=pr.company,
)

ste7.reload()
self.assertEqual(ste7.items[0].valuation_rate, 275.00)

create_landed_cost_voucher("Purchase Receipt", pr.name, pr.company, charges=2500 * -1)

pr.reload()
Expand All @@ -1928,6 +1954,12 @@ def test_purchase_receipt_with_backdated_landed_cost_voucher(self):
ste5.reload()
self.assertEqual(ste5.items[0].valuation_rate, valuation_rate)

ste6.reload()
self.assertEqual(ste6.items[0].valuation_rate, valuation_rate)

ste7.reload()
self.assertEqual(ste7.items[0].valuation_rate, valuation_rate)


def prepare_data_for_internal_transfer():
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_internal_supplier
Expand Down
20 changes: 17 additions & 3 deletions erpnext/stock/stock_ledger.py
Original file line number Diff line number Diff line change
Expand Up @@ -512,7 +512,7 @@ def get_dependent_entries_to_fix(self, entries_to_fix, sle):

def update_distinct_item_warehouses(self, dependant_sle):
key = (dependant_sle.item_code, dependant_sle.warehouse)
val = frappe._dict({"sle": dependant_sle})
val = frappe._dict({"sle": dependant_sle, "dependent_voucher_detail_nos": []})

if key not in self.distinct_item_warehouses:
self.distinct_item_warehouses[key] = val
Expand All @@ -521,13 +521,26 @@ def update_distinct_item_warehouses(self, dependant_sle):
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):
val.sle_changed = True
self.distinct_item_warehouses[key] = val
self.new_items_found = True
elif self.distinct_item_warehouses[key].get("reposting_status"):
self.distinct_item_warehouses[key] = val
elif dependant_sle.voucher_detail_no not in set(dependent_voucher_detail_nos):
# Future dependent voucher needs to be repost to get the correct stock value
# If dependent voucher has not reposted, then add it to the list
dependent_voucher_detail_nos.append(dependant_sle.voucher_detail_no)
self.new_items_found = True
val.dependent_voucher_detail_nos = dependent_voucher_detail_nos
self.distinct_item_warehouses[key] = val

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 = []

return self.distinct_item_warehouses[key].dependent_voucher_detail_nos

def process_sle(self, sle):
from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos
Expand Down Expand Up @@ -1263,6 +1276,7 @@ def get_sle_by_voucher_detail_no(voucher_detail_no, excluded_sle=None):
"qty_after_transaction",
"posting_date",
"posting_time",
"voucher_detail_no",
"timestamp(posting_date, posting_time) as timestamp",
],
as_dict=1,
Expand Down

0 comments on commit a5a41f7

Please sign in to comment.