Merge pull request #37131 from ruthra-kumar/more_generic_customer_filter_in_ar_report
refactor: more generic filters in Accounts Receivable report
diff --git a/erpnext/accounts/report/accounts_payable/test_accounts_payable.py b/erpnext/accounts/report/accounts_payable/test_accounts_payable.py
index cb84cf4..3cf93cc 100644
--- a/erpnext/accounts/report/accounts_payable/test_accounts_payable.py
+++ b/erpnext/accounts/report/accounts_payable/test_accounts_payable.py
@@ -24,7 +24,7 @@
def tearDown(self):
frappe.db.rollback()
- def test_accounts_receivable_with_supplier(self):
+ def test_accounts_payable_for_foreign_currency_supplier(self):
pi = self.create_purchase_invoice(do_not_submit=True)
pi.currency = "USD"
pi.conversion_rate = 80
diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.js b/erpnext/accounts/report/accounts_receivable/accounts_receivable.js
index cb8ec87..bb00d61 100644
--- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.js
+++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.js
@@ -38,33 +38,32 @@
}
},
{
- "fieldname": "customer",
- "label": __("Customer"),
+ "fieldname": "party_type",
+ "label": __("Party Type"),
"fieldtype": "Link",
- "options": "Customer",
+ "options": "Party Type",
+ "Default": "Customer",
+ get_query: () => {
+ return {
+ filters: {
+ 'account_type': 'Receivable'
+ }
+ };
+ },
on_change: () => {
- var customer = frappe.query_report.get_filter_value('customer');
- var company = frappe.query_report.get_filter_value('company');
- if (customer) {
- frappe.db.get_value('Customer', customer, ["customer_name", "payment_terms"], function(value) {
- frappe.query_report.set_filter_value('customer_name', value["customer_name"]);
- frappe.query_report.set_filter_value('payment_terms', value["payment_terms"]);
- });
+ frappe.query_report.set_filter_value('party', "");
+ let party_type = frappe.query_report.get_filter_value('party_type');
+ frappe.query_report.toggle_filter_display('customer_group', frappe.query_report.get_filter_value('party_type') !== "Customer");
- frappe.db.get_value('Customer Credit Limit', {'parent': customer, 'company': company},
- ["credit_limit"], function(value) {
- if (value) {
- frappe.query_report.set_filter_value('credit_limit', value["credit_limit"]);
- }
- }, "Customer");
- } else {
- frappe.query_report.set_filter_value('customer_name', "");
- frappe.query_report.set_filter_value('credit_limit', "");
- frappe.query_report.set_filter_value('payment_terms', "");
- }
}
},
{
+ "fieldname":"party",
+ "label": __("Party"),
+ "fieldtype": "Dynamic Link",
+ "options": "party_type",
+ },
+ {
"fieldname": "party_account",
"label": __("Receivable Account"),
"fieldtype": "Link",
@@ -174,24 +173,6 @@
"fieldname": "show_remarks",
"label": __("Show Remarks"),
"fieldtype": "Check",
- },
- {
- "fieldname": "customer_name",
- "label": __("Customer Name"),
- "fieldtype": "Data",
- "hidden": 1
- },
- {
- "fieldname": "payment_terms",
- "label": __("Payment Tems"),
- "fieldtype": "Data",
- "hidden": 1
- },
- {
- "fieldname": "credit_limit",
- "label": __("Credit Limit"),
- "fieldtype": "Currency",
- "hidden": 1
}
],
diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
index 14f8993..7942402 100755
--- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
+++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
@@ -769,15 +769,12 @@
self.or_filters = []
for party_type in self.party_type:
- party_type_field = scrub(party_type)
- self.or_filters.append(self.ple.party_type == party_type)
+ self.add_common_filters()
- self.add_common_filters(party_type_field=party_type_field)
-
- if party_type_field == "customer":
+ if self.account_type == "Receivable":
self.add_customer_filters()
- elif party_type_field == "supplier":
+ elif self.account_type == "Payable":
self.add_supplier_filters()
if self.filters.cost_center:
@@ -793,16 +790,13 @@
]
self.qb_selection_filter.append(self.ple.cost_center.isin(cost_center_list))
- def add_common_filters(self, party_type_field):
+ def add_common_filters(self):
if self.filters.company:
self.qb_selection_filter.append(self.ple.company == self.filters.company)
if self.filters.finance_book:
self.qb_selection_filter.append(self.ple.finance_book == self.filters.finance_book)
- if self.filters.get(party_type_field):
- self.qb_selection_filter.append(self.ple.party == self.filters.get(party_type_field))
-
if self.filters.get("party_type"):
self.qb_selection_filter.append(self.filters.party_type == self.ple.party_type)
@@ -969,6 +963,20 @@
fieldtype="Link",
options="Contact",
)
+ if self.filters.party_type == "Customer":
+ self.add_column(
+ _("Customer Name"),
+ fieldname="customer_name",
+ fieldtype="Link",
+ options="Customer",
+ )
+ elif self.filters.party_type == "Supplier":
+ self.add_column(
+ _("Supplier Name"),
+ fieldname="supplier_name",
+ fieldtype="Link",
+ options="Supplier",
+ )
self.add_column(label=_("Cost Center"), fieldname="cost_center", fieldtype="Data")
self.add_column(label=_("Voucher Type"), fieldname="voucher_type", fieldtype="Data")
diff --git a/erpnext/accounts/report/accounts_receivable/test_accounts_receivable.py b/erpnext/accounts/report/accounts_receivable/test_accounts_receivable.py
index 0c7d931..b98916e 100644
--- a/erpnext/accounts/report/accounts_receivable/test_accounts_receivable.py
+++ b/erpnext/accounts/report/accounts_receivable/test_accounts_receivable.py
@@ -568,3 +568,40 @@
row.account_currency,
],
)
+
+ def test_usd_customer_filter(self):
+ filters = {
+ "company": self.company,
+ "party_type": "Customer",
+ "party": self.customer,
+ "report_date": today(),
+ "range1": 30,
+ "range2": 60,
+ "range3": 90,
+ "range4": 120,
+ }
+
+ si = self.create_sales_invoice(no_payment_schedule=True, do_not_submit=True)
+ si.currency = "USD"
+ si.conversion_rate = 80
+ si.debit_to = self.debtors_usd
+ si.save().submit()
+ name = si.name
+
+ # check invoice grand total and invoiced column's value for 3 payment terms
+ report = execute(filters)
+
+ expected = {
+ "voucher_type": si.doctype,
+ "voucher_no": si.name,
+ "party_account": self.debtors_usd,
+ "customer_name": self.customer,
+ "invoiced": 100.0,
+ "outstanding": 100.0,
+ "account_currency": "USD",
+ }
+ self.assertEqual(len(report[1]), 1)
+ report_output = report[1][0]
+ for field in expected:
+ with self.subTest(field=field):
+ self.assertEqual(report_output.get(field), expected.get(field))