Pular para o conteúdo principal

Modelo de Controle de Lote (Individual x Agrupado)

Tela de configuracao: MFA001 - Parametros de Faturamento Localizacao: Parametros Faturamento -> aba Parametros -> sub-aba Faturamento -> Opcao 2 -> grupo "Parametros Comum a Notas Fiscais / Pedido" -> campo Modelo Controle Lote[MPD002/MNF002/MPD011] Tabela: PARMFATUR.TP_CONTROLELOTE Valor padrao: I (Individual por Produto) - atribuido no AfterInsert em UdmMFA001.pas:555

Telas impactadas​

ModuloCodigoOnde lePapel
Pedido de VendaMPD002UMPD002.pas:2842,2857,2863,2869,2906 (ParmFatur.Values['TP_CONTROLELOTE'])Consumidora principal - decide se o rateio de lote de semente e individual por item ou agrupado por pedido inteiro
Nota Fiscal de SaidaMNF002UdmMNF002.pas:2115,2127,2178,2214,2240,2246,2849,10500Consumidora - replica a mesma logica no faturamento direto da nota (individual x agrupado na geracao dos lotes de semente)
Nota Fiscal por OrdemMPD011UdmNFORDEM.pas:1569,2033 (bloco I e bloco A); UdmMPD011.pas:1582 (SELECT do parametro)Consumidora - ao gerar nota fiscal a partir de ordem, escolhe fluxo de rateio conforme o tipo
Conferencia de CarregamentoMPD031UdmMPD031.pas:899 e UMPD031.pas:1263 (TP_CONTROLELOTE = 'A')Consumidora exclusiva do modo Agrupado - controle de ST_CONFERIDOINDIVIDUAL e atualizacao de ITEMPEDIDOSEMENTE.QT_CONFERIDA so ocorrem quando Agrupado
Manutencao de Leira (Reciclagem)MEQ066UMEQ066.pas:446,463-468 (SELECT direto de TP_CONTROLELOTE)Consumidora - le o parametro para decidir fluxo de estoque/rateio no processo de leira
Nota Fiscal ComplementarMNF008UdmMNF008.pas:765 (SELECT em BuscaParametros)Leitora - carrega o parametro em memoria (uso no fluxo de complementar)
Consumo Interno (COP)MCO006UdmMCO006.pas:2109 (SELECT em BuscaParametros)Leitora - carrega em memoria para fluxo de consumo interno
Parametros Faturamento (tela de configuracao)MFA001UMFA001.dfm:3898,4505-4531 (label "Modelo Controle Lote" + ComboBox), UdmMFA001.dfm:273,1842-1844,2431,2605,2854,3153, UdmMFA001.pas:260,555, UMFA001.pas:496,825,918-920,2434-2468Produtora - onde o usuario configura o valor e reage a mudancas (habilita/desabilita parametros dependentes)

Campos envolvidos​

CampoTabelaDescricao
TP_CONTROLELOTEPARMFATUR'I' = Individual por Produto / 'A' = Agrupado por pedido
ST_LOTEPEDIDOPARMFATURPre-requisito - quando 'S' dispara o rateio; e ai TP_CONTROLELOTE decide o modelo
ST_PRODUCAOVENDAPARMFATURGuarda-chuva externo - quando 'S' o bloco nem e executado (UMPD002.pas:2803)
ST_BLOQFATNAOCONFERIDOSPARMFATURSo utilizavel quando TP_CONTROLELOTE = 'A' - desabilitado/forcado a 'N' no modo Individual (UMFA001.pas:918,2442,2449)
ST_PERMITEAJUSTEMPD031PARMFATURSo utilizavel quando TP_CONTROLELOTE = 'A' - idem (UMFA001.pas:919,2443,2447,2451)
ST_SELECIONALOTEANTIGOPARMFATURSo utilizavel quando TP_CONTROLELOTE = 'A' - idem (UMFA001.pas:920,2444,2448,2452)
ST_SEMENTEITEMSe 'S', 'P', 'C' ou 'E' o item entra no rateio de lotes
ST_CONFERIDOINDIVIDUALPEDIDOUsado apenas no modo Agrupado pelo MPD031 para marcar que o item foi conferido individualmente durante o carregamento
QT_CONFERIDA, NR_LOTE, QT_LOTE, CD_EMPRLOTEITEMPEDIDOSEMENTERegistros gravados pelo rateio (apagados e reinseridos a cada salvamento)

