Pular para o conteúdo principal

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:

  1. 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]".
  2. 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óduloCódigoUso
Parâmetros de FaturamentoMFA001Único local de configuração (chkST_BLOQFATNAOCONFERIDOS em UMFA001.dfm:10154-10173). Habilitação condicionada a TP_CONTROLELOTE = 'A'
Faturamento de PedidosMNF033Lê 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/PesagemMPD031Tela onde o usuário preenche ITEMPEDIDO.PS_CONFERENCIA / ITEMPEDIDO.QT_CONFERENCIA e ITEMPEDIDOSEMENTE.QT_CONFERIDA - dados que zeram o bloqueio
Conferência ItemMPD091Conferência por item/lote; alimenta os mesmos campos de conferência
ConferênciaMPD097Conferência alternativa; também alimenta ITEMPEDIDO.PS_CONFERENCIA/QT_CONFERENCIA

Procedures impactadas​

ObjetoArquivoPapel
GERA_NOTAFISCALScripts/GERA_NOTAFISCAL.sql:160, 260, 267, 427-435Lê 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_BLOQUEIONAOCONFERIDOScripts/VERIRICA_BLOQUEIONAOCONFERIDO.sqlProcedure 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.CampoTipoDescrição
PARMFATUR.ST_BLOQFATNAOCONFERIDOSDOM_CHAR1 DEFAULT 'N' NOT NULLO próprio parâmetro (docs/schema/tables/PARMFATUR.sql:205, UdmMFA001.dfm:1848-1851). Domínio 'S'/'N'
PARMFATUR.ST_IGNORACONFERENCIAPEDIDOOSDOM_CHAR1Parâ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_CONTROLELOTEDOM_CHAR1Pré-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_CONFERENCIANUMERICPeso pedido vs peso conferido (saldo de conferência em peso)
ITEMPEDIDO.QT_PEDIDA / QT_CONFERENCIANUMERICQuantidade pedida vs quantidade conferida
ITEM.ST_CONFERENCIACHAR(1)Flag "este item exige conferência". Usado no WHERE de VERIRICA_BLOQUEIONAOCONFERIDO (linha 33)
ITEMPEDIDOSEMENTE.QT_LOTE / QT_CONFERIDANUMERICConferência por lote/semente. Verificada na 2ª query da procedure
PEDIDO.NR_ORDEMSERVICOINTEGERSe 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 fazDetalhe
UI MFA001Checkbox "Validar Quantidade Conferida" desmarcado. O acoplado "Ignorar Pedidos Gerados por O.S." fica desabilitado (UMFA001.pas:2607)
MNF033O 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_NOTAFISCALIF ((V_TP_NOTA = 'S') AND (V_ST_BLOQFATNAOCONFERIDOS = 'S')) em GERA_NOTAFISCAL.sql:427 é falso → VERIRICA_BLOQUEIONAOCONFERIDO não é chamada
ResultadoNF 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​

  1. Em MFA001 → aba Pedidos / O.S. → Opção 1 → desmarque o checkbox "Validar Quantidade Conferida [MPD031/MPD091/MPD097]"
  2. Salve os parâmetros → PARMFATUR.ST_BLOQFATNAOCONFERIDOS = 'N'
  3. Crie um pedido em MPD002 com o item I001 qt 10 (ITEMPEDIDO.QT_PEDIDA = 10, QT_CONFERENCIA = 0)
  4. Sem passar pela conferência MPD031/MPD091/MPD097, abra MNF033 e vincule o pedido à nota
  5. O loop de itens em UMNF033.pas:1204-1237 executa sem testar conferência
  6. Emita a nota em MNF002 → GERA_NOTAFISCAL chega na linha 427 com V_ST_BLOQFATNAOCONFERIDOS = 'N' → pula o bloco
  7. 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 fazDetalhe
