Pular para o conteúdo principal

Rotina: Estoque e Movimentação

Saldo de estoque por item/local, movimentações, inventário, transferência entre filiais e custo médio.


Módulos Delphi​

ArquivoPapel
source/CEQ001/UCEQ001.pasConsulta de estoque, saldo, lotes, grades, série
source/CEQ001/UdmCEQ001.pasDataModule (31 KB) — queries principais
source/MEQ001/UMEQ001.pasConfiguração de parâmetros de estoque
source/MEQ001/UdmMEQ001.pasDataModule de parâmetros
source/JunsoftEstoque/UfrmPrincipal.pasApp standalone de movimentação

Tabelas do Banco de Dados​

ESTOQUE — Saldo Consolidado​

DDL: docs/schema/tables/ESTOQUE.sql Chave primária: (CD_EMPRESA, CD_ITEM, CD_TIPOLOCAL, CD_LOCAL)

Esta é a tabela de saldo consolidado. O histórico detalhado está em MOVESTOQUE.

CampoTipoDescrição
CD_ITEMINTEGERProduto (FK → ITEM)
CD_TIPOLOCALINTEGERTipo de local (FK → TIPOLOCAL)
CD_LOCALINTEGERLocal físico (FK → LOCALESTOQUE)
QT_ESTOQUENUMERIC(15,5)Saldo atual (5 casas decimais para granel/peso)
VL_ESTOQUENUMERIC(15,2)Valor total em estoque
VL_PRECOMEDIONUMERIC(15,4)Preço médio ponderado
VL_CUSTONUMERIC(15,4)Custo unitário atual
VL_ULTIMOCUSTONUMERIC(15,4)Último custo de entrada
QT_ALTERNATIVANUMERIC(15,3)Quantidade em unidade alternativa
DT_MOVIMENTODATEData do último movimento
DT_REGISTROTIMESTAMPData de criação do registro

MOVESTOQUE — Movimentação Detalhada (Trilha de Auditoria)​

DDL: docs/schema/tables/MOVESTOQUE.sql Chave primária: (NR_LANCAMENTO, CD_EMPRESA)

CampoTipoDescrição
NR_LANCAMENTOINTEGERSequencial do movimento (PK)
CD_ITEMINTEGERProduto
CD_TIPOLOCAL, CD_LOCALINTEGERLocal de estoque
CD_OPERACAOINTEGERTipo de operação (FK → OPERACAO)
CD_HISTORICOINTEGERCentro de custo / conta analítica
TP_DOCUMENTOVARCHAR(2)'NF'=Nota Fiscal, 'OP'=Ordem Produção, 'OS'=OS, 'RQ'=Requisição, 'TR'=Transferência
NR_DOCUMENTOINTEGERNúmero do documento de origem
NR_LANCTONOTAINTEGERLançamento da NF relacionada
CD_SERIEVARCHAR(4)Série da NF
TP_NOTACHAR(1)Tipo da NF (E/S/D)
DT_LANCAMENTODATEData do movimento
QT_ESTOQUENUMERIC(15,5)Quantidade movimentada (+entrada / -saída)
VL_ESTOQUENUMERIC(15,2)Valor movimentado
VL_CUSTONUMERIC(15,4)Custo unitário no momento
PS_ESTOQUENUMERIC(15,5)Saldo antes do movimento (para rastreio)
ST_CANCELAMENTOCHAR(1)'N'=Normal, 'C'=Cancelado
ST_BLOQUEADOCHAR(1)'S'/'N'
NR_PLACAVARCHAR(7)Placa do veículo (para controle de frotas)
NR_LOTEINTEGERLote do produto
NR_ORDEMPRODUCAOINTEGEROrdem de produção relacionada
CD_EMPRORIGEMINTEGEREmpresa de origem (transferências)
CD_USUARIOVARCHAR(5)Usuário que registrou
DS_OBSERVACAOVARCHAR(240)Observações

LOCALESTOQUE — Locais Físicos​

DDL: docs/schema/tables/LOCALESTOQUE.sql Chave primária: (CD_LOCAL, CD_TIPOLOCAL)

CampoTipoDescrição
DS_LOCALVARCHAR(60)Descrição do local
TP_LOCALCHAR(1)'E'=Estoque, 'C'=Consignação, 'T'=Trânsito
ST_INVENTARIOCHAR(1)'S' = participa do inventário
CD_PESSOAINTEGERPessoa associada (para consignação)

INVENTARIO — Contagem Física​

DDL: docs/schema/tables/INVENTARIO.sql Chave primária: (CD_EMPRESA, DT_INVENTARIO, CD_ITEM)

CampoTipoDescrição
DT_INVENTARIODATEData da contagem
QT_TOTALNUMERIC(15,5)Quantidade física contada
VL_CUSTONUMERIC(15,4)Custo unitário na data
VL_TOTALNUMERIC(15,2)Valor total contado
TP_INVENTARIOCHAR(1)'E'=Estoque próprio, 'C'=Consignação
PC_ICMSNUMERIC(5,2)ICMS do produto para valoração fiscal
PC_IPINUMERIC(5,2)IPI para valoração

ROMANEIO — Expedição​

DDL: docs/schema/tables/ROMANEIO.sql Chave primária: (CD_EMPRESA, NR_ROMANEIO)

CampoTipoDescrição
CD_PESSOAINTEGERCliente ou transportador
DT_ROMANEIODATEData de expedição
ST_ROMANEIOCHAR(1)'V'=Venda, 'D'=Devolução
VL_PRODUTOSNUMERIC(15,2)Valor dos produtos expedidos
VL_SERVICOSNUMERIC(15,2)Valor de serviços
CD_MUNICIPIOINTEGERMunicípio de destino
DT_EXECUCAODATEData de execução
DT_PREVISTADATEData prevista de entrega

ROMANEIOITEM: itens expedidos — (CD_EMPRESA, NR_ROMANEIO, NR_SEQUENCIAL)


Parâmetros (PARMESTOQUE)​

DDL: docs/schema/tables/PARMESTOQUE.sql — um registro por empresa.

ParâmetroTipoEfeito quando ativo
ST_CUSTONEGATIVOS/N'S' = permite saldo negativo; 'N' = bloqueia ou alerta
TP_VALIDACAOESTNEG—'A'=Aborta a operação, 'B'=Bloqueia com mensagem
ST_COMPROMETIDOS/N'S' = controla estoque comprometido (separação por pedido)
ST_COMPROMETIDOCOMPRAS/N'S' = compromete estoque em pedidos de compra
TP_CUSTOESTOQUE—'M'=Preço médio, 'F'=FIFO, 'L'=Último custo
ST_TRANSFEMPRESASS/N'S' = permite transferência entre filiais
ST_PRODUCAOS/N'S' = habilita módulo de produção
ST_PRODUCAOLOTES/N'S' = controla lotes na produção
ST_AJUSTACUSTONEGATIVOS/N'S' = ajusta custo automaticamente quando negativo

Operações padrão configuradas em PARMESTOQUE:

CampoOperação
CD_OPERPRODSAISaída por produção
CD_OPERPRODENTEntrada por produção
CD_OPERREQUISICAORequisição (saída)
CD_OPERRECEBTORecebimento (entrada)
CD_TRANSFENTTransferência — entrada
CD_TRANSFSAITransferência — saída
CD_OPERACERTOENTAcerto de inventário — entrada
CD_OPERACERTOSAIAcerto de inventário — saída

Eventos que Geram Movimentação de Estoque​

EventoTP_DOCUMENTOSentidoAcionador
NF de saída (venda)'NF'Saída (−)GERA_NOTAPEDIDO + CANCELA_NOTAFISCAL
NF de entrada (compra)'NF'Entrada (+)Recebimento de NF + conferência
Devolução de venda'NF'Entrada (+)NF de devolução (TP_NOTA='D')
Devolução de compra'NF'Saída (−)NF de devolução a fornecedor
Requisição (OS/Produção)'RQ'Saída (−)ORDEMSERVITEM + RequisicaoOficinaController
Devolução de requisição'RQ'Entrada (+)Cancelamento de requisição
Transferência entre locais'TR'Saída + EntradaMEQ / jLocalEstoque
Ajuste de inventário'IV'+/−Acerto pós-contagem
Produção (entrada)'OP'Entrada (+)Ordem de Produção
Produção (consumo)'OP'Saída (−)Consumo de matéria-prima

Cálculo de Custo Médio​

Quando PARMESTOQUE.TP_CUSTOESTOQUE = 'M':

Nova entrada: QT_NOVA a VL_CUSTO_NOVO

Novo preço médio =
(ESTOQUE.QT_ESTOQUE × ESTOQUE.VL_PRECOMEDIO + QT_NOVA × VL_CUSTO_NOVO)
/ (ESTOQUE.QT_ESTOQUE + QT_NOVA)

Update ESTOQUE:
QT_ESTOQUE += QT_NOVA
VL_ESTOQUE += QT_NOVA × VL_CUSTO_NOVO
VL_PRECOMEDIO := novo preço médio
VL_ULTIMOCUSTO := VL_CUSTO_NOVO

Custo negativo: se QT_ESTOQUE < 0 e ST_AJUSTACUSTONEGATIVO = 'S', o sistema ajusta o preço médio na próxima entrada.


