CREATE OR REPLACE TRIGGER CALC_PRECOECO_RENEG_PEDCOLETA
BEFORE UPDATE OF VRPRECREN
ON ITEMPEDCOL FOR EACH ROW
DECLARE
   V_DTCOLEPREC   PEDCOLETA.DTPEDCOLETA%TYPE;
   V_DTPARCELA    DATE;
   V_NRDIAS       NUMBER;
   V_NRFATOR      NUMBER;
   V_VRINDICE     NUMBER;
   V_DTULDIAMES   DATE;
   V_DTULTAUX     DATE;
   V_FATORPARC    NUMBER;
   V_VRPRECECO    NUMBER;
   V_VRPZOPGT     NUMBER;
   V_CONTA        NUMBER;
   V_DTPRIPARC    DATE;
   V_TOTREST      NUMBER;

   V_VRPERDESITM  ITEMCOLE.VRPERDESITM%TYPE;
   V_VRIMPITM     IMPPEDCOLETA.VRADIMPPEDCOL%TYPE;
   V_AUXVRIMPITM  IMPPEDCOLETA.VRADIMPPEDCOL%TYPE;
   V_VRRENDATUMAR MARCPROD.VRRENDATUMAR%TYPE;
   V_CDEMPRESA    PARCMPSUP.CDEMPRESA%TYPE;
   V_INSCESTA     FILIAL.CDINSCESTA%TYPE;
   V_IDUTDESCBON  PARASUPRI.IDUTDESCBON%TYPE;
   V_IDTPDESCFORN FORNECEDOR.IDTPDESCFORN%TYPE;
   V_VRPEDESCFORN FORNECEDOR.VRPEDESCFORN%TYPE;

   V_CDFORMPGTO   FORNECEDOR.CDFORMPGTO%TYPE;
   V_NRPARCPGTOFO FORNECEDOR.NRPARCPGTOFO%TYPE;
   V_NRDIAPGFIXFO FORNECEDOR.NRDIAPGFIXFO%TYPE;
   V_IDUTDIAPGTFO FORNECEDOR.IDUTDIAPGTFO%TYPE;
   V_IDTPFORPGTFO FORNECEDOR.IDTPFORPGTFO%TYPE;

   V_TESTENR      NUMBER;
   V_VRPERPIFORN  NUMBER;
   V_VRPRECECOPI  NUMBER;

   V_TIPOOPER     VARCHAR2(02);

   V_IDDTREPRECON PARASUPRI.IDDTREPRECON%TYPE;

-- CURSOR COM AS DATAS E PERCENTUAIS DE PAGAMENTO PARA FORMA DE PGTO VARIAVEL
 CURSOR C_PARCELAS IS
  SELECT
   V_DTPRIPARC +
   PRAZOPGTFORN.NRDIASPGTOFO AS DTPARCELA,
   PRAZOPGTFORN.VRPERCPGTOFO AS VRPZOPGT
  FROM
   PRAZOPGTFORN
  WHERE
   PRAZOPGTFORN.CDFORNECED  = :NEW.CDFORNECED;

