Pular para o conteúdo principal

PC_MARGEMSEGURANCA - Percentual de Margem de Segurança (markup sobre custo de compra)

Tela: MFA001 - Parâmetros de Faturamento Localização: Parâmetros → Notas Fiscais → Parâmetros de Notas → campo % Margem Segurança Tabela: PARMFATUR.PC_MARGEMSEGURANCA Tipo: Numérico (percentual %) - DOM_NUMERIC3_2 Valor padrão: NULL (vazio - o AfterInsert de MFA001 não atribui default) Validação: inexistente em MFA001. Na TFA010 (margem por item/tabela de compra) o valor é validado para não ultrapassar 100 (W-0141).

O que o parâmetro faz​

PC_MARGEMSEGURANCA é a margem de segurança percentual que o ERP aplica como markup sobre o custo de compra (valor unitário líquido da NF de entrada) para gerar o preço de compra gravado em ITEMTABCOMPRA.VL_PRECO.

Ao contrário de PC_MARGEMVENDA (que calcula preço de venda sobre o custo), a PC_MARGEMSEGURANCA trabalha em cima do preço de compra para dar uma folga sobre oscilações futuras do fornecedor. Ela é aplicada sempre por cima (markup direto), nunca como divisor.

Fórmula canônica (vista em MNF001/UFRETENF.pas, CANCELA_NOTAFISCAL, GERA_NOTAFISCAL, RECALCULA_PRECOCOMPRA):

VL_PRECO(ITEMTABCOMPRA) = VL_CUSTO + (VL_CUSTO * PC_MARGEMSEGURANCA / 100)

Cadeia de precedência (do mais específico ao mais genérico):

ITEMTABCOMPRA.PC_MARGEMSEGURANCA (margem de segurança por item e tabela de compra - TFA010/TPO001)
> PARMFATUR.PC_MARGEMSEGURANCA (este parâmetro - default da empresa)

O padrão aplicado em todo o código é COALESCE(T.PC_MARGEMSEGURANCA, :I_PC_MARGEMSEGURANCA) - primeiro tenta a margem do item+tabela de compra e, em último caso, cai no parâmetro da empresa.


Telas impactadas​

MóduloCódigoComo usa PC_MARGEMSEGURANCA
Parâmetros FaturamentoMFA001Cadastro do próprio valor - TDBEdit edtPC_MARGEMSEGURANCA em Opção 1 (UMFA001.dfm:6927-6943), label % Margem Segurança (UMFA001.dfm:6157-6171)
NF Entrada - FreteMNF001UFRETENF.pas:248-258 lê PC_MARGEMSEGURANCA do PARMFATUR em iPcMargemSeguranca; UFRETENF.pas:749-758 usa fallback ITEMTABCOMPRA.PC_MARGEMSEGURANCA > PARMFATUR.PC_MARGEMSEGURANCA para recalcular VL_PRECO de compra ao ratear frete
NF Entrada - Custo ReposiçãoMNF001UMNF001.pas:2566-2571, 2610-2615 monta coluna VL_CUSTO do grid de custo de reposição com CASE WHEN P.PC_MARGEMSEGURANCA IS NOT NULL ... WHEN PF.PC_MARGEMSEGURANCA IS NOT NULL ... ELSE 0 END (onde P é ITEMTABCOMPRA e PF é PARMFATUR)
NF Complementar (ESNotaComplementar)jFaturamento / chamado por MNF001jFaturamento.NotaOrigem.pas:365-429 lê COALESCE(PC_MARGEMSEGURANCA, 0) de PARMFATUR, sobrescreve pelo valor do item+tabela se > 0, e aplica iVL_CUSTO = iVL_PRECO + ((iVL_PRECO * PC_MARGEMSEGURANCA) / 100) para atualizar ITEMTABCOMPRA.VL_PRECO
Cadastro ProdutoTPO001Grid ITEMTABCOMPRA exibe coluna % Margem Seg. editável (UTPO001.dfm:5111-5114); valor entra em ITEMTABCOMPRA.PC_MARGEMSEGURANCA e passa a ter precedência sobre o parâmetro da empresa
Tabela de CompraTFA010Edição direta da PC_MARGEMSEGURANCA do item+tabela de compra (edtPC_MARGEMSEGURANCA em UTFA010.dfm:580-597); UdmTFA010.pas:402-410 valida > 100 → W-0141
Verificação de BloqueioUsada por MNF001, MPD002, OS e pneusScripts/VERIFICA_BLOQUEIO.sql lê PARMFATUR.PC_MARGEMSEGURANCA e compara contra ITEMTABCOMPRA.PC_MARGEMSEGURANCA para decidir se o preço unitário do pedido/NF está abaixo da margem mínima exigida
Análise Estoque ParadoREQ012UREQ012.pas:1600, 1659 usa COALESCE(ITC.PC_MARGEMSEGURANCA, PF.PC_MARGEMSEGURANCA) como PC_MARGEMSEG no relatório
Configuração TributáriaCNF017Grid/update inclui PC_MARGEMSEGURANCA no SELECT/UPDATE de PARMFATUR (UdmCNF017.dfm:493, 597)
Configuração PedidoCPD009Update de PARMFATUR inclui PC_MARGEMSEGURANCA (UdmCPD009.dfm:3242, 3346)
Relatório AnáliseRCA006SQL do relatório repete o mesmo CASE WHEN P.PC_MARGEMSEGURANCA ... WHEN PF.PC_MARGEMSEGURANCA ... do custo de reposição (UdmRCA006.dfm:525-538, 803-814, 927-938)

