Em situações de compras de produtos, precisa-se controlar a variação de custos do produto que está chegando com seu último custo de entrada, permitindo assim verificar se esta variação está dentro de um percentual permitido ou não, gerando uma solicitação de liberação se este percentual foi além do esperado.
Criar campos adicionais na TGFEMP:
Criar a Function: FCT_OBTEMCUSTO
Criar a Stored Procedure:
CREATE OR REPLACE PROCEDURE STP_RN_VARCUSITEPEDCPA
(P_NUNOTA INT, P_SEQUENCIA INT,P_SUCESSO OUT VARCHAR, P_MENSAGEM OUT VARCHAR2, P_CODUSULIB OUT NUMERIC)
AS
BEGIN
DECLARE
V_ULTCUSTO NUMBER;
V_COUNT INT;
V_CODPROD INT;
V_CODEMP INT;
V_PERCVARCUSTO NUMBER;
V_CUSTO INT;
V_VLRUNIT NUMBER;
V_VARIACAO NUMBER;
V_ULTCUSTOVOA NUMBER;
V_VLRUNITVOA NUMBER;
V_CODVOL CHAR(2);
BEGIN
P_SUCESSO := 'S';
SELECT CODPROD,CODEMP,VLRUNIT,CODVOL INTO V_CODPROD,V_CODEMP,V_VLRUNIT,V_CODVOL FROM TGFITE WHERE NUNOTA = P_NUNOTA AND SEQUENCIA = P_SEQUENCIA;
SELECT AD_CUSTO,AD_PERCVARCUSTO INTO V_CUSTO,V_PERCVARCUSTO FROM TGFEMP WHERE CODEMP = V_CODEMP;
BEGIN
V_ULTCUSTO := NVL(FCT_OBTEMCUSTO(V_CODPROD,V_CODEMP,SYSDATE,V_CUSTO),0);
EXCEPTION WHEN NO_DATA_FOUND THEN V_ULTCUSTO := 0;
END;
V_VARIACAO := ROUND((1 - (V_ULTCUSTO / V_VLRUNIT)) * 100,2);
SELECT
CASE WHEN EXISTS(SELECT 1 FROM TGFVOA WHERE CODPROD = ITE.CODPROD AND VOA.CODVOL = ITE.CODVOL) THEN
CASE WHEN VOA.DIVIDEMULTIPLICA = 'M'
THEN V_ULTCUSTO * VOA.QUANTIDADE
ELSE V_ULTCUSTO / VOA.QUANTIDADE
END
ELSE
(ITE.VLRUNIT - (ITE.VLRDESC / ITE.QTDNEG))
END,
CASE WHEN EXISTS(SELECT 1 FROM TGFVOA WHERE CODPROD = ITE.CODPROD AND VOA.CODVOL = ITE.CODVOL) THEN
CASE WHEN VOA.DIVIDEMULTIPLICA = 'M'
THEN (ITE.VLRUNIT - (ITE.VLRDESC / ITE.QTDNEG)) * VOA.QUANTIDADE
ELSE (ITE.VLRUNIT - (ITE.VLRDESC / ITE.QTDNEG)) / VOA.QUANTIDADE
END
ELSE
(ITE.VLRUNIT - (ITE.VLRDESC / ITE.QTDNEG))
END
INTO
V_ULTCUSTOVOA,
V_VLRUNITVOA
FROM
TGFITE ITE
LEFT JOIN TGFVOA VOA ON ITE.CODPROD = VOA.CODPROD AND ITE.CODVOL = VOA.CODVOL
WHERE
ITE.NUNOTA = P_NUNOTA
AND ITE.SEQUENCIA = P_SEQUENCIA;
IF V_ULTCUSTO = 0 THEN
RETURN;
ELSE
IF V_VARIACAO > V_PERCVARCUSTO THEN
P_SUCESSO := 'N';
P_MENSAGEM := 'Variação superior ao permitido no custo do produto em relação à última compra. ' || CHR(10) ||
'Último Custo: R$ ' || TO_CHAR(V_ULTCUSTO, 'FM999G999G9990D90', 'nls_numeric_characters='',.''') || ' (R$ ' || TO_CHAR(V_ULTCUSTOVOA, 'FM999G999G9990D90', 'nls_numeric_characters='',.''') || '/' || V_CODVOL ||')' || CHR(10) ||
'Custo atual: R$ ' || TO_CHAR(V_VLRUNIT, 'FM999G999G9990D90', 'nls_numeric_characters='',.''') || ' (R$ ' || TO_CHAR(V_VLRUNITVOA, 'FM999G999G9990D90', 'nls_numeric_characters='',.''') || '/' || V_CODVOL ||')' || CHR(10) ||
'% Máx. permitido: ' || TO_CHAR(V_PERCVARCUSTO, 'FM999G999G9990D90', 'nls_numeric_characters='',.''') || ' (% de variação: ' || TO_CHAR(V_VARIACAO, 'FM999G999G9990D90', 'nls_numeric_characters='',.''') || ')';
ELSE
P_SUCESSO := 'S';
RETURN;
END IF;
END IF;
END;
END;
/
Criar a regra de negócio VARIAÇÃO MÁXIMA NO CUSTO:Obs.: Atribuir ao usuário o evento criado com o valor permitido para liberação.
Obs.: A regra de negócio já prevê a variação de custo por unidades alternativas.
Nenhum comentário:
Postar um comentário