create or replace PROCEDURE FCT_SINCRONIZAR_VARIACAO_PRECO (
    P_NRSEQITPRECBSERV IN FCT_VARIACAOTIPOMEDIDA.CDTPMEDIDASERV%TYPE,
    P_TIPO             IN CHAR,
    P_NRORG	           IN NUMBER,
    P_OPERADOR 		     IN VARCHAR2
)
AS

  V_NRSEQITPRECBSERV NUMBER;
  V_CDTPMEDIDASERV NUMBER;
  V_VRPRECO FLOAT(126);
  V_DTINIPBSERV DATE; 
  V_DTFIMVALPBSERV DATE;
  V_TIPO CHAR(1);
  V_VRPRECOVARIACAO FLOAT(126);
  V_VRPRECOVARIACAOCALC FLOAT(126);
  V_NRVARIACAOPRECBASESERV NUMBER;

BEGIN
   
    BEGIN
        SELECT NRSEQITPRECBSERV, CDTPMEDIDASERV, VRPRECO, 
               DTINIPBSERV, DTFIMVALPBSERV
          INTO V_NRSEQITPRECBSERV, V_CDTPMEDIDASERV, V_VRPRECO, 
               V_DTINIPBSERV, V_DTFIMVALPBSERV
          FROM FCT_ITPRECBASESERV
         WHERE NRSEQITPRECBSERV = P_NRSEQITPRECBSERV 
           AND NRORG = P_NRORG;
    EXCEPTION
      WHEN NO_DATA_FOUND THEN BEGIN
        V_NRSEQITPRECBSERV := NULL;
        V_CDTPMEDIDASERV := NULL;
        V_VRPRECO := NULL;
      END;
    END;
    
    IF P_TIPO = 'S' THEN

    /*Deleta todos os registros de variação do item */
      DELETE 
        FROM FCT_VARIACAOPRECBASESERV
       WHERE NRSEQITPRECBSERV = P_NRSEQITPRECBSERV
         AND NRORG = P_NRORG;    

      V_TIPO := 'I'; 

    ELSE 
      V_TIPO := P_TIPO;
    END IF;

    FOR C_VARIACAO IN (
       SELECT CDTPMEDIDASERV, CDTPMEDIDAVARIAVEL, QTMEDIDAINIVARIACAO,
              QTMEDIDAFIMVARIACAO, VRPERCVARIACAO
         FROM FCT_VARIACAOTIPOMEDIDA
        WHERE CDTPMEDIDASERV = V_CDTPMEDIDASERV 
          AND NRORG = P_NRORG
        ORDER BY CDTPMEDIDAVARIAVEL, QTMEDIDAINIVARIACAO
    ) LOOP

      /* FAZER O CÁLCULO DO PREÇO - V_VRPRECOVARIACAO */	
      IF C_VARIACAO.VRPERCVARIACAO > 0 THEN
        	
          V_VRPRECOVARIACAOCALC := C_VARIACAO.VRPERCVARIACAO;
          V_VRPRECOVARIACAOCALC := (V_VRPRECO * C_VARIACAO.VRPERCVARIACAO)/100;
          V_VRPRECOVARIACAO :=  V_VRPRECO - V_VRPRECOVARIACAOCALC;

    	ELSIF C_VARIACAO.VRPERCVARIACAO < 0 THEN
    		
          V_VRPRECOVARIACAOCALC := C_VARIACAO.VRPERCVARIACAO * -1;
          V_VRPRECOVARIACAOCALC := (V_VRPRECO * V_VRPRECOVARIACAOCALC)/100;
          V_VRPRECOVARIACAO :=  V_VRPRECO + V_VRPRECOVARIACAOCALC;

    	ELSE
           
          	V_VRPRECOVARIACAO := V_VRPRECO;

    	END IF;	

       /* INCLUSAO */
       IF V_TIPO = 'I' THEN
        	
        	NOVO_CODIGO_NT('FCT_VARIACAOPRECBASESERV', V_NRVARIACAOPRECBASESERV,1, P_NRORG);

        	INSERT INTO FCT_VARIACAOPRECBASESERV (NRVARIACAOPRECBASESERV, NRSEQITPRECBSERV, DTINIPBSERV, CDTPMEDIDASERV, CDTPMEDIDAVARIAVEL, 
                      QTMEDIDAINIVARIACAO, QTMEDIDAFIMVARIACAO, VRPRECOVARIACAO, DTFIMVALPBSERV, CDFILIAL, NRORG, 
                      DTINCLUSAO, NRORGINCLUSAO, CDOPERINCLUSAO, IDATIVO)
              VALUES (V_NRVARIACAOPRECBASESERV, P_NRSEQITPRECBSERV, V_DTINIPBSERV, C_VARIACAO.CDTPMEDIDASERV, C_VARIACAO.CDTPMEDIDAVARIAVEL, 
                      C_VARIACAO.QTMEDIDAINIVARIACAO, C_VARIACAO.QTMEDIDAFIMVARIACAO, V_VRPRECOVARIACAO,  V_DTFIMVALPBSERV, NULL, P_NRORG, 
                      SYSDATE, P_NRORG, P_OPERADOR, 'S');	

       /* EDIÇÃO */ 
       ELSE
     
        	UPDATE FCT_VARIACAOPRECBASESERV
        	   SET VRPRECOVARIACAO = V_VRPRECOVARIACAO
        	 WHERE NRSEQITPRECBSERV = P_NRSEQITPRECBSERV
             AND CDTPMEDIDASERV =  C_VARIACAO.CDTPMEDIDASERV
             AND CDTPMEDIDAVARIAVEL =  C_VARIACAO.CDTPMEDIDAVARIAVEL
             AND QTMEDIDAINIVARIACAO =  C_VARIACAO.QTMEDIDAINIVARIACAO 
             AND QTMEDIDAFIMVARIACAO =  C_VARIACAO.QTMEDIDAFIMVARIACAO
             AND NRORG = P_NRORG;

       END IF; 
    END LOOP;
    COMMIT;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('FCT_SINCRONIZAR_VARIACAO_PRECO','6.10.xxx'); END;
/
