示例#1
0
    def test_loan_repayment_for_term_loan(self):
        pledges = [{
            "loan_security": "Test Security 2",
            "qty": 4000.00
        }, {
            "loan_security": "Test Security 1",
            "qty": 2000.00
        }]

        loan_application = create_loan_application(
            '_Test Company', self.applicant2, 'Stock Loan', pledges,
            "Repay Over Number of Periods", 12)
        create_pledge(loan_application)

        loan = create_loan_with_security(self.applicant2,
                                         "Stock Loan",
                                         "Repay Over Number of Periods",
                                         12,
                                         loan_application,
                                         posting_date=add_months(
                                             nowdate(), -1))

        loan.submit()

        make_loan_disbursement_entry(loan.name,
                                     loan.loan_amount,
                                     disbursement_date=add_months(
                                         nowdate(), -1))

        process_loan_interest_accrual_for_term_loans(posting_date=nowdate())

        repayment_entry = create_repayment_entry(loan.name, self.applicant2,
                                                 add_days(nowdate(), 5),
                                                 89768.75)

        repayment_entry.submit()

        amounts = frappe.db.get_value(
            'Loan Interest Accrual', {'loan': loan.name},
            ['paid_interest_amount', 'paid_principal_amount'])

        self.assertEqual(amounts[0], 11250.00)
        self.assertEqual(amounts[1], 78303.00)
示例#2
0
    def test_security_shortfall(self):
        pledges = [{
            "loan_security": "Test Security 2",
            "qty": 8000.00,
            "haircut": 50,
        }]

        loan_application = create_loan_application(
            "_Test Company", self.applicant2, "Stock Loan", pledges,
            "Repay Over Number of Periods", 12)

        create_pledge(loan_application)

        loan = create_loan_with_security(self.applicant2, "Stock Loan",
                                         "Repay Over Number of Periods", 12,
                                         loan_application)
        loan.submit()

        make_loan_disbursement_entry(loan.name, loan.loan_amount)

        frappe.db.sql(
            """UPDATE `tabLoan Security Price` SET loan_security_price = 100
			where loan_security='Test Security 2'""")

        create_process_loan_security_shortfall()
        loan_security_shortfall = frappe.get_doc("Loan Security Shortfall",
                                                 {"loan": loan.name})
        self.assertTrue(loan_security_shortfall)

        self.assertEqual(loan_security_shortfall.loan_amount, 1000000.00)
        self.assertEqual(loan_security_shortfall.security_value, 800000.00)
        self.assertEqual(loan_security_shortfall.shortfall_amount, 600000.00)

        frappe.db.sql(
            """ UPDATE `tabLoan Security Price` SET loan_security_price = 250
			where loan_security='Test Security 2'""")

        create_process_loan_security_shortfall()
        loan_security_shortfall = frappe.get_doc("Loan Security Shortfall",
                                                 {"loan": loan.name})
        self.assertEqual(loan_security_shortfall.status, "Completed")
        self.assertEqual(loan_security_shortfall.shortfall_amount, 0)
示例#3
0
	def test_santined_loan_security_unpledge(self):
		pledge = [{
			"loan_security": "Test Security 1",
			"qty": 4000.00
		}]

		loan_application = create_loan_application('_Test Company', self.applicant2, 'Demand Loan', pledge)
		create_pledge(loan_application)

		loan = create_demand_loan(self.applicant2, "Demand Loan", loan_application, posting_date='2019-10-01')
		loan.submit()

		self.assertEquals(loan.loan_amount, 1000000)

		unpledge_map = {'Test Security 1': 4000}
		unpledge_request = unpledge_security(loan=loan.name, security_map = unpledge_map, save=1)
		unpledge_request.submit()
		unpledge_request.status = 'Approved'
		unpledge_request.save()
		unpledge_request.submit()