Tabelas gravadas​

TabelaOperacaoOrigemQuando
ITEMPEDIDOSEMENTEDELETE + INSERTUMPD002.pas:2873-2900 (modo Individual, um DELETE/INSERT por item) e UMPD002.pas:2933-2960 (modo Agrupado, um unico DELETE/INSERT para todos os itens do pedido)Ao salvar Pedido com ST_LOTEPEDIDO='S'
ITEMPEDIDOSEMENTE (via QT_CONFERIDA)UPDATEUMPD031.pas:1277-1287So no modo TP_CONTROLELOTE='A', na conferencia de carregamento
ITEMNOTASEMENTE (equivalente na nota)DELETE + INSERTUdmMNF002.pas:2178-2246 (conforme o modo)Ao salvar Nota Fiscal com itens-semente

Opcoes disponiveis​

I - Individual por Produto (padrao)​

O que fazDetalhe
Rateio por itemAbre a tela RateioLoteProducao uma vez para cada item-semente do pedido (loop em UMPD002.pas:2810-2904)
Parametro passado ao rateioParametros[4] := dmMPD002.tabITEMPEDIDOCD_ITEM.AsString (apenas o codigo do item corrente) - UMPD002.pas:2842-2843
Gravacao em ITEMPEDIDOSEMENTEDELETE + INSERT por item apos o rateio de cada linha (UMPD002.pas:2869-2900)
CancelamentoSe o usuario cancelar o rateio (Nr_Lote vazio), dispara Raise JException.Create('W-0000', ['Rateio de Lotes de Semente Cancelado']) em UMPD002.pas:2866
Parametros dependentesForca N em ST_BLOQFATNAOCONFERIDOS, ST_PERMITEAJUSTEMPD031 e ST_SELECIONALOTEANTIGO, alem de desabilitar os controles (cmbTP_CONTROLELOTEChange em UMFA001.pas:2438-2452)
MEQ066 (leira)Usa TP_CONTROLELOTE='I' para gerar estoque do item processado por unidade individual
MPD031 (conferencia)Bloco if parmFatur.Values['TP_CONTROLELOTE']='A' nao entra - conferencia nao ajusta QT_CONFERIDA por lote agregado

Simulacao passo a passo​

  1. MFA001 -> Parametros -> Faturamento -> Opcao 2 -> grupo "Parametros Comum a Notas Fiscais / Pedido" -> Modelo Controle Lote = "Individual por Produto"
  2. Observe que ST_BLOQFATNAOCONFERIDOS, ST_PERMITEAJUSTEMPD031 e ST_SELECIONALOTEANTIGO ficam desabilitados e forcados a "Nao"
  3. Garanta que ST_LOTEPEDIDO='S' e ST_PRODUCAOVENDA='N' (pre-requisitos)
  4. Salve (F6)
  5. Abra um Pedido em MPD002 com 3 itens-semente (A, B, C)
  6. Clique em Salvar (F6)
  7. Sistema abre a tela de Rateio de Lote 3 vezes (uma para A, outra para B, outra para C)
  8. A cada confirmacao, o sistema deleta registros antigos de ITEMPEDIDOSEMENTE do pedido+item e grava os novos lotes escolhidos para aquele item
  9. Se cancelar o rateio de qualquer item, o pedido aborta com W-0000 - Rateio de Lotes de Semente Cancelado

Resultado esperado: Cada item-semente tem seu proprio conjunto de lotes rateados, escolhido individualmente. Bom para cenarios em que cada produto precisa ser rastreado separadamente.


A - Agrupado​

O que fazDetalhe
Rateio unicoAo inves de abrir um dialogo por item, acumula isqlItens (lista de itens separados por virgula) e abre UM UNICO dialogo de rateio para todos os itens-semente do pedido (UMPD002.pas:2906-2961)
Parametro passado ao rateioParametros[4] := isqlItens (lista completa) e Parametros[1] := 'SA' (flag de agrupado) - UMPD002.pas:2914-2919
Gravacao em ITEMPEDIDOSEMENTEUm unico DELETE FROM ITEMPEDIDOSEMENTE WHERE NR_PEDIDO=... e varios INSERTs com os lotes do rateio agrupado (UMPD002.pas:2933-2960)
CancelamentoSe cancelar, W-0000 - Rateio de Lotes de Semente Cancelado em UMPD002.pas:2927
Parametros dependentesLibera edicao de ST_BLOQFATNAOCONFERIDOS, ST_PERMITEAJUSTEMPD031 e ST_SELECIONALOTEANTIGO (UMFA001.pas:2458-2465 e carga inicial em 918-920)
MPD031 (conferencia)Bloco if parmFatur.Values['TP_CONTROLELOTE']='A' entra - atualiza ITEMPEDIDOSEMENTE.QT_CONFERIDA conforme codigo de barras do lote e marca PEDIDO.ST_CONFERIDOINDIVIDUAL='S' (UMPD031.pas:1263-1292, UdmMPD031.pas:899)
MNF002Mesmo fluxo na nota fiscal direta: em vez de um rateio por item, um unico rateio agrupado (UdmMNF002.pas:2849)

Simulacao passo a passo​

  1. MFA001 -> Parametros -> Faturamento -> Opcao 2 -> Modelo Controle Lote = "Agrupado"
  2. Observe que ST_BLOQFATNAOCONFERIDOS, ST_PERMITEAJUSTEMPD031 e ST_SELECIONALOTEANTIGO ficam habilitados para edicao
  3. Salve (F6)
  4. Abra um Pedido em MPD002 com 3 itens-semente (A, B, C)
  5. Clique em Salvar (F6)
  6. Sistema abre a tela de Rateio de Lote UMA UNICA vez, exibindo os 3 itens juntos - usuario distribui os lotes para o conjunto
  7. Ao confirmar, apaga todos os ITEMPEDIDOSEMENTE do pedido inteiro e grava os novos (possivel que um mesmo lote cubra varios itens)
  8. Na conferencia do carregamento em MPD031, a leitura do codigo de barras do lote atualiza QT_CONFERIDA e, se totalmente conferido, marca ST_CONFERIDOINDIVIDUAL='S'

Resultado esperado: Um unico dialogo de rateio cobre o pedido inteiro - simplifica a operacao quando os mesmos lotes abastecem varios itens. Habilita os controles pos-rateio (bloqueio de faturamento de itens nao conferidos, ajuste de quantidade no MPD031, selecao de lote antigo).


Interacao com ST_LOTEPEDIDO​

TP_CONTROLELOTE so tem efeito pratico quando ST_LOTEPEDIDO='S' - se ST_LOTEPEDIDO='N', todo o bloco de rateio em UMPD002.pas:2808 e pulado e o valor de TP_CONTROLELOTE fica inerte no pedido/nota.

ST_LOTEPEDIDOTP_CONTROLELOTEComportamento ao salvar pedido em MPD002
NI ou ANenhum rateio - valor ignorado
SIAbre rateio por item (loop), grava ITEMPEDIDOSEMENTE item a item
SAAbre rateio agrupado (unico dialogo), grava ITEMPEDIDOSEMENTE do pedido inteiro de uma vez

Veja tambem a documentacao do parametro ST_LOTEPEDIDO.

Dependencias na tela MFA001​

cmbTP_CONTROLELOTEChange (UMFA001.pas:2434-2468) implementa a regra:

  • Ao trocar para 'I' (Individual): forca 'N' e desabilita chkST_BLOQFATNAOCONFERIDOS, chkST_IGNORACONFERENCIAPEDIDOOS, cmbST_PERMITEAJUSTEMPD031, cmbST_SELECIONALOTEANTIGO.
  • Ao trocar para 'A' (Agrupado): habilita os mesmos controles para edicao do usuario.

