chore: patch for updating flag in Cr/Dr notes
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index 8033289..15dfc36 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -356,6 +356,7 @@
 erpnext.patches.v15_0.create_advance_payment_status
 erpnext.patches.v15_0.allow_on_submit_dimensions_for_repostable_doctypes
 erpnext.patches.v14_0.create_accounting_dimensions_in_reconciliation_tool
+erpnext.patches.v14_0.update_flag_for_return_invoices
 # below migration patch should always run last
 erpnext.patches.v14_0.migrate_gl_to_payment_ledger
 erpnext.stock.doctype.delivery_note.patches.drop_unused_return_against_index # 2023-12-20
diff --git a/erpnext/patches/v14_0/update_flag_for_return_invoices.py b/erpnext/patches/v14_0/update_flag_for_return_invoices.py
new file mode 100644
index 0000000..feb43be
--- /dev/null
+++ b/erpnext/patches/v14_0/update_flag_for_return_invoices.py
@@ -0,0 +1,62 @@
+from frappe import qb
+
+
+def execute():
+	# Set "update_outstanding_for_self" flag in Credit/Debit Notes
+	# Fetch Credit/Debit notes that does have 'return_against' but still post ledger entries against themselves.
+
+	gle = qb.DocType("GL Entry")
+
+	# Use hardcoded 'creation' date to isolate Credit/Debit notes created post v14 backport
+	# https://github.com/frappe/erpnext/pull/39497
+	creation_date = "2024-01-25"
+
+	si = qb.DocType("Sales Invoice")
+	if cr_notes := (
+		qb.from_(si)
+		.select(si.name)
+		.where(
+			(si.creation.gte(creation_date))
+			& (si.docstatus == 1)
+			& (si.is_return == True)
+			& (si.return_against.notnull())
+		)
+		.run()
+	):
+		cr_notes = [x[0] for x in cr_notes]
+		if docs_that_require_update := (
+			qb.from_(gle)
+			.select(gle.voucher_no)
+			.distinct()
+			.where((gle.voucher_no.isin(cr_notes)) & (gle.voucher_no == gle.against_voucher))
+			.run()
+		):
+			docs_that_require_update = [x[0] for x in docs_that_require_update]
+			qb.update(si).set(si.update_outstanding_for_self, True).where(
+				si.name.isin(docs_that_require_update)
+			).run()
+
+	pi = qb.DocType("Purchase Invoice")
+	if dr_notes := (
+		qb.from_(pi)
+		.select(pi.name)
+		.where(
+			(pi.creation.gte(creation_date))
+			& (pi.docstatus == 1)
+			& (pi.is_return == True)
+			& (pi.return_against.notnull())
+		)
+		.run()
+	):
+		dr_notes = [x[0] for x in dr_notes]
+		if docs_that_require_update := (
+			qb.from_(gle)
+			.select(gle.voucher_no)
+			.distinct()
+			.where((gle.voucher_no.isin(dr_notes)) & (gle.voucher_no == gle.against_voucher))
+			.run()
+		):
+			docs_that_require_update = [x[0] for x in docs_that_require_update]
+			qb.update(pi).set(pi.update_outstanding_for_self, True).where(
+				pi.name.isin(docs_that_require_update)
+			).run()