fix: Updation of dunning on PE cancellation
diff --git a/erpnext/accounts/doctype/dunning/dunning.py b/erpnext/accounts/doctype/dunning/dunning.py
index 1daaf06..1447ac0 100644
--- a/erpnext/accounts/doctype/dunning/dunning.py
+++ b/erpnext/accounts/doctype/dunning/dunning.py
@@ -75,16 +75,23 @@
 	when a Payment Entry is submitted.
 	"""
 	for reference in doc.references:
-		# Consider partial and full payments
-		if (
-			reference.reference_doctype == "Sales Invoice"
-			and reference.outstanding_amount < reference.total_amount
-		):
-			unresolved_dunnings = get_unresolved_dunnings(reference.reference_name)
+		# Consider partial and full payments:
+		# Submitting full payment: outstanding_amount will be 0
+		# Submitting 1st partial payment: outstanding_amount will be the pending installment
+		# Cancelling full payment: outstanding_amount will revert to total amount
+		# Cancelling last partial payment: outstanding_amount will revert to pending amount
+		submit_condition = reference.outstanding_amount < reference.total_amount
+		cancel_condition = reference.outstanding_amount <= reference.total_amount
 
-			for dunning_name in unresolved_dunnings:
+		if reference.reference_doctype == "Sales Invoice" and (
+			submit_condition if doc.docstatus == 1 else cancel_condition
+		):
+			state = "Resolved" if doc.docstatus == 2 else "Unresolved"
+			dunnings = get_linked_dunnings_as_per_state(reference.reference_name, state)
+
+			for dunning in dunnings:
 				resolve = True
-				dunning = frappe.get_doc("Dunning", dunning_name)
+				dunning = frappe.get_doc("Dunning", dunning.get("name"))
 				for overdue_payment in dunning.overdue_payments:
 					outstanding_inv = frappe.get_value(
 						"Sales Invoice", overdue_payment.sales_invoice, "outstanding_amount"
@@ -92,15 +99,13 @@
 					outstanding_ps = frappe.get_value(
 						"Payment Schedule", overdue_payment.payment_schedule, "outstanding"
 					)
-					if outstanding_ps > 0 and outstanding_inv > 0:
-						resolve = False
+					resolve = False if (outstanding_ps > 0 and outstanding_inv > 0) else True
 
-				if resolve:
-					dunning.status = "Resolved"
-					dunning.save()
+				dunning.status = "Resolved" if resolve else "Unresolved"
+				dunning.save()
 
 
-def get_unresolved_dunnings(sales_invoice):
+def get_linked_dunnings_as_per_state(sales_invoice, state):
 	dunning = frappe.qb.DocType("Dunning")
 	overdue_payment = frappe.qb.DocType("Overdue Payment")
 
@@ -110,7 +115,7 @@
 		.on(overdue_payment.parent == dunning.name)
 		.select(dunning.name)
 		.where(
-			(dunning.status != "Resolved")
+			(dunning.status == state)
 			& (dunning.docstatus != 2)
 			& (overdue_payment.sales_invoice == sales_invoice)
 		)
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index c821fcf..6d64f64 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -334,6 +334,7 @@
 			"erpnext.accounts.doctype.payment_request.payment_request.update_payment_req_status",
 			"erpnext.accounts.doctype.dunning.dunning.resolve_dunning",
 		],
+		"on_cancel": ["erpnext.accounts.doctype.dunning.dunning.resolve_dunning"],
 		"on_trash": "erpnext.regional.check_deletion_permission",
 	},
 	"Address": {