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.dfmlinha 6075 / combocmbST_ALTERANOTAlinhas 6760-6788) Tabela:PARMFATUR.ST_ALTERANOTAValor padrão:N(Não — Permite Alterar) — definido emUdmMFA001.paslinha 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ódulo | Código | Arquivo | Descrição |
|---|---|---|---|
| Parâmetros Faturamento | MFA001 | UMFA001.dfm, UdmMFA001.pas | Configuração do parâmetro |
| Nota Fiscal Entrada | MNF001 | UMNF001.pas, UdmMNF001.pas | Bloqueia grade/detalhes da NF de entrada vinda de Pedido de Compra (opções E ou T) |
| Nota Fiscal Saída | MNF002 | UMNF002.pas, UdmMNF002.pas | Bloqueia 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) | MNF008 | UMNF008.pas, UdmMNF008.pas | Mesmo comportamento de MNF002 (grade ReadOnly e bloqueio de reprocessamento) |
| NF Ordem (Pedido → Nota) | MPD011 | UNFORDEM.pas | Desabilita grpITEMNOTA no FormShow quando ST_ALTERANOTA ∈ (S,T) |
| NF Ordem Recapadora | MRC020 | UMRC020NFORDEM.pas, UdmMRC020NFORDEM.pas | Desabilita grpITEMNOTA no FormShow; lógica adicional em HabilitaReadOnly consulta o combo de valores ['S','T','N','E'] |
| Manutenção Comercial | MCO006 | UdmMCO006.pas | Inclui ST_ALTERANOTA no SELECT da PARMFATUR (leitura) |
| Consulta Pedidos | CPD009 | UdmCPD009.dfm | Copia ST_ALTERANOTA da PARMFATUR (cópia de parâmetros entre empresas) |
| Pedidos Recapadora | RCA006 | UdmRCA006.dfm | Copia ST_ALTERANOTA da PARMFATUR |
Importante — campo homônimo: existe um campo
ST_ALTERANOTAtambém na tabelaPARMUSUARIO(configurado em ADM012 como checkboxchkST_ALTERANOTAe 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.paslinha 7437). Ele NÃO é controlado por este documento — o parâmetro aqui documentado é estritamentePARMFATUR.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ável | Origem | Descrição |
|---|---|---|
ST_ALTERANOTA | PARMFATUR | Parâmetro principal (este documento) |
parmfatur.values['ST_ALTERANOTA'] | TStringList em memória | Chave usada em tempo de execução em MNF002/MNF008/MPD011 |
ParmFiscal.Values['ST_ALTERANOTA'] | TStringList em memória | Mesma leitura, alias usado nos eventos de validação de itens |
iST_ALTERANOTA | variável do DataModule | Cache local do parâmetro em MNF001/MNF008/MRC020NFORDEM |
tabITEMNOTAPS_PEDIDO / tabITEMNOTAQT_PEDIDA | ITEMNOTA | Peso/Quantidade originalmente informados no pedido — usados para validar se a NF difere do pedido |
dmMNF002.iPedido | variável interna | Indica se a NF foi gerada a partir de pedido ('S') |
ST_BLOQUEIADESCPROM | PARMFATUR | Complementar — só é avaliado quando ST_ALTERANOTA NÃO é S/T (MNF002 linhas 5788, 6697) |
ST_REPROCESSATABPRECO | PARMFATUR | Complementar — 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.dfmlinhas 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 faz | Detalhe |
|---|---|
| NF de Saída (MNF002/MNF008) gerada de Pedido | Bloqueia a grade de itens e o grupo de detalhes (ReadOnly := True) |
| Campos bloqueados na grade | CD_ITEM, CD_TABPRECO, PS_ITEMNOTA, QT_ITEMNOTA, VL_UNITARIO, VL_TOTAL, PC_DESCONTO, VL_DESCONTO |
| Campos bloqueados nos totais | VL_DESPESA, PC_DESCONTO2, VL_COMISSAOGERAL, PC_COMISSAOGERAL, VL_DESCONTO, CD_PESSOA |
| Reprocessamento de tabela de preço ao trocar condição de pagamento | Não executa em MNF002/MNF008 quando a NF veio de pedido (iPedido = 'S') |
| Validação peso ≠ pedido | Ativa — dispara JException "O Peso do Produto da Nota não pode ser Diferente que o Selecionada no Pedido" (MNF002 linha 6181) |
| Validação quantidade ≠ pedido | Ativa — 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
- Em MFA001 → Notas Fiscais → ST_ALTERANOTA = "Somente na Venda"
- Salve (F6)
- Abra um Pedido de Venda (MPD002) e grave-o
- Gere a Nota Fiscal de Saída a partir desse pedido em MNF002 (selecionando o pedido na lista)
- A grade de itens fica toda cinza/ReadOnly — não é possível clicar em CD_ITEM, alterar preço, quantidade, peso ou desconto
- Os campos de cabeçalho bloqueados: Despesas, Desconto Geral, Comissão Geral, Cliente
- Tente alterar a condição de pagamento → a tela NÃO pergunta se deseja reprocessar a tabela de preço
- 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..."
- 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 faz | Detalhe |
|---|---|
| NF de Entrada (MNF001) gerada de Pedido de Compra | Bloqueia 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 MNF002 | Não executa |
| Reprocessamento de tabela de preço em MNF002 | Executa 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
- Em MFA001 → ST_ALTERANOTA = "Somente na Compra"
- Salve (F6)
- Abra um Pedido de Compra (MPD001) e grave
- Gere a NF de Entrada em MNF001 a partir desse pedido
- A grade de itens e o grupo de detalhes do produto ficam bloqueados
- Tente alterar preço/quantidade do item → não é possível
- 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 faz | Detalhe |
|---|---|
| NF de Entrada (MNF001) gerada de Pedido de Compra | Bloqueia grade e detalhes (igual opção E) |
| NF de Saída (MNF002/MNF008) gerada de Pedido de Venda | Bloqueia grade e totais (igual opção S) |
| Reprocessamento de tabela de preço em MNF002/MNF008 | Suprimido quando a NF veio de pedido |
| Validações peso ≠ pedido / quantidade ≠ pedido | Ativas |
| NF pela Ordem (MPD011/MRC020) | Desabilita grpITEMNOTA |
| Bloqueio de desconto promocional | Pulado (grade já toda bloqueada) |
| Combina efeitos | Soma de S + E |
Simulação passo a passo
- Em MFA001 → ST_ALTERANOTA = "Compra e Venda"
- Salve (F6)
- Gere uma NF de Saída em MNF002 a partir de Pedido de Venda → grade ReadOnly e totais bloqueados
- Gere uma NF de Entrada em MNF001 a partir de Pedido de Compra → grade ReadOnly e detalhes bloqueados
- 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 faz | Detalhe |
|---|---|
| NF de Saída/Entrada | Grade e totais permanecem editáveis mesmo quando a NF foi gerada de pedido |
| Reprocessamento de tabela de preço em MNF002/MNF008 | Executa 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 ≠ pedido | Nã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
- Em MFA001 → ST_ALTERANOTA = "Não (Permite Alterar)"
- Salve (F6)
- Gere uma NF de Saída em MNF002 a partir de um Pedido de Venda
- Altere preço, quantidade ou desconto do item → alteração aceita, sem validação contra o pedido
- Altere a condição de pagamento → o sistema pergunta (ou reprocessa automaticamente, conforme
ST_REPROCESSATABPRECO) os preços - 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.paslinha 467 —AfterInsertatribui'N').
Tabela Comparativa Resumida
| Opção | Descrição | NF Saída (MNF002/008) ReadOnly? | NF Entrada (MNF001) ReadOnly? | NF pela Ordem (MPD011/MRC020) | Valida peso/qtde vs pedido? | Reprocessa tab. preço? |
|---|---|---|---|---|---|---|
| S | Somente na Venda | Sim (se veio de pedido) | Não | Desabilita grpITEMNOTA | Sim | Não (se veio de pedido) |
| E | Somente na Compra | Não | Sim (se veio de pedido) | Não desabilita | Não | Sim |
| T | Compra e Venda | Sim | Sim | Desabilita | Sim | Não (se veio de pedido) |
| N | Não (Permite Alterar) | Não | Não | Não desabilita | Não | Sim |
Interação com outros parâmetros
ST_BLOQUEIADESCPROM: em MNF002 (UdmMNF002.paslinhas 5788, 6697) a regra de promoção só é avaliada quandoST_ALTERANOTANÃ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: emVerificaBloqTabPreco(UdmMNF002.paslinha 10030) só libera/bloqueia os campos de preço quandoST_ALTERANOTANÃO éS/T.ST_REPROCESSATABPRECO: em MNF002 (linha 7985) e MNF008 (linha 2917) o reprocessamento é suprimido se a NF veio de pedido EST_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.dfmlinhas 6069-6083 — label "Bloqueia Alteração da Nota se tiver Pedido"source/MFA001/UMFA001.dfmlinhas 6760-6788 — combocmbST_ALTERANOTA(items'Somente na Venda'→S,'Somente na Compra'→E,'Compra e Venda'→T,'Não (Permite Alterar)'→N)source/MFA001/UMFA001.paslinha 384 — declaraçãocmbST_ALTERANOTA: TwwDBComboBoxsource/MFA001/UdmMFA001.paslinha 111 —tabPARMFATURST_ALTERANOTA: TStringFieldsource/MFA001/UdmMFA001.paslinha 467 —AfterInsert: valor padrão'N'source/MFA001/UdmMFA001.dfmlinhas 1011-1014 —FieldName = 'ST_ALTERANOTA',Size = 1source/MFA001/UdmMFA001.dfmlinhas 121, 2352, 2501, 2698, 3001 — SELECT, INSERT e UPDATE da PARMFATUR
MNF001 (NF Entrada)
source/MNF001/UdmMNF001.paslinha 1112 — declaraçãoiST_ALTERANOTAsource/MNF001/UdmMNF001.paslinhas 1376, 1409 — SELECT da PARMFATUR, leitura emResultado[17]source/MNF001/UMNF001.paslinhas 1410-1414 —if (iST_ALTERANOTA in ['E','T']) and (iPedido = 'S')→gridITEMNOTA.ReadOnly := True,grpDetProd.Enabled := False
MNF002 (NF Saída)
source/MNF002/UdmMNF002.paslinha 5788 — no validate do tabela de preço: só aplica regra de promoção seST_ALTERANOTAnão éS/Tsource/MNF002/UdmMNF002.paslinha 6177 — validate do peso: dispara exceção se peso da NF ≠ peso do pedidosource/MNF002/UdmMNF002.paslinha 6519 — validate da quantidade: dispara exceção se qtde da NF ≠ qtde do pedidosource/MNF002/UdmMNF002.paslinha 6697 — AfterScroll do item: regra de promoção dependentesource/MNF002/UdmMNF002.paslinha 10030 —VerificaBloqTabPreco: define ReadOnly dos campos de preçosource/MNF002/UdmMNF002.paslinha 10496 — SELECT da PARMFATUR incluindoST_ALTERANOTAsource/MNF002/UMNF002.paslinha 2925 — após selecionar pedido:ReadOnly := Trueem 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_PESSOAsource/MNF002/UMNF002.paslinha 7985 — exit da condição de pagamento: suprime reprocessamento da tabela de preço seST_ALTERANOTA∈ (S,T) eiPedido = 'S'
MNF008 (NF Outro Tipo)
source/MNF008/UdmMNF008.paslinhas 483, 656, 691 — declaração/SELECT/leitura deiST_ALTERANOTAsource/MNF008/UdmMNF008.paslinha 761 — SELECT comP.ST_ALTERANOTAsource/MNF008/UMNF008.paslinhas 988-993 — após selecionar pedido:gridITEMNOTA.ReadOnly := True,grpDetProd.Enabled := Falsesource/MNF008/UMNF008.paslinha 2917 — exit da condição de pagamento: suprime reprocessamento
MPD011 (NF pela Ordem)
source/MPD011/UNFORDEM.paslinhas 2076-2081 —FormShow:grpITEMNOTA.Enabled := FalseseST_ALTERANOTA∈ (S,T)source/MPD011/UdmMPD011.paslinha 1579 — SELECT da PARMFATUR incluindoST_ALTERANOTA
MRC020 (NF Recapadora pela Ordem)
source/MRC020/UdmMRC020NFORDEM.paslinhas 433, 566, 588 — declaração/SELECT/leitura emResultado[12]source/MRC020/UMRC020NFORDEM.paslinhas 2317-2322 —FormShow:grpITEMNOTA.Enabled := FalseseiST_ALTERANOTA∈ (S,T)source/MRC020/UMRC020NFORDEM.paslinhas 2509, 2525 —HabilitaReadOnly: validaParmFatur.Values['ST_ALTERANOTA'][1] in ['S','T','N','E']
MCO006 (Comercial)
source/MCO006/UdmMCO006.paslinha 2105 — SELECT comP.ST_ALTERANOTA(apenas leitura)
Cópias entre empresas / consultas
source/CPD009/UdmCPD009.dfmlinhas 297, 361, 444, 579 — SELECT, INSERT e UPDATE da PARMFATURsource/RCA006/UdmRCA006.dfmlinhas 3046, 3110, 3193, 3328 — idem
Campo homônimo PARMUSUARIO (não é este parâmetro)
source/ADM012/UdmADM012.paslinha 70 —tabPARMUSUARIOST_ALTERANOTAsource/ADM012/UdmADM012.paslinha 256 — valor padrão'N'source/ADM012/UADM012.paslinha 112 —chkST_ALTERANOTA: TDBCheckBoxsource/ADM012/UADM012.dfmlinhas 1222-1229 —DataField = 'ST_ALTERANOTA'source/ADM013/UADM013.paslinhas 476, 491, 528 — cópia de parâmetros do usuáriosource/CNF011/UCNF011.paslinhas 415-419, 7437-7438 — SELECT emPARMUSUARIOe validação "O Usuário Não Tem Acesso a Alteração de Nota"