BEGIN
  SELECT
     NVL(MAX(PARCMPSUP.CDTIPOOPER), '01') INTO V_TIPOOPER
  FROM
     PARCMPSUP,
     FILIAL
  WHERE
     (FILIAL.CDFILIAL    = :NEW.CDFILIAL) AND
     (PARCMPSUP.CDFILIAL = NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL));

  SELECT
    NVL(IDDTREPRECON, '1') INTO V_IDDTREPRECON
  FROM
    PARASUPRI
  WHERE
    CDFILIAL = :NEW.CDFILIAL;

  IF V_IDDTREPRECON = '1' THEN
    SELECT MAX(DTPEDCOLETA) INTO V_DTCOLEPREC -- BUSCA A DATA DA COLETA
    FROM PEDCOLETA
    WHERE
      CDFILIAL    = :NEW.CDFILIAL    AND
      NRPEDCOLETA = :NEW.NRPEDCOLETA AND
      CDFORNECED  = :NEW.CDFORNECED  AND
      CDREGIAO    = :NEW.CDREGIAO;
  ELSE
    SELECT MAX(DTINIPERCOT) INTO V_DTCOLEPREC -- BUSCA A DATA DA COLETA
    FROM PEDCOLETA
    WHERE
      CDFILIAL    = :NEW.CDFILIAL    AND
      NRPEDCOLETA = :NEW.NRPEDCOLETA AND
      CDFORNECED  = :NEW.CDFORNECED  AND
      CDREGIAO    = :NEW.CDREGIAO;
  END IF;

  /* CÁLCULO PARA OS IMPOSTOS COM AS SEGUINTES CONDIÇÕES(ICMS POR EXEMPLO):
     DESTACAR VALOR, IMPOSTO RECUPERÁVEL E COM CRÉDITO DE IMPOSTO */
  /* INICIO */
  V_CDEMPRESA := NULL;

  SELECT
     SUBSTR(EMITENTE(:NEW.CDFILIAL, :NEW.CDPRODUTO, :NEW.CDFORNECED), 3, 2) AS CDEMPRESA
  INTO
     V_CDEMPRESA
  FROM
     PARAMGERAL;

  SELECT
    MAX(FILIAL.CDINSCESTA) INTO V_INSCESTA
  FROM
    FILIAL
  WHERE
    FILIAL.CDFILIAL  = :NEW.CDFILIAL AND
    FILIAL.CDEMPRESA = V_CDEMPRESA;

  IMPOSTO_ITEMPEDCOL(V_CDEMPRESA,      V_INSCESTA,     :NEW.CDFILIAL,
                    :NEW.NRPEDCOLETA, :NEW.CDFORNECED, :NEW.CDREGIAO,
                    :NEW.CDPRODUTO,   :NEW.CDMARCA,    V_DTCOLEPREC,
                    :NEW.VRPRECREN,  :NEW.VRPERDESPEDCOL, 'N');


--BUSCA O TOTAL DO IMPOSTO CALCULADO PARA O ITEM DA COLETA
  SELECT
     SUM(VRADIMPPEDCOL) INTO V_VRIMPITM
  FROM
     IMPPEDCOLETA
  WHERE CDFILIAL    = :NEW.CDFILIAL
    AND NRPEDCOLETA = :NEW.NRPEDCOLETA
    AND CDFORNECED  = :NEW.CDFORNECED
    AND CDREGIAO    = :NEW.CDREGIAO
    AND CDPRODUTO   = :NEW.CDPRODUTO
    AND CDMARCA     = :NEW.CDMARCA;

  IF V_VRIMPITM IS NULL THEN
     V_VRIMPITM := 0;
  END IF;

  SELECT /*+ ORDERED */
    SUM(VRIMPPEDCOL) INTO V_AUXVRIMPITM
  FROM
    IMPPEDCOLETA,
    IMPOSTO,
    INCIDENCIA,
    PRODUTO,
    FORNECEDOR
  WHERE
    IMPPEDCOLETA.CDFILIAL    = :NEW.CDFILIAL           AND
    IMPPEDCOLETA.NRPEDCOLETA = :NEW.NRPEDCOLETA        AND
    IMPPEDCOLETA.CDFORNECED  = :NEW.CDFORNECED         AND
    IMPPEDCOLETA.CDREGIAO    = :NEW.CDREGIAO           AND
    IMPPEDCOLETA.CDPRODUTO   = :NEW.CDPRODUTO          AND
    IMPPEDCOLETA.CDMARCA     = :NEW.CDMARCA            AND
    IMPPEDCOLETA.CDIMPOSTO   = IMPOSTO.CDIMPOSTO       AND
    IMPOSTO.IDTRATIMPO       = 'V'                     AND
    IMPOSTO.IDIMPORECUP      = 'S'                     AND
    IMPOSTO.CDIMPOSTO        = INCIDENCIA.CDIMPOSTO    AND
    IMPPEDCOLETA.CDFORNECED  = FORNECEDOR.CDFORNECED   AND
    NVL(INCIDENCIA.CDGRUPOFISC,'-') = NVL(FORNECEDOR.CDGRUPOFISC,'-') AND
    INCIDENCIA.IDENTRSAIDIN = 'E'                  AND
    INCIDENCIA.CDEMPRESA    = V_CDEMPRESA          AND
    INCIDENCIA.CDTIPOOPER   = V_TIPOOPER           AND
    INCIDENCIA.CDINSCESTA   = RTRIM(V_INSCESTA)    AND
    INCIDENCIA.CDFISCAL     = '1'                  AND
    INCIDENCIA.CDPRODUTO    = PRODUTO.CDPRODUTO(+) AND
    NVL(PRODUTO.CDARVPROD, '_') =
     (SELECT
        MAX(NVL(P.CDARVPROD, '_'))
      FROM
        INCIDENCIA I,
        PRODUTO PR,
        PRODUTO P
      WHERE
        P.CDPRODUTO(+) = I.CDPRODUTO          AND
        PR.CDPRODUTO   = IMPPEDCOLETA.CDPRODUTO     AND
        I.CDIMPOSTO    = INCIDENCIA.CDIMPOSTO AND
        I.IDENTRSAIDIN = 'E'                  AND
        I.CDEMPRESA    = V_CDEMPRESA          AND
        I.CDTIPOOPER   = V_TIPOOPER           AND
        I.CDINSCESTA   = RTRIM(V_INSCESTA)    AND
        I.CDFISCAL     = '1'                  AND
        INSTR(PR.CDARVPROD,NVL(RTRIM(P.CDARVPROD),PR.CDARVPROD)) = 1);

  IF V_AUXVRIMPITM IS NULL THEN
     V_AUXVRIMPITM := 0;
  END IF;

  V_VRIMPITM := V_VRIMPITM - V_AUXVRIMPITM;
  /* FIM */

-- BUSCA O VALOR DE REDIMENTO PARA O PRODUTO E MARCA DA COLETA
   SELECT
     MAX(QFOMARPROD.VRRENDATU) INTO V_VRRENDATUMAR
   FROM QFOMARPROD
   WHERE
     QFOMARPROD.CDPRODUTO  = :NEW.CDPRODUTO  AND
     QFOMARPROD.CDMARCA    = :NEW.CDMARCA;

  IF (:NEW.VRPERDESPEDCOL IS NULL ) THEN
     V_VRPERDESITM := 0;
  ELSE
     V_VRPERDESITM := :NEW.VRPERDESPEDCOL;
  END IF;

  SELECT
     NVL(MAX(IDUTDESCBON), 'N') INTO V_IDUTDESCBON
  FROM
     PARASUPRI
  WHERE
     CDFILIAL = :NEW.CDFILIAL;

  SELECT
     NVL(MAX(IDTPDESCFORN), 'C'),
     MAX(VRPEDESCFORN),
     MAX(IDTPFORPGTFO),
     MAX(NRPARCPGTOFO),
     MAX(NRDIAPGFIXFO),
     MAX(IDUTDIAPGTFO),
     MAX(CDFORMPGTO)
  INTO
     V_IDTPDESCFORN,
     V_VRPEDESCFORN,
     V_IDTPFORPGTFO,
     V_NRPARCPGTOFO,
     V_NRDIAPGFIXFO,
     V_IDUTDIAPGTFO,
     V_CDFORMPGTO
  FROM
     FORNECEDOR
  WHERE
     CDFORNECED = :NEW.CDFORNECED;
  IF V_IDUTDESCBON = 'S' THEN
     IF V_IDTPDESCFORN = 'B' THEN
        IF (V_VRPEDESCFORN IS NOT NULL) AND (V_VRPEDESCFORN <> 0) THEN
           V_VRPERDESITM := V_VRPEDESCFORN;
        END IF;
     END IF;
  END IF;

  IF (V_VRRENDATUMAR IS NULL) OR (V_VRRENDATUMAR = 0) THEN
     V_VRRENDATUMAR := 1;
  END IF;
  V_VRPRECECO := 0;
  V_VRPRECECOPI := 0;

