fix: disable deferred naming on SLE/GLE if hash method is used. (#30286)
* fix: dont rename GLE/SLE that dont have naming series
* test: tests for deferred naming of ledgers
diff --git a/erpnext/accounts/doctype/gl_entry/gl_entry.py b/erpnext/accounts/doctype/gl_entry/gl_entry.py
index 9d1452b..192099b 100644
--- a/erpnext/accounts/doctype/gl_entry/gl_entry.py
+++ b/erpnext/accounts/doctype/gl_entry/gl_entry.py
@@ -32,6 +32,8 @@
name will be changed using autoname options (in a scheduled job)
"""
self.name = frappe.generate_hash(txt="", length=10)
+ if self.meta.autoname == "hash":
+ self.to_rename = 0
def validate(self):
self.flags.ignore_submit_comment = True
diff --git a/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py b/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
index c538307..2f59304 100644
--- a/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
+++ b/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
@@ -26,6 +26,8 @@
name will be changed using autoname options (in a scheduled job)
"""
self.name = frappe.generate_hash(txt="", length=10)
+ if self.meta.autoname == "hash":
+ self.to_rename = 0
def validate(self):
self.flags.ignore_submit_comment = True
diff --git a/erpnext/stock/doctype/stock_ledger_entry/test_stock_ledger_entry.py b/erpnext/stock/doctype/stock_ledger_entry/test_stock_ledger_entry.py
index 2352235..fc57995 100644
--- a/erpnext/stock/doctype/stock_ledger_entry/test_stock_ledger_entry.py
+++ b/erpnext/stock/doctype/stock_ledger_entry/test_stock_ledger_entry.py
@@ -7,9 +7,11 @@
import frappe
from frappe.core.page.permission_manager.permission_manager import reset
+from frappe.custom.doctype.property_setter.property_setter import make_property_setter
from frappe.tests.utils import FrappeTestCase
from frappe.utils import add_days, today
+from erpnext.accounts.doctype.gl_entry.gl_entry import rename_gle_sle_docs
from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note
from erpnext.stock.doctype.item.test_item import make_item
from erpnext.stock.doctype.landed_cost_voucher.test_landed_cost_voucher import (
@@ -939,3 +941,62 @@
# Used to isolate valuation sensitive
# tests to prevent future tests from failing.
return str(uuid4())[:8].upper()
+
+
+class TestDeferredNaming(FrappeTestCase):
+
+ @classmethod
+ def setUpClass(cls) -> None:
+ super().setUpClass()
+ cls.gle_autoname = frappe.get_meta("GL Entry").autoname
+ cls.sle_autoname = frappe.get_meta("Stock Ledger Entry").autoname
+
+ def setUp(self) -> None:
+ self.item = make_item().name
+ self.warehouse = "Stores - TCP1"
+ self.company = "_Test Company with perpetual inventory"
+
+ def tearDown(self) -> None:
+ make_property_setter(doctype="GL Entry", for_doctype=True,
+ property="autoname", value=self.gle_autoname, property_type="Data", fieldname=None)
+ make_property_setter(doctype="Stock Ledger Entry", for_doctype=True,
+ property="autoname", value=self.sle_autoname, property_type="Data", fieldname=None)
+
+ # since deferred naming autocommits, commit all changes to avoid flake
+ frappe.db.commit() # nosemgrep
+
+ @staticmethod
+ def get_gle_sles(se):
+ filters = {"voucher_type": se.doctype, "voucher_no": se.name}
+ gle = set(frappe.get_list("GL Entry", filters, pluck="name"))
+ sle = set(frappe.get_list("Stock Ledger Entry", filters, pluck="name"))
+ return gle, sle
+
+ def test_deferred_naming(self):
+ se = make_stock_entry(item_code=self.item, to_warehouse=self.warehouse,
+ qty=10, rate=100, company=self.company)
+
+ gle, sle = self.get_gle_sles(se)
+ rename_gle_sle_docs()
+ renamed_gle, renamed_sle = self.get_gle_sles(se)
+
+ self.assertFalse(gle & renamed_gle, msg="GLEs not renamed")
+ self.assertFalse(sle & renamed_sle, msg="SLEs not renamed")
+ se.cancel()
+
+ def test_hash_naming(self):
+ # disable naming series
+ for doctype in ("GL Entry", "Stock Ledger Entry"):
+ make_property_setter(doctype=doctype, for_doctype=True,
+ property="autoname", value="hash", property_type="Data", fieldname=None)
+
+ se = make_stock_entry(item_code=self.item, to_warehouse=self.warehouse,
+ qty=10, rate=100, company=self.company)
+
+ gle, sle = self.get_gle_sles(se)
+ rename_gle_sle_docs()
+ renamed_gle, renamed_sle = self.get_gle_sles(se)
+
+ self.assertEqual(gle, renamed_gle, msg="GLEs are renamed while using hash naming")
+ self.assertEqual(sle, renamed_sle, msg="SLEs are renamed while using hash naming")
+ se.cancel()