DROP TYPE CALC_PREVCONS_OL_TABLE
/

DROP TYPE CALC_PREVCONS_OL_TYPE
/

CREATE TYPE CALC_PREVCONS_OL_TYPE AS OBJECT
  (CDFILIAL     VARCHAR2(4),
   NMFILIAL     VARCHAR2(30),
   CDREGIAO     VARCHAR2(3),
   CDOPERADOR   VARCHAR2(12),
   NMOPERADOR   VARCHAR2(40),
   CDPRODESTO   VARCHAR2(10),
   DTPROGENTR   DATE,
   DTPREVCONS   DATE,
   CDPERIENTR   VARCHAR2(2),
   IDTIPODIA    VARCHAR2(1),
   IDDIANUTIL   VARCHAR2(1),
   IDUTCALENDCMPGERACAOAF          VARCHAR2(1),
   QTPREVCONS   FLOAT
  )
/

CREATE TYPE CALC_PREVCONS_OL_TABLE AS TABLE OF CALC_PREVCONS_OL_TYPE
/

CREATE OR REPLACE FUNCTION CALC_PREVCONS_OL
                          (P_CDFILIOPELOG    IN ITEMAUTF.CDFILDEST%TYPE,
                           P_DTINICIAL       IN ITEMAUTF.DTPROGENTAF%TYPE,
                           P_DTFINAL         IN ITEMAUTF.DTPROGENTAF%TYPE,
                           P_CDPRODINIC      IN PRODUTO.CDARVPROD%TYPE,
                           P_CDPRODFIN       IN PRODUTO.CDARVPROD%TYPE,
                           P_CDOPERADOR      IN VARCHAR2,
                           P_CDREGIAO        IN VARCHAR2)
                          RETURN CALC_PREVCONS_OL_TABLE PIPELINED IS
   OUT_RECORD CALC_PREVCONS_OL_TYPE := CALC_PREVCONS_OL_TYPE (NULL, NULL, NULL, NULL,
                                                              NULL, NULL, NULL, NULL,
                                                              NULL, NULL, NULL, NULL, 0);
   V_CHAVE_CDARVLIMISEGPROD VARCHAR2(60) := '_';
   V_CHAVE_CDARVPERFILPROD  VARCHAR2(60) := '_';
   V_CHAVE_PARAMPROSUP      VARCHAR2(14) := '_';
   V_NRLIMISEGU             NUMERIC;
   V_DTPROGENTR             DATE;
   V_CDCOMPRADOR            VARCHAR2(12);
   V_NMCOMPRADOR            VARCHAR2(40);
   V_CHAVE_CDPRODESTO       VARCHAR2(10) := '_';
   V_COUNT_PARAMPRODSUP     NUMERIC;
   V_NMFILIAL               VARCHAR2(30);
   V_CDREGIAO               VARCHAR2(3);
   V_CDFILIAL               VARCHAR2(4) := '_';
   V_CDFORNOPELOG           VARCHAR2(21);
   V_CDPERIENTR             VARCHAR2(2);
   V_IDTIPODIA              VARCHAR2(1);
   V_IDDIANUTIL             VARCHAR2(1);
   V_IDUTCALENDCMPGERACAOAF VARCHAR2(1);