Procedures impactadas​

ProcedureArquivoUso
GERA_NOTAFISCALScripts/GERA_NOTAFISCAL.sqlLinhas 131, 259, 266 lêem P.PC_MARGEMSEGURANCA em I_PC_MARGEMSEGURANCA; linhas 1027, 1034 aplicam VL_PRECO = VL_UNITARIO + ((VL_UNITARIO * COALESCE(COALESCE(T.PC_MARGEMSEGURANCA, I_PC_MARGEMSEGURANCA), 0)) / 100) no UPDATE/INSERT de ITEMTABCOMPRA na geração da NF de entrada
CANCELA_NOTAFISCALScripts/CANCELA_NOTAFISCAL.sqlLinhas 49, 1124, 1137, 1169 lêem PF.PC_MARGEMSEGURANCA junto com CD_TABCOMPRA; ao cancelar NF de entrada (TP_NOTA = 'E'), reverte ITEMTABCOMPRA.VL_PRECO para o custo anterior re-aplicando VL_PRECO = I_VL_CUSTOANTERIOR_TAB + ((I_VL_CUSTOANTERIOR_TAB * COALESCE(COALESCE(T.PC_MARGEMSEGURANCA, I_PC_MARGEMSEGURANCA), 0)) / 100)
RECALCULA_PRECOCOMPRAScripts/RECALCULA_PRECOCOMPRA.sqlLinhas 20, 50-53 lêem P.PC_MARGEMSEGURANCA da PARMFATUR em I_PC_MARGEMSEGURANCA; linhas 113, 115 recalculam VL_PRECO = V_VL_CUSTO + ((V_VL_CUSTO * COALESCE(COALESCE(T.PC_MARGEMSEGURANCA, I_PC_MARGEMSEGURANCA), 0)) / 100) para todos os itens da tabela de compra informada
VERIFICA_BLOQUEIOScripts/VERIFICA_BLOQUEIO.sqlLinhas 67, 144, 150 lêem PC_MARGEMSEGURANCA da PARMFATUR em V_PC_MARGEMSEGURANCA; SQLs dinâmicos (linhas 243, 331, 425, 448, 517) leem TC.PC_MARGEMSEGURANCA (da ITEMTABCOMPRA TC) por item. Esses dois valores são comparados contra o preço unitário do pedido para decidir se o bloqueio de margem deve ser acionado

Campos envolvidos​

CampoTabelaDescrição
PC_MARGEMSEGURANCAPARMFATURMargem de segurança padrão da empresa (este parâmetro)
PC_MARGEMSEGURANCAITEMTABCOMPRAMargem de segurança específica do par CD_ITEM + CD_TABCOMPRA (prioridade máxima). Editada em TFA010 e TPO001
VL_PRECOITEMTABCOMPRAPreço de compra calculado como custo + custo*margem/100
CD_TABCOMPRAPARMFATURTabela de compra padrão - alvo dos updates de margem
ST_CUSTOREPOSICAOPARMFATURLiga/desliga recálculo automático de ITEMTABCOMPRA.VL_PRECO ao lançar NF de entrada; quando 'N', PC_MARGEMSEGURANCA é ignorado no fluxo do GERA_NOTAFISCAL/CANCELA_NOTAFISCAL
VL_LIQUIDO, QT_ITEMNOTA, PS_ITEMNOTAITEMNOTABase do custo unitário sobre o qual a margem incide

