mirror of
https://github.com/we-promise/sure.git
synced 2026-04-20 04:24:06 +00:00
Providers factory (#250)
* Implement providers factory * Multiple providers sync support - Proper Multi-Provider Syncing: When you click sync on an account with multiple providers (e.g., both Plaid and SimpleFin), all provider items are synced - Better API: The existing account.providers method already returns all providers, and account.provider returns the first one for backward compatibility - Correct Holdings Deletion Logic: Holdings can only be deleted if ALL providers allow it, preventing accidental deletions that would be recreated on next sync TODO: validate this is the way we want to go? We would need to check holdings belong to which account, and then check provider allows deletion. More complex - Database Constraints: The existing validations ensure an account can have at most one provider of each type (one PlaidAccount, one SimplefinAccount, etc.) * Add generic provider_import_adapter * Finish unified import strategy * Update app/models/plaid_account.rb Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Signed-off-by: soky srm <sokysrm@gmail.com> * Update app/models/provider/factory.rb Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Signed-off-by: soky srm <sokysrm@gmail.com> * Fix account linked by plaid_id instead of external_id * Parse numerics to BigDecimal Parse numerics to BigDecimal before computing amount; guard nils. Avoid String * String and float drift; also normalize date. * Fix incorrect usage of assert_raises. * Fix linter * Fix processor test. * Update current_balance_manager.rb * Test fixes * Fix plaid linked account test * Add support for holding per account_provider * Fix proper account access Also fix account deletion for simpefin too * FIX match tests for consistency * Some more factory updates * Fix account schema for multipe providers Can do: - Account #1 → PlaidAccount + SimplefinAccount (multiple different providers) - Account #2 → PlaidAccount only - Account #3 → SimplefinAccount only Cannot do: - Account #1 → PlaidAccount + PlaidAccount (duplicate provider type) - PlaidAccount #123 → Account #1 + Account #2 (provider linked to multiple accounts) * Fix account setup - An account CAN have multiple providers (the schema shows account_providers with unique index on [account_id, provider_type]) - Each provider should maintain its own separate entries - We should NOT update one provider's entry when another provider syncs * Fix linter and guard migration * FIX linter issues. * Fixes - Remove duplicated index - Pass account_provider_id - Guard holdings call to avoid NoMethodError * Update schema and provider import fix * Plaid doesn't allow holdings deletion * Use ClimateControl for proper env setup * No need for this in .git --------- Signed-off-by: soky srm <sokysrm@gmail.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Co-authored-by: Juan José Mata <juanjo.mata@gmail.com>
This commit is contained in:
@@ -2,13 +2,17 @@ module Account::Linkable
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
# New generic provider association
|
||||
has_many :account_providers, dependent: :destroy
|
||||
|
||||
# Legacy provider associations - kept for backward compatibility during migration
|
||||
belongs_to :plaid_account, optional: true
|
||||
belongs_to :simplefin_account, optional: true
|
||||
end
|
||||
|
||||
# A "linked" account gets transaction and balance data from a third party like Plaid or SimpleFin
|
||||
def linked?
|
||||
plaid_account_id.present? || simplefin_account_id.present?
|
||||
account_providers.any?
|
||||
end
|
||||
|
||||
# An "offline" or "unlinked" account is one where the user tracks values and
|
||||
@@ -17,4 +21,42 @@ module Account::Linkable
|
||||
!linked?
|
||||
end
|
||||
alias_method :manual?, :unlinked?
|
||||
|
||||
# Returns the primary provider adapter for this account
|
||||
# If multiple providers exist, returns the first one
|
||||
def provider
|
||||
return nil unless linked?
|
||||
|
||||
@provider ||= account_providers.first&.adapter
|
||||
end
|
||||
|
||||
# Returns all provider adapters for this account
|
||||
def providers
|
||||
@providers ||= account_providers.map(&:adapter).compact
|
||||
end
|
||||
|
||||
# Returns the provider adapter for a specific provider type
|
||||
def provider_for(provider_type)
|
||||
account_provider = account_providers.find_by(provider_type: provider_type)
|
||||
account_provider&.adapter
|
||||
end
|
||||
|
||||
# Convenience method to get the provider name
|
||||
def provider_name
|
||||
provider&.provider_name
|
||||
end
|
||||
|
||||
# Check if account is linked to a specific provider
|
||||
def linked_to?(provider_type)
|
||||
account_providers.exists?(provider_type: provider_type)
|
||||
end
|
||||
|
||||
# Check if holdings can be deleted
|
||||
# If account has multiple providers, returns true only if ALL providers allow deletion
|
||||
# This prevents deleting holdings that would be recreated on next sync
|
||||
def can_delete_holdings?
|
||||
return true if unlinked?
|
||||
|
||||
providers.all?(&:can_delete_holdings?)
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user