mirror of
https://github.com/we-promise/sure.git
synced 2026-04-07 14:31:25 +00:00
feat: Allow account linking for Enable Banking accounts (#428)
* feat: Allow account linking for Enable Banking accounts * fix: Typo in function name * fix: naming issue * fix: Add missing Enable Banking route * feat: Add ability to link Enable Banking when adding a new account * Mispelling * fix: typo in method call * fix: typo in column name * Review suggestions * Linter noise * Small copy changes to avoid mobile UI blowout * Provider generator (#364) * Move provider config to family * Update schema.rb * Add provier generator * Add table creation also * FIX generator namespace * Add support for global providers also * Remove over-engineered stuff * FIX parser * FIX linter * Some generator fixes * Update generator with fixes * Update item_model.rb.tt * Add missing linkable concern * Add missing routes * Update adapter.rb.tt * Update connectable_concern.rb.tt * Update unlinking_concern.rb.tt * Update family_generator.rb * Update family_generator.rb * Delete .claude/settings.local.json Signed-off-by: soky srm <sokysrm@gmail.com> * Move docs under API related folder * Rename Rails generator doc * Light edits to LLM generated doc * Small Lunch Flow config panel regressions. --------- Signed-off-by: soky srm <sokysrm@gmail.com> Co-authored-by: Juan José Mata <juanjo.mata@gmail.com> * Skip generators autoloading (#430) * Include Enable Banking items in Syncer (#434) * feat: Include Enable Banking items in Syncer * feat: include only active Enable Banking accounts * Fix budgets page UI (#427) * fix: Budget UI improvements * feat: Reduce padding for sub-categories * fix: Adjust padding for sub-category arrow * Revert "feat: Reduce padding for sub-categories" This reverts commit7516c5a8e0. * Revert "fix: Adjust padding for sub-category arrow" This reverts commitebc82542cf. * fix: adjust padding for sub-categories * fix: Add padding to uncategorized budget * fix: Remove unnecessary HTML tag * feat: Add translation keys for budgeted/actual * feat(lang): add all brazilian portuguese translations (#416) * feat(lang): add all brazilian portuguese translations * feat: update pt-BR errors on translation * fix: atualizar fix base * feat: add reports translations * feat: finish translation to brazilian portuguese * fix: add to supported locales * fix: number of translations * fix: errors on translations * fix: error on rubocop lint --------- Co-authored-by: Leonardo Ralph <theleoralph@gmail.com> * Add exclude transaction rule action (#437) * Initial plan * Add ExcludeTransaction rule action executor with tests Co-authored-by: jjmata <187772+jjmata@users.noreply.github.com> * Copy clarification --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: jjmata <187772+jjmata@users.noreply.github.com> Co-authored-by: Juan José Mata <juanjo.mata@gmail.com> * Preparing for v0.6.6-alpha.3 Signed-off-by: Juan José Mata <juanjo.mata@gmail.com> * fix: remove account_id clearing for Enable Banking accounts * fix: Remove unexisting available_balance attribute and rename variable for consistency --------- Signed-off-by: soky srm <sokysrm@gmail.com> Signed-off-by: Juan José Mata <juanjo.mata@gmail.com> Co-authored-by: Juan José Mata <juanjo.mata@gmail.com> Co-authored-by: soky srm <sokysrm@gmail.com> Co-authored-by: Marcon Neves <marconwillian@icloud.com> Co-authored-by: Leonardo Ralph <theleoralph@gmail.com> Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com> Co-authored-by: jjmata <187772+jjmata@users.noreply.github.com>
This commit is contained in:
94
app/controllers/concerns/enable_banking_items/maps_helper.rb
Normal file
94
app/controllers/concerns/enable_banking_items/maps_helper.rb
Normal file
@@ -0,0 +1,94 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module EnableBankingItems
|
||||
module MapsHelper
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
# Build per-item maps consumed by the enable_banking_item partial.
|
||||
# Accepts a single EnableBankingItem or a collection.
|
||||
def build_enable_banking_maps_for(items)
|
||||
items = Array(items).compact
|
||||
return if items.empty?
|
||||
|
||||
@enable_banking_sync_stats_map ||= {}
|
||||
@enable_banking_has_unlinked_map ||= {}
|
||||
@enable_banking_unlinked_count_map ||= {}
|
||||
@enable_banking_duplicate_only_map ||= {}
|
||||
@enable_banking_show_relink_map ||= {}
|
||||
|
||||
# Batch-check if ANY family has manual accounts (same result for all items from same family)
|
||||
family_ids = items.map { |i| i.family_id }.uniq
|
||||
families_with_manuals = Account
|
||||
.visible_manual
|
||||
.where(family_id: family_ids)
|
||||
.distinct
|
||||
.pluck(:family_id)
|
||||
.to_set
|
||||
|
||||
# Batch-fetch unlinked counts for all items in one query
|
||||
unlinked_counts = EnableBankingAccount
|
||||
.where(enable_banking_item_id: items.map(&:id))
|
||||
.left_joins(:account, :account_provider)
|
||||
.where(accounts: { id: nil }, account_providers: { id: nil })
|
||||
.group(:enable_banking_item_id)
|
||||
.count
|
||||
|
||||
items.each do |item|
|
||||
# Latest sync stats (avoid N+1; rely on includes(:syncs) where appropriate)
|
||||
latest_sync = if item.syncs.loaded?
|
||||
item.syncs.max_by(&:created_at)
|
||||
else
|
||||
item.syncs.ordered.first
|
||||
end
|
||||
stats = (latest_sync&.sync_stats || {})
|
||||
@enable_banking_sync_stats_map[item.id] = stats
|
||||
|
||||
# Whether the family has any manual accounts available to link (from batch query)
|
||||
@enable_banking_has_unlinked_map[item.id] = families_with_manuals.include?(item.family_id)
|
||||
|
||||
# Count from batch query (defaults to 0 if not found)
|
||||
@enable_banking_unlinked_count_map[item.id] = unlinked_counts[item.id] || 0
|
||||
|
||||
# Whether all reported errors for this item are duplicate-account warnings
|
||||
@enable_banking_duplicate_only_map[item.id] = compute_duplicate_only_flag(stats)
|
||||
|
||||
# Compute CTA visibility: show relink only when there are zero unlinked SFAs,
|
||||
# there exist manual accounts to link, and the item has at least one SFA
|
||||
begin
|
||||
unlinked_count = @enable_banking_unlinked_count_map[item.id] || 0
|
||||
manuals_exist = @enable_banking_has_unlinked_map[item.id]
|
||||
sfa_any = if item.enable_banking_accounts.loaded?
|
||||
item.enable_banking_accounts.any?
|
||||
else
|
||||
item.enable_banking_accounts.exists?
|
||||
end
|
||||
@enable_banking_show_relink_map[item.id] = (unlinked_count.to_i == 0 && manuals_exist && sfa_any)
|
||||
rescue StandardError => e
|
||||
Rails.logger.warn("Enable Banking card: CTA computation failed for item #{item.id}: #{e.class} - #{e.message}")
|
||||
@enable_banking_show_relink_map[item.id] = false
|
||||
end
|
||||
end
|
||||
|
||||
# Ensure maps are hashes even when items empty
|
||||
@enable_banking_sync_stats_map ||= {}
|
||||
@enable_banking_has_unlinked_map ||= {}
|
||||
@enable_banking_unlinked_count_map ||= {}
|
||||
@enable_banking_duplicate_only_map ||= {}
|
||||
@enable_banking_show_relink_map ||= {}
|
||||
end
|
||||
|
||||
private
|
||||
def compute_duplicate_only_flag(stats)
|
||||
errs = Array(stats && stats["errors"]).map do |e|
|
||||
if e.is_a?(Hash)
|
||||
e["message"] || e[:message]
|
||||
else
|
||||
e.to_s
|
||||
end
|
||||
end
|
||||
errs.present? && errs.all? { |m| m.to_s.downcase.include?("duplicate upstream account detected") }
|
||||
rescue
|
||||
false
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user