From f6fb00b59d6dbc40e4836686519b1cf7c60fa7ef Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Fri, 8 Jul 2022 19:28:38 +0530 Subject: [PATCH] test: Matching Loan Repayment query in Bank Reco --- .../accounting_period/accounting_period.py | 1 + .../bank_transaction/test_bank_transaction.py | 115 +++++++++++++++--- 2 files changed, 98 insertions(+), 18 deletions(-) diff --git a/erpnext/accounts/doctype/accounting_period/accounting_period.py b/erpnext/accounts/doctype/accounting_period/accounting_period.py index 1f2d12f47f..80c9715e8e 100644 --- a/erpnext/accounts/doctype/accounting_period/accounting_period.py +++ b/erpnext/accounts/doctype/accounting_period/accounting_period.py @@ -49,6 +49,7 @@ class AccountingPeriod(Document): @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 8cbed4c795..a5d0413799 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 json 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 @@ from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sal 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 @@ class TestBankTransaction(unittest.TestCase): 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 @@ def add_vouchers(): ) 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