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ódulo | Código | Uso |
|---|
| Parâmetros de Faturamento | MFA001 | Único local de configuração (cmbST_ENTREGACONSUMIDORFINAL). Combo é habilitado somente quando ST_ENTREGA <> 'N' (UMFA001.pas:1868-1880) |
| Pedido de Venda | MPD002 | Lê parmfatur.values['ST_ENTREGACONSUMIDORFINAL'] e passa em ParametrosEntrega[7] para ControleEntrega (UMPD002.pas:3246) |
| Nota Fiscal de Saída | MNF002 | Lê parmfatur.values['ST_ENTREGACONSUMIDORFINAL'] e passa em ParametrosEntrega[7] (UMNF002.pas:4584) |
| Gerar NF de Ordem/Cotação | MPD011 | Passa o valor em ParametrosEntrega[7] ao transformar ordem em NF (UNFORDEM.pas:838) |
| Venda Mobile / Pré-venda | MPD020 | Declara 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 NF | MNF017 | Declara 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) | MNF019 | Declara iST_ENTREGACONSUMIDORFINAL (UdmMNF019.pas:451), carrega em Resultado[12] (UdmMNF019.pas:655) e usa em ParametrosEntrega[7] (UMNF019.pas:1876) |
| Consulta interna de parâmetros | MNF008, MCO006 | Lê 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
| Objeto | Arquivo | Papel |
|---|
ControleEntrega (wrapper) | source/jControleEntrega/jEntrega.pas:29-44 | Funçã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 |
CarregarControleEntrega | source/jControleEntrega/UDadosEntrega.pas:102-316 | Implementa 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.Campo | Tipo | Descrição |
|---|
PARMFATUR.ST_ENTREGACONSUMIDORFINAL | CHAR(1) / FixedChar, Size = 1 | O próprio parâmetro (UdmMFA001.dfm:1383-1388) |
PARMFATUR.ST_ENTREGA | CHAR(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_CONSUMIDOR | INTEGER | Chave 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_PESSOA | INTEGER | É 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_ENTREGUE | CHAR(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 faz | Detalhe |
|---|
Comportamento em ControleEntrega | Se 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 efetiva | UDadosEntrega.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ócio | Venda balcão / PDV / mercado / varejo de pronta entrega onde o cliente leva o produto no ato |
| Habilitação | Combo só é editável se ST_ENTREGA <> 'N' (UMFA001.pas:1871) |
Simulação passo a passo
- Em MFA001 → aba Controle Entrega, defina Controle de Entrega (
ST_ENTREGA) = Pedido Atendido (P) - habilita o combo filho
- Defina Confirma Entrega C.Final (
cmbST_ENTREGACONSUMIDORFINAL) = Sim (S)
- Na mesma tela, aba Diversos, informe Consumidor Final (
edtCD_CONSUMIDOR) = 9999 (cadastro "Consumidor Final" da pessoa padrão)
- Salve (F6) -
PARMFATUR.ST_ENTREGACONSUMIDORFINAL = 'S' e PARMFATUR.CD_CONSUMIDOR = 9999
- Em MPD002 inclua um pedido com
CD_PESSOA = 9999 (o próprio consumidor final) e um item I001 - Pneu
- Ao salvar, o bloco em
UMPD002.pas:3236-3257 monta ParametrosEntrega com [7] = 'S', [8] = '9999', [9] = '9999' e chama ControleEntrega
- Dentro de
CarregarControleEntrega (UDadosEntrega.pas:299-302), a condição (Parametros[7] = 'S') and (Parametros[8] = Parametros[9]) é verdadeira → iStEntrega := 'E'
- O
INSERT em CONTROLEENTREGA (linhas 322-339) grava o item já com ST_ENTREGUE = 'E'
- 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.
- Mesma parametrização (
ST_ENTREGACONSUMIDORFINAL = 'S', CD_CONSUMIDOR = 9999)
- Em MPD002 inclua um pedido com
CD_PESSOA = 1234 (cliente João, diferente do consumidor final)
- Ao salvar,
ControleEntrega recebe [7] = 'S', [8] = '9999', [9] = '1234'
- A condição
(Parametros[8] = Parametros[9]) em UDadosEntrega.pas:299 é falsa → iStEntrega := 'N'
- 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 faz | Detalhe |
|---|
Comportamento em ControleEntrega | A 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ócio | Empresas que sempre agendam entrega, mesmo para consumidor final (ex.: entrega em domicílio obrigatória, rastreamento de motorista) |
Valor atribuído no AfterInsert | tabPARMFATURST_ENTREGACONSUMIDORFINAL.AsString := 'N' (UdmMFA001.pas:513) |
Simulação passo a passo
- Em MFA001 → Controle de Entrega (
ST_ENTREGA) = Pedido Atendido (P)
- Confirma Entrega C.Final (
cmbST_ENTREGACONSUMIDORFINAL) = Não (N)
CD_CONSUMIDOR = 9999
- Salve (F6)
- Em MPD002 inclua pedido com
CD_PESSOA = 9999 (o próprio consumidor final) + item
- Ao salvar,
ParametrosEntrega[7] = 'N', [8] = '9999', [9] = '9999'
- Em
UDadosEntrega.pas:299, a condição Parametros[7] = 'S' é falsa → iStEntrega := 'N'
- A janela
TfrmEntrega abre normalmente, o operador precisa agendar manualmente (data, motorista, etc.)
- 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ção | Nome | Para CD_PESSOA = CD_CONSUMIDOR | Para demais clientes | CONTROLEENTREGA.ST_ENTREGUE gerado |
|---|
| S | Sim | Pula a tela TfrmEntrega, já marca como entregue | Fluxo normal (abre tela) | 'E' (consumidor final) ou 'N' (demais) |
| N | Não (padrão) | Abre a tela TfrmEntrega normalmente | Fluxo normal (abre tela) | Sempre 'N' (após agendamento manual vira 'G'/'E') |
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
| Arquivo | Linha(s) | Trecho |
|---|
source/MFA001/UMFA001.dfm | 11147-11160 | Label55: TLabel com Caption = 'Confirma Entrega C.Final' |
source/MFA001/UMFA001.dfm | 11261-11287 | cmbST_ENTREGACONSUMIDORFINAL: TwwDBComboBox com DataField = 'ST_ENTREGACONSUMIDORFINAL', Items.Strings = ('Sim'#9'S', 'Não'#9'N') |
source/MFA001/UMFA001.pas | 519 | Declaração cmbST_ENTREGACONSUMIDORFINAL: TwwDBComboBox |
source/MFA001/UMFA001.pas | 1864-1892 | cmbST_ENTREGAChange habilita/desabilita o combo conforme ST_ENTREGA (linhas 1871 e 1879) |
source/MFA001/UdmMFA001.dfm | 1383-1388 | tabPARMFATURST_ENTREGACONSUMIDORFINAL: TStringField (FieldName = 'ST_ENTREGACONSUMIDORFINAL', FixedChar = True, Size = 1) |
source/MFA001/UdmMFA001.pas | 181 | Declaração tabPARMFATURST_ENTREGACONSUMIDORFINAL: TStringField |
source/MFA001/UdmMFA001.pas | 513 | AfterInsert: tabPARMFATURST_ENTREGACONSUMIDORFINAL.AsString := 'N' (valor padrão) |
source/MFA001/UdmMFA001.pas | 1694-1705 | tabPARMFATURST_ENTREGAValidate: quando ST_ENTREGA = 'N', força ST_ENTREGACONSUMIDORFINAL := 'N' e desabilita o combo |
source/MFA001/UdmMFA001.dfm | 2563, 2787 | ST_ENTREGACONSUMIDORFINAL nos INSERT/UPDATE gerados pelo FireDAC |
Consumidores (leem o parâmetro)
| Arquivo | Linha | Uso |
|---|
source/MPD002/UMPD002.pas | 3246 | ParametrosEntrega[7] := parmfatur.values['ST_ENTREGACONSUMIDORFINAL'] |
source/MPD002/UdmMPD002.pas | 5746 | SELECT ... P.ST_ENTREGACONSUMIDORFINAL ... FROM PARMFATUR P |
source/MNF002/UMNF002.pas | 4584 | ParametrosEntrega[7] := parmfatur.values['ST_ENTREGACONSUMIDORFINAL'] |
source/MNF002/UdmMNF002.pas | 10498 | SELECT ... P.ST_ENTREGACONSUMIDORFINAL ... |
source/MPD011/UNFORDEM.pas | 838 | ParametrosEntrega[7] := parmfatur.values['ST_ENTREGACONSUMIDORFINAL'] |
source/MPD020/UdmMPD020.pas | 241, 324, 367 | Declara iST_ENTREGACONSUMIDORFINAL, seleciona ST_ENTREGACONSUMIDORFINAL, armazena Resultado[30] |
source/MPD020/UMPD020.pas | 959 | ParametrosEntrega[7] := dmMPD020.iST_ENTREGACONSUMIDORFINAL |
source/MNF017/UdmMNF017.pas | 285 | Declaração iST_ENTREGACONSUMIDORFINAL |
source/MNF017/UMNF017.pas | 164, 201 | SELECT e dmMNF017.iST_ENTREGACONSUMIDORFINAL := Resultado[27] |
source/MNF017/uMNF017ConfPedido.pas | 1139, 1877 | Duas chamadas ControleEntrega passando iST_ENTREGACONSUMIDORFINAL em [7] |
source/MNF019/UdmMNF019.pas | 451, 633, 655 | Declara e carrega iST_ENTREGACONSUMIDORFINAL |
source/MNF019/UMNF019.pas | 1876 | ParametrosEntrega[7] := dmMNF019.iST_ENTREGACONSUMIDORFINAL |
source/MNF008/UdmMNF008.pas | 763 | SELECT ... P.ST_ENTREGACONSUMIDORFINAL ... |
source/MCO006/UdmMCO006.pas | 2107 | SELECT ... P.ST_ENTREGACONSUMIDORFINAL ... |
Núcleo da regra (shared unit jControleEntrega)
| Arquivo | Linha(s) | Uso |
|---|
source/jControleEntrega/jEntrega.pas | 29-44 | ControleEntrega wrapper - repassa o vetor para CarregarControleEntrega |
source/jControleEntrega/UDadosEntrega.pas | 119-120 | Comentário de documentação: 7 - St_EntregaConsumidor, 8 - Cd_ConsumidorFinal |
source/jControleEntrega/UDadosEntrega.pas | 298-302 | Regra principal: if ((Parametros[7] = 'S') and (Parametros[8] = Parametros[9])) then iStEntrega := 'E' else iStEntrega := 'N'; |
source/jControleEntrega/UDadosEntrega.pas | 307-312 | Loop: if (iStEntrega <> 'E') then iAbreForm := True; - só abre TfrmEntrega quando não foi marcado automaticamente |
source/jControleEntrega/UDadosEntrega.pas | 322-349 | INSERT 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).