From 61fb9bf869892a156fe04d1642d41a1e47c4ce55 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Sun, 14 Mar 2021 21:25:21 +0530 Subject: [PATCH 1/4] fix: Loan Repayment entry cancellation on salary slip cancel --- .../doctype/salary_slip_loan/salary_slip_loan.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/erpnext/loan_management/doctype/salary_slip_loan/salary_slip_loan.json b/erpnext/loan_management/doctype/salary_slip_loan/salary_slip_loan.json index 2f4fe24945..3d07081215 100644 --- a/erpnext/loan_management/doctype/salary_slip_loan/salary_slip_loan.json +++ b/erpnext/loan_management/doctype/salary_slip_loan/salary_slip_loan.json @@ -70,7 +70,9 @@ { "fieldname": "loan_repayment_entry", "fieldtype": "Link", + "hidden": 1, "label": "Loan Repayment Entry", + "no_copy": 1, "options": "Loan Repayment", "read_only": 1 }, @@ -83,9 +85,10 @@ "read_only": 1 } ], + "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2020-04-16 13:17:04.798335", + "modified": "2021-03-14 20:47:11.725818", "modified_by": "Administrator", "module": "Loan Management", "name": "Salary Slip Loan", From a2e45644644651d3e5d6be41f93d7d3087886ce2 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Mon, 15 Mar 2021 10:32:38 +0530 Subject: [PATCH 2/4] fix: Prevent non sequential repayment entries --- .../doctype/loan_repayment/loan_repayment.py | 19 ++++++++++++++++--- .../doctype/salary_slip/salary_slip.py | 2 +- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/erpnext/loan_management/doctype/loan_repayment/loan_repayment.py b/erpnext/loan_management/doctype/loan_repayment/loan_repayment.py index bac06c4e9e..72e3050b54 100644 --- a/erpnext/loan_management/doctype/loan_repayment/loan_repayment.py +++ b/erpnext/loan_management/doctype/loan_repayment/loan_repayment.py @@ -21,6 +21,7 @@ class LoanRepayment(AccountsController): def validate(self): amounts = calculate_amounts(self.against_loan, self.posting_date) self.set_missing_values(amounts) + self.check_future_entries() self.validate_amount() self.allocate_amounts(amounts) @@ -30,6 +31,7 @@ class LoanRepayment(AccountsController): def on_submit(self): self.update_paid_amount() self.make_gl_entries() + #self.repost_future_loan_interest_accruals() def on_cancel(self): self.mark_as_unpaid() @@ -63,6 +65,13 @@ class LoanRepayment(AccountsController): if amounts.get('due_date'): self.due_date = amounts.get('due_date') + def check_future_entries(self): + future_repayment_date = frappe.db.get_value("Loan Repayment", {"posting_date": (">", self.posting_date), + "docstatus": 1}, 'posting_date') + + if future_repayment_date: + frappe.throw("Repayment already made till date {0}".format(getdate(future_repayment_date))) + def validate_amount(self): precision = cint(frappe.db.get_default("currency_precision")) or 2 @@ -265,6 +274,10 @@ class LoanRepayment(AccountsController): if gle_map: make_gl_entries(gle_map, cancel=cancel, adv_adj=adv_adj, merge_entries=False) + # def repost_future_loan_interest_accruals(self): + # future_lias = frappe.db.get_all("Loan Interest Accrual", {"docstatus": 1, "posting_date": (">", self.posting_date)}) + # if future_lias: + def create_repayment_entry(loan, applicant, company, posting_date, loan_type, payment_type, interest_payable, payable_principal_amount, amount_paid, penalty_amount=None): @@ -284,8 +297,7 @@ def create_repayment_entry(loan, applicant, company, posting_date, loan_type, return lr -def get_accrued_interest_entries(against_loan): - +def get_accrued_interest_entries(against_loan, posting_date): unpaid_accrued_entries = frappe.db.sql( """ SELECT name, posting_date, interest_amount - paid_interest_amount as interest_amount, @@ -295,12 +307,13 @@ def get_accrued_interest_entries(against_loan): `tabLoan Interest Accrual` WHERE loan = %s + AND posting_date <= %s AND (interest_amount - paid_interest_amount > 0 OR payable_principal_amount - paid_principal_amount > 0) AND docstatus = 1 ORDER BY posting_date - """, (against_loan), as_dict=1) + """, (against_loan, posting_date), as_dict=1) return unpaid_accrued_entries diff --git a/erpnext/payroll/doctype/salary_slip/salary_slip.py b/erpnext/payroll/doctype/salary_slip/salary_slip.py index 595d6974fd..a7e53cc5aa 100644 --- a/erpnext/payroll/doctype/salary_slip/salary_slip.py +++ b/erpnext/payroll/doctype/salary_slip/salary_slip.py @@ -1050,7 +1050,7 @@ class SalarySlip(TransactionBase): repayment_entry.save() repayment_entry.submit() - loan.loan_repayment_entry = repayment_entry.name + frappe.db.set_value("Salary Slip Loan", loan.name, "loan_repayment_entry", repayment_entry.name) def cancel_loan_repayment_entry(self): for loan in self.loans: From d551940dc518a3c7a085dcc714c8dec34685bd5e Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Tue, 6 Apr 2021 23:55:48 +0530 Subject: [PATCH 3/4] fix: Remove comments --- .../loan_management/doctype/loan_repayment/loan_repayment.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/erpnext/loan_management/doctype/loan_repayment/loan_repayment.py b/erpnext/loan_management/doctype/loan_repayment/loan_repayment.py index b3dd949f12..2489f59670 100644 --- a/erpnext/loan_management/doctype/loan_repayment/loan_repayment.py +++ b/erpnext/loan_management/doctype/loan_repayment/loan_repayment.py @@ -31,7 +31,6 @@ class LoanRepayment(AccountsController): def on_submit(self): self.update_paid_amount() self.make_gl_entries() - #self.repost_future_loan_interest_accruals() def on_cancel(self): self.mark_as_unpaid() @@ -297,10 +296,6 @@ class LoanRepayment(AccountsController): if gle_map: make_gl_entries(gle_map, cancel=cancel, adv_adj=adv_adj, merge_entries=False) - # def repost_future_loan_interest_accruals(self): - # future_lias = frappe.db.get_all("Loan Interest Accrual", {"docstatus": 1, "posting_date": (">", self.posting_date)}) - # if future_lias: - def create_repayment_entry(loan, applicant, company, posting_date, loan_type, payment_type, interest_payable, payable_principal_amount, amount_paid, penalty_amount=None): From 5af6aea9f9a94e8b77372002ddcd5180603ee079 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Wed, 7 Apr 2021 09:46:13 +0530 Subject: [PATCH 4/4] fix: Posting Date check --- .../doctype/loan_repayment/loan_repayment.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/erpnext/loan_management/doctype/loan_repayment/loan_repayment.py b/erpnext/loan_management/doctype/loan_repayment/loan_repayment.py index 2489f59670..5d57cedb41 100644 --- a/erpnext/loan_management/doctype/loan_repayment/loan_repayment.py +++ b/erpnext/loan_management/doctype/loan_repayment/loan_repayment.py @@ -72,7 +72,7 @@ class LoanRepayment(AccountsController): def check_future_entries(self): future_repayment_date = frappe.db.get_value("Loan Repayment", {"posting_date": (">", self.posting_date), - "docstatus": 1}, 'posting_date') + "docstatus": 1, "against_loan": self.against_loan}, 'posting_date') if future_repayment_date: frappe.throw("Repayment already made till date {0}".format(getdate(future_repayment_date))) @@ -315,7 +315,10 @@ def create_repayment_entry(loan, applicant, company, posting_date, loan_type, return lr -def get_accrued_interest_entries(against_loan, posting_date): +def get_accrued_interest_entries(against_loan, posting_date=None): + if not posting_date: + posting_date = getdate() + unpaid_accrued_entries = frappe.db.sql( """ SELECT name, posting_date, interest_amount - paid_interest_amount as interest_amount, @@ -343,7 +346,7 @@ def get_amounts(amounts, against_loan, posting_date): against_loan_doc = frappe.get_doc("Loan", against_loan) loan_type_details = frappe.get_doc("Loan Type", against_loan_doc.loan_type) - accrued_interest_entries = get_accrued_interest_entries(against_loan_doc.name) + accrued_interest_entries = get_accrued_interest_entries(against_loan_doc.name, posting_date) pending_accrual_entries = {}