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
- Ao desconectar,
disconnect_connection_local/1zeraconnection_ide marcahidden_at. Isso é por design: a conta órfã fica na lista de "Contas ocultas". Accounts.unhide_account/2(lib/visor/finance/accounts.ex:638) só protege contrasource == :manual. Não há nenhuma verificação deconnection_id:
%Account{source: :manual} -> {:error, :cannot_unhide_manual_account}
%Account{source: :pluggy} = account -> unhide_account_and_transactions(account)
- Uma órfã tem
source: :pluggy, então passa direto e ohidden_até limpo. - 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 exigemconnection_id IS NOT NULL, a lista de manuais exigesource == :manual, e a de ocultas exigehidden_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.