CREATE OR REPLACE PACKAGE BODY PRICE_LIST AS

   PROCEDURE INSERT_ITMPREVLIST(P_CDFILIAL         IN ITMPREVLIST.CDFILIAL%TYPE,
                                P_NRSEQPRELIST     IN ITMPREVLIST.NRSEQPRELIST%TYPE,
                                P_CDOPERADOR       IN OPERADOR.CDOPERADOR%TYPE,
                                P_LISTCDREGIAO     IN VARCHAR2,
                                P_DTINI            IN DATE,
                                P_DTFIN            IN DATE,
                                P_IDCOINVALIDLIST  IN CHAR, 
                                P_CDARVPRODINI     IN VARCHAR2,
                                P_CDARVPRODFIN     IN VARCHAR2,
                                P_IDCOTSEMMOVLIST  IN CHAR,
                                P_ROWSAFFECT      OUT INT) IS
      TYPE CURTYPE IS REF CURSOR;
      C_ITEMCOLE CURTYPE;
      
      V_SQL          VARCHAR2(32000);
      V_CDFILIAL     ITEMCOLE.CDFILIAL%TYPE;
      V_NRCOLEPRECO  ITEMCOLE.NRCOLEPRECO%TYPE;
      V_CDFORNECED   ITEMCOLE.CDFORNECED%TYPE;
      V_CDREGIAO     ITEMCOLE.CDREGIAO%TYPE;
      V_CDPRODUTO    ITEMCOLE.CDPRODUTO%TYPE;
      V_CDMARCA      ITEMCOLE.CDMARCA%TYPE;
      V_IDITMSELLIS  ITMPREVLIST.IDITMSELLIS%TYPE;
      V_CDFORMPGTO   ITEMCOLE.CDFORMPGTO%TYPE;
      V_VRPRECUNIITM ITEMCOLE.VRPRECUNIITM%TYPE;
      V_VRPRECECOITM ITEMCOLE.VRPRECECOITM%TYPE;
      V_VRPRECOITMPI ITEMCOLE.VRPRECOITMPI%TYPE;

      V_ROWSAFFECT   INT;
   BEGIN
      V_ROWSAFFECT := 0;
      
      FOR C_REGIAO IN (SELECT CDREGIAO
                         FROM REGIAO 
                        WHERE (INSTR(P_LISTCDREGIAO, CDREGIAO) > 0 OR P_LISTCDREGIAO = 'T'))
      LOOP
         V_SQL := 
            '    SELECT ITEMCOLE.CDFILIAL,  '||
            '           ITEMCOLE.NRCOLEPRECO, '||
            '           ITEMCOLE.CDFORNECED, '||
            '           ITEMCOLE.CDREGIAO, '||
            '           ITEMCOLE.CDPRODUTO, '||
            '           ITEMCOLE.CDMARCA, '||
            '           NVL(ITMPREVLIST.IDITMSELLIS, '''||K_N||'''), '||
            '           ITEMCOLE.CDFORMPGTO, '||
            '           ITEMCOLE.VRPRECUNIITM, '||
            '           ITEMCOLE.VRPRECECOITM, '||
            '           ITEMCOLE.VRPRECOITMPI '||
            '      FROM COLETAPR INNER JOIN ITEMCOLE    ON COLETAPR.CDFILIAL    = ITEMCOLE.CDFILIAL '||
            '                                          AND COLETAPR.NRCOLEPRECO = ITEMCOLE.NRCOLEPRECO '||
            '                    INNER JOIN PRODUTO     ON ITEMCOLE.CDPRODUTO   = PRODUTO.CDPRODUTO '||
            '                     LEFT JOIN ITMPREVLIST ON ITEMCOLE.CDFILIAL    = ITMPREVLIST.CDFILIAL '||
            '                                          AND ITEMCOLE.NRCOLEPRECO = ITMPREVLIST.NRCOLEPRECO '||
            '                                          AND ITEMCOLE.CDFORNECED  = ITMPREVLIST.CDFORNECED '||
            '                                          AND ITEMCOLE.CDREGIAO    = ITMPREVLIST.CDREGIAO '||
            '                                          AND ITEMCOLE.CDPRODUTO   = ITMPREVLIST.CDPRODUTO '||
            '                                          AND ITEMCOLE.CDMARCA     = ITMPREVLIST.CDMARCA '||
            '                                          AND '''||P_NRSEQPRELIST||'''       = ITMPREVLIST.NRSEQPRELIST '||
            '     WHERE COLETAPR.CDFILIAL   = '''||P_CDFILIAL||''' '||
            '       AND COLETAPR.CDOPERADOR = '''||P_CDOPERADOR||''' '||
            '       AND ITEMCOLE.CDREGIAO   = '''||C_REGIAO.CDREGIAO||''' ';

            IF P_IDCOINVALIDLIST = K_S THEN
               V_SQL := V_SQL ||
                  ' AND ITEMCOLE.DTINIVALITM = '''||P_DTINI||''' '||
                  ' AND ITEMCOLE.DTFINVALITM = '''||P_DTFIN||''' ';
            ELSE
               V_SQL := V_SQL ||
                  ' AND ITEMCOLE.DTINIVALITM <= '''||P_DTFIN||''' '||
                  ' AND ITEMCOLE.DTFINVALITM >= '''||P_DTINI||''' ';
            END IF;

            IF P_CDARVPRODINI IS NOT NULL AND P_CDARVPRODFIN IS NOT NULL THEN
               V_SQL := V_SQL ||
                  ' AND PRODUTO.CDARVPROD BETWEEN '''||P_CDARVPRODINI||''' AND '''||P_CDARVPRODFIN||''' ';
            END IF;

            IF P_IDCOTSEMMOVLIST != K_S THEN
               V_SQL := V_SQL ||
                  ' AND COLETAPR.IDTIPCOLREG IN ('''||K_G||''', '''||K_W||''', '''||K_E||''') ';
            END IF;

            V_SQL := V_SQL ||
               '    AND COLETAPR.IDDISMONTLIS != '''||K_N||''' '||
               '    AND ITEMCOLE.VRPRECUNIITM > 0 '||
               '    AND NOT EXISTS (SELECT 1 '||
               '                      FROM ITMPREVLIST IT '||
               '                     WHERE IT.CDFILIAL     = ITMPREVLIST.CDFILIAL '||
               '                       AND IT.NRCOLEPRECO  = ITMPREVLIST.NRCOLEPRECO '||
               '                       AND IT.CDFORNECED   = ITMPREVLIST.CDFORNECED '||
               '                       AND IT.CDREGIAO     = ITMPREVLIST.CDREGIAO '||
               '                       AND IT.CDPRODUTO    = ITMPREVLIST.CDPRODUTO '||
               '                       AND IT.CDMARCA      = ITMPREVLIST.CDMARCA '||
               '                       AND IT.NRSEQPRELIST = ITMPREVLIST.NRSEQPRELIST) '||
               '    AND NOT EXISTS (SELECT 1 '||
               '                      FROM REFOREG '||
               '                     WHERE ITEMCOLE.CDREGIAO   = REFOREG.CDREGIAO  '||
               '                       AND ITEMCOLE.CDFORNECED = REFOREG.CDFORNECED)  '||
               '    AND EXISTS (SELECT 1 '||
               '                  FROM PRODCOMPCOMPL '||
               '                 WHERE PRODCOMPCOMPL.CDOPERADOR  = COLETAPR.CDOPERADOR  '||
               '                   AND PRODCOMPCOMPL.CDPRODCOMPL = PRODUTO.CDPRODUTO) ';

         OPEN C_ITEMCOLE FOR V_SQL;
         LOOP
            FETCH C_ITEMCOLE INTO 
               V_CDFILIAL,
               V_NRCOLEPRECO,
               V_CDFORNECED,
               V_CDREGIAO,
               V_CDPRODUTO,
               V_CDMARCA,
               V_IDITMSELLIS,
               V_CDFORMPGTO,
               V_VRPRECUNIITM,
               V_VRPRECECOITM,
               V_VRPRECOITMPI;
            EXIT WHEN C_ITEMCOLE%NOTFOUND;
            
               INSERT INTO ITMPREVLIST (CDFILIAL,
                                        NRSEQPRELIST,
                                        NRCOLEPRECO,
                                        CDFORNECED,
                                        CDREGIAO,
                                        CDPRODUTO,
                                        CDMARCA,
                                        IDITMSELLIS,
                                        CDFORMPGTO,
                                        VRPRECUNIIPL,
                                        VRPRECECOIPL,
                                        VRPRECOIPLPI)
                                 VALUES (V_CDFILIAL,
                                        P_NRSEQPRELIST, 
                                        V_NRCOLEPRECO,
                                        V_CDFORNECED,
                                        V_CDREGIAO,
                                        V_CDPRODUTO,
                                        V_CDMARCA,
                                        V_IDITMSELLIS,
                                        V_CDFORMPGTO,
                                        V_VRPRECUNIITM,
                                        V_VRPRECECOITM,
                                        V_VRPRECOITMPI);
            V_ROWSAFFECT := V_ROWSAFFECT + 1;
            COMMIT;
         END LOOP;
         CLOSE C_ITEMCOLE;
      END LOOP;
      P_ROWSAFFECT := V_ROWSAFFECT;
   END INSERT_ITMPREVLIST;

   PROCEDURE INS_ITMPREVLIST_IDSISDOS3 (P_CDFILIAL      IN FILIAL.CDFILIAL%TYPE,
                                        P_CDOPERADOR    IN OPERADOR.CDOPERADOR%TYPE,
                                        P_TCDREGIAO     IN VARCHAR2,
                                        P_CDREGIAO      IN FILIAL.CDREGIAO%TYPE,
                                        P_DTINI         IN DATE,
                                        P_DTFIN         IN DATE,
                                        P_TPRODUTO      IN VARCHAR2,
                                        P_CDPRODINI     IN PRODUTO.CDARVPROD%TYPE,
                                        P_CDPRODFIN     IN PRODUTO.CDARVPROD%TYPE,
                                        P_CARGCOT       IN COLETAPR.IDTIPCOLREG%TYPE,
                                        P_NRSEQPRELIST  IN PREVLISTA.NRSEQPRELIST%TYPE,
                                        P_COINCIDEP     IN PREVLISTA.IDCOINVALIDLIST%TYPE,
                                        P_ROWSAFFECT    OUT INT) IS
      TYPE CURTYPE IS REF CURSOR;
      C_ITEM       CURTYPE;
      V_ITEM_CDFILIAL        ITMPREVLIST.CDFILIAL%TYPE;
      V_ITEM_NRSEQPRELIST    ITMPREVLIST.NRSEQPRELIST%TYPE;
      V_ITEM_NRCOLEPRECO     ITMPREVLIST.NRCOLEPRECO%TYPE;
      V_ITEM_CDFORNECED      ITMPREVLIST.CDFORNECED%TYPE;
      V_ITEM_CDREGIAO        ITMPREVLIST.CDREGIAO%TYPE;
      V_ITEM_CDPRODUTO       ITMPREVLIST.CDPRODUTO%TYPE;
      V_ITEM_CDMARCA         ITMPREVLIST.CDMARCA%TYPE;
      V_ITEM_CDFORMPGTO      ITMPREVLIST.CDFORMPGTO%TYPE;
      V_ITEM_VRPRECUNIIPL    ITMPREVLIST.VRPRECUNIIPL%TYPE;
      V_ITEM_VRPRECECOIPL    ITMPREVLIST.VRPRECECOIPL%TYPE;
      V_ITEM_VRPRECOIPLPI    ITMPREVLIST.VRPRECOIPLPI%TYPE;
      V_ERRO                 VARCHAR2(1);
      V_ROWSAFFECT           INT := 0;
   BEGIN
      FOR C_REGIAO IN (SELECT CDREGIAO
                         FROM REGIAO
                        WHERE ((INSTR(P_CDREGIAO, CDREGIAO) <> 0) OR P_TCDREGIAO = 'T'))
      LOOP
         IF P_COINCIDEP = 'N' THEN
            OPEN C_ITEM FOR SELECT ITEMCOLE.CDFILIAL,
                                   P_NRSEQPRELIST NRSEQPRELIST,
                                   ITEMCOLE.NRCOLEPRECO,
                                   ITEMCOLE.CDFORNECED,
                                   ITEMCOLE.CDREGIAO,
                                   ITEMCOLE.CDPRODUTO,
                                   ITEMCOLE.CDMARCA,
                                   ITEMCOLE.CDFORMPGTO,
                                   ITEMCOLE.VRPRECUNIITM,
                                   ITEMCOLE.VRPRECECOITM,
                                   ITEMCOLE.VRPRECOITMPI
                              FROM ITEMCOLE,
                                   COLETAPR,
                                   PRODUTO
                             WHERE COLETAPR.CDFILIAL    = P_CDFILIAL
                               AND COLETAPR.CDOPERADOR  = P_CDOPERADOR
                               AND (COLETAPR.IDTIPCOLREG IN ('G','W', 'E') OR P_CARGCOT = 'T')
                               AND COLETAPR.CDFILIAL    = ITEMCOLE.CDFILIAL
                               AND COLETAPR.NRCOLEPRECO = ITEMCOLE.NRCOLEPRECO
                               AND COLETAPR.IDDISMONTLIS <> 'N'
                               AND ITEMCOLE.DTINIVALITM  <= P_DTFIN
                               AND ITEMCOLE.DTFINVALITM  >= P_DTINI
                               AND ITEMCOLE.VRPRECUNIITM > 0
                               AND ITEMCOLE.CDREGIAO = C_REGIAO.CDREGIAO
                               AND NOT EXISTS (SELECT 1
                                                 FROM REFOREG
                                                WHERE ITEMCOLE.CDREGIAO = REFOREG.CDREGIAO
                                                  AND ITEMCOLE.CDFORNECED = REFOREG.CDFORNECED) 
                               AND ITEMCOLE.CDPRODUTO = PRODUTO.CDPRODUTO
                               AND (PRODUTO.CDARVPROD BETWEEN P_CDPRODINI AND P_CDPRODFIN OR P_TPRODUTO = 'T')
                               AND ITEMCOLE.CDREGIAO  = C_REGIAO.CDREGIAO
                               AND EXISTS (SELECT 1
                                             FROM PRODCOMP, PRODUTO PR
                                            WHERE PRODCOMP.CDPRODUTO = PR.CDPRODUTO
                                              AND PRODCOMP.CDOPERADOR = P_CDOPERADOR
                                              AND PRODUTO.CDARVPROD LIKE PR.CDARVPROD || '%');
         ELSE
            OPEN C_ITEM FOR SELECT ITEMCOLE.CDFILIAL,
                                   P_NRSEQPRELIST NRSEQPRELIST,
                                   ITEMCOLE.NRCOLEPRECO,
                                   ITEMCOLE.CDFORNECED,
                                   ITEMCOLE.CDREGIAO,
                                   ITEMCOLE.CDPRODUTO,
                                   ITEMCOLE.CDMARCA,
                                   ITEMCOLE.CDFORMPGTO,
                                   ITEMCOLE.VRPRECUNIITM,
                                   ITEMCOLE.VRPRECECOITM,
                                   ITEMCOLE.VRPRECOITMPI
                              FROM ITEMCOLE,
                                   COLETAPR,
                                   PRODUTO
                             WHERE COLETAPR.CDFILIAL    = P_CDFILIAL
                               AND COLETAPR.CDOPERADOR  = P_CDOPERADOR
                               AND (COLETAPR.IDTIPCOLREG IN ('G','W', 'E') OR P_CARGCOT = 'T')
                               AND COLETAPR.CDFILIAL    = ITEMCOLE.CDFILIAL
                               AND COLETAPR.NRCOLEPRECO = ITEMCOLE.NRCOLEPRECO
                               AND COLETAPR.IDDISMONTLIS <> 'N'
                               AND ITEMCOLE.DTINIVALITM = P_DTINI
                               AND ITEMCOLE.DTFINVALITM = P_DTFIN
                               AND ITEMCOLE.VRPRECUNIITM > 0
                               AND ITEMCOLE.CDREGIAO = C_REGIAO.CDREGIAO
                               AND NOT EXISTS (SELECT 1
                                                 FROM REFOREG
                                                WHERE ITEMCOLE.CDREGIAO   = REFOREG.CDREGIAO
                                                  AND ITEMCOLE.CDFORNECED = REFOREG.CDFORNECED)
                               AND ITEMCOLE.CDPRODUTO = PRODUTO.CDPRODUTO
                               AND (PRODUTO.CDARVPROD BETWEEN P_CDPRODINI AND P_CDPRODFIN OR P_TPRODUTO = 'T')
                               AND ITEMCOLE.CDREGIAO  = C_REGIAO.CDREGIAO
                               AND EXISTS (SELECT 1
                                             FROM PRODCOMP, PRODUTO PR
                                            WHERE PRODCOMP.CDPRODUTO = PR.CDPRODUTO
                                              AND PRODCOMP.CDOPERADOR = P_CDOPERADOR
                                              AND PRODUTO.CDARVPROD LIKE PR.CDARVPROD || '%');
         END IF;
         LOOP
            FETCH C_ITEM INTO V_ITEM_CDFILIAL,
                              V_ITEM_NRSEQPRELIST,
                              V_ITEM_NRCOLEPRECO,
                              V_ITEM_CDFORNECED,
                              V_ITEM_CDREGIAO,
                              V_ITEM_CDPRODUTO,
                              V_ITEM_CDMARCA,
                              V_ITEM_CDFORMPGTO,
                              V_ITEM_VRPRECUNIIPL,
                              V_ITEM_VRPRECECOIPL,
                              V_ITEM_VRPRECOIPLPI;
            EXIT WHEN C_ITEM%NOTFOUND;
            P_ROWSAFFECT := SQL%ROWCOUNT;
            BEGIN
               INSERT INTO ITMPREVLIST (CDFILIAL,
                                        NRSEQPRELIST,
                                        NRCOLEPRECO,
                                        CDFORNECED,
                                        CDREGIAO,
                                        CDPRODUTO,
                                        CDMARCA,
                                        IDITMSELLIS,
                                        CDFORMPGTO,
                                        VRPRECUNIIPL,
                                        VRPRECECOIPL,
                                        VRPRECOIPLPI)
                                 VALUES(V_ITEM_CDFILIAL,
                                        V_ITEM_NRSEQPRELIST,
                                        V_ITEM_NRCOLEPRECO,
                                        V_ITEM_CDFORNECED,
                                        V_ITEM_CDREGIAO,
                                        V_ITEM_CDPRODUTO,
                                        V_ITEM_CDMARCA,
                                        'N',
                                        V_ITEM_CDFORMPGTO,
                                        V_ITEM_VRPRECUNIIPL,
                                        V_ITEM_VRPRECECOIPL,
                                        V_ITEM_VRPRECOIPLPI);
            EXCEPTION
               WHEN OTHERS THEN BEGIN
                  V_ERRO := 'S';
               END;
            END;
            V_ROWSAFFECT := V_ROWSAFFECT+1;
         END LOOP;
         CLOSE C_ITEM;
      END LOOP;
      P_ROWSAFFECT := V_ROWSAFFECT;
   END INS_ITMPREVLIST_IDSISDOS3;

   PROCEDURE APURA_MELHORES_PRECOS(P_CDFILIAL     IN FILIAL.CDFILIAL%TYPE,
                                   P_NRSEQPRELIST IN PREVLISTA.NRSEQPRELIST%TYPE) IS
      TYPE CURTYPE IS REF CURSOR;
      C_COTACAO      CURTYPE;
      V_CDPRODESTO   PRODUTO.CDPRODESTO%TYPE;
      V_CDPRODESTAUX PRODUTO.CDPRODESTO%TYPE;
      V_NRCOTESCAUTO NUMBER;
      V_VRPRECO      NUMBER;
      V_CDPRODUTO    PRODUTO.CDPRODUTO%TYPE;
      V_CDMARCA      MARCA.CDMARCA%TYPE;
      V_CDFORNECED   FORNECEDOR.CDFORNECED%TYPE;
      V_CDREGIAO     REGIAO.CDREGIAO%TYPE;
      V_CDREGIAOAUX  REGIAO.CDREGIAO%TYPE;
      V_NRCOLEPRECO  COLETAPR.NRCOLEPRECO%TYPE;
      V_NRCONTA      NUMBER;
      V_SQL          VARCHAR2(32000);
      V_ORDER        VARCHAR2(32000);
      R_PARASUPRI    PARASUPRI%ROWTYPE;
   BEGIN
      BEGIN
         SELECT *
           INTO R_PARASUPRI
           FROM PARASUPRI
          WHERE CDFILIAL = P_CDFILIAL;

         UPDATE ITMPREVLIST
            SET IDITMSELLIS  = 'N'
          WHERE ITMPREVLIST.CDFILIAL     = P_CDFILIAL
            AND ITMPREVLIST.NRSEQPRELIST = P_NRSEQPRELIST;
        
         IF R_PARASUPRI.IDTIPOAPUR IS NULL THEN
            V_SQL := 'SELECT ITEMCOLE.CDPRODUTO, (ITEMCOLE.VRPRECUNIITM / PRODUTO.VRFATOCONV), ';
            V_ORDER := 'ORDER BY ITEMCOLE.CDPRODUTO, ITEMCOLE.CDREGIAO, (ITEMCOLE.VRPRECUNIITM / PRODUTO.VRFATOCONV)';
         ELSIF R_PARASUPRI.IDTIPOAPUR = '1' THEN
            V_SQL := 'SELECT ITEMCOLE.CDPRODUTO, ITEMCOLE.VRPRECECOITM,';
            V_ORDER := 'ORDER BY ITEMCOLE.CDPRODUTO, ITEMCOLE.CDREGIAO, ITEMCOLE.VRPRECECOITM';
         ELSE
            V_SQL := 'SELECT ITEMCOLE.CDPRODUTO, ITEMCOLE.VRPRECOITMPI,';
            V_ORDER := 'ORDER BY ITEMCOLE.CDPRODUTO, ITEMCOLE.CDREGIAO, ITEMCOLE.VRPRECOITMPI';
         END IF;

         V_SQL := V_SQL || 
            'ITEMCOLE.NRCOLEPRECO, ITEMCOLE.CDPRODUTO, ITEMCOLE.CDMARCA, ITEMCOLE.CDFORNECED, ITEMCOLE.CDREGIAO '||
            'FROM ITMPREVLIST '||
            'INNER JOIN PRODUTO ON ITMPREVLIST.CDPRODUTO = PRODUTO.CDPRODUTO '||
            'INNER JOIN FORNECEDOR ON ITMPREVLIST.CDFORNECED = FORNECEDOR.CDFORNECED '||
            'INNER JOIN ITEMCOLE ON ITMPREVLIST.CDFILIAL     = ITEMCOLE.CDFILIAL '||
            '             AND ITMPREVLIST.NRCOLEPRECO  = ITEMCOLE.NRCOLEPRECO '||
            '             AND ITMPREVLIST.CDFORNECED   = ITEMCOLE.CDFORNECED '||
            '             AND ITMPREVLIST.CDREGIAO     = ITEMCOLE.CDREGIAO '||
            '             AND ITMPREVLIST.CDPRODUTO    = ITEMCOLE.CDPRODUTO '||
            '             AND ITMPREVLIST.CDMARCA      = ITEMCOLE.CDMARCA '||
            'WHERE ITMPREVLIST.CDFILIAL     = ''' || P_CDFILIAL || ''' '||
            '  AND ITMPREVLIST.NRSEQPRELIST = ''' || P_NRSEQPRELIST || ''' '||
            '  AND FORNECEDOR.IDTIPOFORN    = ''' || 'N' ||''' '||
            '  AND FORNECEDOR.IDSITUCADA    = ''' || 'A' ||''' ';
        
         IF R_PARASUPRI.IDULTIDTVALQ = 'D' THEN
            V_SQL := V_SQL || 
               'AND NOT EXISTS (SELECT 1 '||
               '                  FROM QUALIFICACAO '||
               '                 WHERE FORNECEDOR.CDQUALIF = QUALIFICACAO.CDQUALIF '||
               '                   AND FORNECEDOR.IDFORNAUTO = ''' || 'N' ||''' '||
               '                   AND (QUALIFICACAO.IDPERCOTCMP = ''' || '2' ||''' OR TO_DATE(SYSDATE) > FORNECEDOR.DTVALQUALIF)) '||
               'AND NOT EXISTS (SELECT 1 '||
               '                  FROM QFOMARPROD '||
               '                 WHERE QFOMARPROD.CDPRODUTO = PRODUTO.CDPRODUTO '||
               '                   AND QFOMARPROD.CDMARCA   = ITMPREVLIST.CDMARCA '||
               '                   AND ((QFOMARPROD.IDAPRMARPRO = ''' || 'N' ||''' AND QFOMARPROD.IDAUTMARPRO = ''' || 'N' ||''') OR '||
               '                        (QFOMARPROD.IDAPRMARPRO = ''' || 'S' ||''' AND TO_DATE(SYSDATE) > QFOMARPROD.DTVALAPROVA))) '||
               ' AND NOT EXISTS (SELECT 1 '||
               '                   FROM QFOPRODFORN '||
               '                  WHERE QFOPRODFORN.CDPRODUTO  = PRODUTO.CDPRODUTO '||
               '                    AND QFOPRODFORN.CDFORNECED = FORNECEDOR.CDFORNECED '||
               '                    AND ((QFOPRODFORN.IDFORNAPROV = ''' || 'N' ||''' AND QFOPRODFORN.IDFORNAUTOR = ''' || 'N' ||''') OR '||
               '                         (QFOPRODFORN.IDFORNAPROV = ''' || 'S' ||''' AND TO_DATE(SYSDATE) > QFOPRODFORN.DTVALPRFORN))) ';

         ELSIF R_PARASUPRI.IDULTIDTVALQ = 'M' THEN
            V_SQL := V_SQL || 
               'AND NOT EXISTS (SELECT 1 '||
               '                  FROM QUALIFICACAO '||
               '                 WHERE FORNECEDOR.CDQUALIF = QUALIFICACAO.CDQUALIF '||
               '                   AND FORNECEDOR.IDFORNAUTO = ''' || 'N' ||''' '||
               '                   AND (QUALIFICACAO.IDPERCOTCMP = ''' || '2' ||''' OR TO_DATE(SYSDATE) > LAST_DAY(FORNECEDOR.DTVALQUALIF))) '||
               'AND NOT EXISTS (SELECT 1 '||
               '                  FROM QFOMARPROD '||
               '                 WHERE QFOMARPROD.CDPRODUTO = PRODUTO.CDPRODUTO '||
               '                   AND QFOMARPROD.CDMARCA   = ITMPREVLIST.CDMARCA '||
               '                   AND ((QFOMARPROD.IDAPRMARPRO = ''' || 'N' ||''' AND QFOMARPROD.IDAUTMARPRO = ''' || 'N' ||''') OR '||
               '                        (QFOMARPROD.IDAPRMARPRO = ''' || 'S' ||''' AND TO_DATE(SYSDATE) > LAST_DAY(QFOMARPROD.DTVALAPROVA)))) '||
               ' AND NOT EXISTS (SELECT 1 '||
               '                   FROM QFOPRODFORN '||
               '                  WHERE QFOPRODFORN.CDPRODUTO  = PRODUTO.CDPRODUTO '||
               '                    AND QFOPRODFORN.CDFORNECED = FORNECEDOR.CDFORNECED '||
               '                    AND ((QFOPRODFORN.IDFORNAPROV = ''' || 'N' ||''' AND QFOPRODFORN.IDFORNAUTOR = ''' || 'N' ||''') OR '||
               '                         (QFOPRODFORN.IDFORNAPROV = ''' || 'S' ||''' AND TO_DATE(SYSDATE) > LAST_DAY(QFOPRODFORN.DTVALPRFORN)))) ';
         END IF;

         IF R_PARASUPRI.IDMARSEMQUA = 'S' THEN
            V_SQL := V_SQL || 
               'AND EXISTS (SELECT 1 '||
               '              FROM QFOMARPROD '||
               '             WHERE QFOMARPROD.CDPRODUTO = PRODUTO.CDPRODUTO '||
               '               AND QFOMARPROD.CDMARCA   = ITMPREVLIST.CDMARCA) ';
         END IF;

         V_SQL := V_SQL || V_ORDER;

         V_NRCOTESCAUTO := NVL(R_PARASUPRI.NRCOTESCAUTO, 0);
    
         OPEN C_COTACAO FOR V_SQL;
         FETCH C_COTACAO INTO V_CDPRODESTO,
                              V_VRPRECO,
                              V_NRCOLEPRECO,
                              V_CDPRODUTO,
                              V_CDMARCA,
                              V_CDFORNECED,
                              V_CDREGIAO;
         LOOP
            EXIT WHEN C_COTACAO%NOTFOUND;

            V_NRCONTA := 1;
            V_CDPRODESTAUX := V_CDPRODESTO;
            V_CDREGIAOAUX  := V_CDREGIAO;

            WHILE (V_CDPRODESTAUX = V_CDPRODESTO) AND (V_CDREGIAOAUX  = V_CDREGIAO) LOOP
                EXIT WHEN C_COTACAO%NOTFOUND;
                IF (V_NRCONTA <= V_NRCOTESCAUTO) OR (V_NRCOTESCAUTO = 0) THEN
                    UPDATE ITMPREVLIST
                       SET IDITMSELLIS  = 'S'
                     WHERE ITMPREVLIST.CDFILIAL     = P_CDFILIAL      
                       AND ITMPREVLIST.NRCOLEPRECO  = V_NRCOLEPRECO  
                       AND ITMPREVLIST.NRSEQPRELIST = P_NRSEQPRELIST  
                       AND ITMPREVLIST.CDFORNECED   = V_CDFORNECED    
                       AND ITMPREVLIST.CDREGIAO     = V_CDREGIAO      
                       AND ITMPREVLIST.CDPRODUTO    = V_CDPRODUTO     
                       AND ITMPREVLIST.CDMARCA      = V_CDMARCA;
                END IF;
                FETCH C_COTACAO INTO V_CDPRODESTO,
                                     V_VRPRECO,
                                     V_NRCOLEPRECO,
                                     V_CDPRODUTO,
                                     V_CDMARCA,
                                     V_CDFORNECED,
                                     V_CDREGIAO;
                V_NRCONTA := V_NRCONTA + 1;
            END LOOP;
         END LOOP;
         CLOSE C_COTACAO;    
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            NULL;
      END;
   END APURA_MELHORES_PRECOS;

   PROCEDURE CRIA_LISTA_WEB (P_CDFILIAL     IN ITMPREVLIST.CDFILIAL%TYPE,
                             P_NRSEQPRELIST IN ITMPREVLIST.NRSEQPRELIST%TYPE,
                             P_ROWSAFFECT  OUT INT) IS
      V_ROWSAFFECT      INT := 0;
      V_COUNT           INT := 0;
      V_IDCOINVALIDLIST PREVLISTA.IDCOINVALIDLIST%TYPE;
      V_IDITVALDIFLISTA ITEMCOLE.IDITVALDIFLISTA%TYPE;
      V_DTINIVALLIST    DATE;
      V_DTFINVALLIST    DATE;
   BEGIN
      FOR C_DELETE IN (SELECT ROWID IDDELETE
                         FROM ITMPREVLIST
                        WHERE CDFILIAL     = P_CDFILIAL
                          AND NRSEQPRELIST = P_NRSEQPRELIST
                          AND IDITMSELLIS  = 'N')
      LOOP
         DELETE ITMPREVLIST WHERE ROWID = C_DELETE.IDDELETE;
         COMMIT;
      END LOOP;

      FOR C_UPDATE IN (SELECT ROWID IDUPDATE
                         FROM ITMPREVLIST
                        WHERE CDFILIAL     = P_CDFILIAL
                          AND NRSEQPRELIST = P_NRSEQPRELIST
                          AND IDITMSELLIS  = 'S')
      LOOP
         UPDATE ITMPREVLIST SET IDITMLISTJAMONT = 'N'
          WHERE ROWID = C_UPDATE.IDUPDATE;
         COMMIT;
      END LOOP;

      SELECT MAX(DTINIVALLIST),
             MAX(DTFINVALLIST),
             MAX(IDCOINVALIDLIST)
        INTO V_DTINIVALLIST,
             V_DTFINVALLIST,
             V_IDCOINVALIDLIST
        FROM PREVLISTA
       WHERE CDFILIAL     = P_CDFILIAL
         AND NRSEQPRELIST = P_NRSEQPRELIST;

      FOR C_ITMPREVLIST IN (SELECT ITMPREVLIST.CDFILIAL,
                                   ITMPREVLIST.NRCOLEPRECO,
                                   ITMPREVLIST.CDFORNECED,
                                   ITMPREVLIST.CDREGIAO,
                                   ITMPREVLIST.CDPRODUTO,
                                   ITMPREVLIST.CDMARCA,
                                   ITMPREVLIST.ROWID IDITMPREVLIST
                              FROM ITMPREVLIST
                             WHERE ITMPREVLIST.CDFILIAL = P_CDFILIAL
                               AND ITMPREVLIST.NRSEQPRELIST = P_NRSEQPRELIST
                               AND ITMPREVLIST.IDITMLISTJAMONT = 'N')
      LOOP
         V_COUNT := 0;
         V_IDITVALDIFLISTA := 'N';
         
         IF V_IDCOINVALIDLIST = 'N' THEN
            SELECT COUNT(1)
              INTO V_COUNT
              FROM ITEMCOLE
             WHERE ITEMCOLE.CDFILIAL     = C_ITMPREVLIST.CDFILIAL
               AND ITEMCOLE.NRCOLEPRECO  = C_ITMPREVLIST.NRCOLEPRECO
               AND ITEMCOLE.CDFORNECED   = C_ITMPREVLIST.CDFORNECED
               AND ITEMCOLE.CDREGIAO     = C_ITMPREVLIST.CDREGIAO
               AND ITEMCOLE.CDPRODUTO    = C_ITMPREVLIST.CDPRODUTO
               AND ITEMCOLE.CDMARCA      = C_ITMPREVLIST.CDMARCA
               AND (ITEMCOLE.DTINIVALITM <> V_DTINIVALLIST OR ITEMCOLE.DTFINVALITM <> V_DTFINVALLIST);
         
            IF V_COUNT > 0 THEN
               V_IDITVALDIFLISTA := 'S';
            END IF;
         END IF;

         UPDATE ITEMCOLE
            SET IDITMLISPREC = 'S',
                IDPRECALT    = 'N',
                IDITVALDIFLISTA = V_IDITVALDIFLISTA,
                NRSEQPRELIST = P_NRSEQPRELIST
          WHERE ITEMCOLE.CDFILIAL    = C_ITMPREVLIST.CDFILIAL
            AND ITEMCOLE.NRCOLEPRECO = C_ITMPREVLIST.NRCOLEPRECO
            AND ITEMCOLE.CDFORNECED  = C_ITMPREVLIST.CDFORNECED
            AND ITEMCOLE.CDREGIAO    = C_ITMPREVLIST.CDREGIAO
            AND ITEMCOLE.CDPRODUTO   = C_ITMPREVLIST.CDPRODUTO
            AND ITEMCOLE.CDMARCA     = C_ITMPREVLIST.CDMARCA;

         UPDATE ITMPREVLIST
            SET IDITMLISTJAMONT = 'S'
          WHERE ITMPREVLIST.ROWID = C_ITMPREVLIST.IDITMPREVLIST;

         V_ROWSAFFECT := V_ROWSAFFECT + 1;
         COMMIT;
      END LOOP;
      P_ROWSAFFECT := V_ROWSAFFECT;
   END CRIA_LISTA_WEB;
    
END PRICE_LIST;
/