mirror of
https://github.com/we-promise/sure.git
synced 2026-04-19 12:04:08 +00:00
Add security remapping for holdings with sync protection (#692)
* Add security remapping support to holdings - Introduced `provider_security` tracking for holdings with schema updates. - Implemented security remap/reset workflows in `Holding` model and UI. - Updated routes, controllers, and tests to support new functionality. - Enhanced client-side interaction with Stimulus controller for remapping. # Conflicts: # app/components/UI/account/activity_feed.html.erb # db/schema.rb * Refactor "New transaction" to "New activity" across UI and tests - Updated localized strings, button labels, and ARIA attributes. - Improved error handling in holdings' current price display. - Scoped fallback queries in `provider_import_adapter` to prevent overwrites. - Added safeguard for offline securities in price fetching logic. * Update security remapping to merge holdings on collision by deleting duplicates - Removed error handling for collisions in `remap_security!`. - Added logic to merge holdings by deleting duplicates on conflicting dates. - Modified associated test to validate merging behavior. * Update security remapping to merge holdings on collision by combining qty and amount - Modified `remap_security!` to merge holdings by summing `qty` and `amount` on conflicting dates. - Adjusted logic to calculate `price` for merged holdings. - Updated test to validate new merge behavior. * Improve DOM handling in Turbo redirect action & enhance holdings merge logic - Updated Turbo's custom `redirect` action to use the "replace" option for cleaner DOM updates without clearing the cache. - Enhanced holdings merge logic to calculate weighted average cost basis during security remapping, ensuring more accurate cost_basis updates. * Track provider_security_id during security updates to support reset workflows * Fix provider tracking: guard nil ticker lookups and preserve merge attrs - Guard fallback 1b lookup when security.ticker is blank to avoid matching NULL tickers - Preserve external_id, provider_security_id, account_provider_id during collision merge * Fix schema.rb version after merge (includes tax_treatment migration) * fix: Rename migration to run after schema version The migration 20260117000001 was skipped in CI because it had a timestamp earlier than the schema version (2026_01_17_200000). CI loads schema.rb directly and only runs migrations with versions after the schema version. Renamed to 20260119000001 so it runs correctly. * Update schema: remove Coinbase tables, add new fields and indexes * Update schema: add back `tax_treatment` field with default value "taxable" * Improve Turbo redirect action: use "replace" to avoid form submission in history * Lock merged holdings to prevent provider overwrites and fix activity feed template indentation * Refactor holdings transfer logic: enforce currency checks during collisions and enhance merge handling --------- Signed-off-by: Juan José Mata <juanjo.mata@gmail.com> Co-authored-by: luckyPipewrench <luckypipewrench@proton.me> Co-authored-by: Juan José Mata <juanjo.mata@gmail.com>
This commit is contained in:
@@ -3,42 +3,46 @@
|
||||
<div class="flex items-center justify-between mb-4" data-testid="activity-menu">
|
||||
<%= tag.h2 t("accounts.show.activity.title"), class: "font-medium text-lg" %>
|
||||
|
||||
<%= render DS::Menu.new(variant: "button") do |menu| %>
|
||||
<% menu.with_button(text: t("accounts.show.activity.new"), variant: "secondary", icon: "plus") %>
|
||||
<%# Show menu if: manual (can add balance) OR non-crypto (can add transactions) %>
|
||||
<%# This hides the menu only for linked crypto accounts who have no actions %>
|
||||
<% if !account.linked? || !account.crypto? %>
|
||||
<%= render DS::Menu.new(variant: "button") do |menu| %>
|
||||
<% menu.with_button(text: t("accounts.show.activity.new"), variant: "secondary", icon: "plus") %>
|
||||
|
||||
<% unless account.linked? %>
|
||||
<% menu.with_item(
|
||||
variant: "link",
|
||||
text: t("accounts.show.activity.new_balance"),
|
||||
icon: "circle-dollar-sign",
|
||||
href: new_valuation_path(account_id: account.id),
|
||||
data: { turbo_frame: :modal }) %>
|
||||
<% end %>
|
||||
|
||||
<% unless account.crypto? %>
|
||||
<% if account.investment? %>
|
||||
<% unless account.linked? %>
|
||||
<% menu.with_item(
|
||||
variant: "link",
|
||||
text: t("accounts.show.activity.new_activity"),
|
||||
icon: "arrow-left-right",
|
||||
href: new_trade_path(account_id: account.id),
|
||||
data: { turbo_frame: :modal }) %>
|
||||
<% else %>
|
||||
<% menu.with_item(
|
||||
variant: "link",
|
||||
text: t("accounts.show.activity.new_transaction"),
|
||||
icon: "credit-card",
|
||||
href: new_transaction_path(account_id: account.id),
|
||||
text: t("accounts.show.activity.new_balance"),
|
||||
icon: "circle-dollar-sign",
|
||||
href: new_valuation_path(account_id: account.id),
|
||||
data: { turbo_frame: :modal }) %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
<% menu.with_item(
|
||||
variant: "link",
|
||||
text: t("accounts.show.activity.new_transfer"),
|
||||
icon: "arrow-right-left",
|
||||
href: new_transfer_path(from_account_id: account.id),
|
||||
data: { turbo_frame: :modal }) %>
|
||||
<% unless account.crypto? %>
|
||||
<% if account.investment? %>
|
||||
<% menu.with_item(
|
||||
variant: "link",
|
||||
text: t("accounts.show.activity.new_activity"),
|
||||
icon: "arrow-left-right",
|
||||
href: new_trade_path(account_id: account.id),
|
||||
data: { turbo_frame: :modal }) %>
|
||||
<% else %>
|
||||
<% menu.with_item(
|
||||
variant: "link",
|
||||
text: t("accounts.show.activity.new_transaction"),
|
||||
icon: "credit-card",
|
||||
href: new_transaction_path(account_id: account.id),
|
||||
data: { turbo_frame: :modal }) %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
<% menu.with_item(
|
||||
variant: "link",
|
||||
text: t("accounts.show.activity.new_transfer"),
|
||||
icon: "arrow-right-left",
|
||||
href: new_transfer_path(from_account_id: account.id),
|
||||
data: { turbo_frame: :modal }) %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user