示例#4
0
	def test_partial_unaccrued_interest_payment(self):
		pledge = [{
			"loan_security": "Test Security 1",
			"qty": 4000.00
		}]

		loan_application = create_loan_application('_Test Company', self.applicant2, 'Demand Loan', pledge)
		create_pledge(loan_application)

		loan = create_demand_loan(self.applicant2, "Demand Loan", loan_application, posting_date='2019-10-01')
		loan.submit()

		self.assertEquals(loan.loan_amount, 1000000)

		first_date = '2019-10-01'
		last_date = '2019-10-30'

		no_of_days = date_diff(last_date, first_date) + 1

		no_of_days += 5.5

		# get partial unaccrued interest amount
		paid_amount = (loan.loan_amount * loan.rate_of_interest * no_of_days) \
			/ (days_in_year(get_datetime(first_date).year) * 100)

		make_loan_disbursement_entry(loan.name, loan.loan_amount, disbursement_date=first_date)
		process_loan_interest_accrual_for_demand_loans(posting_date = last_date)

		amounts = calculate_amounts(loan.name, add_days(last_date, 5))

		repayment_entry = create_repayment_entry(loan.name, self.applicant2, add_days(last_date, 5),
			paid_amount)

		repayment_entry.submit()
		repayment_entry.load_from_db()

		partial_accrued_interest_amount = (loan.loan_amount * loan.rate_of_interest * 5) \
			/ (days_in_year(get_datetime(first_date).year) * 100)

		interest_amount = flt(amounts['interest_amount'] + partial_accrued_interest_amount, 2)
		self.assertEqual(flt(repayment_entry.total_interest_paid, 0), flt(interest_amount, 0))
示例#5
0
	def test_pending_loan_amount_after_closure_request(self):
		pledge = [{
			"loan_security": "Test Security 1",
			"qty": 4000.00
		}]

		loan_application = create_loan_application('_Test Company', self.applicant2, 'Demand Loan', pledge)
		create_pledge(loan_application)

		loan = create_demand_loan(self.applicant2, "Demand Loan", loan_application, posting_date='2019-10-01')
		loan.submit()

		self.assertEquals(loan.loan_amount, 1000000)

		first_date = '2019-10-01'
		last_date = '2019-10-30'

		no_of_days = date_diff(last_date, first_date) + 1

		no_of_days += 5

		accrued_interest_amount = (loan.loan_amount * loan.rate_of_interest * no_of_days) \
			/ (days_in_year(get_datetime(first_date).year) * 100)

		make_loan_disbursement_entry(loan.name, loan.loan_amount, disbursement_date=first_date)
		process_loan_interest_accrual_for_demand_loans(posting_date = last_date)

		amounts = calculate_amounts(loan.name, add_days(last_date, 5))

		repayment_entry = create_repayment_entry(loan.name, self.applicant2, add_days(last_date, 5), flt(loan.loan_amount + accrued_interest_amount))
		repayment_entry.submit()

		amounts = frappe.db.get_value('Loan Interest Accrual', {'loan': loan.name}, ['paid_interest_amount',
			'paid_principal_amount'])

		request_loan_closure(loan.name)
		loan.load_from_db()
		self.assertEquals(loan.status, "Loan Closure Requested")

		amounts = calculate_amounts(loan.name, add_days(last_date, 5))
		self.assertEqual(amounts['pending_principal_amount'], 0.0)
示例#6
0
	def test_regular_loan_repayment(self):
		pledge = [{
			"loan_security": "Test Security 1",
			"qty": 4000.00
		}]

		loan_application = create_loan_application('_Test Company', self.applicant2, 'Demand Loan', pledge)
		create_pledge(loan_application)

		loan = create_demand_loan(self.applicant2, "Demand Loan", loan_application, posting_date='2019-10-01')
		loan.submit()

		self.assertEquals(loan.loan_amount, 1000000)

		first_date = '2019-10-01'
		last_date = '2019-10-30'

		no_of_days = date_diff(last_date, first_date) + 1

		accrued_interest_amount = flt((loan.loan_amount * loan.rate_of_interest * no_of_days)
			/ (days_in_year(get_datetime(first_date).year) * 100), 2)

		make_loan_disbursement_entry(loan.name, loan.loan_amount, disbursement_date=first_date)

		process_loan_interest_accrual_for_demand_loans(posting_date = last_date)

		repayment_entry = create_repayment_entry(loan.name, self.applicant2, add_days(last_date, 10), 111119)
		repayment_entry.save()
		repayment_entry.submit()

		penalty_amount = (accrued_interest_amount * 5 * 25) / 100
		self.assertEquals(flt(repayment_entry.penalty_amount,0), flt(penalty_amount, 0))

		amounts = frappe.db.get_all('Loan Interest Accrual', {'loan': loan.name}, ['paid_interest_amount'])

		loan.load_from_db()

		total_interest_paid = amounts[0]['paid_interest_amount'] + amounts[1]['paid_interest_amount']
		self.assertEquals(amounts[1]['paid_interest_amount'], repayment_entry.interest_payable)
		self.assertEquals(flt(loan.total_principal_paid, 0), flt(repayment_entry.amount_paid -
			 penalty_amount - total_interest_paid, 0))
示例#7
0
    def test_disbursal_check_without_shortfall(self):
        pledges = [{
            "loan_security": "Test Security 2",
            "qty": 8000.00,
            "haircut": 50,
        }]

        loan_application = create_loan_application(
            '_Test Company', self.applicant2, 'Stock Loan', pledges,
            "Repay Over Number of Periods", 12)

        create_pledge(loan_application)

        loan = create_loan_with_security(self.applicant2, "Stock Loan",
                                         "Repay Over Number of Periods", 12,
                                         loan_application)
        loan.submit()

        # Disbursing 7,00,000 from the allowed 10,00,000 according to security pledge
        make_loan_disbursement_entry(loan.name, 700000)

        self.assertEqual(get_disbursal_amount(loan.name), 300000)
示例#8
0
	def test_penalty(self):
		pledge = [{
			"loan_security": "Test Security 1",
			"qty": 4000.00
		}]

		loan_application = create_loan_application('_Test Company', self.applicant2, 'Demand Loan', pledge)
		create_pledge(loan_application)

		loan = create_demand_loan(self.applicant2, "Demand Loan", loan_application, posting_date='2019-10-01')
		loan.submit()

		self.assertEquals(loan.loan_amount, 1000000)

		first_date = '2019-10-01'
		last_date = '2019-10-30'

		make_loan_disbursement_entry(loan.name, loan.loan_amount, disbursement_date=first_date)
		process_loan_interest_accrual_for_demand_loans(posting_date = last_date)

		amounts = calculate_amounts(loan.name, add_days(last_date, 1))
		paid_amount = amounts['interest_amount']/2

		repayment_entry = create_repayment_entry(loan.name, self.applicant2, add_days(last_date, 5),
			paid_amount)

		repayment_entry.submit()

		# 30 days - grace period
		penalty_days = 30 - 4
		penalty_applicable_amount = flt(amounts['interest_amount']/2, 2)
		penalty_amount = flt((((penalty_applicable_amount * 25) / 100) * penalty_days), 2)
		process = process_loan_interest_accrual_for_demand_loans(posting_date = '2019-11-30')

		calculated_penalty_amount = frappe.db.get_value('Loan Interest Accrual',
			{'process_loan_interest_accrual': process, 'loan': loan.name}, 'penalty_amount')

		self.assertEquals(calculated_penalty_amount, penalty_amount)
