From 57ecac4aa70c8203981a05be8f2368cfbf1ce12a Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Fri, 24 Mar 2023 12:25:03 +0530 Subject: [PATCH] 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 (cherry picked from commit f7780cdb58d6678dc4b9ac45a6ab7f0cbd43a3e7) --- .../report/payment_ledger/payment_ledger.js | 37 +++++++++++ .../report/payment_ledger/payment_ledger.py | 64 +++++++++++-------- 2 files changed, 73 insertions(+), 28 deletions(-) diff --git a/erpnext/accounts/report/payment_ledger/payment_ledger.js b/erpnext/accounts/report/payment_ledger/payment_ledger.js index 9779844dc94..a5a4108f1df 100644 --- a/erpnext/accounts/report/payment_ledger/payment_ledger.js +++ b/erpnext/accounts/report/payment_ledger/payment_ledger.js @@ -37,6 +37,29 @@ function get_filters() { }); } }, + { + "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"), @@ -49,6 +72,20 @@ function get_filters() { "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 e470c2727e3..8875d2743fe 100644 --- a/erpnext/accounts/report/payment_ledger/payment_ledger.py +++ b/erpnext/accounts/report/payment_ledger/payment_ledger.py @@ -17,34 +17,26 @@ class PaymentLedger(object): 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 @@ class PaymentLedger(object): 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 @@ class PaymentLedger(object): 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 @@ class PaymentLedger(object): 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 @@ class PaymentLedger(object): ) 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 @@ class PaymentLedger(object): 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 @@ class PaymentLedger(object): 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