Parâmetro de Controle de Entrega (Comportamento)
Tela de configuração: MFA001 - Parâmetros de Faturamento
Localização: Parâmetros → aba Controle Entrega (pagControleEntrega / grupo grpControleEntrega)
Tabela: PARMFATUR.ST_ENTREGA
Valor padrão: N (Não utiliza controle de entrega)
Define se o sistema faz o agendamento e acompanhamento da entrega dos itens e em qual documento o controle é gerado (Pedido, Nota ou ambos). Quando diferente de N, ativa a gravação de registros na tabela CONTROLEENTREGA ao salvar o pedido ou a nota, e habilita os parâmetros complementares da mesma aba (ST_CONTENTREGA, ST_ENTREGACONSUMIDORFINAL, TP_MOVCONTENTREGA, ST_CONFIRMAENTREGAREMESSA).
Telas impactadas
| Módulo | Código | Descrição |
|---|
| Pedido de Venda | MPD002 | Gera CONTROLEENTREGA do pedido quando valor P, H ou T |
| Nota Fiscal Saída | MNF002 | Gera CONTROLEENTREGA da nota quando valor S ou T (com regra adicional sobre pedido) |
| Cotação/Ordem (gera NF) | MPD011 | Ao gerar nota a partir de ordem, cria CONTROLEENTREGA se valor S ou T |
| Pesquisa de Pedidos (Entrega) | MNF015 | Exibe legenda/coluna "Entregue" apenas quando valor P, H ou T |
| Agendamento de Entregas | MNF019 | Monta o LEFT JOIN em CONTROLEENTREGA de Nota (S), Pedido (P/H) ou ambos (T) |
| Relatório de Requisição (Tipo N) | REQ001 | Lê ST_ENTREGA da PARMFATUR para montar layout REQ001_N |
Procedures/Views/Triggers impactadas
| Objeto | Arquivo | Papel |
|---|
SCRIPT_TRANSFCONTROLEENTREGA | Scripts/SCRIPT_TRANSFCONTROLEENTREGA.sql | Script de migração — só processa empresas com PARMFATUR.ST_ENTREGA <> 'N' (linha 24) e chama VIEW_CONTROLEENTREGA passando o valor como parâmetro (linha 33) |
TRGBD_ITEMPEDIDO (trigger BEFORE DELETE) | Scripts/TRGBD_ITEMPEDIDO.sql | Ao deletar item de pedido, carrega P.ST_ENTREGA em :V_TP_CONTROLEENTREGA (linha 14) e só roda a lógica de CONTROLEENTREGA quando diferente de P |
TRGAIUD_ITEMPEDIDO (trigger AFTER I/U/D) | Scripts/TRGAIUD_ITEMPEDIDO.sql | Mesmo padrão (linha 251): se ST_ENTREGA <> 'P' recalcula/ajusta quantidades em CONTROLEENTREGA quando QT_PEDIDA/PS_PEDIDO mudam |
ControleEntrega (função Delphi) | source/jControleEntrega/jEntrega.pas + UDadosEntrega.pas | Recebe o valor em iParametros[5] e abre a tela TfrmEntrega de confirmação/agendamento |
Campos envolvidos
| Tabela.Campo | Descrição |
|---|
PARMFATUR.ST_ENTREGA | O próprio parâmetro |
PARMFATUR.ST_CONTENTREGA | Tipo de item controlado (Produto / Produto+Serviço) — só é habilitado quando ST_ENTREGA <> 'N' |
PARMFATUR.ST_ENTREGACONSUMIDORFINAL | Marca como Entregue automaticamente quando cliente = consumidor final. Forçado a N quando ST_ENTREGA = 'N' |
PARMFATUR.TP_MOVCONTENTREGA | Tipo de movimentação do controle — só habilitado quando ST_ENTREGA <> 'N' |
PARMFATUR.ST_CONFIRMAENTREGAREMESSA | Confirmação automática na remessa — forçado a N quando ST_ENTREGA = 'N' |
PARMFATUR.CD_CONSUMIDOR | Código da pessoa "consumidor final" — usado pela função ControleEntrega |
CONTROLEENTREGA.ST_ENTREGUE | Situação do registro gerado (N, G, E, R) — é a tabela-destino gravada quando ST_ENTREGA <> 'N' |
ITEMPEDIDO.ST_ENTREGA / ITEMNOTA.ST_ENTREGA / NOTA.ST_ENTREGA / PEDIDO.ST_ENTREGA | Colunas homônimas em outras tabelas (marca status do item) — não confundir com o parâmetro PARMFATUR.ST_ENTREGA |
Opções disponíveis
S - Nota Fiscal
| O que faz | Detalhe |
|---|
Quem gera o CONTROLEENTREGA? | Somente a Nota Fiscal de saída (MNF002 e ordens que geram NF como MPD011) |
| Pedido (MPD002) gera controle? | Não |
| JOIN em MNF019 | CONTROLEENTREGA CEN ON CEN.CD_EMPRNOTA = N.CD_EMPRESA AND CEN.NR_LANCAMENTO = ... AND CEN.TP_NOTA = ... (linhas 752–765 de UMNF019.pas) |
Trigger TRGBD_ITEMPEDIDO / TRGAIUD_ITEMPEDIDO | Roda normalmente (valor é diferente de P) |
Simulação passo a passo
- Em MFA001 → aba Controle Entrega → Controle de Entrega =
Nota Fiscal (S)
- Salve os parâmetros (F6)
- Abra um Pedido de Venda em MPD002, inclua produtos e salve → nenhum registro em
CONTROLEENTREGA é criado (o IF em UMPD002.pas linha 3220 não aceita S)
- Emita a Nota Fiscal em MNF002 → ao salvar, o
IF em UMNF002.pas linha 4556 aceita S e dispara ControleEntrega → abre tela TfrmEntrega para agendar a entrega
- Confirme a situação dos itens → registros gravados em
CONTROLEENTREGA com CD_EMPRNOTA, NR_LANCAMENTO, TP_NOTA, CD_SERIE
Resultado esperado: O controle de entrega é rastreado a partir da nota fiscal. O pedido passa direto, sem gerar agenda.
P - Pedido Atendido
| O que faz | Detalhe |
|---|
Quem gera o CONTROLEENTREGA? | Somente o Pedido (MPD002) |
| Nota (MNF002) gera controle? | Não |
Trigger TRGBD_ITEMPEDIDO (linha 17) | IF(:V_TP_CONTROLEENTREGA <> 'P') → não executa a manutenção de quantidades (o próprio pedido é a fonte, a trigger é contornada) |
| JOIN em MNF019 | Junta CONTROLEENTREGA CE pelas chaves do pedido (CE.CD_EMPRPEDIDO, CE.NR_PEDIDO, CE.TP_PEDIDO) — linha 770–772 de UMNF019.pas |
| Legenda em MNF015 | shpEntregue.Visible := True (linha 169 de UMNF015.pas) |
Simulação passo a passo
- MFA001 → Controle de Entrega =
Pedido Atendido (P)
- Salve os parâmetros (F6)
- Abra um pedido em MPD002, inclua itens e salve → o
IF em UMPD002.pas linha 3220 aceita P → abre TfrmEntrega para agendar a entrega, grava em CONTROLEENTREGA com CD_EMPRPEDIDO, NR_PEDIDO, TP_PEDIDO
- Emita a Nota Fiscal do pedido em MNF002 → o
IF em UMNF002.pas linha 4556 recusa P → não gera novo controle, reaproveita o do pedido
- Em MNF015, a legenda "Entregue" aparece (verde quando
QT_ENTREGUE > 0, vermelho caso contrário)
Resultado esperado: O agendamento ocorre no pedido. Ao atender o pedido pela nota, a quantidade entregue é abatida da mesma agenda.
H - Pedido Não Atendido
| O que faz | Detalhe |
|---|
Quem gera o CONTROLEENTREGA? | Igual a P (pedido gera) |
Diferença frente a P | Semanticamente representa pedidos ainda não atendidos — no código, o tratamento é idêntico a P em todos os grep (MPD002, MNF002, MNF019, MNF015), exceto que as triggers de item se comportam igual (<> 'P' inclui H) |
Trigger TRGBD_ITEMPEDIDO | Executa a lógica (valor H é diferente de P) — mantém consistência de quantidades na CONTROLEENTREGA quando o item do pedido é alterado/excluído |
| JOIN em MNF019 linha 767 | (ParmFatur.Values['ST_ENTREGA'] = 'P') or (ParmFatur.Values['ST_ENTREGA'] = 'H') — mesma lógica |
Simulação passo a passo
- MFA001 → Controle de Entrega =
Pedido Não Atendido (H)
- Salve os parâmetros (F6)
- Abra um pedido em MPD002 → abre
TfrmEntrega para agendar (mesma tela da opção P)
- Altere a
QT_PEDIDA de um item já salvo → a trigger TRGAIUD_ITEMPEDIDO linha 251 roda e ajusta a quantidade em CONTROLEENTREGA (diferente de P, que a trigger pularia)
- Emita a NF em MNF002 → nota não gera novo controle
Resultado esperado: Igual a P para efeitos operacionais, mas as triggers de item do pedido permanecem ativas para manutenção das quantidades quando itens são editados.
T - Pedido Não Atendido / Nota
| O que faz | Detalhe |
|---|
Quem gera o CONTROLEENTREGA? | Tanto o pedido quanto a nota podem gerar |
| Regra condicional em NF (MNF002 linha 4558) | ((ST_ENTREGA = 'T') and (dmMNF002.iPedido <> 'S')) or (ST_ENTREGA = 'S') — ou seja, quando a NF não é originada de pedido (iPedido <> 'S'), a nota também gera agenda. Se a NF veio de pedido, o controle já foi criado pelo pedido e não é duplicado |
| JOIN em MNF019 linha 781 | Junta CONTROLEENTREGA duplamente (CE do pedido + CEN da nota) com (CE.ST_ENTREGUE = 'G') OR (CEN.ST_ENTREGUE = 'G') |
| Legenda em MNF015 | Visível |
Simulação passo a passo
- MFA001 → Controle de Entrega =
Pedido Não Atendido / Nota (T)
- Salve os parâmetros (F6)
- Abra um pedido em MPD002 → gera controle (linha 3220 aceita
T)
- Emita a NF a partir desse pedido em MNF002 → linha 4558: como
iPedido = 'S' e ST_ENTREGA = 'T', a NF não duplica o controle; reaproveita o do pedido
- Emita uma NF avulsa (sem pedido) em MNF002 →
iPedido <> 'S', então a NF também gera controle de entrega
- Em MNF019, a pesquisa lista tanto agendas vindas do pedido quanto da nota
Resultado esperado: Cobertura completa — o sistema agenda entrega para qualquer documento que inicie a venda (pedido ou nota avulsa), sem duplicar quando um gera o outro.
N - Não (desligado)
| O que faz | Detalhe |
|---|
| Controle de entrega | Totalmente desligado — nenhum CONTROLEENTREGA é gerado por pedido ou nota |
| Parâmetros complementares | Forçados a desabilitar: em UdmMFA001.pas linha 1694 ST_ENTREGAValidate zera ST_ENTREGACONSUMIDORFINAL = 'N' e desabilita cmbST_ENTREGACONSUMIDORFINAL. Em UMFA001.pas linha 1864 cmbST_ENTREGAChange desabilita cmbST_CONTENTREGA, cmbTP_MOVCONTENTREGA, cmbST_CONFIRMAENTREGAREMESSA e força ST_CONFIRMAENTREGAREMESSA = 'N' + TP_MOVCONTENTREGA = 'A' |
Script SCRIPT_TRANSFCONTROLEENTREGA | Filtra WHERE P.ST_ENTREGA <> 'N' (linha 24) — a migração pula empresas com N |
Triggers TRGBD_ITEMPEDIDO / TRGAIUD_ITEMPEDIDO | Como N é diferente de P, a lógica da trigger roda, porém o COUNT em CONTROLEENTREGA retorna 0 (não há registros), ficando inofensivo |
Simulação passo a passo
- MFA001 → Controle de Entrega =
Não (N)
- Observe que, no mesmo
OnChange, os combos de Controla Item, Confirmar Entrega na Remessa, Excluir Entrega na Devolução e Consumidor Final Entregue ficam desabilitados
- Salve os parâmetros (F6)
- Abra um pedido em MPD002, inclua itens, salve → nenhum registro em
CONTROLEENTREGA, nenhuma tela de agendamento abre
- Emita a NF em MNF002 → idem
- Em MNF015, a legenda "Entregue" não aparece (condição das linhas 165–167 é falsa)
Resultado esperado: Este é o valor padrão (AfterInsert em UdmMFA001.pas linha 450). O módulo de controle de entrega fica inativo.
Este é o valor padrão ao criar um novo registro no MFA001.
Regra de Consumidor Final
Quando ST_ENTREGA <> 'N' e PARMFATUR.ST_ENTREGACONSUMIDORFINAL = 'S', a função CarregarControleEntrega (source/jControleEntrega/UDadosEntrega.pas linhas 299–302) define automaticamente iStEntrega := 'E' (Entregue) quando o cliente do pedido/nota for igual a PARMFATUR.CD_CONSUMIDOR. Isso não abre a tela TfrmEntrega, grava o CONTROLEENTREGA direto como entregue e evita intervenção manual em vendas balcão.
ST_CONTENTREGA, ST_ENTREGACONSUMIDORFINAL, TP_MOVCONTENTREGA, ST_CONFIRMAENTREGAREMESSA: todos controlados pelo OnChange do combo (UMFA001.pas linha 1864) e pelo OnValidate do campo (UdmMFA001.pas linha 1694). Só podem ser editados se ST_ENTREGA <> 'N'.
- Ordem de disparo no save: em MPD002/MNF002, o bloco de controle de entrega roda depois do
SAVEPOINT MPD002_ENTREGA e, se a função ControleEntrega retornar false, o ROLLBACK TO MPD002_ENTREGA é executado e a gravação é cancelada com W-0000 ("Controle de Entrega Cancelado.").
Tabela Comparativa Resumida
| Opção | Descrição | Pedido (MPD002) gera? | Nota (MNF002) gera? | NF a partir de pedido | Triggers de ITEMPEDIDO |
|---|
| S | Nota Fiscal | Não | Sim | Nota gera | Executa |
| P | Pedido Atendido | Sim | Não | Reaproveita do pedido | Não executa (valor = P) |
| H | Pedido Não Atendido | Sim | Não | Reaproveita do pedido | Executa |
| T | Pedido Não Atendido / Nota | Sim | Sim (se NF avulsa) | Reaproveita do pedido | Executa |
| N | Não (desligado) | Não | Não | - | Executa (inofensivo) |
Referências no Código Fonte
ComboBox e default
| Arquivo | Linha(s) | Trecho |
|---|
source/MFA001/UMFA001.dfm | 11203–11233 | cmbST_ENTREGA: TwwDBComboBox com Items.Strings = ('Nota Fiscal'#9'S', 'Pedido Atendido'#9'P', 'Pedido Não Atendido'#9'H', 'Pedido Não Atendido / Nota'#9'T', 'Não'#9'N') |
source/MFA001/UMFA001.pas | 1864–1893 | cmbST_ENTREGAChange — habilita/desabilita combos complementares |
source/MFA001/UdmMFA001.pas | 450 | AfterInsert: tabPARMFATURST_ENTREGA.AsString := 'N' |
source/MFA001/UdmMFA001.pas | 1694–1705 | tabPARMFATURST_ENTREGAValidate — quando = 'N', zera ST_ENTREGACONSUMIDORFINAL |
Consumidores em Pedidos/Notas
| Arquivo | Linha | Uso |
|---|
source/MPD002/UMPD002.pas | 3220, 3244 | Gera CONTROLEENTREGA quando valor é P, H ou T |
source/MNF002/UMNF002.pas | 4556, 4558, 4582 | Gera CONTROLEENTREGA quando valor é S ou T (com regra de iPedido) |
source/MPD011/UNFORDEM.pas | 812–846 | Geração de entrega ao transformar ordem em NF — aceita S e T |
source/MNF019/UMNF019.pas | 752, 767, 781 | Monta LEFT JOIN em CONTROLEENTREGA conforme valor |
source/MNF019/UMNF019.pas | 2633, 2648, 2662 | Mesma lógica no segundo SELECT da pesquisa |
source/MNF019/UdmMNF019.pas | 4175, 4191, 4205 | Terceira ocorrência do JOIN condicional |
source/MNF015/UMNF015.pas | 165–167, 657–659 | Exibição da legenda "Entregue" e pintura do grid |
source/REQ001/UREQ001.pas | 1710 | Lê ST_ENTREGA da PARMFATUR para selecionar layout REQ001_N |
source/jControleEntrega/jEntrega.pas | 29–44 | Função pública ControleEntrega que recebe o valor em iParametros[5] |
source/jControleEntrega/UDadosEntrega.pas | 102–360 | CarregarControleEntrega — monta SQL e insere em CONTROLEENTREGA |
Scripts SQL (Firebird)
| Arquivo | Linha | Uso |
|---|
Scripts/SCRIPT_TRANSFCONTROLEENTREGA.sql | 24, 33 | Filtra empresas com ST_ENTREGA <> 'N' e passa o valor para VIEW_CONTROLEENTREGA |
Scripts/TRGBD_ITEMPEDIDO.sql | 14, 17 | Trigger BEFORE DELETE de item de pedido — só ajusta CONTROLEENTREGA quando ST_ENTREGA <> 'P' |
Scripts/TRGAIUD_ITEMPEDIDO.sql | 251, 254 | Trigger AFTER I/U/D de item de pedido — mesmo filtro <> 'P' |