O problema
Sebos e livrarias de pequeno porte costumam controlar estoque e caixa em planilha ou em caderno — o que funciona até o acervo passar de algumas centenas de itens. Sistemas de PDV prontos no mercado geralmente são genéricos demais (feitos para varejo comum, sem noção de "livro" como tipo de item) ou caros demais para o porte de um sebo pequeno. O BookCase nasceu para preencher esse meio-termo: um sistema simples, direto e barato de operar, pensado especificamente para o dia a dia de um sebo.
Arquitetura
O backend é em Flask, com PostgreSQL como banco relacional e nginx como reverse proxy na frente da aplicação. A stack toda roda numa VPS que administro diretamente — escolha que detalhei em outro artigo sobre como escolhi o provedor — o que me obrigou a cuidar de firewall, deploy e backup do banco por conta própria, sem depender de uma plataforma gerenciada.
Optei por Flask em vez de um framework mais "batteries included" porque o escopo do sistema é bem definido (estoque, cadastro e caixa) e eu queria controle fino sobre as rotas e sobre como o banco é modelado, sem carregar funcionalidades que não seriam usadas.
Estoque e cadastro de livros
O módulo de estoque foi desenhado em torno de duas telas principais: entrada de livros e listagem de livros. Na entrada, defini quais campos são obrigatórios no cadastro — sendo a prateleira o único que precisa ser parametrizado antes, para manter a localização física do item consistente com o que está no sistema. Na listagem, o usuário pesquisa e filtra por critérios como "sem estoque", o que evita o problema clássico de tentar vender algo que já saiu do acervo.
Também adicionei suporte a categorias personalizadas, para que cada sebo organize o acervo do seu próprio jeito em vez de seguir uma taxonomia fixa que eu tivesse decidido de antemão — livro raro, livro didático, HQ, cada operação tem sua própria lógica de organização.
Caixa e ponto de venda
O caixa funciona como um PDV simples: busca de item por nome ou título, adição ao carrinho e finalização da venda. O ponto que exigiu mais cuidado foi garantir que uma venda concluída baixe o estoque automaticamente — sem isso, as duas telas (estoque e caixa) divergem em poucos dias de uso real, e a confiança no sistema desaba. Toda venda também é registrada na tela de movimentações de caixa, com valor, data, quantidade de itens e usuário responsável, filtrável por período — o que dá ao dono do sebo uma visão de fechamento de caixa sem precisar de planilha paralela.
Desafios técnicos
- Consistência estoque × vendas: modelar a baixa de estoque como parte da mesma transação da venda, para não deixar o banco em estado inconsistente se algo falhar no meio do processo.
- Cadastro flexível: livros e produtos genéricos (marcadores, acessórios) precisavam conviver no mesmo fluxo de estoque e caixa sem duplicar lógica.
- Deploy e operação própria: como a aplicação roda numa VPS administrada por mim, tive que configurar nginx, SSH com chave, backup do PostgreSQL e atualizações de segurança — a mesma disciplina que aplico monitorando ambientes críticos no trabalho, só que do outro lado, como responsável pela infraestrutura.
Resultado
O BookCase está em produção em bookcase.montiqtech.com.br, cobrindo o ciclo completo de um sebo pequeno: cadastro e entrada de livros, controle de estoque por categoria e prateleira, e caixa com histórico de movimentações. É o projeto onde mais claramente uni as duas partes do que eu faço — escrever a aplicação e manter a infraestrutura em que ela roda.
Próximos passos
Os pontos que pretendo evoluir: relatórios de vendas por período mais completos, controle de usuários com permissões por função, e testes automatizados cobrindo o fluxo de venda + baixa de estoque, que hoje depende principalmente de teste manual antes de cada deploy.