Pular para o conteúdo

Projeto executado pela equipe que hoje é a Overclock Web. A página abaixo é o dossiê do sistema, na identidade do próprio produto — não na nossa.

Bomfim Eco 360 Ecossistema de gestão · Fiscal · Contábil · Pessoal · Legal · TI

O trabalho fiscal de um escritório inteiro, dentro de um login só.

Planilhas compartilhadas, controles em papel e consultas manuais a portais públicos viraram 34 telas, uma frota de robôs e um motor tributário conferido asserção por asserção. Em pouco mais de três meses, três desenvolvedores.

Construído por Breno Araujo João Sousa Levi Gabriel

Sistema interno, em produção, sem acesso público. Esta página descreve funcionalidades, telas e decisões técnicas — não há link, demonstração nem credencial.

Foto do repositório em 31/08/2026

778commits, de 18/05 a 28/08 de 2026
34telas no menu, em 11 áreas
73componentes React · 34 mil linhas
109módulos Python · 48 mil linhas
201rotas HTTP no módulo principal da API
319asserções na suíte da aritmética tributária
6portais municipais de ISS, em 6 plataformas diferentes
53entregas publicadas no changelog interno

O projeto

Um hub fiscal que precisa estar certo, não só bonito

O Bomfim Eco 360 é o sistema interno de um escritório de contabilidade brasileiro. Ele reúne, num único login, o trabalho que antes vivia espalhado: apuração fiscal, emissão de certidões, controle de obrigações acessórias, honorários, alvarás, certificados digitais, suporte interno e simulação tributária. São 34 telas em 11 áreas, e cada item do menu passa por um modelo de permissão de três camadas — papel do usuário, funcionalidade liberável e setor dono da tela.

Por baixo das telas há uma camada de automação. Robôs em Playwright entram no portal fiscal estadual, em seis portais municipais de ISS — seis plataformas diferentes — e no Domicílio Tributário Eletrônico; clientes de webservice consomem as APIs oficiais de distribuição de NFS-e e de documentos de transporte por mTLS, com o certificado A1 da própria empresa. Como o serviço web roda em nuvem e não alcança a rede interna nem a pasta fiscal do escritório, o desenho é híbrido: a tela enfileira um job no banco, runners locais consomem a fila, gravam os arquivos na rede, sobem os artefatos e devolvem o resultado.

A terceira frente é tributária. Toda a aritmética de Simples Nacional, Lucro Presumido, Lucro Real e da transição para IBS/CBS (LC 214/2025) vive em módulos JavaScript puros — sem React, sem requisição, sem data do sistema — com base legal citada linha a linha e memória de cálculo auditável. Some-se a isso um assistente de IA que só responde ancorado em dados do próprio sistema, e uma trilha de auditoria com retenção definida.

As telas

Cada planilha compartilhada que virou tela levou junto a sua regra

As três telas abaixo são do sistema em produção, com os dados de cliente mascarados — não há link público nem login de visita. Depois delas, três esquemas em desenho mostram os padrões de interface que mais se repetem, e a lista completa vem em seguida, agrupada por área.

Painel inicial: quatro avisos de pendência e quatro contadores de escala.
Painel inicial. Os avisos só existem quando há pendência.
Tela de entrada, com o formulário de usuário e senha.
A porta. Sem sessão, nada mais é renderizado.
Central de suporte interno: formulário de abertura de chamado.
Suporte interno. O chamado nasce classificado.

Telas do sistema em produção. Nome de empresa, contagem de pendência vencida e ferramenta interna foram substituídos por exemplo; o desenho, os rótulos e a escala são os reais.

Matriz empresa × mês Quatro estados por célula: pago, sem pagamento, sem dado e mês futuro. Coluna da empresa congelada, placar por mês no cabeçalho.
Progresso real, não estimado Uma linha por empresa e uma bolinha por certidão, na ordem exata em que o robô emite — com o nome da que está baixando agora.
Diferença no ano R$ 41.280
A resposta primeiro Layout invertido de propósito: o número grande em cima e as premissas embaixo, para que mexer numa premissa mude o resultado à vista. Campo amarelo = valor calculado, não sabido.

Plataforma e acesso

A casca do sistema: login único, menu declarativo, painel inicial que muda conforme quem entra e o que está pendente.

Entrada

Login

Porta única: sem sessão, nada mais é renderizado — nem menu, nem cabeçalho.

  • Freio de força bruta chaveado por usuário + IP: um punhado de falhas numa janela curta suspende as tentativas por um tempo, e o acerto zera o contador
  • A chave composta é deliberada — o escritório inteiro sai pelo mesmo endereço, então contar só por IP se autobloquearia e contar só por usuário deixaria alguém trancar a conta de outro
  • O limitador é fail-open por decisão registrada: erro dentro dele deixa o login seguir, porque só pode adicionar proteção, nunca barrar por bug próprio
Navegação

Barra lateral e cabeçalho

O quadro fixo em volta de tudo: menu por áreas, breadcrumb, busca de empresas e ações globais.

  • O menu inteiro nasce de um único array declarativo — acrescentar uma tela é acrescentar uma linha, e a barra, o mapa de títulos e a trava de acesso leem daí
  • Busca global de empresas em estilo command palette, com selo do estado da última consulta em cada resultado e navegação por teclado
  • Grupos recolhíveis com estado gravado por navegador; ao recolher a barra, a tabela solta a trava de largura e usa a tela toda
Início

Painel inicial

Muda conforme a hora, o usuário e o que está pendente — mostra avisos que somem sozinhos quando o problema é resolvido.

  • Quatro banners condicionais (limite do Simples, certificado a vencer, benefício a renovar, alvará vencendo), cada um só existindo quando há pendência e só para quem tem a permissão
  • Nenhum tem botão “dispensar”, por decisão de produto: o aviso de benefício some quando a data é atualizada, não quando é clicado
  • A métrica de falha na consulta desconta credencial inválida e falha transitória do portal, para não inflar o número
Cadastro

Empresas

O cadastro central que faz os robôs funcionarem: credenciais de portal, configuração de ISS por município e certificado digital.

  • Upload de certificado A1 com senha, validade exibida, remoção com confirmação em linha e instalação na máquina do usuário por agente local
  • Consulta o número de sócios na Receita Federal e preenche o campo usado no ISS fixo
  • Salvar envia só o que mudou: o payload é montado campo a campo contra o valor original
Administração

Usuários e permissões

Onde se criam contas e se decide, caixinha por caixinha, o que cada pessoa enxerga — cruzado com o uso real do sistema.

  • Ferramenta de outro setor aparece esmaecida e não pode ser marcada: marcar não adiantaria, o servidor descarta ao montar a sessão
  • Permissões sensíveis exigem liberação explícita, nunca vindo no pacote padrão nem por herança de cadastro antigo
  • Faixa de “quem está no sistema agora” com setor e tela aberta, em memória, sem gravar no banco; a presença some após 150 s sem sinal
  • Travas para o administrador não remover o próprio papel nem se desativar
Rastreabilidade

Log de auditoria

A trilha das ações sensíveis: quem mudou permissão, editou empresa, removeu certificado, apagou mensagem ou alterou um vencimento.

  • 15 ações com rótulo em português e cor por gravidade — vermelho para o que some para todos, âmbar para o que tem efeito fora do sistema; os demais tipos caem num tradutor genérico
  • Em mensagem apagada, o log guarda o texto original — é a única cópia do que ela dizia
  • Retenção definida: purga programada de eventos com mais de 6 meses
Produto

Notas de atualização

O changelog do produto dentro do próprio produto, aberto a todos e distribuído por pop-up no primeiro acesso do dia.

  • 53 entregas e 207 tópicos classificados em novo, melhoria e correção
  • O processo está escrito no topo do arquivo: a nota é redigida antes do deploy, na branch — e é proibido citar segurança interna, credencial ou infraestrutura
  • O pop-up controla “visto” por identificador e data, então editar um comunicado o faz reaparecer, mas reabrir a tela não

Fiscal

O dia a dia do setor: quem pagou e quem não pagou, coleta de notas e guias em seis municípios, documentos de transporte e emissão de certidões em lote.

Visão do ano

Situação do Mês

Matriz de uma linha por empresa e uma coluna por mês: responde de relance quem pagou a guia no ano inteiro.

  • Placar pagos/total no cabeçalho de cada mês, calculado ignorando meses futuros e sem dado
  • Coluna da empresa fixa, tabela rolando na horizontal
  • Banner recolhível com as empresas cuja última consulta falhou por credencial inválida do portal
Emissão

Certidões

Dispara e acompanha a emissão automática de certidões negativas por empresa e por mês, e transforma o resumo fiscal do portal estadual — que antes só virava PDF — em dado filtrável.

  • Oito tipos de documento, cada um com a cobertura escrita na tela e o que não cobre — inclusive o município que continua bloqueado por reCAPTCHA e é emitido à mão
  • Colunas do resumo escolhidas por ocorrência medida na base, não por parecerem importantes: coluna que responde “não” em todas vira parede
  • Autofiltro por coluna no estilo do Excel permite cruzamentos que o portal oficial não responde; onde o campo não foi lido, a tela mostra traço em vez de presumir que está tudo bem
  • Consulta e download liberados a qualquer pessoa logada; disparar a emissão é restrito, porque a certidão federal é paga por consulta
Municipal

ISS — notas e guias

Coleta mensal das notas de serviço e das guias de ISS, uma empresa por vez ou o município inteiro, com acompanhamento ao vivo e download em lote.

  • Quatro seções por empresa e competência: notas recebidas, emitidas, de tomador e as guias
  • Conferência do ISS esperado pelas notas contra o valor cobrado na guia, em sete situações — e desligada onde não faz sentido (empresa de ISS fixo, município cuja guia não é legível)
  • Cada nota vira também PDF: documento auxiliar gerado do XML em todos os municípios e, onde a página de autenticidade foi mapeada, o documento oficial da prefeitura
  • ZIP com tudo o que foi coletado no mês e agendamento configurável pela própria equipe, sem depender da TI
Transporte

MDF-e e CT-e

Para cada nota recebida no período, descobre os documentos de transporte vinculados e entrega uma planilha com quem transportou, quem paga o frete e quanto custou.

  • Duas entradas de menu servidas pelo mesmo componente parametrizado: um conserto vale para os dois documentos
  • As colunas trazem o papel escrito no nome — “emitente do CT-e (transportadora)”, “tomador (quem paga o frete)” — porque “transportador” sozinho se confundia com o fornecedor na conferência
  • O tomador é lido do campo do próprio documento, nunca deduzido de CFOP ou tipo de venda
  • Aviso antes de reprocessar por cima de uma planilha que alguém já baixou
Empresa

Painel da empresa

Tela de uma empresa só, com os indicadores do ano e as abas de detalhe: pagamentos, inadimplência e guias acessórias.

  • Botão de atualizar que enfileira a coleta e acompanha a fila por fases — pendente, rodando, concluído — com texto diferente em cada uma
  • Exportação para Excel e PDF respeitando os filtros aplicados, não a lista inteira
  • Bloco de possíveis pagamentos em duplicidade que distingue “idêntico” de “parecido” e pede conferência, em vez de afirmar erro
  • Cruzamento entre a guia enviada ao cliente e o pagamento registrado no portal, em quatro situações explicadas em linguagem de negócio
Relatório

ICMS Antecipação Parcial

Os pagamentos de um código de receita específico, com o valor principal separado de juros e multa.

  • Filtros de ano e competência mensal, com opção de todos os meses
  • Exportação CSV com BOM, ponto-e-vírgula e vírgula decimal — abre direto no Excel em português
  • A tela declara qual código de receita está sendo usado, em vez de deixar implícito

Simulação tributária e reforma (LC 214/2025)

Quatro telas que comparam regimes e os caminhos abertos pela reforma, com memória de cálculo linha a linha e um painel que mede se o dado da empresa sustenta a conta.

Decisão de 2027

Caso completo 2027

Responde à decisão do art. 41, § 3º da LC 214/2025: manter IBS e CBS dentro do DAS ou apurá-los por fora, continuando optante do Simples — mês a mês, com mix de produtos, crédito das entradas e crédito de estoque da virada.

  • Layout invertido de propósito: a resposta em número grande primeiro, as premissas abaixo, para que mexer numa premissa mude o número à vista
  • Seis casos típicos pré-carregados, cada um escolhido por tropeçar num ponto diferente da reforma
  • O terceiro cenário vem de uma ponte para o motor de regimes, não de uma segunda implementação do mesmo imposto — a prova de que a tradução está certa é o Simples dar o mesmo centavo nos dois motores
  • Etiqueta de procedência em cada campo vindo do sistema, amarela com aviso quando o valor foi calculado e não sabido
Regime pleno

Comparativo 2033

Compara a carga de hoje com os dois caminhos do regime pleno para o optante do Simples.

  • Veredito duplo: “quem paga menos” e “quem entrega mais crédito ao cliente” são perguntas diferentes e costumam ter respostas diferentes
  • Memória normativa na própria tela, com o dispositivo atrás de cada linha — inclusive a janela semestral e irretratável da opção
  • Selo de conferência que roda 16 campos contra a planilha de referência de um curso sobre a reforma e mostra o resultado na frente do usuário
  • A alíquota de referência fica editável e rotulada como premissa, porque não existe em lei — é fixada por resolução
Comparação

Análise de Regimes

Simples, Presumido e Real mês a mês, com a regra de cada tributo aberta e o regime inelegível marcado e fora do veredito.

  • Separa o realizado (transcrito, só do regime atual) do simulado, e mede a redução contra o regime atual, não contra o mais barato
  • Só a coluna do regime atual aceita valor digitado — se qualquer coluna aceitasse, daria para montar uma comparação entre dois números informados por quem quer um resultado
  • A presunção do Presumido fica visível e editável, porque classificar a atividade é onde mais se erra e uma presunção errada escondida erra o IRPJ inteiro sem deixar rastro
  • Rascunho local por empresa com validade de 30 dias, que nunca restaura sozinho
Qualidade do dado

Saúde da Apuração

Audita o dado antes de deixá-lo virar número: diz em quais empresas dá para confiar na apuração que alimenta as simulações.

  • O cabeçalho declara o que a tela não diz (se a empresa apura certo no fisco), para não vender o que não tem
  • Doze sinais nomeados — série parada, buraco na série, RBT12 incompleto, acima do teto, salto fora de escala —, cada um com consequência e ação, não só sintoma
  • Quatro faixas ordenadas por consequência, não por quantidade de sinais: risco fiscal acima de apuração comprometida
  • Gráficos que filtram a lista ao clique, e meses sem lançamento aparecendo como vão até o topo da escala, em vez de coluna de altura zero
Transversal

Memória de cálculo e seletor de empresa

O bloco que mostra a corrente de contas com os operandos substituídos, e a busca que carrega as premissas prontas de uma empresa já cadastrada.

  • Um componente de memória só, para as três abas — três cópias divergiriam, e a que o cliente visse seria a errada
  • Todo valor da memória é lido do motor; a única multiplicação feita ali está declarada como exceção
  • O seletor mostra, antes do clique, o que decide: faixa, Fator R e o anexo que ele indica, selos de meses de receita e de compras, folha e a competência do último fechamento
  • Segunda aba “Quem precisa de análise”: a fila ordenada por urgência de decisão, com o motivo e o número

Controladoria

O monitor do Domicílio Tributário Eletrônico, onde a regra central é técnica e de negócio ao mesmo tempo: abrir uma mensagem dá ciência e inicia prazo legal.

Prazo legal

DT-e

A caixa de entrada do Domicílio Tributário Eletrônico de todas as empresas num lugar só, com semáforo de prazo — para não perder ciência tácita e nunca dar ciência por engano.

  • O robô só lê a lista, paginando; abrir uma mensagem é ato humano, por clique explícito, registrado com quem pediu, quando e qual era a situação antes
  • A tela e o robô usam a mesma função de classificação, para nunca discordarem; o servidor recusa abrir mensagem com prazo vivo e devolve a faixa
  • Selo de frescor por empresa em cinco estados — ok, velho, nunca verificada, sem credencial, sem registro — para ninguém confundir “sem mensagem nova” com “não conseguimos ler”
  • Botão que devolve a inscrição estadual para a pessoa entrar no portal ela mesma: senha de cliente nunca vai para o navegador, é uma empresa por chamada, e cada consulta vira linha de auditoria

Controle de produção dos setores

As planilhas de rotina viraram tela: linhas são as empresas da carteira, colunas são as obrigações do mês, cada campo salva sozinho e toda alteração vai para a auditoria.

Rotina mensal

Fiscal Org

Controle de produção mensal de um dos setores fiscais, com quatro blocos de rotinas e cabeçalho de dois níveis.

  • Célula de status em três estados que giram no clique: pendente, enviado, não se aplica
  • Preenchimento em massa: marca N empresas, escolhe a coluna e o valor, e o sistema aplica em blocos de seis requisições paralelas, com atualização otimista a cada linha
  • Tabela de alto desempenho escrita à mão: opções de filtro passadas como função e calculadas só com o menu aberto, comparador de ordenação reusado e paginação de 120 linhas — sem isso, centenas de empresas por dezenas de colunas travavam o navegador
  • Colunas congeladas em três níveis de detalhe, larguras arrastáveis, altura ajustável e tela cheia, tudo lembrado por navegador
Obrigações

Declaração

Controle de envio das obrigações acessórias: quem entregou o quê no mês e o que ainda falta.

  • Cinco obrigações em abas, mais duas abas de exceção que existem para achar o que está escondido: empresas que não entregam nenhuma obrigação e linhas que o robô não preencheu
  • Carimbo de “atualizado automaticamente” que sinaliza quando a rotina falhou e quantas linhas foram atualizadas
  • Aba de produtividade por colaborador, restrita à gestão do setor dono da tela — no servidor, não só na tela
