Pular para o conteúdo principal

QT_CASASDECIMAISPRECOVENDA - Quantidade de casas decimais para cálculo do preço de venda

Tela: MFA001 - Parâmetros de Faturamento Localização: Parâmetros → Faturamento → Opção 2 → combo Quantidade de Casas decimais para cálculo do preço de venda (label Label88 em UMFA001.dfm:3818-3832, componente cmbQT_CASASDECIMAISPRECOVENDA em UMFA001.dfm:4367-4395, Left=495, Top=154, dentro de pagPARMAMETROS → pagAmbos (Faturamento) → pagFatOp2 (Opção 2) → GroupBox4 "Parâmetros Comum a Notas Fiscais / Pedido") Tabela: PARMFATUR.QT_CASASDECIMAISPRECOVENDA Tipo: Numérico (inteiro) — DOM_INTEGER no DDL (docs/schema/tables/PARMFATUR.sql:196); TIntegerField no client (UdmMFA001.pas:252). Sem NOT NULL, sem DEFAULT no banco → permite NULL. Valor padrão: 4 — atribuído no tabPARMFATURAfterInsert em UdmMFA001.pas:548 (tabPARMFATURQT_CASASDECIMAISPRECOVENDA.AsInteger := 4;). Somente novos registros de PARMFATUR (inserção) recebem esse default; registros antigos podem estar com NULL, e por isso o código consumidor sempre usa COALESCE(..., 4) ao ler. Valores permitidos no combo: 0, 2, 3, 4 (itens fixos no TwwDBComboBox — UMFA001.dfm:4386-4390). O combo é csDropDownList (UMFA001.dfm:4373), portanto digitação livre é bloqueada; só os 4 valores do Items.Strings podem ser salvos pela interface.

O que o parâmetro faz​

QT_CASASDECIMAISPRECOVENDA define a precisão decimal aplicada a preços de venda sempre que o ERP:

  1. Formata colunas de preço em grids/campos (DisplayFormat dos TFloatField de ITEMTABPRECO).
  2. Arredonda/trunca cálculos de preço em SQL via CAST(... AS NUMERIC(15, N)) ou round(valor, N), onde N = QT_CASASDECIMAISPRECOVENDA.

O tipo físico dos campos de preço no banco continua NUMERIC(15,4); o parâmetro não altera a precisão armazenada, mas padroniza a quantidade de casas exibidas e o arredondamento aplicado em atualizações de tabela de preço e em reprocessamentos de venda. Valores maiores que 4 não são oferecidos — o teto prático é 4 casas.

Um valor 0 significa "arredondar para inteiro" em todos os cálculos SQL que usam o parâmetro (preço de venda em reais cheios).

Telas impactadas​

MóduloCódigoPapel
Parâmetros de FaturamentoMFA001Produtora — edita o valor no combo cmbQT_CASASDECIMAISPRECOVENDA (UMFA001.dfm:4367-4395)
Cadastro de ProdutosTPO001Consumidora — lê COALESCE(QT_CASASDECIMAISPRECOVENDA, 4) e define tabITEMTABPRECOVL_PRECO.DisplayFormat com #,0.00 (se ≤ 2) ou #,0.NNNN (UTPO001.pas:966-990)
Cadastro de Tabela de PreçosTFA006Consumidora — usa o parâmetro (a) para DisplayFormat de VL_PRECO/VL_PRECOMAXIMO/VL_PRECOMINIMO/DATAVL_PRECO (UTFA006.pas:468-477) e (b) para CAST(... AS NUMERIC(15, N)) em promoções e reajustes de tabela (UTFA006.pas:1832-1860 e 2172-2191)
Cadastro/Consulta Seção com ImagemTOF007Consumidora — lê o valor em edtCD_SECAOExit via SELECT ... COALESCE(P.QT_CASASDECIMAISPRECOVENDA,4) FROM PARMFATUR (UTOF007.pas:202-207)
Manutenção de Nota Fiscal – Custo/ReposiçãoMNF001Consumidora — na rotina de atualização automática da tabela de preços por entrada de nota (quando ST_ATUALIZATABPRECO = 'S'), aplica CAST(... AS NUMERIC(15, N)) no UPDATE ITEMTABPRECO (UCUSTOREPOSICAONF.pas:215-230)
Lista Seção com ImagemjPesquisa – UListaSecaoImagem.pasConsumidora — lê o parâmetro para formatar preços exibidos no lookup de seção/produto com imagem (UListaSecaoImagem.pas:200-209)