Fluxo de Inventário​

┌────────────────────────────────────────────────────────┐
│ 1. ABERTURA DO INVENTÁRIO │
│ DT_INVENTARIO := data de referência │
│ Bloquear movimentações dos itens (ST_BLOQUEADO='S') │
└───────────────────────────┬────────────────────────────┘
│
▼
┌────────────────────────────────────────────────────────┐
│ 2. CONTAGEM FÍSICA │
│ Usuário/Coletor escaneia ou digita cada item │
│ INSERT INVENTARIO { DT, CD_ITEM, QT_TOTAL, VL_CUSTO } │
│ Locais participantes: LOCALESTOQUE.ST_INVENTARIO='S' │
└───────────────────────────┬────────────────────────────┘
│
▼
┌────────────────────────────────────────────────────────┐
│ 3. APURAÇÃO DE DIFERENÇAS │
│ ESTOQUE.QT_ESTOQUE vs INVENTARIO.QT_TOTAL │
│ Diferença = QT_TOTAL − QT_ESTOQUE │
│ Relatório: itens com diferença + valor de ajuste │
└───────────────────────────┬────────────────────────────┘
│
▼
┌────────────────────────────────────────────────────────┐
│ 4. ACERTO AUTOMÁTICO/MANUAL │
│ Se diferença > 0 (entrada): │
│ INSERT MOVESTOQUE (CD_OPERACAO = CD_OPERACERTOENT) │
│ Se diferença < 0 (saída): │
│ INSERT MOVESTOQUE (CD_OPERACAO = CD_OPERACERTOSAI) │
│ UPDATE ESTOQUE.QT_ESTOQUE e VL_PRECOMEDIO │
└───────────────────────────┬────────────────────────────┘
│
▼
┌────────────────────────────────────────────────────────┐
│ 5. ENCERRAMENTO │
│ Desbloquear movimentações (ST_BLOQUEADO='N') │
│ DT_MOVIMENTO := DT_INVENTARIO │
└────────────────────────────────────────────────────────┘

Transferência Entre Filiais​

Habilitado por: PARMESTOQUE.ST_TRANSFEMPRESAS = 'S'

Empresa A (origem)
→ INSERT MOVESTOQUE (CD_OPERACAO=CD_TRANSFSAI, CD_EMPRORIGEM=A)
→ ESTOQUE.QT_ESTOQUE -= QT

Empresa B (destino)
→ INSERT MOVESTOQUE (CD_OPERACAO=CD_TRANSFENT, CD_EMPRORIGEM=A)
→ ESTOQUE.QT_ESTOQUE += QT
→ VL_PRECOMEDIO recalculado

Queries de Referência​

-- Saldo atual por produto e local
SELECT E.CD_ITEM, I.DS_ITEM,
L.DS_LOCAL, E.QT_ESTOQUE, E.VL_PRECOMEDIO
FROM ESTOQUE E
INNER JOIN ITEM I ON I.CD_ITEM = E.CD_ITEM
INNER JOIN LOCALESTOQUE L ON L.CD_LOCAL = E.CD_LOCAL
WHERE E.CD_EMPRESA = :empresa
AND E.QT_ESTOQUE > 0

-- Histórico de movimentações de um produto
SELECT M.DT_LANCAMENTO, O.DS_OPERACAO,
M.QT_ESTOQUE, M.VL_CUSTO,
M.PS_ESTOQUE AS QT_ANTES,
M.PS_ESTOQUE + M.QT_ESTOQUE AS QT_DEPOIS,
M.TP_DOCUMENTO, M.NR_DOCUMENTO
FROM MOVESTOQUE M
INNER JOIN OPERACAO O ON O.CD_OPERACAO = M.CD_OPERACAO
WHERE M.CD_EMPRESA = :empresa
AND M.CD_ITEM = :item
AND M.ST_CANCELAMENTO = 'N'
ORDER BY M.DT_LANCAMENTO DESC, M.NR_LANCAMENTO DESC

Influências em Outros Módulos​

→ Pedido de Venda​

  • Pedido aprovado compromete estoque (ST_COMPROMETIDO='S')
  • NF de saída gera saída definitiva em MOVESTOQUE

→ Emissão NF-e​

  • CANCELA_NOTAFISCAL reverte MOVESTOQUE quando nota é cancelada

→ Recebimento de Mercadoria​

  • NF de entrada confirmada gera entrada em MOVESTOQUE e atualiza ESTOQUE

→ Ordem de Serviço​

  • Requisição de peças da OS gera saída em MOVESTOQUE
  • Cancelamento de OS reverte a saída

→ Fiscal e SPED​

  • MOVESTOQUE alimenta registros de estoque do SPED (bloco H — inventário)