Restaurar uma conta já desconectada faz ela sumir de todas as telas, sem desfazer possível

Clicar em "Restaurar" numa conta cujo vínculo com o banco já foi removido faz a conta desaparecer de todas as telas. Nada é apagado - os dados continuam no banco - mas o usuário perde o acesso a ela pela interface e não tem como desfazer.

A cadeia é determinística

  1. Ao desconectar, disconnect_connection_local/1 zera connection_id e marca hidden_at. Isso é por design: a conta órfã fica na lista de "Contas ocultas".
  2. Accounts.unhide_account/2 (lib/visor/finance/accounts.ex:638) só protege contra source == :manual. Não há nenhuma verificação de connection_id:
%Account{source: :manual} -> {:error, :cannot_unhide_manual_account}
%Account{source: :pluggy} = account -> unhide_account_and_transactions(account)
  1. Uma órfã tem source: :pluggy, então passa direto e o hidden_at é limpo.
  2. O estado resultante - source: :pluggy, connection_id: NULL, hidden_at: NULL - não satisfaz nenhuma das três consultas que montam a página de Contas: as listas agrupadas por conexão exigem connection_id IS NOT NULL, a lista de manuais exige source == :manual, e a de ocultas exige hidden_at IS NOT NULL.

A conta fica num limbo: existe, tem saldo, tem transações, e não aparece em lugar nenhum.

Efeito colateral assimétrico

O saldo sai do patrimônio (net_worth_accounts_for_account_ids/1 exige conexão), mas as transações voltam para os relatórios, porque visible_account_ids filtra apenas por hidden_at/pluggy_deleted_at. O usuário perde o saldo e ganha os gastos de uma conta que não consegue mais ver.

Alcance em produção (medido 2026-08-01)

  • 17 contas em 9 usuários estão neste estado agora
  • 12 delas com saldo diferente de zero
  • R$ 55.725,08 fora do saldo disponível
  • Para contexto: existem 1.528 órfãs no total, e 1.511 estão corretamente em "ocultas". Só estas 17 foram restauradas para o limbo - o caminho é raro, mas é uma armadilha de um clique

O caso que originou (conv 1525)

esampaiocursos@gmail.com (61a43959-4d78-44d8-b25f-9f55d7ca983c), Santander (connector 608).

  • 2026-08-01 18:14:35 - três contas "EDU" desconectadas (esperado)
  • 2026-08-01 21:01:58 e 21:02:09 - usuário restaura duas delas
  • Resultado: R$ 19.091,88 + R$ 6.149,60 somem do patrimônio, e 1.119 transações voltam para as análises

Não é problema de provedor: o item Santander sobrevivente (6ea216a8-004f-434b-b35e-ba6bac79c753) está UPDATED/SUCCESS e sincronizando.

Recuperação: reconectar resolve

upsert_accounts_from_api/2 re-vincula órfãs por pluggy_connector_id + type + number, incluindo explicitamente as que já foram desocultadas. Reconectar o Santander devolve as contas no lugar, com ids, transações e apelidos preservados. Vale confirmar isso antes de orientar o usuário.

Correção sugerida

Bloquear o unhide quando connection_id for nulo, com uma mensagem que explique o caminho ("reconecte o banco para trazer esta conta de volta"). Vale considerar se a lista de ocultas deveria distinguir órfãs de ocultas comuns, já que a ação disponível para elas é diferente.

Existe delete_orphaned_account/2 logo abaixo no mesmo módulo, para remediação administrativa de órfãs - ou seja, o código já reconhece que órfãs são um estado que precisa de tratamento especial. Este defeito cria mais órfãs, num estado pior.

Ação operacional pendente

Os 8 outros usuários afetados deveriam ser varridos: re-marcar hidden_at devolve as contas para "Contas ocultas" e restaura o patrimônio.

Ponto em aberto

Não foi possível identificar qual evento removeu a conexão "EDU" às 18:14:35 - nenhum job item/deleted correspondente apareceu. Não afeta o veredito, já que o defeito está no unhide e não no disconnect, mas pode valer uma olhada separada dado o volume de desconexões naquela noite.


Origem: conv 1525 (Featurebase), triada em 2026-08-01.

Upvoters
Status

Resolvido

Board
💡

Feature Request

Date

About 2 months ago

Subscribe to post

Get notified by email when there are changes.