From a7e8ec1991c62f7a8a4059cec90bd5b007fc2d90 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 (cherry picked from commit 5d743c6f78fd9e9f0f5a46fe74f592cae85a6cc4) --- .../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 373dfdab5a95c4affaa0c072f164ba1f85054e94 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 (cherry picked from commit cec13aa37b7dd8dffc033f91c2b97665ab8db66d) --- .../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 da75f03f684e573191c79f5c59154123aa8a2363 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 (cherry picked from commit 3589e0495dd2a79dd33138138f040eed65618c7e) # Conflicts: # hrms/hr/doctype/leave_encashment/test_leave_encashment.py --- .../leave_encashment/test_leave_encashment.py | 90 ++++++++++++++++++- 1 file changed, 89 insertions(+), 1 deletion(-) diff --git a/hrms/hr/doctype/leave_encashment/test_leave_encashment.py b/hrms/hr/doctype/leave_encashment/test_leave_encashment.py index 1edb7b1b6e..e873c9b0bf 100644 --- a/hrms/hr/doctype/leave_encashment/test_leave_encashment.py +++ b/hrms/hr/doctype/leave_encashment/test_leave_encashment.py @@ -408,9 +408,13 @@ 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 +<<<<<<< HEAD leave_encashment = frappe.get_doc( doctype="Leave Encashment", employee=self.employee, @@ -421,6 +425,11 @@ def test_status_of_leave_encashment_after_payment_via_payment_entry(self): expense_account="Administrative Expenses - _TC", cost_center="Main - _TC", ).save() +======= + leave_encashment = self.create_test_leave_encashment( + pay_via_payment_entry=1, payable_account="Payroll Payable - _TC" + ) +>>>>>>> 3589e049 (chore: add test) leave_encashment.submit() pe = get_payment_entry_for_employee(leave_encashment.doctype, leave_encashment.name) @@ -430,5 +439,84 @@ def test_status_of_leave_encashment_after_payment_via_payment_entry(self): pe.submit() leave_encashment.reload() + self.assertEqual(leave_encashment.status, "Paid") +<<<<<<< HEAD +======= + + 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 = { + "employee": self.employee, + "leave_type": "_Test Leave Type Encashment", + "leave_period": self.leave_period.name, + "encashment_date": self.leave_period.to_date, + "currency": "INR", + } + args.update(kwargs) + return create_leave_encashment(**args) + + +def create_leave_encashment(**args): + if args: + args = frappe._dict(args) + leave_encashment = frappe.new_doc("Leave Encashment") + leave_encashment.company = args.company or "_Test Company" + leave_encashment.employee = args.employee + leave_encashment.posting_date = args.posting_date or getdate() + leave_encashment.leave_type = args.leave_type + 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_currency" + ) + leave_encashment.pay_via_payment_entry = args.pay_via_payment_entry or 0 + if leave_encashment.pay_via_payment_entry: + leave_encashment.payable_account = args.payable_account or frappe.get_cached_value( + "Company", "_Test Company", "default_payable_account" + ) + leave_encashment.expense_account = args.expense_account or "Administrative Expenses - _TC" + leave_encashment.cost_center = args.cost_center or "Main - _TC" + + if args.encashment_days: + leave_encashment.encashment_days = args.encashment_days + + leave_encashment.insert() + + return leave_encashment +>>>>>>> 3589e049 (chore: add test)