示例#9
0
	def test_loan_topup(self):
		pledge = [{
			"loan_security": "Test Security 1",
			"qty": 4000.00
		}]

		loan_application = create_loan_application('_Test Company', self.applicant, 'Demand Loan', pledge)
		create_pledge(loan_application)

		loan = create_demand_loan(self.applicant, "Demand Loan", loan_application, posting_date=get_first_day(nowdate()))

		loan.submit()

		first_date = get_first_day(nowdate())
		last_date = get_last_day(nowdate())

		no_of_days = date_diff(last_date, first_date) + 1

		accrued_interest_amount = (loan.loan_amount * loan.rate_of_interest * no_of_days) \
			/ (days_in_year(get_datetime().year) * 100)

		make_loan_disbursement_entry(loan.name, loan.loan_amount, disbursement_date=first_date)

		process_loan_interest_accrual_for_demand_loans(posting_date=add_days(last_date, 1))

		# Should not be able to create loan disbursement entry before repayment
		self.assertRaises(frappe.ValidationError, make_loan_disbursement_entry, loan.name,
			500000, first_date)

		repayment_entry = create_repayment_entry(loan.name, self.applicant, add_days(get_last_day(nowdate()), 5),
			"Regular Payment", 611095.89)

		repayment_entry.submit()
		loan.reload()

		# After repayment loan disbursement entry should go through
		make_loan_disbursement_entry(loan.name, 500000, disbursement_date=add_days(last_date, 16))
	def test_accumulated_amounts(self):
		pledge = [{
			"loan_security": "Test Security 1",
			"qty": 4000.00
		}]

		loan_application = create_loan_application('_Test Company', self.applicant, 'Demand Loan', pledge)
		create_pledge(loan_application)
		loan = create_demand_loan(self.applicant, "Demand Loan", loan_application,
			posting_date=get_first_day(nowdate()))
		loan.submit()

		first_date = '2019-10-01'
		last_date = '2019-10-30'

		no_of_days = date_diff(last_date, first_date) + 1
		accrued_interest_amount = (loan.loan_amount * loan.rate_of_interest * no_of_days) \
			/ (days_in_year(get_datetime(first_date).year) * 100)
		make_loan_disbursement_entry(loan.name, loan.loan_amount, disbursement_date=first_date)
		process_loan_interest_accrual_for_demand_loans(posting_date=last_date)
		loan_interest_accrual = frappe.get_doc("Loan Interest Accrual", {'loan': loan.name})

		self.assertEquals(flt(loan_interest_accrual.interest_amount, 0), flt(accrued_interest_amount, 0))

		next_start_date = '2019-10-31'
		next_end_date = '2019-11-29'

		no_of_days = date_diff(next_end_date, next_start_date) + 1
		process = process_loan_interest_accrual_for_demand_loans(posting_date=next_end_date)
		new_accrued_interest_amount = (loan.loan_amount * loan.rate_of_interest * no_of_days) \
			/ (days_in_year(get_datetime(first_date).year) * 100)

		total_pending_interest_amount = flt(accrued_interest_amount + new_accrued_interest_amount, 0)

		loan_interest_accrual = frappe.get_doc("Loan Interest Accrual", {'loan': loan.name,
			'process_loan_interest_accrual': process})
		self.assertEquals(flt(loan_interest_accrual.total_pending_interest_amount, 0), total_pending_interest_amount)
示例#11
0
	def test_partial_loan_security_unpledge(self):
		pledge = [{
			"loan_security": "Test Security 1",
			"qty": 2000.00
		},
		{
			"loan_security": "Test Security 2",
			"qty": 4000.00
		}]

		loan_application = create_loan_application('_Test Company', self.applicant2, 'Demand Loan', pledge)
		create_pledge(loan_application)

		loan = create_demand_loan(self.applicant2, "Demand Loan", loan_application, posting_date='2019-10-01')
		loan.submit()

		self.assertEquals(loan.loan_amount, 1000000)

		first_date = '2019-10-01'
		last_date = '2019-10-30'

		make_loan_disbursement_entry(loan.name, loan.loan_amount, disbursement_date=first_date)
		process_loan_interest_accrual_for_demand_loans(posting_date = last_date)

		repayment_entry = create_repayment_entry(loan.name, self.applicant2, add_days(last_date, 5), 600000)
		repayment_entry.submit()

		unpledge_map = {'Test Security 2': 2000}

		unpledge_request = unpledge_security(loan=loan.name, security_map = unpledge_map, save=1)
		unpledge_request.submit()
		unpledge_request.status = 'Approved'
		unpledge_request.save()
		unpledge_request.submit()
		unpledge_request.load_from_db()
		self.assertEqual(unpledge_request.docstatus, 1)