Beispiel #1
0
	def test_loan_interest_accural(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_accural = frappe.get_doc("Loan Interest Accrual", {'loan': loan.name})

		self.assertEquals(flt(loan_interest_accural.interest_amount, 2), flt(accrued_interest_amount, 2))
Beispiel #2
0
	def test_loan_repayment_salary_slip(self):
		from erpnext.loan_management.doctype.loan.test_loan import create_loan_type, create_loan, make_loan_disbursement_entry, create_loan_accounts
		from erpnext.loan_management.doctype.process_loan_interest_accrual.process_loan_interest_accrual import process_loan_interest_accrual_for_term_loans

		applicant = make_employee("*****@*****.**", company="_Test Company")

		create_loan_accounts()

		create_loan_type("Car Loan", 500000, 8.4,
			is_term_loan=1,
			mode_of_payment='Cash',
			payment_account='Payment Account - _TC',
			loan_account='Loan Account - _TC',
			interest_income_account='Interest Income Account - _TC',
			penalty_income_account='Penalty Income Account - _TC')

		loan = create_loan(applicant, "Car Loan", 11000, "Repay Over Number of Periods", 20, posting_date=add_months(nowdate(), -1))
		loan.repay_from_salary = 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())

		ss = make_employee_salary_slip("*****@*****.**", "Monthly")
		ss.submit()

		self.assertEqual(ss.total_loan_repayment, 592)
		self.assertEqual(ss.net_pay, (flt(ss.gross_pay) - (flt(ss.total_deduction) + flt(ss.total_loan_repayment))))
Beispiel #3
0
    def test_loan_repayment_salary_slip(self):
        from erpnext.loan_management.doctype.loan.test_loan import create_loan_type, create_loan, make_loan_disbursement_entry, create_loan_accounts
        from erpnext.loan_management.doctype.process_loan_interest_accrual.process_loan_interest_accrual import process_loan_interest_accrual_for_term_loans
        from erpnext.payroll.doctype.salary_structure.test_salary_structure import make_salary_structure

        applicant = make_employee("*****@*****.**",
                                  company="_Test Company")

        create_loan_accounts()

        create_loan_type(
            "Car Loan",
            500000,
            8.4,
            is_term_loan=1,
            mode_of_payment='Cash',
            payment_account='Payment Account - _TC',
            loan_account='Loan Account - _TC',
            interest_income_account='Interest Income Account - _TC',
            penalty_income_account='Penalty Income Account - _TC')

        payroll_period = create_payroll_period(name="_Test Payroll Period 1",
                                               company="_Test Company")

        make_salary_structure("Test Loan Repayment Salary Structure",
                              "Monthly",
                              employee=applicant,
                              currency='INR',
                              payroll_period=payroll_period)

        frappe.db.sql("""delete from `tabLoan""")
        loan = create_loan(applicant,
                           "Car Loan",
                           11000,
                           "Repay Over Number of Periods",
                           20,
                           posting_date=add_months(nowdate(), -1))
        loan.repay_from_salary = 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())

        ss = make_employee_salary_slip(
            "*****@*****.**", "Monthly",
            "Test Loan Repayment Salary Structure")
        ss.submit()

        self.assertEqual(ss.total_loan_repayment, 592)
        self.assertEqual(
            ss.net_pay,
            (flt(ss.gross_pay) -
             (flt(ss.total_deduction) + flt(ss.total_loan_repayment))))
