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_CONTROLELOTEValor padrao:I(Individual por Produto) - atribuido noAfterInsertemUdmMFA001.pas:555
Telas impactadas
| Modulo | Codigo | Onde le | Papel |
|---|---|---|---|
| Pedido de Venda | MPD002 | UMPD002.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 Saida | MNF002 | UdmMNF002.pas:2115,2127,2178,2214,2240,2246,2849,10500 | Consumidora - replica a mesma logica no faturamento direto da nota (individual x agrupado na geracao dos lotes de semente) |
| Nota Fiscal por Ordem | MPD011 | UdmNFORDEM.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 Carregamento | MPD031 | UdmMPD031.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) | MEQ066 | UMEQ066.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 Complementar | MNF008 | UdmMNF008.pas:765 (SELECT em BuscaParametros) | Leitora - carrega o parametro em memoria (uso no fluxo de complementar) |
| Consumo Interno (COP) | MCO006 | UdmMCO006.pas:2109 (SELECT em BuscaParametros) | Leitora - carrega em memoria para fluxo de consumo interno |
| Parametros Faturamento (tela de configuracao) | MFA001 | UMFA001.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-2468 | Produtora - onde o usuario configura o valor e reage a mudancas (habilita/desabilita parametros dependentes) |
Campos envolvidos
| Campo | Tabela | Descricao |
|---|---|---|
TP_CONTROLELOTE | PARMFATUR | 'I' = Individual por Produto / 'A' = Agrupado por pedido |
ST_LOTEPEDIDO | PARMFATUR | Pre-requisito - quando 'S' dispara o rateio; e ai TP_CONTROLELOTE decide o modelo |
ST_PRODUCAOVENDA | PARMFATUR | Guarda-chuva externo - quando 'S' o bloco nem e executado (UMPD002.pas:2803) |
ST_BLOQFATNAOCONFERIDOS | PARMFATUR | So utilizavel quando TP_CONTROLELOTE = 'A' - desabilitado/forcado a 'N' no modo Individual (UMFA001.pas:918,2442,2449) |
ST_PERMITEAJUSTEMPD031 | PARMFATUR | So utilizavel quando TP_CONTROLELOTE = 'A' - idem (UMFA001.pas:919,2443,2447,2451) |
ST_SELECIONALOTEANTIGO | PARMFATUR | So utilizavel quando TP_CONTROLELOTE = 'A' - idem (UMFA001.pas:920,2444,2448,2452) |
ST_SEMENTE | ITEM | Se 'S', 'P', 'C' ou 'E' o item entra no rateio de lotes |
ST_CONFERIDOINDIVIDUAL | PEDIDO | Usado apenas no modo Agrupado pelo MPD031 para marcar que o item foi conferido individualmente durante o carregamento |
QT_CONFERIDA, NR_LOTE, QT_LOTE, CD_EMPRLOTE | ITEMPEDIDOSEMENTE | Registros gravados pelo rateio (apagados e reinseridos a cada salvamento) |
Tabelas gravadas
| Tabela | Operacao | Origem | Quando |
|---|---|---|---|
ITEMPEDIDOSEMENTE | DELETE + INSERT | UMPD002.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) | UPDATE | UMPD031.pas:1277-1287 | So no modo TP_CONTROLELOTE='A', na conferencia de carregamento |
ITEMNOTASEMENTE (equivalente na nota) | DELETE + INSERT | UdmMNF002.pas:2178-2246 (conforme o modo) | Ao salvar Nota Fiscal com itens-semente |
Opcoes disponiveis
I - Individual por Produto (padrao)
| O que faz | Detalhe |
|---|---|
| Rateio por item | Abre a tela RateioLoteProducao uma vez para cada item-semente do pedido (loop em UMPD002.pas:2810-2904) |
| Parametro passado ao rateio | Parametros[4] := dmMPD002.tabITEMPEDIDOCD_ITEM.AsString (apenas o codigo do item corrente) - UMPD002.pas:2842-2843 |
Gravacao em ITEMPEDIDOSEMENTE | DELETE + INSERT por item apos o rateio de cada linha (UMPD002.pas:2869-2900) |
| Cancelamento | Se 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 dependentes | Forca 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
- MFA001 -> Parametros -> Faturamento -> Opcao 2 -> grupo "Parametros Comum a Notas Fiscais / Pedido" -> Modelo Controle Lote = "Individual por Produto"
- Observe que
ST_BLOQFATNAOCONFERIDOS,ST_PERMITEAJUSTEMPD031eST_SELECIONALOTEANTIGOficam desabilitados e forcados a "Nao" - Garanta que
ST_LOTEPEDIDO='S'eST_PRODUCAOVENDA='N'(pre-requisitos) - Salve (F6)
- Abra um Pedido em MPD002 com 3 itens-semente (A, B, C)
- Clique em Salvar (F6)
- Sistema abre a tela de Rateio de Lote 3 vezes (uma para A, outra para B, outra para C)
- A cada confirmacao, o sistema deleta registros antigos de
ITEMPEDIDOSEMENTEdo pedido+item e grava os novos lotes escolhidos para aquele item - 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 faz | Detalhe |
|---|---|
| Rateio unico | Ao 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 rateio | Parametros[4] := isqlItens (lista completa) e Parametros[1] := 'SA' (flag de agrupado) - UMPD002.pas:2914-2919 |
Gravacao em ITEMPEDIDOSEMENTE | Um unico DELETE FROM ITEMPEDIDOSEMENTE WHERE NR_PEDIDO=... e varios INSERTs com os lotes do rateio agrupado (UMPD002.pas:2933-2960) |
| Cancelamento | Se cancelar, W-0000 - Rateio de Lotes de Semente Cancelado em UMPD002.pas:2927 |
| Parametros dependentes | Libera 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) |
| MNF002 | Mesmo fluxo na nota fiscal direta: em vez de um rateio por item, um unico rateio agrupado (UdmMNF002.pas:2849) |
Simulacao passo a passo
- MFA001 -> Parametros -> Faturamento -> Opcao 2 -> Modelo Controle Lote = "Agrupado"
- Observe que
ST_BLOQFATNAOCONFERIDOS,ST_PERMITEAJUSTEMPD031eST_SELECIONALOTEANTIGOficam habilitados para edicao - Salve (F6)
- Abra um Pedido em MPD002 com 3 itens-semente (A, B, C)
- Clique em Salvar (F6)
- Sistema abre a tela de Rateio de Lote UMA UNICA vez, exibindo os 3 itens juntos - usuario distribui os lotes para o conjunto
- Ao confirmar, apaga todos os
ITEMPEDIDOSEMENTEdo pedido inteiro e grava os novos (possivel que um mesmo lote cubra varios itens) - Na conferencia do carregamento em MPD031, a leitura do codigo de barras do lote atualiza
QT_CONFERIDAe, se totalmente conferido, marcaST_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_LOTEPEDIDO | TP_CONTROLELOTE | Comportamento ao salvar pedido em MPD002 |
|---|---|---|
N | I ou A | Nenhum rateio - valor ignorado |
S | I | Abre rateio por item (loop), grava ITEMPEDIDOSEMENTE item a item |
S | A | Abre 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 desabilitachkST_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
| Opcao | Descricao | Dialogo de rateio | Gravacao ITEMPEDIDOSEMENTE | Habilita ST_BLOQFATNAOCONFERIDOS / ST_PERMITEAJUSTEMPD031 / ST_SELECIONALOTEANTIGO? | MPD031 atualiza QT_CONFERIDA? |
|---|---|---|---|---|---|
| I | Individual por Produto (padrao) | Um por item | Por item (N deletes + N inserts) | Nao (forcados a N) | Nao |
| A | Agrupado | Um unico para todos os itens | Unica (1 delete do pedido + varios inserts) | Sim | Sim |
Referencias no Codigo Fonte
| Arquivo | Linha(s) | Papel |
|---|---|---|
source/MFA001/UMFA001.dfm | 3892-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.dfm | 273 (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.pas | 260 (declaracao tabPARMFATURTP_CONTROLELOTE: TStringField), 555 (AfterInsert -> valor padrao 'I') | Default |
source/MFA001/UMFA001.pas | 496 (ComboBox), 825 (decl do handler), 918-920 (carga inicial habilita/desabilita dependentes), 2434-2468 (cmbTP_CONTROLELOTEChange) | Logica UI |
source/MPD002/UMPD002.pas | 2803 (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.pas | 5754 (SELECT em BuscaParametros_MPD002) | Leitura |
source/MNF002/UdmMNF002.pas | 2115, 2127, 2178, 2214, 2240, 2246, 2849, 10500 | Replica o fluxo individual/agrupado na nota fiscal |
source/MPD011/UdmNFORDEM.pas | 1569 (bloco Individual), 2033 (bloco Agrupado) | Geracao de NF por ordem |
source/MPD011/UdmMPD011.pas | 1582 (SELECT do parametro) | Leitura |
source/MPD031/UdmMPD031.pas | 899 (TP_CONTROLELOTE='A' + ST_CONFERIDOINDIVIDUAL) | Conferencia carregamento - so Agrupado |
source/MPD031/UMPD031.pas | 1263-1292 (ajuste de QT_CONFERIDA so quando Agrupado) | Conferencia carregamento - so Agrupado |
source/MEQ066/UMEQ066.pas | 446 (var iTP_CONTROLELOTE), 463-468 (SELECT direto) | Manutencao de leira / reciclagem |
source/MNF008/UdmMNF008.pas | 765 (SELECT em BuscaParametros) | Leitura para NF complementar |
source/MCO006/UdmMCO006.pas | 2109 (SELECT em BuscaParametros) | Leitura para consumo interno |
source/MPD091/UdmMPD091.pas | 222 (referencia comentada - codigo legado sem efeito ativo) | Inativo |
Observacao: Nenhum script SQL em
Scripts/referenciaTP_CONTROLELOTE. Toda a logica vive no Delphi viaParmFatur.Values['TP_CONTROLELOTE']aposBuscaParametros/tabPARMFATUR, ou viaSELECT TP_CONTROLELOTE FROM PARMFATURinline nos modulos consumidores.