From b1704ccef15c4f36cf41197f781f571cec8f0f11 Mon Sep 17 00:00:00 2001 From: Navin-S-R Date: Sun, 11 Jan 2026 19:20:01 +0530 Subject: [PATCH 1/5] fix(asset value adjustment): skip cancelling revaluation journal entry if already cancelled --- .../asset_value_adjustment/asset_value_adjustment.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py b/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py index 982c6f4fc7d..0cf7b63a3f3 100644 --- a/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py +++ b/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py @@ -74,7 +74,7 @@ class AssetValueAdjustment(Document): ) def on_cancel(self): - frappe.get_doc("Journal Entry", self.journal_entry).cancel() + self.cancel_asset_revaluation_entry() self.update_asset() add_asset_activity( self.asset, @@ -167,6 +167,14 @@ class AssetValueAdjustment(Document): if dimension.get("mandatory_for_pl"): debit_entry.update({dimension["fieldname"]: dimension_value}) + def cancel_asset_revaluation_entry(self): + if not self.journal_entry: + return + + revaluation_entry = frappe.get_doc("Journal Entry", self.journal_entry) + if revaluation_entry.docstatus == 1: + revaluation_entry.cancel() + def update_asset(self): asset = self.update_asset_value_after_depreciation() note = self.get_adjustment_note() From 5f00239bbae8e6251244e97c54459f9a5f4400db Mon Sep 17 00:00:00 2001 From: Navin-S-R Date: Sun, 11 Jan 2026 19:25:22 +0530 Subject: [PATCH 2/5] refactor(journal entry): replace raw SQL with query builder to unlink asset value adjustment --- .../accounts/doctype/journal_entry/journal_entry.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py index 93b95d7c02e..5b877e84283 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py @@ -555,11 +555,12 @@ class JournalEntry(AccountsController): frappe.db.set_value("Journal Entry", self.name, "inter_company_journal_entry_reference", "") def unlink_asset_adjustment_entry(self): - frappe.db.sql( - """ update `tabAsset Value Adjustment` - set journal_entry = null where journal_entry = %s""", - self.name, - ) + AssetValueAdjustment = frappe.qb.DocType("Asset Value Adjustment") + ( + frappe.qb.update(AssetValueAdjustment) + .set(AssetValueAdjustment.journal_entry, None) + .where(AssetValueAdjustment.journal_entry == self.name) + ).run() def validate_party(self): for d in self.get("accounts"): From 500c44e3f51fcfa6b8463de5c73110e3a5b73094 Mon Sep 17 00:00:00 2001 From: Navin-S-R Date: Sun, 11 Jan 2026 21:30:09 +0530 Subject: [PATCH 3/5] fix: ignore permissions when cancelling revaluation journal entry --- .../doctype/asset_value_adjustment/asset_value_adjustment.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py b/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py index 0cf7b63a3f3..3b0a8a6459b 100644 --- a/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py +++ b/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py @@ -173,6 +173,8 @@ class AssetValueAdjustment(Document): revaluation_entry = frappe.get_doc("Journal Entry", self.journal_entry) if revaluation_entry.docstatus == 1: + # Ignore permissions to match Journal Entry submission behavior + revaluation_entry.flags.ignore_permissions = True revaluation_entry.cancel() def update_asset(self): From 73b038084b43a02f614f8148eb2353f4cf78c4fa Mon Sep 17 00:00:00 2001 From: Navin-S-R Date: Mon, 12 Jan 2026 18:18:22 +0530 Subject: [PATCH 4/5] fix: prevent manual cancellation of the linked Revaluation Journal Entry --- .../doctype/journal_entry/journal_entry.py | 18 ++++++++++++++++++ .../asset_value_adjustment.py | 1 + 2 files changed, 19 insertions(+) diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py index 5b877e84283..1c10208378a 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py @@ -184,6 +184,9 @@ class JournalEntry(AccountsController): else: return self._submit() + def before_cancel(self): + pass + def cancel(self): if len(self.accounts) > 100: queue_submission(self, "_cancel") @@ -305,6 +308,7 @@ class JournalEntry(AccountsController): ) self.make_gl_entries(1) JournalTaxWithholding(self).on_cancel() + self.has_asset_adjustment_entry() self.unlink_advance_entry_reference() self.unlink_asset_reference() self.unlink_inter_company_jv() @@ -554,6 +558,20 @@ class JournalEntry(AccountsController): ) frappe.db.set_value("Journal Entry", self.name, "inter_company_journal_entry_reference", "") + def has_asset_adjustment_entry(self): + if self.flags.get("via_asset_value_adjustment"): + return + + asset_value_adjustment = frappe.db.get_value( + "Asset Value Adjustment", {"docstatus": 1, "journal_entry": self.name}, "name" + ) + if asset_value_adjustment: + frappe.throw( + _( + "Cannot cancel this document as it is linked with the submitted Asset Value Adjustment {0}. Please cancel the Asset Value Adjustment to continue." + ).format(frappe.utils.get_link_to_form("Asset Value Adjustment", asset_value_adjustment)) + ) + def unlink_asset_adjustment_entry(self): AssetValueAdjustment = frappe.qb.DocType("Asset Value Adjustment") ( diff --git a/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py b/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py index 3b0a8a6459b..c033cda05b5 100644 --- a/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py +++ b/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py @@ -175,6 +175,7 @@ class AssetValueAdjustment(Document): if revaluation_entry.docstatus == 1: # Ignore permissions to match Journal Entry submission behavior revaluation_entry.flags.ignore_permissions = True + revaluation_entry.flags.via_asset_value_adjustment = True revaluation_entry.cancel() def update_asset(self): From d65cd605a1bbc85fd0935c40c7a2c19b9016d736 Mon Sep 17 00:00:00 2001 From: Navin-S-R Date: Tue, 13 Jan 2026 12:16:52 +0530 Subject: [PATCH 5/5] fix: move validation to before_cancel --- erpnext/accounts/doctype/journal_entry/journal_entry.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py index 1c10208378a..ce435482ae5 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py @@ -185,7 +185,7 @@ class JournalEntry(AccountsController): return self._submit() def before_cancel(self): - pass + self.has_asset_adjustment_entry() def cancel(self): if len(self.accounts) > 100: @@ -308,7 +308,6 @@ class JournalEntry(AccountsController): ) self.make_gl_entries(1) JournalTaxWithholding(self).on_cancel() - self.has_asset_adjustment_entry() self.unlink_advance_entry_reference() self.unlink_asset_reference() self.unlink_inter_company_jv()