BEGIN
   SELECT MAX(NMOPERADOR)
     INTO V_NMCOMPRADOR
     FROM OPERADOR
    WHERE CDOPERADOR = P_CDOPERADOR;
   SELECT NVL(MAX(CDFORNOPELOG), 'W')
     INTO V_CDFORNOPELOG
     FROM FILIAL
    WHERE CDFILIAL = P_CDFILIOPELOG;
   FOR C_PREVIANECE IN (SELECT PREVCONS.QTPREVCONS,
                               PREVCONS.CDFILIAL, PRODUTO.CDARVPROD, PRODUTO.CDPRODESTO,
                               PREVCONS.DTPREVCONS,
                               (SELECT MAX(B.CDARVPROD) CDARVPERFILPROD
                                  FROM PERFILPROD A, PRODUTO B
                                 WHERE A.CDPRODUTO = B.CDPRODUTO
                                   AND A.CDFILIAL  = PREVCONS.CDFILIAL
                                   AND INSTR(PRODUTO.CDARVPROD, B.CDARVPROD) = 1) CDARVPERFILPROD,
                               (SELECT MAX(CDARVPROD)
                                  FROM LIMISEGPROD A, PRODUTO B
                                 WHERE (A.CDPRODUTO = B.CDPRODUTO)
                                   AND (A.CDFILIAL  = PREVCONS.CDFILIAL)
                                   AND (INSTR(PRODUTO.CDARVPROD, B.CDARVPROD) = 1)) CDARVLIMISEGPROD
                          FROM PREVCONS, PRODUTO
                         WHERE PREVCONS.CDPRODUTO  = PRODUTO.CDPRODUTO
                           AND PRODUTO.CDARVPROD            BETWEEN P_CDPRODINIC AND P_CDPRODFIN
                           AND PREVCONS.DTPREVCONS BETWEEN P_DTINICIAL AND P_DTFINAL+10
                           AND EXISTS (SELECT 1
                                         FROM TIPOOPEROPL
                                        WHERE CDFILIOPELOG = P_CDFILIOPELOG
                                          AND CDFILDEST    = PREVCONS.CDFILIAL)
                         ORDER BY  PREVCONS.CDFILIAL, CDARVLIMISEGPROD, PREVCONS.DTPREVCONS, CDARVPERFILPROD, PRODUTO.CDPRODESTO)
   LOOP
      IF V_CHAVE_PARAMPROSUP <> C_PREVIANECE.CDPRODESTO||C_PREVIANECE.CDFILIAL THEN
         V_CHAVE_PARAMPROSUP := C_PREVIANECE.CDPRODESTO||C_PREVIANECE.CDFILIAL;
         SELECT COUNT(1)
           INTO V_COUNT_PARAMPRODSUP
           FROM PARAMPRODSUP
          WHERE PARAMPRODSUP.CDPRODUTO    = C_PREVIANECE.CDPRODESTO
            AND PARAMPRODSUP.CDFILIAL     = C_PREVIANECE.CDFILIAL
            AND PARAMPRODSUP.CDFILIOPELOG = P_CDFILIOPELOG;
      END IF;
      IF V_CHAVE_CDPRODESTO <> C_PREVIANECE.CDPRODESTO THEN
         V_CHAVE_CDPRODESTO := C_PREVIANECE.CDPRODESTO;
         SELECT NVL(MAX(PRODCOMP.CDOPERADOR), 'W' )
           INTO V_CDCOMPRADOR
           FROM PRODCOMP
          WHERE PRODCOMP.CDPRODUTO = SUBSTR(C_PREVIANECE.CDPRODESTO, 1, LENGTH(CDPRODUTO))
            AND PRODCOMP.CDOPERADOR = P_CDOPERADOR;
      END IF;
      IF ((V_CDCOMPRADOR <> 'W') AND (V_COUNT_PARAMPRODSUP > 0)) THEN
         /*GRAVA LIMITE DE SEGURANCA DIFERENTE POR PRODUTO E FILIAL*/
         IF V_CHAVE_CDARVLIMISEGPROD <> C_PREVIANECE.CDFILIAL||C_PREVIANECE.CDARVLIMISEGPROD||TO_CHAR(C_PREVIANECE.DTPREVCONS, 'DD/MM/YYYY') THEN
            V_CHAVE_CDARVLIMISEGPROD := C_PREVIANECE.CDFILIAL||C_PREVIANECE.CDARVLIMISEGPROD||TO_CHAR(C_PREVIANECE.DTPREVCONS, 'DD/MM/YYYY');
            V_NRLIMISEGU := NVL(CARREGA_LIMISEGU_OL(C_PREVIANECE.CDFILIAL, C_PREVIANECE.CDARVPROD, C_PREVIANECE.DTPREVCONS, NULL, NULL, C_PREVIANECE.CDARVLIMISEGPROD), 0);
         END IF;
         /*GRAVA DATA DE ENTREGA DIFERENTE POR PRODUTO E FILIAL*/
         IF V_CHAVE_CDARVPERFILPROD <> C_PREVIANECE.CDFILIAL||C_PREVIANECE.CDARVPERFILPROD||TO_CHAR(V_NRLIMISEGU)||TO_CHAR(C_PREVIANECE.DTPREVCONS, 'DD/MM/YYYY') THEN
            V_CHAVE_CDARVPERFILPROD := C_PREVIANECE.CDFILIAL||C_PREVIANECE.CDARVPERFILPROD||TO_CHAR(V_NRLIMISEGU)||TO_CHAR(C_PREVIANECE.DTPREVCONS, 'DD/MM/YYYY');
            V_DTPROGENTR := CARREGA_PERIFILI_FUN(C_PREVIANECE.CDFILIAL, C_PREVIANECE.CDARVPROD, C_PREVIANECE.DTPREVCONS-V_NRLIMISEGU, C_PREVIANECE.CDARVPERFILPROD) ;
         END IF;
         IF V_CDFILIAL <> C_PREVIANECE.CDFILIAL THEN
            V_CDFILIAL := C_PREVIANECE.CDFILIAL;
            SELECT NMFILIAL, CDREGIAO
              INTO V_NMFILIAL, V_CDREGIAO
              FROM FILIAL
             WHERE CDFILIAL = C_PREVIANECE.CDFILIAL;

            SELECT MAX(REFORFIL.CDPERIENTR), MAX(PERIENTR.IDTIPODIA), MAX(PERIENTR.IDDIANUTIL),
                   NVL(MAX(REFORFIL.IDUTCALENDCMPGERACAOAF),'N')
              INTO V_CDPERIENTR, V_IDTIPODIA, V_IDDIANUTIL, V_IDUTCALENDCMPGERACAOAF
              FROM REFORFIL, PERIENTR
             WHERE REFORFIL.CDPERIENTR = PERIENTR.CDPERIENTR
               AND REFORFIL.CDFORNECED = V_CDFORNOPELOG
               AND REFORFIL.CDFILIAL   = C_PREVIANECE.CDFILIAL;
         END IF;
         OUT_RECORD.CDFILIAL     := NULL;
         OUT_RECORD.NMFILIAL     := NULL;
         OUT_RECORD.CDREGIAO     := NULL;
         OUT_RECORD.CDOPERADOR   := NULL;
         OUT_RECORD.NMOPERADOR   := NULL;
         OUT_RECORD.CDPRODESTO   := NULL;
         OUT_RECORD.DTPROGENTR   := NULL;
         OUT_RECORD.DTPREVCONS   := NULL;
         OUT_RECORD.QTPREVCONS   := 0;
         IF V_DTPROGENTR >= P_DTINICIAL AND V_DTPROGENTR <= P_DTFINAL THEN
            OUT_RECORD.CDFILIAL     := C_PREVIANECE.CDFILIAL;
            OUT_RECORD.NMFILIAL     := V_NMFILIAL;
            OUT_RECORD.CDREGIAO     := V_CDREGIAO;
            OUT_RECORD.CDOPERADOR   := V_CDCOMPRADOR;
            OUT_RECORD.NMOPERADOR   := V_NMCOMPRADOR;
            OUT_RECORD.CDPRODESTO   := C_PREVIANECE.CDPRODESTO;
            OUT_RECORD.DTPROGENTR   := V_DTPROGENTR;
            OUT_RECORD.DTPREVCONS   := C_PREVIANECE.DTPREVCONS;
            OUT_RECORD.QTPREVCONS   := C_PREVIANECE.QTPREVCONS;

            OUT_RECORD.CDPERIENTR   := V_CDPERIENTR;
            OUT_RECORD.IDTIPODIA    := V_IDTIPODIA;
            OUT_RECORD.IDDIANUTIL   := V_IDDIANUTIL;
            OUT_RECORD.IDUTCALENDCMPGERACAOAF   := V_IDUTCALENDCMPGERACAOAF;

            PIPE ROW (OUT_RECORD);
         END IF;
      END IF;
   END LOOP;
   RETURN;