Comportamento / Fórmula de aplicação​

Valor NULL ou não configurado​

Quando PARMFATUR.PC_MARGEMSEGURANCA está vazio e o par ITEMTABCOMPRA(CD_ITEM, CD_TABCOMPRA) também não tem margem própria, o COALESCE(...0) presente em todas as procedures neutraliza o cálculo:

VL_PRECO = VL_CUSTO + (VL_CUSTO * 0 / 100) = VL_CUSTO

Ou seja: o preço de compra é gravado exatamente igual ao custo unitário líquido da NF de entrada, sem acréscimo de segurança. Mesmo comportamento ao cancelar NF e ao rodar RECALCULA_PRECOCOMPRA.

Simulação passo a passo​

  1. Em MFA001 → Opção 1 → % Margem Segurança = vazio.
  2. Certifique-se de que, em TPO001 ou TFA010, o par item+tabela de compra alvo também não tem PC_MARGEMSEGURANCA (grid % Margem Seg. em branco).
  3. Certifique-se de que PARMFATUR.ST_CUSTOREPOSICAO ≠ 'N' (caso contrário o fluxo nem roda).
  4. Lance uma NF de entrada em MNF001 de um item com custo unitário R$ 100,00.
  5. Resultado esperado: ITEMTABCOMPRA.VL_PRECO = R$ 100,00 (igual ao custo). O GERA_NOTAFISCAL executa UPDATE ITEMTABCOMPRA SET VL_PRECO = 100 + ((100 * COALESCE(COALESCE(NULL, NULL), 0)) / 100) = 100.

Valor > 0 (ex.: PC_MARGEMSEGURANCA = 5,00)​

Com margem configurada, toda NF de entrada (e todo RECALCULA_PRECOCOMPRA) acrescenta a folga sobre o custo:

VL_PRECO = VL_CUSTO * (1 + PC_MARGEMSEGURANCA/100)

Exemplos numéricos concretos​

Cenário 1: Fallback de empresa aplicado (item sem margem própria)

  • Custo unitário líquido da NF: R$ 100,00
  • PARMFATUR.PC_MARGEMSEGURANCA = 5,00; ITEMTABCOMPRA.PC_MARGEMSEGURANCA = NULL
  • VL_PRECO = 100 + (100 * 5 / 100) = R$ 105,00
  • Frete adicional não altera a fórmula: a base já incorpora VL_FRETE_RATEIO no UFRETENF.pas:758.

Cenário 2: Margem específica do item+tabela tem precedência

  • Custo unitário: R$ 100,00
  • PARMFATUR.PC_MARGEMSEGURANCA = 5,00
  • ITEMTABCOMPRA.PC_MARGEMSEGURANCA = 8,00 (cadastrada via TFA010)
  • O COALESCE(T.PC_MARGEMSEGURANCA, I_PC_MARGEMSEGURANCA) retorna 8,00 - o valor da empresa é ignorado.
  • VL_PRECO = 100 + (100 * 8 / 100) = R$ 108,00

Cenário 3: Borda do domínio (DOM_NUMERIC3_2 = NUMERIC(3,2))

  • Valor máximo persistível em PARMFATUR.PC_MARGEMSEGURANCA: 9,99
  • Nota: a validação de > 100 (W-0141) existe apenas em TFA010/UdmTFA010.pas:407 para o campo de ITEMTABCOMPRA (que também é DOM_NUMERIC3_2). Na MFA001 não há validação; o próprio domínio impede valores ≥ 10.
  • Para margens maiores, a única alternativa é editar item a item em TFA010/TPO001, mas o limite do domínio também é 9,99 - valores entre 10 e 100 ficam inatingíveis nesta versão do schema.

Cenário 4: Geração de preço em item novo na tabela

  • Em GERA_NOTAFISCAL.sql:1032-1037, quando o UPDATE ITEMTABCOMPRA não encontra registro (item ainda não está na tabela de compra), é feito INSERT com VL_PRECO = VL_UNITARIO + ((VL_UNITARIO * COALESCE(I_PC_MARGEMSEGURANCA, 0)) / 100).
  • Aqui não existe T.PC_MARGEMSEGURANCA para usar (o registro não existe ainda); o valor da PARMFATUR é o único que entra.
  • Exemplo: Custo R$ 100,00; PARMFATUR.PC_MARGEMSEGURANCA = 3,00 → item é criado em ITEMTABCOMPRA com VL_PRECO = 103,00 e PC_MARGEMSEGURANCA = NULL (o campo não é preenchido no INSERT).

