Pular para o conteúdo principal

Bloqueio de Alteração da Nota Fiscal quando tiver Pedido

Tela de configuração: MFA001 - Parâmetros de Faturamento Localização: Parâmetros → Notas Fiscais → label "Bloqueia Alteração da Nota se tiver Pedido" (UMFA001.dfm linha 6075 / combo cmbST_ALTERANOTA linhas 6760-6788) Tabela: PARMFATUR.ST_ALTERANOTA Valor padrão: N (Não — Permite Alterar) — definido em UdmMFA001.pas linha 467 (AfterInsert)

Define se o sistema bloqueia a alteração dos itens/totais da Nota Fiscal quando ela foi gerada a partir de um Pedido (ou seja, quando existe vínculo NOTA → PEDIDO). Controla a edição dos campos da grade de itens (CD_ITEM, CD_TABPRECO, QT_ITEMNOTA, PS_ITEMNOTA, VL_UNITARIO, VL_TOTAL, PC_DESCONTO, VL_DESCONTO) e dos totais da nota (despesas, desconto geral, comissão geral), impedindo que o usuário altere quantidades, pesos, preços ou descontos após a conversão do pedido em nota.

O parâmetro diferencia o tipo de nota afetado pelo bloqueio: apenas Venda (S), apenas Compra/Entrada (E), ambas (T) ou nenhuma (N). Também interage com ST_BLOQUEIADESCPROM (promoções), ST_TABPRECO (tabela de preços) e ST_REPROCESSATABPRECO (reprocessamento ao trocar condição de pagamento).

Telas impactadas​

MóduloCódigoArquivoDescrição
Parâmetros FaturamentoMFA001UMFA001.dfm, UdmMFA001.pasConfiguração do parâmetro
Nota Fiscal EntradaMNF001UMNF001.pas, UdmMNF001.pasBloqueia grade/detalhes da NF de entrada vinda de Pedido de Compra (opções E ou T)
Nota Fiscal SaídaMNF002UMNF002.pas, UdmMNF002.pasBloqueia grade/detalhes da NF de saída vinda de Pedido de Venda (opções S ou T). Bloqueia reprocessamento de tabela de preço, validação de desconto promocional, validação de peso/quantidade contra o pedido
Nota Fiscal (Outro Tipo)MNF008UMNF008.pas, UdmMNF008.pasMesmo comportamento de MNF002 (grade ReadOnly e bloqueio de reprocessamento)
NF Ordem (Pedido → Nota)MPD011UNFORDEM.pasDesabilita grpITEMNOTA no FormShow quando ST_ALTERANOTA ∈ (S,T)
NF Ordem RecapadoraMRC020UMRC020NFORDEM.pas, UdmMRC020NFORDEM.pasDesabilita grpITEMNOTA no FormShow; lógica adicional em HabilitaReadOnly consulta o combo de valores ['S','T','N','E']
Manutenção ComercialMCO006UdmMCO006.pasInclui ST_ALTERANOTA no SELECT da PARMFATUR (leitura)
Consulta PedidosCPD009UdmCPD009.dfmCopia ST_ALTERANOTA da PARMFATUR (cópia de parâmetros entre empresas)
Pedidos RecapadoraRCA006UdmRCA006.dfmCopia ST_ALTERANOTA da PARMFATUR

Importante — campo homônimo: existe um campo ST_ALTERANOTA também na tabela PARMUSUARIO (configurado em ADM012 como checkbox chkST_ALTERANOTA e copiado em ADM013). Esse campo é uma permissão do usuário (S/N) que libera o botão "Atualizar Dados da Nota Fiscal" no CNF011 (UCNF011.pas linha 7437). Ele NÃO é controlado por este documento — o parâmetro aqui documentado é estritamente PARMFATUR.ST_ALTERANOTA.

Procedures impactadas​

Nenhuma stored procedure ou view do diretório Scripts/ consome PARMFATUR.ST_ALTERANOTA. O bloqueio é implementado exclusivamente em código Delphi (lado cliente), via ReadOnly nos TField da grade de itens e Enabled := False no grupo visual.

Campos envolvidos​

