test: Matching Loan Repayment query in Bank Reco
diff --git a/erpnext/accounts/doctype/accounting_period/accounting_period.py b/erpnext/accounts/doctype/accounting_period/accounting_period.py
index 1f2d12f..80c9715 100644
--- a/erpnext/accounts/doctype/accounting_period/accounting_period.py
+++ b/erpnext/accounts/doctype/accounting_period/accounting_period.py
@@ -49,6 +49,7 @@
@frappe.whitelist()
def get_doctypes_for_closing(self):
docs_for_closing = []
+ # get period closing doctypes from all the apps
doctypes = frappe.get_hooks("period_closing_doctypes")
closed_doctypes = [{"document_type": doctype, "closed": 1} for doctype in doctypes]
diff --git a/erpnext/accounts/doctype/bank_transaction/test_bank_transaction.py b/erpnext/accounts/doctype/bank_transaction/test_bank_transaction.py
index 8cbed4c..a5d0413 100644
--- a/erpnext/accounts/doctype/bank_transaction/test_bank_transaction.py
+++ b/erpnext/accounts/doctype/bank_transaction/test_bank_transaction.py
@@ -5,6 +5,7 @@
import unittest
import frappe
+from frappe.tests.utils import FrappeTestCase
from erpnext.accounts.doctype.bank_reconciliation_tool.bank_reconciliation_tool import (
get_linked_payments,
@@ -18,28 +19,21 @@
test_dependencies = ["Item", "Cost Center"]
-class TestBankTransaction(unittest.TestCase):
- @classmethod
- def setUpClass(cls):
+class TestBankTransaction(FrappeTestCase):
+ def setUp(self):
+ for dt in [
+ "Loan Repayment",
+ "Bank Transaction",
+ "Payment Entry",
+ "Payment Entry Reference",
+ "POS Profile",
+ ]:
+ frappe.db.delete(dt)
+
make_pos_profile()
add_transactions()
add_vouchers()
- @classmethod
- def tearDownClass(cls):
- for bt in frappe.get_all("Bank Transaction"):
- doc = frappe.get_doc("Bank Transaction", bt.name)
- if doc.docstatus == 1:
- doc.cancel()
- doc.delete()
-
- # Delete directly in DB to avoid validation errors for countries not allowing deletion
- frappe.db.sql("""delete from `tabPayment Entry Reference`""")
- frappe.db.sql("""delete from `tabPayment Entry`""")
-
- # Delete POS Profile
- frappe.db.sql("delete from `tabPOS Profile`")
-
# This test checks if ERPNext is able to provide a linked payment for a bank transaction based on the amount of the bank transaction.
def test_linked_payments(self):
bank_transaction = frappe.get_doc(
@@ -155,6 +149,35 @@
is not None
)
+ def test_matching_loan_repayment(self):
+ from erpnext.loan_management.doctype.loan.test_loan import create_loan_accounts
+
+ create_loan_accounts()
+ bank_account = frappe.get_doc(
+ {
+ "doctype": "Bank Account",
+ "account_name": "Payment Account",
+ "bank": "Citi Bank",
+ "account": "Payment Account - _TC",
+ }
+ ).insert(ignore_if_duplicate=True)
+
+ bank_transaction = frappe.get_doc(
+ {
+ "doctype": "Bank Transaction",
+ "description": "Loan Repayment - OPSKATTUZWXXX AT776000000098709837 Herr G",
+ "date": "2018-10-27",
+ "deposit": 500,
+ "currency": "INR",
+ "bank_account": bank_account.name,
+ }
+ ).submit()
+
+ repayment_entry = create_loan_and_repayment()
+
+ linked_payments = get_linked_payments(bank_transaction.name, ["loan_repayment", "exact_match"])
+ self.assertEqual(linked_payments[0][2], repayment_entry.name)
+
def create_bank_account(bank_name="Citi Bank", account_name="_Test Bank - _TC"):
try:
@@ -364,3 +387,59 @@
)
si.insert()
si.submit()
+
+
+def create_loan_and_repayment():
+ from erpnext.loan_management.doctype.loan.test_loan import (
+ create_loan,
+ create_loan_type,
+ create_repayment_entry,
+ make_loan_disbursement_entry,
+ )
+ from erpnext.loan_management.doctype.process_loan_interest_accrual.process_loan_interest_accrual import (
+ process_loan_interest_accrual_for_term_loans,
+ )
+ from erpnext.setup.doctype.employee.test_employee import make_employee
+
+ create_loan_type(
+ "Personal Loan",
+ 500000,
+ 8.4,
+ is_term_loan=1,
+ mode_of_payment="Cash",
+ disbursement_account="Disbursement Account - _TC",
+ payment_account="Payment Account - _TC",
+ loan_account="Loan Account - _TC",
+ interest_income_account="Interest Income Account - _TC",
+ penalty_income_account="Penalty Income Account - _TC",
+ )
+
+ applicant = make_employee("test_bank_reco@loan.com", company="_Test Company")
+ loan = create_loan(applicant, "Personal Loan", 5000, "Repay Over Number of Periods", 20)
+ loan = frappe.get_doc(
+ {
+ "doctype": "Loan",
+ "applicant_type": "Employee",
+ "company": "_Test Company",
+ "applicant": applicant,
+ "loan_type": "Personal Loan",
+ "loan_amount": 5000,
+ "repayment_method": "Repay Fixed Amount per Period",
+ "monthly_repayment_amount": 500,
+ "repayment_start_date": "2018-09-27",
+ "is_term_loan": 1,
+ "posting_date": "2018-09-27",
+ }
+ ).insert()
+
+ make_loan_disbursement_entry(loan.name, loan.loan_amount, disbursement_date="2018-09-27")
+ process_loan_interest_accrual_for_term_loans(posting_date="2018-10-27")
+
+ repayment_entry = create_repayment_entry(
+ loan.name,
+ applicant,
+ "2018-10-27",
+ 500,
+ )
+ repayment_entry.submit()
+ return repayment_entry