Carteira

Simples Org

A carteira do outro setor fiscal: quem cuida de cada empresa, com responsável, atividade, grupo e observações editáveis.

  • Relatório em três visões da mesma planilha, porque o responsável vem encadeado no formato coordenador → intermediário → executor
  • Cartões do topo que viram filtro por situação, com paginação e contagem do que falta
  • Edição na célula com salvamento imediato e exportação compatível com o Excel em português
Benefícios

Controle de Benefícios

Cadastro dos benefícios fiscais e a validade de cada um — o vencimento aqui é o que acende e apaga o alerta na tela de Início de todo o setor.

  • Três abas para três cadastros realmente diferentes, cada uma declarando as colunas que usa em vez de condicionais espalhadas
  • Selo de validade em quatro estados, com “zero dia” virando “vence hoje”, para o caso mais urgente não parecer o menos
  • “Sem data” é cadastro incompleto, não urgência: não alerta
  • Leitura liberada a todo o setor; alterar exige permissão separada, porque mudar a data apaga o alerta de todo mundo

Legal

Consulta e controle da base cadastral: montar listas com filtros combinados, auditar o cadastro contra a Receita e acompanhar o vencimento dos alvarás.

Consulta

Listagem de Empresas

Monta a lista com vários filtros combinados e exporta, sem abrir outro sistema nem fazer um segundo login.

  • Situação, UF, regime e cidade aceitam vários valores ao mesmo tempo — antes era preciso gerar duas listas e juntar à mão no Excel
  • Unifica municípios grafados de formas diferentes na origem: a chave de agrupamento ignora acento e pontuação, e o rótulo exibido é a grafia mais completa do grupo
  • Reusa o autofiltro de coluna como se fosse campo de formulário, no lugar de um seletor comum
Alvarás

Controle de Vencimentos

A planilha compartilhada dos alvarás de cada estabelecimento — e a lista de empresas não é mantida à mão: vem da foto diária do ERP, então empresa nova aparece sozinha.

  • Máscara de data com validação de data real: 31/02 é recusado, embora o Date do JavaScript o aceitasse virando 03/03
  • Trava por campo com motivo obrigatório escolhido no mesmo clique; dois dos motivos apagam a data no cliente e no servidor, porque não é ausência de dado — é dado que não existe
  • Janelas de alerta distintas por tipo de alvará (60 e 30 dias); data em branco não alerta
  • Quem vê, edita — e toda alteração vai para a auditoria com o nome de quem fez: é o que substitui o histórico de versões de uma planilha
Embed autenticado

Auditoria Cadastral

Compara o porte declarado na Receita com o porte esperado pelo faturamento, e o município do cadastro com o da Receita.

  • Ferramenta interna que roda na rede do escritório, embutida no sistema por iframe e autenticada pelo próprio token da sessão — sem segundo login
  • Modo sem moldura: um parâmetro faz a ferramenta esconder a própria barra lateral, porque o sistema já a tem; o tema é sincronizado ao vivo entre as janelas
  • Aviso explícito de que, fora da rede da empresa, o quadro não carrega — em vez de uma tela branca sem explicação

Financeiro

Quanto o escritório cobra, quanto gasta com software e com quem falar em cada cliente — tudo atrás de permissão própria, por expor valor e contato.

Receita

Honorários

Cruza a foto diária do ERP com o que a equipe digita, sem que a coleta sobrescreva o preenchimento.

  • A célula salva ao sair do campo e só quando o valor mudou — passar o cursor não carimba o nome de ninguém na auditoria
  • Agrupamento de empresas que dividem um honorário só, com herança de valor e prestador; o total do topo soma por contrato e não por empresa, para não contar o mesmo dinheiro cinco vezes
  • Detecta honorário lançado em outro código com o mesmo CNPJ: o aviso diz onde o dinheiro está, e a linha antiga é marcada como migrada para não entrar duas vezes no total
  • Carimbo permanente no topo com a data de cada uma das três coletas que alimentam a tela, para ninguém decidir com dado de três dias atrás achando que é de hoje
Custo

Catálogo de Ferramentas

Responde quanto o escritório gasta com software: ferramentas contratadas com categoria, setores atendidos, periodicidade e custo.

  • Com filtro ativo, a barra mostra quantos de quantos e recalcula a soma apenas do que está visível
  • Custo anual calculado a partir do mensal — e o inverso quando a periodicidade é anual
  • Os dados vêm de endpoint protegido e não ficam no pacote do frontend
Relacionamento

Lista de Contatos

Contatos das empresas para o Financeiro, consolidando planilhas do setor com o cadastro completo do ERP, incluindo filiais.

  • Edição em linha por registro, com coluna de ações fixa e botão que descarta as edições locais
  • Filtro de confirmação dentro do próprio cabeçalho da coluna, além de ocultar excluídas e mostrar só quem tem contato

Atendimento interno e tarefas

O suporte da TI e a distribuição de trabalho do escritório, com um modelo de tarefas em que cada pessoa tem a sua.

Help desk

Abrir chamado

Qualquer pessoa abre um chamado, acompanha a conversa e vê o desfecho — substitui o pedido por mensagem avulsa, que se perdia sem registro de quem resolveu.

  • Protocolo gerado pelo servidor no formato ano + sequencial; o setor do solicitante é resolvido pelo cadastro atual, não pelo que veio gravado
  • Um chamado aberto por pessoa: enquanto houver um em curso, o formulário dá lugar ao aviso com o protocolo e o botão de ir até ele
  • Ciclo de vida em seis situações, com “em andamento” devolvendo o chamado à fila em vez de encerrar — dito na própria tela
Fila

Painel de suporte