Simulação passo a passo​

  1. Em MFA001 → Opção 1 → % Margem Segurança = 5,00. Certifique-se que ST_CUSTOREPOSICAO permite o recálculo.
  2. Deixe o par item+tabela alvo sem margem própria em TFA010/TPO001.
  3. Lance NF de entrada em MNF001 com custo unitário R$ 100,00.
  4. Na confirmação, o GERA_NOTAFISCAL executa:
    UPDATE ITEMTABCOMPRA T
    SET T.VL_PRECO = 100 + ((100 * COALESCE(COALESCE(T.PC_MARGEMSEGURANCA, 5.00), 0)) / 100),
    T.DT_REGISTRO = 'NOW'
    WHERE T.CD_TABCOMPRA = :I_CD_TABCOMPRA AND T.CD_ITEM = :I_CD_ITEM;
  5. Resultado esperado: ITEMTABCOMPRA.VL_PRECO = R$ 105,00 e DT_REGISTRO atualizado.
  6. Ao cancelar essa NF (botão de cancelamento em MNF001), o CANCELA_NOTAFISCAL busca o custo anterior via RETORNA_SALDOESTOQUE e reaplica a mesma margem sobre o custo antigo para restaurar o VL_PRECO histórico.

Interação com outros parâmetros​

ParâmetroInteração
st_custoreposicao (PARMFATUR.ST_CUSTOREPOSICAO)Quando 'N', o CANCELA_NOTAFISCAL não entra no bloco de reversão de ITEMTABCOMPRA (linha 1135: AND PF.ST_CUSTOREPOSICAO <> 'N') - a PC_MARGEMSEGURANCA fica inerte no cancelamento. No GERA_NOTAFISCAL o recálculo depende do caminho que chama o UPDATE ITEMTABCOMPRA, tipicamente também condicionado a ST_CUSTOREPOSICAO.
pc_margemvendaNão se confundem. PC_MARGEMVENDA gera preço de venda aplicando margem sobre o custo de estoque (procedure ATUALIZA_PRECOVENDA). PC_MARGEMSEGURANCA gera preço de compra aplicando margem sobre o custo unitário líquido da NF de entrada. As duas rodam no mesmo GERA_NOTAFISCAL, em etapas diferentes, e podem ser combinadas (o preço de venda pode ser recalculado depois a partir do ITEMTABCOMPRA.VL_PRECO já acrescido da margem de segurança, dependendo de ST_PRECOVENDA).
CD_TABCOMPRA (PARMFATUR)A margem só incide nas linhas de ITEMTABCOMPRA com CD_TABCOMPRA = PARMFATUR.CD_TABCOMPRA. Tabelas alternativas não são afetadas pelo GERA_NOTAFISCAL. O RECALCULA_PRECOCOMPRA recebe a tabela como parâmetro (I_CD_TABELA).
PC_DESCONTOMAX, VL_MINIMOPEDIDO, ST_BLOQUEIOPEDEm VERIFICA_BLOQUEIO.sql todos são lidos no mesmo SELECT (linhas 143-146). A margem de segurança entra como piso de preço: se o preço unitário do pedido cair abaixo de VL_CUSTO * (1 + PC_MARGEMSEGURANCA/100), o bloqueio pode ser acionado dependendo de TP_MODELOBLOQUEIO.

Referências no Código Fonte​

Delphi - MFA001 (cadastro do parâmetro)​

  • source/MFA001/UMFA001.dfm:6927-6943 - edtPC_MARGEMSEGURANCA: TDBEdit com DataField = 'PC_MARGEMSEGURANCA', ligado a dmMFA001.dsPARMFATUR.
  • source/MFA001/UMFA001.dfm:6157-6171 - Label8: TLabel com Caption = '% Margem Segurança' e FocusControl = edtPC_MARGEMSEGURANCA.
  • source/MFA001/UMFA001.pas:390 - declaração edtPC_MARGEMSEGURANCA: TDBEdit.
  • source/MFA001/UdmMFA001.pas:135 - tabPARMFATURPC_MARGEMSEGURANCA: TBCDField.
  • source/MFA001/UdmMFA001.dfm:1129-1132 - definição do TBCDField (Origin = "PARMFATUR"."PC_MARGEMSEGURANCA", sem OnValidate).
  • source/MFA001/UdmMFA001.dfm:139, 2377, 2749, 3019 - referências do campo no SELECT, UPDATE e tabela updPARMFATUR.
  • source/MFA001/UdmMFA001.pas:434-... - tabPARMFATURAfterInsert NÃO atribui valor a PC_MARGEMSEGURANCA (nasce NULL).

