From 5d743c6f78fd9e9f0f5a46fe74f592cae85a6cc4 Mon Sep 17 00:00:00 2001 From: Aysha Date: Sun, 9 Mar 2025 10:53:29 +0530 Subject: [PATCH 1/3] fix: add status and pay_via_payment_entry filters to leave encashment in fnf --- .../full_and_final_statement/full_and_final_statement.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/hrms/hr/doctype/full_and_final_statement/full_and_final_statement.js b/hrms/hr/doctype/full_and_final_statement/full_and_final_statement.js index f638fe9410..70a99a6788 100644 --- a/hrms/hr/doctype/full_and_final_statement/full_and_final_statement.js +++ b/hrms/hr/doctype/full_and_final_statement/full_and_final_statement.js @@ -46,6 +46,11 @@ frappe.ui.form.on("Full and Final Statement", { if (frappe.meta.has_field(fnf_doc.reference_document_type, "employee")) { filters["employee"] = frm.doc.employee; } + + if (fnf_doc.reference_document_type === "Leave Encashment") { + filters["status"] = "Unpaid"; + filters["pay_via_payment_entry"] = 1; + } }); return { From cec13aa37b7dd8dffc033f91c2b97665ab8db66d Mon Sep 17 00:00:00 2001 From: Aysha Date: Sun, 9 Mar 2025 10:57:10 +0530 Subject: [PATCH 2/3] fix: update status of linked encashment payable docs --- .../full_and_final_statement.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/hrms/hr/doctype/full_and_final_statement/full_and_final_statement.py b/hrms/hr/doctype/full_and_final_statement/full_and_final_statement.py index 4d334c6ecd..e381c29d91 100644 --- a/hrms/hr/doctype/full_and_final_statement/full_and_final_statement.py +++ b/hrms/hr/doctype/full_and_final_statement/full_and_final_statement.py @@ -257,14 +257,17 @@ def create_journal_entry(self): ) return jv - def set_gratuity_status(self): + def update_reference_document_payment_status(self, payable): + doc = frappe.get_cached_doc(payable.reference_document_type, payable.reference_document) + amount = payable.amount if self.docstatus == 1 and self.status == "Paid" else 0 + doc.db_set("paid_amount", amount) + doc.set_status(update=True) + + def update_linked_payable_documents(self): + """update payment status in linked payable documents""" for payable in self.payables: - if payable.component != "Gratuity": - continue - gratuity = frappe.get_doc("Gratuity", payable.reference_document) - amount = payable.amount if self.docstatus == 1 and self.status == "Paid" else 0 - gratuity.db_set("paid_amount", amount) - gratuity.set_status(update=True) + if payable.reference_document_type in ["Gratuity", "Leave Encashment"]: + self.update_reference_document_payment_status(payable) @frappe.whitelist() @@ -333,4 +336,4 @@ def update_full_and_final_statement_status(doc, method=None): fnf = frappe.get_doc("Full and Final Statement", entry.reference_name) fnf.db_set("status", status) fnf.notify_update() - fnf.set_gratuity_status() + fnf.update_linked_payable_documents() From 3589e0495dd2a79dd33138138f040eed65618c7e Mon Sep 17 00:00:00 2001 From: Aysha Date: Sun, 9 Mar 2025 11:44:01 +0530 Subject: [PATCH 3/3] chore: add test --- .../leave_encashment/test_leave_encashment.py | 46 +++++++++++++++++-- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/hrms/hr/doctype/leave_encashment/test_leave_encashment.py b/hrms/hr/doctype/leave_encashment/test_leave_encashment.py index cad0d2d487..e2d5acb39d 100644 --- a/hrms/hr/doctype/leave_encashment/test_leave_encashment.py +++ b/hrms/hr/doctype/leave_encashment/test_leave_encashment.py @@ -347,10 +347,15 @@ def test_status_of_leave_encashment_after_payment_via_salary_slip(self): leave_encashment.reload() self.assertEqual(leave_encashment.status, "Unpaid") - def test_status_of_leave_encashment_after_payment_via_payment_entry(self): + def test_status_of_leave_encashment_after_payment_via_payment_entry_and_fnf(self): + from hrms.hr.doctype.full_and_final_statement.test_full_and_final_statement import ( + create_full_and_final_statement, + ) from hrms.overrides.employee_payment_entry import get_payment_entry_for_employee - leave_encashment = self.create_test_leave_encashment(pay_via_payment_entry=1) + leave_encashment = self.create_test_leave_encashment( + pay_via_payment_entry=1, payable_account="Payroll Payable - _TC" + ) leave_encashment.submit() pe = get_payment_entry_for_employee(leave_encashment.doctype, leave_encashment.name) @@ -360,9 +365,44 @@ def test_status_of_leave_encashment_after_payment_via_payment_entry(self): pe.submit() leave_encashment.reload() + self.assertEqual(leave_encashment.status, "Paid") + pe.cancel() + leave_encashment.reload() + self.assertEqual(leave_encashment.status, "Unpaid") + + frappe.db.set_value("Employee", self.employee, "relieving_date", getdate()) + + fnf = create_full_and_final_statement(self.employee) + fnf.payables = [] + fnf.receivables = [] + fnf.append( + "payables", + { + "component": "Leave Encashment", + "reference_document_type": "Leave Encashment", + "reference_document": leave_encashment.name, + "amount": leave_encashment.encashment_amount, + "account": leave_encashment.payable_account, + "status": "Settled", + }, + ) + fnf.submit() + + jv = fnf.create_journal_entry() + jv.accounts[1].account = frappe.get_cached_value("Company", "_Test Company", "default_bank_account") + jv.cheque_no = "123456" + jv.cheque_date = getdate() + jv.save() + jv.submit() + + leave_encashment.reload() self.assertEqual(leave_encashment.status, "Paid") + jv.cancel() + leave_encashment.reload() + self.assertEqual(leave_encashment.status, "Unpaid") + def create_test_leave_encashment(self, **kwargs): """Helper method to create leave encashment with default values""" args = { @@ -387,7 +427,7 @@ def create_leave_encashment(**args): leave_encashment.leave_period = args.leave_period leave_encashment.encashment_date = args.encashment_date or getdate() leave_encashment.currency = args.currency or frappe.get_cached_value( - "Company", "_Test Company", "default_payable_account" + "Company", "_Test Company", "default_currency" ) leave_encashment.pay_via_payment_entry = args.pay_via_payment_entry or 0 if leave_encashment.pay_via_payment_entry: