Estoque / Almoxarifado
Almoxarifado por obra, custo médio ponderado automático, requisições internas, transferências, inventário ABC
Quando usar
Cada obra decide se opera com almoxarifado:
- Sem almoxarifado → entrega direta na frente. Recebimento = consumo.
- Com almoxarifado → padrão para obras médias/grandes. Material entra como estoque, frente de obra solicita via RI.
Onde acessar
Sidebar Execução → Estoque ou direto /projects/[id]/estoque.
Hub com 5 tabs: Saldos | Movimentos | Requisições | Inventário | Almoxarifados.
Setup inicial (uma vez)
tab Almoxarifados → "Novo almoxarifado":
- Código (ex: ALM-01)
- Nome (ex: Almoxarifado Central)
- Localização
- Toggle "Permite saldo negativo" (não recomendado — só ativar para casos específicos)
Após criado, edite o PO e associe almoxarifado_destino_id. A entrada no estoque é automática quando o recebimento é aprovado.
Custo médio ponderado (CMP)
Calculado por trigger PostgreSQL com FOR UPDATE lock anti-concorrência:
Entrada
novo_CMP = (qtd_atual × CMP_atual + qtd_entrada × custo_entrada) / (qtd_atual + qtd_entrada)Saída
CMP não muda. Saldo apenas decrementa. Saídas usam o CMP atual para cálculo do CMV.
Saldo zero reseta CMP para 0 (próxima entrada define novamente).
Tipos de movimento (9)
| Tipo | Quando |
|---|---|
entrada_compra | Recebimento aprovado de PO |
entrada_devolucao | Cliente devolve item (raro em construção) |
entrada_transferencia | Transferência de outra obra (par com saida_transferencia) |
entrada_ajuste | Ajuste de inventário positivo |
saida_consumo | RI atendida (consumo na obra) |
saida_devolucao | Devolução ao fornecedor |
saida_transferencia | Saída para outra obra |
saida_ajuste | Ajuste de inventário negativo |
saida_perda | Perda registrada (com motivo obrigatório) |
Saldos
tab Saldos: lista por (almoxarifado, insumo). Exibe:
- Quantidade
- Custo médio unitário
- Valor total (computed)
- Ponto de pedido (gera alerta visual quando saldo cai abaixo)
- Última movimentação
- Botões inline: Transferir / Inventariar
Filtros: por almoxarifado, "abaixo do ponto de pedido".
Requisições Internas (RI)
Frente de obra solicita material ao almoxarife.
Criar RI
tab Requisições → "Nova RI":
- Almoxarifado origem
- Tarefa do cronograma (rastreabilidade)
- Prioridade (alta / média / baixa)
- Justificativa (mínimo 5 chars)
- Itens (insumo + qtd)
Aprovação
Status inicial: aguardando_aprovacao. Aprovador é o gerente — clica "Aprovar" na lista.
Regra: solicitante ≠ aprovador. Se solicitante for gerente, aprovação escala para o nível acima.
Atender
Almoxarife atende quando o material está separado fisicamente:
- Botão "Atender" abre dialog com campo de quantidade por item (pré-preenchido com restante)
- Sistema cria
saida_consumono estoque automaticamente (CMP atual) - Atualiza
quantidade_atendidado item da RI - Status final:
atendida(todos completos) ouparcialmente_atendida
Vinculação contábil
Cada saída de consumo marca:
tarefa_cronograma_id(da RI)arvore_item_id(do nó orçamentário)
Isso permite saber, ao fim de cada etapa do cronograma, quanto custou efetivamente em material.
Transferências entre almoxarifados/obras
Botão de transferência em qualquer linha de saldo:
- Selecione destino, quantidade
- Sistema cria 2 movimentos pareados (saída + entrada) com mesmo
movimento_pareado_id - Custo médio do origem é preservado no destino
Atomicidade: se a entrada destino falha, sistema gera movimento compensatório entrada_ajuste no origem para reverter automaticamente.
Ajuste de inventário
Quando contagem física diverge do sistema:
- Botão "Inventariar" num saldo abre dialog
- Informa quantidade real (do físico)
- Sistema calcula diferença e gera
entrada_ajusteousaida_ajuste - Motivo obrigatório (mínimo 10 chars — perda, quebra, achado, contagem errada anterior)
- Atualiza
ultimo_inventario_ateultimo_inventario_diferencano saldo
Inventário rotativo (curva ABC)
tab Inventário: lista todos os saldos do empreendimento classificados por curva ABC pelo consumo financeiro dos últimos 12 meses:
| Classe | Critério | Frequência recomendada |
|---|---|---|
| A | Top 80% do gasto | Mensal |
| B | 80%–95% | Trimestral |
| C | 95%–100% | Semestral |
Trigger automático marca itens com inventário vencido. KPIs no topo: total / A / B / C / vencidos.
Filtro "Apenas vencidos" para focar.
Botão "Inventariar" rápido por item.
Integração com recebimento
Quando recebimento é aprovado:
- Function
gerar_entrada_compra_recebimento(p_recebimento_id)é chamada - Para cada item aceito com insumo, cria
entrada_compra - Idempotente — verifica se já há movimentos para o recebimento antes de criar
Se recebimento foi divergente e aprovado depois, a entrada acontece quando o approval recebimento_divergente é resolvido (callback dispara a function).
Inventário no balanço (CMV)
Relatório mensal de movimentações é a base do CMV (custo das mercadorias vendidas) na DRE da incorporadora.
Inventário valorizado por obra — listagem para fechamento contábil.
Permissões
| Permissão | Escopo | Default |
|---|---|---|
compras_estoque:read | project | Todos exceto comercial |
compras_estoque:write | project | engenheiro+ (movimentações, RIs, transferências) |
compras_estoque:manage | project | gerente+ (configurar almoxarifado, ajustes de inventário) |