Pular para o conteúdo principal

Parâmetro Confirma Entrega para Consumidor Final

Tela de configuração: MFA001 - Parâmetros de Faturamento Localização: Parâmetros → aba Controle Entrega (pagControleEntrega / grupo grpControleEntrega), rótulo visível "Confirma Entrega C.Final" (Label55, UMFA001.dfm:11147-11160) Tabela: PARMFATUR.ST_ENTREGACONSUMIDORFINAL Valor padrão: N (Não)

Decide se, quando o pedido/nota for emitido para o consumidor final cadastrado na própria PARMFATUR.CD_CONSUMIDOR, o sistema deve marcar automaticamente todos os itens como entregues (ST_ENTREGUE = 'E') no momento em que a rotina ControleEntrega é acionada - dispensando a abertura da janela TfrmEntrega para agendamento manual.

Na prática, é um atalho para vendas balcão/PDV a consumidor final: a entrega acontece no mesmo ato da venda, logo não faz sentido abrir o agendamento de entrega. Quando = 'S' e a pessoa do pedido/nota é exatamente o CD_CONSUMIDOR parametrizado, o sistema insere os registros em CONTROLEENTREGA já marcados como entregues ('E') e não exibe o formulário.

Telas impactadas​

MóduloCódigoUso
Parâmetros de FaturamentoMFA001Único local de configuração (cmbST_ENTREGACONSUMIDORFINAL). Combo é habilitado somente quando ST_ENTREGA <> 'N' (UMFA001.pas:1868-1880)
Pedido de VendaMPD002Lê parmfatur.values['ST_ENTREGACONSUMIDORFINAL'] e passa em ParametrosEntrega[7] para ControleEntrega (UMPD002.pas:3246)
Nota Fiscal de SaídaMNF002Lê parmfatur.values['ST_ENTREGACONSUMIDORFINAL'] e passa em ParametrosEntrega[7] (UMNF002.pas:4584)
Gerar NF de Ordem/CotaçãoMPD011Passa o valor em ParametrosEntrega[7] ao transformar ordem em NF (UNFORDEM.pas:838)
Venda Mobile / Pré-vendaMPD020Declara iST_ENTREGACONSUMIDORFINAL (UdmMPD020.pas:241), carrega em Resultado[30] (UdmMPD020.pas:367) e envia em ParametrosEntrega[7] (UMPD020.pas:959)
Conferência de Pedido para NFMNF017Declara iST_ENTREGACONSUMIDORFINAL (UdmMNF017.pas:285), carrega em Resultado[27] (UMNF017.pas:201) e usa em duas chamadas ControleEntrega (uMNF017ConfPedido.pas:1139 e :1877)
Agendamento de Entrega (Nota de Entrada)MNF019Declara iST_ENTREGACONSUMIDORFINAL (UdmMNF019.pas:451), carrega em Resultado[12] (UdmMNF019.pas:655) e usa em ParametrosEntrega[7] (UMNF019.pas:1876)
Consulta interna de parâmetrosMNF008, MCO006Lê P.ST_ENTREGACONSUMIDORFINAL junto com demais parâmetros (UdmMNF008.pas:763, UdmMCO006.pas:2107)

Observação: O parâmetro é consumido exclusivamente pela função ControleEntrega / CarregarControleEntrega (shared unit jControleEntrega). Nenhuma VIEW do Firebird lê esse campo - toda a regra fica na camada Delphi.

Procedures/Views impactadas​

ObjetoArquivoPapel
ControleEntrega (wrapper)source/jControleEntrega/jEntrega.pas:29-44Função pública chamada por MPD002/MNF002/MPD011/MPD020/MNF017/MNF019. Repassa iParametros (com ST_ENTREGACONSUMIDORFINAL em [7] e CD_CONSUMIDOR em [8]) para CarregarControleEntrega
CarregarControleEntregasource/jControleEntrega/UDadosEntrega.pas:102-316Implementa a regra. Linha 119-120 documenta Parametros[7] - St_EntregaConsumidor e Parametros[8] - Cd_ConsumidorFinal. Linha 299: if ((Parametros[7] = 'S') and (Parametros[8] = Parametros[9])) then iStEntrega := 'E' else iStEntrega := 'N'; - define o status do registro inserido em CONTROLEENTREGA
Nenhum script SQL-Grep em Scripts/ para ST_ENTREGACONSUMIDORFINAL retorna zero matches - o parâmetro não é lido por nenhuma stored procedure/view

Campos envolvidos​

