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 commit 7516c5a8e0.

* Revert "fix: Adjust padding for sub-category arrow"

This reverts commit ebc82542cf.

* 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:
Alessio Cappa
2025-12-12 11:19:50 +01:00
committed by GitHub
parent eb6bbb754d
commit dd461faf84
11 changed files with 409 additions and 15 deletions

View 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