Procedures impactadas​

ProcedureArquivoPapel
VERIFICA_BLOQUEIOScripts/VERIFICA_BLOQUEIO.sqlLê QT_CASASDECIMAISPRECOVENDA junto com os parâmetros de bloqueio e, se V_QT_CASASDECIMAISPRECOVENDA > 0, arredonda o VL_MINIMO e o VL_MAXIMO do item (calculados a partir de VL_PRECO e dos percentuais de desconto/acréscimo máximo) antes de comparar com o VL_UNITARIO digitado (Scripts/VERIFICA_BLOQUEIO.sql:146-152, 1181-1185)
RETORNA_PRECOITEMScripts/RETORNA_PRECOITEM.sqlLê o parâmetro em V_qt_casasdecimais; ao final, se > 0, arredonda o_vl_preco e o_vl_tabela com round(..., N) antes de retornar ao chamador (Scripts/RETORNA_PRECOITEM.sql:86-90, 284-287)
ATUALIZA_PRECOVENDAScripts/ATUALIZA_PRECOVENDA.sqlLê o parâmetro em V_QT_CASADECIMAIS (com ortografia abreviada) e repassa para a procedure AJUSTA_PRECOVENDA ao atualizar o preço dos itens em cada tabela de preço impactada (Scripts/ATUALIZA_PRECOVENDA.sql:31, 42-46, 111, 203, 272)
AJUSTA_PRECOVENDAScripts/AJUSTA_PRECOVENDA.sqlFunção auxiliar chamada pelas demais. Recebe I_VL_PRECISAO, aplica COALESCE(..., 4) e retorna CAST(I_VL_PRECO AS NUMERIC(15, I_VL_PRECISAO)) via EXECUTE STATEMENT (Scripts/AJUSTA_PRECOVENDA.sql:1-23)

Campos envolvidos​

CampoTabelaPapel
QT_CASASDECIMAISPRECOVENDAPARMFATURQuantidade de casas decimais a aplicar — este parâmetro
VL_PRECOITEMTABPRECOPreço de venda do item na tabela — alvo principal do arredondamento
VL_PRECOMAXIMO / VL_PRECOMINIMOITEMTABPRECOFaixa de preço do item — herdam o mesmo DisplayFormat no TFA006
PC_DESCONTOMAXIMOPRODUTO / PC_ACRESCIMOMAXIMOPRODUTOtabelas de item/grupoEntram no cálculo de V_VL_MINIMO / V_VL_MAXIMO arredondados em VERIFICA_BLOQUEIO
VL_PROMOCAOcálculo em memória (TFA006)Preço promocional calculado com CAST(... AS NUMERIC(15, N)) no SQL de promoção
ST_ATUALIZATABPRECOPARMFATURLiga/desliga a atualização automática da tabela de preços (em MNF001); quando ligada, o UPDATE usa NUMERIC(15, N)
TP_ATUALIZACAOTABELAVENDA / ST_ATUALIZATABVENDAPRODPARMFATUREntram em ATUALIZA_PRECOVENDA junto com QT_CASASDECIMAISPRECOVENDA para arredondar preço ao propagar para outras tabelas de venda

Comportamento​

Valor = 0 (ou NULL)​

AspectoComportamento
NULL (default no banco)Todo o código consumidor aplica COALESCE(QT_CASASDECIMAISPRECOVENDA, 4) — ou seja, NULL equivale a 4 na prática. Em TFA006, UTFA006.pas:468-469 ainda trata Values['QT_CASASDECIMAISPRECOVENDA'] = '' atribuindo '4'.
= 0 (explicitamente salvo em MFA001)Representa "sem casas decimais". Em TFA006 o DisplayFormat cai em '#,0.00' (ramo <= 2), exibindo duas casas na UI — mas os cálculos SQL usam CAST(... AS NUMERIC(15,0)), arredondando o preço para inteiro. Existe, portanto, divergência entre o que o usuário vê e o que foi efetivamente gravado.
= 0 em VERIFICA_BLOQUEIOA condição if (V_QT_CASASDECIMAISPRECOVENDA > 0) é falsa → V_VL_MINIMO e V_VL_MAXIMO não são arredondados, ficam com a precisão nativa (NUMERIC(15,4)).
= 0 em RETORNA_PRECOITEMA condição if (V_qt_casasdecimais > 0) é falsa → o_vl_preco e o_vl_tabela não são arredondados, mantêm a precisão original.
= 0 em AJUSTA_PRECOVENDA (via ATUALIZA_PRECOVENDA)COALESCE(I_VL_PRECISAO, 4) mantém 0 (COALESCE só substitui NULL). O CAST é feito com NUMERIC(15,0) → preço gravado sem decimais.