A fila de quem atende: assumir, responder, transferir e encerrar sem sair da conversa.

  • Atualiza sozinha em silêncio e pausa quando a aba perde o foco
  • Assumir com tratamento de disputa: se um colega assumiu antes, o erro do servidor recarrega a fila e o botão some sozinho
  • Editar e apagar mensagem é restrito ao administrador e vai para a auditoria com o texto original
  • Rotina que encerra por prazo: chamado em andamento sem resposta há duas horas vira “não resolvido”, com mensagem de sistema
Indicadores

Relatórios de atendimento

Os números do help desk, todos clicáveis para chegar na lista de chamados por trás.

  • Volume em quatro recortes — dia, semana, mês, ano — com detalhamento que salta direto para a conversa
  • Cartão com zero fica visível porém sem clique: recorte vazio não vira botão que não leva a lugar nenhum
  • O filtro por setor tem a lista calculada no servidor antes do próprio filtro, para o seletor nunca encolher ao selecionar
  • Uma mascote lê o próprio relatório e comenta o achado principal em uma frase, com texto honesto quando ainda não há dados
Trabalho

Tarefas

Modelo próprio: quando o supervisor manda a mesma coisa para quatro pessoas, nascem quatro tarefas independentes.

  • Concluir a sua não conclui a dos outros, e cada um escreve a própria observação; a tela avisa que N pessoas marcadas geram N tarefas separadas
  • Prazo em linguagem humana — “atrasada”, “vence hoje”, “em 3 dias” — e data curta quando falta mais de uma semana
  • Mini-janela arrastável por cima de qualquer tela, com posição e estado guardados por pessoa
  • Distribuir para a equipe é limitado por papel no servidor, não por permissão de tela: tarefa pessoal não é privilégio de ninguém

Assistente de IA

Um chat interno que responde ancorado em base de conhecimento própria, em ferramentas escopadas pela permissão de quem pergunta e num calendário fiscal calculado no servidor — nunca de memória.

Chat

Assistente flutuante

Canal único para perguntar “como faço X”, “onde fica Y” e consultar dados que a pessoa já pode ver, sem abrir chamado para a TI.

  • Oito ferramentas declaradas ao modelo, e só as que aquela pessoa pode usar: o gate real são as ferramentas, o prompt é reforço secundário
  • Base de conhecimento própria com mais de 90 tópicos, escrita a partir dos componentes, com os nomes reais de menu, aba e botão — inclusive cinco programas de desktop que não são telas do sistema
  • Modo de configuração: um administrador ensina uma tela nova pelo chat, sem deploy, com o papel reconferido no servidor a cada execução e cada gravação virando linha de auditoria
  • O boneco é arrastável, some por uma hora quando pedem, e tem sete poses com ordem de precedência escrita — inclusive uma rara, protegida por duas travas
Custo

Uso da IA

Monitor somente-leitura que responde se a IA está cara, se está fora do ar e por quê — uma linha por tentativa de chamada ao modelo.

  • Tabela do roteador com ordem de preferência, situação de cada modelo e o tempo restante de castigo, com o motivo textual
  • A coluna de limite conhecido é aprendida do corpo do último erro de cota; sem esse erro, a célula diz literalmente que o limite só é revelado ali — nunca uma barra falsa
  • O botão de teste ao vivo declara uma ferramenta de propósito, porque medir com prompt trivial mente — e não grava telemetria: é diagnóstico, não uso
Fonte única

Calendário de vencimentos

Em que dia cai cada guia do mês, já ajustada por fim de semana e feriado — e é a mesma fonte que o assistente lê.

  • As datas vêm todas do servidor e a tela só agrupa por dia: enquanto a tela fazia a própria conta, ela podia dizer 20 e o assistente dizer 21
  • Calcula a Páscoa e dela deriva carnaval, Sexta-feira Santa e Corpus Christi, mais feriados nacionais, estaduais e municipais — e feriado municipal só desloca o vencimento daquela cidade
  • Quando a data foi deslocada, a linha diz de que dia ela saiu e por quê
  • O sino lê a mesma API e, se a chamada falhar, simplesmente cala: melhor calar que avisar a data errada

TI e operação

As telas que a TI usa para ver se a máquina está funcionando: acervo de certificados, conferência da captura de XML, log ao vivo, credenciais dos robôs e o inventário do que já foi automatizado.

Acervo

Certificados Digitais

Duas visões do acervo de certificados A1: quais estão vencendo, para cobrar a renovação, e a saúde da sincronização vinda da pasta de rede.

  • Cinco faixas de urgência alimentadas por um snapshot recalculado todo dia, rotuladas por duração e não por dia de calendário, para não contradizer a data exibida
  • Detecta o formato antigo de arquivo, que não abre na versão atual da biblioteca do servidor e falharia em silêncio — e diz a correção concreta
  • Somente leitura por decisão: a tela detecta e lista; o conserto é reenviar o arquivo pelo cadastro, que já regrava no formato moderno
Esteira de XML

Conferência de captura

O placar da captura de XML: por rodada do robô, quanto a fonte dizia ter contra quanto foi de fato paginado e baixado.

  • Percentual por tipo de documento com semáforo por faixa e contagem de bloqueios por excesso de requisição
  • Segunda perna da esteira: compara chave por chave o que está no disco com o que entrou no ERP e devolve a lista para reimportar — a parte acionável
  • Coletor somente leitura, que não baixa XML nem escreve no banco do sistema legado, e publica um arquivo idempotente que a tela apenas lê
  • Os dois coletores são independentes: se o segundo não rodou, o resto da tela não cai
Diagnóstico

Logs

Console ao vivo do servidor dentro do sistema, para acompanhar uma rodada de robô sem entrar na máquina.

  • Buffer circular de 2.500 linhas em memória, sem persistência, ligado pela própria tela e começando desligado — não custa nada quando ninguém está olhando
  • Filtra ruído na origem: nunca captura healthcheck, polling de progresso nem o próprio painel de logs
  • Pausa quando a aba está oculta — era o único poll do app sem essa guarda, e um painel esquecido aberto batia continuamente com payload grande
Segredos

Configurações dos robôs