Beispiel #4
0
    def test_loan(self):
        branch = "Test Employee Branch"
        applicant = make_employee(
            "*****@*****.**", company="_Test Company")
        company = "_Test Company"
        holiday_list = make_holiday("test holiday for loan")

        company_doc = frappe.get_doc('Company', company)
        if not company_doc.default_payroll_payable_account:
            company_doc.default_payroll_payable_account = frappe.db.get_value('Account',
                                                                              {'company': company, 'root_type': 'Liability', 'account_type': ''}, 'name')
            company_doc.save()

        if not frappe.db.exists('Branch', branch):
            frappe.get_doc({
                'doctype': 'Branch',
                'branch': branch
            }).insert()

        employee_doc = frappe.get_doc('Employee', applicant)
        employee_doc.branch = branch
        employee_doc.holiday_list = holiday_list
        employee_doc.save()

        salary_structure = "Test Salary Structure for Loan"
        make_salary_structure(salary_structure, "Monthly", employee=employee_doc.name,
                              company="_Test Company", currency=company_doc.default_currency)

        loan = create_loan(applicant, "Car Loan", 280000, "Repay Over Number of Periods",
                           20, posting_date=add_months(nowdate(), -1))
        loan.repay_from_salary = 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())

        dates = get_start_end_dates('Monthly', nowdate())
        make_payroll_entry(company="_Test Company", start_date=dates.start_date, payable_account=company_doc.default_payroll_payable_account,
                           currency=company_doc.default_currency, end_date=dates.end_date, branch=branch, cost_center="Main - _TC", payment_account="Cash - _TC")

        name = frappe.db.get_value('Salary Slip',
                                   {'posting_date': nowdate(), 'employee': applicant}, 'name')

        salary_slip = frappe.get_doc('Salary Slip', name)
        for row in salary_slip.loans:
            if row.loan == loan.name:
                interest_amount = (280000 * 8.4)/(12*100)
                principal_amount = loan.monthly_repayment_amount - interest_amount
                self.assertEqual(row.interest_amount, interest_amount)
                self.assertEqual(row.principal_amount, principal_amount)
                self.assertEqual(row.total_payment,
                                 interest_amount + principal_amount)

        if salary_slip.docstatus == 0:
            frappe.delete_doc('Salary Slip', name)
    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),
            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))

        # check for disbursement accrual
        loan_interest_accrual = frappe.db.get_value(
            "Loan Interest Accrual", {
                "loan": loan.name,
                "accrual_type": "Disbursement"
            })

        self.assertTrue(loan_interest_accrual)
    def test_loan_topup(self):
        pledges = []
        pledges.append({
            "loan_security": "Test Security 1",
            "qty": 4000.00,
            "haircut": 50,
            "loan_security_price": 500.00
        })

        loan_security_pledge = create_loan_security_pledge(
            self.applicant, pledges)

        loan = create_demand_loan(self.applicant,
                                  "Demand Loan",
                                  loan_security_pledge.name,
                                  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(posting_date=add_days(last_date, 1))

        # Paid 511095.89 amount includes 5,00,000 principal amount and 11095.89 interest amount
        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()

        make_loan_disbursement_entry(loan.name,
                                     500000,
                                     disbursement_date=add_days(last_date, 16))

        total_principal_paid = loan.total_principal_paid

        loan.reload()

        # Loan Topup will result in decreasing the Total Principal Paid
        self.assertEqual(flt(loan.total_principal_paid, 2),
                         flt(total_principal_paid - 500000, 2))
Beispiel #7
0
    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.assertEqual(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.assertEqual(
            flt(loan_interest_accrual.total_pending_interest_amount, 0),
            total_pending_interest_amount)
Beispiel #8
0
    def test_loan_topup_with_additional_pledge(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='2019-10-01')
        loan.submit()

        self.assertEquals(loan.loan_amount, 1000000)

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

        # Disbursed 10,00,000 amount
        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))

        previous_interest = amounts['interest_amount']

        pledge1 = [{
            "loan_security": "Test Security 1",
            "qty": 2000.00
        }]

        create_loan_security_pledge(self.applicant, pledge1, loan=loan.name)

        # Topup 500000
        make_loan_disbursement_entry(
            loan.name, 500000, disbursement_date=add_days(last_date, 1))
        process_loan_interest_accrual_for_demand_loans(
            posting_date=add_days(last_date, 15))
        amounts = calculate_amounts(loan.name, add_days(last_date, 15))

        per_day_interest = get_per_day_interest(1500000, 13.5, '2019-10-30')
        interest = per_day_interest * 15

        self.assertEquals(amounts['pending_principal_amount'], 1500000)
        self.assertEquals(amounts['interest_amount'],
                          flt(interest + previous_interest, 2))
	def test_loan_topup(self):
		pledges = []
		pledges.append({
			"loan_security": "Test Security 1",
			"qty": 4000.00,
			"haircut": 50,
			"loan_security_price": 500.00
		})

		loan_security_pledge = create_loan_security_pledge(self.applicant, pledges)

		loan = create_demand_loan(self.applicant, "Demand Loan", loan_security_pledge.name,
			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_loan_interest_accural(self):
        pledges = []
        pledges.append({
            "loan_security": "Test Security 1",
            "qty": 4000.00,
            "haircut": 50,
            "loan_security_price": 500.00
        })

        loan_security_pledge = create_loan_security_pledge(
            self.applicant, pledges)

        loan = create_demand_loan(self.applicant,
                                  "Demand Loan",
                                  loan_security_pledge.name,
                                  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(posting_date=last_date)

        loan_interest_accural = frappe.get_doc("Loan Interest Accrual",
                                               {'loan': loan.name})

        self.assertEquals(flt(loan_interest_accural.interest_amount, 2),
                          flt(accrued_interest_amount, 2))
    def test_loan(self):
        branch = "Test Employee Branch"
        applicant = make_employee("*****@*****.**",
                                  company="_Test Company")
        company = "_Test Company"
        holiday_list = make_holiday("test holiday for loan")

        company_doc = frappe.get_doc("Company", company)
        if not company_doc.default_payroll_payable_account:
            company_doc.default_payroll_payable_account = frappe.db.get_value(
                "Account", {
                    "company": company,
                    "root_type": "Liability",
                    "account_type": ""
                }, "name")
            company_doc.save()

        if not frappe.db.exists("Branch", branch):
            frappe.get_doc({"doctype": "Branch", "branch": branch}).insert()

        employee_doc = frappe.get_doc("Employee", applicant)
        employee_doc.branch = branch
        employee_doc.holiday_list = holiday_list
        employee_doc.save()

        salary_structure = "Test Salary Structure for Loan"
        make_salary_structure(
            salary_structure,
            "Monthly",
            employee=employee_doc.name,
            company="_Test Company",
            currency=company_doc.default_currency,
        )

        if not frappe.db.exists("Loan Type", "Car Loan"):
            create_loan_accounts()
            create_loan_type(
                "Car 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",
            )

        loan = create_loan(
            applicant,
            "Car Loan",
            280000,
            "Repay Over Number of Periods",
            20,
            posting_date=add_months(nowdate(), -1),
        )
        loan.repay_from_salary = 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())

        dates = get_start_end_dates("Monthly", nowdate())
        make_payroll_entry(
            company="_Test Company",
            start_date=dates.start_date,
            payable_account=company_doc.default_payroll_payable_account,
            currency=company_doc.default_currency,
            end_date=dates.end_date,
            branch=branch,
            cost_center="Main - _TC",
            payment_account="Cash - _TC",
        )

        name = frappe.db.get_value("Salary Slip", {
            "posting_date": nowdate(),
            "employee": applicant
        }, "name")

        salary_slip = frappe.get_doc("Salary Slip", name)
        for row in salary_slip.loans:
            if row.loan == loan.name:
                interest_amount = (280000 * 8.4) / (12 * 100)
                principal_amount = loan.monthly_repayment_amount - interest_amount
                self.assertEqual(row.interest_amount, interest_amount)
                self.assertEqual(row.principal_amount, principal_amount)
                self.assertEqual(row.total_payment,
                                 interest_amount + principal_amount)

        if salary_slip.docstatus == 0:
            frappe.delete_doc("Salary Slip", name)