Releases: devtulio/peculium
Release list
v0.11.1 — a curva de renda fixa nunca funcionou
Segunda rodada da auditoria, agora contra a API e os arquivos de verdade. A primeira foi estática e de unidade, e passou por cima destes três: nenhum deles existe fora do encontro com o mundo real.
A curva de renda fixa nunca funcionou
Dois defeitos empilhados, e o segundo só aparecia depois de corrigir o primeiro.
A série diária do Banco Central nunca descia. baixar() pedia a série inteira de uma vez, e a API do SGS recusa pedido longo de série diária. Medido contra a API:
| Pedido | Resultado |
|---|---|
| Sem intervalo (o que o programa fazia) | 406 Not Acceptable |
| 11 anos | 406 Not Acceptable |
| 10 anos | estoura o tempo de leitura |
| 2 anos | OK, 502 registros |
CDI e Selic diária falhavam em silêncio, e a renda fixa dizia "ligue a rede em Configurações" com a rede ligada. Agora vai em fatias de 5 anos, emendadas — vão entre elas seria o defeito de série furada de volta.
E não adiantaria baixar. atualizar_curvas pedia sempre a curva de hoje, e o Banco Central publica o CDI com um dia útil de atraso: falharia todo dia, dizendo "atualize as séries" logo depois de atualizá-las. Agora calcula até onde a série alcança e grava o preço unitário na data em que ele vale — adiantá-lo seria inventar um dia de rendimento.
E a tabela mostrava o PU certo e o aviso de série faltando na mesma linha, porque posicao() não aplicava o mesmo recorte. Aviso que grita sem motivo é o que faz o usuário parar de ler avisos.
Transferência da corretora para ela mesma
Num acervo real a B3 traz débito e crédito na mesma corretora: troca de conta ou de custódia dentro dela, que não move nada entre instituições. O par virava um lançamento de transferência de A para A, com dois estragos:
- a porta manual recusa exatamente isso —
lancarexige instituições diferentes. O importador gravava o que o razão proíbe, porquegravar()fazINSERTdireto e nenhuma validação do razão alcança dado importado; - o razão debitava antes de creditar e gritava "saldo negativo" numa posição que fecha em zero. Eram três alarmes graves no painel, todos falsos.
A comparação é pelo nome normalizado: no arquivo real as pontas vinham como "TORO CTVM LTDA" e "TORO CTVM", que comparadas cruas passariam batido.
Verificado e íntegro
A mesma varredura exercitou contra dado real, e passou: cotação online do Yahoo, consulta de CNPJ na ReceitaWS, os 10 relatórios em HTML e CSV (sem estouro, colunas alinhadas), as 9 telas da API, os juros de mora com a Selic mensal de verdade, e o leitor de posição contra seis consolidados anuais (2020 a 2025), com datas, classes e valores corretos em todos.
O custo de aquisição confere pelas cinco portas que o calculam — razão, painel, carteira, relatório de posição e relatório de bens —, e o mesmo vale para valor de mercado e proventos.
8 testes novos, todos verificados por mutação. 445 unitários e 54 de tela.
Peculium.cmd a partir do código-fonte.
v0.11.0 — auditoria do sistema
Auditoria dos 17 módulos, linha a linha, com cada hipótese reproduzida rodando o código real. Saíram 25 achados, e esta versão fecha todos.
O preço à mão, que o sistema mandava digitar e não tinha onde
Clicar em qualquer linha da Carteira abre o preço unitário do papel. cotar_manual existia na API sem uma única chamada na tela, enquanto três mensagens do programa mandavam fazer exatamente isso — inclusive o aviso do Tesouro IPCA+ que entrou na versão anterior. Aquele papel tinha dois caminhos e um era porta pintada na parede.
Outros três métodos estavam órfãos do mesmo jeito e ganharam tela:
- Eventos corporativos agora aparecem, com botão de remover. Dava para cadastrar um desdobramento e nunca mais vê-lo.
- Pagamento de DARF pode ser cancelado. Um valor digitado errado ficava lá para sempre.
Dois números saíam errados em silêncio
- "Apagar todos os dados" deixava o cofre sem integridade referencial.
PRAGMA foreign_keysé no-op dentro de transação e osDELETEabrem uma, então o religar dofinallynão religava nada: até reabrir o programa, lançamento apontando para ativo inexistente entrava calado. - Série do Banco Central com buraco no meio dava curva menor que a verdade. Cobertura se lê de
min/max, que não enxergam vão, e contar linhas só é contar dias úteis se a série for contígua. Com um mês faltando eram 65 dias úteis onde havia 85, e o fator de um CDB caía um ponto percentual.
Concorrência
O pywebview roda cada chamada do JavaScript numa thread nova e a conexão do cofre é compartilhada: o commit() de uma gravava a importação pela metade de outra. Passa tudo por uma trava só.
Apuração
- DARF pago parcialmente cobrava duas vezes os encargos já pagos.
- IRRF excedente atravessava o ano-calendário. Ele abate o imposto dos meses seguintes do mesmo ano (IN RFB 1585, art. 63 §5); o que sobra em 31/12 vai para o ajuste anual. O prejuízo, esse sim, atravessa anos — e continua atravessando.
- Evento corporativo repetido era aplicado duas vezes: dois desdobramentos 1:2 idênticos faziam 100 ações virarem 400.
- A tela de impostos mostrava o prejuízo de hoje em qualquer ano.
- Corrigir um lançamento perdia o vínculo com a nota de corretagem.
- O relatório de custos e o painel contavam lançamento estornado.
Arestas
Classe de ativo entrava sem validação (CRIPTO era aceito — mesma superfície do defeito da v0.9.3); prévia de importação pendente podia ser substituída; cofre truncado devolvia erro cru; o cabeçalho, que não é autenticado, ganhou teto de memória; a gravação faz fsync; mock.js saiu do executável, que ganhou recurso de versão do Windows.
Verificação
32 testes de unidade e 4 de tela novos, todos verificados por mutação — neutralizar a correção e ver o teste morder. 437 unitários e 54 E2E, 91% de cobertura.
Duas coisas ficaram de fora, de propósito e comentadas no código: CHECK de classe no esquema (só alcançaria cofre novo, e dois esquemas em circulação são piores que nenhum) e autenticar o cabeçalho do cofre como AAD (mudaria o formato do arquivo, e o ganho não paga o risco de migrar o arquivo que guarda tudo).
Peculium.cmd a partir do código-fonte.
v0.10.1 — cadastro de renda fixa preenchido
Cadastrar título de renda fixa ficou menos trabalhoso
O aviso "título não cadastrado" pedia indexador, taxa e PU de emissão, e o formulário abria vazio. Dois dos três campos o sistema já sabia.
- Emissão, PU de emissão e emissor vêm preenchidos da primeira aplicação já lançada. O PU é justamente o campo que mais dói errar — ele erra a posição em ordem de grandeza, e em silêncio.
- O Tesouro IPCA+ passou a dizer a verdade. Cadastrar a taxa dele não faz o preço aparecer: a curva depende do VNA oficial, que não se reconstrói da série mensal do IPCA. O formulário avisa ao escolher o papel e aponta o caminho que funciona — importar a Posição da B3, ou digitar o preço à mão.
Sobra informar indexador e taxa, que nenhum arquivo da B3 traz: o relatório de posição deixa o indexador em branco na maioria dos CDBs, e a taxa nunca vem. Quem tem a nota de renda fixa do papel não precisa de nada disso — importar a nota cadastra o título inteiro.
405 testes de unidade e 50 de tela.
Peculium.cmd a partir do código-fonte — ele não passa por essa verificação.
Peculium v0.10.0 — editar lançamento
Editar lançamento — e como o razão append-only permite isso sem mentir.
Duas operações, não uma
Clique em detalhes, na tela de Lançamentos. O que se pode fazer ali são duas coisas diferentes, e a diferença é a própria regra do sistema.
A observação muda no lugar. É anotação livre — "aporte do 13º", "ordem parcial", "conferido com o extrato" — e nada em posição, preço médio ou imposto depende dela. Por isso é o único campo que pode ser alterado sem mais nada. Ganhou coluna própria na tabela.
Qualquer número usa Corrigir valores. Data, quantidade, preço, custos: o formulário abre preenchido e, ao salvar, o lançamento é estornado e um novo entra no lugar.
As três linhas convivem no extrato: o original, o estorno que anula o efeito dele e o novo. O razão não sobrescreve linha — o que o imposto apurou ontem tem de continuar conferível. Se a linha fosse reescrita, a apuração de um mês fechado mudaria sozinha e não haveria como saber por quê. O motivo da correção vai para a auditoria.
O hash_origem fica com o lançamento original de propósito: assim reimportar o mesmo arquivo continua reconhecendo a linha como já vista, em vez de criar uma terceira cópia.
Dois defeitos achados construindo isso
O botão de confirmar não funcionava num diálogo aberto a partir de outro. O evento close de um <dialog> é disparado numa tarefa enfileirada, não na hora. Com um ouvinte por abertura, o close atrasado do primeiro consumia o ouvinte do segundo, e o botão do diálogo novo não fazia nada. Afetava qualquer modal encadeado, não só este. Agora o ouvinte é um só e ignora close que chegue com o diálogo já reaberto.
Corrigir preço ou quantidade não recalculava o valor. Em compra e venda o valor gravado vence o cálculo, então a correção gravaria o preço novo com o total velho. Em provento o valor continua sendo o dado principal e não é recalculado — recalcular de quantidade × preço zeraria o lançamento.
9 testes de unidade e 5 de tela novos. 401 unitários e 48 E2E.
O Windows pode barrar o executável (Smart App Control): use Peculium.cmd ou rode do código-fonte.
Peculium v0.9.3 — todo CDB e o Tesouro entravam como ação
Um defeito só, com dois sintomas — e a duplicação de aportes de renda fixa era o segundo deles.
Todo CDB e o Tesouro entravam como AÇÃO
A lista de classes de ativo estava replicada três vezes no JavaScript, e duas das cópias não tinham RF nem TESOURO.
Quando a classe real não está entre as opções, o <select> cai na primeira — ACAO — e é esse valor que a tela devolve ao gravar. Todo CDB e o Tesouro Direto entravam classificados como ação.
A duplicação vinha daí
A reconciliação da nota de renda fixa com o extrato filtra por classe. Com o CDB marcado como ação, ela deixava de achar o lançamento que veio da B3 e criava outro: o mesmo aporte entrava duas vezes.
Dois defeitos aparentes, uma causa.
Duas defesas
Uma lista só, no topo do arquivo, com as sete classes. Barata, e resolve o caso conhecido.
O Python passou a ignorar a escolha da tela onde ele tem certeza. A gravação só aceita a classe que a interface manda nos tickers em que o programa pediu confirmação — um código que começa com CDB é renda fixa e ponto; TESOURO- é Tesouro. O sufixo 11, que é genuinamente ambíguo entre FII, ETF e unit, continua sendo decidido por quem importa.
Essa segunda defesa é a que importa: ela vale para a próxima lista que divergir, que ainda não sabemos qual é. Defeito de tela não pode corromper o razão.
Por que nada pegou
A tela de conferência do extrato da B3 não tinha nenhum teste de interface, e a ponte falsa usada nos testes nem sequer cobria esse caminho de importação — só nota de corretagem, nota de renda fixa e retrato de posição.
Agora cobre, com um ativo de cada natureza: um que o programa sabe classificar sozinho e um que ele pergunta.
4 testes de tela e 1 de unidade novos, todos verificados por mutação. 393 unitários e 42 E2E.
Quem já importou com uma versão anterior precisa apagar e reimportar: os ativos gravados estão com a classe errada, e isso não se corrige sozinho.
O Windows pode barrar o executável (Smart App Control): use Peculium.cmd ou rode do código-fonte.
Peculium v0.9.2 — cofre antigo não migrava, e a importação falhava
Correção de uma regressão introduzida na v0.9.0, mais a auditoria completa do caminho de importação que a encontrou.
no such column: chave
Cofre criado por versão anterior não migrava, e a importação falhava na hora de gravar.
A atualização do esquema rodava o script antes da migração. Duas coisas se somam:
CREATE TABLE IF NOT EXISTSnão altera tabela que já existe — a coluna nova não nascia;- a linha seguinte do script cria o índice único sobre essa coluna, e estourava com
no such column.
A migração que acrescentaria a coluna nunca chegava a rodar. Como falha de migração é degradante e não fatal — decisão deliberada, porque cofre que não abre é muito pior que tela quebrada —, o cofre abria comprometido e só reclamava mais tarde.
Migração que muda a FORMA da tabela passou a rodar antes do script. A que só mexe em dado continua depois.
Por que a suíte não pegou
O teste montava um cofre antigo sem a tabela em questão: ali o CREATE TABLE rodava de verdade e a coluna nascia junto. Migração de esquema tem de ser testada contra um banco que já tem a tabela, não contra um vazio.
Auditoria do caminho de importação
Seis blocos, todos verificados contra um acervo real — dez notas de corretagem e os relatórios da B3 do ano inteiro:
| Verificação | Resultado |
|---|---|
| Cofre antigo abre e migra | corretoras duplicadas fundidas, lançamentos repontados, CNPJ preservado |
| A migração fica gravada e é idempotente | reabrir não refaz nem duplica |
| Importação completa sobre o cofre migrado | fecha no total conferido, sem nenhuma nota criando negócio novo |
| Reimportar os mesmos arquivos | tudo marcado como duplicado, carteira intacta |
| Colisão de nome de corretora | barrada |
| Apagar tudo e reimportar | devolve o cofre ao estado inicial |
Zero achados de lógica. Dois de comunicação, corrigidos:
- Cofre que não migrou avisava num toast de sete segundos dizendo que "telas novas podem falhar" — some antes de ser lido. Agora é alerta permanente no painel.
- Renomear uma corretora para o nome de outra mostrava
UNIQUE constraint failed. Agora explica que os dois nomes reduzem ao mesmo cadastro.
A migração também ficou à prova de tabela faltando: ela repontava lançamentos sem checar se a tabela existia, e migração que estoura no meio degrada o cofre inteiro — pior que a duplicata que ia corrigir.
5 testes novos, as cinco proteções verificadas por mutação. 392 unitários e 38 E2E.
O Windows pode barrar o executável (Smart App Control): use Peculium.cmd ou rode do código-fonte.
Peculium v0.9.1 — código de renda fixa pedia classe à toa
Correção pequena, achada ensaiando a reimportação completa antes de fazê-la de verdade.
O prefixo do código já diz o que o papel é, mas o reconhecimento exigia que ele não terminasse em dígito: CDB726AM6KA passava e CDB3268VM70 virava pergunta. Perguntar a classe de um código que começa com CDB é pedir ao usuário para confirmar o óbvio — e, pior, a importação parava com "classe não definida" no meio do fluxo.
O sufixo 11 continua pedindo confirmação, que é onde a ambiguidade existe de verdade: FII, ETF e unit dividem o mesmo número, e a classe muda a alíquota do imposto.
387 testes unitários e 38 E2E.
Peculium v0.9.0 — o motor de importação montava a carteira errada
Oito defeitos no motor de importação, achados conferindo um acervo completo — dez notas de corretagem e os relatórios da B3 do ano inteiro — contra a posição que a própria corretora informa.
A carteira saía com R$ 12.689,33 onde o certo eram R$ 9.630,65. Depois das correções ela fecha nos R$ 9.630,65, papel por papel.
| Ativo | Antes | Agora |
|---|---|---|
| KLBN4 | 570 | 285 |
| SNAG11 | 190 | 100 |
| XPCA11 | 140 | 100 |
| Tesouro IPCA+ | ausente | R$ 2.079,13 |
| Recibo de subscrição | ausente | R$ 38,56 |
| Cadastros de corretora | 6 | 3 |
A nota duplicava o negócio na primeira vez que via um papel
O pior em consequência. A reconciliação com a B3 rodava antes de o usuário informar o ticker — e sem ticker não há como casar, então o negócio entrava de novo por cima do que já viera do extrato. Um papel com 285 cotas aparecia com 570.
Da segunda nota em diante o apelido já existia e reconciliava certo, o que escondia o problema e fazia parecer intermitente.
A reconciliação passou a acontecer depois de o ticker ser resolvido. A mesma função é chamada duas vezes: no conferir, para a tela, e no gravar, com o que o usuário respondeu.
A B3 agrupa execuções que a nota detalha
Num dia real o extrato trouxe 68+12 cotas e a nota 1+11+68. Casar linha a linha não fecha nunca.
Agora casa pelo agregado do dia, conferindo quantidade e valor — só a quantidade colaria a nota no negócio errado quando há duas ordens do mesmo papel no dia com preços diferentes. Totais que não batem não são reconciliados: aí são negócios diferentes de verdade, e apagar o da B3 perderia lançamento.
A compra de Tesouro Direto era descartada em silêncio
O importador jogava fora toda linha "Compra" da Movimentação com o motivo "já vem no relatório de Negociação". Tesouro Direto não passa pela bolsa, então não vem — e eram R$ 2.079,13 de patrimônio sumindo sem aviso nenhum.
O preço da subscrição era jogado fora
A linha "Direitos de Subscrição - Exercido" traz preço unitário e valor da operação, e o programa dizia ao usuário que a B3 não informava o preço. Não era verdade. A subscrição exercida vira lançamento sozinha, e as outras cinco linhas de uma subscrição deixaram de pedir atenção à toa.
Renda fixa: datas e códigos diferentes dos dois lados
A nota é do dia da negociação e o extrato registra a liquidação — 18/06 contra 22/06 num caso real, e o mesmo aporte entrava duas vezes. Entrou uma janela de seis dias.
E o mesmo CDB virava dois ativos: a nota que não traz código utilizável gera um ticker derivado, enquanto a B3 usa o código dela. Agora casam por quantidade, preço unitário e emissor.
Os avisos mandavam fazer o que o sistema recusa
Papel recebido sem pagamento — presente, promoção — não entra como COMPRA, que exige preço maior que zero. Quem recebeu um BDR de brinde caía num beco sem saída. Os avisos passaram a apontar BONIFICAÇÃO, que é o caminho que existe.
Uma corretora, um cadastro
A mesma corretora chega com nomes diferentes em cada documento: XP INVESTIMENTOS CCTVM S/A, a mesma com ponto final, XP INVESTIMENTOS e o nome societário por extenso — quatro grafias, mais duas do Inter. Casando pelo texto cru eram seis cadastros para três corretoras, e a posição por instituição perdia o sentido.
O nome passou a ser reduzido ao de fantasia — sem acento, pontuação nem forma societária — e isso vira chave única.
Esquema versão 4
Coluna chave em instituicoes, com índice único. A migração funde as duplicadas de cofres antigos, repontando os lançamentos antes de apagar a cópia e preservando o CNPJ que só existir na que vai sumir.
15 testes novos. As nove proteções foram verificadas por mutação — neutralizar cada uma faz o teste correspondente falhar. 381 unitários e 38 E2E.
O Windows pode barrar o executável (Smart App Control): use Peculium.cmd ou rode do código-fonte.
Peculium v0.8.0 — painel redesenhado e juros de mora do DARF
Reúne três versões de trabalho (0.7.0, 0.7.1 e 0.8.0). Fecha a última conta de imposto que estava incompleta e redesenha o painel.
Painel redesenhado
Régua de quatro somas no topo — patrimônio, custo, resultado e proventos, cada uma com a sua nota de contexto —, composição da carteira em barra empilhada, gráficos de proventos mês a mês e aportes acumulados, e a tabela completa de posições.
A divergência com a B3 agora aparece no painel: data do retrato, quantos papéis conferem e quanto a B3 informa a mais, com cada papel que falta lançar. Para isso o retrato importado passou a ser guardado — só o que a B3 disse, nunca a conclusão. A comparação é refeita a cada abertura, então lançar a compra que faltava apaga o aviso sozinho.
Tema não escolhe layout. Um painel, três temas. Amarrar os dois faria trocar para o escuro à noite render uma estrutura diferente sem ter pedido. O que muda por tema são as cores de série: no escuro a púrpura não contrasta, e as três precisam ser distinguíveis entre si, não só do fundo.
Três correções que só a captura revelou: a média de proventos dividia por doze (o certo é dividir pelos meses que tiveram provento — por doze, em agosto, diria metade do que se recebe por mês); a classe saía como FII e ACAO, que é código de banco e não rótulo de tela; e o resultado saía R$ ▲ +2,60, com o cifrão antes da seta.
Juros de mora do DARF
A última conta de imposto declaradamente incompleta. Soma a Selic acumulada mensalmente do mês seguinte ao vencimento até o anterior ao do pagamento, mais 1% no mês do pagamento (Lei 9.430/96, art. 61 §3).
A série que serve é a 4390 (Selic acumulada no mês), não a 11 (Selic diária) que o programa já usava para a curva da renda fixa: a lei manda somar taxas mensais, não capitalizar dias. A distinção foi conferida contra a API do Banco Central.
- O caso mais comum não precisa de série nenhuma: pagar dentro do mês seguinte ao vencimento não fecha nenhum mês inteiro de atraso, então os juros são só o 1% — e esse DARF sai completo mesmo sem rede.
- Faltando um mês da série, o programa recusa calcular e diz qual falta. Juros a menos numa guia de recolhimento é diferença que a Receita cobra depois.
- A tela de Impostos ganhou coluna de Juros e o botão Atualizar Selic — quem não tem renda fixa nunca abriria a Carteira, onde ficava o único botão que baixa séries do BCB.
Portabilidade entre corretoras
Ela vem em duas linhas no relatório de Movimentação — débito na origem, crédito no destino — e o leitor agora as pareia por data, papel e quantidade. Juntas viram um lançamento de transferência; uma ponta só continua pendente, porque metade da portabilidade não diz para onde o papel foi.
Como consequência, o aviso de saldo negativo numa corretora deixou de dizer "falta a transferência": a causa mais comum passou a ser a compra anterior, feita na origem antes do período do extrato. O aviso nomeia as duas.
Subscrição
Continua sem virar lançamento — as linhas nomeiam o papel intermediário (direito, recibo) e nenhuma traz o valor pago. O que mudou é que os seis subtipos deixaram de receber a mesma frase: só o "Recibo de Subscrição" vira posição, e é ele que ganha a instrução de lançar a compra. Quando o recibo virar a cota definitiva, o passo é registrar uma conversão em Eventos.
Corrigido
- O formulário de instituição saía espremido. O CNPJ não é um campo curto — carrega o botão de busca e a nota de privacidade —, e dividido em três colunas o input cortava a própria máscara. Ele passou a ocupar a linha inteira, o que também desafogou os formulários de lançamento, de título de renda fixa e de pagamento do DARF.
Esquema
Versão 3: tabela posicao_b3, com o último retrato importado. Cofre antigo ganha a tabela ao abrir, sem migração de dado.
366 testes unitários e 38 E2E. As proteções novas foram verificadas por mutação — neutralizar cada uma faz o teste correspondente falhar; uma delas revelou que o outro lado da portabilidade sumia da conferência em silêncio.
Ainda sem validação contra documento real: o leitor de PDF de nota de venda. O parser foi construído a partir de notas de compra, e a nota de venda difere no sinal do líquido e na presença de IRRF. O caminho razão → fisco → obrigações está coberto por teste de integração, mas isso não substitui o documento.
O Windows pode barrar o executável (Smart App Control): use Peculium.cmd ou rode do código-fonte.
Peculium v0.6.0 — cadastros editáveis, tabelas ordenáveis e apagamento geral
Reúne três versões de trabalho (0.4.2, 0.5.0 e 0.6.0).
Tabelas ordenáveis
Toda tabela do programa ordena pelo cabeçalho: clique para ordenar, clique de novo para inverter. Funciona pelo teclado.
A chave de ordenação não é o texto da célula. A célula já vem formatada para leitura, e ordenar por ela poria 10/01/2026 antes de 05/12/2025 e 1.029,52 antes de 285. Data, competência e número em pt-BR são reconhecidos — incluindo o menos que o indicador de alta e baixa desenha, que é U+2212 e não o hífen do teclado.
O cabeçalho é um <button> de verdade, e não um <th> com onclick: botão nativo já traz foco, Enter e Espaço, e o aria-sort anuncia a ordem ao leitor de tela.
Cadastros editáveis
Ativos e instituições passam a ser editáveis em Configurações › Cadastros — clique na linha.
Renomear é seguro: os lançamentos apontam para o cadastro, não para o texto do ticker. Trocar a classe fica registrado na auditoria com o antes e o depois, porque a classe muda a alíquota do imposto. Arquivar tira o cadastro dos formulários novos sem apagar nem esconder lançamento nenhum.
Busca de CNPJ
No cadastro de instituição o CNPJ vem primeiro, e é ele que preenche a razão social. ReceitaWS primeiro, BrasilAPI como reserva — o plano gratuito da ReceitaWS concede três consultas por minuto, então a reserva é o caso normal, não a exceção.
Mesma contenção da cotação online: host em constante de módulo, timeout curto, e só o CNPJ digitado sai daqui. Ele revela em qual corretora você tem conta, nunca o que você tem lá.
Os dígitos verificadores são conferidos em dois momentos: antes de ir à rede, porque um dígito trocado voltaria como "não encontrado" depois de gastar uma das três consultas do minuto; e na gravação, porque CNPJ errado guardado volta como "não encontrado" toda vez que alguém tentar usá-lo.
Apagar todos os dados
Em Configurações › Zona de risco. Apaga lançamentos, ativos, instituições, importações, notas, cotações, títulos de renda fixa, pagamentos de DARF e o histórico de auditoria. Sobrevivem as preferências e as séries do Banco Central; senha mestra e chave de recuperação não mudam.
- A confirmação é uma frase digitada (
APAGAR TUDO), não um botão: operação sem desfazer não pode ficar a um clique de distância de um acidente. - Uma cópia do cofre é guardada antes, fora do rodízio dos três backups automáticos — eles giram a cada gravação, e três lançamentos depois do reset nenhum deles teria mais o dado antigo.
- O dado sai do arquivo, não só das consultas.
DELETEdeixa os bytes numa página livre e o banco inteiro vai cifrado para o disco: semVACUUM, quem tem a senha ainda leria o que foi mandado apagar.
Corrigido
- "Atualizar cotações" acusava falha onde não havia. CDB e Tesouro não têm código de bolsa, mas entravam na lista de candidatos e cada um virava uma linha de falha — numa carteira real, dez falhas e zero atualizações com nada errado. O relatório também passou a dizer quantas cotações foram ignoradas, e por quê.
- A máscara do CNPJ é aplicada na leitura: o que a importação da B3 gravou só com dígitos agora aparece formatado.
348 testes unitários e 32 E2E. As proteções novas foram verificadas por mutação — neutralizar cada uma faz o teste correspondente falhar. Um teste de ordenação por data não mordia, porque as datas de exemplo ordenavam igual por texto e por data; entrou um caso que separa os dois.
O Windows pode barrar o executável (Smart App Control): use Peculium.cmd ou rode do código-fonte.