Onde um administrador cadastra, pela tela, a senha que um robô usa para entrar em outro sistema — tirando o segredo do sistema de arquivos do servidor.

  • A senha vai cifrada para o banco e nunca volta em leitura nenhuma, nem parcialmente mascarada; sai da memória da tela assim que o servidor confirma
  • O cabeçalho do arquivo é um postmortem: a senha era cifrada por um mecanismo amarrado à conta do sistema operacional e falhava em silêncio quando quem configurava e quem executava eram contas diferentes — sintoma idêntico a “nunca configurado”
  • Lista fixa de robôs conhecidos em vez de campo livre, porque um erro de digitação viraria um sintoma que ninguém liga à causa
  • Traduz erro de infraestrutura em instrução: um “não encontrado” que na verdade era tabela ausente virou o passo exato a executar
Comunicação

Comunicados

Agenda os pop-ups de novidade que aparecem no primeiro acesso do dia de cada usuário.

  • Agendamento por período, com cartão de texto ou carrossel de mídias, direcionado por setor
  • Prévia usando exatamente o mesmo componente de pop-up que o usuário vê
  • Painel de quem já leu cada comunicado, com a contagem no próprio botão
Base compartilhada

Situação das Empresas

Lista com a situação mais atual de cada empresa na contabilidade. Todo mundo lê; só quem tem a permissão edita ou importa.

  • Importação colando o texto do e-mail periódico, com o reconhecimento das seções e o casamento com a base do ERP feitos no servidor
  • Cada linha importada mostra como casou — por CNPJ, exata, nome curto ou aproximada — com cor por confiança
  • A sincronização usa a data de recebimento de cada mensagem, para não reverter toda madrugada o que alguém corrigiu ontem
Inventário

Controle de Automações

O que já foi automatizado no escritório, por setor e status: pronto, em andamento e pendente.

  • Barra de progresso colorida por faixa e exportação CSV
  • Base servida por endpoint com permissão dedicada, com as edições sobrepostas no navegador e botão de reverter
  • É um inventário mantido à mão, não uma medição feita pelo sistema — e a tela não finge o contrário
Embed autenticado

OCR de PDF

Suíte de manipulação de PDF que roda na rede do escritório — juntar, dividir, organizar, converter e OCR — embutida no sistema para o documento não sair dele.

  • Embutida por iframe com o token do próprio sistema, sem moldura duplicada e com o tema propagado ao vivo
  • A suíte devolve a altura do conteúdo para o quadro crescer e evitar rolagem dupla
  • Erro tratado com explicação e botão de nova tentativa, em vez de iframe em branco

Pessoal

Dois aplicativos internos que abrem a partir do menu em aba nova, usando a mesma regra de acesso do hub.

Admissão

Recruta

Automatiza a admissão de funcionário de ponta a ponta, a partir do pedido que chegou por e-mail.

  • O robô lê o pedido, separa os documentos da folha escaneada, manda o OCR do ERP ler e devolve a ficha preenchida para conferência
  • A chave é o identificador da mensagem: reabrir o mesmo e-mail atualiza a ficha, não cria uma segunda
  • Status em lista fechada no servidor, para barrar erro de digitação
Atalho autenticado

Gerador de relatórios

Aplicativo interno sobre a base do ERP contábil, aberto pelo menu do hub com a mesma regra de acesso.

  • Roda na rede do escritório; o que existe aqui é a entrada de menu com controle de permissão

Diferenciais

As decisões que custaram caro e por isso ficaram escritas

Nem todo problema aqui é de software. Vários são de consequência: um clique que inicia prazo legal, um número que vira recomendação a cliente, um dado velho que passa por atual. Estes doze pontos são onde a escolha óbvia teria sido a errada.

Um robô que sabe o que não pode fazer

No Domicílio Tributário Eletrônico, abrir uma mensagem equivale a dar ciência e inicia prazo legal irreversível — foi medido ao vivo que o portal estampa “Ciência Expressa” mesmo numa mensagem classificada como informativa. A automação óbvia, abrir tudo e extrair, seria a mais fácil de escrever e a mais cara de errar.

O sistema separa o monitor, que só lê a lista paginando, do único módulo que abre. E esse módulo tem quatro travas: um protocolo por vez; clique só na lupa cujo postback carrega exatamente aquele protocolo; reconferência da regra com a situação fresca do portal por cima do que o banco sabia; e um modo de ensaio que percorre todo o caminho parando exatamente antes do clique irreversível.

Arquitetura híbrida nuvem + on-premise, com fila e despachante

O serviço web roda em nuvem e não alcança o ERP nem a pasta fiscal da rede interna. Em vez de furar a rede, o fluxo foi invertido: a tela insere um job numa tabela, runners locais consomem em dois modos — residente ou esvazia-e-sai — e devolvem o resultado por upsert com chave única por empresa, tipo e mês, de forma que rodar o mês de novo atualiza em vez de duplicar. Coletores locais empurram dados para endpoints de ingestão dedicados, autenticados por token comparado em tempo constante.

Um despachante residente corta a espera acordando a tarefa agendada do Windows em vez de rodar o robô ele mesmo: assim quem impede duas execuções simultâneas é o próprio agendador, o processo nunca envelhece por manter módulos em memória, e se ele cair o sistema volta ao comportamento anterior, só mais lento. O ganho foi medido em 67 pedidos — 131 s → 3,6 s de espera (mediana)

Aritmética tributária em módulos puros, provada por 319 asserções

Todo o cálculo de Simples Nacional, Lucro Presumido, Lucro Real e da transição para IBS/CBS vive em módulos JavaScript sem React, sem requisição e sem data do sistema — a tela só coleta premissas e desenha. Isso permite executar a conta em Node e provar as regras contra as tabelas da lei: a partilha de cada faixa somando 100%, a trava do ISS reproduzindo os multiplicadores publicados, a relação entre a tabela de hoje e a de 2027, o crédito de estoque, a fronteira estrita de faixa.

