From f699660479f4f2bedacf59d4a5203d7cc189e4a7 Mon Sep 17 00:00:00 2001 From: "Pedro J. Aramburu" Date: Wed, 8 Apr 2026 16:05:58 -0300 Subject: [PATCH] Add exchange rate feature with multi-currency transactions and transfers support (#1099) Co-authored-by: Pedro J. Aramburu --- app/components/DS/select.html.erb | 3 +- app/components/UI/account/chart.rb | 6 +- app/controllers/exchange_rates_controller.rb | 36 +++ app/controllers/reports_controller.rb | 12 +- app/controllers/transactions_controller.rb | 26 +- app/controllers/transfers_controller.rb | 32 +- .../exchange_rate_form_controller.js | 298 ++++++++++++++++++ .../controllers/form_dropdown_controller.js | 3 + .../transaction_form_controller.js | 60 ++++ .../controllers/transfer_form_controller.js | 59 ++++ app/models/balance/sync_cache.rb | 15 +- app/models/holding/forward_calculator.rb | 6 +- app/models/holding/portfolio_cache.rb | 6 +- app/models/holding/reverse_calculator.rb | 6 +- app/models/transaction.rb | 37 +++ app/models/transfer/creator.rb | 16 +- app/views/shared/_exchange_rate_tabs.html.erb | 39 +++ app/views/shared/_money_field.html.erb | 18 +- app/views/transactions/_form.html.erb | 64 +++- app/views/transfers/_form.html.erb | 50 ++- config/locales/views/shared/ca.yml | 6 + config/locales/views/shared/de.yml | 6 + config/locales/views/shared/en.yml | 6 + config/locales/views/shared/es.yml | 6 + config/locales/views/shared/fr.yml | 6 + config/locales/views/shared/nb.yml | 32 +- config/locales/views/shared/nl.yml | 6 + config/locales/views/shared/pt-BR.yml | 6 + config/locales/views/shared/ro.yml | 6 + config/locales/views/shared/tr.yml | 6 + config/locales/views/shared/zh-CN.yml | 6 + config/locales/views/shared/zh-TW.yml | 6 + config/locales/views/transfers/en.yml | 8 + config/locales/views/transfers/es.yml | 8 + config/routes.rb | 2 + lib/money.rb | 20 +- test/application_system_test_case.rb | 14 + .../exchange_rates_controller_test.rb | 173 ++++++++++ .../transactions_controller_test.rb | 153 +++++++++ test/controllers/transfers_controller_test.rb | 137 ++++++++ test/lib/money_test.rb | 21 +- .../models/balance/forward_calculator_test.rb | 14 +- test/models/balance/sync_cache_test.rb | 156 +++++++++ test/models/holding_test.rb | 5 +- test/models/transaction_test.rb | 60 ++++ test/models/transfer/creator_test.rb | 100 ++++++ .../transactions_form_exchange_rate_test.rb | 146 +++++++++ test/system/transfers_test.rb | 52 +++ 48 files changed, 1886 insertions(+), 73 deletions(-) create mode 100644 app/controllers/exchange_rates_controller.rb create mode 100644 app/javascript/controllers/exchange_rate_form_controller.js create mode 100644 app/javascript/controllers/transaction_form_controller.js create mode 100644 app/javascript/controllers/transfer_form_controller.js create mode 100644 app/views/shared/_exchange_rate_tabs.html.erb create mode 100644 test/controllers/exchange_rates_controller_test.rb create mode 100644 test/models/balance/sync_cache_test.rb create mode 100644 test/system/transactions_form_exchange_rate_test.rb diff --git a/app/components/DS/select.html.erb b/app/components/DS/select.html.erb index 3ae5ce0a6..8f1ffe3e4 100644 --- a/app/components/DS/select.html.erb +++ b/app/components/DS/select.html.erb @@ -8,7 +8,8 @@ value: @selected_value, data: { "form-dropdown-target": "input", - "auto-submit-target": "auto" + "auto-submit-target": "auto", + **(options.dig(:html_options, :data) || {}) } %>