UI MFA001Checkbox 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çãoUMNF033.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_NOTAFISCALIF ((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
ProcedureVERIRICA_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 OSSe 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​

  1. Em MFA001, garanta que Tipo Controle de Lote = Ativo (TP_CONTROLELOTE = 'A') → o checkbox "Validar Quantidade Conferida" fica habilitado
  2. Marque o checkbox "Validar Quantidade Conferida [MPD031/MPD091/MPD097]" → ST_BLOQFATNAOCONFERIDOS = 'S'
  3. (Opcional) Decida se quer ignorar pedidos vindos de OS marcando "Ignorar Pedidos Gerados por O.S.[MOF001]" (ST_IGNORACONFERENCIAPEDIDOOS = 'S')
  4. Salve os parâmetros
  5. Crie um pedido em MPD002 com item I001 qt 10 (e ITEM.ST_CONFERENCIA = 'S' cadastrado em TMPTI ou equivalente)
  6. Abra MPD031 e confira apenas 7 unidades (IP.QT_CONFERENCIA = 7)
  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]"
  8. 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
  9. Usuário precisa voltar a MPD031/MPD091/MPD097 e conferir as 3 unidades restantes (QT_CONFERENCIA = 10) para desbloquear
  10. 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âmetroO que controlaQuando bloqueiaCampo-chave
ST_CONTENTREGACONFConferência de entrega (endereço/frete) no MPD002/MOF001Ao emitir NF em GERA_NOTAFISCAL se PEDIDO.ST_ENTREGAOFICINA = 'N'PEDIDO.ST_ENTREGAOFICINA
TP_CONFERENCIAPEDIDOQual tipo de divergência de quantidade/peso é bloqueada dentro da conferência (MPD031/MPD091)Durante a conferência, ao gravar ITEMPEDIDO.QT_CONFERENCIA/PS_CONFERENCIAITEMPEDIDO.QT/PS_CONFERENCIA
ST_BLOQFATNAOCONFERIDOSSe a NF é bloqueada caso algum pedido/lote ainda tenha saldo pendente de conferênciaAo 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çãoNomePré-requisitoChecagem em MNF033Checagem em GERA_NOTAFISCALCenário típico
NNão (padrão)-Não aplicaNão aplicaFaturamento direto, sem exigência de pesagem/contagem prévia
SSimTP_CONTROLELOTE = 'A'PS_PEDIDO × PS_CONFERENCIA e QT_PEDIDA × QT_CONFERENCIA por item (UMNF033.pas:1207)Chama VERIRICA_BLOQUEIONAOCONFERIDO → valida ITEMPEDIDO e ITEMPEDIDOSEMENTEDistribuidoras 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​

ArquivoLinha(s)Trecho
source/MFA001/UMFA001.dfm10154-10173chkST_BLOQFATNAOCONFERIDOS: TDBCheckBox com Caption = 'Validar Quantidade Conferida [MPD031/MPD091/MPD097]', DataField = 'ST_BLOQFATNAOCONFERIDOS', ValueChecked = 'S', ValueUnchecked = 'N', OnClick = chkST_BLOQFATNAOCONFERIDOSClick
source/MFA001/UMFA001.pas612Declaração chkST_BLOQFATNAOCONFERIDOS: TDBCheckBox
source/MFA001/UMFA001.pas837Declaração do handler chkST_BLOQFATNAOCONFERIDOSClick(Sender: TObject)
source/MFA001/UMFA001.pas918Habilitação inicial: frmMFA001.chkST_BLOQFATNAOCONFERIDOS.Enabled := (dmMFA001.tabPARMFATURTP_CONTROLELOTE.AsString = 'A')
source/MFA001/UMFA001.pas2442-2466cmbTP_CONTROLELOTEChange: quando TP_CONTROLELOTE = 'I', força ST_BLOQFATNAOCONFERIDOS := 'N' e desabilita o checkbox; quando <> 'I', libera
source/MFA001/UMFA001.pas2605-2608Handler chkST_BLOQFATNAOCONFERIDOSClick: chkST_IGNORACONFERENCIAPEDIDOOS.Enabled := chkST_BLOQFATNAOCONFERIDOS.Checked (acopla o switch de "ignorar OS")
source/MFA001/UdmMFA001.dfm273ST_BLOQFATNAOCONFERIDOS no SELECT do tabPARMFATUR
source/MFA001/UdmMFA001.dfm1848-1851Campo tabPARMFATURST_BLOQFATNAOCONFERIDOS: TStringField (FieldName = 'ST_BLOQFATNAOCONFERIDOS', Origin = '"PARMFATUR"."ST_BLOQFATNAOCONFERIDOS"')
source/MFA001/UdmMFA001.dfm2433ST_BLOQFATNAOCONFERIDOS na lista de colunas do SELECT principal
source/MFA001/UdmMFA001.dfm2855ST_BLOQFATNAOCONFERIDOS = :ST_BLOQFATNAOCONFERIDOS no UPDATE gerado pelo FireDAC
source/MFA001/UdmMFA001.dfm3153ST_BLOQFATNAOCONFERIDOS na query de navegação
source/MFA001/UdmMFA001.pas261Declaração tabPARMFATURST_BLOQFATNAOCONFERIDOS: TStringField
source/MFA001/UdmMFA001.pas556AfterInsert: tabPARMFATURST_BLOQFATNAOCONFERIDOS.AsString := 'N' (valor padrão)
source/MFA001/UdmMFA001.pas1456AfterScroll: frmMFA001.chkST_IGNORACONFERENCIAPEDIDOOS.Enabled := frmMFA001.chkST_BLOQFATNAOCONFERIDOS.Checked (reaplicação do acoplamento ao trocar registro)

Consumidores (leem o parâmetro)​

ArquivoLinha(s)Uso
source/MNF033/UMNF033.pas1207-1217if (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)​

ArquivoLinha(s)Uso
Scripts/GERA_NOTAFISCAL.sql160declare variable V_ST_BLOQFATNAOCONFERIDOS DOM_CHAR1
Scripts/GERA_NOTAFISCAL.sql260SELECT ... P.ST_BLOQFATNAOCONFERIDOS, 'N', ... FROM PARMFATUR P
Scripts/GERA_NOTAFISCAL.sql267INTO ... :V_ST_BLOQFATNAOCONFERIDOS, :V_ST_IGNORACONFERENCIAPEDIDOOS, ...
Scripts/GERA_NOTAFISCAL.sql427-435IF ((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.sqlinteiroCorpo 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)​

ArquivoLinhaCampo
docs/schema/tables/PARMFATUR.sql205ST_BLOQFATNAOCONFERIDOS DOM_CHAR1 DEFAULT 'N' NOT NULL