São 319 asserções em 13 blocos — mais 16 de 16 campos conferidos contra a planilha de referência de um curso sobre a reforma. Uma divergência de imposto aparece no terminal, e não numa reunião com cliente.

Memória de cálculo auditável, com base legal em cada linha

Simuladores fiscais normalmente entregam um total. Aqui cada passo traz a fórmula com os operandos já substituídos e o dispositivo legal ao lado, no formato da análise que o escritório faz à mão, para o contador conferir contra a apuração dele.

A memória não recalcula nada: lê os valores que o motor devolveu, e a única multiplicação feita ali está declarada como exceção. Há registro no código de citações que apontavam para o parágrafo errado e foram corrigidas — inclusive uma que invertia o sentido da lei sobre crédito em compra de optante do Simples.

Três fontes em cascata para a mesma consulta

A consulta de pagamentos tem três caminhos: o portal oficial; um portal de histórico que exige navegador real, porque trava em requisição pura, e que gera um número de documento sintético e estável para o upsert continuar idempotente; e, por último, um sistema com captcha que consulta por estabelecimento, inclusive filial, com semáforo de um login por vez porque só roda quando os dois primeiros caem.

As três devolvem exatamente o mesmo formato — então quem grava não sabe, nem precisa saber, de onde o dado veio.

A mesma regra de acesso em três camadas

Esconder o botão não impede uma chamada direta à API. A permissão existe no navegador, para montar o menu; como dependência em cada endpoint; e num middleware que confere pelo prefixo da rota antes de qualquer handler rodar.

Sobre isso há uma segunda ideia: concessão e permissão efetiva são coisas diferentes. O que o administrador marcou fica gravado, mas o que não pertence ao setor da pessoa é podado ao montar a sessão — de modo que quem muda de setor não precisa ter permissões remarcadas uma a uma. A regra é coberta por um teste executável que roda o gate real contra fixtures reproduzindo as formas de perfil observadas no banco, inclusive um caso escrito para detectar se duas permissões vizinhas forem coladas por engano.

Credenciais e certificados como segredo — com o limite da proteção declarado

Senhas de robô e tokens de e-mail ficam cifrados em coluna do banco, com versão de chave para permitir rotação sem transformar linhas antigas em lixo silencioso. E o código declara o que a cifra não faz: ela não protege de quem tem a chave do servidor, protege de quem consegue uma cópia do banco.

O certificado A1 casa com a empresa pelo CNPJ lido de dentro do próprio certificado — extensão do padrão da ICP-Brasil —, aceitando matriz servindo filial pela raiz e travando quando a raiz difere; casar por nome de pasta trocaria certificado entre empresas em silêncio. Todo arquivo é re-serializado no formato moderno ao subir, porque o formato antigo não abre na biblioteca atual e a mensagem de erro parecia senha errada. A instalação na máquina do usuário passa por um token de tipo próprio, escopado a um CNPJ, válido por 180 s, uso único — e o agente local recusa host fora de uma lista confiável e confere que o CNPJ devolvido bate com o pedido.

Assistente de IA ancorado em dados, não na memória do modelo

A ferramenta de calendário fiscal é oferecida a todos, e sua descrição diz ao modelo que ele não sabe essas datas e nunca deve responder sem consultá-la. O retorno carrega uma instrução mandando declarar a procedência — calendário do escritório ou agenda oficial lida por automação, com a data da leitura —, explicar quando a data foi ajustada por feriado e admitir quando não achar.

As permissões são aplicadas dentro da ferramenta, não no prompt, e o resultado de empresa passa por um sanitizador que devolve lista fechada de campos e nunca senha. Num rodízio de modelos de dois fornecedores, ferramentas que devolvem dado de cliente sequer são declaradas ao provedor de terceiro — e assim que uma delas roda, a pergunta fica presa ao provedor original até o fim. Se não sobrar candidato, o assistente prefere responder “indisponível” a vazar histórico.

Roteador de modelos que decide pela causa do erro, sem sondagem

Reordenar por média de latência produz ping-pong quando os modelos estão separados por décimos de segundo; sondar periodicamente queima justamente a cota que o roteador existe para proteger. Em vez disso, o sistema usa o primeiro modelo cujo castigo já venceu.

Cada causa tem política própria: cota diária prende até a virada do dia no fuso do provedor; limite por minuto obedece ao tempo que o provedor pediu e não escala; instabilidade sobe uma escada com no máximo um degrau por ciclo; erro de requisição não gera castigo nenhum, porque o payload errado é nosso. O castigo é um timestamp absoluto que expira na leitura, para um reinício no minuto errado não deixar um modelo bloqueado o dia inteiro. E o limite de cota exibido no painel é aprendido do corpo do próprio erro do provedor — nunca chutado.

A recusa disciplinada de deduzir dado que o sistema não tem

O padrão da indústria é preencher a coluna com o palpite mais provável. Aqui a regra é o contrário, escrita em vários pontos independentes: acertar na maioria e errar calado é pior, porque erra justamente quando alguém foi conferir.

O tomador do frete é lido do campo do documento e nunca deduzido do CFOP. O Fator R sem folha informada devolve “não apurado” e nunca zero, que jogaria a empresa no anexo errado com cara de resultado. Premissas vindas do cadastro carregam a procedência campo a campo, com etiqueta amarela quando o valor foi calculado e não sabido. E ao trocar de empresa num simulador, o que era do caso de exemplo é apagado mesmo sem substituto — número de outra empresa com cara de dado é o erro mais caro possível numa recomendação.

Dado velho tratado como recurso de produto

O problema mais caro de um sistema alimentado por robô não é a coleta falhar — é falhar em silêncio e o dado velho passar por atual.

Três telas tratam isso como funcionalidade de primeira classe: o painel do DT-e traz quantas empresas foram verificadas nas últimas 24 horas, quantas falharam o login, quantas nunca foram verificadas e quantas estão sem senha, tendo como universo o cadastro e não o que o robô conseguiu ler; a conferência de XML compara, por rodada, quanto a fonte dizia ter contra quanto foi paginado; e a planilha de honorários carrega no topo, sempre visível, a data de cada uma das três coletas que a alimentam. Nos três casos, quando não há dado a tela diz isso — zero seria mentira.

