CREATE OR REPLACE
PROCEDURE ATUALIZA_CUSTO_ITEMCOL
  (P_CDFILIAL     IN ITMPREVLIST.CDFILIAL%TYPE,
   P_NRSEQPRELIST IN ITMPREVLIST.NRSEQPRELIST%TYPE) IS

   V_IDUTCUSTOM1  CHAR(1);
   V_IDUTCUSTOM2  CHAR(1);
   V_IDUTCUSLIPR  CHAR(1);
   V_IDUTILDTPROC CHAR(1);
   V_IDSISDOS     CHAR(1);
   V_IDVRIMPSTRIB CHAR(1);

   V_VRCUSPRLISM1 FLOAT;
   V_VRCUSPRLISM2 FLOAT;
   V_MINPRECO     FLOAT;
   V_VRIMPITM     FLOAT;
   V_VRFATOCONV   FLOAT;

   TYPE T_INDICE IS TABLE OF FLOAT INDEX BY VARCHAR(8);

   V_VRINDICEM1   T_INDICE;
   V_VRINDICEM2   T_INDICE;

   V_POSMINPRECO  INT;
   V_POSMINPREPI  INT;
   V_MULTIPLO     INT;

   V_CDIMPOSTRIB  VARCHAR2(2);
   V_MASCARA      VARCHAR2(30);
   V_LISTA_FILIAL VARCHAR2(20); /* NUMERO DA PRXLISTA SOBRE FILIAL */

   V_NRCOLEPRECO       ITEMCOLE.NRCOLEPRECO%TYPE;
   V_CDREGIAO          ITEMCOLE.CDREGIAO%TYPE;
   V_CDFORNECED        ITEMCOLE.CDFORNECED%TYPE;
   V_CDPRODUTO         ITEMCOLE.CDPRODUTO%TYPE;
   V_CDMARCA           ITEMCOLE.CDMARCA%TYPE;
   V_IDTIPOAPUR        PARASUPRI.IDTIPOAPUR%TYPE;
   V_DTINIVALLIST      PREVLISTA.DTINIVALLIST%TYPE;
   V_DTFINVALLIST      PREVLISTA.DTFINVALLIST%TYPE;
   V_DTFINVALITM_MAIS_DIA ITEMCOLE.DTFINVALITM%TYPE;
   V_CDOPERADOR        PREVLISTA.CDOPERADOR%TYPE;
   V_CURSOR_CDPRODESTO PRODUTO.CDPRODESTO%TYPE;
   V_CURSOR_CDREGIAO   REGIAO.CDREGIAO%TYPE;
   V_REGIAO_ANTERIOR   REGIAO.CDREGIAO%TYPE;
   V_CURSOR_FILIAL     FILIAL.CDFILIAL%TYPE;

   V_VRPERAJFORNFIL            AJUSTEPRFORNFIL.VRPERAJFORNFIL%TYPE;
   V_IDCONSPERPIAJPR           AJUSTEPRFORNFIL.IDCONSPERPIAJPR%TYPE;
   V_PIDSV                     FORNECEDOR.VRPERPIFORN%TYPE;

   V_60DIASATRAS       DATE;

   V_PRODUTO_ANTERIOR         PRODUTO.CDPRODUTO%TYPE;
   V_COTACAO_ANTERIOR         VARCHAR2(200);
   V_FILIAL_ANTERIOR          FILIAL.CDFILIAL%TYPE;
   V_COUNT                    FLOAT;

   W_SEPARADOR1              CHAR(1):= '#';
   W_SEPARADOR2              CHAR(1):= '%';
   W_A                       CHAR(1):= 'A';
   W_B                       CHAR(1):= 'B';
   W_D                       CHAR(1):= 'D';
   W_N                       CHAR(1):= 'N';
   W_M                       CHAR(1):= 'M';
   W_S                       CHAR(1):= 'S';
   W_1                       CHAR(1):= '1';
   W_2                       CHAR(1):= '2';
   W_3                       CHAR(1):= '3';
   W_4                       CHAR(1):= '4';
   W_5                       CHAR(1):= '5';
   W_6                       CHAR(1):= '6';
   W_7                       CHAR(1):= '7';
   W_8                       CHAR(1):= '8';
   W_9                       CHAR(1):= '9';
   W_10                      CHAR(2):= '10';
   W_30                      CHAR(2):= '30';
   W_31                      CHAR(2):= '31';
   W_48                      CHAR(2):= '48';
   W_FORMATO_DATA            CHAR(8):= 'DDMMYYYY';

   CURSOR C_PRODUTO IS
      SELECT
         ITEMCOLE.CDREGIAO,
         PRODUTO.CDPRODESTO
      FROM
         ITEMCOLE,
         PRODUTO
      WHERE
         PRODUTO.CDPRODUTO               = ITEMCOLE.CDPRODUTO AND
         ITEMCOLE.CDFILIAL               = P_CDFILIAL         AND
         (ITEMCOLE.NRSEQPRELIST          = DECODE(IDITVALDIFLISTA, 'S', ITEMCOLE.NRSEQPRELIST, P_NRSEQPRELIST)) AND
         (ITEMCOLE.DTINIVALITM          <= V_DTFINVALLIST)    AND
         (ITEMCOLE.DTFINVALITM          >= V_DTINIVALLIST)    AND
         NVL(ITEMCOLE.IDITECOLEALT, W_S) = W_S
      UNION
      SELECT
         ITEXCLISPREC.CDREGIAO,
         ITEXCLISPREC.CDPRODUTO CDPRODESTO
      FROM
         ITEXCLISPREC
      WHERE
         ITEXCLISPREC.CDFILIAL     = P_CDFILIAL     AND
         ITEXCLISPREC.NRSEQPRELIST = P_NRSEQPRELIST
      ORDER BY CDREGIAO;
   
   V_IDCUSSUPFILIVEN PARAMGERALVEN.IDCUSSUPFILIVEN%TYPE;
