DROP TYPE MAPA_COTACAO_MOBILE_TABLE
/

DROP TYPE MAPA_COTACAO_MOBILE_TYPE
/

CREATE TYPE MAPA_COTACAO_MOBILE_TYPE AS
OBJECT(NRCOLEPRECO      VARCHAR2(10),
       CDREGIAO         VARCHAR2(3),
       NMREGIAO         VARCHAR2(30),
       CDPRODUTO        VARCHAR2(10),
       CDARVPROD        VARCHAR2(20),
       NMPRODUTO        VARCHAR2(50),
       SGUNIDADE        VARCHAR2(10),
       CDMARCA          VARCHAR2(5),
       NMMARCA          VARCHAR2(20),
       CDFORNECED       VARCHAR2(21),
       NMFANTFORN       VARCHAR2(40),
       IDTPIJURFORN     VARCHAR2(1),
       NRINSJURFORN     VARCHAR2(20),
       CDOPERADOR       VARCHAR2(12),
       NMOPERADOR       VARCHAR2(40),
       IDMENORPRECO     VARCHAR2(1),    /*IDENTIFICADOR DE ITEM DE MENOR PREÇO*/
       VRPRECUNIITM     FLOAT,          /*VALOR DO ITEM CONSIDERANDO O PARÂMETRO DE DESCONTO*/
       QTACOMPRAR       FLOAT,          /*QUANTIDADE A COMPRAR*/
       VRPERDESITM      FLOAT,          /*VALOR DO DESCONTO DO ITEM DE COTAÇÃO*/
       MIN_VRPRECUNIITM FLOAT,          /*MENOR VALOR DO ITEM CONSIDERANDO O PARÂMETRO DE DESCONTO*/
       VRPRECOREAL      FLOAT,          /*VALOR DO ITEM REAL(SEM DESCONTO)*/
       VRTOTALITEMREAL  FLOAT,          /*VALOR TOTAL DO ITEM REAL(SEM DESCONTO)*/
       VRTOTALITEMDES   FLOAT,          /*VALOR TOTAL DO ITEM CONSIDERANDO O PARÂMETRO DE DESCONTO*/
       VRIPI            FLOAT,          /*VALOR DO IPI*/
       IDTPFORPGTFO     VARCHAR2(1),    /*IDENTIFICADOR DE CONDIÇAÕ DE PAGAMENTO(F=FIXO, V=VARIAVEL)*/
       FORMAPGTO        VARCHAR2(100),  /*DESCRIÇÃO DA CONDIÇAÕ DE PAGAMENTO*/
       NRPZOENTCOL      VARCHAR2(3),    /*NÚMERO DE DIAS CONDIÇAÕ DE PAGAMENTO*/
       DSOBSITMCOL      VARCHAR2(1000), /*OBSERVAÇÃO DO ITEM DE COTAÇÃO*/
       VRFRETEFORN      FLOAT,          /*VALOR DO FRETE DO ITEM DE COTAÇÃO*/
       VRPRECOESTOQ     FLOAT,          /*VALOR DO ITEM CONVERTIDO UM UNIADDE DE ESTOQUE CONSIDERANDO O PARÂMETRO DE DESCONTO*/
       VRFATOCONV       FLOAT,          /*VALOR DO FATOR DE CONVERSÃO DO PRODUTO*/
       VRCUSTOREFER     FLOAT,          /*VALOR DO CUSTO DE REFERENCIA*/
       VRVARIACUSTO     FLOAT,          /*PERCENTUAL DE VARIAÇÃO DO VALOR DE REFERENCIA PARA COTAÇÃO ATUAL(REAL)*/
       NRORG            NUMBER,
       MIN_VRVARIACUSTO FLOAT,          /*PERCENTUAL DE VARIAÇÃO DO VALOR DE REFERENCIA PARA O MENOR VALOR(CONSIDERANDO DESCONTO)*/
       MIN_VRPRECOREAL  FLOAT           /*MENOR VALOR DO ITEM REAL(SEM DESCONTO)*/
       )
/

CREATE TYPE MAPA_COTACAO_MOBILE_TABLE AS TABLE OF MAPA_COTACAO_MOBILE_TYPE
/

CREATE OR REPLACE FUNCTION MAPA_COTACAO_MOBILE(P_CDFILIAL        IN VARCHAR2,
                                               P_DTINICIAL       IN DATE,
                                               P_DTFINAL         IN DATE,
                                               P_CDPRODINI       IN VARCHAR2,
                                               P_CDPRODFIM       IN VARCHAR2,
                                               P_CDREGIAO        IN VARCHAR2,
                                               P_TCDREGIAO       IN VARCHAR2,
                                               P_CDFORNECED      IN VARCHAR2,
                                               P_TCDFORNECED     IN VARCHAR2,
                                               P_CDOPERADOR      IN VARCHAR2,
                                               P_CHBDESCONTO     IN VARCHAR2, /*EXIBE OU NÃO EXIBE O DESCONTO DO ITEM DE COTACAO*/
                                               P_EXIBEQTDE       IN VARCHAR2 DEFAULT 'N', /*EXIBE OU NÃO EXIBE QTDE A COMPRAR*/
                                               P_EXIBECOTACAO    IN VARCHAR2 DEFAULT 'N', /*EXIBE OU NÃO EXIBE Nº- COTACAO*/
                                               P_EXIBEIPI        IN VARCHAR2 DEFAULT 'N', /*EXIBE OU NÃO EXIBE IPI*/
                                               P_EXIBEPGTO       IN VARCHAR2 DEFAULT 'N', /*EXIBE OU NÃO EXIBE CONDIÇÃO DE PGTO*/
                                               P_EXIBEREFE       IN VARCHAR2 DEFAULT 'N', /*EXIBE CUSTO DE REFERENCIA(N=NAO, A=AF OU C=CUSTO INFORMADO)*/
                                               P_NRTIPOCUSTO     IN NUMBER   DEFAULT 3,   /*CÓDIGO DO TIPO DE CUSTO*/
                                               P_VRPERCENTACRES  IN FLOAT    DEFAULT 0,   /*VALOR DO PRECENTUAL DE ACRESCIMO QUE SERÁ APLICADO NO CUSTO DE REFERENCIA*/
                                               P_EXIBEMENORPREC  IN VARCHAR2 DEFAULT 'N'  /*EXIBE OU NÃO EXIBE MENOR PRECO*/
                                               ) RETURN MAPA_COTACAO_MOBILE_TABLE PIPELINED
