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 bd90b8add80..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-18 08:32:26.895076", + "modified": "2025-11-25 13:03:41.896424", "modified_by": "Administrator", "module": "Accounts", "name": "Currency Exchange Settings", @@ -141,8 +141,9 @@ "write": 1 } ], - "sort_field": "modified", + "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 160e791978e..3a12ab30403 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 33c1e6c79df..7a79332e316 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -425,4 +425,5 @@ erpnext.patches.v15_0.update_fieldname_in_accounting_dimension_filter erpnext.patches.v15_0.set_asset_status_if_not_already_set erpnext.patches.v15_0.toggle_legacy_controller_for_period_closing execute:frappe.db.set_single_value("Accounts Settings", "show_party_balance", 1) -execute:frappe.db.set_single_value("Accounts Settings", "show_account_balance", 1) \ No newline at end of file +execute:frappe.db.set_single_value("Accounts Settings", "show_account_balance", 1) +erpnext.patches.v16_0.update_currency_exchange_settings_for_frankfurter 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 d28b1e65b7b..86fae223b45 100644 --- a/erpnext/setup/doctype/currency_exchange/test_currency_exchange.py +++ b/erpnext/setup/doctype/currency_exchange/test_currency_exchange.py @@ -68,9 +68,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 @@ -149,7 +149,7 @@ class TestCurrencyExchange(unittest.TestCase): 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 b826c52f20e..0bcab1ccb59 100644 --- a/erpnext/setup/install.py +++ b/erpnext/setup/install.py @@ -93,7 +93,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}"})