Tabela.CampoTipoDescrição
PARMFATUR.ST_ENTREGACONSUMIDORFINALCHAR(1) / FixedChar, Size = 1O próprio parâmetro (UdmMFA001.dfm:1383-1388)
PARMFATUR.ST_ENTREGACHAR(1)Parâmetro "pai" - quando = 'N', o OnChange força este campo para 'N' e desabilita o combo (UdmMFA001.pas:1694-1705, UMFA001.pas:1868-1880)
PARMFATUR.CD_CONSUMIDORINTEGERChave da pessoa usada como "Consumidor Final" padrão. É o Parametros[8] passado a CarregarControleEntrega. Editável em edtCD_CONSUMIDOR (UMFA001.dfm:1549-1570)
PEDIDO.CD_PESSOA / NOTA.CD_PESSOAINTEGERÉ o Parametros[9] - se bater com Parametros[8] (CD_CONSUMIDOR) e Parametros[7] = 'S', os itens vão direto para ST_ENTREGUE = 'E'
CONTROLEENTREGA.ST_ENTREGUECHAR(1)Coluna-alvo: recebe 'E' (entregue) ou 'N' (não entregue) conforme a regra (UDadosEntrega.pas:339)

Opções disponíveis​

S - Sim​

O que fazDetalhe
Comportamento em ControleEntregaSe o CD_PESSOA do pedido/nota for igual ao PARMFATUR.CD_CONSUMIDOR, grava os itens em CONTROLEENTREGA com ST_ENTREGUE = 'E' sem abrir o formulário TfrmEntrega
Lógica efetivaUDadosEntrega.pas:299 - if ((Parametros[7] = 'S') and (Parametros[8] = Parametros[9])) then iStEntrega := 'E'
Abre a tela de agendamento?Não - iAbreForm := False permanece, pois na iteração do loop (linhas 307-312) a condição iStEntrega <> 'E' não se satisfaz
Caso de negócioVenda balcão / PDV / mercado / varejo de pronta entrega onde o cliente leva o produto no ato
HabilitaçãoCombo só é editável se ST_ENTREGA <> 'N' (UMFA001.pas:1871)

Simulação passo a passo​

  1. Em MFA001 → aba Controle Entrega, defina Controle de Entrega (ST_ENTREGA) = Pedido Atendido (P) - habilita o combo filho
  2. Defina Confirma Entrega C.Final (cmbST_ENTREGACONSUMIDORFINAL) = Sim (S)
  3. Na mesma tela, aba Diversos, informe Consumidor Final (edtCD_CONSUMIDOR) = 9999 (cadastro "Consumidor Final" da pessoa padrão)
  4. Salve (F6) - PARMFATUR.ST_ENTREGACONSUMIDORFINAL = 'S' e PARMFATUR.CD_CONSUMIDOR = 9999
  5. Em MPD002 inclua um pedido com CD_PESSOA = 9999 (o próprio consumidor final) e um item I001 - Pneu
  6. Ao salvar, o bloco em UMPD002.pas:3236-3257 monta ParametrosEntrega com [7] = 'S', [8] = '9999', [9] = '9999' e chama ControleEntrega
  7. Dentro de CarregarControleEntrega (UDadosEntrega.pas:299-302), a condição (Parametros[7] = 'S') and (Parametros[8] = Parametros[9]) é verdadeira → iStEntrega := 'E'
  8. O INSERT em CONTROLEENTREGA (linhas 322-339) grava o item já com ST_ENTREGUE = 'E'
  9. O formulário TfrmEntrega não é exibido (iAbreForm continua False), o usuário não precisa clicar em nada

Resultado esperado: Pedido/NF a consumidor final flui direto, sem interromper o operador para agendar entrega. Em MNF016 o registro já aparece como Entregue.

Simulação alternativa - consumidor final com cliente diferente​

  1. Mesma parametrização (ST_ENTREGACONSUMIDORFINAL = 'S', CD_CONSUMIDOR = 9999)
  2. Em MPD002 inclua um pedido com CD_PESSOA = 1234 (cliente João, diferente do consumidor final)
  3. Ao salvar, ControleEntrega recebe [7] = 'S', [8] = '9999', [9] = '1234'
  4. A condição (Parametros[8] = Parametros[9]) em UDadosEntrega.pas:299 é falsa → iStEntrega := 'N'
  5. O sistema abre normalmente TfrmEntrega e exige o agendamento manual

Resultado esperado: Mesmo com o parâmetro ligado, clientes identificados seguem o fluxo normal de agendamento; apenas o consumidor final "genérico" passa direto.


N - Não (padrão)​

