refactor: additional filters and columns in Payment Ledger report (#34577)

1. 'Party type' and 'Party' filters have been added
2. checkbox to include Amount in Acccount Currency
3. Grouping vouchers on Party
4. Replaced Company with Posting Date
diff --git a/erpnext/accounts/report/payment_ledger/payment_ledger.js b/erpnext/accounts/report/payment_ledger/payment_ledger.js
index 9779844..a5a4108 100644
--- a/erpnext/accounts/report/payment_ledger/payment_ledger.js
+++ b/erpnext/accounts/report/payment_ledger/payment_ledger.js
@@ -38,6 +38,29 @@
 			}
 		},
 		{
+			"fieldname":"party_type",
+			"label": __("Party Type"),
+			"fieldtype": "Link",
+			"options": "Party Type",
+			"default": "",
+			on_change: function() {
+				frappe.query_report.set_filter_value('party', "");
+			}
+		},
+		{
+			"fieldname":"party",
+			"label": __("Party"),
+			"fieldtype": "MultiSelectList",
+			get_data: function(txt) {
+				if (!frappe.query_report.filters) return;
+
+				let party_type = frappe.query_report.get_filter_value('party_type');
+				if (!party_type) return;
+
+				return frappe.db.get_link_options(party_type, txt);
+			},
+		},
+		{
 			"fieldname":"voucher_no",
 			"label": __("Voucher No"),
 			"fieldtype": "Data",
@@ -49,6 +72,20 @@
 			"fieldtype": "Data",
 			"width": 100,
 		},
+		{
+			"fieldname":"include_account_currency",
+			"label": __("Include Account Currency"),
+			"fieldtype": "Check",
+			"width": 100,
+		},
+		{
+			"fieldname":"group_party",
+			"label": __("Group by Party"),
+			"fieldtype": "Check",
+			"width": 100,
+		},
+
+
 
 	]
 	return filters;
diff --git a/erpnext/accounts/report/payment_ledger/payment_ledger.py b/erpnext/accounts/report/payment_ledger/payment_ledger.py
index e470c27..8875d27 100644
--- a/erpnext/accounts/report/payment_ledger/payment_ledger.py
+++ b/erpnext/accounts/report/payment_ledger/payment_ledger.py
@@ -17,34 +17,26 @@
 		self.ple = qb.DocType("Payment Ledger Entry")
 
 	def init_voucher_dict(self):
-
 		if self.voucher_amount:
-			s = set()
-			# build  a set of unique vouchers
+			# for each ple, using group_by_key to create a key and assign it to +/- list
 			for ple in self.voucher_amount:
-				key = (ple.voucher_type, ple.voucher_no, ple.party)
-				s.add(key)
+				group_by_key = None
+				if not self.filters.group_party:
+					group_by_key = (ple.against_voucher_type, ple.against_voucher_no, ple.party)
+				else:
+					group_by_key = (ple.party_type, ple.party)
 
-			# for each unique vouchers, initialize +/- list
-			for key in s:
-				self.voucher_dict[key] = frappe._dict(increase=list(), decrease=list())
-
-			# for each ple, using against voucher and amount, assign it to +/- list
-			# group by against voucher
-			for ple in self.voucher_amount:
-				against_key = (ple.against_voucher_type, ple.against_voucher_no, ple.party)
 				target = None
-				if self.voucher_dict.get(against_key):
-					if ple.amount > 0:
-						target = self.voucher_dict.get(against_key).increase
-					else:
-						target = self.voucher_dict.get(against_key).decrease
+				if ple.amount > 0:
+					target = self.voucher_dict.setdefault(group_by_key, {}).setdefault("increase", [])
+				else:
+					target = self.voucher_dict.setdefault(group_by_key, {}).setdefault("decrease", [])
 
 				# this if condition will lose unassigned ple entries(against_voucher doc doesn't have ple)
 				# need to somehow include the stray entries as well.
 				if target is not None:
 					entry = frappe._dict(
-						company=ple.company,
+						posting_date=ple.posting_date,
 						account=ple.account,
 						party_type=ple.party_type,
 						party=ple.party,
@@ -66,10 +58,10 @@
 
 		for value in self.voucher_dict.values():
 			voucher_data = []
-			if value.increase != []:
-				voucher_data.extend(value.increase)
-			if value.decrease != []:
-				voucher_data.extend(value.decrease)
+			if value.get("increase"):
+				voucher_data.extend(value.get("increase"))
+			if value.get("decrease"):
+				voucher_data.extend(value.get("decrease"))
 
 			if voucher_data:
 				# balance row
@@ -117,6 +109,12 @@
 		if self.filters.against_voucher_no:
 			self.conditions.append(self.ple.against_voucher_no == self.filters.against_voucher_no)
 
+		if self.filters.party_type:
+			self.conditions.append(self.ple.party_type == self.filters.party_type)
+
+		if self.filters.party:
+			self.conditions.append(self.ple.party.isin(self.filters.party))
+
 	def get_data(self):
 		ple = self.ple
 
@@ -134,7 +132,13 @@
 	def get_columns(self):
 		options = None
 		self.columns.append(
-			dict(label=_("Company"), fieldname="company", fieldtype="data", options=options, width="100")
+			dict(
+				label=_("Posting Date"),
+				fieldname="posting_date",
+				fieldtype="Date",
+				options=options,
+				width="100",
+			)
 		)
 
 		self.columns.append(
@@ -160,7 +164,11 @@
 		)
 		self.columns.append(
 			dict(
-				label=_("Voucher No"), fieldname="voucher_no", fieldtype="data", options=options, width="100"
+				label=_("Voucher No"),
+				fieldname="voucher_no",
+				fieldtype="Dynamic Link",
+				options="voucher_type",
+				width="100",
 			)
 		)
 		self.columns.append(
@@ -176,8 +184,8 @@
 			dict(
 				label=_("Against Voucher No"),
 				fieldname="against_voucher_no",
-				fieldtype="data",
-				options=options,
+				fieldtype="Dynamic Link",
+				options="against_voucher_type",
 				width="100",
 			)
 		)
@@ -209,7 +217,7 @@
 		self.get_columns()
 		self.get_data()
 
-		# initialize dictionary and group using against voucher
+		# initialize dictionary and group using key
 		self.init_voucher_dict()
 
 		# convert dictionary to list and add balance rows