BEGIN
   /*
     Essa procedure tem a funcao de calcular o custo da lista de precos e
     e separada em dois processos. O primeiro processo le os dados referentes
     a lista de precos passada como parametro. Esse processo grava os dados
     em uma tabela temporaria, e apartir dessa tabela temporaria sao feitas
     as consistencias e verificacoes dos cadastros necessarios. O segundo processo
     le todos os acordos existentes que ainda estao vigentes, ou seja, com a data
     de validade final maior que a data atual, e grava em outra tabela temporaria,
     na qual sao efetuadas as mesmas consistencias.
   */
   V_MASCARA     := '00000000000000000000000';
   V_MULTIPLO    := 1000000;

   SELECT
      TO_DATE(SYSDATE - 60)
   INTO
      V_60DIASATRAS
   FROM
      DUAL;

   BEGIN
      SELECT
         IDTIPOAPUR
      INTO
         V_IDTIPOAPUR
      FROM
         PARASUPRI
      WHERE
         CDFILIAL = P_CDFILIAL;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_IDTIPOAPUR   := NULL;
   END;

   BEGIN
      SELECT
         IDUTILDTPROC,
         IDSISDOS
      INTO
         V_IDUTILDTPROC,
         V_IDSISDOS
      FROM
         PARAMGERAL;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN BEGIN
         V_IDUTILDTPROC := 'N';
         V_IDSISDOS     := '1';
      END;
   END;

   BEGIN
      SELECT
         NVL(IDUTTPCUSTO, W_N)
      INTO
         V_IDUTCUSTOM1
      FROM
         TIPOCUSTO
      WHERE
         CDTIPOCUSTO = W_30;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_IDUTCUSTOM1 := W_N;
   END;

   BEGIN
      SELECT
         NVL(IDUTTPCUSTO, W_N)
      INTO
         V_IDUTCUSTOM2
      FROM
         TIPOCUSTO
      WHERE
         CDTIPOCUSTO = W_31;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_IDUTCUSTOM2 := W_N;
   END;

   BEGIN
      SELECT
         NVL(IDUTTPCUSTO, W_N)
      INTO
         V_IDUTCUSLIPR
      FROM
         TIPOCUSTO
      WHERE
         CDTIPOCUSTO = W_10;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_IDUTCUSLIPR := W_N;
   END;

   BEGIN
      IF (V_IDUTCUSLIPR = W_N) THEN
         SELECT
            NVL(IDUTTPCUSTO, W_N)
         INTO
            V_IDUTCUSLIPR
         FROM
            TIPOCUSTO
         WHERE
               CDTIPOCUSTO = W_48;
      END IF;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_IDUTCUSLIPR := W_N;
   END;

   BEGIN
      SELECT
         DTINIVALLIST,
         DTFINVALLIST,
         CDOPERADOR
      INTO
         V_DTINIVALLIST,
         V_DTFINVALLIST,
         V_CDOPERADOR
      FROM
         PREVLISTA
      WHERE
         CDFILIAL     = P_CDFILIAL     AND
         NRSEQPRELIST = P_NRSEQPRELIST;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN BEGIN
         V_DTINIVALLIST := NULL;
         V_DTFINVALLIST := NULL;
         V_CDOPERADOR   := NULL;
      END;
   END;

   -- Identifica se para uso de filiais de venda
   SELECT MAX(IDCUSSUPFILIVEN)
     INTO V_IDCUSSUPFILIVEN
     FROM PARAMGERALVEN;
   
   V_IDCUSSUPFILIVEN := NVL(V_IDCUSSUPFILIVEN, 'N');

   V_REGIAO_ANTERIOR := ' ';

   NOVO_CODIGO('LISTA', V_LISTA_FILIAL, 1);
   V_LISTA_FILIAL := SUBSTR(V_LISTA_FILIAL, 11, 10);

   OPEN C_PRODUTO;
   LOOP
      FETCH C_PRODUTO INTO V_CURSOR_CDREGIAO,
                           V_CURSOR_CDPRODESTO;
      EXIT WHEN C_PRODUTO%NOTFOUND;
      IF V_REGIAO_ANTERIOR <> V_CURSOR_CDREGIAO THEN
         V_REGIAO_ANTERIOR := V_CURSOR_CDREGIAO;
         DELETE
         FROM LISTA
         WHERE NRLISTA = V_LISTA_FILIAL;

         IF (V_IDSISDOS = W_3) AND (V_IDUTILDTPROC = W_S)THEN
            INSERT INTO LISTA
               (NRLISTA, CDLISTA)
            SELECT
               V_LISTA_FILIAL,
               F.CDFILIAL
            FROM
               FILIAL F,
               PARAMFILIAL P
            WHERE
               F.CDREGIAO    = V_CURSOR_CDREGIAO AND
               F.CDFILIAL    = P.CDFILIAL        AND
               NVL(F.IDCNTRRESC, 'N') = 'N'      AND               
               P.DTPROCESSA >= V_60DIASATRAS     AND
               (V_IDCUSSUPFILIVEN = W_S OR
               EXISTS (SELECT
                          W_1
                       FROM
                          CARDADIA C
                       WHERE
                          C.CDFILIAL = F.CDFILIAL));
         ELSE
            INSERT INTO LISTA
               (NRLISTA, CDLISTA)
            SELECT
               V_LISTA_FILIAL,
               CDFILIAL
            FROM
               FILIAL
            WHERE
               FILIAL.CDREGIAO = V_CURSOR_CDREGIAO AND
               NVL(FILIAL.IDCNTRRESC, 'N') = 'N'   AND
               (V_IDCUSSUPFILIVEN = W_S OR
               EXISTS (SELECT
                          1
                       FROM
                          CARDADIA C
                       WHERE
                          C.CDFILIAL = FILIAL.CDFILIAL));
         END IF;
      END IF;

      FOR C_FILIAL IN
         (
          SELECT
             CDLISTA CDFILIAL
          FROM
             LISTA
          WHERE
             LISTA.NRLISTA = V_LISTA_FILIAL
          )
      LOOP
         INSERT INTO CUSTOSUP_TMP
           (CDFILIAL,
            CDFILCENTCMP,
            NRSEQPRELIST,
            DTINIVALITM,
            DTFINVALITM,
            CDPRODESTO,
            MINPRECO
            )
            SELECT
               FILIAL.CDFILIAL,
               ITEMCOLE.CDFILIAL CDFILCENTCMP,
               P_NRSEQPRELIST,
               DECODE(V_DTINIVALLIST - ITEMCOLE.DTINIVALITM, ABS(V_DTINIVALLIST - ITEMCOLE.DTINIVALITM), V_DTINIVALLIST, ITEMCOLE.DTINIVALITM) DTINIVALITM,
               DECODE(V_DTFINVALLIST - ITEMCOLE.DTFINVALITM, ABS(V_DTFINVALLIST - ITEMCOLE.DTFINVALITM), ITEMCOLE.DTFINVALITM, V_DTFINVALLIST) DTFINVALITM,
               PRODUTO.CDPRODESTO,
               MIN(TO_CHAR(DECODE(V_IDTIPOAPUR, NULL, (ITEMCOLE.VRPRECUNIITM/PRODUTO.VRFATOCONV),
                                                 W_1, (ITEMCOLE.VRPRECECOITM/PRODUTO.VRFATOCONV),
                                                      (ITEMCOLE.VRPRECOITMPI/PRODUTO.VRFATOCONV)) * V_MULTIPLO, V_MASCARA) ||W_SEPARADOR1||
                   TO_CHAR((ITEMCOLE.VRPRECUNIITM/PRODUTO.VRFATOCONV) * V_MULTIPLO, V_MASCARA)  ||W_SEPARADOR2||
                   ITEMCOLE.NRCOLEPRECO ||
                   ITEMCOLE.CDREGIAO    ||
                   ITEMCOLE.CDPRODUTO   ||
                   ITEMCOLE.CDMARCA     ||
                   ITEMCOLE.CDFORNECED) MINPRECO
            FROM
               FORNECEDOR,
               COLETAPR,
               PRODUTO,
               FILIAL,
               ITEMCOLE
            WHERE
               ((ITEMCOLE.CDPRODUTO IN (SELECT PRODPREFMED.CDPRODPREF
                                        FROM PRODPREFMED
                                        WHERE PRODPREFMED.CDFILIAL  = FILIAL.CDFILIAL AND
                                              PRODPREFMED.CDPRODUTO = PRODUTO.CDPRODESTO)) OR
                 (NOT EXISTS (SELECT W_1
                              FROM PRODPREFMED P
                              WHERE
                                 P.CDFILIAL  = FILIAL.CDFILIAL    AND
                                 P.CDPRODUTO = PRODUTO.CDPRODESTO AND
                                 P.CDPRODPREF IS NOT NULL))
                ) AND
               (FILIAL.CDFILIAL       = FILIAL.CDFILIAL)      AND
               (ITEMCOLE.CDREGIAO     = V_CURSOR_CDREGIAO)    AND
               (PRODUTO.CDPRODESTO    = V_CURSOR_CDPRODESTO)  AND
               (FILIAL.CDFILIAL       = C_FILIAL.CDFILIAL)    AND
               (ITEMCOLE.CDFILIAL     = P_CDFILIAL)           AND
               (ITEMCOLE.NRSEQPRELIST = DECODE(IDITVALDIFLISTA, 'S', ITEMCOLE.NRSEQPRELIST, P_NRSEQPRELIST)) AND
               (ITEMCOLE.DTINIVALITM <= V_DTFINVALLIST)       AND
               (ITEMCOLE.DTFINVALITM >= V_DTINIVALLIST)       AND
               (ITEMCOLE.IDITMLISPREC = W_S)                  AND
               (ITEMCOLE.VRPRECUNIITM > 0)                    AND
               (ITEMCOLE.CDREGIAO     = FILIAL.CDREGIAO)      AND
               (ITEMCOLE.CDPRODUTO    = PRODUTO.CDPRODUTO)    AND
               (FORNECEDOR.CDFORNECED = ITEMCOLE.CDFORNECED)  AND
               (COLETAPR.CDFILIAL     = ITEMCOLE.CDFILIAL)    AND
               (COLETAPR.NRCOLEPRECO  = ITEMCOLE.NRCOLEPRECO) AND
               (COLETAPR.CDOPERADOR   = V_CDOPERADOR)         AND
               (FORNECEDOR.IDSITUCADA = W_A)                  AND
               (NVL(FORNECEDOR.IDTIPOFORN, W_N) <> W_A)
                AND NOT EXISTS (SELECT
                                   W_1
                                FROM
                                   REFOREG
                                WHERE
                                   (REFOREG.CDREGIAO   = ITEMCOLE.CDREGIAO) AND
                                   (REFOREG.CDFORNECED = ITEMCOLE.CDFORNECED))
                AND NOT EXISTS (SELECT
                                   W_1
                                FROM
                                   REFORFIL
                                WHERE
                                   (CDFILIAL   = FILIAL.CDFILIAL)   AND
                                   (CDFORNECED = ITEMCOLE.CDFORNECED) AND
                                   (CDPERIENTR IS NULL))
                AND NOT EXISTS (SELECT
                                   W_1
                                FROM
                                   QFOPRODFORN,
                                   PARASUPRI
                                WHERE
                                   (PARASUPRI.CDFILIAL     = P_CDFILIAL)              AND
                                   (QFOPRODFORN.CDPRODUTO  = ITEMCOLE.CDPRODUTO)  AND
                                   (QFOPRODFORN.CDFORNECED = ITEMCOLE.CDFORNECED) AND
                                   ((QFOPRODFORN.IDFORNAPROV = W_N AND QFOPRODFORN.IDFORNAUTOR = W_N) OR ((QFOPRODFORN.IDFORNAPROV = W_S) AND ((PARASUPRI.IDULTIDTVALQ = W_M AND COLETAPR.DTCOLEPREC > LAST_DAY(QFOPRODFORN.DTVALPRFORN)) OR (PARASUPRI.IDULTIDTVALQ = W_D AND COLETAPR.DTCOLEPREC > QFOPRODFORN.DTVALPRFORN)))))
                AND NOT EXISTS (SELECT
                                   W_1
                                FROM
                                   QFOMARPROD,
                                   PARASUPRI
                                WHERE
                                   (PARASUPRI.CDFILIAL   = P_CDFILIAL)             AND
                                   (QFOMARPROD.CDPRODUTO = ITEMCOLE.CDPRODUTO) AND
                                   (QFOMARPROD.CDMARCA   = ITEMCOLE.CDMARCA)   AND
                                   ((QFOMARPROD.IDAPRMARPRO = W_N AND QFOMARPROD.IDAUTMARPRO = W_N) OR ((QFOMARPROD.IDAPRMARPRO = W_S) AND ((PARASUPRI.IDULTIDTVALQ = W_M AND COLETAPR.DTCOLEPREC > LAST_DAY(QFOMARPROD.DTVALAPROVA)) OR (PARASUPRI.IDULTIDTVALQ = W_D AND COLETAPR.DTCOLEPREC > QFOMARPROD.DTVALAPROVA)))))
                AND EXISTS (SELECT
                               W_1
                            FROM
                               QFOMARPROD
                            WHERE
                               (QFOMARPROD.CDPRODUTO = ITEMCOLE.CDPRODUTO) AND
                               (QFOMARPROD.CDMARCA   = ITEMCOLE.CDMARCA)

                            UNION ALL

                            SELECT
                               W_1
                            FROM
                               PARASUPRI
                            WHERE
                               (PARASUPRI.CDFILIAL    = P_CDFILIAL) AND
                               (PARASUPRI.IDMARSEMQUA = W_N OR PARASUPRI.IDMARSEMQUA IS NULL))
                AND NOT EXISTS (SELECT
                                   W_1
                                FROM
                                   QUALIFICACAO,
                                   PARASUPRI
                                WHERE
                                   (QUALIFICACAO.CDQUALIF     = FORNECEDOR.CDQUALIF) AND
                                   (PARASUPRI.CDFILIAL        = P_CDFILIAL)          AND
                                   (FORNECEDOR.IDFORNAUTO     = W_N)                 AND
                                   ((QUALIFICACAO.IDPERCOTCMP = W_2) OR ((PARASUPRI.IDULTIDTVALQ = W_D AND COLETAPR.DTCOLEPREC > FORNECEDOR.DTVALQUALIF) OR (PARASUPRI.IDULTIDTVALQ = W_M AND COLETAPR.DTCOLEPREC > LAST_DAY(FORNECEDOR.DTVALQUALIF)))))
                AND (

                     (EXISTS (SELECT
                                 W_1
                              FROM
                                 PARTFILI
                              WHERE
                                 (CDFILIAL  = FILIAL.CDFILIAL)    AND
                                 (CDPRODUTO = ITEMCOLE.CDPRODUTO) AND
                                 (CDTIPPART IN (W_1, W_2))        AND
                                 (CDMARCA   = ITEMCOLE.CDMARCA)   AND
                                 (NOT EXISTS (SELECT
                                                 W_1
                                              FROM
                                                 PARTFILI
                                              WHERE
                                                 (CDFILIAL   = FILIAL.CDFILIAL )       AND
                                                 (CDPRODUTO  = ITEMCOLE.CDPRODUTO)     AND
                                                 (CDTIPPART  IN (W_4, W_5))            AND
                                                 (NRCOLEPRECO IS NULL)                 AND
                                                 (CDFORNECED <> ITEMCOLE.CDFORNECED))

                                  )
                               )



                      )

                     OR (EXISTS (SELECT
                                    W_1
                                 FROM
                                    PARTFILI
                                 WHERE
                                    (CDFILIAL   = FILIAL.CDFILIAL )    AND
                                    (CDPRODUTO  = ITEMCOLE.CDPRODUTO)  AND
                                    (CDTIPPART  IN (W_4, W_5))         AND
                                    (NRCOLEPRECO IS NULL)              AND
                                    (CDFORNECED = ITEMCOLE.CDFORNECED) AND
                                    (NOT EXISTS (SELECT
                                                    W_1
                                                 FROM
                                                    PARTFILI
                                                 WHERE
                                                   (CDFILIAL  = FILIAL.CDFILIAL)    AND
                                                   (CDPRODUTO = ITEMCOLE.CDPRODUTO) AND
                                                   (CDTIPPART IN (W_1, W_2))        AND
                                                   (CDMARCA   <> ITEMCOLE.CDMARCA))
                                      )
                                   )

                         )

                     OR (EXISTS (SELECT
                                    W_1
                                 FROM
                                    PARTFILI
                                 WHERE
                                    (CDFILIAL   = FILIAL.CDFILIAL)  AND
                                    (CDPRODUTO  = ITEMCOLE.CDPRODUTO) AND
                                    (CDTIPPART  IN (W_7, W_8))            AND
                                    (CDMARCA    = ITEMCOLE.CDMARCA)   AND
                                    (CDFORNECED = ITEMCOLE.CDFORNECED)))

                     OR (EXISTS (SELECT
                                    W_1
                                 FROM
                                    PARTFILI
                                 WHERE
                                    (CDFILIAL  = FILIAL.CDFILIAL)  AND
                                    (CDPRODUTO = ITEMCOLE.CDPRODUTO) AND
                                    (CDTIPPART  IN (W_3,W_6,W_9)))   AND
                         NOT EXISTS (SELECT
                                        W_1
                                     FROM
                                        PARTFILI
                                     WHERE
                                        (CDFILIAL  = FILIAL.CDFILIAL)    AND
                                        (CDPRODUTO = ITEMCOLE.CDPRODUTO) AND
                                        (NRCOLEPRECO IS NULL)            AND
                                        (CDTIPPART  IN (W_1,W_2,W_4,W_5,W_7,W_8)))
                         )

                     OR (NOT EXISTS (SELECT
                                        W_1
                                     FROM
                                        PARTFILI
                                     WHERE
                                        (CDFILIAL  = FILIAL.CDFILIAL) AND
                                        (NRCOLEPRECO IS NULL)         AND
                                        (CDPRODUTO = ITEMCOLE.CDPRODUTO)))
                     )
                AND (NOT EXISTS (SELECT
                                    W_1
                                 FROM
                                    PARTFILI
                                 WHERE
                                    (CDFILIAL  = FILIAL.CDFILIAL)  AND
                                    (CDPRODUTO = ITEMCOLE.CDPRODUTO) AND
                                    (CDTIPPART = W_3)                    AND
                                    (CDMARCA   = ITEMCOLE.CDMARCA)))
                AND (NOT EXISTS (SELECT
                                    W_1
                                 FROM
                                    PARTFILI
                                 WHERE
                                    (CDFILIAL   = FILIAL.CDFILIAL)  AND
                                    (CDPRODUTO  = ITEMCOLE.CDPRODUTO) AND
                                    (CDTIPPART  = W_6)                    AND
                                    (CDFORNECED = ITEMCOLE.CDFORNECED)))
                AND (NOT EXISTS (SELECT
                                    W_1
                                 FROM
                                    PARTFILI
                                 WHERE
                                    (CDFILIAL   = FILIAL.CDFILIAL)  AND
                                    (CDPRODUTO  = ITEMCOLE.CDPRODUTO) AND
                                    (CDTIPPART  = W_9)                    AND
                                    (CDMARCA    = ITEMCOLE.CDMARCA)   AND
                                    (CDFORNECED = ITEMCOLE.CDFORNECED)))
            GROUP BY
               FILIAL.CDFILIAL,
               ITEMCOLE.CDFILIAL,
               P_NRSEQPRELIST,
               DECODE(V_DTINIVALLIST - ITEMCOLE.DTINIVALITM, ABS(V_DTINIVALLIST - ITEMCOLE.DTINIVALITM), V_DTINIVALLIST, ITEMCOLE.DTINIVALITM),
               DECODE(V_DTFINVALLIST - ITEMCOLE.DTFINVALITM, ABS(V_DTFINVALLIST - ITEMCOLE.DTFINVALITM), ITEMCOLE.DTFINVALITM, V_DTFINVALLIST),
               PRODUTO.CDPRODESTO;

         V_COUNT := 0;
         FOR C_VERIFICA_VALIDADE IN
            (SELECT CUSTOSUP_TMP.ROWID, CUSTOSUP_TMP.DTINIVALITM, CUSTOSUP_TMP.DTFINVALITM
             FROM CUSTOSUP_TMP
             WHERE CDFILIAL = C_FILIAL.CDFILIAL)
         LOOP
            IF V_COUNT = 0 THEN
               V_COUNT := 0;
               SELECT COUNT(1)
               INTO V_COUNT
               FROM CUSTOSUP_TMP
               WHERE CUSTOSUP_TMP.CDFILIAL = C_FILIAL.CDFILIAL
                 AND CUSTOSUP_TMP.CDPRODESTO = V_CURSOR_CDPRODESTO
                 AND CUSTOSUP_TMP.ROWID <> C_VERIFICA_VALIDADE.ROWID
                 AND ((CUSTOSUP_TMP.DTINIVALITM <> C_VERIFICA_VALIDADE.DTINIVALITM) OR (CUSTOSUP_TMP.DTFINVALITM <> C_VERIFICA_VALIDADE.DTFINVALITM))
                 AND CUSTOSUP_TMP.DTINIVALITM <= C_VERIFICA_VALIDADE.DTFINVALITM
                 AND CUSTOSUP_TMP.DTFINVALITM >= C_VERIFICA_VALIDADE.DTINIVALITM;
            ELSE
               EXIT;
            END IF;
         END LOOP;

         IF V_COUNT > 0 THEN
            DELETE FROM CUSTOSUPACOR_TMP;
            FOR C_DATA IN
               (SELECT DTDATA
                FROM DATA
                WHERE DTDATA BETWEEN V_DTINIVALLIST AND V_DTFINVALLIST
                ORDER BY DTDATA)
            LOOP
               FOR C_PRODUTO IN
                  (SELECT DISTINCT CUSTOSUP_TMP.CDFILIAL, CUSTOSUP_TMP.CDPRODESTO
                   FROM CUSTOSUP_TMP
                   ORDER BY CUSTOSUP_TMP.CDFILIAL, CUSTOSUP_TMP.CDPRODESTO)
               LOOP
                  FOR C_MENOR_PRECO_DATA IN
                     (SELECT MIN(CUSTOSUP_TMP.MINPRECO) MINPRECO
                      FROM CUSTOSUP_TMP
                      WHERE C_DATA.DTDATA BETWEEN CUSTOSUP_TMP.DTINIVALITM AND CUSTOSUP_TMP.DTFINVALITM
                        AND C_PRODUTO.CDFILIAL = CUSTOSUP_TMP.CDFILIAL
                        AND C_PRODUTO.CDPRODESTO = CUSTOSUP_TMP.CDPRODESTO)
                  LOOP
                     INSERT INTO CUSTOSUPACOR_TMP(CDFILIAL, CDFILCENTCMP, NRSEQPRELIST, DTINIVALITM,
                                                  DTFINVALITM, CDPRODESTO, MINPRECO)
                     VALUES(C_PRODUTO.CDFILIAL, P_CDFILIAL, P_NRSEQPRELIST, C_DATA.DTDATA,
                            C_DATA.DTDATA, C_PRODUTO.CDPRODESTO, C_MENOR_PRECO_DATA.MINPRECO);
                  END LOOP;

                  DELETE FROM CUSTOSUP
                  WHERE CDFILIAL = C_PRODUTO.CDFILIAL
                    AND CDPRODUTO = C_PRODUTO.CDPRODESTO
                    AND DTCUSTOSUP <= V_DTFINVALLIST
                    AND DTFINCUSTSUP >= V_DTINIVALLIST;
               END LOOP;
            END LOOP;

            V_PRODUTO_ANTERIOR := NULL;
            V_COTACAO_ANTERIOR := NULL;
            V_FILIAL_ANTERIOR  := NULL;
            FOR C_AJUSTE IN
               (SELECT CDFILIAL, CDPRODESTO, DTINIVALITM, MINPRECO
                FROM CUSTOSUPACOR_TMP
                ORDER BY CDFILIAL, CDPRODESTO, DTINIVALITM)
            LOOP
               IF (V_PRODUTO_ANTERIOR IS NULL) AND (V_COTACAO_ANTERIOR IS NULL) AND (V_FILIAL_ANTERIOR IS NULL) THEN
                  V_PRODUTO_ANTERIOR := C_AJUSTE.CDPRODESTO;
                  V_COTACAO_ANTERIOR := C_AJUSTE.MINPRECO;
                  V_FILIAL_ANTERIOR  := C_AJUSTE.CDFILIAL;
                  UPDATE CUSTOSUP_TMP
                  SET IDAJUSTEATUCUST = 'S'
                  WHERE CDPRODESTO = C_AJUSTE.CDPRODESTO
                    AND MINPRECO = C_AJUSTE.MINPRECO
                    AND CDFILIAL = C_AJUSTE.CDFILIAL;
               ELSE
                  IF   (V_PRODUTO_ANTERIOR <> C_AJUSTE.CDPRODESTO)
                    OR (V_COTACAO_ANTERIOR <> C_AJUSTE.MINPRECO)
                    OR (V_FILIAL_ANTERIOR  <> C_AJUSTE.CDFILIAL)  THEN
                     INSERT INTO CUSTOSUP_TMP (CDFILIAL, CDFILCENTCMP, NRSEQPRELIST, DTINIVALITM,
                                               DTFINVALITM, CDPRODESTO, MINPRECO, IDAJUSTEATUCUST)
                     SELECT
                        C_AJUSTE.CDFILIAL,
                        P_CDFILIAL,
                        P_NRSEQPRELIST,
                        C_AJUSTE.DTINIVALITM,
                        C.DTFINVALITM,
                        C_AJUSTE.CDPRODESTO,
                        C.MINPRECO,
                        'S'
                     FROM CUSTOSUP_TMP C
                     WHERE C.MINPRECO = C_AJUSTE.MINPRECO
                      AND  C.CDPRODESTO = C_AJUSTE.CDPRODESTO
                      AND  C.CDFILIAL = C_AJUSTE.CDFILIAL;

                     DELETE FROM CUSTOSUP_TMP
                     WHERE NVL(IDAJUSTEATUCUST, 'N') = 'N'
                       AND CUSTOSUP_TMP.MINPRECO = C_AJUSTE.MINPRECO
                       AND CUSTOSUP_TMP.CDPRODESTO = C_AJUSTE.CDPRODESTO
                       AND CUSTOSUP_TMP.CDFILIAL = C_AJUSTE.CDFILIAL;

                    V_PRODUTO_ANTERIOR := C_AJUSTE.CDPRODESTO;
                    V_COTACAO_ANTERIOR := C_AJUSTE.MINPRECO;
                    V_FILIAL_ANTERIOR  := C_AJUSTE.CDFILIAL;
                  END IF;
               END IF;
            END LOOP;
            DELETE FROM CUSTOSUPACOR_TMP;
            DELETE FROM CUSTOSUP_TMP
            WHERE NVL(IDAJUSTEATUCUST, 'N') = 'N'
              AND CUSTOSUP_TMP.CDFILIAL = C_FILIAL.CDFILIAL;
         END IF;

         FOR C_CUSTO IN
         (SELECT
             CUSTOSUP_TMP.CDFILIAL,
             CUSTOSUP_TMP.DTINIVALITM,
             CUSTOSUP_TMP.DTFINVALITM,
             CUSTOSUP_TMP.CDPRODESTO,
             CUSTOSUP_TMP.MINPRECO
          FROM
             CUSTOSUP_TMP
          WHERE CUSTOSUP_TMP.CDFILCENTCMP = P_CDFILIAL
            AND CUSTOSUP_TMP.NRSEQPRELIST = P_NRSEQPRELIST
            AND CUSTOSUP_TMP.CDPRODESTO   = V_CURSOR_CDPRODESTO
            AND CUSTOSUP_TMP.CDFILIAL     = C_FILIAL.CDFILIAL
          )
         LOOP
            /* Alteracao proposta pelo Jalmor - populando tabelas em memoria (array)
               com os valores dos indices (moedas) parametrizados */
            IF (V_IDUTCUSTOM1 = W_S) OR (V_IDUTCUSTOM2 = W_S) THEN
               IF (V_IDUTCUSTOM1 = W_S) THEN
                  BEGIN
                     IF V_VRINDICEM1(TO_CHAR(C_CUSTO.DTINIVALITM, W_FORMATO_DATA)) IS NULL THEN
                        SELECT
                           NVL(MAX(MOVINDICE.VRINDICE), 0)
                        INTO
                           V_VRINDICEM1(TO_CHAR(C_CUSTO.DTINIVALITM, W_FORMATO_DATA))
                        FROM
                           PARAMGERAL,
                           MOVINDICE
                        WHERE
                           (PARAMGERAL.CDINDICEMF = MOVINDICE.CDINDICE)  AND
                           (MOVINDICE.DTREFIND    = C_CUSTO.DTINIVALITM) AND
                           (MOVINDICE.CDTPINDICE  = W_1)                 AND
                           (MOVINDICE.IDPERVALOR  = W_2);
                     END IF;
                  EXCEPTION
                     WHEN OTHERS THEN BEGIN
                        SELECT
                           NVL(MAX(MOVINDICE.VRINDICE), 0)
                        INTO
                           V_VRINDICEM1(TO_CHAR(C_CUSTO.DTINIVALITM, W_FORMATO_DATA))
                        FROM
                           PARAMGERAL,
                           MOVINDICE
                        WHERE
                           (PARAMGERAL.CDINDICEMF = MOVINDICE.CDINDICE)  AND
                           (MOVINDICE.DTREFIND    = C_CUSTO.DTINIVALITM) AND
                           (MOVINDICE.CDTPINDICE  = W_1)                 AND
                           (MOVINDICE.IDPERVALOR  = W_2);
                     END;
                  END;
               END IF;

               IF (V_IDUTCUSTOM2 = W_S) THEN
                  BEGIN
                     IF V_VRINDICEM2(TO_CHAR(C_CUSTO.DTINIVALITM, W_FORMATO_DATA)) IS NULL THEN
                        SELECT
                           NVL(MAX(MOVINDICE.VRINDICE), 0)
                        INTO
                           V_VRINDICEM2(TO_CHAR(C_CUSTO.DTINIVALITM, W_FORMATO_DATA))
                        FROM
                           PARAMGERAL,
                           MOVINDICE
                        WHERE
                           (PARAMGERAL.CDINDICEMF2 = MOVINDICE.CDINDICE)  AND
                           (MOVINDICE.DTREFIND     = C_CUSTO.DTINIVALITM) AND
                           (MOVINDICE.CDTPINDICE   = W_1)                 AND
                           (MOVINDICE.IDPERVALOR   = W_2);
                     END IF;
                  EXCEPTION
                     WHEN OTHERS THEN BEGIN
                         SELECT
                           NVL(MAX(MOVINDICE.VRINDICE), 0)
                        INTO
                           V_VRINDICEM2(TO_CHAR(C_CUSTO.DTINIVALITM, W_FORMATO_DATA))
                        FROM
                           PARAMGERAL,
                           MOVINDICE
                        WHERE
                           (PARAMGERAL.CDINDICEMF2 = MOVINDICE.CDINDICE)  AND
                           (MOVINDICE.DTREFIND     = C_CUSTO.DTINIVALITM) AND
                           (MOVINDICE.CDTPINDICE   = W_1)                 AND
                           (MOVINDICE.IDPERVALOR   = W_2);
                     END;
                  END;
               END IF;
            END IF;

            V_POSMINPREPI := INSTR(C_CUSTO.MINPRECO, W_SEPARADOR1);
            V_POSMINPRECO := INSTR(C_CUSTO.MINPRECO, W_SEPARADOR2);

            V_MINPRECO    := (SUBSTR(C_CUSTO.MINPRECO, V_POSMINPREPI + 1, V_POSMINPRECO - V_POSMINPREPI - 1))/V_MULTIPLO;
            V_NRCOLEPRECO := SUBSTR(C_CUSTO.MINPRECO, V_POSMINPRECO+1, 10);
            V_CDREGIAO    := SUBSTR(C_CUSTO.MINPRECO, V_POSMINPRECO+11, 3);
            V_CDPRODUTO   := SUBSTR(C_CUSTO.MINPRECO, V_POSMINPRECO+14, 10);
            V_CDMARCA     := SUBSTR(C_CUSTO.MINPRECO, V_POSMINPRECO+24, 5);
            V_CDFORNECED  := SUBSTR(C_CUSTO.MINPRECO, V_POSMINPRECO+29, 21);

            V_VRPERAJFORNFIL := NULL;
            V_IDCONSPERPIAJPR := 'N';
            SELECT
               MAX(VRPERAJFORNFIL),
               MAX(IDCONSPERPIAJPR)
            INTO V_VRPERAJFORNFIL, V_IDCONSPERPIAJPR
            FROM AJUSTEPRFORNFIL
            WHERE AJUSTEPRFORNFIL.CDFORNECED = V_CDFORNECED
              AND AJUSTEPRFORNFIL.CDFILIAL   = C_CUSTO.CDFILIAL
              AND AJUSTEPRFORNFIL.DTINIAJPRFORFIL = (SELECT MAX(A.DTINIAJPRFORFIL)
                                                     FROM AJUSTEPRFORNFIL A
                                                     WHERE A.CDFORNECED = V_CDFORNECED
                                                       AND A.CDFILIAL   = C_CUSTO.CDFILIAL
                                                       AND TRUNC(SYSDATE) BETWEEN A.DTINIAJPRFORFIL AND NVL(A.DTFINAJPRFORFIL, TRUNC(SYSDATE)));
            V_PIDSV := NULL;
            IF V_IDCONSPERPIAJPR = 'S' THEN
               SELECT
                  MAX(VRPERPIPRFO)
               INTO V_PIDSV
               FROM PRODFORNCOMP
               WHERE PRODFORNCOMP.CDFORNECED  = V_CDFORNECED
                 AND PRODFORNCOMP.CDPRODCOMPL = V_CDPRODUTO;

               IF V_PIDSV IS NULL THEN
                  SELECT MAX(VRPERPIFORN)
                  INTO V_PIDSV
                  FROM FORNECEDOR
                  WHERE FORNECEDOR.CDFORNECED = V_CDFORNECED;
               END IF;
            END IF;

            IF V_PIDSV IS NULL THEN
               V_PIDSV := 0;
            END IF;
            IF V_VRPERAJFORNFIL IS NULL THEN
               V_VRPERAJFORNFIL := 0;
            END IF;

            V_MINPRECO := V_MINPRECO - (V_MINPRECO * V_PIDSV/100) + (V_MINPRECO * V_VRPERAJFORNFIL/100);


            IF V_IDUTCUSLIPR = W_S THEN
               V_VRIMPITM := 0;
               FOR C_IMPOSTO IN
                  (SELECT
                      IMPOSTO.CDIMPOSTO,
                      IMPOSTO.IDTRATIMPO,
                      IMPOSTO.IDIMPORECUP,
                      IMPOSTO.CDCCTBLATIV,
                      IMPOSTO.CDCCTBLPASS,
                      IMPCOLET.VRADIMPCOL,
                      IMPCOLET.VRALIQIMPCOL,
                      IMPCOLET.VRIMPCOLETA,
                      IMPCOLET.CDFISCITMCOL
                   FROM
                      IMPCOLET,
                      IMPOSTO
                   WHERE
                      IMPCOLET.CDFILIAL    = P_CDFILIAL     AND
                      IMPCOLET.NRCOLEPRECO = V_NRCOLEPRECO  AND
                      IMPCOLET.CDFORNECED  = V_CDFORNECED   AND
                      IMPCOLET.CDREGIAO    = V_CDREGIAO     AND
                      IMPCOLET.CDPRODUTO   = V_CDPRODUTO    AND
                      IMPCOLET.CDMARCA     = V_CDMARCA      AND
                      IMPCOLET.CDIMPOSTO   = IMPOSTO.CDIMPOSTO
                   )
               LOOP
                  SELECT
                     MAX(CDIMPOSTO),
                     MAX(IDVRIMPSTRIB)
                  INTO
                     V_CDIMPOSTRIB,
                     V_IDVRIMPSTRIB
                  FROM
                     IMPOSTO
                  WHERE
                     CDIMPOSTRIB = C_IMPOSTO.CDIMPOSTO;

                  IF (C_IMPOSTO.IDIMPORECUP = 'S') THEN
                     IF (C_IMPOSTO.CDFISCITMCOL = '1') THEN
                        IF (C_IMPOSTO.CDCCTBLATIV IS NOT NULL) THEN
                           IF C_IMPOSTO.IDTRATIMPO = 'V' THEN
                              V_VRIMPITM := V_VRIMPITM - C_IMPOSTO.VRIMPCOLETA;
                           END IF;
                        END IF;
                     ELSE
                        IF C_IMPOSTO.IDTRATIMPO = 'A' THEN
                           IF V_CDIMPOSTRIB IS NULL THEN
                              V_VRIMPITM := V_VRIMPITM + C_IMPOSTO.VRIMPCOLETA;
                           END IF;
                        ELSIF C_IMPOSTO.IDTRATIMPO IN ('D','R') THEN
                           V_VRIMPITM := V_VRIMPITM - C_IMPOSTO.VRIMPCOLETA;
                        END IF;
                     END IF;
                  ELSE
                     IF C_IMPOSTO.CDCCTBLPASS IS NOT NULL THEN
                        IF C_IMPOSTO.IDTRATIMPO = 'V' THEN
                           V_VRIMPITM := V_VRIMPITM - C_IMPOSTO.VRIMPCOLETA;
                        END IF;
                     ELSE
                        IF C_IMPOSTO.IDTRATIMPO = 'A' THEN
                           IF V_CDIMPOSTRIB IS NULL THEN
                              V_VRIMPITM := V_VRIMPITM + C_IMPOSTO.VRIMPCOLETA;
                           END IF;
                        ELSIF C_IMPOSTO.IDTRATIMPO IN ('D','R') THEN
                           V_VRIMPITM := V_VRIMPITM - C_IMPOSTO.VRIMPCOLETA;
                        END IF;
                     END IF;
                  END IF;
               END LOOP;
               BEGIN
                  SELECT
                     NVL(VRFATOCONV, 1)
                  INTO
                     V_VRFATOCONV
                  FROM
                     PRODUTO
                  WHERE
                     PRODUTO.CDPRODUTO = V_CDPRODUTO;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_VRFATOCONV := 1;
               END;
               IF V_VRFATOCONV IS NULL THEN
                  V_VRFATOCONV := 1;
               END IF;
            END IF;

            IF (V_IDUTCUSTOM1 = W_N) OR (V_VRINDICEM1(TO_CHAR(C_CUSTO.DTINIVALITM,W_FORMATO_DATA)) = 0) THEN
               V_VRCUSPRLISM1 := 0;
            ELSE
               V_VRCUSPRLISM1 := NVL(V_MINPRECO, 0) / V_VRINDICEM1(TO_CHAR(C_CUSTO.DTINIVALITM, W_FORMATO_DATA));
            END IF;
            IF (V_IDUTCUSTOM2 = W_N) OR (V_VRINDICEM2(TO_CHAR(C_CUSTO.DTINIVALITM,W_FORMATO_DATA)) = 0) THEN
               V_VRCUSPRLISM2 := 0;
            ELSE
               V_VRCUSPRLISM2 := NVL(V_MINPRECO, 0) / V_VRINDICEM2(TO_CHAR(C_CUSTO.DTINIVALITM,W_FORMATO_DATA));
            END IF;

            /* O campo VRHISPRLISTP, no update abaixo, tem a funcao de guardar o custo da lista,
               para o caso dele ser substituido pelo preco de algum acordo existente, no processo
               que e executado mais abaixo. */

            UPDATE CUSTOSUP SET
               VRCUSPRLISTP = V_MINPRECO,
               VRHISPRLISTP = V_MINPRECO,
               CDFILCOTLIST = P_CDFILIAL,
               NRCOLEPRLIST = V_NRCOLEPRECO,
               CDREGIAOLIST = V_CDREGIAO,
               CDFORNECLIST = V_CDFORNECED,
               CDPRODLIST   = V_CDPRODUTO,
               CDMARCALIST  = V_CDMARCA,
               DTFINCUSTSUP = C_CUSTO.DTFINVALITM,
               VRCUSPRLISM1 = V_VRCUSPRLISM1,
               VRCUSPRLISM2 = V_VRCUSPRLISM2,
               CDFILCOTACOR = NULL,
               NRCOLEPRACOR = NULL,
               CDMARCAACOR  = NULL,
               CDREGIAOACOR = NULL,
               CDFORNECACOR = NULL,
               CDPRODACOR   = NULL,
               VRCUSLIPRIMP = DECODE(V_IDUTCUSLIPR, W_N, NULL, ((V_MINPRECO*V_VRFATOCONV) + V_VRIMPITM)/V_VRFATOCONV)
            WHERE
               (CDFILIAL   = C_CUSTO.CDFILIAL)   AND
               (CDPRODUTO  = C_CUSTO.CDPRODESTO) AND
               (DTCUSTOSUP = C_CUSTO.DTINIVALITM);

            IF SQL%NOTFOUND THEN

               IF (V_IDUTCUSTOM1 = W_N) OR (V_VRINDICEM1(TO_CHAR(C_CUSTO.DTINIVALITM,W_FORMATO_DATA)) = 0) THEN
                  V_VRCUSPRLISM1 := 0;
               ELSE
                  V_VRCUSPRLISM1 := NVL(V_MINPRECO, 0) / V_VRINDICEM1(TO_CHAR(C_CUSTO.DTINIVALITM,W_FORMATO_DATA));
               END IF;
               IF (V_IDUTCUSTOM2 = W_N) OR (V_VRINDICEM2(TO_CHAR(C_CUSTO.DTINIVALITM,W_FORMATO_DATA)) = 0) THEN
                  V_VRCUSPRLISM2 := 0;
               ELSE
                  V_VRCUSPRLISM2 := NVL(V_MINPRECO, 0) / V_VRINDICEM2(TO_CHAR(C_CUSTO.DTINIVALITM,W_FORMATO_DATA));
               END IF;

               BEGIN
                  INSERT INTO CUSTOSUP
                    (CDFILIAL,
                     CDPRODUTO,
                     DTCUSTOSUP,
                     VRCUSPRLISTP,
                     CDFILCOTLIST,
                     NRCOLEPRLIST,
                     CDREGIAOLIST,
                     CDFORNECLIST,
                     CDPRODLIST,
                     CDMARCALIST,
                     VRCUSPRLISM1,
                     VRCUSPRLISM2,
                     VRHISPRLISTP,
                     DTFINCUSTSUP,
                     VRCUSLIPRIMP)
                  VALUES
                    (C_CUSTO.CDFILIAL,
                     C_CUSTO.CDPRODESTO,
                     C_CUSTO.DTINIVALITM,
                     V_MINPRECO,
                     P_CDFILIAL,
                     V_NRCOLEPRECO,
                     V_CDREGIAO,
                     V_CDFORNECED,
                     V_CDPRODUTO,
                     V_CDMARCA,
                     V_VRCUSPRLISM1,
                     V_VRCUSPRLISM2,
                     V_MINPRECO,
                     C_CUSTO.DTFINVALITM,
                     DECODE(V_IDUTCUSLIPR, W_N, NULL, ((V_MINPRECO*V_VRFATOCONV)+ V_VRIMPITM)/V_VRFATOCONV));
               EXCEPTION
                  WHEN OTHERS THEN NULL;
               END;
            END IF;
         END LOOP;

         DELETE FROM CUSTOSUP_TMP
         WHERE CUSTOSUP_TMP.CDFILCENTCMP = P_CDFILIAL AND
               CUSTOSUP_TMP.NRSEQPRELIST = P_NRSEQPRELIST;

         FOR C_ACORDO IN
            (SELECT
               FILIAL.CDFILIAL,
               ITEMCOLE.CDFILIAL CDFILCENTCMP,
               P_NRSEQPRELIST,
               ITEMCOLE.DTINIVALITM,
               ITEMCOLE.DTFINVALITM,
               PRODUTO.CDPRODESTO,
               MIN(TO_CHAR(DECODE(V_IDTIPOAPUR, NULL, (ITEMCOLE.VRPRECUNIITM/PRODUTO.VRFATOCONV),
                                                    W_1, (ITEMCOLE.VRPRECECOITM/PRODUTO.VRFATOCONV),
                                                         (ITEMCOLE.VRPRECOITMPI/PRODUTO.VRFATOCONV)) * V_MULTIPLO, V_MASCARA) ||W_SEPARADOR1||
                      TO_CHAR((ITEMCOLE.VRPRECUNIITM/PRODUTO.VRFATOCONV) * V_MULTIPLO, V_MASCARA)  ||W_SEPARADOR2||
                      ITEMCOLE.NRCOLEPRECO ||
                      ITEMCOLE.CDREGIAO    ||
                      ITEMCOLE.CDPRODUTO   ||
                      ITEMCOLE.CDMARCA     ||
                      ITEMCOLE.CDFORNECED) MINPRECO
             FROM
               FORNECEDOR,
               PRODUTO,
               FILIAL,
               COLETAPR,
               ITEMCOLE,
               PARTFILI
             WHERE
               ((ITEMCOLE.CDPRODUTO IN (SELECT PRODPREFMED.CDPRODPREF
                                        FROM PRODPREFMED
                                        WHERE PRODPREFMED.CDFILIAL  = FILIAL.CDFILIAL AND
                                              PRODPREFMED.CDPRODUTO = PRODUTO.CDPRODESTO)) OR
                 (NOT EXISTS (SELECT 1
                              FROM PRODPREFMED P
                              WHERE
                                 P.CDFILIAL  = FILIAL.CDFILIAL    AND
                                 P.CDPRODUTO = PRODUTO.CDPRODESTO AND
                                 P.CDPRODPREF IS NOT NULL))
                ) AND
               (FILIAL.CDFILIAL       = C_FILIAL.CDFILIAL)      AND
               (ITEMCOLE.CDREGIAO     = V_CURSOR_CDREGIAO)      AND
               (PRODUTO.CDPRODESTO    = V_CURSOR_CDPRODESTO)    AND
               (PARTFILI.CDFILIAL     = FILIAL.CDFILIAL)        AND
               (PARTFILI.CDTIPPART    = W_4)                    AND
               (ITEMCOLE.VRPRECUNIITM > 0)                      AND               
               (PARTFILI.CDFILCOTA    = P_CDFILIAL)             AND
               (ITEMCOLE.CDFILIAL     = P_CDFILIAL)             AND
               (ITEMCOLE.NRCOLEPRECO  = PARTFILI.NRCOLEPRECO)   AND
               (ITEMCOLE.CDPRODUTO    = PRODUTO.CDPRODUTO)      AND
               (ITEMCOLE.CDPRODUTO    = PARTFILI.CDPRODUTO)     AND
               (ITEMCOLE.CDFORNECED   = PARTFILI.CDFORNECED)    AND
               (ITEMCOLE.CDFORNECED   = FORNECEDOR.CDFORNECED)  AND
               (ITEMCOLE.CDREGIAO     = FILIAL.CDREGIAO)        AND
               (ITEMCOLE.DTFINVALITM  >= TRUNC(SYSDATE))        AND
               (COLETAPR.CDFILIAL     = ITEMCOLE.CDFILIAL)      AND
               (COLETAPR.NRCOLEPRECO  = ITEMCOLE.NRCOLEPRECO)   AND
               (COLETAPR.CDOPERADOR   = V_CDOPERADOR)
               AND (FORNECEDOR.IDSITUCADA     = W_A)
               AND (NVL(FORNECEDOR.IDTIPOFORN, W_N) <> W_A)
               AND NOT EXISTS (SELECT
                                  W_1
                               FROM
                                  REFOREG
                               WHERE
                                  (REFOREG.CDREGIAO   = ITEMCOLE.CDREGIAO) AND
                                  (REFOREG.CDFORNECED = ITEMCOLE.CDFORNECED))
               AND NOT EXISTS (SELECT
                                  W_1
                               FROM
                                  REFORFIL
                               WHERE
                                  (CDFILIAL   = FILIAL.CDFILIAL)   AND
                                  (CDFORNECED = ITEMCOLE.CDFORNECED) AND
                                  (CDPERIENTR IS NULL))
               AND NOT EXISTS (SELECT
                                  W_1
                               FROM
                                  QFOPRODFORN,
                                  PARASUPRI
                               WHERE
                                  (PARASUPRI.CDFILIAL     = P_CDFILIAL)       AND
                                  (QFOPRODFORN.CDPRODUTO  = ITEMCOLE.CDPRODUTO)  AND
                                  (QFOPRODFORN.CDFORNECED = ITEMCOLE.CDFORNECED) AND
                                  ((QFOPRODFORN.IDFORNAPROV = W_N AND QFOPRODFORN.IDFORNAUTOR = W_N) OR ((QFOPRODFORN.IDFORNAPROV = W_S) AND ((PARASUPRI.IDULTIDTVALQ = W_M AND COLETAPR.DTCOLEPREC > LAST_DAY(QFOPRODFORN.DTVALPRFORN)) OR (PARASUPRI.IDULTIDTVALQ = W_D AND COLETAPR.DTCOLEPREC > QFOPRODFORN.DTVALPRFORN)))))

               AND NOT EXISTS (SELECT
                                  W_1
                               FROM
                                  QFOMARPROD,
                                  PARASUPRI
                               WHERE
                                  (PARASUPRI.CDFILIAL   = P_CDFILIAL)      AND
                                  (QFOMARPROD.CDPRODUTO = ITEMCOLE.CDPRODUTO) AND
                                  (QFOMARPROD.CDMARCA   = ITEMCOLE.CDMARCA)   AND
                                  ((QFOMARPROD.IDAPRMARPRO = W_N AND QFOMARPROD.IDAUTMARPRO = W_N) OR ((QFOMARPROD.IDAPRMARPRO = W_S) AND ((PARASUPRI.IDULTIDTVALQ = W_M AND COLETAPR.DTCOLEPREC > LAST_DAY(QFOMARPROD.DTVALAPROVA)) OR (PARASUPRI.IDULTIDTVALQ = W_D AND COLETAPR.DTCOLEPREC > QFOMARPROD.DTVALAPROVA)))))

               AND EXISTS (SELECT
                              W_1
                           FROM
                              QFOMARPROD
                           WHERE
                              (QFOMARPROD.CDPRODUTO = ITEMCOLE.CDPRODUTO) AND
                              (QFOMARPROD.CDMARCA   = ITEMCOLE.CDMARCA)

                           UNION ALL

                           SELECT
                              W_1
                           FROM
                              PARASUPRI
                           WHERE
                              (PARASUPRI.CDFILIAL    = P_CDFILIAL) AND
                              (PARASUPRI.IDMARSEMQUA = W_N OR PARASUPRI.IDMARSEMQUA IS NULL))

               AND NOT EXISTS (SELECT
                                  W_1
                               FROM
                                  QUALIFICACAO,
                                  PARASUPRI
                               WHERE
                                  (QUALIFICACAO.CDQUALIF     = FORNECEDOR.CDQUALIF) AND
                                  (PARASUPRI.CDFILIAL        = P_CDFILIAL)          AND
                                  (FORNECEDOR.IDFORNAUTO     = W_N)                 AND
                                  ((QUALIFICACAO.IDPERCOTCMP = W_2) OR ((PARASUPRI.IDULTIDTVALQ  = W_D AND COLETAPR.DTCOLEPREC > FORNECEDOR.DTVALQUALIF) OR (PARASUPRI.IDULTIDTVALQ = W_M AND COLETAPR.DTCOLEPREC > LAST_DAY(FORNECEDOR.DTVALQUALIF)))))

               AND (

                     (EXISTS (SELECT
                                 W_1
                              FROM
                                 PARTFILI
                              WHERE
                                 (CDFILIAL  = FILIAL.CDFILIAL)    AND
                                 (CDPRODUTO = ITEMCOLE.CDPRODUTO) AND
                                 (CDTIPPART IN (W_1, W_2))        AND
                                 (CDMARCA   = ITEMCOLE.CDMARCA)   AND
                                 (NOT EXISTS (SELECT
                                                 W_1
                                              FROM
                                                 PARTFILI
                                              WHERE
                                                 (CDFILIAL   = FILIAL.CDFILIAL )       AND
                                                 (CDPRODUTO  = ITEMCOLE.CDPRODUTO)     AND
                                                 (CDTIPPART  IN (W_4, W_5))            AND
                                                 (CDFORNECED <> ITEMCOLE.CDFORNECED))

                                  )
                               )



                      )

                     OR (EXISTS (SELECT
                                    W_1
                                 FROM
                                    PARTFILI
                                 WHERE
                                    (CDFILIAL   = FILIAL.CDFILIAL )    AND
                                    (CDPRODUTO  = ITEMCOLE.CDPRODUTO)  AND
                                    (CDTIPPART  IN (W_4, W_5))         AND
                                    (CDFORNECED = ITEMCOLE.CDFORNECED) AND
                                    (NOT EXISTS (SELECT
                                                    W_1
                                                 FROM
                                                    PARTFILI
                                                 WHERE
                                                   (CDFILIAL  = FILIAL.CDFILIAL)    AND
                                                   (CDPRODUTO = ITEMCOLE.CDPRODUTO) AND
                                                   (CDTIPPART IN (W_1, W_2))        AND
                                                   (CDMARCA   <> ITEMCOLE.CDMARCA))
                                      )
                                   )

                         )

                     OR (EXISTS (SELECT
                                    W_1
                                 FROM
                                    PARTFILI
                                 WHERE
                                    (CDFILIAL   = FILIAL.CDFILIAL)  AND
                                    (CDPRODUTO  = ITEMCOLE.CDPRODUTO) AND
                                    (CDTIPPART  IN (W_7, W_8))            AND
                                    (CDMARCA    = ITEMCOLE.CDMARCA)   AND
                                    (CDFORNECED = ITEMCOLE.CDFORNECED)))

                     OR (EXISTS (SELECT
                                    W_1
                                 FROM
                                    PARTFILI
                                 WHERE
                                    (CDFILIAL  = FILIAL.CDFILIAL)  AND
                                    (CDPRODUTO = ITEMCOLE.CDPRODUTO) AND
                                    (CDTIPPART  IN (W_3,W_6,W_9)))   AND
                         NOT EXISTS (SELECT
                                        W_1
                                     FROM
                                        PARTFILI
                                     WHERE
                                        (CDFILIAL  = FILIAL.CDFILIAL)    AND
                                        (CDPRODUTO = ITEMCOLE.CDPRODUTO) AND
                                        (CDTIPPART  IN (W_1,W_2,W_4,W_5,W_7,W_8)))
                         )

                     OR (NOT EXISTS (SELECT
                                        W_1
                                     FROM
                                        PARTFILI
                                     WHERE
                                        (CDFILIAL  = FILIAL.CDFILIAL) AND
                                        (CDPRODUTO = ITEMCOLE.CDPRODUTO)))
                    )
                AND (NOT EXISTS (SELECT
                                    W_1
                                 FROM
                                    PARTFILI
                                 WHERE
                                    (CDFILIAL  = FILIAL.CDFILIAL)  AND
                                    (CDPRODUTO = ITEMCOLE.CDPRODUTO) AND
                                    (CDTIPPART = W_3)                    AND
                                    (CDMARCA   = ITEMCOLE.CDMARCA)))
                AND (NOT EXISTS (SELECT
                                    W_1
                                 FROM
                                    PARTFILI
                                 WHERE
                                    (CDFILIAL   = FILIAL.CDFILIAL)  AND
                                    (CDPRODUTO  = ITEMCOLE.CDPRODUTO) AND
                                    (CDTIPPART  = W_6)                    AND
                                    (CDFORNECED = ITEMCOLE.CDFORNECED)))
                AND (NOT EXISTS (SELECT
                                    W_1
                                 FROM
                                    PARTFILI
                                 WHERE
                                    (CDFILIAL   = FILIAL.CDFILIAL)  AND
                                    (CDPRODUTO  = ITEMCOLE.CDPRODUTO) AND
                                    (CDTIPPART  = W_9)                    AND
                                    (CDMARCA    = ITEMCOLE.CDMARCA)   AND
                                    (CDFORNECED = ITEMCOLE.CDFORNECED)))
               GROUP BY
                  FILIAL.CDFILIAL,
                  ITEMCOLE.CDFILIAL,
                  P_NRSEQPRELIST,
                  ITEMCOLE.DTINIVALITM,
                  ITEMCOLE.DTFINVALITM,
                  PRODUTO.CDPRODESTO
             )
         LOOP
            IF (V_IDUTCUSTOM1 = W_S) OR (V_IDUTCUSTOM2 = W_S) THEN
               IF (V_IDUTCUSTOM1 = W_S) THEN
                  BEGIN
                     IF V_VRINDICEM1(TO_CHAR(C_ACORDO.DTINIVALITM, W_FORMATO_DATA)) IS NULL THEN
                        SELECT
                           NVL(MAX(MOVINDICE.VRINDICE), 0)
                        INTO
                           V_VRINDICEM1(TO_CHAR(C_ACORDO.DTINIVALITM, W_FORMATO_DATA))
                        FROM
                           PARAMGERAL,
                           MOVINDICE
                        WHERE
                           (PARAMGERAL.CDINDICEMF = MOVINDICE.CDINDICE)  AND
                           (MOVINDICE.DTREFIND    = C_ACORDO.DTINIVALITM) AND
                           (MOVINDICE.CDTPINDICE  = W_1)                 AND
                           (MOVINDICE.IDPERVALOR  = W_2);
                     END IF;
                  EXCEPTION
                     WHEN OTHERS THEN BEGIN
                        SELECT
                           NVL(MAX(MOVINDICE.VRINDICE), 0)
                        INTO
                           V_VRINDICEM1(TO_CHAR(C_ACORDO.DTINIVALITM, W_FORMATO_DATA))
                        FROM
                           PARAMGERAL,
                           MOVINDICE
                        WHERE
                           (PARAMGERAL.CDINDICEMF = MOVINDICE.CDINDICE)  AND
                           (MOVINDICE.DTREFIND    = C_ACORDO.DTINIVALITM) AND
                           (MOVINDICE.CDTPINDICE  = W_1)                 AND
                           (MOVINDICE.IDPERVALOR  = W_2);
                     END;
                  END;
               END IF;

               IF (V_IDUTCUSTOM2 = W_S) THEN
                  BEGIN
                     IF V_VRINDICEM2(TO_CHAR(C_ACORDO.DTINIVALITM, W_FORMATO_DATA)) IS NULL THEN
                        SELECT
                           NVL(MAX(MOVINDICE.VRINDICE), 0)
                        INTO
                           V_VRINDICEM2(TO_CHAR(C_ACORDO.DTINIVALITM, W_FORMATO_DATA))
                        FROM
                           PARAMGERAL,
                           MOVINDICE
                        WHERE
                           (PARAMGERAL.CDINDICEMF2 = MOVINDICE.CDINDICE)  AND
                           (MOVINDICE.DTREFIND     = C_ACORDO.DTINIVALITM) AND
                           (MOVINDICE.CDTPINDICE   = W_1)                 AND
                           (MOVINDICE.IDPERVALOR   = W_2);
                     END IF;
                  EXCEPTION
                     WHEN OTHERS THEN BEGIN
                        SELECT
                           NVL(MAX(MOVINDICE.VRINDICE), 0)
                        INTO
                           V_VRINDICEM2(TO_CHAR(C_ACORDO.DTINIVALITM, W_FORMATO_DATA))
                        FROM
                           PARAMGERAL,
                           MOVINDICE
                        WHERE
                           (PARAMGERAL.CDINDICEMF2 = MOVINDICE.CDINDICE)  AND
                           (MOVINDICE.DTREFIND     = C_ACORDO.DTINIVALITM) AND
                           (MOVINDICE.CDTPINDICE   = W_1)                 AND
                           (MOVINDICE.IDPERVALOR   = W_2);
                     END;
                  END;
               END IF;
            END IF;
            V_POSMINPREPI := INSTR(C_ACORDO.MINPRECO, W_SEPARADOR1);
            V_POSMINPRECO := INSTR(C_ACORDO.MINPRECO, W_SEPARADOR2);

            V_MINPRECO    := (SUBSTR(C_ACORDO.MINPRECO, V_POSMINPREPI + 1, V_POSMINPRECO - V_POSMINPREPI - 1))/V_MULTIPLO;
            V_NRCOLEPRECO := SUBSTR(C_ACORDO.MINPRECO, V_POSMINPRECO+1, 10);
            V_CDREGIAO    := SUBSTR(C_ACORDO.MINPRECO, V_POSMINPRECO+11, 3);
            V_CDPRODUTO   := SUBSTR(C_ACORDO.MINPRECO, V_POSMINPRECO+14, 10);
            V_CDMARCA     := SUBSTR(C_ACORDO.MINPRECO, V_POSMINPRECO+24, 5);
            V_CDFORNECED  := SUBSTR(C_ACORDO.MINPRECO, V_POSMINPRECO+29, 21);

            V_VRPERAJFORNFIL := NULL;
            V_IDCONSPERPIAJPR := 'N';
            SELECT
               MAX(VRPERAJFORNFIL),
               MAX(IDCONSPERPIAJPR)
            INTO V_VRPERAJFORNFIL, V_IDCONSPERPIAJPR
            FROM AJUSTEPRFORNFIL
            WHERE AJUSTEPRFORNFIL.CDFORNECED = V_CDFORNECED
              AND AJUSTEPRFORNFIL.CDFILIAL = C_ACORDO.CDFILIAL
              AND AJUSTEPRFORNFIL.DTINIAJPRFORFIL = (SELECT MAX(A.DTINIAJPRFORFIL)
                                                     FROM AJUSTEPRFORNFIL A
                                                     WHERE A.CDFORNECED = V_CDFORNECED
                                                       AND A.CDFILIAL = C_ACORDO.CDFILIAL
                                                       AND TRUNC(SYSDATE) BETWEEN A.DTINIAJPRFORFIL AND NVL(A.DTFINAJPRFORFIL, TRUNC(SYSDATE)));
            V_PIDSV := NULL;
            IF V_IDCONSPERPIAJPR = 'S' THEN
               SELECT
                  MAX(VRPERPIPRFO)
               INTO V_PIDSV
               FROM PRODFORNCOMP
               WHERE PRODFORNCOMP.CDFORNECED  = V_CDFORNECED
                 AND PRODFORNCOMP.CDPRODCOMPL = V_CDPRODUTO;

               IF V_PIDSV IS NULL THEN
                  SELECT MAX(VRPERPIFORN)
                  INTO V_PIDSV
                  FROM FORNECEDOR
                  WHERE FORNECEDOR.CDFORNECED = V_CDFORNECED;
               END IF;
            END IF;

            IF V_PIDSV IS NULL THEN
               V_PIDSV := 0;
            END IF;
            IF V_VRPERAJFORNFIL IS NULL THEN
               V_VRPERAJFORNFIL := 0;
            END IF;

            V_MINPRECO := V_MINPRECO - (V_MINPRECO * V_PIDSV/100) + (V_MINPRECO * V_VRPERAJFORNFIL/100);

            IF V_IDUTCUSLIPR = W_S THEN
               V_VRIMPITM := 0;
               FOR C_IMPOSTO IN
                  (SELECT
                      IMPOSTO.CDIMPOSTO,
                      IMPOSTO.IDTRATIMPO,
                      IMPOSTO.IDIMPORECUP,
                      IMPOSTO.CDCCTBLATIV,
                      IMPOSTO.CDCCTBLPASS,
                      IMPCOLET.VRADIMPCOL,
                      IMPCOLET.VRALIQIMPCOL,
                      IMPCOLET.VRIMPCOLETA,
                      IMPCOLET.CDFISCITMCOL
                   FROM
                      IMPCOLET,
                      IMPOSTO
                   WHERE
                      IMPCOLET.CDFILIAL    = P_CDFILIAL    AND
                      IMPCOLET.NRCOLEPRECO = V_NRCOLEPRECO AND
                      IMPCOLET.CDFORNECED  = V_CDFORNECED  AND
                      IMPCOLET.CDREGIAO    = V_CDREGIAO    AND
                      IMPCOLET.CDPRODUTO   = V_CDPRODUTO   AND
                      IMPCOLET.CDMARCA     = V_CDMARCA     AND
                      IMPCOLET.CDIMPOSTO   = IMPOSTO.CDIMPOSTO
                   )
               LOOP
                  SELECT
                     MAX(CDIMPOSTO),
                     MAX(IDVRIMPSTRIB)
                  INTO
                     V_CDIMPOSTRIB,
                     V_IDVRIMPSTRIB
                  FROM
                     IMPOSTO
                  WHERE
                     CDIMPOSTRIB = C_IMPOSTO.CDIMPOSTO;
                  IF (C_IMPOSTO.IDIMPORECUP = 'S') THEN
                     IF (C_IMPOSTO.CDFISCITMCOL = '1') THEN
                        IF (C_IMPOSTO.CDCCTBLATIV IS NOT NULL) THEN
                           IF C_IMPOSTO.IDTRATIMPO = 'V' THEN
                              V_VRIMPITM := V_VRIMPITM - C_IMPOSTO.VRIMPCOLETA;
                           END IF;
                        END IF;
                     ELSE
                        IF C_IMPOSTO.IDTRATIMPO = 'A' THEN
                           IF V_CDIMPOSTRIB IS NULL THEN
                              V_VRIMPITM := V_VRIMPITM + C_IMPOSTO.VRIMPCOLETA;
                           END IF;
                        ELSIF C_IMPOSTO.IDTRATIMPO IN ('D','R') THEN
                           V_VRIMPITM := V_VRIMPITM - C_IMPOSTO.VRIMPCOLETA;
                        END IF;
                     END IF;
                  ELSE
                     IF C_IMPOSTO.CDCCTBLPASS IS NOT NULL THEN
                        IF C_IMPOSTO.IDTRATIMPO = 'V' THEN
                           V_VRIMPITM := V_VRIMPITM - C_IMPOSTO.VRIMPCOLETA;
                        END IF;
                     ELSE
                        IF C_IMPOSTO.IDTRATIMPO = 'A' THEN
                           IF V_CDIMPOSTRIB IS NULL THEN
                              V_VRIMPITM := V_VRIMPITM + C_IMPOSTO.VRIMPCOLETA;
                           END IF;
                        ELSIF C_IMPOSTO.IDTRATIMPO IN ('D','R') THEN
                           V_VRIMPITM := V_VRIMPITM - C_IMPOSTO.VRIMPCOLETA;
                        END IF;
                     END IF;
                  END IF;
               END LOOP;
               BEGIN
                  SELECT
                     NVL(VRFATOCONV, 1)
                  INTO
                     V_VRFATOCONV
                  FROM
                     PRODUTO
                  WHERE
                     PRODUTO.CDPRODUTO = V_CDPRODUTO;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_VRFATOCONV := 1;
               END;
               IF V_VRFATOCONV IS NULL THEN
                  V_VRFATOCONV := 1;
               END IF;
            END IF;
            BEGIN
               IF (V_IDUTCUSTOM1 = W_N) OR (V_VRINDICEM1(TO_CHAR(C_ACORDO.DTINIVALITM,W_FORMATO_DATA)) = 0) THEN
                  V_VRCUSPRLISM1 := 0;
               ELSE
                  V_VRCUSPRLISM1 := NVL(V_MINPRECO, 0) / V_VRINDICEM1(TO_CHAR(C_ACORDO.DTINIVALITM,W_FORMATO_DATA));
               END IF;
               IF (V_IDUTCUSTOM2 = W_N) OR (V_VRINDICEM2(TO_CHAR(C_ACORDO.DTINIVALITM,W_FORMATO_DATA)) = 0) THEN
                  V_VRCUSPRLISM2 := 0;
               ELSE
                  V_VRCUSPRLISM2 := NVL(V_MINPRECO, 0) / V_VRINDICEM2(TO_CHAR(C_ACORDO.DTINIVALITM,W_FORMATO_DATA));
               END IF;

               /* Insere um novo registro de custo de lista de precos - custo de acordo */

               INSERT INTO CUSTOSUP
                 (CDFILIAL,
                  CDPRODUTO,
                  DTCUSTOSUP,
                  VRCUSPRLISTP,
                  CDFILCOTACOR,
                  NRCOLEPRACOR,
                  CDREGIAOACOR,
                  CDFORNECACOR,
                  CDPRODACOR,
                  CDMARCAACOR,
                  VRCUSPRLISM1,
                  VRCUSPRLISM2,
                  DTFINCUSTSUP,
                  VRCUSLIPRIMP)
               VALUES
                 (C_ACORDO.CDFILIAL,
                  C_ACORDO.CDPRODESTO,
                  C_ACORDO.DTINIVALITM,
                  V_MINPRECO,
                  P_CDFILIAL,
                  V_NRCOLEPRECO,
                  V_CDREGIAO,
                  V_CDFORNECED,
                  V_CDPRODUTO,
                  V_CDMARCA,
                  V_VRCUSPRLISM1,
                  V_VRCUSPRLISM2,
                  C_ACORDO.DTFINVALITM,
                  DECODE(V_IDUTCUSLIPR, W_N, NULL, ((V_MINPRECO*V_VRFATOCONV) + V_VRIMPITM)/V_VRFATOCONV));
            EXCEPTION
               WHEN DUP_VAL_ON_INDEX THEN BEGIN
                  V_DTFINVALITM_MAIS_DIA := C_ACORDO.DTFINVALITM + 1;
                  /* Caso ja exista um custo de lista de precos com data de
                     inicio igual ao custo de acordo e com a data final maior,
                     ou seja, se o custo de acordo estiver dentro do periodo de
                     uma lista, entao o custo de lista passara a ter a data
                     de inicio um dia depois da data final do custo de acordo */
                  BEGIN
                     INSERT INTO CUSTOSUP
                       (CDFILIAL,
                        CDPRODUTO,
                        DTCUSTOSUP,
                        VRCUSPRLISTP,
                        CDFILCOTLIST,
                        NRCOLEPRLIST,
                        CDREGIAOLIST,
                        CDFORNECLIST,
                        CDPRODLIST,
                        CDMARCALIST,
                        VRCUSPRLISM1,
                        VRCUSPRLISM2,
                        VRHISPRLISTP,
                        DTFINCUSTSUP,
                        VRCUSLIPRIMP)
                     SELECT
                        CUSTOSUP.CDFILIAL,
                        CUSTOSUP.CDPRODUTO,
                        V_DTFINVALITM_MAIS_DIA,
                        CUSTOSUP.VRCUSPRLISTP,
                        CUSTOSUP.CDFILCOTLIST,
                        CUSTOSUP.NRCOLEPRLIST,
                        CUSTOSUP.CDREGIAOLIST,
                        CUSTOSUP.CDFORNECLIST,
                        CUSTOSUP.CDPRODLIST,
                        CUSTOSUP.CDMARCALIST,
                        CUSTOSUP.VRCUSPRLISM1,
                        CUSTOSUP.VRCUSPRLISM2,
                        CUSTOSUP.VRHISPRLISTP,
                        PREVLISTA.DTFINVALLIST,
                        CUSTOSUP.VRCUSLIPRIMP
                     FROM
                        CUSTOSUP,
                        PREVLISTA
                     WHERE
                        (CUSTOSUP.CDFILIAL      = C_ACORDO.CDFILIAL)    AND
                        (CUSTOSUP.CDPRODUTO     = C_ACORDO.CDPRODESTO)  AND
                        (CUSTOSUP.DTCUSTOSUP    = C_ACORDO.DTINIVALITM) AND
                        (PREVLISTA.CDFILIAL     = P_CDFILIAL)           AND
                        (PREVLISTA.NRSEQPRELIST = P_NRSEQPRELIST)       AND
                        (PREVLISTA.DTINIVALLIST = C_ACORDO.DTINIVALITM) AND
                        (PREVLISTA.DTFINVALLIST > C_ACORDO.DTFINVALITM);
                  EXCEPTION
                     WHEN DUP_VAL_ON_INDEX THEN BEGIN
                        /* Deletando custo imediatamente posterior ao do acordo */
                        DELETE FROM CUSTOSUP
                        WHERE
                           (CDFILIAL   = C_ACORDO.CDFILIAL)   AND
                           (CDPRODUTO  = C_ACORDO.CDPRODESTO) AND
                           (DTCUSTOSUP = V_DTFINVALITM_MAIS_DIA);
                        INSERT INTO CUSTOSUP
                          (CDFILIAL,
                           CDPRODUTO,
                           DTCUSTOSUP,
                           VRCUSPRLISTP,
                           CDFILCOTLIST,
                           NRCOLEPRLIST,
                           CDREGIAOLIST,
                           CDFORNECLIST,
                           CDPRODLIST,
                           CDMARCALIST,
                           VRCUSPRLISM1,
                           VRCUSPRLISM2,
                           VRHISPRLISTP,
                           DTFINCUSTSUP,
                           VRCUSLIPRIMP)
                        SELECT
                           CUSTOSUP.CDFILIAL,
                           CUSTOSUP.CDPRODUTO,
                           V_DTFINVALITM_MAIS_DIA,
                           CUSTOSUP.VRCUSPRLISTP,
                           CUSTOSUP.CDFILCOTLIST,
                           CUSTOSUP.NRCOLEPRLIST,
                           CUSTOSUP.CDREGIAOLIST,
                           CUSTOSUP.CDFORNECLIST,
                           CUSTOSUP.CDPRODLIST,
                           CUSTOSUP.CDMARCALIST,
                           CUSTOSUP.VRCUSPRLISM1,
                           CUSTOSUP.VRCUSPRLISM2,
                           CUSTOSUP.VRHISPRLISTP,
                           PREVLISTA.DTFINVALLIST,
                           CUSTOSUP.VRCUSLIPRIMP
                        FROM
                           CUSTOSUP,
                           PREVLISTA
                        WHERE
                           (CUSTOSUP.CDFILIAL      = C_ACORDO.CDFILIAL)    AND
                           (CUSTOSUP.CDPRODUTO     = C_ACORDO.CDPRODESTO)  AND
                           (CUSTOSUP.DTCUSTOSUP    = C_ACORDO.DTINIVALITM) AND
                           (PREVLISTA.CDFILIAL     = P_CDFILIAL)           AND
                           (PREVLISTA.NRSEQPRELIST = P_NRSEQPRELIST)       AND
                           (PREVLISTA.DTINIVALLIST = C_ACORDO.DTINIVALITM) AND
                           (PREVLISTA.DTFINVALLIST > C_ACORDO.DTFINVALITM);
                     END;
                  END;

                  IF (V_IDUTCUSTOM1 = W_N) OR (V_VRINDICEM1(TO_CHAR(C_ACORDO.DTINIVALITM,W_FORMATO_DATA)) = 0) THEN
                     V_VRCUSPRLISM1 := 0;
                  ELSE
                     V_VRCUSPRLISM1 := NVL(V_MINPRECO, 0) / V_VRINDICEM1(TO_CHAR(C_ACORDO.DTINIVALITM,W_FORMATO_DATA));
                  END IF;
                  IF (V_IDUTCUSTOM2 = W_N) OR (V_VRINDICEM2(TO_CHAR(C_ACORDO.DTINIVALITM,W_FORMATO_DATA)) = 0) THEN
                     V_VRCUSPRLISM2 := 0;
                  ELSE
                     V_VRCUSPRLISM2 := NVL(V_MINPRECO, 0) / V_VRINDICEM2(TO_CHAR(C_ACORDO.DTINIVALITM,W_FORMATO_DATA));
                  END IF;

                  /* Atualizando custo de acordo */
                  UPDATE CUSTOSUP SET
                     VRCUSPRLISTP = V_MINPRECO,
                     CDFILCOTACOR = P_CDFILIAL,
                     NRCOLEPRACOR = V_NRCOLEPRECO,
                     CDREGIAOACOR = V_CDREGIAO,
                     CDFORNECACOR = V_CDFORNECED,
                     CDPRODACOR   = V_CDPRODUTO,
                     CDMARCAACOR  = V_CDMARCA,
                     DTFINCUSTSUP = C_ACORDO.DTFINVALITM,
                     VRCUSPRLISM1 = V_VRCUSPRLISM1,
                     VRCUSPRLISM2 = V_VRCUSPRLISM2,
                     VRCUSLIPRIMP = DECODE(V_IDUTCUSLIPR, W_N, NULL, ((V_MINPRECO*V_VRFATOCONV) + V_VRIMPITM)/V_VRFATOCONV)
                  WHERE
                     (CDFILIAL   = C_ACORDO.CDFILIAL)   AND
                     (CDPRODUTO  = C_ACORDO.CDPRODESTO) AND
                     (DTCUSTOSUP = C_ACORDO.DTINIVALITM);
               END;
            END;

            /* Update e Insert a seguir:
               Faz o tratamento dos custos de lista de precos que estao dentro
               do periodo de validade da cotacao de acordo: esses custos sao
               excluidos pois o custo valido deve ser o custo do acordo.
            */
            UPDATE CUSTOSUP
            SET
               VRHISPRLISTP = NULL,
               VRCUSPRLISTP = NULL,
               VRCUSPRLISM1 = NULL,
               VRCUSPRLISM2 = NULL,
               CDFILCOTLIST = NULL,
               NRCOLEPRLIST = NULL,
               CDMARCALIST  = NULL,
               CDREGIAOLIST = NULL,
               CDFORNECLIST = NULL,
               CDPRODLIST   = NULL
            WHERE
               (CDFILIAL   = C_ACORDO.CDFILIAL)    AND
               (CDPRODUTO  = C_ACORDO.CDPRODESTO)  AND
               (DTCUSTOSUP > C_ACORDO.DTINIVALITM) AND
               (DTCUSTOSUP < C_ACORDO.DTFINVALITM) AND
               (VRPRCUSTOAF IS NOT NULL);

            DELETE CUSTOSUP
            WHERE
               (CDFILIAL   = C_ACORDO.CDFILIAL)    AND
               (CDPRODUTO  = C_ACORDO.CDPRODESTO)  AND
               (DTCUSTOSUP > C_ACORDO.DTINIVALITM) AND
               (DTCUSTOSUP < C_ACORDO.DTFINVALITM) AND
               (VRPRCUSTOAF IS NULL);
         END LOOP;
         COMMIT;
      END LOOP;

      UPDATE ITEMCOLE
         SET ITEMCOLE.IDITECOLEALT = W_N
      WHERE
         ITEMCOLE.CDFILIAL     = P_CDFILIAL         AND
         (ITEMCOLE.NRSEQPRELIST = DECODE(ITEMCOLE.IDITVALDIFLISTA, 'S', ITEMCOLE.NRSEQPRELIST, P_NRSEQPRELIST)) AND
         (ITEMCOLE.DTINIVALITM <= V_DTFINVALLIST)    AND
         (ITEMCOLE.DTFINVALITM >= V_DTINIVALLIST)    AND
         ITEMCOLE.CDREGIAO     = V_CURSOR_CDREGIAO  AND
         NVL(ITEMCOLE.IDITECOLEALT, W_S) = W_S      AND
         EXISTS (SELECT
                    W_1
                 FROM
                    PRODUTO
                 WHERE
                    PRODUTO.CDPRODESTO = V_CURSOR_CDPRODESTO AND
                    PRODUTO.CDPRODUTO  = ITEMCOLE.CDPRODUTO);

      DELETE FROM
         ITEXCLISPREC
      WHERE
         ITEXCLISPREC.CDFILIAL     = P_CDFILIAL          AND
         ITEXCLISPREC.NRSEQPRELIST = P_NRSEQPRELIST      AND
         ITEXCLISPREC.CDPRODUTO    = V_CURSOR_CDPRODESTO AND
         ITEXCLISPREC.CDREGIAO     = V_CURSOR_CDREGIAO;
      COMMIT;
   END LOOP;
   COMMIT;
END;
/