O que fazDetalhe
Comportamento em ControleEntregaA comparação em UDadosEntrega.pas:299 falha de saída - iStEntrega := 'N' para todos os casos, inclusive quando o pedido é para o CD_CONSUMIDOR
Abre a tela de agendamento?Sim, sempre - a rotina respeita o fluxo normal de controle de entrega (abre TfrmEntrega para agendamento manual)
Caso de negócioEmpresas que sempre agendam entrega, mesmo para consumidor final (ex.: entrega em domicílio obrigatória, rastreamento de motorista)
Valor atribuído no AfterInserttabPARMFATURST_ENTREGACONSUMIDORFINAL.AsString := 'N' (UdmMFA001.pas:513)

Simulação passo a passo​

  1. Em MFA001 → Controle de Entrega (ST_ENTREGA) = Pedido Atendido (P)
  2. Confirma Entrega C.Final (cmbST_ENTREGACONSUMIDORFINAL) = Não (N)
  3. CD_CONSUMIDOR = 9999
  4. Salve (F6)
  5. Em MPD002 inclua pedido com CD_PESSOA = 9999 (o próprio consumidor final) + item
  6. Ao salvar, ParametrosEntrega[7] = 'N', [8] = '9999', [9] = '9999'
  7. Em UDadosEntrega.pas:299, a condição Parametros[7] = 'S' é falsa → iStEntrega := 'N'
  8. A janela TfrmEntrega abre normalmente, o operador precisa agendar manualmente (data, motorista, etc.)
  9. O INSERT em CONTROLEENTREGA grava os itens com ST_ENTREGUE = 'N' (pendentes)

Resultado esperado: Todas as vendas (inclusive a consumidor final) passam pelo fluxo manual de agendamento. Cada pedido exige interação no controle de entrega.


Tabela Comparativa Resumida​

OpçãoNomePara CD_PESSOA = CD_CONSUMIDORPara demais clientesCONTROLEENTREGA.ST_ENTREGUE gerado
SSimPula a tela TfrmEntrega, já marca como entregueFluxo normal (abre tela)'E' (consumidor final) ou 'N' (demais)
NNão (padrão)Abre a tela TfrmEntrega normalmenteFluxo normal (abre tela)Sempre 'N' (após agendamento manual vira 'G'/'E')

Interação com outros parâmetros​

  • ST_ENTREGA: parâmetro "pai". Quando = 'N', o OnValidate em UdmMFA001.pas:1694-1705 força ST_ENTREGACONSUMIDORFINAL := 'N' e desabilita o combo. O cmbST_ENTREGAChange (UMFA001.pas:1868-1880) também desabilita o combo na UI.
  • CD_CONSUMIDOR: este parâmetro depende do CD_CONSUMIDOR. Sem um consumidor final cadastrado na PARMFATUR, a regra em UDadosEntrega.pas:299 nunca se satisfaz (o Parametros[8] vem vazio/null).
  • ST_CONTENTREGA, TP_MOVCONTENTREGA, ST_CONFIRMAENTREGAREMESSA: demais parâmetros da mesma aba - todos dependem da mesma regra de ST_ENTREGA <> 'N' para ficarem editáveis.

Armadilhas / Observações​

  • O parâmetro só atua no fluxo de saída de pedidos/notas que chamam ControleEntrega (MPD002, MNF002, MPD011, MPD020, MNF017, MNF019). Não afeta vendas diretas em PDV caso o módulo não execute essa rotina.
  • A igualdade Parametros[8] = Parametros[9] é comparação de string. Se o CD_PESSOA vier com formato diferente de CD_CONSUMIDOR (ex.: espaços em branco), a regra não bate.
  • Não existe cenário em que ST_ENTREGACONSUMIDORFINAL = 'S' e ST_ENTREGA = 'N': o OnValidate de ST_ENTREGA força ST_ENTREGACONSUMIDORFINAL := 'N' quando o pai é 'N' (UdmMFA001.pas:1696-1700).

Referências no Código Fonte​

ComboBox, Field e valor padrão​