END;
/

DROP TYPE CALC_PREVIANECE_OL_TABLE
/

DROP TYPE CALC_PREVIANECE_OL_TYPE
/

CREATE TYPE CALC_PREVIANECE_OL_TYPE AS OBJECT
  (CDFILIALOL     VARCHAR2(4),
   NMFILIALOL     VARCHAR2(30),
   CDREGIAO       VARCHAR2(3),
   NMREGIAO       VARCHAR2(30),
   CDOPERADOR     VARCHAR2(12),
   NMOPERADOR     VARCHAR2(40),
   CDARVPROD      VARCHAR2(20),
   NMPRODUTO      VARCHAR2(50),
   QTSOLIPROD     FLOAT,
   DTPROGENTAF    DATE,
   CDFILDEST      VARCHAR2(4),
   NMFILDEST      VARCHAR2(30),
   QTPROGENTAF    FLOAT,
   DTUTILIZA      DATE,
   SGUNIDADE      VARCHAR2(10),
   CDPRARVORIG    VARCHAR2(10),
   CDMARCA        VARCHAR2(5),
   CDPRODARVOL    VARCHAR2(10),
   CDPRODESTO     VARCHAR2(10),
   NRLIMISEGU     FLOAT,
   VRARREDCMP     FLOAT,
   CDARVPRODORIG  VARCHAR2(20)
  )
/

CREATE TYPE CALC_PREVIANECE_OL_TABLE AS TABLE OF CALC_PREVIANECE_OL_TYPE
/

