Skip to content

Commit

Permalink
Merge pull request #23279 from deepeshgarg007/loan_closure_interest
Browse files Browse the repository at this point in the history
fix: Pending loan interest accrual on loan closure
  • Loading branch information
deepeshgarg007 authored Sep 7, 2020
2 parents 06130ee + afefa87 commit af1c4ba
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 6 deletions.
5 changes: 2 additions & 3 deletions erpnext/loan_management/doctype/loan/test_loan.py
Original file line number Diff line number Diff line change
Expand Up @@ -199,10 +199,9 @@ def test_loan_closure_repayment(self):
"Loan Closure", 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'])
amount = frappe.db.get_value('Loan Interest Accrual', {'loan': loan.name}, ['sum(paid_interest_amount)'])

self.assertEquals(flt(amounts[0], 2),flt(accrued_interest_amount, 2))
self.assertEquals(flt(amount, 2),flt(accrued_interest_amount, 2))
self.assertEquals(flt(repayment_entry.penalty_amount, 5), 0)

loan.load_from_db()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,8 @@ def get_last_accural_date_in_current_month(loan):
WHERE loan = %s""", (loan.name))

if last_posting_date[0][0]:
return last_posting_date[0][0]
# interest for last interest accrual date is already booked, so add 1 day
return add_days(last_posting_date[0][0], 1)
else:
return loan.disbursement_date

Expand Down
26 changes: 24 additions & 2 deletions erpnext/loan_management/doctype/loan_repayment/loan_repayment.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
from erpnext.controllers.accounts_controller import AccountsController
from erpnext.accounts.general_ledger import make_gl_entries
from erpnext.loan_management.doctype.loan_security_shortfall.loan_security_shortfall import update_shortfall_status
from erpnext.loan_management.doctype.process_loan_interest_accrual.process_loan_interest_accrual import process_loan_interest_accrual_for_demand_loans

class LoanRepayment(AccountsController):

Expand All @@ -22,6 +23,9 @@ def validate(self):
self.validate_amount()
self.allocate_amounts(amounts['pending_accrual_entries'])

def before_submit(self):
self.book_unaccrued_interest()

def on_submit(self):
self.update_paid_amount()
self.make_gl_entries()
Expand Down Expand Up @@ -72,6 +76,26 @@ def validate_amount(self):
msg = _("Amount of {0} is required for Loan closure").format(self.payable_amount)
frappe.throw(msg)

def book_unaccrued_interest(self):
if self.payment_type == 'Loan Closure':
total_interest_paid = 0
for payment in self.repayment_details:
total_interest_paid += payment.paid_interest_amount

if total_interest_paid < self.interest_payable:
if not self.is_term_loan:
process = process_loan_interest_accrual_for_demand_loans(posting_date=self.posting_date,
loan=self.against_loan)

lia = frappe.db.get_value('Loan Interest Accrual', {'process_loan_interest_accrual':
process}, ['name', 'interest_amount', 'payable_principal_amount'], as_dict=1)

self.append('repayment_details', {
'loan_interest_accrual': lia.name,
'paid_interest_amount': lia.interest_amount,
'paid_principal_amount': lia.payable_principal_amount
})

def update_paid_amount(self):
precision = cint(frappe.db.get_default("currency_precision")) or 2

Expand Down Expand Up @@ -148,8 +172,6 @@ def allocate_amounts(self, paid_entries):
if self.payment_type == 'Loan Closure' and total_interest_paid < self.interest_payable:
unaccrued_interest = self.interest_payable - total_interest_paid
interest_paid -= unaccrued_interest
if self.repayment_details:
self.repayment_details[-1].paid_interest_amount += unaccrued_interest

if interest_paid:
self.principal_amount_paid += interest_paid
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ def process_loan_interest_accrual_for_demand_loans(posting_date=None, loan_type=

loan_process.submit()

return loan_process.name

def process_loan_interest_accrual_for_term_loans(posting_date=None, loan_type=None, loan=None):

if not term_loan_accrual_pending(posting_date or nowdate()):
Expand All @@ -49,6 +51,8 @@ def process_loan_interest_accrual_for_term_loans(posting_date=None, loan_type=No

loan_process.submit()

return loan_process.name

def term_loan_accrual_pending(date):
pending_accrual = frappe.db.get_value('Repayment Schedule', {
'payment_date': ('<=', date),
Expand Down

0 comments on commit af1c4ba

Please sign in to comment.