Campo / VariávelOrigemDescrição
ST_ALTERANOTAPARMFATURParâmetro principal (este documento)
parmfatur.values['ST_ALTERANOTA']TStringList em memóriaChave usada em tempo de execução em MNF002/MNF008/MPD011
ParmFiscal.Values['ST_ALTERANOTA']TStringList em memóriaMesma leitura, alias usado nos eventos de validação de itens
iST_ALTERANOTAvariável do DataModuleCache local do parâmetro em MNF001/MNF008/MRC020NFORDEM
tabITEMNOTAPS_PEDIDO / tabITEMNOTAQT_PEDIDAITEMNOTAPeso/Quantidade originalmente informados no pedido — usados para validar se a NF difere do pedido
dmMNF002.iPedidovariável internaIndica se a NF foi gerada a partir de pedido ('S')
ST_BLOQUEIADESCPROMPARMFATURComplementar — só é avaliado quando ST_ALTERANOTA NÃO é S/T (MNF002 linhas 5788, 6697)
ST_REPROCESSATABPRECOPARMFATURComplementar — reprocessamento da tabela de preço é suprimido quando ST_ALTERANOTA ∈ (S,T) e a nota veio de pedido (MNF002 linha 7985, MNF008 linha 2917)

Opções disponíveis​

Valores do combo (DFM UMFA001.dfm linhas 6779-6783): Somente na Venda → S, Somente na Compra → E, Compra e Venda → T, Não (Permite Alterar) → N

S - Somente na Venda​

O que fazDetalhe
NF de Saída (MNF002/MNF008) gerada de PedidoBloqueia a grade de itens e o grupo de detalhes (ReadOnly := True)
Campos bloqueados na gradeCD_ITEM, CD_TABPRECO, PS_ITEMNOTA, QT_ITEMNOTA, VL_UNITARIO, VL_TOTAL, PC_DESCONTO, VL_DESCONTO
Campos bloqueados nos totaisVL_DESPESA, PC_DESCONTO2, VL_COMISSAOGERAL, PC_COMISSAOGERAL, VL_DESCONTO, CD_PESSOA
Reprocessamento de tabela de preço ao trocar condição de pagamentoNão executa em MNF002/MNF008 quando a NF veio de pedido (iPedido = 'S')
Validação peso ≠ pedidoAtiva — dispara JException "O Peso do Produto da Nota não pode ser Diferente que o Selecionada no Pedido" (MNF002 linha 6181)
Validação quantidade ≠ pedidoAtiva — dispara JException "A Quantidade do Produto da Nota [X] não pode ser Diferente que a Selecionada no Pedido [Y]" (MNF002 linha 6523)
Bloqueio de desconto promocional (ST_BLOQUEIADESCPROM)Não é aplicado (o bloqueio da promoção é pulado porque a grade já está toda ReadOnly)
NF de Entrada (MNF001)Não afeta — MNF001 só age quando o valor é E ou T
NF pela Ordem de Carregamento (MPD011/MRC020)Desabilita grpITEMNOTA na abertura da tela

Simulação passo a passo​

  1. Em MFA001 → Notas Fiscais → ST_ALTERANOTA = "Somente na Venda"
  2. Salve (F6)
  3. Abra um Pedido de Venda (MPD002) e grave-o
  4. Gere a Nota Fiscal de Saída a partir desse pedido em MNF002 (selecionando o pedido na lista)
  5. A grade de itens fica toda cinza/ReadOnly — não é possível clicar em CD_ITEM, alterar preço, quantidade, peso ou desconto
  6. Os campos de cabeçalho bloqueados: Despesas, Desconto Geral, Comissão Geral, Cliente
  7. Tente alterar a condição de pagamento → a tela NÃO pergunta se deseja reprocessar a tabela de preço
  8. Altere o vínculo manualmente no banco para quantidade diferente → ao abrir a NF, se o peso ou quantidade da NF divergir do pedido, o sistema dispara a exceção "O Peso do Produto da Nota não pode ser Diferente..."
  9. Gere uma NF de Entrada em MNF001 a partir de Pedido de Compra → a grade permanece editável (esse valor só afeta venda)

