From f1f68ead7de22624dc5041c42ad52b7dca498c24 Mon Sep 17 00:00:00 2001 From: diptanilsaha Date: Tue, 25 Nov 2025 11:44:55 +0530 Subject: [PATCH] chore: switched frankfurter api domain from api.frankfurter.app to api.frankfurter.dev --- .../currency_exchange_settings.js | 2 +- .../currency_exchange_settings.json | 7 ++++--- .../currency_exchange_settings.py | 10 +++++----- erpnext/patches.txt | 1 + ...ate_currency_exchange_settings_for_frankfurter.py | 12 ++++++++++++ .../currency_exchange/test_currency_exchange.py | 6 +++--- erpnext/setup/install.py | 2 +- 7 files changed, 27 insertions(+), 13 deletions(-) create mode 100644 erpnext/patches/v16_0/update_currency_exchange_settings_for_frankfurter.py diff --git a/erpnext/accounts/doctype/currency_exchange_settings/currency_exchange_settings.js b/erpnext/accounts/doctype/currency_exchange_settings/currency_exchange_settings.js index ad68352c2a4..c3531420ce1 100644 --- a/erpnext/accounts/doctype/currency_exchange_settings/currency_exchange_settings.js +++ b/erpnext/accounts/doctype/currency_exchange_settings/currency_exchange_settings.js @@ -19,7 +19,7 @@ frappe.ui.form.on("Currency Exchange Settings", { to: "{to_currency}", }; add_param(frm, r.message, params, result); - } else if (frm.doc.service_provider == "frankfurter.app") { + } else if (frm.doc.service_provider == "frankfurter.dev") { let result = ["rates", "{to_currency}"]; let params = { base: "{from_currency}", diff --git a/erpnext/accounts/doctype/currency_exchange_settings/currency_exchange_settings.json b/erpnext/accounts/doctype/currency_exchange_settings/currency_exchange_settings.json index 992d96167e5..614f4e6d3e5 100644 --- a/erpnext/accounts/doctype/currency_exchange_settings/currency_exchange_settings.json +++ b/erpnext/accounts/doctype/currency_exchange_settings/currency_exchange_settings.json @@ -78,7 +78,7 @@ "fieldname": "service_provider", "fieldtype": "Select", "label": "Service Provider", - "options": "frankfurter.app\nexchangerate.host\nCustom", + "options": "frankfurter.dev\nexchangerate.host\nCustom", "reqd": 1 }, { @@ -104,7 +104,7 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2024-03-27 13:06:47.653110", + "modified": "2025-11-25 13:03:41.896424", "modified_by": "Administrator", "module": "Accounts", "name": "Currency Exchange Settings", @@ -141,8 +141,9 @@ "write": 1 } ], + "row_format": "Dynamic", "sort_field": "creation", "sort_order": "DESC", "states": [], "track_changes": 1 -} \ No newline at end of file +} diff --git a/erpnext/accounts/doctype/currency_exchange_settings/currency_exchange_settings.py b/erpnext/accounts/doctype/currency_exchange_settings/currency_exchange_settings.py index f5889510732..73f037a9e4d 100644 --- a/erpnext/accounts/doctype/currency_exchange_settings/currency_exchange_settings.py +++ b/erpnext/accounts/doctype/currency_exchange_settings/currency_exchange_settings.py @@ -29,7 +29,7 @@ class CurrencyExchangeSettings(Document): disabled: DF.Check req_params: DF.Table[CurrencyExchangeSettingsDetails] result_key: DF.Table[CurrencyExchangeSettingsResult] - service_provider: DF.Literal["frankfurter.app", "exchangerate.host", "Custom"] + service_provider: DF.Literal["frankfurter.dev", "exchangerate.host", "Custom"] url: DF.Data | None use_http: DF.Check # end: auto-generated types @@ -60,7 +60,7 @@ class CurrencyExchangeSettings(Document): self.append("req_params", {"key": "date", "value": "{transaction_date}"}) self.append("req_params", {"key": "from", "value": "{from_currency}"}) self.append("req_params", {"key": "to", "value": "{to_currency}"}) - elif self.service_provider == "frankfurter.app": + elif self.service_provider == "frankfurter.dev": self.set("result_key", []) self.set("req_params", []) @@ -105,11 +105,11 @@ class CurrencyExchangeSettings(Document): @frappe.whitelist() def get_api_endpoint(service_provider: str | None = None, use_http: bool = False): - if service_provider and service_provider in ["exchangerate.host", "frankfurter.app"]: + if service_provider and service_provider in ["exchangerate.host", "frankfurter.dev"]: if service_provider == "exchangerate.host": api = "api.exchangerate.host/convert" - elif service_provider == "frankfurter.app": - api = "api.frankfurter.app/{transaction_date}" + elif service_provider == "frankfurter.dev": + api = "api.frankfurter.dev/v1/{transaction_date}" protocol = "https://" if use_http: diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 74f6e8a275b..1fda2b6f518 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -449,3 +449,4 @@ erpnext.patches.v16_0.set_company_wise_warehouses erpnext.patches.v16_0.set_valuation_method_on_companies erpnext.patches.v15_0.migrate_old_item_wise_tax_detail_data_to_table erpnext.patches.v16_0.migrate_budget_records_to_new_structure +erpnext.patches.v16_0.update_currency_exchange_settings_for_frankfurter \ No newline at end of file diff --git a/erpnext/patches/v16_0/update_currency_exchange_settings_for_frankfurter.py b/erpnext/patches/v16_0/update_currency_exchange_settings_for_frankfurter.py new file mode 100644 index 00000000000..68157b1a4ad --- /dev/null +++ b/erpnext/patches/v16_0/update_currency_exchange_settings_for_frankfurter.py @@ -0,0 +1,12 @@ +import frappe + + +def execute(): + settings = frappe.get_doc("Currency Exchange Settings") + if settings.service_provider != "frankfurter.app": + return + + settings.service_provider = "frankfurter.dev" + settings.set_parameters_and_result() + settings.flags.ignore_validate = True + settings.save() diff --git a/erpnext/setup/doctype/currency_exchange/test_currency_exchange.py b/erpnext/setup/doctype/currency_exchange/test_currency_exchange.py index 859e01f2cec..c0fad18795e 100644 --- a/erpnext/setup/doctype/currency_exchange/test_currency_exchange.py +++ b/erpnext/setup/doctype/currency_exchange/test_currency_exchange.py @@ -66,9 +66,9 @@ def patched_requests_get(*args, **kwargs): if kwargs["params"].get("date") and kwargs["params"].get("from") and kwargs["params"].get("to"): if test_exchange_values.get(kwargs["params"]["date"]): return PatchResponse({"result": test_exchange_values[kwargs["params"]["date"]]}, 200) - elif args[0].startswith("https://api.frankfurter.app") and kwargs.get("params"): + elif args[0].startswith("https://api.frankfurter.dev") and kwargs.get("params"): if kwargs["params"].get("base") and kwargs["params"].get("symbols"): - date = args[0].replace("https://api.frankfurter.app/", "") + date = args[0].replace("https://api.frankfurter.dev/v1/", "") if test_exchange_values.get(date): return PatchResponse( {"rates": {kwargs["params"].get("symbols"): test_exchange_values.get(date)}}, 200 @@ -147,7 +147,7 @@ class TestCurrencyExchange(IntegrationTestCase): self.assertEqual(flt(exchange_rate, 3), 65.1) settings = frappe.get_single("Currency Exchange Settings") - settings.service_provider = "frankfurter.app" + settings.service_provider = "frankfurter.dev" settings.save() def test_exchange_rate_strict(self, mock_get): diff --git a/erpnext/setup/install.py b/erpnext/setup/install.py index 7dc7932470e..3a94e1dcf57 100644 --- a/erpnext/setup/install.py +++ b/erpnext/setup/install.py @@ -79,7 +79,7 @@ def setup_currency_exchange(): ces.set("result_key", []) ces.set("req_params", []) - ces.api_endpoint = "https://api.frankfurter.app/{transaction_date}" + ces.api_endpoint = "https://api.frankfurter.dev/v1/{transaction_date}" ces.append("result_key", {"key": "rates"}) ces.append("result_key", {"key": "{to_currency}"}) ces.append("req_params", {"key": "base", "value": "{from_currency}"})