fix: last SLE not updated in the file

(cherry picked from commit 38ed425ee2)

# Conflicts:
#	erpnext/manufacturing/doctype/work_order/test_work_order.py
This commit is contained in:
Rohit Waghchaure
2026-04-08 18:22:08 +05:30
committed by Mergify
parent a56d6984d1
commit 8408e81335
2 changed files with 70 additions and 27 deletions

View File

@@ -509,7 +509,45 @@ class TestWorkOrder(FrappeTestCase):
def test_work_order_material_transferred_qty_with_process_loss(self):
stock_entries = []
<<<<<<< HEAD
bom = frappe.get_doc("BOM", {"docstatus": 1, "with_operations": 1, "company": "_Test Company"})
=======
item_code = make_item("_Test Item For Process Loss", {"is_stock_item": 1}).name
rm_item_code = make_item("Test Item For Process Loss RM", {"is_stock_item": 1}).name
bom = make_bom(
item=item_code,
raw_materials=[rm_item_code],
with_operations=1,
do_not_save=True,
)
operation_name = "_Test Custom Operation"
workstation_name = "_Test Custom Workstation"
if not frappe.db.exists("Workstation", workstation_name):
doc = frappe.new_doc("Workstation")
doc.workstation_name = workstation_name
doc.save()
if not frappe.db.exists("Operation", operation_name):
doc = frappe.new_doc("Operation")
doc.name = operation_name
doc.workstation = workstation_name
doc.save()
operation = {
"operation": operation_name,
"workstation": workstation_name,
"description": "Test Data",
"operating_cost": 100,
"time_in_mins": 40,
}
bom.append("operations", operation)
bom.save()
bom.submit()
>>>>>>> 38ed425ee2 (fix: last SLE not updated in the file)
work_order = make_wo_order_test_record(
item=bom.item,

View File

@@ -263,17 +263,11 @@ def update_args_in_repost_item_valuation(
items_to_be_repost,
repost_affected_transaction,
item_wh_wise_last_posted_sle=None,
only_affected_transaction=False,
):
file_name = ""
has_file = False
if not item_wh_wise_last_posted_sle:
item_wh_wise_last_posted_sle = {}
if doc.reposting_data_file:
has_file = True
if doc.reposting_data_file:
file_name = get_reposting_file_name(doc.doctype, doc.name)
# frappe.delete_doc("File", file_name, ignore_permissions=True, delete_permanently=True)
@@ -288,15 +282,14 @@ def update_args_in_repost_item_valuation(
file_name,
)
if not only_affected_transaction or not has_file:
doc.db_set(
{
"current_index": index,
"items_to_be_repost": frappe.as_json(items_to_be_repost),
"total_reposting_count": len(items_to_be_repost),
"reposting_data_file": doc.reposting_data_file,
}
)
doc.db_set(
{
"current_index": index,
"items_to_be_repost": frappe.as_json(items_to_be_repost),
"total_reposting_count": len(items_to_be_repost),
"reposting_data_file": doc.reposting_data_file,
}
)
if not frappe.flags.in_test:
frappe.db.commit()
@@ -577,13 +570,9 @@ class update_entries_after:
self.update_bin()
else:
self.item_wh_wise_last_posted_sle = self.get_item_wh_wise_last_posted_sle()
_item_wh_sle = self.sort_sles(self.item_wh_wise_last_posted_sle.values())
while _item_wh_sle:
self.initialize_reposting()
sle_dict = _item_wh_sle.pop(0)
self.repost_stock_ledgers(sle_dict)
item_wh_sles = self.sort_sles(self.item_wh_wise_last_posted_sle.values())
self.initialize_reposting()
self.repost_stock_ledgers(item_wh_sles)
self.update_bin()
self.reset_vouchers_and_idx()
self.update_data_in_repost()
@@ -618,8 +607,19 @@ class update_entries_after:
)
}
def repost_stock_ledgers(self, sle_dict=None):
self._sles = self.get_future_entries_to_repost(sle_dict)
def _get_future_entries_to_repost(self, item_wh_sles):
sles = []
for sle in item_wh_sles:
if (sle.item_code, sle.warehouse) not in self.distinct_dependant_item_wh:
self.distinct_dependant_item_wh.add((sle.item_code, sle.warehouse))
sles.extend(self.get_future_entries_to_repost(sle))
return self.sort_sles(sles)
def repost_stock_ledgers(self, item_wh_sles=None):
self._sles = self._get_future_entries_to_repost(item_wh_sles)
if not isinstance(self._sles, deque):
self._sles = deque(self._sles)
@@ -627,10 +627,13 @@ class update_entries_after:
i = 0
while self._sles:
sle = self._sles.popleft()
i += 1
if (sle.item_code, sle.warehouse) not in self.distinct_dependant_item_wh:
self.distinct_dependant_item_wh.add((sle.item_code, sle.warehouse))
if sle.name in self.distinct_sles:
continue
i += 1
item_wh_key = (sle.item_code, sle.warehouse)
if item_wh_key not in self.prev_sle_dict:
self.prev_sle_dict[item_wh_key] = get_previous_sle_of_current_voucher(sle)
@@ -644,7 +647,7 @@ class update_entries_after:
self.include_dependant_sle_in_reposting(sle)
self.update_item_wh_wise_last_posted_sle(sle)
if i % 1000 == 0:
if i % 2000 == 0:
self.update_data_in_repost(len(self._sles), i)
def sort_sles(self, sles):
@@ -726,7 +729,6 @@ class update_entries_after:
self.items_to_be_repost,
self.repost_affected_transaction,
self.item_wh_wise_last_posted_sle,
only_affected_transaction=True,
)
if not frappe.flags.in_test:
@@ -982,6 +984,9 @@ class update_entries_after:
):
return
if not cint(erpnext.is_perpetual_inventory_enabled(sle.company)):
return
if self.args.item_code != sle.item_code or self.args.warehouse != sle.warehouse:
self.repost_affected_transaction.add((sle.voucher_type, sle.voucher_no))