From 91dae917690c721bedcae7ba7b7631e29bd23de7 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Mon, 29 Jun 2026 22:25:39 +0530 Subject: [PATCH] fix(setup): deterministic tiebreaker in get_exchange_rate Currency Exchange lookup (Postgres) get_exchange_rate orders Currency Exchange by 'date desc' LIMIT 1 with no unique tiebreaker. Currency Exchange autoname {date}-{from}-{to}-{purpose} allows multiple same-date rows (different purpose) for one currency pair; on the no-purpose-filter path all match, so MariaDB and Postgres can return a different exchange_rate for the same inputs. Add 'name desc' so both engines pick the same row. MariaDB row count unchanged. --- erpnext/setup/utils.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/erpnext/setup/utils.py b/erpnext/setup/utils.py index 2fbddcec948..3e0decd8f16 100644 --- a/erpnext/setup/utils.py +++ b/erpnext/setup/utils.py @@ -95,7 +95,11 @@ def get_exchange_rate( # cksgb 19/09/2016: get last entry in Currency Exchange with from_currency and to_currency. entries = frappe.get_all( - "Currency Exchange", fields=["exchange_rate"], filters=filters, order_by="date desc", limit=1 + "Currency Exchange", + fields=["exchange_rate"], + filters=filters, + order_by="date desc, name desc", + limit=1, ) if entries: return flt(entries[0].exchange_rate)