--*** SE FORMA DE PAGAMENTO FOR VARIAVEL
  IF V_IDTPFORPGTFO = 'V' THEN
    -- BUSCA A DATA DA PRIMEIRA PARCELA SE BASENDO NA MEDIA DE DIAS ENTRE UMA
    -- PARCELA E OUTRA.
    SELECT
     MIN(ROUND((TO_NUMBER(NVL(DIAPGTO.NRDIAFINPGTO,1)) - 1)/2) +
     V_DTCOLEPREC) INTO V_DTPRIPARC
    FROM
     DIAPGTO
    WHERE
     DIAPGTO.CDFORMPGTO               = V_CDFORMPGTO AND
     TO_NUMBER(DIAPGTO.NRDIAINIPGTO ) = 1;

    IF V_DTPRIPARC IS NULL THEN
       V_DTPRIPARC := V_DTCOLEPREC;
    END IF;

    V_TOTREST := 0;

    OPEN C_PARCELAS;
    LOOP
       FETCH C_PARCELAS INTO V_DTPARCELA, V_VRPZOPGT;
       EXIT WHEN C_PARCELAS%NOTFOUND;

       V_NRFATOR := 1;
       V_DTULDIAMES := LAST_DAY(V_DTCOLEPREC);
       V_NRDIAS := LAST_DAY(V_DTCOLEPREC)-V_DTCOLEPREC;
       V_DTULTAUX := V_DTCOLEPREC;

       WHILE V_DTPARCELA > V_DTULDIAMES LOOP
         -- BUSCA O INDICE A SER APLICADO PARA CORRECAO
          SELECT MAX(MOVINDICE.VRINDICE) INTO V_VRINDICE
          FROM
           PARASUPRI, MOVINDICE
          WHERE
           PARASUPRI.CDFILIAL   = :NEW.CDFILIAL         AND
           TO_CHAR(MOVINDICE.DTREFIND,'MMYYYY') =
           TO_CHAR(V_DTULDIAMES,'MMYYYY')               AND
           PARASUPRI.CDTPINDICE = MOVINDICE.CDTPINDICE AND
           PARASUPRI.IDPERVALOR = MOVINDICE.IDPERVALOR AND
           PARASUPRI.CDINDICE   = MOVINDICE.CDINDICE;
          IF V_VRINDICE IS NULL THEN
             V_VRINDICE := 0;
          END IF;
          V_NRFATOR := V_NRFATOR * (1 + (V_VRINDICE/100))**(V_NRDIAS/30);
          V_DTULTAUX := V_DTULDIAMES;
          V_DTULDIAMES := LAST_DAY(V_DTULDIAMES+1);
          V_NRDIAS   := V_DTULDIAMES - V_DTULTAUX;
       END LOOP;

       V_NRDIAS := V_DTPARCELA - V_DTULTAUX;
    -- BUSCA O INDICE A SER APLICADO PARA CORRECAO
       SELECT MAX(MOVINDICE.VRINDICE) INTO V_VRINDICE
       FROM
        PARASUPRI, MOVINDICE
       WHERE
        PARASUPRI.CDFILIAL   = :NEW.CDFILIAL         AND
        TO_CHAR(MOVINDICE.DTREFIND,'MMYYYY') =
        TO_CHAR(V_DTPARCELA,'MMYYYY')               AND
        PARASUPRI.CDTPINDICE = MOVINDICE.CDTPINDICE AND
        PARASUPRI.IDPERVALOR = MOVINDICE.IDPERVALOR AND
        PARASUPRI.CDINDICE   = MOVINDICE.CDINDICE;
       IF V_VRINDICE IS NULL THEN
          V_VRINDICE := 0;
       END IF;
       V_NRFATOR := V_NRFATOR * (1 + (V_VRINDICE/100))**(V_NRDIAS/30);
       V_TOTREST := V_TOTREST + ((1 / V_NRFATOR) * (V_VRPZOPGT/100));
    END LOOP;
    CLOSE C_PARCELAS;
    V_VRPRECECO := ROUND((:NEW.VRPRECREN - (:NEW.VRPRECREN * (V_VRPERDESITM /100)) + V_VRIMPITM) *
                   (1/V_VRRENDATUMAR) * V_TOTREST,5);

    V_VRPRECECOPI := ROUND((:NEW.VRPRECREN - (:NEW.VRPRECREN * (V_VRPERDESITM /100)) + V_VRIMPITM) * V_TOTREST,5);

