refactor: filter only immediate upcoming payment term for each SO (#33923)
* fix: ignore closed or 'on hold' orders
* refactor: filter immediate upcoming term
---------
Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
diff --git a/erpnext/selling/report/payment_terms_status_for_sales_order/payment_terms_status_for_sales_order.js b/erpnext/selling/report/payment_terms_status_for_sales_order/payment_terms_status_for_sales_order.js
index 991ac71..990d736 100644
--- a/erpnext/selling/report/payment_terms_status_for_sales_order/payment_terms_status_for_sales_order.js
+++ b/erpnext/selling/report/payment_terms_status_for_sales_order/payment_terms_status_for_sales_order.js
@@ -103,6 +103,11 @@
return options
}
},
+ {
+ "fieldname":"only_immediate_upcoming_term",
+ "label": __("Show only the Immediate Upcoming Term"),
+ "fieldtype": "Check",
+ },
]
return filters;
}
diff --git a/erpnext/selling/report/payment_terms_status_for_sales_order/payment_terms_status_for_sales_order.py b/erpnext/selling/report/payment_terms_status_for_sales_order/payment_terms_status_for_sales_order.py
index 8bf5686..3682c5f 100644
--- a/erpnext/selling/report/payment_terms_status_for_sales_order/payment_terms_status_for_sales_order.py
+++ b/erpnext/selling/report/payment_terms_status_for_sales_order/payment_terms_status_for_sales_order.py
@@ -4,6 +4,7 @@
import frappe
from frappe import _, qb, query_builder
from frappe.query_builder import Criterion, functions
+from frappe.utils.dateutils import getdate
def get_columns():
@@ -208,6 +209,7 @@
)
.where(
(so.docstatus == 1)
+ & (so.status.isin(["To Deliver and Bill", "To Bill"]))
& (so.payment_terms_template != "NULL")
& (so.company == conditions.company)
& (so.transaction_date[conditions.start_date : conditions.end_date])
@@ -291,6 +293,18 @@
return sales_orders
+def filter_for_immediate_upcoming_term(filters, sales_orders):
+ if filters.only_immediate_upcoming_term and sales_orders:
+ immediate_term_found = set()
+ filtered_data = []
+ for order in sales_orders:
+ if order.name not in immediate_term_found and order.due_date > getdate():
+ filtered_data.append(order)
+ immediate_term_found.add(order.name)
+ return filtered_data
+ return sales_orders
+
+
def execute(filters=None):
columns = get_columns()
sales_orders, so_invoices = get_so_with_invoices(filters)
@@ -298,6 +312,8 @@
sales_orders = filter_on_calculated_status(filters, sales_orders)
+ sales_orders = filter_for_immediate_upcoming_term(filters, sales_orders)
+
prepare_chart(sales_orders)
data = sales_orders