
Sistema de gestão fiscal e estoque
| Área | Gestão e integração |
|---|---|
| O que faz | Antes, dois vendedores fechavam a mesma peça. Agora o sistema reserva o estoque e emite a nota fiscal. |
| Funções | Nota fiscal automática · Estoque em tempo real · Impostos calculados |
| Habilidades | Levantamento de processo · Design de telas · Integração com SEFAZ · Integração bancária |
O que o sistema cobre.
Cobre a venda de ponta a ponta: pedido, reserva de estoque, cálculo de impostos, emissão da nota fiscal, baixa do estoque com custo médio, cobrança bancária e fechamento do mês com geração dos arquivos do SPED. Atende grupos com mais de uma empresa ou filial e serve às áreas comercial, estoque, fiscal e financeira em um único sistema.
Para quem
Comércio e indústria de médio porte, com mais de uma empresa ou filial, que emitem nota fiscal e apuram ICMS.
O que mudou na empresa
Ninguém mais vende sem saldo, a nota sai mesmo com a SEFAZ fora do ar, o retorno do banco baixa os títulos sozinho e o mês fechado não é mais refeito na mão.
Módulos e funções.
8 partes do sistema, cada uma com o que faz.
Pedido de venda
Confere preço, condição de pagamento e limite de crédito da filial antes de tocar no estoque.
Reserva de estoque
Segura o saldo por filial e depósito, com dono, prazo e motivo; vencida, devolve sozinha.
Cálculo de impostos
CFOP, ICMS-ST, alíquota e IBS/CBS por regime tributário, em cadastro com data de vigência.
Emissão de nota fiscal
Assina e envia a NF-e à SEFAZ; reenvio nunca gera nota duplicada.
Contingência da SEFAZ
SEFAZ fora do ar: a nota sai pela contingência e é transmitida quando o serviço volta.
Baixa e custo médio
A saída consome a reserva e recalcula o custo médio por empresa e filial, com histórico.
Cobrança e conciliação
Remessa ao banco e baixa dos títulos pelo retorno; o que não casa fica em exceção.
Fechamento e SPED
Mês fechado só aceita estorno com autor e motivo; gera EFD ICMS/IPI, Contribuições e ECD.
Três telas.
O design é meu. Cada legenda diz o que a tela faz.