Resultado esperado: Toda alteração de itens/totais na NF de saída gerada de pedido fica desabilitada. A NF reflete exatamente o pedido; qualquer ajuste precisa ser feito no próprio pedido. NF de entrada permanece livre.


E - Somente na Compra​

O que fazDetalhe
NF de Entrada (MNF001) gerada de Pedido de CompraBloqueia a grade e o grupo de detalhes do produto (gridITEMNOTA.ReadOnly := True, grpDetProd.Enabled := False) em UMNF001.pas linha 1413-1414
NF de Saída (MNF002/MNF008)Não afeta — MNF002 só age quando o valor é S ou T
Validações de peso/quantidade vs pedido em MNF002Não executa
Reprocessamento de tabela de preço em MNF002Executa normalmente (não é suprimido)
Desconto promocional (ST_BLOQUEIADESCPROM) em MNF002É avaliado normalmente
NF pela Ordem (MPD011/MRC020)Não desabilita grpITEMNOTA (o código só reage a S/T)

Simulação passo a passo​

  1. Em MFA001 → ST_ALTERANOTA = "Somente na Compra"
  2. Salve (F6)
  3. Abra um Pedido de Compra (MPD001) e grave
  4. Gere a NF de Entrada em MNF001 a partir desse pedido
  5. A grade de itens e o grupo de detalhes do produto ficam bloqueados
  6. Tente alterar preço/quantidade do item → não é possível
  7. Abra uma NF de Saída (MNF002) gerada de pedido de venda → a grade permanece editável (essa opção só afeta compra)

Resultado esperado: Alterações na NF de entrada vinda de Pedido de Compra ficam desabilitadas; NF de saída permanece livre para edição.


T - Compra e Venda​

O que fazDetalhe
NF de Entrada (MNF001) gerada de Pedido de CompraBloqueia grade e detalhes (igual opção E)
NF de Saída (MNF002/MNF008) gerada de Pedido de VendaBloqueia grade e totais (igual opção S)
Reprocessamento de tabela de preço em MNF002/MNF008Suprimido quando a NF veio de pedido
Validações peso ≠ pedido / quantidade ≠ pedidoAtivas
NF pela Ordem (MPD011/MRC020)Desabilita grpITEMNOTA
Bloqueio de desconto promocionalPulado (grade já toda bloqueada)
Combina efeitosSoma de S + E

Simulação passo a passo​

  1. Em MFA001 → ST_ALTERANOTA = "Compra e Venda"
  2. Salve (F6)
  3. Gere uma NF de Saída em MNF002 a partir de Pedido de Venda → grade ReadOnly e totais bloqueados
  4. Gere uma NF de Entrada em MNF001 a partir de Pedido de Compra → grade ReadOnly e detalhes bloqueados
  5. Em ambos os casos, ajustes precisam voltar ao pedido de origem

Resultado esperado: A nota espelha exatamente o pedido tanto na saída quanto na entrada; nenhuma alteração de item ou total é permitida.


N - Não (Permite Alterar)​

O que fazDetalhe
NF de Saída/EntradaGrade e totais permanecem editáveis mesmo quando a NF foi gerada de pedido
Reprocessamento de tabela de preço em MNF002/MNF008Executa normalmente ao trocar condição de pagamento
Validação de desconto promocional (ST_BLOQUEIADESCPROM)Avaliada (a grade fica ReadOnly apenas se o item estiver em promoção)
Validação peso/quantidade ≠ pedidoNão dispara (o código só executa quando ST_ALTERANOTA ∈ (S,T))
NF pela Ordem (MPD011/MRC020)grpITEMNOTA permanece habilitado

Simulação passo a passo​

  1. Em MFA001 → ST_ALTERANOTA = "Não (Permite Alterar)"
  2. Salve (F6)
  3. Gere uma NF de Saída em MNF002 a partir de um Pedido de Venda
  4. Altere preço, quantidade ou desconto do item → alteração aceita, sem validação contra o pedido
  5. Altere a condição de pagamento → o sistema pergunta (ou reprocessa automaticamente, conforme ST_REPROCESSATABPRECO) os preços
  6. Se o item estiver marcado como promoção e ST_BLOQUEIADESCPROM = 'S', os campos de desconto/valor unitário ficam ReadOnly (regra de promoção assume o controle)

