Parâmetro Controle de Entrega por Conferência
Tela de configuração: MFA001 - Parâmetros de Faturamento
Localização: aba Pedidos / O.S. → sub-aba Opção 1 → grupo Parâmetros de Pedidos/ Ordem de Serviço (pagPedidos → pagPedidoOp1 → grpPedidos, label lbl60 "Controle de Entrega por Conferência")
Tabela: PARMFATUR.ST_CONTENTREGACONF
Valor padrão: N (Não)
Controla se o Pedido de Venda (MPD002) e a Ordem de Serviço (MPD005, MOF001) exigem conferência da entrega antes de permitir o faturamento em NF.
Quando habilitado ('S'), o sistema:
- Ao inserir Pedido ou OS, marca o campo de controle de entrega oficina como pendente de conferência (
'N' em vez do padrão 'I').
- Ao salvar o pedido em MPD002, abre o diálogo
TfrmUMPD002FrmContEntrega perguntando "Deseja Gerar Controle de Entrega por Conferência?" - se sim, grava endereço/frete e marca PEDIDO.ST_ENTREGAOFICINA = 'S'; se não, grava 'N'.
- Ao gerar NF de saída pela procedure
GERA_NOTAFISCAL, só permite faturar pedidos já conferidos (PEDIDO.ST_ENTREGAOFICINA IN ('S','N') com aviso "A NOTA FISCAL POSSUI PEDIDOS QUE NÃO FORAM CONFERIDOS. VERIFIQUE [CPD013]").
Não confundir com ST_CONTENTREGA (controla se agendamento de entrega enxerga serviços ou só produtos) nem com ST_ENTREGA (habilita a funcionalidade de Controle de Entrega).
Telas impactadas
| Módulo | Código | Uso |
|---|
| Parâmetros de Faturamento | MFA001 | Único local de configuração (cmbST_CONTENTREGACONF em UMFA001.pas:330 e UMFA001.dfm:9045-9071) |
| Pedido de Venda | MPD002 | Ao salvar o pedido, se = 'S' abre diálogo TfrmUMPD002FrmContEntrega e grava PEDIDO.ST_ENTREGAOFICINA = 'S' ou 'N' (UMPD002.pas:2368-2393); carrega o valor junto com outros parâmetros em UdmMPD002.pas:5753 |
| Ordem de Serviço | MPD005 | Carrega em dmMPD005.iST_CONTENTREGACONF (UdmMPD005.pas:247, 377, 404) e no AfterInsert da ORDEMSERVICO troca ST_ENTREGAOF de 'I' para 'N' quando = 'S' (UdmMPD005.pas:1820-1823) |
| Ordem de Serviço (Oficina) | MOF001 | No AfterInsert da ORDEMSERVICO troca ST_ENTREGAOF de 'I' para 'N' quando ParmFatur.Values['ST_CONTENTREGACONF'] = 'S' (UdmMOF001.pas:4258-4261) |
Procedures impactadas
| Objeto | Arquivo | Papel |
|---|
GERA_NOTAFISCAL | Scripts/GERA_NOTAFISCAL.sql linha 260 | Lê P.ST_CONTENTREGACONF e carrega na variável V_ST_ENTREGAOF (linha 267). Quando a NF é de saída (V_TP_NOTA = 'S') e V_ST_ENTREGAOF = 'S', faz sub-consulta em PEDIDONOTA/PEDIDO procurando pedidos com ST_ENTREGAOFICINA IN ('S','N') - se algum pedido ainda estiver com 'N' (não conferido), devolve mensagem de bloqueio: "A NOTA FISCAL POSSUI PEDIDOS QUE NÃO FORAM CONFERIDOS. VERIFIQUE [CPD013]" (linhas 405-423) |
Observação: em GERA_NOTAFISCAL.sql, a variável V_ST_ENTREGAOF recebe o valor de P.ST_CONTENTREGACONF (nome de variável enganoso mas mantido em produção). O campo PEDIDO.ST_ENTREGAOFICINA é outro dado - é marcado pelos módulos MPD002/MPD005/MOF001.
Campos envolvidos
| Tabela.Campo | Tipo | Descrição |
|---|
PARMFATUR.ST_CONTENTREGACONF | CHAR(1) / FixedChar | O próprio parâmetro (UdmMFA001.dfm:1612-1614, domínio 'S'/'N') |
PEDIDO.ST_ENTREGAOFICINA | DOM_CHAR1 DEFAULT 'I' NOT NULL | Status da conferência no pedido (docs/schema/tables/PEDIDO.sql:91). Valores usados no código: 'I' (inicial, sem controle), 'N' (pendente de conferência), 'S' (conferido/liberado) |
ORDEMSERVICO.ST_ENTREGAOF | DOM_CHAR1 DEFAULT 'I' NOT NULL | Equivalente para OS (docs/schema/tables/ORDEMSERVICO.sql:45) |
PEDIDONOTA.* | várias | Ligação pedido↔nota, usada por GERA_NOTAFISCAL para testar se há pedidos não conferidos na NF |
Opções disponíveis
N - Não (padrão)
| O que faz | Detalhe |
|---|
| Inserção de Pedido/OS | PEDIDO.ST_ENTREGAOFICINA / ORDEMSERVICO.ST_ENTREGAOF permanecem com o default 'I' (inicial) |
| Salvamento do Pedido (MPD002) | O bloco if (ParmFatur.Values['ST_CONTENTREGACONF'] = 'S') (UMPD002.pas:2368) não entra → nenhum diálogo é exibido |
| AfterInsert OS (MPD005) | tabORDEMSERVICOST_ENTREGAOF.Value := 'I' (UdmMPD005.pas:1819); o if dmMPD005.iST_CONTENTREGACONF = 'S' em UdmMPD005.pas:1820 é falso → valor permanece 'I' |
| AfterInsert OS (MOF001) | tabORDEMSERVICOST_ENTREGAOF.Value := 'I' (UdmMOF001.pas:4256); if (ParmFatur.Values['ST_CONTENTREGACONF'] = 'S') em UdmMOF001.pas:4258 é falso → valor permanece 'I' |
GERA_NOTAFISCAL | V_ST_ENTREGAOF recebe 'N' (do parâmetro) → IF (V_ST_ENTREGAOF = 'S') em GERA_NOTAFISCAL.sql:406 é falso → nenhuma checagem de conferência é feita, NF gerada normalmente |
Simulação passo a passo
- Em MFA001 → aba Pedidos / O.S. → Opção 1 → Controle de Entrega por Conferência =
Não (cmbST_CONTENTREGACONF = N)
- Salve os parâmetros →
PARMFATUR.ST_CONTENTREGACONF = 'N'
- Abra MPD002, crie um pedido com 2 itens e salve
- O pedido é salvo diretamente, sem diálogo de controle de entrega;
PEDIDO.ST_ENTREGAOFICINA fica 'I'
- Abra MOF001 / MPD005 e insira uma OS →
ORDEMSERVICO.ST_ENTREGAOF = 'I'
- Em MNF002, faça a NF do pedido criado →
GERA_NOTAFISCAL não testa conferência → NF é gerada sem qualquer bloqueio adicional
Resultado esperado: Fluxo de venda sem controle de conferência. Pedidos/OS seguem direto para faturamento e nenhuma etapa manual extra é exigida. Comportamento padrão para empresas que não separam "etapa de conferência" entre emissão do pedido e faturamento.
S - Sim
| O que faz | Detalhe |
|---|
| Inserção de Pedido/OS | PEDIDO.ST_ENTREGAOFICINA / ORDEMSERVICO.ST_ENTREGAOF são inicializados como 'N' (pendente de conferência) em vez de 'I' |
| Salvamento do Pedido (MPD002) | UMPD002.pas:2370 dispara msgcodigo('C-0000', [' Deseja Gerar Controle de Entrega por Conferência ? ']). Se Sim: abre TfrmUMPD002FrmContEntrega (captura endereço de entrega DS_ENDENTREGAOF + valor do frete VL_FRETE) e grava UPDATE PEDIDO SET ST_ENTREGAOFICINA = 'S' (UMPD002.pas:2376-2381). Se Não: grava UPDATE PEDIDO SET ST_ENTREGAOFICINA = 'N' (UMPD002.pas:2385-2391) |
| AfterInsert OS (MPD005) | Após setar 'I', o bloco if(dmMPD005.iST_CONTENTREGACONF = 'S') (UdmMPD005.pas:1820-1823) sobrescreve com tabORDEMSERVICOST_ENTREGAOF.AsString := 'N' |
| AfterInsert OS (MOF001) | Idem: sobrescreve 'I' por 'N' (UdmMOF001.pas:4260) |
GERA_NOTAFISCAL | V_ST_ENTREGAOF recebe 'S' → dispara SELECT FIRST 1 P.ST_ENTREGAOFICINA FROM PEDIDONOTA ... WHERE P.ST_ENTREGAOFICINA IN ('S','N') (linhas 408-419). Se retornar qualquer registro (V_ST_ENTREGAOF IS NOT NULL), grava V_MENSAGEM = 'A NOTA FISCAL POSSUI PEDIDOS QUE NÃO FORAM CONFERIDOS. VERIFIQUE [CPD013]' (linhas 421-422) - a NF não é gerada |
Simulação passo a passo
- Em MFA001 → aba Pedidos / O.S. → Opção 1 → Controle de Entrega por Conferência =
Sim (cmbST_CONTENTREGACONF = S)
- Salve os parâmetros →
PARMFATUR.ST_CONTENTREGACONF = 'S'
- Abra MPD002, crie um pedido (ex.: cliente
1234, item I001 qt 10) e pressione Salvar
- Sistema exibe "Deseja Gerar Controle de Entrega por Conferência?"
- Clicando Sim: abre diálogo
TfrmUMPD002FrmContEntrega → digite endereço "Rua X, 100" e frete 50,00 → OK → PEDIDO.ST_ENTREGAOFICINA := 'S' (o pedido já nasce conferido/liberado)
- Clicando Não:
PEDIDO.ST_ENTREGAOFICINA := 'N' (pedido marcado para conferência posterior via [CPD013])
- Abra MOF001 e crie uma OS →
ORDEMSERVICO.ST_ENTREGAOF é gravado como 'N' no AfterInsert
- Depois, em MNF002, selecione o pedido cujo
ST_ENTREGAOFICINA = 'N' e tente gerar a nota
GERA_NOTAFISCAL detecta o pedido não conferido (SELECT FIRST 1 P.ST_ENTREGAOFICINA ... WHERE ST_ENTREGAOFICINA IN ('S','N') retorna 'N') e bloqueia: "A NOTA FISCAL POSSUI PEDIDOS QUE NÃO FORAM CONFERIDOS. VERIFIQUE [CPD013]"
- Usuário precisa conferir o pedido na tela CPD013 (confirmar o controle de entrega) → somente então
ST_ENTREGAOFICINA passa a 'S' → NF pode ser faturada
Resultado esperado: Fluxo com conferência obrigatória. Todo pedido/OS exige decisão sobre controle de entrega no momento do salvamento (MPD002) ou é automaticamente marcado como "pendente" (MPD005/MOF001). NF só é gerada depois que o pedido/OS estiver conferido. Cenário típico: empresas com separação física entre equipe comercial (emite pedido) e equipe de expedição (confere e libera entrega), como distribuidoras e oficinas de recapagem onde o pneu precisa ser montado/entregue antes da emissão fiscal.
Interação com ST_CONTENTREGA / ST_ENTREGACONSUMIDORFINAL / ST_ENTREGA
Apesar do nome similar, estes parâmetros pertencem a dois subsistemas diferentes de "entrega":
| Parâmetro | Subsistema | Localização na tela |
|---|
ST_ENTREGA | Controle de Entrega (agendamento logístico via CONTROLEENTREGA + TfrmEntrega) | Aba Controle Entrega / grupo grpControleEntrega |
ST_CONTENTREGA | Idem - define se serviços entram no agendamento | Aba Controle Entrega |
ST_ENTREGACONSUMIDORFINAL | Idem - entrega para consumidor final | Aba Controle Entrega |
ST_CONTENTREGACONF | Conferência de Pedido/OS antes do faturamento (campos ST_ENTREGAOFICINA / ST_ENTREGAOF) | Aba Pedidos / O.S. → Opção 1 |
ST_CONTENTREGACONF é independente dos três outros. Ele habilita o fluxo de conferência (PEDIDO.ST_ENTREGAOFICINA, ORDEMSERVICO.ST_ENTREGAOF) e o bloqueio em GERA_NOTAFISCAL.
- Os três outros (
ST_ENTREGA, ST_CONTENTREGA, ST_ENTREGACONSUMIDORFINAL) trabalham sobre a tabela CONTROLEENTREGA e o formulário TfrmEntrega (agendamento de data/motorista), sem passar por esse bloqueio.
- Um cenário comum é ambos ligados: a empresa usa Controle de Entrega (agendamento) e também exige que o pedido seja conferido antes de virar nota - são fluxos paralelos.
Tabela Comparativa Resumida
| Opção | Nome | PEDIDO.ST_ENTREGAOFICINA ao inserir | Diálogo ao salvar (MPD002) | Bloqueio em GERA_NOTAFISCAL | Cenário típico |
|---|
| N | Não (padrão) | 'I' (inicial) | Não aparece | Não aplica | Empresas sem separação entre pedido e faturamento |
| S | Sim | 'N' (pendente) até user decidir | Pergunta "Deseja Gerar Controle de Entrega por Conferência?" | Bloqueia NF quando existe pedido com ST_ENTREGAOFICINA = 'N' (aguardando conferência em [CPD013]) | Distribuidoras, oficinas, empresas com expedição separada do comercial |
Referências no Código Fonte
ComboBox e valor padrão
| Arquivo | Linha(s) | Trecho |
|---|
source/MFA001/UMFA001.dfm | 8165-8178 | Label lbl60 → Caption "Controle de Entrega por Conferência" |
source/MFA001/UMFA001.dfm | 9045-9071 | cmbST_CONTENTREGACONF: TwwDBComboBox com Items.Strings = ('Sim'#9'S', 'Não'#9'N') e DataField = 'ST_CONTENTREGACONF' |
source/MFA001/UMFA001.pas | 330 | Declaração cmbST_CONTENTREGACONF: TwwDBComboBox |
source/MFA001/UdmMFA001.dfm | 234 | ST_CONTENTREGACONF no SELECT do tabPARMFATUR |
source/MFA001/UdmMFA001.dfm | 1612-1614 | Campo tabPARMFATURST_CONTENTREGACONF: TStringField (FieldName = 'ST_CONTENTREGACONF', Origin = '"PARMFATUR"."ST_CONTENTREGACONF"') |
source/MFA001/UdmMFA001.dfm | 2413 | ST_CONTENTREGACONF na lista de colunas do SELECT principal |
source/MFA001/UdmMFA001.dfm | 2579 | :ST_CONTENTREGACONF como parâmetro no INSERT gerado pelo FireDAC |
source/MFA001/UdmMFA001.dfm | 2816 | ST_CONTENTREGACONF = :ST_CONTENTREGACONF no UPDATE gerado pelo FireDAC |
source/MFA001/UdmMFA001.dfm | 3114 | ST_CONTENTREGACONF na query de navegação |
source/MFA001/UdmMFA001.pas | 220 | Declaração tabPARMFATURST_CONTENTREGACONF: TStringField |
source/MFA001/UdmMFA001.pas | 528 | AfterInsert: tabPARMFATURST_CONTENTREGACONF.AsString := 'N' (valor padrão) |
Consumidores (leem o parâmetro)
| Arquivo | Linha(s) | Uso |
|---|
source/MPD002/UMPD002.pas | 2368-2393 | if (ParmFatur.Values['ST_CONTENTREGACONF'] = 'S') → exibe diálogo TfrmUMPD002FrmContEntrega e grava PEDIDO.ST_ENTREGAOFICINA = 'S' ou 'N' |
source/MPD002/UMPD002FrmContEntrega.pas / .dfm | - | Form auxiliar do diálogo (campos DS_ENDENTREGAOF, VL_FRETE) |
source/MPD002/UdmMPD002.pas | 5753 | SELECT ... P.ST_CONTENTREGACONF ... FROM PARMFATUR P (junto com outros parâmetros) |
source/MPD005/UdmMPD005.pas | 247 | Declaração da variável iST_CONTENTREGACONF: string |
source/MPD005/UdmMPD005.pas | 377 | SELECT ... ST_CONTENTREGACONF ... FROM PARMFATUR |
source/MPD005/UdmMPD005.pas | 404 | dmMPD005.iST_CONTENTREGACONF := Resultado[20] |
source/MPD005/UdmMPD005.pas | 1819-1823 | tabORDEMSERVICOAfterInsert: seta ST_ENTREGAOF.Value := 'I'; se iST_CONTENTREGACONF = 'S' sobrescreve com 'N' |
source/MOF001/UdmMOF001.pas | 4256-4261 | tabORDEMSERVICOAfterInsert: seta ST_ENTREGAOF.Value := 'I'; se ParmFatur.Values['ST_CONTENTREGACONF'] = 'S' sobrescreve com 'N' |
Scripts SQL (Firebird)
| Arquivo | Linha(s) | Uso |
|---|
Scripts/GERA_NOTAFISCAL.sql | 153 | declare variable V_ST_ENTREGAOF DOM_CHAR1; (nome da variável refere-se ao parâmetro, não ao campo homônimo de ORDEMSERVICO) |
Scripts/GERA_NOTAFISCAL.sql | 260 | SELECT ... P.ST_CONTENTREGACONF, ... FROM PARMFATUR P |
Scripts/GERA_NOTAFISCAL.sql | 267 | INTO ... :V_ST_ENTREGAOF, ... (carrega ST_CONTENTREGACONF na variável com nome enganoso) |
Scripts/GERA_NOTAFISCAL.sql | 405-423 | IF (V_TP_NOTA = 'S') ... IF (V_ST_ENTREGAOF = 'S') → busca em PEDIDONOTA/PEDIDO por pedido com ST_ENTREGAOFICINA IN ('S','N'); se achar, grava mensagem de bloqueio "A NOTA FISCAL POSSUI PEDIDOS QUE NÃO FORAM CONFERIDOS. VERIFIQUE [CPD013]" |
Tabelas afetadas (DDL)
| Arquivo | Linha | Campo |
|---|
docs/schema/tables/PEDIDO.sql | 91 | ST_ENTREGAOFICINA DOM_CHAR1 DEFAULT 'I' NOT NULL |
docs/schema/tables/ORDEMSERVICO.sql | 45 | ST_ENTREGAOF DOM_CHAR1 DEFAULT 'I' NOT NULL |