Controle de mercadoria em múltiplos estoques físicos, com entrada, baixa, transferência entre estoques, entrada por Nota Fiscal e composição de produtos em pacotes e kits.
Construir um sistema de controle de estoque que opere com múltiplos estoques físicos dentro de uma mesma empresa. O sistema permite entrada, baixa e transferência de mercadoria entre estoques, entrada de mercadoria a partir de Nota Fiscal eletrônica e o controle de produtos compostos, em que uma unidade de venda agrupa várias unidades de um produto base.
Todo saldo é mantido por produto e por estoque. Toda alteração de saldo gera um registro rastreável de movimentação, o kardex.
| Termo | Definição |
|---|---|
| Estoque físico | Local que armazena mercadoria: matriz, filial ou centro de distribuição. |
| Produto / SKU | Item controlado, identificado por código único. |
| Produto simples | Item vendido e estocado em sua unidade básica. Exemplo: 1 bombom. |
| Bundle / Kit | Produto composto por uma ou mais unidades de outros produtos. Exemplo: 1 pacote com 12 bombons. |
| Componente | Produto que entra na composição de um bundle. |
| Saldo | Quantidade de um produto em um estoque específico. |
| Entrada / Baixa | Movimentação que aumenta ou reduz o saldo de um estoque. |
| Transferência | Movimentação que reduz o saldo na origem e aumenta no destino. |
| Montagem / Desmontagem | Conversão de saldo entre um bundle e seus componentes. |
| Kardex | Histórico cronológico das movimentações. |
| Estoque mínimo | Quantidade abaixo da qual o produto entra em alerta. |
Papéis e permissões finais a alinhar. O escopo prevê controle de acesso por papel.
warehouse| Campo | Tipo | Obrigatório | Observação |
|---|---|---|---|
| id | identificador | sim | chave primária |
| nome | texto | sim | "Matriz São Paulo" |
| codigo | texto | sim | código curto único, "SP-01" |
| tipo | enum | sim | Matriz, Filial, Centro de Distribuição |
| cidade / uf | texto | não | |
| capacidade | inteiro | não | indicador de ocupação |
| ativo | booleano | sim | estoque inativo não recebe movimentação |
product| Campo | Tipo | Obrigatório | Observação |
|---|---|---|---|
| id | identificador | sim | |
| sku | texto | sim | único |
| nome | texto | sim | |
| tipo | enum | sim | simples ou bundle |
| categoria | texto | não | |
| unidade | texto | sim | UN, PCT, CX, KIT |
| custo | decimal | não | custo médio para valoração |
| estoque_minimo | inteiro | não | base do alerta |
| controla_estoque_proprio | booleano | condicional | só para bundle. Ver seção 5.7 |
| ativo | booleano | sim |
bundle_componentDefine de quais produtos e em que quantidade um bundle é formado. Um bundle tem uma ou mais linhas de composição.
| Campo | Tipo | Obrigatório | Observação |
|---|---|---|---|
| bundle_id | identificador | sim | produto pai, tipo bundle |
| componente_id | identificador | sim | produto componente |
| quantidade | inteiro | sim | unidades do componente por unidade do bundle |
Exemplo: o pacote de bombom é um produto bundle com uma linha de composição: componente "Bombom", quantidade 12.
stock_balance| Campo | Tipo | Obrigatório | Observação |
|---|---|---|---|
| product_id | identificador | sim | |
| warehouse_id | identificador | sim | |
| quantidade | inteiro | sim | chave composta produto + estoque |
O saldo é resultado calculável das movimentações. Manter o saldo materializado para leitura rápida e reconstruível a partir do kardex para auditoria.
stock_movement| Campo | Tipo | Obrigatório | Observação |
|---|---|---|---|
| id | identificador | sim | |
| tipo | enum | sim | entrada, baixa, transferencia, nota_fiscal, montagem, desmontagem |
| product_id | identificador | sim | |
| quantidade | inteiro | sim | sempre positiva; o tipo define o efeito |
| warehouse_origem | identificador | condicional | baixa e transferência |
| warehouse_destino | identificador | condicional | entrada, transferência e NF |
| documento | texto | não | pedido, OS, número da NF |
| motivo | texto | não | classificação do movimento |
| ref_movimentacao | identificador | não | agrupa lançamentos de uma mesma operação (montagem, transferência, estorno) |
| usuario_id / data_hora | — | sim | gerados pelo sistema |
Movimentações são imutáveis. Correção de erro acontece por movimentação de estorno, nunca por edição ou exclusão.
invoice e item invoice_item| Campo | Entidade | Observação |
|---|---|---|
| numero, chave_acesso, fornecedor | invoice | dados do cabeçalho da NF-e |
| warehouse_destino | invoice | estoque que recebe os itens |
| status | invoice | rascunho, conferida, lançada |
| sku_nf, descricao_nf | invoice_item | cProd e xProd do XML |
| quantidade, custo_unitario | invoice_item | qCom e vUnCom do XML |
| product_id | invoice_item | vínculo ao produto; nulo quando SKU novo |
Criar, editar e inativar estoques. Listagem com unidades e ocupação por estoque.
Criar, editar e inativar produtos simples e bundles. Visão de saldo do produto em cada estoque.
O operador escolhe o estoque de destino, o produto, a quantidade, o documento e o motivo. O sistema soma a quantidade ao saldo e grava uma movimentação Entrada.
O operador escolhe o estoque de origem, o produto, a quantidade, o documento e o motivo. O sistema subtrai do saldo e grava uma movimentação Baixa.
O operador escolhe origem, destino, produto e quantidade. O sistema executa as duas pontas de forma atômica e grava uma movimentação Transferência que registra origem e destino.
O operador informa o estoque de destino e os dados da nota, importa o XML da NF-e e confere os itens extraídos. Ao confirmar, o sistema dá entrada de cada item no estoque de destino, gerando uma movimentação Nota fiscal por item, vinculada à nota.
O sistema entende que 1 bombom e 1 pacote de bombom são unidades diferentes do mesmo material. O pacote é um produto bundle cuja composição aponta para o bombom com um fator de conversão.
Cada bundle pode operar em um de dois modos, definidos pelo campo controla_estoque_proprio:
A montagem gera uma movimentação Montagem que agrupa, sob o mesmo ref_movimentacao, a baixa do componente e a entrada do bundle. A desmontagem é o inverso.
Painel com totais: SKUs ativos, unidades em estoque, valor em estoque a custo e quantidade de produtos abaixo do mínimo. Visão por estoque físico e por produto. Para bundles virtuais, exibir o saldo equivalente em pacotes calculado a partir do componente.
Histórico cronológico com filtro por tipo, produto, estoque e período. Produto cujo saldo total fica menor ou igual ao estoque mínimo entra em alerta.
Itens podem entrar em fases seguintes mediante novo escopo.