fix: Account balance patch and query fixes (#36117)

diff --git a/erpnext/accounts/report/trial_balance/trial_balance.py b/erpnext/accounts/report/trial_balance/trial_balance.py
index d51c4c4..7a8b7dc 100644
--- a/erpnext/accounts/report/trial_balance/trial_balance.py
+++ b/erpnext/accounts/report/trial_balance/trial_balance.py
@@ -159,6 +159,8 @@
 			accounting_dimensions,
 			period_closing_voucher=last_period_closing_voucher[0].name,
 		)
+
+		# Report getting generate from the mid of a fiscal year
 		if getdate(last_period_closing_voucher[0].posting_date) < getdate(
 			add_days(filters.from_date, -1)
 		):
@@ -220,7 +222,10 @@
 		if start_date:
 			opening_balance = opening_balance.where(closing_balance.posting_date >= start_date)
 			opening_balance = opening_balance.where(closing_balance.is_opening == "No")
-		opening_balance = opening_balance.where(closing_balance.posting_date < filters.from_date)
+		else:
+			opening_balance = opening_balance.where(
+				(closing_balance.posting_date < filters.from_date) | (closing_balance.is_opening == "Yes")
+			)
 
 	if (
 		not filters.show_unclosed_fy_pl_balances
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index b3b9bc6..f9d9ebb 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -317,7 +317,7 @@
 erpnext.patches.v15_0.update_asset_value_for_manual_depr_entries
 erpnext.patches.v15_0.update_gpa_and_ndb_for_assdeprsch
 erpnext.patches.v14_0.create_accounting_dimensions_for_closing_balance
-erpnext.patches.v14_0.update_closing_balances #17-05-2023
+erpnext.patches.v14_0.update_closing_balances #14-07-2023
 execute:frappe.db.set_single_value("Accounts Settings", "merge_similar_account_heads", 0)
 # below migration patches should always run last
 erpnext.patches.v14_0.migrate_gl_to_payment_ledger
diff --git a/erpnext/patches/v14_0/update_closing_balances.py b/erpnext/patches/v14_0/update_closing_balances.py
index 9a814f3..8849c11 100644
--- a/erpnext/patches/v14_0/update_closing_balances.py
+++ b/erpnext/patches/v14_0/update_closing_balances.py
@@ -13,59 +13,62 @@
 def execute():
 	frappe.db.truncate("Account Closing Balance")
 
-	i = 0
-	company_wise_order = {}
-	for pcv in frappe.db.get_all(
-		"Period Closing Voucher",
-		fields=["company", "posting_date", "name"],
-		filters={"docstatus": 1},
-		order_by="posting_date",
-	):
+	for company in frappe.get_all("Company", pluck="name"):
+		i = 0
+		company_wise_order = {}
+		for pcv in frappe.db.get_all(
+			"Period Closing Voucher",
+			fields=["company", "posting_date", "name"],
+			filters={"docstatus": 1, "company": company},
+			order_by="posting_date",
+		):
 
-		company_wise_order.setdefault(pcv.company, [])
-		if pcv.posting_date not in company_wise_order[pcv.company]:
-			pcv_doc = frappe.get_doc("Period Closing Voucher", pcv.name)
-			pcv_doc.year_start_date = get_fiscal_year(
-				pcv.posting_date, pcv.fiscal_year, company=pcv.company
-			)[1]
+			company_wise_order.setdefault(pcv.company, [])
+			if pcv.posting_date not in company_wise_order[pcv.company]:
+				pcv_doc = frappe.get_doc("Period Closing Voucher", pcv.name)
+				pcv_doc.year_start_date = get_fiscal_year(
+					pcv.posting_date, pcv.fiscal_year, company=pcv.company
+				)[1]
 
-			# get gl entries against pcv
-			gl_entries = frappe.db.get_all(
-				"GL Entry", filters={"voucher_no": pcv.name, "is_cancelled": 0}, fields=["*"]
-			)
-			for entry in gl_entries:
-				entry["is_period_closing_voucher_entry"] = 1
-				entry["closing_date"] = pcv_doc.posting_date
-				entry["period_closing_voucher"] = pcv_doc.name
-
-			# get all gl entries for the year
-			closing_entries = frappe.db.get_all(
-				"GL Entry",
-				filters={
-					"is_cancelled": 0,
-					"voucher_no": ["!=", pcv.name],
-					"posting_date": ["between", [pcv_doc.year_start_date, pcv.posting_date]],
-					"is_opening": "No",
-				},
-				fields=["*"],
-			)
-
-			if i == 0:
-				# add opening entries only for the first pcv
-				closing_entries += frappe.db.get_all(
-					"GL Entry",
-					filters={"is_cancelled": 0, "is_opening": "Yes"},
-					fields=["*"],
+				# get gl entries against pcv
+				gl_entries = frappe.db.get_all(
+					"GL Entry", filters={"voucher_no": pcv.name, "is_cancelled": 0}, fields=["*"]
 				)
+				for entry in gl_entries:
+					entry["is_period_closing_voucher_entry"] = 1
+					entry["closing_date"] = pcv_doc.posting_date
+					entry["period_closing_voucher"] = pcv_doc.name
 
-			for entry in closing_entries:
-				entry["closing_date"] = pcv_doc.posting_date
-				entry["period_closing_voucher"] = pcv_doc.name
+				closing_entries = []
 
-			entries = gl_entries + closing_entries
-			if entries:
-				make_closing_entries(entries, voucher_name=pcv.name)
+				if pcv.posting_date not in company_wise_order[pcv.company]:
+					# get all gl entries for the year
+					closing_entries = frappe.db.get_all(
+						"GL Entry",
+						filters={
+							"is_cancelled": 0,
+							"voucher_no": ["!=", pcv.name],
+							"posting_date": ["between", [pcv_doc.year_start_date, pcv.posting_date]],
+							"is_opening": "No",
+						},
+						fields=["*"],
+					)
 
-			company_wise_order[pcv.company].append(pcv.posting_date)
+				if i == 0:
+					# add opening entries only for the first pcv
+					closing_entries += frappe.db.get_all(
+						"GL Entry",
+						filters={"is_cancelled": 0, "is_opening": "Yes"},
+						fields=["*"],
+					)
 
-			i += 1
+				for entry in closing_entries:
+					entry["closing_date"] = pcv_doc.posting_date
+					entry["period_closing_voucher"] = pcv_doc.name
+
+				entries = gl_entries + closing_entries
+
+				if entries:
+					make_closing_entries(entries, voucher_name=pcv.name)
+					i += 1
+					company_wise_order[pcv.company].append(pcv.posting_date)