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