Resultado esperado:

  • NULL e 4 são, do ponto de vista funcional, equivalentes em qualquer caminho do sistema (todos os consumidores usam fallback 4).
  • 0 tem semântica dupla e inconsistente: nas procedures do cliente que usam CAST NUMERIC(15, N) (TFA006 atualização de tabela, MNF001, AJUSTA_PRECOVENDA), o preço é efetivamente arredondado para inteiro. Nas procedures que usam if > 0 then round(...) (VERIFICA_BLOQUEIO, RETORNA_PRECOITEM), o bloco de arredondamento é pulado e a precisão original do cálculo é mantida.

:::warning Atenção ao valor 0 Como o combo aceita 0 como opção válida, escolher esse valor produz comportamento misto entre as rotinas: algumas truncam para inteiro, outras ignoram o arredondamento. Se a intenção for "não arredondar / manter 4 casas", grave NULL (não oferecido no combo da UI) ou grave 4 explicitamente. Se a intenção for "preço sempre cheio, sem centavos", ciente de que VERIFICA_BLOQUEIO e RETORNA_PRECOITEM deixam de arredondar os limites. :::

Valor > 0 (ex.: 2, 3 ou 4)​

AspectoComportamento
UI em grids de tabela de preço (TPO001, TFA006)DisplayFormat dinâmico: se N <= 2 → '#,0.00'; se N > 2 → '#,0.' + N zeros (ex.: '#,0.0000' para 4). Aplicado a VL_PRECO, VL_PRECOMAXIMO, VL_PRECOMINIMO, DATAVL_PRECO
Reajuste/promoção de tabela (TFA006)CAST(valor_calculado AS NUMERIC(15, N)) — preço armazenado com a precisão configurada
Atualização automática por entrada de nota (MNF001)CAST(VL_ANTIGO AS NUMERIC(15, N)) ou CAST(VL_VENDA AS NUMERIC(15, N)) no UPDATE ITEMTABPRECO
Validação de faixa de preço no pedido/NF (VERIFICA_BLOQUEIO)V_VL_MINIMO e V_VL_MAXIMO passam por round(..., N) antes de comparar com o VL_UNITARIO digitado — evita falso bloqueio por frações
Consulta de preço do item (RETORNA_PRECOITEM)o_vl_preco e o_vl_tabela finais passam por round(..., N) antes de retornar
Propagação entre tabelas de venda (ATUALIZA_PRECOVENDA)Cada UPDATE ITEMTABPRECO é feito via AJUSTA_PRECOVENDA(:V_VL_PRECOVENDA, :V_QT_CASADECIMAIS) que aplica CAST(... AS NUMERIC(15, N))

Simulação passo a passo​

