From 87f1376d8662db6bbebcf5f9bd5acce6f52a739d Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Mon, 20 Jan 2025 17:28:47 +0530 Subject: [PATCH] refactor: use dictionary for better expandability (cherry picked from commit 2e535955b395a30748d66222b6c6113ce727ba81) --- erpnext/setup/utils.py | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/erpnext/setup/utils.py b/erpnext/setup/utils.py index 3adb9a0b226..638c8af6263 100644 --- a/erpnext/setup/utils.py +++ b/erpnext/setup/utils.py @@ -4,11 +4,15 @@ import frappe from frappe import _ from frappe.utils import add_days, flt, get_datetime_str, nowdate -from frappe.utils.data import now_datetime +from frappe.utils.data import getdate, now_datetime from frappe.utils.nestedset import get_root_of from erpnext import get_default_company +PEGGED_CURRENCIES = { + "USD": {"AED": 3.6725}, # AED is pegged to USD at a rate of 3.6725 since 1997 +} + def before_tests(): frappe.clear_cache() @@ -45,6 +49,14 @@ def before_tests(): frappe.db.commit() +def get_pegged_rate(from_currency: str, to_currency: str, transaction_date) -> float | None: + if rate := PEGGED_CURRENCIES.get(from_currency, {}).get(to_currency): + return rate + elif rate := PEGGED_CURRENCIES.get(to_currency, {}).get(from_currency): + return 1 / rate + return None + + @frappe.whitelist() def get_exchange_rate(from_currency, to_currency, transaction_date=None, args=None): if not (from_currency and to_currency): @@ -52,15 +64,13 @@ def get_exchange_rate(from_currency, to_currency, transaction_date=None, args=No return if from_currency == to_currency: return 1 - # as AED is pegged to USD at the exchange rate of 3.6725 AED - # handling the exchange rate manually without API call - if from_currency == "USD" and to_currency == "AED": - return 3.6725 - if from_currency == "AED" and to_currency == "USD": - return 1 / 3.6725 if not transaction_date: transaction_date = nowdate() + + if rate := get_pegged_rate(from_currency, to_currency, transaction_date): + return rate + currency_settings = frappe.get_doc("Accounts Settings").as_dict() allow_stale_rates = currency_settings.get("allow_stale")