Merge pull request #36220 from marination/dunning-patch-acc-frozen
fix: Patch Dunnings after accounts were frozen
diff --git a/erpnext/patches/v14_0/single_to_multi_dunning.py b/erpnext/patches/v14_0/single_to_multi_dunning.py
index 7a8e591..3b01871 100644
--- a/erpnext/patches/v14_0/single_to_multi_dunning.py
+++ b/erpnext/patches/v14_0/single_to_multi_dunning.py
@@ -7,7 +7,16 @@
frappe.reload_doc("accounts", "doctype", "overdue_payment")
frappe.reload_doc("accounts", "doctype", "dunning")
- all_dunnings = frappe.get_all("Dunning", filters={"docstatus": ("!=", 2)}, pluck="name")
+ # Migrate schema of all uncancelled dunnings
+ filters = {"docstatus": ("!=", 2)}
+
+ can_edit_accounts_after = get_accounts_closing_date()
+ if can_edit_accounts_after:
+ # Get dunnings after the date when accounts were frozen/closed
+ filters["posting_date"] = (">", can_edit_accounts_after)
+
+ all_dunnings = frappe.get_all("Dunning", filters=filters, pluck="name")
+
for dunning_name in all_dunnings:
dunning = frappe.get_doc("Dunning", dunning_name)
if not dunning.sales_invoice:
@@ -41,9 +50,29 @@
dunning.flags.ignore_validate_update_after_submit = True
dunning.save()
- if dunning.status != "Resolved":
+ # Reverse entries only if dunning is submitted and not resolved
+ if dunning.docstatus == 1 and dunning.status != "Resolved":
# With the new logic, dunning amount gets recorded as additional income
# at time of payment. We don't want to record the dunning amount twice,
# so we reverse previous GL Entries that recorded the dunning amount at
# time of submission of the Dunning.
make_reverse_gl_entries(voucher_type="Dunning", voucher_no=dunning.name)
+
+
+def get_accounts_closing_date():
+ """Get the date when accounts were frozen/closed"""
+ accounts_frozen_till = frappe.db.get_single_value(
+ "Accounts Settings", "acc_frozen_upto"
+ ) # always returns datetime.date
+
+ period_closing_date = frappe.db.get_value(
+ "Period Closing Voucher", {"docstatus": 1}, "posting_date", order_by="posting_date desc"
+ )
+
+ # Set most recent frozen/closing date as filter
+ if accounts_frozen_till and period_closing_date:
+ can_edit_accounts_after = max(accounts_frozen_till, period_closing_date)
+ else:
+ can_edit_accounts_after = accounts_frozen_till or period_closing_date
+
+ return can_edit_accounts_after