Pré-requisitos do cenário:

  • PARMFATUR.QT_CASASDECIMAISPRECOVENDA = 2 (usuário altera em MFA001, salva com F6).
  • Tabela de preço CD_TABPRECO = 1, item CD_ITEM = 10 com VL_PRECO = 15.7834, PC_DESCONTOMAXIMOPRODUTO = 10%.
  • PARMFATUR.ST_ATUALIZATABPRECO = 'S'.
  1. Em MFA001 → Parâmetros → Faturamento → Opção 2 → combo "Quantidade de Casas decimais para cálculo do preço de venda" escolha 2. Salve (F6). O UPDATE PARMFATUR grava QT_CASASDECIMAISPRECOVENDA = 2 (visto em UdmMFA001.dfm:2846).
  2. Abra TPO001. No OnShow, o bloco UTPO001.pas:966-990 lê COALESCE(QT_CASASDECIMAISPRECOVENDA, 4) = 2 → como 2 <= 2, tabITEMTABPRECOVL_PRECO.DisplayFormat := '#,0.00'. O usuário vê 15,78 na grid (e não 15,7834).
  3. Abra TFA006. Em UTFA006.pas:468-477, o mesmo cálculo ocorre para VL_PRECO, VL_PRECOMAXIMO, VL_PRECOMINIMO, DATAVL_PRECO — todos com duas casas.
  4. Operador lança um pedido em MPD006 com VL_UNITARIO = 14.20 (valor informado manualmente, abaixo do preço de tabela). A procedure VERIFICA_BLOQUEIO é chamada:
    • Lê V_QT_CASASDECIMAISPRECOVENDA = 2.
    • Calcula V_VL_MINIMO = 15.7834 - (15.7834 * 10/100) = 14.20506.
    • Como V_QT_CASASDECIMAISPRECOVENDA > 0 → V_VL_MINIMO = round(14.20506, 2) = 14.21.
    • Compara: 14.20 < 14.21 → bloqueia. Sem o arredondamento, 14.20 < 14.20506 também bloquearia, mas a diferença é visível quando o preço mínimo bate na fronteira dos centavos.
  5. O operador libera via MNF001 a entrada de nota de compra. UCUSTOREPOSICAONF.pas:215-230 monta:
    UPDATE ITEMTABPRECO
    SET VL_PRECO = CAST(:VL_VENDA AS NUMERIC(15,2)),
    DT_REGISTRO = 'NOW'
    WHERE CD_TABPRECO = 1 AND CD_ITEM = 10
    → VL_PRECO é gravado com 2 casas decimais (p.ex. 16.50), mesmo que o campo físico seja NUMERIC(15,4).
  6. Na consulta de preço do item via RETORNA_PRECOITEM (chamada pelo pedido), no final (Scripts/RETORNA_PRECOITEM.sql:284-287), o_vl_preco = round(o_vl_preco, 2) e o_vl_tabela = round(o_vl_tabela, 2) antes do retorno.

Resultado esperado: toda a operação de tabela de preço — exibição, reajuste, validação de faixa, atualização automática por entrada de nota, propagação entre tabelas e consulta de preço — passa a operar com exatamente 2 casas decimais. O campo físico continua NUMERIC(15,4), mas os valores gravados/retornados têm as duas últimas casas sempre zeradas.


Interações com outros parâmetros​

  • ST_ATUALIZATABPRECO (PARMFATUR, MNF001) — controla se a entrada de nota propaga o custo para ITEMTABPRECO. Quando ligado, o UPDATE usa CAST(... AS NUMERIC(15, N)) com N = QT_CASASDECIMAISPRECOVENDA.
  • TP_ATUALIZACAOTABELAVENDA e ST_ATUALIZATABVENDAPROD (PARMFATUR) — lidos juntos com QT_CASASDECIMAISPRECOVENDA em ATUALIZA_PRECOVENDA para decidir quais tabelas receber a atualização e com que precisão.
  • ST_CALCULAJUROPROM (PARMFATUR, RETORNA_PRECOITEM) — calcula juros promocional antes do arredondamento final que usa QT_CASASDECIMAISPRECOVENDA.
  • PC_DESCONTOMAXIMOPRODUTO / PC_ACRESCIMOMAXIMOPRODUTO (item/grupo, VERIFICA_BLOQUEIO) — definem a faixa bruta; QT_CASASDECIMAISPRECOVENDA controla o arredondamento dessa faixa antes da comparação.

Referências no Código Fonte​

Delphi — MFA001 (cadastro do parâmetro)​

ArquivoLinhasPapel
source/MFA001/UMFA001.dfm3818-3832TLabel Label88 com Caption = 'Quantidade de Casas decimais para cálculo do preço de venda', FocusControl = cmbQT_CASASDECIMAISPRECOVENDA
source/MFA001/UMFA001.dfm4367-4395TwwDBComboBox cmbQT_CASASDECIMAISPRECOVENDA com DataField = 'QT_CASASDECIMAISPRECOVENDA', DataSource = dmMFA001.dsPARMFATUR, Style = csDropDownList, MapList = True, itens 0/2/3/4, dentro de pagPARMAMETROS → pagAmbos (Faturamento) → pagFatOp2 (Opção 2) → GroupBox4 "Parâmetros Comum a Notas Fiscais / Pedido"
source/MFA001/UMFA001.pas482Declaração cmbQT_CASASDECIMAISPRECOVENDA: TwwDBComboBox
source/MFA001/UdmMFA001.pas252Declaração tabPARMFATURQT_CASASDECIMAISPRECOVENDA: TIntegerField
source/MFA001/UdmMFA001.pas548tabPARMFATURAfterInsert: tabPARMFATURQT_CASASDECIMAISPRECOVENDA.AsInteger := 4; (default em novos registros)
source/MFA001/UdmMFA001.dfm264, 1796-1799, 2846, 3144SELECT inicial, definição do TIntegerField com Alignment = taCenter, UPDATE de PARMFATUR e SELECT de releitura incluem o campo

