/* 
 * Procedimento responsável por apurar as melhores cotações para a lista de preços
 *
 * Criação: 03/04/2000 - Yoris L. de Souza
 *
 * Manutenções:
 * 08/05/2000 - Adriano de Araújo - Acrescentada verficação para o tipo de fornecedor
 * 
 * @entrada P_CDFILIAL: Código da central de compras da filial de processamento
 *          P_NRSEQPRELIST: Código da lista de preço   
 */

CREATE OR REPLACE PROCEDURE APURA_LISTA(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 '||
            'JOIN PRODUTO ON ITMPREVLIST.CDPRODUTO = PRODUTO.CDPRODUTO '||
            'JOIN FORNECEDOR ON ITMPREVLIST.CDFORNECED = FORNECEDOR.CDFORNECED '||
            '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;
/