Resultado esperado: O operador tem liberdade total para ajustar a NF após a geração a partir do pedido. É o comportamento padrão ao criar um novo registro no MFA001.

Este é o valor padrão ao criar um novo registro no MFA001 (UdmMFA001.pas linha 467 — AfterInsert atribui 'N').


Tabela Comparativa Resumida​

OpçãoDescriçãoNF Saída (MNF002/008) ReadOnly?NF Entrada (MNF001) ReadOnly?NF pela Ordem (MPD011/MRC020)Valida peso/qtde vs pedido?Reprocessa tab. preço?
SSomente na VendaSim (se veio de pedido)NãoDesabilita grpITEMNOTASimNão (se veio de pedido)
ESomente na CompraNãoSim (se veio de pedido)Não desabilitaNãoSim
TCompra e VendaSimSimDesabilitaSimNão (se veio de pedido)
NNão (Permite Alterar)NãoNãoNão desabilitaNãoSim

Interação com outros parâmetros​

  • ST_BLOQUEIADESCPROM: em MNF002 (UdmMNF002.pas linhas 5788, 6697) a regra de promoção só é avaliada quando ST_ALTERANOTA NÃO é S/T — se a grade já está bloqueada pela opção de alteração, a regra de promoção torna-se redundante.
  • ST_TABPRECO: em VerificaBloqTabPreco (UdmMNF002.pas linha 10030) só libera/bloqueia os campos de preço quando ST_ALTERANOTA NÃO é S/T.
  • ST_REPROCESSATABPRECO: em MNF002 (linha 7985) e MNF008 (linha 2917) o reprocessamento é suprimido se a NF veio de pedido E ST_ALTERANOTA ∈ (S,T).
  • PARMUSUARIO.ST_ALTERANOTA (campo homônimo): permissão por usuário usada no CNF011 para liberar "Atualizar Dados da Nota Fiscal" — não se confunde com este parâmetro.

Referências no Código Fonte​

Tela MFA001 (configuração)​

  • source/MFA001/UMFA001.dfm linhas 6069-6083 — label "Bloqueia Alteração da Nota se tiver Pedido"
  • source/MFA001/UMFA001.dfm linhas 6760-6788 — combo cmbST_ALTERANOTA (items 'Somente na Venda'→S, 'Somente na Compra'→E, 'Compra e Venda'→T, 'Não (Permite Alterar)'→N)
  • source/MFA001/UMFA001.pas linha 384 — declaração cmbST_ALTERANOTA: TwwDBComboBox
  • source/MFA001/UdmMFA001.pas linha 111 — tabPARMFATURST_ALTERANOTA: TStringField
  • source/MFA001/UdmMFA001.pas linha 467 — AfterInsert: valor padrão 'N'
  • source/MFA001/UdmMFA001.dfm linhas 1011-1014 — FieldName = 'ST_ALTERANOTA', Size = 1
  • source/MFA001/UdmMFA001.dfm linhas 121, 2352, 2501, 2698, 3001 — SELECT, INSERT e UPDATE da PARMFATUR

MNF001 (NF Entrada)​

  • source/MNF001/UdmMNF001.pas linha 1112 — declaração iST_ALTERANOTA
  • source/MNF001/UdmMNF001.pas linhas 1376, 1409 — SELECT da PARMFATUR, leitura em Resultado[17]
  • source/MNF001/UMNF001.pas linhas 1410-1414 — if (iST_ALTERANOTA in ['E','T']) and (iPedido = 'S') → gridITEMNOTA.ReadOnly := True, grpDetProd.Enabled := False

