No dia a dia de sua empresa pode ser necessário que o preço de venda utilizado nas negociações, tenha como base diversas particularidades. Dentre estas especificidades pode-se ter: forma de pagamento, impostos, usuários, contratos fechados com clientes, promoções, entre outras, onde será necessário levar todas elas em consideração para calcular o preço de venda. As informações abaixo, visam te orientar na construção do cálculo do preço de venda com base em todos os critérios desejados pela sua empresa.
Na Central de Vendas o cálculo do preço dinâmico do produto será efetuado quando o Tipo de operação-TOP em sua aba Geral, possuir no campo "Usar como preço" a opção "Preço de Venda" selecionada.
Observações:
- Você só poderá utilizar o cálculo de preço dinâmico quando o Tipo de Operação - TOP for um Pedido de venda, Venda ou uma Devolução de venda.
- Com o parâmetro "Usa impostos no cálculo do preço dinâmico? - USAIMPPRECODIN" ligado, o cálculo de impostos será executado antes de chamar a procedure que faz o cálculo do Preço Dinâmico. Por padrão, este parâmetro é ligado. Caso não sejam utilizados valores de impostos no cálculo do Preço Dinâmico, desligando esse parâmetro haverá um ganho de performance no sistema.
- Quando o parâmetro "Usa cache na inicialização do produto? - USACACHEINIPROD" estiver desligado, não será feito o cache da inicialização do produto, trazendo então o valor do produto de forma correta quando for alterado o tipo de negociação do Pedido de Venda com itens duplicados utilizando a funcionalidade do preço dinâmico.
- É primordial que as configurações abaixo, sejam realizadas e validadas por um implantador Sankhya.
Tem-se dois parâmetros essenciais para funcionamento desta rotina. São eles:
Nota modelo para cálculo de preço dinâmico - MODCALCPRECDIN: Neste parâmetro, informe o modelo de nota/pedido que será utilizado para gerar um Cabeçalho transient. No caso, esse cabeçalho não será persistido, pois ele serve apenas para fins de cálculo de impostos. Em algumas situações, como por exemplo a Consulta de Produtos aberta diretamente, não tem-se o cabeçalho para calcular impostos.
A criação da nota modelo deve ser feita através da tela Modelo de Notas e Pedidos.
Procedure para cálculo de preço dinâmico - NOMPROCCALCPRE: Indique neste parâmetro, o nome da procedure para cálculo de preço dinâmico. Ao preenchê-lo, significa que o sistema irá utilizar as rotinas de preço dinâmico.
Observação: com os parâmetros de chave MODCALCPRECDIN e NOMPROCCALCPRE devidamente configurados, quando for lançada uma venda ou um pedido de venda informando o local do item, o valor unitário será calculado conforme a procedure cadastrada.
No entanto, caso a quantidade de um item seja aumentada durante a Conferência, o sistema refaz automaticamente o cálculo do custo do produto. Isso acontece porque algumas procedures de cálculo de custo dinâmico consideram a obtenção do preço com base na quantidade negociada. Portanto, qualquer alteração na quantidade exige que o sistema realize um novo cálculo para garantir que o valor do produto reflita a quantidade atualizada.
Na configuração do parâmetro "Campos que afetam o cálculo do preço Dinâmico - LISCAMPPRECODIN" deverão ser inseridos quais os campos da TGFCAB irão influenciar no Cálculo do Preço Dinâmico, inclusive campos adicionais, para que, caso algum deles seja alterado, seja recalculado o preço dos produtos. Importante ressaltar que, para isso o parâmetro "Recalcula preços quando altera Tipo de Negociação: - RECPRECOTPV" deve estar definido como "Sempre".
Observação: os campos que já recalculam o preço quando são alterados não deverão ser incluídos neste parâmetro.
Nota: os nomes dos campos devem estar em letras maiúsculas e separados por vírgulas.
No momento do cálculo do preço de venda, será chamada uma procedure personalizada. Esta procedure será "chamada" pelo sistema na inicialização do produto na Central de Vendas e na Consulta de Produtos solicitada também pela Central de Vendas ou diretamente pela rotina de Consulta de Produtos.
A rotina de cálculo dinâmico é executada em pontos específicos do sistema. São eles:
- Na inicialização do produto;
- Ao consultar o produto pela Consulta de Produtos (Central de Vendas e diretamente pela Consulta de Produtos);
- Na alteração do campo de quantidade (pela Central de Vendas ou pelo Carrinho de Compras);
- Ao salvar o item pela Central de Vendas ou na inclusão direta pelo carrinho. Uma informação importante é que apenas nesse ponto é que o sistema injeta os demais campos calculados pela procedure.
Quando for utilizada a Consulta de Produtos aberta diretamente (sem acessar primeiramente a Central de Vendas), o sistema irá gerar um Cabeçalho transient, o qual é necessário para cálculo de impostos. Para gerar esse cabeçalho será utilizado o modelo definido no parâmetro MODCALCPRECDIN, caso o parâmetro não esteja configurado será corretamente apresentada a seguinte mensagem:
"Falha no cálculo de preço dinâmico: O modelo de nota/pedido informado no parâmetro MODCALCPRECDIN não existe."
No caso da empresa, a primazia é utilizar a empresa do usuário logado; caso este não tenha empresa vinculada, será utilizada a empresa do modelo. Se nenhuma empresa foi definida, será exibida a seguinte mensagem no cálculo:
"Falha no cálculo de preço dinâmico: Nenhuma empresa foi defina no modelo de nota/pedido e o usuário logado não está vinculado a uma empresa."
Caso ocorra alguma falha na execução da procedure, será apresentada a seguinte mensagem:
"Falha no cálculo de preço dinâmico: Erro ao executar a procedure 'nome_precedure'."
Sobre a procedure:
Dados disponíveis na procedure:
SEQUENCIA
NUNOTA
IDALIQ
CODPROD
CONTROLE
CODLOCAL
CODVOL
QTD
CODPARC
CODVEND
CODTIPVENDA
CODTIPOPER
CODEMP
CODUSULOGADO
VLRUNIT
BASEICMS
BASESUBST
VLRSUBST
VLRICMS
VLRIPI
ICMSPRO_VLRDIFALDEST
ICMSPRO_VLRDIFALREM
ICMSPRO_VLRFCP
IPIPRO_PERCIPI
Esses dados são disponibilizados através da tabela EXECPARAMS. Além disso, existem funções específicas para se obter esses dados (Opcional):
ACT_DEC_FIELD
ACT_INT_FIELD
ACT_DTA_FIELD
ACT_TXT_FIELD
A procedure para cálculo de preço dinâmico deve receber apenas um parâmetro de entrada e como resultado deve retornar um Json do tipo chave-valor. O campo "PRECO" é o preço dinâmico e esse dado é obrigatório no retorno, mesmo que seja zero. Por exemplo:
{
"PRECO" : "50.0",
"PRECOBASE" : "50.0"
"AD_TIPOPRECO" : "T"
}
Observação: para que uma ou mais empresas não sejam incluídas no cálculo de preço dinâmico, basta informá-las no campo "Texto" do parâmetro "Lista de empresas sem cálculo de preço dinâmico. - LISEMPSEMPREDIN".
Caso utilize a opção "Nunca" no parâmetro RECPRECOTPV, porém ocorram algumas dessas condições acima, o recálculo será efetuado se:
- Na tela Cadastro do Produtos, aba Venda, o campo "Digitação na nota" estiver definido com a opção "Quantidade";
-
Se tratar de uma Venda e um dos parâmetros abaixo estiver ligado:
- Usa desconto FOB - DESCFOB;
- Usar % Desc.por região p/Frete FOB? - PERCDESCFOB;
- Simula formas de pagamento na Central? - USASIMFORMAPGTO;
- Usa Perc. Desc. FOB no rodapé (Venda)? - PERCDESCFOBCAB;
- Usa precificação de produtos/serviços pela TOP - USAPRECPELATOP;
- Usa precificação pela TOP no PDV Web - USAPRECTOPPDV (para PDV Web).
- Usa desconto FOB - DESCFOB;
Observação: quando o parâmetro "Recalcular preço dinâmico ao alterar valor de desconto - RECALCPRECODINA" estiver ligado, o preço dinâmico será recalculado sempre que ocorrer a inclusão, alteração de itens ou de suas informações.
Comentários
4 comentários
Bom dia!
Como não encontrei material sobre preço dinâmico, segue um exemplo que pode ajudar:
CREATE OR REPLACE PROCEDURE STP_CALCULA_PRECO_DINAMICO(p_IdSessao VARCHAR2, p_Result OUT VARCHAR2)
AS
PRECO FLOAT;
PRECOBASE FLOAT;
BEGIN
-- PRECO
SELECT
VLRVENDA INTO PRECO
FROM TGFEXC WHERE NUTAB = 15 AND CODPROD = 1;
-- PRECO BASE
SELECT
VLRVENDA INTO PRECOBASE
FROM TGFEXC WHERE NUTAB = 18 AND CODPROD = 1;
/*
SELECT
NVL(ACT_DEC_FIELD(p_IdSessao, 0, 'VLRUNIT'),0)
, NVL(ACT_DEC_FIELD(p_IdSessao, 0, 'VLRICMS'),0)
, NVL(ACT_DEC_FIELD(p_IdSessao, 0, 'VLRSUBST'),0)
, NVL(ACT_DEC_FIELD(p_IdSessao, 0, 'VLRIPI'),0)
, NVL(ACT_DEC_FIELD(p_IdSessao, 0, 'NUNOTA'),0)
, NVL(ACT_DEC_FIELD(p_IdSessao, 0, 'IDALIQ'),0)
, NVL(ACT_DEC_FIELD(p_IdSessao, 0, 'CODPROD'),0)
, NVL(ACT_DEC_FIELD(p_IdSessao, 0, 'CODPARC'),0)
, NVL(ACT_DEC_FIELD(p_IdSessao, 0, 'ICMSPRO_VLRDIFALDEST'),0)
, NVL(ACT_DEC_FIELD(p_IdSessao, 0, 'ICMSPRO_VLRDIFALREM'),0)
, NVL(ACT_DEC_FIELD(p_IdSessao, 0, 'ICMSPRO_VLRFCP'),0)
, NVL(ACT_DEC_FIELD(p_IdSessao, 0, 'IPIPRO_PERCIPI'),0)
, NVL(ACT_DEC_FIELD(p_IdSessao, 0, 'QTD'),0)
INTO
--VLRUNIT, VLRICMS, VLRSUBST, VLRIPI, NUNOTA, IDALIQ, CODPROD, CODPROD, CODPARC,
--VLRUNIT, ICMSPRO_VLRDIFALDEST, ICMSPRO_VLRDIFALREM, ICMSPRO_VLRFCP, IPIPRO_PERCIPI, QTDNEG
-- VLRUNIT, QTDNEG
FROM DUAL;
*/
p_Result :=
'{' ||
'PRECO : "' || PRECO || '",' ||
'PRECOBASE : "' || PRECOBASE || '"' ||
'}';
RETURN;
END;
Felipe, obrigado pelo exemplo! Foi muito útil para complementar o conteúdo deste artigo.
#Grato
boa tarde, poderia postar um exemplo desta procedure, contemplando a tela de consulta de produto, a documentação acima ela só da ênfase no lançamento do pedido na tela de consulta de produto não da, os campos disponível mencionado acima na tabela EXECPARAMS não mostra quando e feito a consulta do produto.
Olá, Helio.
Conforme verificando junto aos nossos analistas, ao calcular o preço de venda, uma procedure personalizada será utilizada, sendo esta chamada na inicialização do produto na Central de Vendas e Consulta de Produtos, como pode ser lido no trecho abaixo:
"No momento do cálculo do preço de venda, será chamada uma procedure personalizada. Esta procedure será "chamada" pelo sistema na inicialização do produto na Central de Vendas e na Consulta de Produtos solicitada também pela Central de Vendas ou diretamente pela rotina de Consulta de Produtos.
A rotina de cálculo dinâmico é executada em pontos específicos do sistema. São eles:
Ao salvar o item pela Central de Vendas ou na inclusão direta pelo carrinho. Uma informação importante é que apenas nesse ponto é que o sistema injeta os demais campos calculados pela procedure."
Por favor, entre para comentar.