From 78da4c38fa4c123d7524c7edad00124b62b36081 Mon Sep 17 00:00:00 2001 From: iamkhanraheel Date: Mon, 29 Sep 2025 17:33:38 +0530 Subject: [PATCH 1/4] feat: multiCurrency in epxense claim, set excahnge rate in advance & update it in gl entry (cherry picked from commit a9ecf7c31928a0cd5e5e6ef29c0483ce86aa8372) --- .../doctype/payment_entry/payment_entry.py | 15 +++++++++++++++ erpnext/controllers/accounts_controller.py | 8 ++++++-- erpnext/setup/doctype/employee/employee.js | 14 ++++++++++++++ 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py index 07d129c26dd..f1bbd581338 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py @@ -196,6 +196,9 @@ class PaymentEntry(AccountsController): def before_save(self): self.set_matched_unset_payment_requests_to_response() + def before_submit(self): + self.set_exchange_rate_in_advance() + def on_submit(self): if self.difference_amount: frappe.throw(_("Difference Amount must be zero")) @@ -922,6 +925,18 @@ class PaymentEntry(AccountsController): self.db_set("status", self.status, update_modified=True) + def set_exchange_rate_in_advance(self): + if self.references: + for reference_doc in self.references: + if reference_doc.reference_doctype == "Employee Advance" and self.target_exchange_rate: + frappe.db.set_value( + "Employee Advance", + reference_doc.reference_name, + "exchange_rate", + self.target_exchange_rate, + update_modified=False, + ) + def set_total_in_words(self): from frappe.utils import money_in_words diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 145625e0f76..c1a9547499c 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -1291,7 +1291,10 @@ class AccountsController(TransactionBase): "Payment Entry", ]: set_balance_in_account_currency( - gl_dict, account_currency, self.get("conversion_rate"), self.company_currency + gl_dict, + account_currency, + args.get("transaction_exchange_rate") or self.get("conversion_rate"), + self.company_currency, ) # Update details in transaction currency @@ -1299,7 +1302,8 @@ class AccountsController(TransactionBase): gl_dict.update( { "transaction_currency": self.get("currency") or self.company_currency, - "transaction_exchange_rate": self.get("conversion_rate", 1), + "transaction_exchange_rate": args.get("transaction_exchange_rate") + or self.get("conversion_rate", 1), "debit_in_transaction_currency": self.get_value_in_transaction_currency( account_currency, gl_dict, "debit" ), diff --git a/erpnext/setup/doctype/employee/employee.js b/erpnext/setup/doctype/employee/employee.js index 22079e94075..09d2855b0aa 100755 --- a/erpnext/setup/doctype/employee/employee.js +++ b/erpnext/setup/doctype/employee/employee.js @@ -35,6 +35,20 @@ frappe.ui.form.on("Employee", { }, }; }); + + if (frm.doc.salary_currency) { + frm.set_query("employee_advance_account", function () { + return { + filters: { + root_type: "Asset", + is_group: 0, + company: frm.doc.company, + account_currency: frm.doc.salary_currency, + account_type: "Receivable", + }, + }; + }); + } }, refresh: function (frm) { From bacef2f135e3d75562982a61cc8436da14fed703 Mon Sep 17 00:00:00 2001 From: iamkhanraheel Date: Tue, 28 Oct 2025 18:16:41 +0530 Subject: [PATCH 2/4] fix: remove hrms dependent func which are moved to hrms module (cherry picked from commit 038536e1cdb253437aa034f018f8227a6ac7b71f) --- .../doctype/payment_entry/payment_entry.py | 15 --------------- erpnext/setup/doctype/employee/employee.js | 14 -------------- 2 files changed, 29 deletions(-) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py index f1bbd581338..07d129c26dd 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py @@ -196,9 +196,6 @@ class PaymentEntry(AccountsController): def before_save(self): self.set_matched_unset_payment_requests_to_response() - def before_submit(self): - self.set_exchange_rate_in_advance() - def on_submit(self): if self.difference_amount: frappe.throw(_("Difference Amount must be zero")) @@ -925,18 +922,6 @@ class PaymentEntry(AccountsController): self.db_set("status", self.status, update_modified=True) - def set_exchange_rate_in_advance(self): - if self.references: - for reference_doc in self.references: - if reference_doc.reference_doctype == "Employee Advance" and self.target_exchange_rate: - frappe.db.set_value( - "Employee Advance", - reference_doc.reference_name, - "exchange_rate", - self.target_exchange_rate, - update_modified=False, - ) - def set_total_in_words(self): from frappe.utils import money_in_words diff --git a/erpnext/setup/doctype/employee/employee.js b/erpnext/setup/doctype/employee/employee.js index 09d2855b0aa..22079e94075 100755 --- a/erpnext/setup/doctype/employee/employee.js +++ b/erpnext/setup/doctype/employee/employee.js @@ -35,20 +35,6 @@ frappe.ui.form.on("Employee", { }, }; }); - - if (frm.doc.salary_currency) { - frm.set_query("employee_advance_account", function () { - return { - filters: { - root_type: "Asset", - is_group: 0, - company: frm.doc.company, - account_currency: frm.doc.salary_currency, - account_type: "Receivable", - }, - }; - }); - } }, refresh: function (frm) { From 9c2525a8f42d633dce69bf1937cfa984ef9a1eb1 Mon Sep 17 00:00:00 2001 From: iamkhanraheel Date: Thu, 13 Nov 2025 14:03:46 +0530 Subject: [PATCH 3/4] feat: add exchange rate & base field in advance payment ledger, set exchange rate in journal entry on every refresh (cherry picked from commit 287cb621cd6975c721025cf7073cae5f432cee02) # Conflicts: # erpnext/accounts/doctype/advance_payment_ledger_entry/advance_payment_ledger_entry.json --- .../advance_payment_ledger_entry.js | 11 ++++--- .../advance_payment_ledger_entry.json | 24 +++++++++++++- .../advance_payment_ledger_entry.py | 2 ++ .../doctype/journal_entry/journal_entry.js | 4 +++ .../doctype/journal_entry/journal_entry.py | 2 +- .../doctype/payment_entry/payment_entry.py | 1 + erpnext/accounts/utils.py | 31 ++++++++++++++++--- 7 files changed, 64 insertions(+), 11 deletions(-) diff --git a/erpnext/accounts/doctype/advance_payment_ledger_entry/advance_payment_ledger_entry.js b/erpnext/accounts/doctype/advance_payment_ledger_entry/advance_payment_ledger_entry.js index 1a0dc1e7272..24b82fa8025 100644 --- a/erpnext/accounts/doctype/advance_payment_ledger_entry/advance_payment_ledger_entry.js +++ b/erpnext/accounts/doctype/advance_payment_ledger_entry/advance_payment_ledger_entry.js @@ -1,8 +1,9 @@ // Copyright (c) 2024, Frappe Technologies Pvt. Ltd. and contributors // For license information, please see license.txt -// frappe.ui.form.on("Advance Payment Ledger Entry", { -// refresh(frm) { - -// }, -// }); +frappe.ui.form.on("Advance Payment Ledger Entry", { + refresh(frm) { + frm.set_currency_labels(["amount"], frm.doc.currency); + frm.set_currency_labels(["base_amount"], erpnext.get_currency(frm.doc.company)); + }, +}); diff --git a/erpnext/accounts/doctype/advance_payment_ledger_entry/advance_payment_ledger_entry.json b/erpnext/accounts/doctype/advance_payment_ledger_entry/advance_payment_ledger_entry.json index 35a3196c140..487879da97d 100644 --- a/erpnext/accounts/doctype/advance_payment_ledger_entry/advance_payment_ledger_entry.json +++ b/erpnext/accounts/doctype/advance_payment_ledger_entry/advance_payment_ledger_entry.json @@ -10,8 +10,10 @@ "voucher_no", "against_voucher_type", "against_voucher_no", - "amount", "currency", + "exchange_rate", + "amount", + "base_amount", "event", "delinked" ], @@ -76,13 +78,33 @@ "fieldtype": "Check", "label": "DeLinked", "read_only": 1 + }, + { + "depends_on": "base_amount", + "fieldname": "base_amount", + "fieldtype": "Currency", + "label": "Amount (Company Currency)", + "options": "Company:company:default_currency", + "read_only": 1 + }, + { + "depends_on": "exchange_rate", + "fieldname": "exchange_rate", + "fieldtype": "Float", + "label": "Exchange Rate", + "precision": "9", + "read_only": 1 } ], "grid_page_length": 50, "in_create": 1, "index_web_pages_for_search": 1, "links": [], +<<<<<<< HEAD "modified": "2025-10-13 15:11:58.300836", +======= + "modified": "2025-11-13 12:45:03.014555", +>>>>>>> 287cb621cd (feat: add exchange rate & base field in advance payment ledger, set exchange rate in journal entry on every refresh) "modified_by": "Administrator", "module": "Accounts", "name": "Advance Payment Ledger Entry", diff --git a/erpnext/accounts/doctype/advance_payment_ledger_entry/advance_payment_ledger_entry.py b/erpnext/accounts/doctype/advance_payment_ledger_entry/advance_payment_ledger_entry.py index 599bd2c5e4c..b398259dcc1 100644 --- a/erpnext/accounts/doctype/advance_payment_ledger_entry/advance_payment_ledger_entry.py +++ b/erpnext/accounts/doctype/advance_payment_ledger_entry/advance_payment_ledger_entry.py @@ -19,10 +19,12 @@ class AdvancePaymentLedgerEntry(Document): against_voucher_no: DF.DynamicLink | None against_voucher_type: DF.Link | None amount: DF.Currency + base_amount: DF.Currency company: DF.Link | None currency: DF.Link | None delinked: DF.Check event: DF.Data | None + exchange_rate: DF.Float voucher_no: DF.DynamicLink | None voucher_type: DF.Link | None # end: auto-generated types diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.js b/erpnext/accounts/doctype/journal_entry/journal_entry.js index eea54a69d89..c81acb57865 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.js +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.js @@ -111,6 +111,10 @@ frappe.ui.form.on("Journal Entry", { } erpnext.accounts.unreconcile_payment.add_unreconcile_btn(frm); + + $.each(frm.doc.accounts || [], function (i, row) { + erpnext.journal_entry.set_exchange_rate(frm, row.doctype, row.name); + }); }, before_save: function (frm) { if (frm.doc.docstatus == 0 && !frm.doc.is_system_generated) { diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py index b95e140b706..4fec8f2dd01 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py @@ -1774,7 +1774,7 @@ def get_exchange_rate( # The date used to retreive the exchange rate here is the date passed # in as an argument to this function. - elif (not exchange_rate or flt(exchange_rate) == 1) and account_currency and posting_date: + elif (not flt(exchange_rate) or flt(exchange_rate) == 1) and account_currency and posting_date: exchange_rate = get_exchange_rate(account_currency, company_currency, posting_date) else: exchange_rate = 1 diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py index 07d129c26dd..4737e22e91a 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py @@ -1437,6 +1437,7 @@ class PaymentEntry(AccountsController): else allocated_amount_in_company_currency / self.transaction_exchange_rate, "advance_voucher_type": d.advance_voucher_type, "advance_voucher_no": d.advance_voucher_no, + "transaction_exchange_rate": self.target_exchange_rate, }, item=self, ) diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py index 351e5e4ac1e..f489dab133e 100644 --- a/erpnext/accounts/utils.py +++ b/erpnext/accounts/utils.py @@ -594,7 +594,11 @@ def check_if_advance_entry_modified(args): q.inner_join(payment_ref) .on(payment_entry.name == payment_ref.parent) .where(payment_ref.name == args.get("voucher_detail_no")) - .where(payment_ref.reference_doctype.isin(("", "Sales Order", "Purchase Order"))) + .where( + payment_ref.reference_doctype.isin( + ("", "Sales Order", "Purchase Order", "Employee Advance") + ) + ) .where(payment_ref.allocated_amount == args.get("unreconciled_amount")) ) else: @@ -1920,8 +1924,19 @@ def get_payment_ledger_entries(gl_entries, cancel=0): if gle.advance_voucher_no: # create advance entry + base_amount, exchange_rate = ( + (dr_or_cr, gle.transaction_exchange_rate) + if gle.advance_voucher_type == "Employee Advance" + else (None, None) + ) adv = get_advance_ledger_entry( - gle, against_voucher_type, against_voucher_no, dr_or_cr_account_currency, cancel + gle, + against_voucher_type, + against_voucher_no, + dr_or_cr_account_currency, + cancel, + base_amount, + exchange_rate, ) ple_map.append(adv) @@ -1931,13 +1946,15 @@ def get_payment_ledger_entries(gl_entries, cancel=0): return ple_map -def get_advance_ledger_entry(gle, against_voucher_type, against_voucher_no, amount, cancel): +def get_advance_ledger_entry( + gle, against_voucher_type, against_voucher_no, amount, cancel, base_amount=None, exchange_rate=None +): event = ( "Submit" if (against_voucher_type == gle.voucher_type and against_voucher_no == gle.voucher_no) else "Adjustment" ) - return frappe._dict( + aple = frappe._dict( doctype="Advance Payment Ledger Entry", company=gle.company, voucher_type=gle.voucher_type, @@ -1951,6 +1968,12 @@ def get_advance_ledger_entry(gle, against_voucher_type, against_voucher_no, amou delinked=cancel, ) + if base_amount is not None: + aple.base_amount = base_amount + if exchange_rate is not None: + aple.exchange_rate = exchange_rate + return aple + def create_payment_ledger_entry( gl_entries, cancel=0, adv_adj=0, update_outstanding="Yes", from_repost=0, partial_cancel=False From 054e7adeacbebcefce41489c9f081565fba15f88 Mon Sep 17 00:00:00 2001 From: iamkhanraheel Date: Mon, 17 Nov 2025 13:37:25 +0530 Subject: [PATCH 4/4] fix: conflicts --- .../advance_payment_ledger_entry.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/erpnext/accounts/doctype/advance_payment_ledger_entry/advance_payment_ledger_entry.json b/erpnext/accounts/doctype/advance_payment_ledger_entry/advance_payment_ledger_entry.json index 487879da97d..444a45ff8c1 100644 --- a/erpnext/accounts/doctype/advance_payment_ledger_entry/advance_payment_ledger_entry.json +++ b/erpnext/accounts/doctype/advance_payment_ledger_entry/advance_payment_ledger_entry.json @@ -100,11 +100,7 @@ "in_create": 1, "index_web_pages_for_search": 1, "links": [], -<<<<<<< HEAD - "modified": "2025-10-13 15:11:58.300836", -======= "modified": "2025-11-13 12:45:03.014555", ->>>>>>> 287cb621cd (feat: add exchange rate & base field in advance payment ledger, set exchange rate in journal entry on every refresh) "modified_by": "Administrator", "module": "Accounts", "name": "Advance Payment Ledger Entry",