Parâmetro Bloqueia Faturamento de Pedidos Não Conferidos
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), checkbox "Validar Quantidade Conferida [MPD031/MPD091/MPD097]" (chkST_BLOQFATNAOCONFERIDOS em UMFA001.dfm:10154-10173)
Tabela: PARMFATUR.ST_BLOQFATNAOCONFERIDOS
Valor padrão: N (Não) - definido em UdmMFA001.pas:556 (AfterInsert) e no DDL PARMFATUR.sql:205 (DOM_CHAR1 DEFAULT 'N' NOT NULL)
Controla se a geração da Nota Fiscal de saída pela procedure GERA_NOTAFISCAL bloqueia o faturamento quando existir algum pedido/OS cujos itens ainda tenham quantidade ou peso pendente de conferência nas telas de conferência MPD031 (Conferência Item/Pesagem), MPD091 (Conferência Item) ou MPD097 (Conferência).
Quando habilitado ('S'), o sistema faz duas checagens ao tentar gerar a NF:
- Delphi (MNF033): Para cada pedido vinculado à NF em MNF033 (Faturamento de Pedidos), compara os valores
IP.PS_PEDIDO vs IP.PS_CONFERENCIA e IP.QT_PEDIDA vs IP.QT_CONFERENCIA. Se divergirem, bloqueia com "Pedido X não foi conferido. Verifique! [MPD031, MPD091, MPD097]".
- Firebird (GERA_NOTAFISCAL): Chama a procedure
VERIRICA_BLOQUEIONAOCONFERIDO que procura, via RETORNA_CHAVEPEDIDO, qualquer ITEMPEDIDO com saldo não conferido (PS_PEDIDO - PS_CONFERENCIA > 0 ou QT_PEDIDA - QT_CONFERENCIA > 0) e que já tenha alguma conferência iniciada ou item com ST_CONFERENCIA = 'S'; idem para ITEMPEDIDOSEMENTE (conferência por lote). Achando, devolve mensagem de bloqueio.
Pré-requisito de habilitação na UI: O checkbox só fica editável quando TP_CONTROLELOTE = 'A' (Lote Ativo). Se TP_CONTROLELOTE = 'I' (Inativo), o parâmetro é forçado a 'N' e o controle fica desabilitado (UdmMFA001.pas:556, UMFA001.pas:918, UMFA001.pas:2442-2466).
Não confundir com ST_CONTENTREGACONF (controle de entrega por conferência no MPD002/MOF001, que atua sobre PEDIDO.ST_ENTREGAOFICINA) nem com TP_CONFERENCIAPEDIDO (tipo de divergência bloqueada durante a conferência em MPD031/MPD091). Este parâmetro atua depois: no momento da emissão da NF.
Telas impactadas
| Módulo | Código | Uso |
|---|
| Parâmetros de Faturamento | MFA001 | Único local de configuração (chkST_BLOQFATNAOCONFERIDOS em UMFA001.dfm:10154-10173). Habilitação condicionada a TP_CONTROLELOTE = 'A' |
| Faturamento de Pedidos | MNF033 | Lê via ParmFatur.Values['ST_BLOQFATNAOCONFERIDOS'] e, quando = 'S', compara PS_PEDIDO × PS_CONFERENCIA e QT_PEDIDA × QT_CONFERENCIA para cada item do pedido; bloqueia se divergirem (UMNF033.pas:1207-1217) |
| Conferência Item/Pesagem | MPD031 | Tela onde o usuário preenche ITEMPEDIDO.PS_CONFERENCIA / ITEMPEDIDO.QT_CONFERENCIA e ITEMPEDIDOSEMENTE.QT_CONFERIDA - dados que zeram o bloqueio |
| Conferência Item | MPD091 | Conferência por item/lote; alimenta os mesmos campos de conferência |
| Conferência | MPD097 | Conferência alternativa; também alimenta ITEMPEDIDO.PS_CONFERENCIA/QT_CONFERENCIA |
Procedures impactadas
| Objeto | Arquivo | Papel |
|---|
GERA_NOTAFISCAL | Scripts/GERA_NOTAFISCAL.sql:160, 260, 267, 427-435 | Lê P.ST_BLOQFATNAOCONFERIDOS em V_ST_BLOQFATNAOCONFERIDOS. Quando a NF é de saída (V_TP_NOTA = 'S') e o parâmetro = 'S', chama VERIRICA_BLOQUEIONAOCONFERIDO passando também V_ST_IGNORACONFERENCIAPEDIDOOS. Se a sub-procedure retornar mensagem, faz SUSPEND; EXIT - a NF não é gerada |
VERIRICA_BLOQUEIONAOCONFERIDO | Scripts/VERIRICA_BLOQUEIONAOCONFERIDO.sql | Procedure dedicada (nome com typo mantido em produção). Usa RETORNA_CHAVEPEDIDO para achar os pedidos da NF; (a) testa ITEMPEDIDO onde (PS_PEDIDO - PS_CONFERENCIA) > 0 OU (QT_PEDIDA - QT_CONFERENCIA) > 0 E já tenha conferência iniciada ou ITEM.ST_CONFERENCIA = 'S' → mensagem "A NOTA FISCAL POSSUI PEDIDOS QUE NÃO FORAM CONFERIDOS. VERIFIQUE [MPD031/MPD091/MPD097]"; (b) testa ITEMPEDIDOSEMENTE onde (QT_LOTE - QT_CONFERIDA) > 0 → mensagem "... PEDIDOS COM LOTES QUE NÃO FORAM CONFERIDOS. VERIFIQUE [MPD031/MPD091]". O parâmetro ST_IGNORACONFERENCIAPEDIDOOS permite pular a checagem quando o pedido veio de Ordem de Serviço |
Campos envolvidos
| Tabela.Campo | Tipo | Descrição |
|---|
PARMFATUR.ST_BLOQFATNAOCONFERIDOS | DOM_CHAR1 DEFAULT 'N' NOT NULL | O próprio parâmetro (docs/schema/tables/PARMFATUR.sql:205, UdmMFA001.dfm:1848-1851). Domínio 'S'/'N' |
PARMFATUR.ST_IGNORACONFERENCIAPEDIDOOS | DOM_CHAR1 | Parâmetro acoplado: permite ignorar o bloqueio quando o pedido originou de Ordem de Serviço. Só é editável quando ST_BLOQFATNAOCONFERIDOS = 'S' (UdmMFA001.pas:1456, UMFA001.pas:2607) |
PARMFATUR.TP_CONTROLELOTE | DOM_CHAR1 | Pré-requisito para liberar o checkbox: ST_BLOQFATNAOCONFERIDOS só fica editável com TP_CONTROLELOTE = 'A' (UMFA001.pas:918, UMFA001.pas:2442-2466) |
ITEMPEDIDO.PS_PEDIDO / PS_CONFERENCIA | NUMERIC | Peso pedido vs peso conferido (saldo de conferência em peso) |
ITEMPEDIDO.QT_PEDIDA / QT_CONFERENCIA | NUMERIC | Quantidade pedida vs quantidade conferida |
ITEM.ST_CONFERENCIA | CHAR(1) | Flag "este item exige conferência". Usado no WHERE de VERIRICA_BLOQUEIONAOCONFERIDO (linha 33) |
ITEMPEDIDOSEMENTE.QT_LOTE / QT_CONFERIDA | NUMERIC | Conferência por lote/semente. Verificada na 2ª query da procedure |
PEDIDO.NR_ORDEMSERVICO | INTEGER | Se não nulo, o pedido veio de OS. Combinado com ST_IGNORACONFERENCIAPEDIDOOS controla o bypass da checagem |
Opções disponíveis
N - Não (padrão)
| O que faz | Detalhe |
|---|
| UI MFA001 | Checkbox "Validar Quantidade Conferida" desmarcado. O acoplado "Ignorar Pedidos Gerados por O.S." fica desabilitado (UMFA001.pas:2607) |
| MNF033 | O bloco if (ParmFatur.Values['ST_BLOQFATNAOCONFERIDOS'] = 'S') (UMNF033.pas:1207) não entra → nenhuma comparação PS_PEDIDO × PS_CONFERENCIA é feita na vinculação |
GERA_NOTAFISCAL | IF ((V_TP_NOTA = 'S') AND (V_ST_BLOQFATNAOCONFERIDOS = 'S')) em GERA_NOTAFISCAL.sql:427 é falso → VERIRICA_BLOQUEIONAOCONFERIDO não é chamada |
| Resultado | NF de saída é gerada mesmo que existam pedidos/itens sem a quantidade/peso totalmente conferida. Fica por conta do usuário (ou de outros controles) garantir a consistência |
Simulação passo a passo
- Em MFA001 → aba Pedidos / O.S. → Opção 1 → desmarque o checkbox "Validar Quantidade Conferida [MPD031/MPD091/MPD097]"
- Salve os parâmetros →
PARMFATUR.ST_BLOQFATNAOCONFERIDOS = 'N'
- Crie um pedido em MPD002 com o item
I001 qt 10 (ITEMPEDIDO.QT_PEDIDA = 10, QT_CONFERENCIA = 0)
- Sem passar pela conferência MPD031/MPD091/MPD097, abra MNF033 e vincule o pedido à nota
- O loop de itens em
UMNF033.pas:1204-1237 executa sem testar conferência
- Emita a nota em MNF002 →
GERA_NOTAFISCAL chega na linha 427 com V_ST_BLOQFATNAOCONFERIDOS = 'N' → pula o bloco
- NF é gerada normalmente
Resultado esperado: Faturamento direto de pedido sem exigência de conferência prévia. Cenário para empresas onde a saída fiscal não é condicionada à pesagem/contagem (ex.: vendas de balcão, itens sem peso variável, empresas sem equipe de separação).
S - Sim
| O que faz | Detalhe |
|---|
| UI MFA001 | Checkbox marcado. Libera o acoplado "Ignorar Pedidos Gerados por O.S." (chkST_IGNORACONFERENCIAPEDIDOOS.Enabled := True). Pré-requisito: TP_CONTROLELOTE = 'A'; se o usuário mudar TP_CONTROLELOTE para 'I', o parâmetro é forçado a 'N' automaticamente (UMFA001.pas:2442) |
| MNF033 - vinculação | UMNF033.pas:1207-1217: para cada item do pedido, executa if (RoundTo(PS_PEDIDO,-3) <> RoundTo(PS_CONFERENCIA,-3)) or (RoundTo(QT_PEDIDA,-2) <> RoundTo(QT_CONFERENCIA,-2)) → se divergir, raise JException('W-0000', ['Pedido X não foi conferido. Verifique![MPD031, MPD091, MPD097]']) |
GERA_NOTAFISCAL | IF ((V_TP_NOTA = 'S') AND (V_ST_BLOQFATNAOCONFERIDOS = 'S')) em GERA_NOTAFISCAL.sql:427 é verdadeiro → chama VERIRICA_BLOQUEIONAOCONFERIDO(:V_CD_EMPRESA, :V_NR_LANCAMENTO, :V_CD_SERIE, :V_TP_NOTA, :V_ST_IGNORACONFERENCIAPEDIDOOS). Se a procedure devolver qualquer mensagem em O_DS_MSG, grava em V_MENSAGEM e faz SUSPEND; EXIT - a NF não é gerada |
| Procedure | VERIRICA_BLOQUEIONAOCONFERIDO faz 2 validações: (1) itens com saldo de qt/peso e conferência parcial iniciada ou ITEM.ST_CONFERENCIA = 'S' → mensagem "... PEDIDOS QUE NÃO FORAM CONFERIDOS. VERIFIQUE [MPD031/MPD091/MPD097]"; (2) lotes de semente com saldo (ITEMPEDIDOSEMENTE.QT_LOTE > QT_CONFERIDA) → mensagem "... PEDIDOS COM LOTES QUE NÃO FORAM CONFERIDOS. VERIFIQUE [MPD031/MPD091]" |
| Bypass OS | Se o pedido tem NR_ORDEMSERVICO IS NOT NULL e o parâmetro acoplado ST_IGNORACONFERENCIAPEDIDOOS = 'S', a procedure não emite a mensagem para esse pedido - permite faturar OS sem conferência prévia |
Simulação passo a passo
- Em MFA001, garanta que Tipo Controle de Lote =
Ativo (TP_CONTROLELOTE = 'A') → o checkbox "Validar Quantidade Conferida" fica habilitado
- Marque o checkbox "Validar Quantidade Conferida [MPD031/MPD091/MPD097]" →
ST_BLOQFATNAOCONFERIDOS = 'S'
- (Opcional) Decida se quer ignorar pedidos vindos de OS marcando "Ignorar Pedidos Gerados por O.S.[MOF001]" (
ST_IGNORACONFERENCIAPEDIDOOS = 'S')
- Salve os parâmetros
- Crie um pedido em MPD002 com item
I001 qt 10 (e ITEM.ST_CONFERENCIA = 'S' cadastrado em TMPTI ou equivalente)
- Abra MPD031 e confira apenas 7 unidades (
IP.QT_CONFERENCIA = 7)
- Tente vincular o pedido em MNF033: no loop
UMNF033.pas:1207-1216, RoundTo(QT_PEDIDA=10,-2) <> RoundTo(QT_CONFERENCIA=7,-2) → bloqueio Delphi "Pedido X não foi conferido. Verifique![MPD031, MPD091, MPD097]"
- Caso o usuário consiga passar (ex.: via rotinas que não chamam
UMNF033), GERA_NOTAFISCAL ainda chama VERIRICA_BLOQUEIONAOCONFERIDO - a 1ª query acha o item com (QT_PEDIDA - QT_CONFERENCIA) = 3 > 0 e conferência iniciada → retorna mensagem de bloqueio → NF não é gerada
- Usuário precisa voltar a MPD031/MPD091/MPD097 e conferir as 3 unidades restantes (
QT_CONFERENCIA = 10) para desbloquear
- Se o pedido tem
NR_ORDEMSERVICO IS NOT NULL e ST_IGNORACONFERENCIAPEDIDOOS = 'S', a procedure pula esse pedido e permite a NF
Resultado esperado: Fluxo com conferência obrigatória para faturamento. Pedido/OS só vira NF após passar pela balança/contagem em MPD031/MPD091/MPD097. Cenário típico: distribuidoras com pesagem de balança, empresas com lotes de sementes/grãos, oficinas de recapagem onde o pneu conferido fisicamente tem que bater com o pedido. Exige que TP_CONTROLELOTE = 'A' porque a conferência por lote é pilar do fluxo.
Interação com ST_CONTENTREGACONF / TP_CONFERENCIAPEDIDO / TP_CONTROLELOTE
Três parâmetros orbitam o tema "conferência" no MFA001, mas atuam em momentos diferentes do fluxo:
| Parâmetro | O que controla | Quando bloqueia | Campo-chave |
|---|
ST_CONTENTREGACONF | Conferência de entrega (endereço/frete) no MPD002/MOF001 | Ao emitir NF em GERA_NOTAFISCAL se PEDIDO.ST_ENTREGAOFICINA = 'N' | PEDIDO.ST_ENTREGAOFICINA |
TP_CONFERENCIAPEDIDO | Qual tipo de divergência de quantidade/peso é bloqueada dentro da conferência (MPD031/MPD091) | Durante a conferência, ao gravar ITEMPEDIDO.QT_CONFERENCIA/PS_CONFERENCIA | ITEMPEDIDO.QT/PS_CONFERENCIA |
ST_BLOQFATNAOCONFERIDOS | Se a NF é bloqueada caso algum pedido/lote ainda tenha saldo pendente de conferência | Ao emitir NF em GERA_NOTAFISCAL (após conferência ou falta dela) | ITEMPEDIDO.QT/PS_CONFERENCIA + ITEMPEDIDOSEMENTE.QT_CONFERIDA |
TP_CONFERENCIAPEDIDO atua durante a conferência (impede gravar conferência divergente). ST_BLOQFATNAOCONFERIDOS atua depois na emissão da NF (impede faturar se a conferência não cobriu todo o saldo). São complementares: a empresa que quer fluxo rigoroso marca os dois.
ST_CONTENTREGACONF e ST_BLOQFATNAOCONFERIDOS trabalham campos distintos (ST_ENTREGAOFICINA vs QT_CONFERENCIA). Ambos podem estar ligados simultaneamente - a NF só sai se passar nas duas validações (endereço de entrega conferido e itens conferidos).
TP_CONTROLELOTE = 'A' é pré-requisito de UI para ST_BLOQFATNAOCONFERIDOS = 'S'. Se o usuário mudar TP_CONTROLELOTE para 'I' em cmbTP_CONTROLELOTEChange, o código força ST_BLOQFATNAOCONFERIDOS = 'N' e desabilita o checkbox (UMFA001.pas:2438-2452). Justificativa: conferência de lotes (ITEMPEDIDOSEMENTE) exige controle de lote ativo.
ST_IGNORACONFERENCIAPEDIDOOS é um switch dependente: só é editável se ST_BLOQFATNAOCONFERIDOS = 'S' (UMFA001.pas:2607, UdmMFA001.pas:1456). Permite que pedidos originados de Ordens de Serviço (PEDIDO.NR_ORDEMSERVICO IS NOT NULL) sejam faturados mesmo sem conferência - comportamento comum em oficinas onde a OS já tem controle próprio.
Tabela Comparativa Resumida
| Opção | Nome | Pré-requisito | Checagem em MNF033 | Checagem em GERA_NOTAFISCAL | Cenário típico |
|---|
| N | Não (padrão) | - | Não aplica | Não aplica | Faturamento direto, sem exigência de pesagem/contagem prévia |
| S | Sim | TP_CONTROLELOTE = 'A' | PS_PEDIDO × PS_CONFERENCIA e QT_PEDIDA × QT_CONFERENCIA por item (UMNF033.pas:1207) | Chama VERIRICA_BLOQUEIONAOCONFERIDO → valida ITEMPEDIDO e ITEMPEDIDOSEMENTE | Distribuidoras com balança, recapadoras, empresas com lotes de grão/semente, oficinas com separação entre comercial e expedição |
Referências no Código Fonte
Checkbox e valor padrão
| Arquivo | Linha(s) | Trecho |
|---|
source/MFA001/UMFA001.dfm | 10154-10173 | chkST_BLOQFATNAOCONFERIDOS: TDBCheckBox com Caption = 'Validar Quantidade Conferida [MPD031/MPD091/MPD097]', DataField = 'ST_BLOQFATNAOCONFERIDOS', ValueChecked = 'S', ValueUnchecked = 'N', OnClick = chkST_BLOQFATNAOCONFERIDOSClick |
source/MFA001/UMFA001.pas | 612 | Declaração chkST_BLOQFATNAOCONFERIDOS: TDBCheckBox |
source/MFA001/UMFA001.pas | 837 | Declaração do handler chkST_BLOQFATNAOCONFERIDOSClick(Sender: TObject) |
source/MFA001/UMFA001.pas | 918 | Habilitação inicial: frmMFA001.chkST_BLOQFATNAOCONFERIDOS.Enabled := (dmMFA001.tabPARMFATURTP_CONTROLELOTE.AsString = 'A') |
source/MFA001/UMFA001.pas | 2442-2466 | cmbTP_CONTROLELOTEChange: quando TP_CONTROLELOTE = 'I', força ST_BLOQFATNAOCONFERIDOS := 'N' e desabilita o checkbox; quando <> 'I', libera |
source/MFA001/UMFA001.pas | 2605-2608 | Handler chkST_BLOQFATNAOCONFERIDOSClick: chkST_IGNORACONFERENCIAPEDIDOOS.Enabled := chkST_BLOQFATNAOCONFERIDOS.Checked (acopla o switch de "ignorar OS") |
source/MFA001/UdmMFA001.dfm | 273 | ST_BLOQFATNAOCONFERIDOS no SELECT do tabPARMFATUR |
source/MFA001/UdmMFA001.dfm | 1848-1851 | Campo tabPARMFATURST_BLOQFATNAOCONFERIDOS: TStringField (FieldName = 'ST_BLOQFATNAOCONFERIDOS', Origin = '"PARMFATUR"."ST_BLOQFATNAOCONFERIDOS"') |
source/MFA001/UdmMFA001.dfm | 2433 | ST_BLOQFATNAOCONFERIDOS na lista de colunas do SELECT principal |
source/MFA001/UdmMFA001.dfm | 2855 | ST_BLOQFATNAOCONFERIDOS = :ST_BLOQFATNAOCONFERIDOS no UPDATE gerado pelo FireDAC |
source/MFA001/UdmMFA001.dfm | 3153 | ST_BLOQFATNAOCONFERIDOS na query de navegação |
source/MFA001/UdmMFA001.pas | 261 | Declaração tabPARMFATURST_BLOQFATNAOCONFERIDOS: TStringField |
source/MFA001/UdmMFA001.pas | 556 | AfterInsert: tabPARMFATURST_BLOQFATNAOCONFERIDOS.AsString := 'N' (valor padrão) |
source/MFA001/UdmMFA001.pas | 1456 | AfterScroll: frmMFA001.chkST_IGNORACONFERENCIAPEDIDOOS.Enabled := frmMFA001.chkST_BLOQFATNAOCONFERIDOS.Checked (reaplicação do acoplamento ao trocar registro) |
Consumidores (leem o parâmetro)
| Arquivo | Linha(s) | Uso |
|---|
source/MNF033/UMNF033.pas | 1207-1217 | if (ParmFatur.Values['ST_BLOQFATNAOCONFERIDOS'] = 'S') → compara PS_PEDIDO × PS_CONFERENCIA e QT_PEDIDA × QT_CONFERENCIA de cada item do pedido na vinculação; diverge → raise JException('W-0000', ['Pedido ... não foi conferido. Verifique![MPD031, MPD091, MPD097]']) |
Scripts SQL (Firebird)
| Arquivo | Linha(s) | Uso |
|---|
Scripts/GERA_NOTAFISCAL.sql | 160 | declare variable V_ST_BLOQFATNAOCONFERIDOS DOM_CHAR1 |
Scripts/GERA_NOTAFISCAL.sql | 260 | SELECT ... P.ST_BLOQFATNAOCONFERIDOS, 'N', ... FROM PARMFATUR P |
Scripts/GERA_NOTAFISCAL.sql | 267 | INTO ... :V_ST_BLOQFATNAOCONFERIDOS, :V_ST_IGNORACONFERENCIAPEDIDOOS, ... |
Scripts/GERA_NOTAFISCAL.sql | 427-435 | IF ((V_TP_NOTA = 'S') AND (V_ST_BLOQFATNAOCONFERIDOS = 'S')) THEN → SELECT S.O_DS_MSG FROM VERIRICA_BLOQUEIONAOCONFERIDO(:V_CD_EMPRESA, :V_NR_LANCAMENTO, :V_CD_SERIE, :V_TP_NOTA, :V_ST_IGNORACONFERENCIAPEDIDOOS) S INTO :V_MENSAGEM; se não nulo, SUSPEND; EXIT |
Scripts/VERIRICA_BLOQUEIONAOCONFERIDO.sql | inteiro | Corpo da procedure: valida ITEMPEDIDO (saldo + conferência iniciada ou ITEM.ST_CONFERENCIA='S') e ITEMPEDIDOSEMENTE (saldo de lote); respeita I_ST_IGNORACONFERENCIAPEDIDOOS para pedidos de OS |
Tabelas afetadas (DDL)
| Arquivo | Linha | Campo |
|---|
docs/schema/tables/PARMFATUR.sql | 205 | ST_BLOQFATNAOCONFERIDOS DOM_CHAR1 DEFAULT 'N' NOT NULL |