IS
   V_NRPAGINA        NUMERIC;
   V_QUANTFORN       NUMERIC;
   V_QTACOMPRAR      FLOAT;
   V_VRPRECUNIITM    FLOAT;
   V_VRPREUNDESC     FLOAT;
   V_VRMINPRECUNIITM FLOAT;
   V_VRMINPREUNDESC  FLOAT;
   V_VRMENORPRECO    FLOAT;
   V_VRPRECPROD      FLOAT;
   V_VRPRESCPROD     FLOAT;
   V_CHAVE           VARCHAR2(50);
   V_CHAVEPRECO      VARCHAR2(50);
   V_VRIPI           FLOAT := 0;
   V_IDTPFORPGTFO    VARCHAR2(1);
   V_FORMAPGTO       VARCHAR2(100);
   V_NRPZOENTCOL     VARCHAR2(3);
   V_VRCUSTOREFER    FLOAT := 0;
   V_DTINICIAL       VARCHAR2(20);
   V_DTFINAL         VARCHAR2(20);

   OUT_RECORD MAPA_COTACAO_MOBILE_TYPE := MAPA_COTACAO_MOBILE_TYPE (NULL, NULL, NULL, NULL, NULL, NULL,
                                                                    NULL, NULL, NULL, NULL, NULL, NULL,
                                                                    NULL, NULL, NULL, NULL, 0, 0, 0, 0,
                                                                    0, 0, 0, 0, NULL, NULL, NULL, NULL,
                                                                    0, 0, 0, 0, 0, 0, 0, 0);
