From dae6adfe13a07061ee89a772fa5e04903ea0d63c Mon Sep 17 00:00:00 2001 From: Navin-S-R Date: Sun, 11 Jan 2026 19:20:01 +0530 Subject: [PATCH 1/6] fix(asset value adjustment): skip cancelling revaluation journal entry if already cancelled (cherry picked from commit b1704ccef15c4f36cf41197f781f571cec8f0f11) # Conflicts: # erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py --- .../asset_value_adjustment.py | 30 ++++++++++++++++++- 1 file changed, 29 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 31fd62095df..2f6326628d8 100644 --- a/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py +++ b/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py @@ -57,7 +57,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, @@ -180,6 +180,7 @@ class AssetValueAdjustment(Document): get_link_to_form(self.get("doctype"), self.get("name")), ) +<<<<<<< HEAD make_new_active_asset_depr_schedules_and_cancel_current_ones( asset, notes, @@ -189,6 +190,33 @@ class AssetValueAdjustment(Document): ) asset.flags.ignore_validate_update_after_submit = True asset.save() +======= + return credit_entry, debit_entry + + def update_accounting_dimensions(self, credit_entry, debit_entry): + accounting_dimensions = get_checks_for_pl_and_bs_accounts() + + for dimension in accounting_dimensions: + dimension_value = self.get(dimension["fieldname"]) or dimension.get("default_dimension") + if dimension.get("mandatory_for_bs"): + credit_entry.update({dimension["fieldname"]: dimension_value}) + + 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() + reschedule_depreciation(asset, note) +>>>>>>> b1704ccef1 (fix(asset value adjustment): skip cancelling revaluation journal entry if already cancelled) asset.set_status() def update_asset_value_after_depreciation(self, difference_amount): From 426516a1ee65d7eeb5b419f3984fc9ad9a2e2b37 Mon Sep 17 00:00:00 2001 From: Navin-S-R Date: Sun, 11 Jan 2026 19:25:22 +0530 Subject: [PATCH 2/6] refactor(journal entry): replace raw SQL with query builder to unlink asset value adjustment (cherry picked from commit 5f00239bbae8e6251244e97c54459f9a5f4400db) --- .../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 0aa48dcd721..06ee475361f 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py @@ -448,11 +448,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 129457b2ce1766566a94b00faad2849cdf064d67 Mon Sep 17 00:00:00 2001 From: Navin-S-R Date: Sun, 11 Jan 2026 21:30:09 +0530 Subject: [PATCH 3/6] fix: ignore permissions when cancelling revaluation journal entry (cherry picked from commit 500c44e3f51fcfa6b8463de5c73110e3a5b73094) --- .../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 2f6326628d8..c9f12490c33 100644 --- a/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py +++ b/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py @@ -210,6 +210,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 07de3f43915f40644e3e32862899c45bbbd2b819 Mon Sep 17 00:00:00 2001 From: Navin-S-R Date: Mon, 12 Jan 2026 18:18:22 +0530 Subject: [PATCH 4/6] fix: prevent manual cancellation of the linked Revaluation Journal Entry (cherry picked from commit 73b038084b43a02f614f8148eb2353f4cf78c4fa) # Conflicts: # erpnext/accounts/doctype/journal_entry/journal_entry.py --- .../doctype/journal_entry/journal_entry.py | 22 +++++++++++++++++++ .../asset_value_adjustment.py | 1 + 2 files changed, 23 insertions(+) diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py index 06ee475361f..8e6a99716b0 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py @@ -177,6 +177,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") @@ -224,6 +227,11 @@ class JournalEntry(AccountsController): "Advance Payment Ledger Entry", ) self.make_gl_entries(1) +<<<<<<< HEAD +======= + JournalTaxWithholding(self).on_cancel() + self.has_asset_adjustment_entry() +>>>>>>> 73b038084b (fix: prevent manual cancellation of the linked Revaluation Journal Entry) self.unlink_advance_entry_reference() self.unlink_asset_reference() self.unlink_inter_company_jv() @@ -447,6 +455,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 c9f12490c33..4d554d4faea 100644 --- a/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py +++ b/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py @@ -212,6 +212,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 11d23e1a4a3ada7549640aabba04a9a838d6db3d Mon Sep 17 00:00:00 2001 From: Navin-S-R Date: Tue, 13 Jan 2026 12:16:52 +0530 Subject: [PATCH 5/6] fix: move validation to before_cancel (cherry picked from commit d65cd605a1bbc85fd0935c40c7a2c19b9016d736) # Conflicts: # erpnext/accounts/doctype/journal_entry/journal_entry.py --- erpnext/accounts/doctype/journal_entry/journal_entry.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py index 8e6a99716b0..14f4954c0e3 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py @@ -178,7 +178,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: @@ -230,8 +230,11 @@ class JournalEntry(AccountsController): <<<<<<< HEAD ======= JournalTaxWithholding(self).on_cancel() +<<<<<<< HEAD self.has_asset_adjustment_entry() >>>>>>> 73b038084b (fix: prevent manual cancellation of the linked Revaluation Journal Entry) +======= +>>>>>>> d65cd605a1 (fix: move validation to before_cancel) self.unlink_advance_entry_reference() self.unlink_asset_reference() self.unlink_inter_company_jv() From 3365bc3ba37599ad7b5cd58afa6834a04ebfe62b Mon Sep 17 00:00:00 2001 From: khushi8112 Date: Tue, 13 Jan 2026 16:23:00 +0530 Subject: [PATCH 6/6] chore: rebase with v15 branch --- .../doctype/journal_entry/journal_entry.py | 8 ---- .../asset_value_adjustment.py | 41 +++++-------------- 2 files changed, 10 insertions(+), 39 deletions(-) diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py index 14f4954c0e3..e7c0832554f 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py @@ -227,14 +227,6 @@ class JournalEntry(AccountsController): "Advance Payment Ledger Entry", ) self.make_gl_entries(1) -<<<<<<< HEAD -======= - JournalTaxWithholding(self).on_cancel() -<<<<<<< HEAD - self.has_asset_adjustment_entry() ->>>>>>> 73b038084b (fix: prevent manual cancellation of the linked Revaluation Journal Entry) -======= ->>>>>>> d65cd605a1 (fix: move validation to before_cancel) self.unlink_advance_entry_reference() self.unlink_asset_reference() self.unlink_inter_company_jv() 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 4d554d4faea..756b95f8fbd 100644 --- a/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py +++ b/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py @@ -159,6 +159,16 @@ class AssetValueAdjustment(Document): self.db_set("journal_entry", je.name) + 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.flags.ignore_permissions = True + revaluation_entry.flags.via_asset_value_adjustment = True + revaluation_entry.cancel() + def update_asset(self, asset_value=None): difference_amount = self.difference_amount if self.docstatus == 1 else -1 * self.difference_amount asset = self.update_asset_value_after_depreciation(difference_amount) @@ -180,7 +190,6 @@ class AssetValueAdjustment(Document): get_link_to_form(self.get("doctype"), self.get("name")), ) -<<<<<<< HEAD make_new_active_asset_depr_schedules_and_cancel_current_ones( asset, notes, @@ -190,36 +199,6 @@ class AssetValueAdjustment(Document): ) asset.flags.ignore_validate_update_after_submit = True asset.save() -======= - return credit_entry, debit_entry - - def update_accounting_dimensions(self, credit_entry, debit_entry): - accounting_dimensions = get_checks_for_pl_and_bs_accounts() - - for dimension in accounting_dimensions: - dimension_value = self.get(dimension["fieldname"]) or dimension.get("default_dimension") - if dimension.get("mandatory_for_bs"): - credit_entry.update({dimension["fieldname"]: dimension_value}) - - 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: - # 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): - asset = self.update_asset_value_after_depreciation() - note = self.get_adjustment_note() - reschedule_depreciation(asset, note) ->>>>>>> b1704ccef1 (fix(asset value adjustment): skip cancelling revaluation journal entry if already cancelled) asset.set_status() def update_asset_value_after_depreciation(self, difference_amount):