Delphi - uso em MNF001 (NF de entrada)​

  • source/MNF001/UFRETENF.pas:116, 248-258, 749-758 - busca o parâmetro na PARMFATUR, aplica COALESCE(tabCUSTO.PC_MARGEMSEGURANCA, iPcMargemSeguranca):
if (tabCUSTO.FieldByName('PC_MARGEMSEGURANCA').AsFloat > 0) then
iPcMargemSeg := tabCUSTO.FieldByName('PC_MARGEMSEGURANCA').AsString
else
if (Trim(iPcMargemSeguranca) <> '') then
iPcMargemSeg := iPcMargemSeguranca;

if (Trim(iPcMargemSeg) = '') then
iPcMargemSeg := '0';

iVlCusto := (tabCUSTO.FieldByName('VL_PRECO').AsFloat + iVlFrete)
+ (((tabCUSTO.FieldByName('VL_PRECO').AsFloat + iVlFrete) * StrToFloat(iPcMargemSeg)) / 100);
  • source/MNF001/UMNF001.pas:2558-2620 - SQL de tabCUSTO (tela de Custo de Reposição) monta a coluna VL_CUSTO com CASE WHEN P.PC_MARGEMSEGURANCA IS NOT NULL ... WHEN PF.PC_MARGEMSEGURANCA IS NOT NULL ... ELSE 0 END onde P = ITEMTABCOMPRA e PF = PARMFATUR.
  • source/MNF001/UCUSTOREPOSICAONF.dfm - referenciada pela tela de custo de reposição (TBCDField PC_MARGEMSEGURANCA).

Delphi - uso em jFaturamento (NF Complementar)​

  • source/jFaturamento/NotaOrigem/jFaturamento.NotaOrigem.pas:315, 365-402, 429 - classe TESNotaComplementar:
Consulta :=
'SELECT ' + #10 +
' COALESCE(CD_TABCOMPRA, 1), ' + #10 +
' COALESCE(PC_MARGEMSEGURANCA, 0) ' + #10 +
'FROM PARMFATUR ' + #10 +
'WHERE CD_EMPRESA = ' + Nulo(queryNotaOrigemCD_EMPRESA.AsString, 'I');
...
iPC_MARGEMSEGURANCA := Resultado[1];
...
if (StrToFloat(Resultado[2]) > 0) then
iPC_MARGEMSEGURANCA := Resultado[2]; { precedência da margem do item+tabela }
...
iVL_CUSTO := iVL_PRECO + ((iVL_PRECO * StrToFloat(iPC_MARGEMSEGURANCA)) / 100);
  • source/jCommon/jValidate.pas:737, 4431, 4440, 4454-4455, 4476, 4487-4488 - classe TItemTabCompra carrega/valida Pc_MargemSeguranca ao resolver o registro de ITEMTABCOMPRA via REST/integrações.

Delphi - TPO001 e TFA010 (margem por item+tabela)​

  • source/TPO001/UdmTPO001.pas:254, 3081, 3083 - tabITEMTABCOMPRAPC_MARGEMSEGURANCA: TBCDField (marcado ReadOnly quando há restrição de edição via TFA010).
  • source/TPO001/UdmTPO001.dfm:3416, 3462-3468, 3488, 3499 - SELECT/UPDATE/Fetch do ITEMTABCOMPRA incluindo PC_MARGEMSEGURANCA (grid do cadastro de produto).
  • source/TPO001/UTPO001.dfm:5109-5114 - coluna % Margem Seg. no grid ITEMTABCOMPRA.
  • source/TFA010/UdmTFA010.pas:61, 83, 402-410 - tabITEMTABCOMPRAPC_MARGEMSEGURANCA + OnValidate:
procedure TdmTFA010.tabITEMTABCOMPRAPC_MARGEMSEGURANCAValidate(Sender: TField);
begin
if (sender.AsString <> '') then
begin
if (sender.AsFloat > 100) then
raise JException.Create('W-0141');
end;
end;
  • source/TFA010/UdmTFA010.dfm:156, 220-227, 248, 262 - SELECT/UPDATE/Fetch de ITEMTABCOMPRA com PC_MARGEMSEGURANCA + OnValidate = tabITEMTABCOMPRAPC_MARGEMSEGURANCAValidate.
  • source/TFA010/UTFA010.dfm:360-364, 441-442, 580-597 / UTFA010.pas:86 - coluna do grid % Margem Seg. e edtPC_MARGEMSEGURANCA: TDBEdit.

