fix: Bank clearance for case loan (disburstment/repayment) (#34586)
diff --git a/erpnext/accounts/doctype/bank_clearance/bank_clearance.py b/erpnext/accounts/doctype/bank_clearance/bank_clearance.py
index 80878ac..0817187 100644
--- a/erpnext/accounts/doctype/bank_clearance/bank_clearance.py
+++ b/erpnext/accounts/doctype/bank_clearance/bank_clearance.py
@@ -81,7 +81,7 @@
loan_disbursement = frappe.qb.DocType("Loan Disbursement")
- loan_disbursements = (
+ query = (
frappe.qb.from_(loan_disbursement)
.select(
ConstantColumn("Loan Disbursement").as_("payment_document"),
@@ -90,17 +90,22 @@
ConstantColumn(0).as_("debit"),
loan_disbursement.reference_number.as_("cheque_number"),
loan_disbursement.reference_date.as_("cheque_date"),
+ loan_disbursement.clearance_date.as_("clearance_date"),
loan_disbursement.disbursement_date.as_("posting_date"),
loan_disbursement.applicant.as_("against_account"),
)
.where(loan_disbursement.docstatus == 1)
.where(loan_disbursement.disbursement_date >= self.from_date)
.where(loan_disbursement.disbursement_date <= self.to_date)
- .where(loan_disbursement.clearance_date.isnull())
.where(loan_disbursement.disbursement_account.isin([self.bank_account, self.account]))
.orderby(loan_disbursement.disbursement_date)
.orderby(loan_disbursement.name, order=frappe.qb.desc)
- ).run(as_dict=1)
+ )
+
+ if not self.include_reconciled_entries:
+ query = query.where(loan_disbursement.clearance_date.isnull())
+
+ loan_disbursements = query.run(as_dict=1)
loan_repayment = frappe.qb.DocType("Loan Repayment")
@@ -113,16 +118,19 @@
ConstantColumn(0).as_("credit"),
loan_repayment.reference_number.as_("cheque_number"),
loan_repayment.reference_date.as_("cheque_date"),
+ loan_repayment.clearance_date.as_("clearance_date"),
loan_repayment.applicant.as_("against_account"),
loan_repayment.posting_date,
)
.where(loan_repayment.docstatus == 1)
- .where(loan_repayment.clearance_date.isnull())
.where(loan_repayment.posting_date >= self.from_date)
.where(loan_repayment.posting_date <= self.to_date)
.where(loan_repayment.payment_account.isin([self.bank_account, self.account]))
)
+ if not self.include_reconciled_entries:
+ query = query.where(loan_repayment.clearance_date.isnull())
+
if frappe.db.has_column("Loan Repayment", "repay_from_salary"):
query = query.where((loan_repayment.repay_from_salary == 0))
diff --git a/erpnext/accounts/report/bank_clearance_summary/bank_clearance_summary.py b/erpnext/accounts/report/bank_clearance_summary/bank_clearance_summary.py
index 449ebdc..306af72 100644
--- a/erpnext/accounts/report/bank_clearance_summary/bank_clearance_summary.py
+++ b/erpnext/accounts/report/bank_clearance_summary/bank_clearance_summary.py
@@ -4,6 +4,7 @@
import frappe
from frappe import _
+from frappe.query_builder.custom import ConstantColumn
from frappe.utils import getdate, nowdate
@@ -91,4 +92,65 @@
as_list=1,
)
- return sorted(journal_entries + payment_entries, key=lambda k: k[2] or getdate(nowdate()))
+ # Loan Disbursement
+ loan_disbursement = frappe.qb.DocType("Loan Disbursement")
+
+ query = (
+ frappe.qb.from_(loan_disbursement)
+ .select(
+ ConstantColumn("Loan Disbursement").as_("payment_document_type"),
+ loan_disbursement.name.as_("payment_entry"),
+ loan_disbursement.disbursement_date.as_("posting_date"),
+ loan_disbursement.reference_number.as_("cheque_no"),
+ loan_disbursement.clearance_date.as_("clearance_date"),
+ loan_disbursement.applicant.as_("against"),
+ -loan_disbursement.disbursed_amount.as_("amount"),
+ )
+ .where(loan_disbursement.docstatus == 1)
+ .where(loan_disbursement.disbursement_date >= filters["from_date"])
+ .where(loan_disbursement.disbursement_date <= filters["to_date"])
+ .where(loan_disbursement.disbursement_account == filters["account"])
+ .orderby(loan_disbursement.disbursement_date, order=frappe.qb.desc)
+ .orderby(loan_disbursement.name, order=frappe.qb.desc)
+ )
+
+ if filters.get("from_date"):
+ query = query.where(loan_disbursement.disbursement_date >= filters["from_date"])
+ if filters.get("to_date"):
+ query = query.where(loan_disbursement.disbursement_date <= filters["to_date"])
+
+ loan_disbursements = query.run(as_list=1)
+
+ # Loan Repayment
+ loan_repayment = frappe.qb.DocType("Loan Repayment")
+
+ query = (
+ frappe.qb.from_(loan_repayment)
+ .select(
+ ConstantColumn("Loan Repayment").as_("payment_document_type"),
+ loan_repayment.name.as_("payment_entry"),
+ loan_repayment.posting_date.as_("posting_date"),
+ loan_repayment.reference_number.as_("cheque_no"),
+ loan_repayment.clearance_date.as_("clearance_date"),
+ loan_repayment.applicant.as_("against"),
+ loan_repayment.amount_paid.as_("amount"),
+ )
+ .where(loan_repayment.docstatus == 1)
+ .where(loan_repayment.posting_date >= filters["from_date"])
+ .where(loan_repayment.posting_date <= filters["to_date"])
+ .where(loan_repayment.payment_account == filters["account"])
+ .orderby(loan_repayment.posting_date, order=frappe.qb.desc)
+ .orderby(loan_repayment.name, order=frappe.qb.desc)
+ )
+
+ if filters.get("from_date"):
+ query = query.where(loan_repayment.posting_date >= filters["from_date"])
+ if filters.get("to_date"):
+ query = query.where(loan_repayment.posting_date <= filters["to_date"])
+
+ loan_repayments = query.run(as_list=1)
+
+ return sorted(
+ journal_entries + payment_entries + loan_disbursements + loan_repayments,
+ key=lambda k: k[2] or getdate(nowdate()),
+ )