Delphi — telas consumidoras​

ArquivoLinhasPapel
source/TPO001/UTPO001.pas966-990SELECT ... COALESCE(QT_CASASDECIMAISPRECOVENDA, 4) ... FROM PARMFATUR e definição de tabITEMTABPRECOVL_PRECO.DisplayFormat ('#,0.00' se ≤ 2, senão '#,0.' + N zeros)
source/TFA006/UTFA006.pas463-477Leitura via parmFatur.Values['QT_CASASDECIMAISPRECOVENDA'] (com fallback '4') e aplicação do DisplayFormat a VL_PRECO, VL_PRECOMAXIMO, VL_PRECOMINIMO, DATAVL_PRECO
source/TFA006/UTFA006.pas1832-1860CAST(... AS NUMERIC(15, N)) em SQL de cálculo e atualização de promoção/reajuste de tabela (VL_PROMOCAO, VL_PRECO)
source/TFA006/UTFA006.pas2172-2191CAST(... AS NUMERIC(15, N)) em SQL de aplicação de percentual em ITEMTABPRECO
source/TOF007/UTOF007.pas198-207SELECT P.ST_VALIDAITEMEMPRESA, COALESCE(P.QT_CASASDECIMAISPRECOVENDA,4) FROM PARMFATUR no edtCD_SECAOExit
source/MNF001/UCUSTOREPOSICAONF.pas215-230UPDATE ITEMTABPRECO SET VL_PRECO = CAST(:VAL AS NUMERIC(15, N)), DT_REGISTRO = 'NOW' (ramos ST_ATUALIZATABPRECO = 'S' e 'N')
source/jPesquisa/UListaSecaoImagem.pas200-209SELECT P.QT_CASASDECIMAISPRECOVENDA FROM PARMFATUR P WHERE P.CD_EMPRESA = ... no módulo de lookup de seção com imagem

DDL​

  • docs/schema/tables/PARMFATUR.sql:196 — QT_CASASDECIMAISPRECOVENDA DOM_INTEGER, (sem NOT NULL, sem DEFAULT → permite NULL; default 4 só é aplicado pelo cliente em novos registros inseridos pela MFA001, e COALESCE(..., 4) é o fallback em todas as leituras).

SQL — Procedures​

ArquivoLinhasPapel
Scripts/VERIFICA_BLOQUEIO.sql104, 143-152, 1181-1185Declara V_QT_CASASDECIMAISPRECOVENDA, lê junto aos demais parâmetros de bloqueio e, se > 0, arredonda V_VL_MINIMO/V_VL_MAXIMO com round(..., N) antes da comparação com o VL_UNITARIO
Scripts/RETORNA_PRECOITEM.sql86-90, 284-287Lê em V_qt_casasdecimais e, se > 0, aplica round(o_vl_preco, N) e round(o_vl_tabela, N) antes de retornar
Scripts/ATUALIZA_PRECOVENDA.sql31, 42-46, 111, 203, 272Declara V_QT_CASADECIMAIS, lê junto com TP_ATUALIZACAOTABELAVENDA e ST_ATUALIZATABVENDAPROD, e repassa para AJUSTA_PRECOVENDA(:V_VL_PRECOVENDA, :V_QT_CASADECIMAIS) em cada ramo de atualização
Scripts/AJUSTA_PRECOVENDA.sql1-23Procedure utilitária: I_VL_PRECISAO = COALESCE(I_VL_PRECISAO, 4) e CAST(I_VL_PRECO AS NUMERIC(15, I_VL_PRECISAO)) via EXECUTE STATEMENT dinâmico

Java — ParmFaturSQL (espelhamento no WebAPI)​

  • source/Server/JunsoftWebAPI/src/main/java/junsoft/erp/repository/queries/ParmFaturSQL.java e JunsoftBuilder.java — incluem QT_CASASDECIMAISPRECOVENDA no SELECT da API de parâmetros, replicando no backend REST o mesmo valor editado pela MFA001 (sem lógica adicional).