diff --git a/hrms/hr/doctype/expense_claim/expense_claim.js b/hrms/hr/doctype/expense_claim/expense_claim.js index 99e4a4b482..8be97dfc9b 100644 --- a/hrms/hr/doctype/expense_claim/expense_claim.js +++ b/hrms/hr/doctype/expense_claim/expense_claim.js @@ -13,6 +13,7 @@ frappe.ui.form.on("Expense Claim", { ["employee", "=", frm.doc.employee], ["paid_amount", ">", 0], ["status", "not in", ["Claimed", "Returned", "Partly Claimed and Returned"]], + ["currency", "=", frm.doc.currency], ], }; }); diff --git a/hrms/hr/doctype/expense_claim/expense_claim.py b/hrms/hr/doctype/expense_claim/expense_claim.py index 8b4cc9d309..a5e749ed1d 100644 --- a/hrms/hr/doctype/expense_claim/expense_claim.py +++ b/hrms/hr/doctype/expense_claim/expense_claim.py @@ -701,6 +701,10 @@ def get_advances(expense_claim: str | dict | Document, advance_id: str | None = else: query = query.where((advance.name == advance_id) & (advance.employee == expense_claim_doc.employee)) + # advance can only be adjusted in its own currency + if expense_claim_doc.currency: + query = query.where(advance.currency == expense_claim_doc.currency) + advances = query.run(as_dict=True) for advance in advances: @@ -781,7 +785,7 @@ def get_expense_claim_advances(expense_claim, employee_advance): unclaimed_amount = paid_amount - claimed_amount return_amount = flt(employee_advance.return_amount) allocated_amount = get_allocation_amount( - paid_amount=(paid_amount), claimed_amount=(claimed_amount), return_amount=(return_amount) + paid_amount=paid_amount, claimed_amount=claimed_amount, return_amount=return_amount ) expense_claim.append( diff --git a/hrms/hr/doctype/expense_claim/test_expense_claim.py b/hrms/hr/doctype/expense_claim/test_expense_claim.py index 90873c10f2..a2d80c159a 100644 --- a/hrms/hr/doctype/expense_claim/test_expense_claim.py +++ b/hrms/hr/doctype/expense_claim/test_expense_claim.py @@ -12,6 +12,7 @@ from hrms.hr.doctype.expense_claim.expense_claim import ( MismatchError, + get_advances, get_outstanding_amount_for_claim, make_expense_claim_for_delivery_trip, ) @@ -753,6 +754,42 @@ def test_self_expense_approval_not_allowed(self): self.assertEqual(1, expense_claim.docstatus) + def test_advance_in_different_currency_excluded_from_claim(self): + from hrms.hr.doctype.employee_advance.test_employee_advance import ( + create_advance_account, + make_employee_advance, + make_payment_entry, + ) + + company = "_Test Company" + company_currency = get_company_currency(company) + advance_account = create_advance_account("Employee Advance (USD)", "USD") + employee = make_employee( + "test_adv_cross_currency@example.com", + company, + salary_currency="USD", + employee_advance_account=advance_account, + ) + advance = make_employee_advance(employee) + make_payment_entry(advance, advance.advance_amount) + advance.reload() + self.assertNotEqual(advance.currency, company_currency) + + claim = make_expense_claim( + get_payable_account(company), + advance.advance_amount, + advance.advance_amount, + company, + "Travel Expenses - _TC", + args={"currency": company_currency, "exchange_rate": 1}, + employee=employee, + do_not_submit=True, + ) + + # mismatched-currency advance is excluded from both the bulk and explicit fetch + self.assertEqual(get_advances(claim), []) + self.assertEqual(get_advances(claim, advance.name), []) + def test_multicurrency_claim(self): from hrms.hr.doctype.employee_advance.test_employee_advance import ( create_advance_account,