BEGIN
   BEGIN
      V_DTINICIAL := TO_CHAR(P_DTINICIAL, 'DD/MM/YYYY');
      V_DTFINAL   := TO_CHAR(P_DTFINAL, 'DD/MM/YYYY');
   EXCEPTION
      WHEN OTHERS THEN BEGIN
         V_DTINICIAL := TRUNC(P_DTINICIAL);
         V_DTFINAL   := TRUNC(P_DTFINAL);
      END;
   END;
   V_NRPAGINA := 0;
   FOR C_REGIAO IN (SELECT I.CDREGIAO, CASE P_EXIBECOTACAO
                                          WHEN 'N'
                                          THEN NULL
                                          ELSE I.NRCOLEPRECO
                                       END NRCOLEPRECO
                      FROM COLETAPR C INNER JOIN ITEMCOLE I ON I.NRCOLEPRECO = C.NRCOLEPRECO
                                                           AND I.CDFILIAL    = C.CDFILIAL
                     WHERE C.CDFILIAL     = P_CDFILIAL
                       AND C.CDOPERADOR   = P_CDOPERADOR
                       AND I.DTINIVALITM >= V_DTINICIAL
                       AND I.DTFINVALITM <= V_DTFINAL
                       AND ((INSTR(P_CDREGIAO, I.CDREGIAO) <> 0) OR P_TCDREGIAO = 'T')
                       AND ((INSTR(P_CDFORNECED,I.CDFORNECED) <> 0) OR (P_TCDFORNECED = 'T'))
                       AND NVL(I.VRPRECUNIITM, 0) > 0
                     GROUP BY I.CDREGIAO, CASE P_EXIBECOTACAO
                                             WHEN 'N'
                                             THEN NULL
                                             ELSE I.NRCOLEPRECO
                                          END
                     ORDER BY I.CDREGIAO, 2)
   LOOP
      V_CHAVE      := '_';
      V_CHAVEPRECO := '_';   
      FOR C_FORNECEDORES IN ( SELECT CDREGIAO, CDFORNECED, NMFANTFORN,  CDOPERADOR, CDPRODUTO,
                                     CDMARCA, NMPRODUTO, CDPRODESTO, IDTPIJURFORN, NRINSJURFORN,
                                     CDARVPROD, SGUNIDADE, NMMARCA, NMREGIAO, NMOPERADOR,
                                     VRFATOCONV, VRPRECUNIITM, NRCOLEPRECO, MIN_VRPRECUNIITM,
                                     MIN_VRPRECOREAL, VRPERDESITM, VRPRECOREAL, DSOBSITMCOL,
                                     VRFRETEFORN, NRORG
                                FROM (  SELECT I.CDREGIAO, I.CDFORNECED, F.NMFANTFORN,  C.CDOPERADOR, I.CDPRODUTO,
                                               I.CDMARCA, P.NMPRODUTO, P.CDPRODESTO, F.IDTPIJURFORN, F.NRINSJURFORN,
                                               P.CDARVPROD, P.SGUNIDADE, M.NMMARCA, R.NMREGIAO, O.NMOPERADOR,
                                               NVL(P.VRFATOCONV, 1) VRFATOCONV,
                                               CASE P_CHBDESCONTO
                                                  WHEN 'N'
                                                  THEN I.VRPRECUNIITM
                                                  ELSE I.VRPRECUNIITM - (I.VRPRECUNIITM*NVL(I.VRPERDESITM, F.VRPEDESCFORN)/100)
                                               END VRPRECUNIITM,
                                               I.NRCOLEPRECO,
                                               MIN(CASE P_CHBDESCONTO
                                                      WHEN 'N'
                                                      THEN I.VRPRECUNIITM
                                                      ELSE I.VRPRECUNIITM - (I.VRPRECUNIITM*NVL(I.VRPERDESITM, F.VRPEDESCFORN)/100)
                                                   END) OVER (PARTITION BY I.CDPRODUTO, I.NRCOLEPRECO, I.CDMARCA) MIN_VRPRECUNIITM,
                                               MIN(I.VRPRECUNIITM) OVER (PARTITION BY I.CDPRODUTO, I.CDMARCA, I.NRCOLEPRECO) MIN_VRPRECOREAL,
                                               NVL(I.VRPERDESITM, F.VRPEDESCFORN) VRPERDESITM,
                                               I.VRPRECUNIITM VRPRECOREAL,
                                               MAX(DSOBSITMCOL) OVER (PARTITION BY I.CDPRODUTO, I.CDMARCA, I.NRCOLEPRECO) DSOBSITMCOL,
                                               NVL(I.VRFRETEFORNEPLANCOT, F.VRFRETEFORN) AS VRFRETEFORN, I.NRORG
                                          FROM ITEMCOLE I INNER JOIN COLETAPR C   ON I.CDFILIAL    = C.CDFILIAL
                                                                                 AND I.NRCOLEPRECO = C.NRCOLEPRECO
                                                          INNER JOIN FORNECEDOR F ON I.CDFORNECED  = F.CDFORNECED
                                                          INNER JOIN PRODUTO P    ON I.CDPRODUTO   = P.CDPRODUTO
                                                          INNER JOIN MARCA M    ON I.CDMARCA     = M.CDMARCA
                                                          INNER JOIN REGIAO R   ON I.CDREGIAO    = R.CDREGIAO
                                                          INNER JOIN OPERADOR O ON C.CDOPERADOR  = O.CDOPERADOR
                                         WHERE C.CDFILIAL    =  P_CDFILIAL
                                           AND C.CDOPERADOR  =  P_CDOPERADOR
                                           AND I.CDREGIAO    =  C_REGIAO.CDREGIAO
                                           AND I.NRCOLEPRECO =  NVL(C_REGIAO.NRCOLEPRECO, I.NRCOLEPRECO)
                                           AND I.DTINIVALITM >= V_DTINICIAL
                                           AND I.DTFINVALITM <= V_DTFINAL
                                           AND P.CDARVPROD BETWEEN P_CDPRODINI AND RPAD(P_CDPRODFIM , 20, 'Z')
                                           AND ((INSTR(P_CDFORNECED,I.CDFORNECED) <> 0) OR (P_TCDFORNECED  = 'T'))
                                           AND NVL(I.VRPRECUNIITM, 0) > 0
                                           AND P_EXIBECOTACAO = 'S'                   
                                        
                                        UNION ALL
                                        
                                        SELECT I.CDREGIAO, I.CDFORNECED, F.NMFANTFORN,  I.CDOPERADOR, I.CDPRODUTO,
                                               I.CDMARCA, P.NMPRODUTO, P.CDPRODESTO, F.IDTPIJURFORN, F.NRINSJURFORN,
                                               P.CDARVPROD, P.SGUNIDADE, M.NMMARCA, R.NMREGIAO, O.NMOPERADOR,
                                               NVL(P.VRFATOCONV, 1) VRFATOCONV,
                                               CASE P_CHBDESCONTO
                                                  WHEN 'N'
                                                  THEN I.VRPRECUNIITM
                                                  ELSE I.VRPRECUNIITM - (I.VRPRECUNIITM*NVL(I.VRPERDESITM, F.VRPEDESCFORN)/100)
                                               END VRPRECUNIITM, NULL NRCOLEPRECO,
                                               CASE P_CHBDESCONTO
                                                  WHEN 'N'
                                                  THEN I.VRPRECUNIITM
                                                  ELSE I.VRPRECUNIITM - (I.VRPRECUNIITM*NVL(I.VRPERDESITM, F.VRPEDESCFORN)/100)
                                               END MIN_VRPRECUNIITM,
                                               MIN(I.VRPRECUNIITM) OVER (PARTITION BY I.CDPRODUTO, I.CDMARCA) MIN_VRPRECOREAL,
                                               NVL(I.VRPERDESITM, F.VRPEDESCFORN) VRPERDESITM,
                                               I.VRPRECUNIITM VRPRECOREAL,
                                               I.DSOBSITMCOL,
                                               NVL(I.VRFRETEFORNEPLANCOT, F.VRFRETEFORN) AS VRFRETEFORN, P.NRORG
                                         FROM ( SELECT I.CDREGIAO, I.CDFORNECED, C.CDOPERADOR, I.CDPRODUTO,
                                                       I.CDMARCA, MIN(I.VRPRECUNIITM) VRPRECUNIITM,
                                                       MIN(I.VRPERDESITM) VRPERDESITM,
                                                       MAX(I.DSOBSITMCOL) DSOBSITMCOL,
                                                       MIN(I.VRFRETEFORNEPLANCOT) AS VRFRETEFORNEPLANCOT
                                                  FROM ITEMCOLE I INNER JOIN COLETAPR C  ON I.CDFILIAL    = C.CDFILIAL
                                                                                        AND I.NRCOLEPRECO = C.NRCOLEPRECO
                                                 WHERE C.CDFILIAL    =  P_CDFILIAL
                                                   AND C.CDOPERADOR  =  P_CDOPERADOR
                                                   AND I.CDREGIAO    =  C_REGIAO.CDREGIAO
                                                   AND I.NRCOLEPRECO =  NVL(C_REGIAO.NRCOLEPRECO, I.NRCOLEPRECO)
                                                   AND I.DTINIVALITM >= V_DTINICIAL
                                                   AND I.DTFINVALITM <= V_DTFINAL
                                                   AND ((INSTR(P_CDFORNECED,I.CDFORNECED) <> 0) OR (P_TCDFORNECED  = 'T'))
                                                   AND NVL(I.VRPRECUNIITM, 0) > 0
                                                 GROUP BY I.CDREGIAO, I.CDFORNECED, C.CDOPERADOR, I.CDPRODUTO, I.CDMARCA
                                              ) I INNER JOIN FORNECEDOR F ON I.CDFORNECED  = F.CDFORNECED
                                                  INNER JOIN PRODUTO P    ON I.CDPRODUTO   = P.CDPRODUTO
                                                  INNER JOIN MARCA M      ON I.CDMARCA     = M.CDMARCA
                                                  INNER JOIN REGIAO R     ON I.CDREGIAO    = R.CDREGIAO
                                                  INNER JOIN OPERADOR O   ON I.CDOPERADOR  = O.CDOPERADOR
                                        WHERE P.CDARVPROD BETWEEN P_CDPRODINI AND RPAD(P_CDPRODFIM , 20, 'Z')
                                          AND P_EXIBECOTACAO = 'N')
                               ORDER BY NRCOLEPRECO, CDREGIAO, CDPRODUTO, CDMARCA, CDFORNECED)

      LOOP
         IF (P_EXIBEQTDE = 'S') THEN
            /*Quantidade a comprar*/
            BEGIN
               SELECT QTACOMPRAR
                 INTO V_QTACOMPRAR
                 FROM (  SELECT SUM(COMP.QTDECOMP-NVL(JACOMP.QTDECOMP/COMP.VRFATOCONV,0)) AS QTACOMPRAR
                           FROM PARASUPRI, FILIAL,
                                (SELECT ITEMSOLI.CDFILSOLI AS CDFILIAL, ITEMSOLI.DTPROGENTR, ESTOQUE.CDPRODESTO,
                                        ESTOQUE.CDPRODUTO, ESTOQUE.VRFATOCONV, SUM(ITEMSOLI.QTSOLIPROD*PRODUTO.VRFATOCONV/ESTOQUE.VRFATOCONV) AS QTDECOMP
                                   FROM ITEMSOLI INNER JOIN PRODUTO         ON ITEMSOLI.CDPRODUTO = PRODUTO.CDPRODUTO
                                                 INNER JOIN PRODUTO ESTOQUE ON PRODUTO.CDPRODESTO = ESTOQUE.CDPRODESTO
                                  WHERE ITEMSOLI.IDITMCONS = 'N'
                                    AND ITEMSOLI.DTPROGENTR BETWEEN V_DTINICIAL AND V_DTFINAL
                                    AND ESTOQUE.CDPRODUTO = C_FORNECEDORES.CDPRODUTO
                                    AND NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S'
                                  GROUP BY ITEMSOLI.CDFILSOLI, ITEMSOLI.DTPROGENTR, ESTOQUE.CDPRODESTO,
                                           ESTOQUE.CDPRODUTO, ESTOQUE.VRFATOCONV) COMP LEFT JOIN
                                (SELECT ITEMAUTF.CDFILDEST AS CDFILIAL, ITEMAUTF.DTENTRITMSOL, PRODUTO.CDPRODESTO,
                                        SUM(ITEMAUTF.QTPROGENTAF*PRODUTO.VRFATOCONV) AS QTDECOMP
                                   FROM ITEMAUTF INNER JOIN AUTOFORNE ON ITEMAUTF.CDFILDEST  = AUTOFORNE.CDFILDEST
                                                                     AND ITEMAUTF.CDFILLANC  = AUTOFORNE.CDFILLANC
                                                                     AND ITEMAUTF.NRAUTOFORN = AUTOFORNE.NRAUTOFORN
                                                 INNER JOIN PRODUTO   ON ITEMAUTF.CDPRODUTO  = PRODUTO.CDPRODUTO
                                  WHERE AUTOFORNE.IDSITUATUAAF IS NULL
                                    AND AUTOFORNE.IDAFFORALIM = 'N'
                                    AND AUTOFORNE.IDAUTOFORNEX = 'N'
                                    AND ITEMAUTF.DTENTRITMSOL BETWEEN V_DTINICIAL AND V_DTFINAL
                                  GROUP BY ITEMAUTF.CDFILDEST, ITEMAUTF.DTENTRITMSOL, PRODUTO.CDPRODESTO) JACOMP ON COMP.CDFILIAL   = JACOMP.CDFILIAL
                                                                                                                AND COMP.DTPROGENTR = JACOMP.DTENTRITMSOL
                                                                                                                AND COMP.CDPRODESTO = JACOMP.CDPRODESTO
                          WHERE PARASUPRI.CDFILIAL = NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL)
                            AND NVL(PARASUPRI.IDCONSPRSOL, 'N') = 'N'
                            AND COMP.CDFILIAL   = FILIAL.CDFILIAL
                            AND FILIAL.CDREGIAO = C_REGIAO.CDREGIAO
                            AND COMP.QTDECOMP-NVL(JACOMP.QTDECOMP/COMP.VRFATOCONV,0) > 0
                         HAVING SUM(COMP.QTDECOMP-NVL(JACOMP.QTDECOMP/COMP.VRFATOCONV,0)) <> 0

                         UNION ALL

                         SELECT SUM(COMP.QTDECOMP-NVL(JACOMP.QTDECOMP,0)) AS QTACOMPRAR
                           FROM PARASUPRI, FILIAL,
                                (SELECT ITEMSOLI.CDFILSOLI AS CDFILIAL, ITEMSOLI.DTPROGENTR, ITEMSOLI.CDPRODUTO,
                                        SUM(ITEMSOLI.QTSOLIPROD) AS QTDECOMP
                                   FROM ITEMSOLI
                                  WHERE ITEMSOLI.IDITMCONS = 'N'
                                    AND ITEMSOLI.DTPROGENTR BETWEEN V_DTINICIAL AND V_DTFINAL
                                    AND ITEMSOLI.CDPRODUTO = C_FORNECEDORES.CDPRODUTO
                                    AND NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S'
                                  GROUP BY ITEMSOLI.CDFILSOLI, ITEMSOLI.DTPROGENTR, ITEMSOLI.CDPRODUTO) COMP LEFT JOIN
                                (SELECT ITEMAUTF.CDFILDEST AS CDFILIAL, ITEMAUTF.DTENTRITMSOL, ITEMAUTF.CDPRODUTO,
                                        SUM(ITEMAUTF.QTPROGENTAF) AS QTDECOMP
                                   FROM ITEMAUTF INNER JOIN AUTOFORNE ON ITEMAUTF.CDFILDEST  = AUTOFORNE.CDFILDEST
                                                                     AND ITEMAUTF.CDFILLANC  = AUTOFORNE.CDFILLANC
                                                                     AND ITEMAUTF.NRAUTOFORN = AUTOFORNE.NRAUTOFORN
                                  WHERE AUTOFORNE.IDSITUATUAAF IS NULL
                                    AND AUTOFORNE.IDAFFORALIM = 'N'
                                    AND AUTOFORNE.IDAUTOFORNEX = 'N'
                                    AND ITEMAUTF.DTENTRITMSOL BETWEEN V_DTINICIAL AND V_DTFINAL
                                  GROUP BY ITEMAUTF.CDFILDEST, ITEMAUTF.DTENTRITMSOL, ITEMAUTF.CDPRODUTO) JACOMP ON COMP.CDFILIAL   = JACOMP.CDFILIAL
                                                                                                                AND COMP.DTPROGENTR = JACOMP.DTENTRITMSOL
                                                                                                                AND COMP.CDPRODUTO  = JACOMP.CDPRODUTO
                          WHERE PARASUPRI.CDFILIAL = NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL)
                            AND PARASUPRI.IDCONSPRSOL = 'S'
                            AND COMP.CDFILIAL = FILIAL.CDFILIAL
                            AND FILIAL.CDREGIAO = C_REGIAO.CDREGIAO
                            AND COMP.QTDECOMP-NVL(JACOMP.QTDECOMP,0) > 0
                         HAVING SUM(COMP.QTDECOMP-NVL(JACOMP.QTDECOMP,0)) <> 0);
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_QTACOMPRAR := 0;
            END;
         END IF;
         IF (V_CHAVE <> C_REGIAO.NRCOLEPRECO||C_FORNECEDORES.CDREGIAO||C_FORNECEDORES.CDMARCA||C_FORNECEDORES.CDMARCA||C_FORNECEDORES.CDFORNECED) THEN
            V_CHAVE := C_REGIAO.NRCOLEPRECO||C_FORNECEDORES.CDREGIAO||C_FORNECEDORES.CDMARCA||C_FORNECEDORES.CDMARCA||C_FORNECEDORES.CDFORNECED;
            IF P_EXIBEIPI = 'S' THEN
               SELECT NVL(SOMA, 0)
                 INTO V_VRIPI
                 FROM (SELECT SUM(IMPCOLET.VRIMPCOLETA) AS SOMA
                         FROM IMPCOLET, ITEMCOLE, PRODUTO
                        WHERE IMPCOLET.CDFILIAL    = ITEMCOLE.CDFILIAL
                          AND IMPCOLET.NRCOLEPRECO = ITEMCOLE.NRCOLEPRECO
                          AND IMPCOLET.CDMARCA     = ITEMCOLE.CDMARCA
                          AND IMPCOLET.CDREGIAO    = ITEMCOLE.CDREGIAO
                          AND IMPCOLET.CDFORNECED  = ITEMCOLE.CDFORNECED
                          AND IMPCOLET.CDPRODUTO   = ITEMCOLE.CDPRODUTO
                          AND IMPCOLET.NRCOLEPRECO = NVL(C_REGIAO.NRCOLEPRECO, IMPCOLET.NRCOLEPRECO)
                          AND IMPCOLET.CDREGIAO    = C_FORNECEDORES.CDREGIAO
                          AND IMPCOLET.CDFORNECED  = C_FORNECEDORES.CDFORNECED
                          AND IMPCOLET.CDIMPOSTO   = '10'
                          AND IMPCOLET.CDPRODUTO   = PRODUTO.CDPRODUTO
                          AND PRODUTO.CDARVPROD BETWEEN P_CDPRODINI AND RPAD(P_CDPRODFIM , 20, 'Z')
                          AND ITEMCOLE.DTINIVALITM >= V_DTINICIAL
                          AND ITEMCOLE.DTFINVALITM <= V_DTFINAL) A;
            END IF;
            IF P_EXIBEPGTO = 'S' THEN
               SELECT NVL(MAX(IDTPFORPGTFO), ' '), NVL(MAX(FORMAPGTO), ' ')
                 INTO V_IDTPFORPGTFO, V_FORMAPGTO
                 FROM (SELECT F.IDTPFORPGTFO,
                              DECODE (F.IDTPFORPGTFO, 'V', P.NMFORMPGTO || ' ' || TO_CHAR(PR.NRDIASPGTOFO) || ' ' || TO_CHAR(ROUND(PR.VRPERCPGTOFO, 2)),
                              'F', TO_CHAR(F.NRDIAPGFIXFO) || ' ' || TO_CHAR(ROUND(NRPARCPGTOFO, 2))) AS FORMAPGTO
                         FROM FORNECEDOR F, FORMPGTO P, PRAZOPGTFORN PR
                        WHERE F.CDFORNECED  = C_FORNECEDORES.CDFORNECED
                          AND F.CDFORMPGTO  = P.CDFORMPGTO (+)
                          AND F.CDFORNECED  = PR.CDFORNECED(+));
               SELECT NRPZOENTCOL
                 INTO V_NRPZOENTCOL
                 FROM (SELECT NVL(MAX(NRPZOENTCOL), '0') AS NRPZOENTCOL
                         FROM ITEMCOLE
                        WHERE CDREGIAO    = C_FORNECEDORES.CDREGIAO
                          AND CDFORNECED  = C_FORNECEDORES.CDFORNECED
                          AND NRCOLEPRECO = NVL(C_REGIAO.NRCOLEPRECO, NRCOLEPRECO));
            END IF;
         END IF;
         IF P_EXIBEREFE = 'A' THEN
            SELECT NVL(MIN(ITEMAUTF.VRPREUNIAF), 0)
              INTO V_VRCUSTOREFER
              FROM AUTOFORNE,
                   ITEMAUTF,
                   (SELECT MAX(ITEMAUTF.NRAUTOFORN)  AS NRAUTOFORN,
                           MAX(ITEMAUTF.DTPROGENTAF) AS DTPROGENTAF
                      FROM ITEMAUTF, FILIAL
                     WHERE FILIAL.CDREGIAO     = C_FORNECEDORES.CDREGIAO
                       AND ITEMAUTF.CDFILDEST  = FILIAL.CDFILIAL
                       AND ITEMAUTF.CDPRODUTO  = C_FORNECEDORES.CDPRODUTO) MAX_AF
             WHERE AUTOFORNE.CDFILDEST  = ITEMAUTF.CDFILDEST
               AND AUTOFORNE.NRAUTOFORN = ITEMAUTF.NRAUTOFORN
               AND ITEMAUTF.CDPRODUTO   = C_FORNECEDORES.CDPRODUTO
               AND ITEMAUTF.DTPROGENTAF = MAX_AF.DTPROGENTAF
               AND ITEMAUTF.NRAUTOFORN  = MAX_AF.NRAUTOFORN;
         ELSIF P_EXIBEREFE = 'C' THEN
            SELECT NVL(MIN(VRCUSTOREFER), 0)/C_FORNECEDORES.VRFATOCONV
              INTO V_VRCUSTOREFER
              FROM (SELECT CUSTO_PRODUTO(FILIAL.CDFILIAL, C_FORNECEDORES.CDPRODESTO, P_NRTIPOCUSTO, SYSDATE, SYSDATE) VRCUSTOREFER
                      FROM FILIAL
                     WHERE FILIAL.CDREGIAO = C_FORNECEDORES.CDREGIAO)
              WHERE VRCUSTOREFER > 0;
         END IF;
         IF (P_VRPERCENTACRES > 0) AND (V_VRCUSTOREFER > 0)THEN
            V_VRCUSTOREFER := V_VRCUSTOREFER * (1 + (P_VRPERCENTACRES / 100));
         END IF;
         OUT_RECORD.NRCOLEPRECO     := C_REGIAO.NRCOLEPRECO;
         OUT_RECORD.CDREGIAO        := C_FORNECEDORES.CDREGIAO;
         OUT_RECORD.NMREGIAO        := C_FORNECEDORES.NMREGIAO;
         OUT_RECORD.CDPRODUTO       := C_FORNECEDORES.CDPRODUTO;
         OUT_RECORD.CDARVPROD       := C_FORNECEDORES.CDARVPROD;
         OUT_RECORD.SGUNIDADE       := C_FORNECEDORES.SGUNIDADE;
         OUT_RECORD.NMPRODUTO       := C_FORNECEDORES.NMPRODUTO;
         OUT_RECORD.CDMARCA         := C_FORNECEDORES.CDMARCA;
         OUT_RECORD.NMMARCA         := C_FORNECEDORES.NMMARCA;
         OUT_RECORD.CDOPERADOR      := C_FORNECEDORES.CDOPERADOR;
         OUT_RECORD.NMOPERADOR      := C_FORNECEDORES.NMOPERADOR;
         OUT_RECORD.CDFORNECED      := C_FORNECEDORES.CDFORNECED;
         OUT_RECORD.NMFANTFORN      := C_FORNECEDORES.NMFANTFORN;
         OUT_RECORD.IDTPIJURFORN    := C_FORNECEDORES.IDTPIJURFORN;
         OUT_RECORD.NRINSJURFORN    := C_FORNECEDORES.NRINSJURFORN;
         OUT_RECORD.VRPRECUNIITM    := C_FORNECEDORES.VRPRECUNIITM;
         OUT_RECORD.VRPERDESITM     := C_FORNECEDORES.VRPERDESITM;
         OUT_RECORD.QTACOMPRAR      := V_QTACOMPRAR;
         OUT_RECORD.VRPRECOREAL     := C_FORNECEDORES.VRPRECOREAL;
         OUT_RECORD.VRTOTALITEMREAL := CASE NVL(V_QTACOMPRAR, 1)
                                          WHEN 0
                                          THEN 1
                                          ELSE NVL(V_QTACOMPRAR, 1)
                                       END*C_FORNECEDORES.VRPRECOREAL;
         OUT_RECORD.VRTOTALITEMDES  := CASE NVL(V_QTACOMPRAR, 1)
                                          WHEN 0
                                          THEN 1
                                          ELSE NVL(V_QTACOMPRAR, 1)
                                       END*C_FORNECEDORES.VRPRECUNIITM;
         IF C_FORNECEDORES.MIN_VRPRECUNIITM = C_FORNECEDORES.VRPRECUNIITM THEN
            OUT_RECORD.IDMENORPRECO := 'S';
         ELSE
            OUT_RECORD.IDMENORPRECO := 'N';
         END IF;
         OUT_RECORD.MIN_VRPRECUNIITM  := C_FORNECEDORES.MIN_VRPRECUNIITM;
         OUT_RECORD.VRIPI             := V_VRIPI;
         OUT_RECORD.IDTPFORPGTFO      := V_IDTPFORPGTFO;
         OUT_RECORD.FORMAPGTO         := V_FORMAPGTO;
         OUT_RECORD.NRPZOENTCOL       := V_NRPZOENTCOL;
         OUT_RECORD.DSOBSITMCOL       := C_FORNECEDORES.DSOBSITMCOL;
         OUT_RECORD.VRFRETEFORN       := C_FORNECEDORES.VRFRETEFORN;
         OUT_RECORD.VRPRECOESTOQ      := C_FORNECEDORES.VRPRECUNIITM/C_FORNECEDORES.VRFATOCONV;
         OUT_RECORD.VRFATOCONV        := C_FORNECEDORES.VRFATOCONV;
         OUT_RECORD.VRCUSTOREFER      := V_VRCUSTOREFER;

         IF ((V_VRCUSTOREFER = 0) OR (V_VRCUSTOREFER = C_FORNECEDORES.VRPRECOREAL)) THEN
            OUT_RECORD.VRVARIACUSTO   := 0;
         ELSE
            OUT_RECORD.VRVARIACUSTO   := (((C_FORNECEDORES.VRPRECOREAL / V_VRCUSTOREFER) - 1) * 100);            
         END IF;

         IF ((V_VRCUSTOREFER = 0) OR (V_VRCUSTOREFER = C_FORNECEDORES.MIN_VRPRECUNIITM)) THEN
            OUT_RECORD.MIN_VRVARIACUSTO   := 0;
         ELSE
            OUT_RECORD.MIN_VRVARIACUSTO   := (((C_FORNECEDORES.MIN_VRPRECUNIITM / V_VRCUSTOREFER) - 1) * 100);            
         END IF;

         OUT_RECORD.NRORG              := C_FORNECEDORES.NRORG;
         OUT_RECORD.MIN_VRPRECOREAL    := C_FORNECEDORES.MIN_VRPRECOREAL;
         PIPE ROW (OUT_RECORD);

         IF (V_CHAVEPRECO <> C_REGIAO.NRCOLEPRECO||C_FORNECEDORES.CDREGIAO||C_FORNECEDORES.CDPRODUTO||C_FORNECEDORES.CDMARCA) THEN
            V_CHAVEPRECO := C_REGIAO.NRCOLEPRECO||C_FORNECEDORES.CDREGIAO||C_FORNECEDORES.CDPRODUTO||C_FORNECEDORES.CDMARCA;

            IF ((C_FORNECEDORES.MIN_VRPRECUNIITM = C_FORNECEDORES.VRPRECUNIITM) AND
                (P_EXIBEMENORPREC = 'S')) THEN
              /*INICIO GRAVA FORNECEDOR FAKE*/
               OUT_RECORD.NRCOLEPRECO     := C_REGIAO.NRCOLEPRECO;
               OUT_RECORD.CDREGIAO        := C_FORNECEDORES.CDREGIAO;
               OUT_RECORD.NMREGIAO        := C_FORNECEDORES.NMREGIAO;
               OUT_RECORD.CDPRODUTO       := C_FORNECEDORES.CDPRODUTO;
               OUT_RECORD.CDARVPROD       := C_FORNECEDORES.CDARVPROD;
               OUT_RECORD.SGUNIDADE       := C_FORNECEDORES.SGUNIDADE;
               OUT_RECORD.NMPRODUTO       := C_FORNECEDORES.NMPRODUTO;
               OUT_RECORD.CDMARCA         := C_FORNECEDORES.CDMARCA;
               OUT_RECORD.NMMARCA         := C_FORNECEDORES.NMMARCA;
               OUT_RECORD.CDOPERADOR      := C_FORNECEDORES.CDOPERADOR;
               OUT_RECORD.NMOPERADOR      := C_FORNECEDORES.NMOPERADOR;
               OUT_RECORD.CDFORNECED      := '0';
               OUT_RECORD.NMFANTFORN      := 'A';
               OUT_RECORD.IDTPIJURFORN    := 'A';
               OUT_RECORD.NRINSJURFORN    := '0';
               OUT_RECORD.VRPRECUNIITM    := C_FORNECEDORES.MIN_VRPRECUNIITM;
               OUT_RECORD.VRPERDESITM     := C_FORNECEDORES.VRPERDESITM;
               OUT_RECORD.QTACOMPRAR      := V_QTACOMPRAR;
               OUT_RECORD.VRPRECOREAL     := C_FORNECEDORES.MIN_VRPRECOREAL;
               OUT_RECORD.VRTOTALITEMREAL := CASE NVL(V_QTACOMPRAR, 1)
                                                WHEN 0
                                                THEN 1
                                                ELSE NVL(V_QTACOMPRAR, 1)
                                             END*C_FORNECEDORES.MIN_VRPRECOREAL;
               OUT_RECORD.VRTOTALITEMDES  := CASE NVL(V_QTACOMPRAR, 1)
                                                WHEN 0
                                                THEN 1
                                                ELSE NVL(V_QTACOMPRAR, 1)
                                             END*C_FORNECEDORES.MIN_VRPRECUNIITM;
               IF C_FORNECEDORES.MIN_VRPRECUNIITM = C_FORNECEDORES.MIN_VRPRECUNIITM THEN
                  OUT_RECORD.IDMENORPRECO := 'S';
               ELSE
                  OUT_RECORD.IDMENORPRECO := 'N';
               END IF;
               OUT_RECORD.MIN_VRPRECUNIITM  := C_FORNECEDORES.MIN_VRPRECUNIITM;
               OUT_RECORD.VRIPI             := V_VRIPI;
               OUT_RECORD.IDTPFORPGTFO      := V_IDTPFORPGTFO;
               OUT_RECORD.FORMAPGTO         := V_FORMAPGTO;
               OUT_RECORD.NRPZOENTCOL       := V_NRPZOENTCOL;
               OUT_RECORD.DSOBSITMCOL       := C_FORNECEDORES.DSOBSITMCOL;
               OUT_RECORD.VRFRETEFORN       := C_FORNECEDORES.VRFRETEFORN;
               OUT_RECORD.VRPRECOESTOQ      := C_FORNECEDORES.MIN_VRPRECUNIITM/C_FORNECEDORES.VRFATOCONV;
               OUT_RECORD.VRFATOCONV        := C_FORNECEDORES.VRFATOCONV;
               OUT_RECORD.VRCUSTOREFER      := V_VRCUSTOREFER;
  
               IF ((V_VRCUSTOREFER = 0) OR (V_VRCUSTOREFER = C_FORNECEDORES.MIN_VRPRECOREAL)) THEN
                  OUT_RECORD.VRVARIACUSTO   := 0;
               ELSE
                  OUT_RECORD.VRVARIACUSTO   := (((C_FORNECEDORES.MIN_VRPRECOREAL / V_VRCUSTOREFER) - 1) * 100);                  
               END IF;

               IF ((V_VRCUSTOREFER = 0) OR (V_VRCUSTOREFER = C_FORNECEDORES.MIN_VRPRECUNIITM)) THEN
                  OUT_RECORD.MIN_VRVARIACUSTO   := 0;
               ELSE
                  OUT_RECORD.MIN_VRVARIACUSTO   := (((C_FORNECEDORES.MIN_VRPRECUNIITM / V_VRCUSTOREFER) - 1) * 100);                
               END IF;
  
               OUT_RECORD.NRORG              := C_FORNECEDORES.NRORG;
               OUT_RECORD.MIN_VRPRECOREAL    := C_FORNECEDORES.MIN_VRPRECOREAL;
               PIPE ROW (OUT_RECORD);
               /*FIM GRAVA FORNECEDOR FAKE*/
            END IF;
         END IF;
      END LOOP;
   END LOOP;
END;