Delphi - demais consumidores​

  • source/REQ012/UREQ012.pas:1600, 1659 - relatório de análise de estoque parado usa COALESCE(ITC.PC_MARGEMSEGURANCA, PF.PC_MARGEMSEGURANCA) PC_MARGEMSEG.
  • source/CNF017/UdmCNF017.dfm:493, 597 - grid/update de PARMFATUR inclui PC_MARGEMSEGURANCA.
  • source/CPD009/UdmCPD009.dfm:3242, 3346 - update de PARMFATUR inclui PC_MARGEMSEGURANCA.
  • source/RCA006/UdmRCA006.dfm:525-538, 803-814, 927-938 - SQL do relatório replica o CASE WHEN ... IS NOT NULL entre ITEMTABCOMPRA.PC_MARGEMSEGURANCA e PARMFATUR.PC_MARGEMSEGURANCA.

SQL - Procedures​

  • Scripts/GERA_NOTAFISCAL.sql:131 - declare variable I_PC_MARGEMSEGURANCA numeric(5,2); (note que a procedure declara NUMERIC(5,2) embora o campo em PARMFATUR seja DOM_NUMERIC3_2).
  • Scripts/GERA_NOTAFISCAL.sql:259, 266 - leitura de P.PC_MARGEMSEGURANCA da PARMFATUR P em I_PC_MARGEMSEGURANCA.
  • Scripts/GERA_NOTAFISCAL.sql:1027 - UPDATE de ITEMTABCOMPRA aplicando VL_PRECO = :I_VL_UNITARIO + ((:I_VL_UNITARIO * COALESCE(COALESCE(T.PC_MARGEMSEGURANCA, :I_PC_MARGEMSEGURANCA), 0)) / 100).
  • Scripts/GERA_NOTAFISCAL.sql:1034-1037 - INSERT quando não existe registro na tabela de compra (usa apenas I_PC_MARGEMSEGURANCA).
  • Scripts/CANCELA_NOTAFISCAL.sql:49 - declare variable I_PC_MARGEMSEGURANCA DOM_NUMERIC3_2;.
  • Scripts/CANCELA_NOTAFISCAL.sql:1124, 1137 - SELECT PF.PC_MARGEMSEGURANCA para reversão.
  • Scripts/CANCELA_NOTAFISCAL.sql:1169 - UPDATE ITEMTABCOMPRA.VL_PRECO = :I_VL_CUSTOANTERIOR_TAB + ((:I_VL_CUSTOANTERIOR_TAB * COALESCE(COALESCE(T.PC_MARGEMSEGURANCA, :I_PC_MARGEMSEGURANCA), 0)) / 100).
  • Scripts/RECALCULA_PRECOCOMPRA.sql:20, 50-53, 113, 115 - mesmo padrão de COALESCE(COALESCE(T.PC_MARGEMSEGURANCA, I_PC_MARGEMSEGURANCA), 0) para recalcular preço de compra em lote.
  • Scripts/VERIFICA_BLOQUEIO.sql:67, 69, 144, 150 - leitura da PARMFATUR.PC_MARGEMSEGURANCA em V_PC_MARGEMSEGURANCA; variável separada V_PC_MARGEMSEGITEM recebe a margem por item.
  • Scripts/VERIFICA_BLOQUEIO.sql:243, 331, 425, 448, 517 - SQLs dinâmicos de pedido, pneu, OS e NF leem TC.PC_MARGEMSEGURANCA (de ITEMTABCOMPRA TC) para comparar com V_PC_MARGEMSEGURANCA.

DDL​

  • docs/schema/tables/PARMFATUR.sql:95 - definição:
PC_MARGEMSEGURANCA DOM_NUMERIC3_2,

DOM_NUMERIC3_2 = NUMERIC(3,2) → valor máximo 9,99. Divergência digna de nota: GERA_NOTAFISCAL declara sua variável como NUMERIC(5,2) (suportaria até 999,99) e o OnValidate de TFA010 bloqueia apenas > 100 - mas o domínio persiste no máximo 9,99 em qualquer das duas colunas (PARMFATUR.PC_MARGEMSEGURANCA e ITEMTABCOMPRA.PC_MARGEMSEGURANCA). Margens de segurança acima de 9,99% não são persistíveis neste schema.