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ção: 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.
Importante: 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.
Importante: É 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.
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 de acordo com a procedure cadastrada.
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.
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, que 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 corretamente será 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"
}
Comentários
2 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
Por favor, entre para comentar.