quarta-feira, 4 de setembro de 2024

Regra de Negócio - Variação máxima permitida de custos de entrada

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:



Atributos dos dois campos adicionais

Tela Comercial > Preferências > Empresa


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:

Atribuir a TOP de Pedido de Compra

Criar o evento de liberação

Obs.: Atribuir ao usuário o evento criado com o valor permitido para liberação.


Na observação da solicitação de liberação é apresentado as informações pertinentes.

Obs.: A regra de negócio já prevê a variação de custo por unidades alternativas.

Nenhum comentário:

Postar um comentário