Produção, lotes e rastreio

Como o M3R controla matéria-prima, ordem de produção, lote, validade, recall e doação — sem ligar nada no tenant comercial por engano.

O ciclo comercial do M3R (compra → estoque → venda → fiscal → financeiro) não muda enquanto as flags industriais estão desligadas. O caminho industrial entra só onde o produto tem controle de lote e o tenant ligou a flag correspondente.

O que o módulo faz

Compras atualizam o lote na NF, o lote alimenta a ordem de produção, a OP gera o acabado com genealogia, a venda e a doação baixam o lote, e o recall congela a cadeia. A Central só lê — não tem flag.

EtapaO que o ERP passa a exigirFlag
NF de entradaCódigo de lote (e validade, se o produto controla validade)industrial.lot-enforcement
Saída / OPFEFO automático ou lote informado; reserva com lot_ida mesma
Apontamento da OPConsumo real por lote + lote do PA + genealogiaindustrial.production-lot-consumption
Encerrar OPRendimento dentro da tolerância do BOMindustrial.mass-balance.enforce
NF de entrada (qualidade)Lote nasce em quarentenaindustrial.quality.inbound-quarantine
Campanha de recallCongela lotes em RECALLEDindustrial.recall.enabled
DoaçãoBaixa com origem DONATION, sem ajuste FAAJ01industrial.donation.enabled

Telas

TelaCaminho
Central industrial/apps/stock/central
Lotes/apps/stock/lots
Rastreio de um lote/apps/stock/lots/:id
Qualidade (quarentena / bloqueio)/apps/stock/lots/qa
Recall/apps/stock/recall
Doações/apps/stock/donations
BOM/apps/stock/bom
Ordem de produçãomenu de estoque / MRP (OP)
Flags/apps/feature-flags (aba overrides por tenant)

A Central não mostra card de “OP bloqueada em QA”: ordem de produção não tem status de qualidade.

ATP e FEFO (API 1.0.169)

Disponível para atender não é só o último saldo do razão (FAPOB).

  • Sem lote no produto: FAPOB − reserva.
  • Com saldo em FALOT01: lotes ACTIVE não vencidos − reserva — o mesmo critério do FEFO.
  • QUARANTINE, EXPIRED, BLOCKED, RECALLED ficam fora.

Homologado em HML: pão com razão 0 e lote ACTIVE 180 UN → ATP 180. Farinha RECALLED 14 kg → ATP 0; FEFO recusa.

O que ainda não é automático

  • Não há cron que marque lote vencido: use POST /product-lot/:filialId/expire ou o movimento já recusa expiration_date < hoje.
  • Quarentena na entrada só existe com a flag de inbound ligada; senão o lote da NF nasce ACTIVE.
  • Encerrar a campanha de recall não libera o lote. Liberação é POST /product-lot/:id/release com motivo.

Leitura por papel