--*** SE FORMA DE PAGAMENTO FOR FIXA
  ELSIF V_IDTPFORPGTFO = 'F' THEN

    V_TESTENR := V_NRDIAPGFIXFO;
    IF V_NRDIAPGFIXFO > TO_NUMBER(TO_CHAR(LAST_DAY(V_DTCOLEPREC), 'DD')) THEN
      V_TESTENR := TO_NUMBER(TO_CHAR(LAST_DAY(V_DTCOLEPREC), 'DD'));
    END IF;

 -- APURA A DATA INICIAL DE PAGAMENTO BASEADO NA CONDICAO INFORMADA
      IF TO_DATE(LPAD(TO_CHAR(V_TESTENR),2,'0') ||
         TO_CHAR(V_DTCOLEPREC,'MMYYYY'),'DDMMYYYY') >
         V_DTCOLEPREC AND V_IDUTDIAPGTFO = 'I' THEN

         V_DTPARCELA := TO_DATE(LPAD(TO_CHAR(V_TESTENR),2,'0') ||
                        TO_CHAR(V_DTCOLEPREC,'MMYYYY'),'DDMMYYYY');
      END IF;
      IF (TO_DATE(LPAD(TO_CHAR(V_TESTENR),2,'0') ||
          TO_CHAR(V_DTCOLEPREC,'MMYYYY'),'DDMMYYYY') <=
          V_DTCOLEPREC AND V_IDUTDIAPGTFO = 'I') OR
         (V_IDUTDIAPGTFO = 'E') THEN

         V_DTPARCELA := V_NRDIAPGFIXFO + LAST_DAY(V_DTCOLEPREC);
      END IF;

      V_FATORPARC := 0;
      V_CONTA := 1;
      V_NRFATOR := 1;
      V_DTULTAUX := V_DTCOLEPREC;

 -- CALCULA FATOR DE CORRECAO DE ACORDO COM O NUMERO DE PARCELAS INFORMADAS.
      FOR V_CONTA IN 1..V_NRPARCPGTOFO LOOP
         V_DTULDIAMES := LAST_DAY(V_DTCOLEPREC);
         V_NRDIAS := LAST_DAY(V_DTCOLEPREC)-V_DTCOLEPREC;
         V_DTULTAUX := V_DTCOLEPREC;

         WHILE V_DTPARCELA > V_DTULDIAMES LOOP
        -- BUSCA O INDICE A SER APLICADO PARA CORRECAO
           SELECT MAX(MOVINDICE.VRINDICE) INTO V_VRINDICE
           FROM
            PARASUPRI, MOVINDICE
           WHERE
            PARASUPRI.CDFILIAL   = :NEW.CDFILIAL         AND
            TO_CHAR(MOVINDICE.DTREFIND,'MMYYYY') =
            TO_CHAR(V_DTULDIAMES,'MMYYYY')               AND
            PARASUPRI.CDTPINDICE = MOVINDICE.CDTPINDICE AND
            PARASUPRI.IDPERVALOR = MOVINDICE.IDPERVALOR AND
            PARASUPRI.CDINDICE   = MOVINDICE.CDINDICE;

           IF V_VRINDICE IS NULL THEN
              V_VRINDICE := 0;
           END IF;
           V_NRFATOR := V_NRFATOR * (1 + (V_VRINDICE/100))**(V_NRDIAS/30);
           V_DTULTAUX := V_DTULDIAMES;
           V_DTULDIAMES := LAST_DAY(V_DTULDIAMES+1);
           V_NRDIAS := V_DTULDIAMES - V_DTULTAUX;
         END LOOP;

         V_NRDIAS := V_DTPARCELA - V_DTULTAUX;
     -- BUSCA O INDICE A SER APLICADO PARA CORRECAO
         SELECT MAX(MOVINDICE.VRINDICE) INTO V_VRINDICE
         FROM
          PARASUPRI, MOVINDICE
         WHERE
          PARASUPRI.CDFILIAL   = :NEW.CDFILIAL        AND
          TO_CHAR(MOVINDICE.DTREFIND,'MMYYYY') =
          TO_CHAR(V_DTPARCELA,'MMYYYY')               AND
          PARASUPRI.CDTPINDICE = MOVINDICE.CDTPINDICE AND
          PARASUPRI.IDPERVALOR = MOVINDICE.IDPERVALOR AND
          PARASUPRI.CDINDICE   = MOVINDICE.CDINDICE;
         IF V_VRINDICE IS NULL THEN
            V_VRINDICE := 0;
         END IF;
         V_NRFATOR := V_NRFATOR * (1 + (V_VRINDICE/100))**(V_NRDIAS/30);
         V_FATORPARC := V_FATORPARC + (1/V_NRFATOR);
         V_DTPARCELA := ADD_MONTHS(V_DTPARCELA,1);
      END LOOP;
      V_VRPRECECO := ROUND(((:NEW.VRPRECREN -
                     (:NEW.VRPRECREN * (V_VRPERDESITM /100)) +
                      V_VRIMPITM) / V_NRPARCPGTOFO) *
                      (1/V_VRRENDATUMAR) *
                      V_FATORPARC,5);

      V_VRPRECECOPI := ROUND(((:NEW.VRPRECREN -
                       (:NEW.VRPRECREN * (V_VRPERDESITM /100)) +
                        V_VRIMPITM) / V_NRPARCPGTOFO) *
                        V_FATORPARC,5);

  ELSIF V_IDTPFORPGTFO IS NULL THEN
 -- SE NAO FOI INFORMADO FORMA DE PAGAMENTO
      V_VRPRECECO := ROUND((:NEW.VRPRECREN -
                     (:NEW.VRPRECREN * (V_VRPERDESITM /100)) +
                      V_VRIMPITM) *
                      (1/V_VRRENDATUMAR),5);

      V_VRPRECECOPI := ROUND((:NEW.VRPRECREN -
                       (:NEW.VRPRECREN * (V_VRPERDESITM /100)) +
                        V_VRIMPITM), 5);
  END IF;
  :NEW.VRPRECRENECO := V_VRPRECECO;
  SELECT NVL(MAX(VRPERPIPRFO), 0) INTO V_VRPERPIFORN /* PROCURA O PI NA PRODFORNCOMP*/
  FROM PRODFORNCOMP
  WHERE CDFORNECED = :NEW.CDFORNECED AND
        CDPRODCOMPL = :NEW.CDPRODUTO;
  IF V_VRPERPIFORN = 0 THEN
     SELECT NVL(MAX(VRPERPIFORN), 0) INTO V_VRPERPIFORN /* SE NAO ACHAR NA PRODFORNCOMP ENTAO*/
     FROM FORNECEDOR                                    /*PROCURA NO FORNECEDOR*/
     WHERE CDFORNECED = :NEW.CDFORNECED;
  END IF;
  V_VRPRECECOPI := (V_VRPRECECOPI - (:NEW.VRPRECREN*V_VRPERPIFORN)/100) * (1/V_VRRENDATUMAR); /*CALCULO DO PI(PURCHASE INCOME)*/
  :NEW.VRPRECRENECOPI := V_VRPRECECOPI;
  :NEW.DTULTATUITPCOL := SYSDATE;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('CALC_PRECOECO_RENEG_PEDCOLETA','6.05.XXX'); END;
/