Balcão de Atendimento
em produçãoAgendamento e prova de atendimento
Plataforma full-stack que agenda ~110 escolas em 200 vagas presenciais e transforma cada atendimento em prova auditável para órgãos de controle. Construída e publicada sozinho.
- Next.js
- TypeScript
- PostgreSQL
- Drizzle ORM
- Tailwind
- Docker
● O repositório público é uma versão de demonstração com dados fictícios — a instância de produção é interna.
// o caso
- problema
- As escolas afirmavam aos órgãos de controle que não eram orientadas sobre como prestar contas de recursos federais; a secretaria afirmava que orientava. Faltava prova para os dois lados.
- solução
- Cada atendimento vira um registro imutável, com autor e data — correções entram como adendo assinado, nunca sobrescrevendo o original. As escolas agendam por um link com token assinado, sem senha; coordenação e analistas têm seus próprios perfis.
- impacto
- Em produção. As regras que importam moram no banco, não só na aplicação: índices únicos parciais tornam impossível uma vaga dobrada. Publicado em um banco corporativo compartilhado, atrás de um proxy reverso que eu não controlava.
// meu papel
Desenvolvedor único — do levantamento de requisitos e da modelagem de dados até a publicação em produção, incluindo a integração com as equipes de banco de dados e de infraestrutura do órgão.
// visão geral
Três perfis dividem o mesmo sistema. A coordenação administra o mutirão; as analistas conduzem o balcão do dia a dia; as escolas agendam por um link próprio — sem senha, porque o token assinado na URL já as identifica. Uma única tela cobre agendar, acompanhar, remarcar, cancelar e baixar o relatório do atendimento.
O trabalho foi de ponta a ponta: modelagem de dados, regras de negócio, portal público, geração de PDF no servidor para o termo de comparecimento e o relatório do atendimento, e a publicação em si — em um banco corporativo compartilhado, atrás de um proxy reverso, numa infraestrutura que eu não controlava.
// notas de engenharia
Integridade como prova
As regras que importam moram no banco, não só na aplicação: índices únicos parciais tornam uma vaga dobrada — ou uma escola com dois agendamentos ativos — impossível, não apenas improvável. Registro concluído é imutável; a correção entra como adendo assinado com autor e data.
Acesso público sem senha
O link da escola é um HMAC que carrega a própria validade e finalidade. Sem conta para criar, sem senha para perder — e sem como enumerar escolas por nome ou CNPJ.
Publicar numa infraestrutura que eu não controlava
A aplicação lê o banco de uma única variável e resolve o schema por search_path; roda sob basePath quando servida em subcaminho; e trata bancos em LATIN1 convertendo a pontuação tipográfica que o encoding recusaria. Cada uma dessas decisões só apareceu na hora de publicar, atrás de um proxy reverso corporativo.
Documentação como parte da entrega
Stack, fluxo do usuário, regras de negócio e diagrama do banco são versionados junto ao código — para que a próxima pessoa a mexer nele não precise fazer engenharia reversa do raciocínio.