ArquivoLinha(s)Trecho
source/MFA001/UMFA001.dfm11147-11160Label55: TLabel com Caption = 'Confirma Entrega C.Final'
source/MFA001/UMFA001.dfm11261-11287cmbST_ENTREGACONSUMIDORFINAL: TwwDBComboBox com DataField = 'ST_ENTREGACONSUMIDORFINAL', Items.Strings = ('Sim'#9'S', 'Não'#9'N')
source/MFA001/UMFA001.pas519Declaração cmbST_ENTREGACONSUMIDORFINAL: TwwDBComboBox
source/MFA001/UMFA001.pas1864-1892cmbST_ENTREGAChange habilita/desabilita o combo conforme ST_ENTREGA (linhas 1871 e 1879)
source/MFA001/UdmMFA001.dfm1383-1388tabPARMFATURST_ENTREGACONSUMIDORFINAL: TStringField (FieldName = 'ST_ENTREGACONSUMIDORFINAL', FixedChar = True, Size = 1)
source/MFA001/UdmMFA001.pas181Declaração tabPARMFATURST_ENTREGACONSUMIDORFINAL: TStringField
source/MFA001/UdmMFA001.pas513AfterInsert: tabPARMFATURST_ENTREGACONSUMIDORFINAL.AsString := 'N' (valor padrão)
source/MFA001/UdmMFA001.pas1694-1705tabPARMFATURST_ENTREGAValidate: quando ST_ENTREGA = 'N', força ST_ENTREGACONSUMIDORFINAL := 'N' e desabilita o combo
source/MFA001/UdmMFA001.dfm2563, 2787ST_ENTREGACONSUMIDORFINAL nos INSERT/UPDATE gerados pelo FireDAC

Consumidores (leem o parâmetro)​

ArquivoLinhaUso
source/MPD002/UMPD002.pas3246ParametrosEntrega[7] := parmfatur.values['ST_ENTREGACONSUMIDORFINAL']
source/MPD002/UdmMPD002.pas5746SELECT ... P.ST_ENTREGACONSUMIDORFINAL ... FROM PARMFATUR P
source/MNF002/UMNF002.pas4584ParametrosEntrega[7] := parmfatur.values['ST_ENTREGACONSUMIDORFINAL']
source/MNF002/UdmMNF002.pas10498SELECT ... P.ST_ENTREGACONSUMIDORFINAL ...
source/MPD011/UNFORDEM.pas838ParametrosEntrega[7] := parmfatur.values['ST_ENTREGACONSUMIDORFINAL']
source/MPD020/UdmMPD020.pas241, 324, 367Declara iST_ENTREGACONSUMIDORFINAL, seleciona ST_ENTREGACONSUMIDORFINAL, armazena Resultado[30]
source/MPD020/UMPD020.pas959ParametrosEntrega[7] := dmMPD020.iST_ENTREGACONSUMIDORFINAL
source/MNF017/UdmMNF017.pas285Declaração iST_ENTREGACONSUMIDORFINAL
source/MNF017/UMNF017.pas164, 201SELECT e dmMNF017.iST_ENTREGACONSUMIDORFINAL := Resultado[27]
source/MNF017/uMNF017ConfPedido.pas1139, 1877Duas chamadas ControleEntrega passando iST_ENTREGACONSUMIDORFINAL em [7]
source/MNF019/UdmMNF019.pas451, 633, 655Declara e carrega iST_ENTREGACONSUMIDORFINAL
source/MNF019/UMNF019.pas1876ParametrosEntrega[7] := dmMNF019.iST_ENTREGACONSUMIDORFINAL
source/MNF008/UdmMNF008.pas763SELECT ... P.ST_ENTREGACONSUMIDORFINAL ...
source/MCO006/UdmMCO006.pas2107SELECT ... P.ST_ENTREGACONSUMIDORFINAL ...

Núcleo da regra (shared unit jControleEntrega)​

ArquivoLinha(s)Uso
source/jControleEntrega/jEntrega.pas29-44ControleEntrega wrapper - repassa o vetor para CarregarControleEntrega
source/jControleEntrega/UDadosEntrega.pas119-120Comentário de documentação: 7 - St_EntregaConsumidor, 8 - Cd_ConsumidorFinal
source/jControleEntrega/UDadosEntrega.pas298-302Regra principal: if ((Parametros[7] = 'S') and (Parametros[8] = Parametros[9])) then iStEntrega := 'E' else iStEntrega := 'N';
source/jControleEntrega/UDadosEntrega.pas307-312Loop: if (iStEntrega <> 'E') then iAbreForm := True; - só abre TfrmEntrega quando não foi marcado automaticamente
source/jControleEntrega/UDadosEntrega.pas322-349INSERT INTO CONTROLEENTREGA (..., ST_ENTREGUE, ...) VALUES (..., Nulo(iStEntrega,'S'), ...) - grava o status calculado

Scripts SQL (Firebird)​

Nenhuma procedure ou view lê este parâmetro - grep em Scripts/ para ST_ENTREGACONSUMIDORFINAL retorna zero matches. Toda a lógica está concentrada na camada Delphi (jControleEntrega).