Avisar quando o lote selecionado estiver vencido ou vencendo hoje
Tela de configuração: MFA001 - Parâmetros de Faturamento Localização: Parâmetros → Ambos (Pedido/Nota) → Opção 2 → campo Validar Vencimento Lote Produto Tabela:
PARMFATUR.ST_VALIDAVENCIMENTOLOTEValor padrão:'S'(Sim) — definido emUdmMFA001.pas:567(AfterInsertdetabPARMFATUR)
Telas impactadas
| Módulo | Código | Onde lê | Papel |
|---|---|---|---|
| Parâmetros Faturamento (tela de configuração) | MFA001 | UMFA001.dfm:3977-3990 (label lblST_VALIDAVENCIMENTOLOTE "Validar Vencimento Lote Produto"), UMFA001.dfm:4686-4713 (ComboBox cmbST_VALIDAVENCIMENTOLOTE, items Sim=S / Não=N), UdmMFA001.dfm:1933-1936 (campo tabPARMFATURST_VALIDAVENCIMENTOLOTE), UdmMFA001.dfm:2442, 2614, 2869, 3172 (INSERT/UPDATE/SELECT de PARMFATUR), UdmMFA001.pas:276, 567 (declaração do campo + default) | Produtora — onde o usuário configura o valor |
| Tela de Seleção de Lote na ENTRADA (devoluções/retornos de material) | jLoteProducao/ULoteEntrada | ULoteEntrada.pas:107, 194 (lê o parâmetro em iStValidaVencimentoLote), ULoteEntrada.pas:223, 246 (aplica filtro SQL AND 1 = IIF( (L.DT_VALIDADE >= CURRENT_DATE), 1,0) somente quando = 'S') | Consumidora ativa — com 'S' filtra a grade, ocultando lotes já vencidos |
| Tela de Seleção de Lote na SAÍDA (pedido / nota fiscal individual) | jLoteProducao/ULoteSaida | ULoteSaida.pas:109, 200 (leitura), ULoteSaida.pas:1326 (evento tabLoteSTATUSValidate → exibe aviso "Este Lote Está Vencido!" / "Este Lote Vence Hoje!" ao marcar um lote) | Consumidora ativa — com 'S' avisa (sem bloquear) ao marcar lote vencido/vencendo hoje |
| Tela de Rateio de Lote Agrupado | jLoteProducao/ULoteSaidaAgrupado | ULoteSaidaAgrupado.pas:103 (declaração iST_VALIDAVENCIMENTOLOTE), ULoteSaidaAgrupado.pas:184-188 (SELECT dedicado em PARMFATUR), ULoteSaidaAgrupado.pas:709-716 (evento tabLoteSTATUSValidate → aviso ao marcar lote vencido/vencendo hoje) | Consumidora ativa — mesmo comportamento de aviso da saída individual |
| Tela de Seleção de Lote para Devolução | jLoteProducao/ULoteDevol | ULoteDevol.pas:114, 203 (leitura em iStValidaVencimentoLote) | Consumidora — lê o parâmetro no ShowModal (mantém simetria com as demais telas de lote) |
| Tela de Seleção de Lote para Selo (sementes com selo E/C/P/S) | jLoteProducao/ULoteSelo | ULoteSelo.pas:78, 167 (leitura em iStValidaVencimentoLote) | Consumidora — lê o parâmetro no ShowModal |
| MPD002 — Pedido de Venda | — | chama jLoteProducao.ULoteSaida / ULoteSaidaAgrupado para seleção de lote | Consumidora indireta |
| MNF002 — Nota Fiscal | — | idem, via jLoteProducao | Consumidora indireta |
Procedures impactadas
Nenhuma stored procedure no diretório Scripts/ referencia ST_VALIDAVENCIMENTOLOTE — a validação é 100 % Delphi (UI + filtro SQL dinâmico).
Campos envolvidos
| Campo | Tabela | Descrição |
|---|---|---|
ST_VALIDAVENCIMENTOLOTE | PARMFATUR | Habilita filtro / aviso de lote vencido |
DT_VALIDADE | LOTESEMENTE / LOTEITEM / LOTE | Data de validade do lote — comparada com CURRENT_DATE / now |
ST_LOTEPEDIDO | PARMFATUR | Habilita controle de lote em pedidos (gate obrigatório — sem ele as telas de lote não abrem) |
TP_CONTROLELOTE | PARMFATUR | 'I' → ULoteSaida (aviso); 'A' → ULoteSaidaAgrupado (aviso no mesmo evento) |
ST_SELECIONALOTEANTIGO | PARMFATUR | Lido em paralelo no mesmo SELECT (ULoteSaidaAgrupado.pas:184); complementa a estratégia FIFO por validade |
ST_LOTENEGATIVO | PARMESTOQUE | Filtro adjacente no SQL da entrada (ULoteEntrada.pas:224, 247) |
STATUS / NaoMostraMsg | grid interno tabLote | STATUS = 'Å' marca o lote escolhido; NaoMostraMsg suprime o aviso durante carga automática |
Tabelas gravadas
Este parâmetro é apenas de leitura pelos módulos consumidores — ele é gravado somente pelo próprio MFA001 em PARMFATUR (INSERT/UPDATE via UdmMFA001.dfm).
Opções disponíveis
S - Sim (Validar vencimento do lote)
| O que faz | Detalhe |
|---|---|
Entrada de lote (ULoteEntrada) | Adiciona ao SELECT da grade o filtro AND 1 = IIF( (L.DT_VALIDADE >= CURRENT_DATE), 1,0) — lotes cuja data de validade já passou não aparecem na lista (ULoteEntrada.pas:223, 246) |
Saída individual (ULoteSaida) | No evento tabLoteSTATUSValidate (ULoteSaida.pas:1323-1334), ao o usuário marcar um lote (STATUS = 'Å'): se DT_VALIDADE < hoje dispara msgCodigo('I-0000', ['Este Lote Está Vencido!']); se DT_VALIDADE = hoje dispara 'Este Lote Vence Hoje!' |
Saída agrupada (ULoteSaidaAgrupado) | Mesmo evento (ULoteSaidaAgrupado.pas:705-718), porém com severidade W-0000 (warning) em vez de I-0000 |
| O que não faz | Não bloqueia a seleção — todos os avisos são informativos; o usuário pode prosseguir com um lote vencido (só no caso de ENTRADA é que o filtro SQL efetivamente esconde os lotes vencidos). Na SAÍDA / RATEIO AGRUPADO o lote vencido continua listado e selecionável, apenas com aviso |
Flag NaoMostraMsg | Quando uma rotina automática preenche lotes (ex.: pré-seleção do FIFO via ST_SELECIONALOTEANTIGO), a flag é ligada para suprimir o aviso e evitar spam de mensagens durante o ciclo de escrita no grid |
Simulação passo a passo (Saída — pedido de venda)
- Vá em MFA001 → Parâmetros → Ambos → Opção 2 → campo Validar Vencimento Lote Produto
- Marque "Sim" (
'S') e salve (F6) - Cadastre em
LOTESEMENTEdois lotes do mesmo item: lote A comDT_VALIDADE = hoje - 10 dias(vencido) e lote B comDT_VALIDADE = hoje + 60 dias - Em MPD002, crie um pedido do item, dispare a tela de rateio de lote
- Marque o lote A (vencido) — o sistema exibe
msgCodigo('I-0000', ['Este Lote Está Vencido!']) - Feche o aviso: o lote A continua marcado — a seleção é permitida, apenas sinalizada
Resultado esperado: usuário é avisado ao marcar lote vencido/vencendo hoje, mas nada é bloqueado. A responsabilidade de decidir se usa ou não é do operador.
Simulação passo a passo (Entrada — devolução / retorno)
- Mesma configuração (
'S') - Abra uma tela que consome lote de entrada (cadastro de devolução / retorno de material) — ela usa
jLoteProducao.ULoteEntrada - A grade de lotes não exibe os lotes com
DT_VALIDADE < CURRENT_DATE— eles foram removidos pelo filtro SQL
Resultado esperado: diferente da saída, aqui os vencidos não aparecem (filtro estrutural no SELECT, não apenas aviso).
N - Não (Não validar vencimento)
| O que faz | Detalhe |
|---|---|
| Entrada | O filtro AND 1 = IIF( (L.DT_VALIDADE >= CURRENT_DATE), 1,0) não é adicionado ao SELECT — lotes vencidos aparecem normalmente na grade |
| Saída individual / Agrupada | O IF do tabLoteSTATUSValidate não entra — nenhum aviso é exibido ao marcar lotes vencidos |
| Uso típico | Empresas que mantêm lotes históricos só para rastreabilidade, ou onde a "validade" registrada não é crítica para o faturamento (ex.: lote = número de controle interno sem relação com vida útil) |
Simulação passo a passo
- Em MFA001 → Parâmetros → Ambos → Opção 2, marque Validar Vencimento Lote Produto = "Não" e salve
- Cadastre um lote com
DT_VALIDADE = hoje - 30 dias - Em MPD002 / MNF002, abra a seleção de lote: o lote vencido aparece na grade
- Marque-o — nenhum aviso é disparado
Resultado esperado: o sistema ignora completamente DT_VALIDADE na seleção de lotes. Não há filtro, não há aviso.
Interação com ST_LOTEPEDIDO / TP_CONTROLELOTE / ST_SELECIONALOTEANTIGO
ST_LOTEPEDIDOé pré-requisito hierárquico. Se estiver desligado ('N'), a tela de seleção de lote nunca abre em pedido / nota — e portantoST_VALIDAVENCIMENTOLOTEé inócuo nesses fluxos. Só volta a ter efeito quandoST_LOTEPEDIDO = 'S'(ou, para ordem de produção, independentemente desse parâmetro).TP_CONTROLELOTEdecide qual tela é aberta:'I'(Individual) →ULoteSaida(avisoI-0000);'A'(Agrupado) →ULoteSaidaAgrupado(avisoW-0000). O comportamento deST_VALIDAVENCIMENTOLOTEé o mesmo nos dois — só muda o código de severidade da mensagem.ST_SELECIONALOTEANTIGOé complementar (FIFO). EmULoteSaidaAgrupado.pas:184os dois são lidos no mesmo SELECT. SeST_SELECIONALOTEANTIGO = 'S'já pré-seleciona o lote de validade mais próxima; comST_VALIDAVENCIMENTOLOTE = 'S'os avisos de vencido/vencendo hoje são suprimidos durante essa pré-seleção automática via flagNaoMostraMsg— evita bombardear o usuário de mensagens enquanto o sistema escreve no grid. Combinação recomendada para semente: ambos em'S'.
Tabela Comparativa Resumida
| Valor | Entrada (ULoteEntrada) | Saída Individual (ULoteSaida) | Saída Agrupada (ULoteSaidaAgrupado) | Bloqueia operação? |
|---|---|---|---|---|
'S' (default) | Filtra SELECT — oculta lotes vencidos | Aviso I-0000 "Lote Vencido/Vence Hoje" | Aviso W-0000 "Lote Vencido/Vence Hoje" | Não (só avisa; na entrada esconde do select) |
'N' | SELECT sem filtro — lotes vencidos aparecem | Nenhum aviso | Nenhum aviso | Não |
Referências no Código Fonte
Delphi (source/)
| Arquivo | Linhas | O que faz |
|---|---|---|
source/MFA001/UMFA001.dfm | 3977-3990 | Label lblST_VALIDAVENCIMENTOLOTE — Caption = "Validar Vencimento Lote Produto" |
source/MFA001/UMFA001.dfm | 4686-4713 | ComboBox cmbST_VALIDAVENCIMENTOLOTE — DataField = 'ST_VALIDAVENCIMENTOLOTE', items Sim\tS / Não\tN |
source/MFA001/UMFA001.pas | 536-537 | Declaração do label e combobox |
source/MFA001/UdmMFA001.pas | 276 | Declaração tabPARMFATURST_VALIDAVENCIMENTOLOTE: TStringField |
source/MFA001/UdmMFA001.pas | 567 | Default 'S' no AfterInsert de tabPARMFATUR |
source/MFA001/UdmMFA001.dfm | 292, 1933-1937, 2442, 2614, 2869, 3172 | SELECT / INSERT / UPDATE / TField do campo na tabPARMFATUR |
source/jLoteProducao/ULoteEntrada.pas | 107, 194, 223, 246 | Leitura + filtro SQL AND 1 = IIF( (L.DT_VALIDADE >= CURRENT_DATE), 1,0) condicional |
source/jLoteProducao/ULoteSaida.pas | 109, 200, 1326-1332 | Leitura + aviso I-0000 no tabLoteSTATUSValidate |
source/jLoteProducao/ULoteSaidaAgrupado.pas | 103, 184-188, 709-716 | SELECT direto em PARMFATUR + aviso W-0000 no tabLoteSTATUSValidate |
source/jLoteProducao/ULoteDevol.pas | 114, 203 | Leitura em iStValidaVencimentoLote (ShowModal da seleção de lote de devolução) |
source/jLoteProducao/ULoteSelo.pas | 78, 167 | Leitura em iStValidaVencimentoLote (ShowModal da seleção de lote com selo) |
SQL (Scripts/)
Nenhuma stored procedure referencia ST_VALIDAVENCIMENTOLOTE — toda a lógica é Delphi (filtro SQL dinâmico montado em ULoteEntrada e eventos OnValidate em ULoteSaida / ULoteSaidaAgrupado).