fix: allocation logic on 'Get Outstanding Invoices' btn in PE
1. fixed broken `payment_term` filter in Payment References section
2. Throw error if user fails to select 'Payment Term' for an invoice
with 'Payment Term based allocation' enabled.
diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.js b/erpnext/accounts/doctype/payment_entry/payment_entry.js
index 0701435..35092a7 100644
--- a/erpnext/accounts/doctype/payment_entry/payment_entry.js
+++ b/erpnext/accounts/doctype/payment_entry/payment_entry.js
@@ -122,13 +122,10 @@
frm.set_query('payment_term', 'references', function(frm, cdt, cdn) {
const child = locals[cdt][cdn];
if (in_list(['Purchase Invoice', 'Sales Invoice'], child.reference_doctype) && child.reference_name) {
- let payment_term_list = frappe.get_list('Payment Schedule', {'parent': child.reference_name});
-
- payment_term_list = payment_term_list.map(pt => pt.payment_term);
-
return {
+ query: "erpnext.controllers.queries.get_payment_terms_for_references",
filters: {
- 'name': ['in', payment_term_list]
+ 'reference': child.reference_name
}
}
}
@@ -1463,4 +1460,4 @@
});
}
},
-})
\ No newline at end of file
+})
diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py
index 7542bab..1e53c9b 100644
--- a/erpnext/accounts/doctype/payment_entry/payment_entry.py
+++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py
@@ -228,10 +228,17 @@
d = frappe._dict(d)
latest_lookup.setdefault((d.voucher_type, d.voucher_no), frappe._dict())[d.payment_term] = d
- for d in self.get("references"):
- latest = (latest_lookup.get((d.reference_doctype, d.reference_name)) or frappe._dict()).get(
- d.payment_term
- )
+ for idx, d in enumerate(self.get("references"), start=1):
+ latest = latest_lookup.get((d.reference_doctype, d.reference_name)) or frappe._dict()
+
+ if (d.payment_term is None or d.payment_term == "") and d.payment_term not in latest.keys():
+ frappe.throw(
+ _(
+ "{0} has Payment Term based allocation enabled. Select a Payment Term for Row #{1} in Payment References section"
+ ).format(frappe.bold(d.reference_name), frappe.bold(idx))
+ )
+
+ latest = latest.get(d.payment_term)
# The reference has already been fully paid
if not latest:
@@ -1633,6 +1640,9 @@
"invoice_amount": flt(d.invoice_amount),
"outstanding_amount": flt(d.outstanding_amount),
"payment_term_outstanding": payment_term_outstanding,
+ "allocated_amount": payment_term_outstanding
+ if payment_term_outstanding
+ else d.outstanding_amount,
"payment_amount": payment_term.payment_amount,
"payment_term": payment_term.payment_term,
"account": d.account,
diff --git a/erpnext/controllers/queries.py b/erpnext/controllers/queries.py
index d1dcd6a..5ec2474 100644
--- a/erpnext/controllers/queries.py
+++ b/erpnext/controllers/queries.py
@@ -874,3 +874,18 @@
fields.insert(1, meta.title_field.strip())
return unique(fields)
+
+
+@frappe.whitelist()
+@frappe.validate_and_sanitize_search_inputs
+def get_payment_terms_for_references(doctype, txt, searchfield, start, page_len, filters) -> list:
+ terms = []
+ if filters:
+ terms = frappe.db.get_all(
+ "Payment Schedule",
+ filters={"parent": filters.get("reference")},
+ fields=["payment_term"],
+ limit=page_len,
+ as_list=1,
+ )
+ return terms