CREATE OR REPLACE FUNCTION CALC_PREVIANECE_OL
                          (P_CDFILIOPELOG    IN ITEMAUTF.CDFILDEST%TYPE,
                           P_DTINICIAL       IN ITEMAUTF.DTPROGENTAF%TYPE,
                           P_DTFINAL         IN ITEMAUTF.DTPROGENTAF%TYPE,
                           P_CDPRODINIC      IN PRODUTO.CDARVPROD%TYPE,
                           P_CDPRODFIN       IN PRODUTO.CDARVPROD%TYPE,
                           P_CDOPERADOR      IN VARCHAR2,
                           P_CDREGIAO        IN VARCHAR2,
                           P_TIPOCONSULTA    IN VARCHAR2,
                           P_DTINIVALITM     IN ITEMAUTF.DTPROGENTAF%TYPE,
                           P_DTFINVALITM     IN ITEMAUTF.DTPROGENTAF%TYPE)
                          RETURN CALC_PREVIANECE_OL_TABLE PIPELINED IS
   OUT_RECORD CALC_PREVIANECE_OL_TYPE := CALC_PREVIANECE_OL_TYPE (NULL, NULL, NULL, NULL, NULL,
                                                                  NULL, NULL, NULL, 0, NULL, NULL,
                                                                  NULL, 0, NULL, NULL, NULL, NULL,
                                                                  NULL, NULL, 0, 0, NULL);
   V_CDFORNOPELOG    VARCHAR2(21);
   V_IDTIPOAPUR      VARCHAR2(1);
   V_CDPRODARVOL     VARCHAR2(10);
   V_CDPRARVORIG     VARCHAR2(10);
   V_PRECO           FLOAT;
   V_CDFORNECED      VARCHAR2(21);
   V_TIPPART         VARCHAR2(1);
   V_CDMARCA         VARCHAR2(5);
   V_NMFILIALOL      VARCHAR2(30) := '';
   V_CDREGIAO        VARCHAR2(3)  := '';
   V_NMREGIAO        VARCHAR2(30) := '';
   V_VRFATOCONV      FLOAT        := 0;
   V_CDARVPROD       VARCHAR2(20);
   V_CDARVPRODORIG   VARCHAR2(20);
   V_NMPRODUTO       VARCHAR2(50);
   V_SGUNIDADE       VARCHAR2(10);
   V_IDUTPRODPREF    VARCHAR2(1);
   V_CDFILIAL        VARCHAR2(4)  := '_';
   V_CDPRODPREF      VARCHAR2(10) := '';
   V_DTINICIAL       DATE;
   V_DTFINAL         DATE;
   V_NRLIMISEGU      FLOAT := 0;
   V_VRARREDCMP      FLOAT := 0;
   V_QTSOLIPROD      FLOAT := 0;
   V_QTARRED         FLOAT := 0;
   V_QTPROGENTAF     FLOAT := 0;
   V_CDPRODINIC      VARCHAR2(20) := NULL;
   V_CDPRODFIN       VARCHAR2(20) := NULL;
   V_CDFILCENTCMP    VARCHAR2(4)  := NULL;
   V_CDMARCAPADRAO   VARCHAR2(5)  := NULL;
   V_CDMARCAPROD     VARCHAR2(5)  := NULL;
   V_MELHORMARCA     VARCHAR2(5)  := NULL;
   V_ITEM_CDPRODUTO  PRODUTO.CDPRODUTO%TYPE;
   V_ITEM_CDMARCA    MARCA.CDMARCA%TYPE;
   V_CHAVE           VARCHAR2(100)  := '_';
   V_CHAVE_PRODUTO   VARCHAR2(100)  := '_';
   V_IDDESCONSILIMCALCMP   PARASUPRI.IDDESCONSILIMCALCMP%TYPE;