Como funciona por dentro.
Dois vendedores, a última peça, um clique cada. Quem leva decide o banco de dados, não a tela.
- Pedido de vendaValida preço, condição de pagamento e limite de crédito da filial. Nenhum saldo é tocado ainda.
- Reserva de saldoSELECT FOR UPDATE na linha de saldo por empresa, filial, depósito e SKU, sempre na mesma ordem de SKU. A reserva nasce com dono, prazo e motivo; expirou, um job devolve o saldo e registra o evento.
- Motor fiscalResolve CFOP, CST ou CSOSN por regime tributário, base de cálculo, ICMS-ST por MVA e os grupos de IBS e CBS da transição. Tudo por vigência.
- Emissão da NF-eXML assinado e evento no outbox, na mesma transação da venda. Envio assíncrono; o retorno grava pela chave de acesso e reenvio nunca gera segunda nota.
- ContingênciaSEFAZ origem fora do ar: SVC-AN ou SVC-RS conforme a UF, e a autorização na SVC já é definitiva. Sem SVC alcançável, EPEC: o DANFE sai e a fila transmite a nota quando o autorizador volta.
- Baixa e custoA saída consome a reserva na mesma transação. Custo médio móvel recalculado por empresa e filial (estabelecimento), com trilha do movimento.
- Financeiro e conciliaçãoTítulo vira remessa CNAB 240. O retorno concilia e baixa pelo nosso número; o que não casa fica em fila de exceção, não baixa no chute.
- Escrituração e SPEDCompetência fechada vira somente leitura. EFD ICMS/IPI, EFD Contribuições e ECD são montados a partir da partição fechada, validados por layout e assinados com o A1. Retificar é gerar arquivo novo.
O problema e a saída.
O problema
Vender parece simples até dois pedidos disputarem a última peça. O sistema promete estoque que não tem, a NF-e sai com CFOP errado, o retorno do banco não bate e alguém reprocessa o mês inteiro no braço para fechar o balanço.
A saída
Um núcleo transacional: reserva de saldo com lock de linha, emissão fiscal idempotente pela chave de acesso e competência que fecha e vira somente leitura. Depois do fechamento, correção é estorno com autor e motivo, e SPED retificador.
Tecnologias e o porquê.
| Camada | Escolha | Por quê |
|---|---|---|
| Banco de dados | PostgreSQL 16, particionado por empresa e competência | Movimento de estoque e razão crescem por mês e quase nunca são lidos fora da própria competência. Partição por empresa e competência deixa o índice quente pequeno, faz o fechamento e a montagem do SPED varrerem só a partição do período e transforma expurgo em DETACH em vez de DELETE em massa. |
| Numeração fiscal | Sequência por série em tabela, com lock de linha | Sequence do Postgres não serve: ela avança fora da transação e deixa buraco na numeração, o que o fisco não aceita. A série tem linha própria e é travada no momento da emissão, serializa por série, não pelo banco inteiro. |
| Aplicação | Java 21 e Spring Boot 3, transação curta e explícita | Reserva, baixa e escrituração exigem controle fino de fronteira transacional e de nível de isolamento. Transação declarada no caso de uso, nunca no repositório, mantém o lock de saldo aberto por milissegundos e não pelo tempo de uma chamada externa. |
| Integração SEFAZ | Cliente SOAP próprio, XMLDSig, certificado A1 em cofre | Layout de NF-e muda por nota técnica e a transição IBS/CBS mexeu no XML inteiro. Cliente próprio deixa o schema versionado junto do código e testável contra homologação, com os endpoints de SVC-AN, SVC-RS e EPEC no mesmo cadastro. O A1 fica em cofre, assinatura sob demanda, sem certificado espalhado em servidor. |
| Mensageria | RabbitMQ com padrão outbox transacional e DLQ | O evento de emissão é gravado na mesma transação do pedido e da baixa. O publicador lê o outbox depois. Se a SEFAZ demora ou o broker cai, nada se perde e nada duplica; o que estoura a política de retry cai na DLQ com o payload inteiro para reprocesso manual. |
| Interface | React e TypeScript, grid virtualizada e filtro indexado | O usuário de retaguarda vive em grid de milhares de linhas: monitor de NF-e, títulos em aberto, movimento de estoque. Virtualização segura o scroll sem paginar. Filtro salvo fixa um conjunto pequeno de predicados por usuário e filial, e é para eles que os índices dessas telas são projetados, em vez de para consulta livre. |
Decisões de projeto.
Lock pessimista na reserva, não otimista
FOR UPDATE serializa a linha do saldo. Ninguém vende o que não existe. O preço é contenção no pico e deadlock em pedido multi-item, contornado travando os SKUs em ordem determinística.
Regra fiscal em tabela, não em código
MVA, alíquota, CFOP e CST por regime tributário viram cadastro versionado por vigência. O cadastro fica pesado e exige teste de regressão fiscal; em troca mudança de norma não vira deploy.
Período fechado só aceita estorno
Nada de UPDATE em movimento escriturado. O razão cresce e o relatório fica caro; em troca balancete e custo médio batem em qualquer data, e o SPED do período vira arquivo retificador.
Escopo.
O que o sistema cobre
- O fluxo de 8 passos e as decisões acima.
- As três telas desta página.
O que não está publicado
- Nome da empresa e números de operação não são divulgados aqui.
- O código não é público. O que dá para ver: o processo, as telas e as decisões.
Da mesma faixa.
Gestão e integração
Quer ver este sistema de perto?
Mostro o processo que mudou, os módulos, as telas e como foi construído.

