BCB retorna objeto de erro (não array) quando a taxa do dia ainda não foi
publicada. Antes: decode falhava, cache ficava vazio, BCB era chamado a cada
request. Agora: decode error → put(nil) no cache → requests seguintes servidas
do cache em <1ms até fim do dia
- Cache map[date]rate compartilhado entre chamadas do mesmo processo
- Expira às 23:59:59 do dia corrente (não TTL fixo de 24h)
- Double-checked locking evita múltiplas chamadas concorrentes ao BCB
- Cobre múltiplas contas com start dates diferentes sem chamadas redundantes
- Adiciona campo cdi_percentage (default 100%) na tabela accounts
- Cálculo CDI aplica proporção: balance × (compound-1) × (pct/100)
- Frontend exibe input de % quando yield_type=cdi e badge mostra valor
- Corrige mocks de teste desatualizados (DeleteByMonth, isTax)
- Corrige ConfirmIncome para rejeitar tipo expense (ErrRecurringNotIncome)
Co-Authored-By: Claude Sonnet 4.6 <[email protected]>