Na carga inicial (UMFA001.pas:918-920), a mesma regra e aplicada com base no valor gravado.

Tabela Comparativa Resumida​

OpcaoDescricaoDialogo de rateioGravacao ITEMPEDIDOSEMENTEHabilita ST_BLOQFATNAOCONFERIDOS / ST_PERMITEAJUSTEMPD031 / ST_SELECIONALOTEANTIGO?MPD031 atualiza QT_CONFERIDA?
IIndividual por Produto (padrao)Um por itemPor item (N deletes + N inserts)Nao (forcados a N)Nao
AAgrupadoUm unico para todos os itensUnica (1 delete do pedido + varios inserts)SimSim

Referencias no Codigo Fonte​

ArquivoLinha(s)Papel
source/MFA001/UMFA001.dfm3892-3906 (label lbl71 "Modelo Controle Lote[MPD002/MNF002/MPD011]"), 4505-4532 (ComboBox cmbTP_CONTROLELOTE, Items Individual por Produto=I / Agrupado=A)UI do parametro (dentro de pagFatOp2 - Opcao 2 de Faturamento)
source/MFA001/UdmMFA001.dfm273 (SELECT tabPARMFATUR), 1842-1844 (campo tabPARMFATURTP_CONTROLELOTE), 2431 (INSERT lista colunas), 2605 (INSERT lista params), 2854 (UPDATE SET), 3153 (SELECT alternativo)Persistencia
source/MFA001/UdmMFA001.pas260 (declaracao tabPARMFATURTP_CONTROLELOTE: TStringField), 555 (AfterInsert -> valor padrao 'I')Default
source/MFA001/UMFA001.pas496 (ComboBox), 825 (decl do handler), 918-920 (carga inicial habilita/desabilita dependentes), 2434-2468 (cmbTP_CONTROLELOTEChange)Logica UI
source/MPD002/UMPD002.pas2803 (guard ST_PRODUCAOVENDA='N'), 2808 (guard ST_LOTEPEDIDO='S'), 2842-2901 (fluxo Individual), 2906-2961 (fluxo Agrupado), 2866/2927 (erro cancelamento)Consumidora principal
source/MPD002/UdmMPD002.pas5754 (SELECT em BuscaParametros_MPD002)Leitura
source/MNF002/UdmMNF002.pas2115, 2127, 2178, 2214, 2240, 2246, 2849, 10500Replica o fluxo individual/agrupado na nota fiscal
source/MPD011/UdmNFORDEM.pas1569 (bloco Individual), 2033 (bloco Agrupado)Geracao de NF por ordem
source/MPD011/UdmMPD011.pas1582 (SELECT do parametro)Leitura
source/MPD031/UdmMPD031.pas899 (TP_CONTROLELOTE='A' + ST_CONFERIDOINDIVIDUAL)Conferencia carregamento - so Agrupado
source/MPD031/UMPD031.pas1263-1292 (ajuste de QT_CONFERIDA so quando Agrupado)Conferencia carregamento - so Agrupado
source/MEQ066/UMEQ066.pas446 (var iTP_CONTROLELOTE), 463-468 (SELECT direto)Manutencao de leira / reciclagem
source/MNF008/UdmMNF008.pas765 (SELECT em BuscaParametros)Leitura para NF complementar
source/MCO006/UdmMCO006.pas2109 (SELECT em BuscaParametros)Leitura para consumo interno
source/MPD091/UdmMPD091.pas222 (referencia comentada - codigo legado sem efeito ativo)Inativo

Observacao: Nenhum script SQL em Scripts/ referencia TP_CONTROLELOTE. Toda a logica vive no Delphi via ParmFatur.Values['TP_CONTROLELOTE'] apos BuscaParametros/tabPARMFATUR, ou via SELECT TP_CONTROLELOTE FROM PARMFATUR inline nos modulos consumidores.