Comentários em nível de postmortem, e um changelog dentro do produto

Os comentários não descrevem o que a linha faz: registram o defeito real, como foi diagnosticado, o que foi medido e por que a alternativa óbvia foi recusada. Um diagnóstico de redirecionamento infinito está no código com a data e o método — requisição real mais reprodução em navegador limpo. Um bug de fuso vem acompanhado da prova que o revelou: 77 de 133 jobs com data de atualização anterior à de criação.

Os commits seguem a mesma linha: 594 dos 778 têm corpo, somando mais de nove mil linhas de texto explicativo. E o changelog não é um arquivo no repositório — é uma tela aberta a todos, com o processo e a proibição de citar segurança interna escritos no topo.

Como foi construído

A stack, e o tipo de trabalho que cada parte exigiu

Frontend

  • React 18, só hooks
  • Sem biblioteca de rotas — roteamento por estado de view
  • Vite 5
  • Tailwind CSS 3 com tokens em variáveis CSS
  • Tema claro/escuro por classe
  • Recharts, lucide-react, date-fns
  • JavaScript ES modules, sem TypeScript

Backend

  • Python 3 + FastAPI + Uvicorn
  • Pydantic 2
  • APScheduler (cron e intervalo)
  • httpx, síncrono e assíncrono
  • 201 rotas no módulo principal
  • Filas de job e endpoints de ingestão máquina-a-máquina

Dados

  • PostgreSQL gerenciado (Supabase) com API REST gerada e object storage
  • SQL versionado por assunto: índices únicos, triggers e funções plpgsql
  • Camada de dados única com cache por TTL, lock e invalidação por prefixo
  • openpyxl — Excel com gráficos e formatação condicional
  • CSV com BOM para o Excel em português

Autenticação e segurança

  • JWT (HS256) com as permissões já podadas dentro do token
  • bcrypt com truncagem defensiva no limite de 72 bytes
  • Fernet para segredos em coluna, com versão de chave
  • OAuth 2.0 com escopo somente leitura e state assinado
  • Middleware de autorização por prefixo de rota

Automação e integrações fiscais

  • Playwright 1.59 — Chromium e Firefox (obrigatório em um dos portais)
  • BeautifulSoup4 + lxml para ViewState e postback de portais ASP.NET
  • zeep + signxml: SOAP no padrão ABRASF com assinatura XML-DSig
  • mTLS com certificado A1 nas APIs nacionais de distribuição
  • Captcha: OCR local e serviço pago alternando por tentativa, um servindo de fallback do outro
  • reportlab — documento auxiliar da nota gerado do XML

Inteligência artificial

  • Dois provedores de modelo, com adaptador de dialeto próprio
  • Function calling escopado por permissão
  • Roteador com política de castigo por causa do erro
  • Telemetria por tentativa
  • Base de conhecimento própria, com mapa de permissão por tópico

Infraestrutura e operação

  • Docker multi-stage: Node 20 no build do frontend, imagem oficial do Playwright no runtime
  • API e SPA na mesma origem
  • Deploy por blueprint versionado, com variáveis declaradas sem valor para não ficarem sem dono
  • Runners on-premise em Python e PowerShell, agendados pelo Windows
  • Notificação por mensagem instantânea e SMTP para alertas de prazo e de robô

Qualidade

  • 25 arquivos de teste escritos à mão (18 em Node, 7 em Python), executáveis sem framework, sem rede e sem banco
  • 319 asserções só na aritmética tributária
  • 8 páginas de prévia isolada, que montam uma tela sem login e sem backend, com payload de forma real e identificadores mascarados
  • Scripts de diagnóstico, reconciliação e conferência mantidos junto do código
  • Git e GitHub com fluxo de pull request

Frontend em React Tabelas de alto desempenho escritas à mão — colunas congeladas, autofiltro estilo Excel, larguras arrastáveis, paginação.

Automação web Engenharia reversa de portais públicos: paginação, ViewState e postback, captcha em cascata, seis plataformas municipais diferentes.

Webservices fiscais SOAP com assinatura XML-DSig, mTLS com certificado A1, cursor por NSU e respeito explícito ao limite de requisições do órgão.

Segurança aplicada Autorização em três camadas com poda por setor, cifra de segredos em banco, tokens efêmeros de uso único, freio de força bruta e trilha de auditoria.

Domínio tributário Leitura da lei, transcrição de tabelas célula a célula com verificação de dispositivo revogado e conferência contra apurações reais.

Modelagem de dados Schemas versionados por assunto, chaves únicas que tornam a reexecução idempotente, upsert que omite colunas de propósito, políticas de retenção.

Engenharia de dados Cruzamento entre guia enviada e pagamento registrado, entre nota emitida e guia cobrada, entre o que o robô baixou e o que entrou no ERP.

Confiabilidade Teto global de navegadores adotado em 12 módulos, watchdogs que avisam quando uma rotina não rodou, logs em memória com filtro de ruído.

Integração com LLMs Function calling escopado por permissão, adaptador entre dois dialetos de provedor e isolamento de dado sensível entre fornecedores.

DevOps Docker multi-stage, blueprint de deploy comentado, runners e agentes on-premise em PowerShell agendados no Windows.

Escrita técnica e de produto Documentação redigida como diagnóstico com dados, e changelog publicado dentro do sistema em linguagem de quem usa.

Quem fez

Três desenvolvedores, um sistema em produção

Do primeiro commit ao deploy diário: interface, backend, banco, robôs, regra tributária, segurança e operação. Sem separação rígida de frentes — cada um passou por todas.

Breno Araujo Desenvolvedor
João Sousa Desenvolvedor
Levi Gabriel Desenvolvedor

Overclock Web · Criação de sites

Falar no WhatsApp (71) 98402-3152 · @overclockweb · portfólio · início