BEGIN

   SELECT
      NVL(MAX(PARASUPRI.IDDESCONSILIMCALCMP), 'N')
   INTO
      V_IDDESCONSILIMCALCMP  /*Realiza o Calculo da Necessidade de Compras Desconsiderando o Limite de Seguranca e o Calendario de Compras da Filial*/
   FROM
      PARASUPRI, FILIAL
   WHERE
      PARASUPRI.CDFILIAL = NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL)
   AND   
      FILIAL.CDFILIAL    = P_CDFILIOPELOG;

   IF ((P_TIPOCONSULTA = '3') OR  (P_TIPOCONSULTA = '2')) THEN
      SELECT MIN(PRODESTO.CDARVPROD), MAX(PRODESTO.CDARVPROD)
        INTO V_CDPRODINIC, V_CDPRODFIN
        FROM RELACPRODOL, PRODUTO PRODUTOOL, PRODUTO PRODUTORIG, PRODUTO PRODESTO
       WHERE RELACPRODOL.CDPRODARVOL = PRODUTOOL.CDPRODUTO
         AND RELACPRODOL.CDPRARVORIG = PRODUTORIG.CDPRODUTO
         AND PRODUTORIG.CDPRODESTO   =  PRODESTO.CDPRODUTO
         AND PRODUTOOL.CDARVPROD BETWEEN P_CDPRODINIC AND P_CDPRODFIN;

      SELECT NVL(MAX(IDTIPOAPUR), '0'), MAX(FILIAL.CDFORNOPELOG), MAX(FILIAL.NMFILIAL),
             MAX(FILIAL.CDREGIAO), MAX(REGIAO.NMREGIAO), NVL(MAX(FILIAL.CDFILCENTCMP), MAX(FILIAL.CDFILIAL)), MAX(PARASUPRI.CDMARCA)
        INTO V_IDTIPOAPUR, V_CDFORNOPELOG, V_NMFILIALOL,
             V_CDREGIAO, V_NMREGIAO, V_CDFILCENTCMP, V_CDMARCAPADRAO
        FROM PARASUPRI, FILIAL, REGIAO
       WHERE PARASUPRI.CDFILIAL = NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL)
         AND FILIAL.CDFILIAL    = P_CDFILIOPELOG
         AND FILIAL.CDREGIAO    = REGIAO.CDREGIAO;

      FOR C_PREVIANECE IN (SELECT SUM(QTPREVCONS) QTPREVCONS, CDPRODESTO, CDFILIAL,
                                  CARREGA_PERIFORN_FUN(CDFILIAL, V_CDFORNOPELOG, DTPROGENTR, V_IDDESCONSILIMCALCMP, CDPRODESTO, CDPERIENTR,
                                                       IDTIPODIA, IDDIANUTIL, IDUTCALENDCMPGERACAOAF) DTPROGENTR,
                                  MIN(DTPREVCONS) DTUTILIZA, NMFILIAL, CDREGIAO, CDOPERADOR, NMOPERADOR
                             FROM (SELECT QTPREVCONS, CDPRODESTO, CDFILIAL, NMFILIAL, DTPROGENTR,
                                          DTPREVCONS, CDREGIAO, CDOPERADOR, NMOPERADOR, CDPERIENTR,
                                                       IDTIPODIA, IDDIANUTIL, IDUTCALENDCMPGERACAOAF
                                     FROM TABLE (CALC_PREVCONS_OL(P_CDFILIOPELOG, P_DTINICIAL, P_DTFINAL,
                                                 V_CDPRODINIC, V_CDPRODFIN, P_CDOPERADOR, P_CDREGIAO)))
                            GROUP BY CDPRODESTO, CDFILIAL, CARREGA_PERIFORN_FUN(CDFILIAL, V_CDFORNOPELOG, DTPROGENTR, V_IDDESCONSILIMCALCMP,
                                                 CDPRODESTO, CDPERIENTR, IDTIPODIA, IDDIANUTIL, IDUTCALENDCMPGERACAOAF),
                                     NMFILIAL, CDREGIAO, CDOPERADOR, NMOPERADOR
                            ORDER BY CDPRODESTO, CDREGIAO, CDFILIAL)
      LOOP
         SELECT MAX(CDARVPROD)
           INTO V_CDARVPRODORIG
           FROM PRODUTO
          WHERE CDPRODUTO = C_PREVIANECE.CDPRODESTO;
         IF V_CDFILIAL <> C_PREVIANECE.CDFILIAL THEN
            V_CDFILIAL := C_PREVIANECE.CDFILIAL;
            SELECT NVL(MAX(IDUTPRODPREF), 'N')
              INTO V_IDUTPRODPREF
              FROM PARCMPSUP
             WHERE CDFILIAL = C_PREVIANECE.CDFILIAL;
         END IF;
         V_CDPRODPREF := '';
         IF V_IDUTPRODPREF = 'S' THEN
             SELECT MAX(CDPRODPREF)
               INTO V_CDPRODPREF
               FROM PRODPREFMED
              WHERE CDFILIAL  = C_PREVIANECE.CDFILIAL
                AND CDPRODUTO = C_PREVIANECE.CDPRODESTO;
         END IF;
         OUT_RECORD.CDFILIALOL     := '';
         OUT_RECORD.NMFILIALOL     := '';
         OUT_RECORD.CDREGIAO       := '';
         OUT_RECORD.NMREGIAO       := '';
         OUT_RECORD.CDOPERADOR     := '';
         OUT_RECORD.NMOPERADOR     := '';
         OUT_RECORD.CDARVPROD      := '';
         OUT_RECORD.NMPRODUTO      := '';
         OUT_RECORD.QTSOLIPROD     := 0;
         OUT_RECORD.DTPROGENTAF    := '';
         OUT_RECORD.CDFILDEST      := '';
         OUT_RECORD.NMFILDEST      := '';
         OUT_RECORD.QTPROGENTAF    := 0;
         OUT_RECORD.DTUTILIZA      := '';
         OUT_RECORD.SGUNIDADE      := '';
         OUT_RECORD.CDPRARVORIG    := '';
         OUT_RECORD.CDMARCA        := '';
         OUT_RECORD.CDPRODARVOL    := '';
         OUT_RECORD.CDPRODESTO     := '';
         OUT_RECORD.NRLIMISEGU     := 0;
         IF V_CHAVE <> C_PREVIANECE.CDPRODESTO||C_PREVIANECE.CDREGIAO THEN
            V_CHAVE := C_PREVIANECE.CDPRODESTO||C_PREVIANECE.CDREGIAO;
            V_ITEM_CDPRODUTO  := NULL;
            V_ITEM_CDMARCA    := NULL;
            FOR C_ITEM IN(SELECT ITEMCOLE.CDMARCA,
                                 PRODUTO.CDPRODUTO,


                                 CASE V_IDTIPOAPUR
                                    WHEN '0'
                                    THEN ITEMCOLE.VRPRECUNIITM*(CASE MOD(PRODUTO.VRFATOCONV, CASE NVL(PRODUTO.VRARREDCMP, 1)
                                                                                                                        WHEN 0
                                                                                                                        THEN 1
                                                                                                                        ELSE NVL(PRODUTO.VRARREDCMP, 1)
                                                                                                                     END)
                                                                    WHEN 0
                                                                    THEN PRODUTO.VRFATOCONV
                                                                    ELSE CEIL((PRODUTO.VRFATOCONV) / CASE NVL(PRODUTO.VRARREDCMP, 1)
                                                                                                                                WHEN 0
                                                                                                                                THEN 1
                                                                                                                                ELSE NVL(PRODUTO.VRARREDCMP, 1)
                                                                                                                             END)*CASE NVL(PRODUTO.VRARREDCMP, 1)
                                                                                                                                     WHEN 0
                                                                                                                                     THEN 1
                                                                                                                                     ELSE NVL(PRODUTO.VRARREDCMP, 1)
                                                                                                                                  END
                                                                END)
                                    ELSE (CASE V_IDTIPOAPUR
                                             WHEN '1'
                                             THEN ITEMCOLE.VRPRECECOITM*(CASE MOD(PRODUTO.VRFATOCONV, CASE NVL(PRODUTO.VRARREDCMP, 1)
                                                                                                                                 WHEN 0
                                                                                                                                 THEN 1
                                                                                                                                 ELSE NVL(PRODUTO.VRARREDCMP, 1)
                                                                                                                              END)
                                                                            WHEN 0
                                                                            THEN PRODUTO.VRFATOCONV
                                                                            ELSE CEIL((PRODUTO.VRFATOCONV) / CASE NVL(PRODUTO.VRARREDCMP, 1)
                                                                                                                                        WHEN 0
                                                                                                                                        THEN 1
                                                                                                                                        ELSE NVL(PRODUTO.VRARREDCMP, 1)
                                                                                                                                     END)*CASE NVL(PRODUTO.VRARREDCMP, 1)
                                                                                                                                             WHEN 0
                                                                                                                                             THEN 1
                                                                                                                                             ELSE NVL(PRODUTO.VRARREDCMP, 1)
                                                                                                                                          END
                                                                         END)
                                             ELSE ITEMCOLE.VRPRECOITMPI*(CASE MOD(PRODUTO.VRFATOCONV, CASE NVL(PRODUTO.VRARREDCMP, 1)
                                                                                                                                  WHEN 0
                                                                                                                                  THEN 1
                                                                                                                                  ELSE NVL(PRODUTO.VRARREDCMP, 1)
                                                                                                                               END)
                                                                            WHEN 0
                                                                            THEN PRODUTO.VRFATOCONV
                                                                            ELSE CEIL((PRODUTO.VRFATOCONV) / CASE NVL(PRODUTO.VRARREDCMP, 1)
                                                                                                                                        WHEN 0
                                                                                                                                        THEN 1
                                                                                                                                        ELSE NVL(PRODUTO.VRARREDCMP, 1)
                                                                                                                                     END)*CASE NVL(PRODUTO.VRARREDCMP, 1)
                                                                                                                                             WHEN 0
                                                                                                                                             THEN 1
                                                                                                                                             ELSE NVL(PRODUTO.VRARREDCMP, 1)
                                                                                                                                          END
                                                                         END)
                                          END)
                                  END PRECO, ITEMCOLE.CDFORNECED
                            FROM ITEMCOLE, COLETAPR, RELACPRODOL, PRODUTO, FORNECEDOR
                           WHERE COLETAPR.CDFILIAL     = ITEMCOLE.CDFILIAL
                             AND COLETAPR.NRCOLEPRECO  = ITEMCOLE.NRCOLEPRECO
                             AND COLETAPR.CDOPERADOR   = C_PREVIANECE.CDOPERADOR
                             AND NVL(COLETAPR.IDSITUCOLETA, 'C') = 'C'
                             AND ITEMCOLE.CDFORNECED   = V_CDFORNOPELOG
                             AND FORNECEDOR.CDFORNECED = V_CDFORNOPELOG
                             AND ITEMCOLE.CDPRODUTO    = RELACPRODOL.CDPRARVORIG(+)
                             AND ITEMCOLE.CDMARCA      = RELACPRODOL.CDMARCA(+)
                             AND ITEMCOLE.CDPRODUTO    = PRODUTO.CDPRODUTO
                             AND ITEMCOLE.CDPRODUTO    = NVL(V_CDPRODPREF, ITEMCOLE.CDPRODUTO)
                             AND ITEMCOLE.CDREGIAO     = C_PREVIANECE.CDREGIAO
                             AND PRODUTO.CDPRODESTO    = C_PREVIANECE.CDPRODESTO
                             AND NVL(ITEMCOLE.VRPRECUNIITM, 0) > 0
                             AND ITEMCOLE.DTINIVALITM BETWEEN CASE
                                                                 WHEN ITEMCOLE.DTINIVALITM < TO_DATE('01/'||TO_CHAR(P_DTINIVALITM, 'MM/YYYY'), 'DD/MM/YYYY')
                                                                 THEN ITEMCOLE.DTINIVALITM
                                                                 ELSE TO_DATE('01/'||TO_CHAR(P_DTINIVALITM, 'MM/YYYY'), 'DD/MM/YYYY')
                                                              END AND LAST_DAY(P_DTFINVALITM)
                             AND ITEMCOLE.DTFINVALITM BETWEEN TO_DATE('01/'||TO_CHAR(P_DTINIVALITM, 'MM/YYYY'), 'DD/MM/YYYY')
                                                          AND CASE
                                                                 WHEN ITEMCOLE.DTFINVALITM > LAST_DAY(P_DTFINVALITM)
                                                                 THEN ITEMCOLE.DTFINVALITM
                                                                 ELSE LAST_DAY(P_DTFINVALITM)
                                                              END
                           ORDER BY NVL(LENGTH(RELACPRODOL.CDPRODARVOL), 1) DESC, ITEMCOLE.DTFINVALITM DESC,
                                    PRECO)
            LOOP
                V_ITEM_CDPRODUTO  := C_ITEM.CDPRODUTO;
                V_ITEM_CDMARCA    := C_ITEM.CDMARCA;

            EXIT;
            END LOOP;
         END IF;

         IF LENGTH(V_ITEM_CDPRODUTO) <> 0 THEN
            SELECT MAX(PRODUTO.CDARVPROD), MAX(PRODUTO.NMPRODUTO), MAX(PRODUTO.SGUNIDADE), MAX(RELACPRODOL.CDPRODARVOL)
              INTO V_CDARVPROD, V_NMPRODUTO, V_SGUNIDADE, V_CDPRODARVOL
              FROM PRODUTO, RELACPRODOL
             WHERE RELACPRODOL.CDPRODARVOL = PRODUTO.CDPRODUTO
               AND RELACPRODOL.CDPRARVORIG = V_ITEM_CDPRODUTO
               AND RELACPRODOL.CDMARCA     = V_ITEM_CDMARCA;

            IF V_CDARVPROD IS NULL THEN

               SELECT MAX(PRODUTO.CDARVPROD), MAX(PRODUTO.NMPRODUTO), MAX(PRODUTO.SGUNIDADE), MAX(RELACPRODOL.CDPRODARVOL)
                 INTO V_CDARVPROD, V_NMPRODUTO, V_SGUNIDADE, V_CDPRODARVOL
                 FROM PRODUTO, RELACPRODOL
                WHERE RELACPRODOL.CDPRODARVOL = PRODUTO.CDPRODUTO
                  AND RELACPRODOL.CDPRARVORIG = V_ITEM_CDPRODUTO
                  AND RELACPRODOL.CDMARCA     = V_CDMARCAPADRAO
                  AND NOT EXISTS (SELECT /*+ FIRST_ROWS(1) */
                                         1
                                    FROM PARTFILI
                                   WHERE PARTFILI.CDFILIAL  = C_PREVIANECE.CDFILIAL
                                     AND PARTFILI.CDPRODUTO = V_ITEM_CDPRODUTO
                                     AND PARTFILI.CDMARCA   <> V_CDMARCAPADRAO
                                     AND PARTFILI.CDTIPPART IN ('1', '2'));
            END IF;

            IF V_CDARVPROD IS NULL THEN
               SELECT MAX(PRODUTO.CDARVPROD), MAX(PRODUTO.NMPRODUTO), MAX(PRODUTO.SGUNIDADE), MAX(V_ITEM_CDPRODUTO)
                 INTO V_CDARVPROD, V_NMPRODUTO, V_SGUNIDADE, V_CDPRODARVOL
                 FROM PRODUTO
                WHERE CDPRODUTO = V_ITEM_CDPRODUTO;
            END IF;

            SELECT MAX(VRFATOCONV), MAX(CDARVPROD), NVL(MAX(V_VRARREDCMP), 0)
              INTO V_VRFATOCONV, V_CDARVPRODORIG, V_VRARREDCMP
              FROM PRODUTO
             WHERE CDPRODUTO = V_ITEM_CDPRODUTO;
            IF V_CHAVE_PRODUTO <> V_ITEM_CDPRODUTO THEN
               V_CHAVE_PRODUTO := V_ITEM_CDPRODUTO;
               IF V_CDMARCAPADRAO = V_ITEM_CDMARCA THEN /* VERIFICA SE O PRODUTO ESTA RELACIONADO COMO MARCA PADRAO. Sol.168559 */
                  /* ESCOLHE O MELHOR PRECO DA COTACAO */
                  SELECT MAX(CDMARCA)
                    INTO V_MELHORMARCA
                    FROM (SELECT PRODFILCOT.CDMARCA
                            FROM (SELECT FILIAL.CDFILIAL,
                                         PRODUTO.CDPRODESTO,
                                         PRODUTO.CDPRODUTO,
                                         PRODUTO.VRFATOCONV,
                                         ITEMCOLE.CDMARCA,
                                         ITEMCOLE.CDFORNECED,
                                         ITEMCOLE.VRPRECUNIITM,
                                         ITEMCOLE.VRPRECECOITM,
                                         ITEMCOLE.VRPRECOITMPI,
                                         ITEMCOLE.IDITMLISPREC
                                    FROM ITEMCOLE,
                                         FILIAL,
                                         PRODUTO
                                   WHERE ITEMCOLE.CDFILIAL     = V_CDFILCENTCMP  AND
                                         ITEMCOLE.CDFORNECED   = ITEMCOLE.CDFORNECED AND
                                         FILIAL.CDFILIAL       = P_CDFILIOPELOG  AND
                                         ITEMCOLE.DTINIVALITM BETWEEN CASE
                                                                         WHEN ITEMCOLE.DTINIVALITM < TO_DATE('01/'||TO_CHAR(P_DTINIVALITM, 'MM/YYYY'), 'DD/MM/YYYY')
                                                                         THEN ITEMCOLE.DTINIVALITM
                                                                         ELSE TO_DATE('01/'||TO_CHAR(P_DTINIVALITM, 'MM/YYYY'), 'DD/MM/YYYY')
                                                                      END AND LAST_DAY(P_DTFINVALITM) AND
                                         ITEMCOLE.DTFINVALITM BETWEEN TO_DATE('01/'||TO_CHAR(P_DTINIVALITM, 'MM/YYYY'), 'DD/MM/YYYY')
                                                                  AND CASE
                                                                         WHEN ITEMCOLE.DTFINVALITM > LAST_DAY(P_DTFINVALITM)
                                                                         THEN ITEMCOLE.DTFINVALITM
                                                                         ELSE LAST_DAY(P_DTFINVALITM)
                                                                      END AND
                                         PRODUTO.CDPRODUTO     = V_ITEM_CDPRODUTO AND
                                         ITEMCOLE.CDREGIAO     = FILIAL.CDREGIAO AND
                                         ITEMCOLE.CDPRODUTO    = PRODUTO.CDPRODUTO AND
                                         ITEMCOLE.VRPRECUNIITM > 0) PRODFILCOT,
                                 PARASUPRI,
                                 MARCA
                           WHERE PARASUPRI.CDFILIAL    = V_CDFILCENTCMP  AND
                                 PRODFILCOT.CDMARCA    = MARCA.CDMARCA
                           ORDER BY
                              DECODE (PARASUPRI.IDTIPOAPUR,
                                      NULL, PRODFILCOT.VRPRECUNIITM,
                                      '1', PRODFILCOT.VRPRECECOITM,
                                      PRODFILCOT.VRPRECOITMPI) / PRODFILCOT.VRFATOCONV) /* COLOCANDO O PRECO NA MESMA UNIDADE PARA FAZER A ORDENACAO... */
                   WHERE ROWNUM = 1;
                  V_CDMARCAPROD := V_MELHORMARCA;
               ELSE
                  V_CDMARCAPROD := V_ITEM_CDMARCA;
               END IF;
            END IF;
            OUT_RECORD.CDFILIALOL  := P_CDFILIOPELOG;
            OUT_RECORD.NMFILIALOL  := V_NMFILIALOL;
            OUT_RECORD.CDREGIAO    := V_CDREGIAO;
            OUT_RECORD.NMREGIAO    := V_NMREGIAO;
            OUT_RECORD.CDOPERADOR  := C_PREVIANECE.CDOPERADOR;
            OUT_RECORD.NMOPERADOR  := C_PREVIANECE.NMOPERADOR;
            OUT_RECORD.CDARVPROD   := V_CDARVPROD;
            OUT_RECORD.NMPRODUTO   := V_NMPRODUTO;
            OUT_RECORD.QTSOLIPROD  := V_QTSOLIPROD;
            OUT_RECORD.SGUNIDADE   := V_SGUNIDADE;
            OUT_RECORD.DTPROGENTAF := C_PREVIANECE.DTPROGENTR;
            OUT_RECORD.CDFILDEST   := C_PREVIANECE.CDFILIAL;
            OUT_RECORD.NMFILDEST   := C_PREVIANECE.NMFILIAL;
            OUT_RECORD.QTPROGENTAF := C_PREVIANECE.QTPREVCONS/V_VRFATOCONV;
            OUT_RECORD.DTUTILIZA   := C_PREVIANECE.DTUTILIZA;
            OUT_RECORD.CDPRARVORIG := V_ITEM_CDPRODUTO;
            OUT_RECORD.CDMARCA     := V_CDMARCAPROD;
            OUT_RECORD.CDPRODARVOL := V_CDPRODARVOL;
            OUT_RECORD.CDPRODESTO  := C_PREVIANECE.CDPRODESTO;
            OUT_RECORD.NRLIMISEGU  := V_NRLIMISEGU;
            OUT_RECORD.VRARREDCMP  := V_VRARREDCMP;
            OUT_RECORD.CDARVPRODORIG := V_CDARVPRODORIG;
            PIPE ROW (OUT_RECORD);
         END IF;
      END LOOP;
   END IF;
   RETURN;
END;
/