MNF002 (NF Saída)​

  • source/MNF002/UdmMNF002.pas linha 5788 — no validate do tabela de preço: só aplica regra de promoção se ST_ALTERANOTA não é S/T
  • source/MNF002/UdmMNF002.pas linha 6177 — validate do peso: dispara exceção se peso da NF ≠ peso do pedido
  • source/MNF002/UdmMNF002.pas linha 6519 — validate da quantidade: dispara exceção se qtde da NF ≠ qtde do pedido
  • source/MNF002/UdmMNF002.pas linha 6697 — AfterScroll do item: regra de promoção dependente
  • source/MNF002/UdmMNF002.pas linha 10030 — VerificaBloqTabPreco: define ReadOnly dos campos de preço
  • source/MNF002/UdmMNF002.pas linha 10496 — SELECT da PARMFATUR incluindo ST_ALTERANOTA
  • source/MNF002/UMNF002.pas linha 2925 — após selecionar pedido: ReadOnly := True em CD_ITEM, CD_TABPRECO, PS_ITEMNOTA, QT_ITEMNOTA, VL_UNITARIO, VL_TOTAL, PC_DESCONTO, VL_DESCONTO, VL_DESPESA, PC_DESCONTO2, VL_COMISSAOGERAL, PC_COMISSAOGERAL, VL_DESCONTO, CD_PESSOA
  • source/MNF002/UMNF002.pas linha 7985 — exit da condição de pagamento: suprime reprocessamento da tabela de preço se ST_ALTERANOTA ∈ (S,T) e iPedido = 'S'

MNF008 (NF Outro Tipo)​

  • source/MNF008/UdmMNF008.pas linhas 483, 656, 691 — declaração/SELECT/leitura de iST_ALTERANOTA
  • source/MNF008/UdmMNF008.pas linha 761 — SELECT com P.ST_ALTERANOTA
  • source/MNF008/UMNF008.pas linhas 988-993 — após selecionar pedido: gridITEMNOTA.ReadOnly := True, grpDetProd.Enabled := False
  • source/MNF008/UMNF008.pas linha 2917 — exit da condição de pagamento: suprime reprocessamento

MPD011 (NF pela Ordem)​

  • source/MPD011/UNFORDEM.pas linhas 2076-2081 — FormShow: grpITEMNOTA.Enabled := False se ST_ALTERANOTA ∈ (S,T)
  • source/MPD011/UdmMPD011.pas linha 1579 — SELECT da PARMFATUR incluindo ST_ALTERANOTA

MRC020 (NF Recapadora pela Ordem)​

  • source/MRC020/UdmMRC020NFORDEM.pas linhas 433, 566, 588 — declaração/SELECT/leitura em Resultado[12]
  • source/MRC020/UMRC020NFORDEM.pas linhas 2317-2322 — FormShow: grpITEMNOTA.Enabled := False se iST_ALTERANOTA ∈ (S,T)
  • source/MRC020/UMRC020NFORDEM.pas linhas 2509, 2525 — HabilitaReadOnly: valida ParmFatur.Values['ST_ALTERANOTA'][1] in ['S','T','N','E']

MCO006 (Comercial)​

  • source/MCO006/UdmMCO006.pas linha 2105 — SELECT com P.ST_ALTERANOTA (apenas leitura)

Cópias entre empresas / consultas​

  • source/CPD009/UdmCPD009.dfm linhas 297, 361, 444, 579 — SELECT, INSERT e UPDATE da PARMFATUR
  • source/RCA006/UdmRCA006.dfm linhas 3046, 3110, 3193, 3328 — idem

Campo homônimo PARMUSUARIO (não é este parâmetro)​

  • source/ADM012/UdmADM012.pas linha 70 — tabPARMUSUARIOST_ALTERANOTA
  • source/ADM012/UdmADM012.pas linha 256 — valor padrão 'N'
  • source/ADM012/UADM012.pas linha 112 — chkST_ALTERANOTA: TDBCheckBox
  • source/ADM012/UADM012.dfm linhas 1222-1229 — DataField = 'ST_ALTERANOTA'
  • source/ADM013/UADM013.pas linhas 476, 491, 528 — cópia de parâmetros do usuário
  • source/CNF011/UCNF011.pas linhas 415-419, 7437-7438 — SELECT em PARMUSUARIO e validação "O Usuário Não Tem Acesso a Alteração de Nota"