CREATE OR REPLACE
PROCEDURE INCLUI_PEDIDO_OL (
    P_DTINICIAL    IN DATE,
    P_DTFINAL      IN DATE,
    P_PRODINI      IN PRODUTO.CDARVPROD%TYPE,
    P_PRODFIN      IN PRODUTO.CDARVPROD%TYPE,
    P_CDFILLANC    IN FILIAL.CDFILIAL%TYPE,
    P_CDREGIAO     IN VARCHAR2,
    P_CDGRUPFILI   IN VARCHAR2,
    P_CDOPERADOR   IN OPERADOR.CDOPERADOR%TYPE,
    P_CDGRUPPROD   IN PRSUBGRPROD.CDGRUPPROD%TYPE,
    P_CDSUBGRPROD  IN VARCHAR2,
    P_ROWSAFFECT  OUT VARCHAR2,
    P_CDFATPRECO   IN FATORPRECO.CDFATPRECO%TYPE,
    P_EXTRA        IN VARCHAR2 DEFAULT 'T',
    P_CDLOTENVITOL IN VARCHAR2 DEFAULT NULL
    )
IS
   V_EMITENTE     VARCHAR2(4);
   V_PRODINI      VARCHAR(30);
   V_PRODFIN      VARCHAR(30);
   V_LISTA_FILIAL VARCHAR2(20);
   V_NRPEDEXOL    VARCHAR2(20);
   V_TPRODUTO          CHAR(1);
   V_TREGIAO           CHAR(1);
   V_TGRUPFILI         CHAR(1);
   V_ITEM_CONSOLIDADO  CHAR(1);
   V_IDTIPEMIT         CHAR(1);
   W_T                 CHAR(1):= 'T';
   W_A                 CHAR(1):= 'A';
   W_N                 CHAR(1):= 'N';
   W_S                 CHAR(1):= 'S';
   W_UM           INT := 1;
   W_ZERO         INT := 0;
   TYPE CURTYPE   IS REF CURSOR;
   C_EMBALAGEM    CURTYPE;
   V_QTDERESTANTE    FLOAT;
   V_QTDEPRODUTO     FLOAT;
   V_CONTADOR        FLOAT;
   V_AUXQTDERESTANTE FLOAT;
   V_CDFILLANC       FILIAL.CDFILIAL%TYPE;
   V_CDEMPRESA       EMPRESA.CDEMPRESA%TYPE;
   V_MARCA           MARCA.CDMARCA%TYPE;
   V_MARCA1          MARCA.CDMARCA%TYPE;
   V_EMBALAGEM_CDPRODUTO  PRODUTO.CDPRODUTO%TYPE;
   V_EMBALAGEM_CDARVPROD  PRODUTO.CDARVPROD%TYPE;
   V_EMBALAGEM_VRFATOCONV PRODUTO.VRFATOCONV%TYPE;
   V_EMBALAGEM_VRARREDCMP PRODUTO.VRARREDCMP%TYPE;
   V_EMBALAGEM_CDMARCA    MARCA.CDMARCA%TYPE;
   V_PRXLOG          VARCHAR2(20);
   V_EMBALAGEM_ROWNUM          FLOAT := 0;
   V_EMBALAGEM_CONTADOR        FLOAT := 0;
   V_EMBALAGEM_VRARREDCMP1     FLOAT := 0;
   V_CDPRODARVOL         RELACPRODOL.CDPRODARVOL%TYPE;
   V_NRDIAEMBARQUE       DATAEMBARQUEOL.NRDIAEMBARQUE%TYPE; /*MAIOR VALOR DIAS DE EMBARQUE DO OL PARA A FILIAL DESTINO DO PEDIDO*/
   V_QTSOLIPROD          ITEMSOLI.QTSOLIPROD%TYPE;
   V_CHAVE               VARCHAR2(20) := '_';
   V_CHAVE2              VARCHAR2(60) := '_';
   V_CHAVE3              VARCHAR2(60) := '_';
   V_IDCALCPRECFAT       PARAMPEDIDO.IDCALCPRECFAT%TYPE;
   V_IDPEDEXOLEXTR       PEDIDOEXOL.IDPEDEXOLEXTR%TYPE;
   V_DTPROGEMBARQ        ITEMPEDEXOL.DTPROGEMBARQ%TYPE;
   V_IDUTLMARPREFOL      PARASUPRI.IDUTLMARPREFOL%TYPE;
   V_TIPOPART            VARCHAR2(10);
   V_CDPRODPREF          PRODPREFMED.CDPRODPREF%TYPE;
BEGIN
   NOVO_CODIGO('LOGIMPSOLPEDOL', V_PRXLOG, 1);
   V_PRXLOG := SUBSTR(V_PRXLOG, 11, 10);
   V_IDPEDEXOLEXTR := 'N';
   IF NVL(P_EXTRA, 'T') = 'S' THEN
      V_IDPEDEXOLEXTR := 'S';
   END IF;
   INSERT INTO LOGIMPSOLPEDOL
          (NRSEQLOGIMPOL, DTINICIAL,   DTFINAL,   CDFILLANC,   CDOPERADOR,   CDPRODINI, CDPRODFIN,
           DSCDREGIAO, DSCDGRUPFILI, CDGRUPPROD,   DSCDSUBGRPROD, DTOPERACAO, IDITMSOLEXTRA, CDLOTENVITOL)
   VALUES (V_PRXLOG,     P_DTINICIAL, P_DTFINAL, P_CDFILLANC, P_CDOPERADOR, P_PRODINI, P_PRODFIN,
           SUBSTR(P_CDREGIAO, 1, 250), SUBSTR(P_CDGRUPFILI, 1, 250), P_CDGRUPPROD, SUBSTR(P_CDSUBGRPROD, 1, 250), TO_DATE(TRUNC(SYSDATE)),
           V_IDPEDEXOLEXTR, P_CDLOTENVITOL);
   P_ROWSAFFECT := 'N';
   IF P_CDREGIAO IS NULL THEN
     V_TREGIAO := 'T';
   END IF;
   IF P_CDGRUPFILI IS NULL THEN
     V_TGRUPFILI := 'T';
   END IF;
   NOVO_CODIGO('LISTA', V_LISTA_FILIAL, 1);
   V_LISTA_FILIAL := SUBSTR(V_LISTA_FILIAL, 11, 10);
   IF V_TGRUPFILI = 'T' THEN
      INSERT INTO LISTA (NRLISTA, CDLISTA)
      SELECT
         V_LISTA_FILIAL,
         CDFILIAL
      FROM
         FILIAL;
   ELSE
      INSERT INTO LISTA (NRLISTA, CDLISTA)
      SELECT DISTINCT
         V_LISTA_FILIAL,
         FILGRUPFILI.CDFILIAL
      FROM
         FILGRUPFILI
      WHERE INSTR(P_CDGRUPFILI, FILGRUPFILI.CDGRUPFILI) > W_ZERO
        AND NOT EXISTS (SELECT W_UM
                        FROM LISTA L
                        WHERE L.NRLISTA = V_LISTA_FILIAL
                          AND L.CDLISTA = FILGRUPFILI.CDFILIAL);
   END IF;
   IF (P_PRODINI IS NULL) AND (P_PRODFIN IS NULL) THEN
      V_TPRODUTO := 'T';
   ELSE
      IF P_PRODINI > P_PRODFIN THEN
         V_PRODINI := P_PRODINI || 'ZZZZZZZZZZ';
         V_PRODFIN := P_PRODFIN;
      ELSE
         V_PRODFIN := P_PRODFIN || 'ZZZZZZZZZZ';
         V_PRODINI := P_PRODINI;
      END IF;
   END IF;
   FOR C_ITEMSOLI IN
      (
        SELECT
           CDFILSOLI,
           CDPRODUTO,
           CDARVPROD,
           DTPROGENTR,
           CDFILIOPELOG,
           NRSEQUCONSOL,
           CDRASTRITM,
           SUM(QTSOLIPROD) QTSOLIPROD,
           CDMARCA,
           CDSUBGRPROD,
           CDARVPRODEMBARQ
        FROM
        (
        SELECT
           ITEMSOLI.CDFILSOLI,
           PRODESTO.CDPRODUTO,
           PRODESTO.CDARVPROD,
           ITEMSOLI.DTPROGENTR,
           ITEMSOLI.CDFILIOPELOG,
           ITEMSOLI.NRSEQUCONSOL,
           ITEMSOLI.CDRASTRITM,
           (ITEMSOLI.QTSOLIPROD*PRODUTO.VRFATOCONV) QTSOLIPROD,
           '' CDMARCA,
           (SELECT MAX(PRSUBGRPROD.CDSUBGRPROD) CDSUBGRPROD
              FROM PRSUBGRPROD
             WHERE PRSUBGRPROD.CDGRUPPROD = P_CDGRUPPROD
               AND INSTR(NVL(P_CDSUBGRPROD, '_'||PRSUBGRPROD.CDSUBGRPROD||'_'), PRSUBGRPROD.CDSUBGRPROD) > W_ZERO
               AND PRSUBGRPROD.CDPRODUTO  = ITEMSOLI.CDPRODUTO) CDSUBGRPROD,
           (SELECT MAX(CDARVPROD)
              FROM DATAEMBARQUEOL A, PRODUTO B
             WHERE A.CDFILIAL     = ITEMSOLI.CDFILSOLI
               AND A.CDFILIOPELOG = ITEMSOLI.CDFILIOPELOG
               AND A.CDPRODUTO    = B.CDPRODUTO
               AND INSTR(PRODESTO.CDARVPROD, B.CDARVPROD) = 1) CDARVPRODEMBARQ
        FROM ITEMSOLI, PRODUTO, PRODUTO PRODESTO, PARAMGERAL
        WHERE ITEMSOLI.DTPROGENTR BETWEEN P_DTINICIAL AND P_DTFINAL
          AND ((PRODESTO.CDARVPROD  BETWEEN V_PRODINI AND V_PRODFIN) OR V_TPRODUTO = W_T)
          AND ITEMSOLI.CDFILIOPELOG IS NOT NULL
          AND ITEMSOLI.NRSEQUCONSOL IS NOT NULL
          AND NVL(ITEMSOLI.IDPEDIDOOL, W_N) = W_N
          AND ITEMSOLI.CDFILIOPELOG <> ITEMSOLI.CDFILSOLI
          AND NVL(ITEMSOLI.IDSOLIAPROV, W_S) = W_S
          AND NVL(ITEMSOLI.IDITMCONS, W_N) = W_N
          AND PRODUTO.CDPRODUTO      = ITEMSOLI.CDPRODUTO
          AND PRODUTO.CDPRODESTO     = PRODESTO.CDPRODUTO
          AND NVL(ITEMSOLI.QTSOLIPROD, 0) > 0
          AND ((NVL(ITEMSOLI.IDITMSOLEXTRA, 'N') = NVL(P_EXTRA, 'T'))  OR (NVL(P_EXTRA, 'T') = 'T'))
          AND ((NVL(PARAMGERAL.IDRESTRFILIOPER, 'N') = 'N')
               OR
               (EXISTS (SELECT W_UM
                        FROM FILIOPER
                        WHERE FILIOPER.CDOPERADOR = P_CDOPERADOR
                          AND FILIOPER.CDFILIAL   = ITEMSOLI.CDFILSOLI))
              )
          AND (P_CDSUBGRPROD IS NULL OR
               EXISTS (SELECT W_UM
                       FROM PRSUBGRPROD
                       WHERE PRSUBGRPROD.CDGRUPPROD = P_CDGRUPPROD
                         AND INSTR(P_CDSUBGRPROD, PRSUBGRPROD.CDSUBGRPROD) > W_ZERO
                         AND PRSUBGRPROD.CDPRODUTO  = PRODUTO.CDPRODUTO)
               )
          AND EXISTS (SELECT W_UM
                      FROM FILIAL, LISTA
                      WHERE LISTA.NRLISTA   = V_LISTA_FILIAL
                        AND LISTA.CDLISTA   = FILIAL.CDFILIAL
                        AND FILIAL.CDFILIAL = ITEMSOLI.CDFILSOLI
                        AND ((INSTR(P_CDREGIAO, FILIAL.CDREGIAO) > W_ZERO) OR V_TREGIAO = W_T)
                      )
          AND ITEMSOLI.NRSEQUCONSOL  IN (SELECT (I.NRSEQUCONSOL)
                                          FROM ITEMSOLI I
                                         WHERE I.CDFILSOLI  = ITEMSOLI.CDFILSOLI
                                           AND I.CDFILLAN   = ITEMSOLI.CDFILLAN
                                           AND I.NRSOLICMP  = ITEMSOLI.NRSOLICMP
                                           AND I.CDPRODUTO  = ITEMSOLI.CDPRODUTO
                                           AND I.DTPROGENTR = ITEMSOLI.DTPROGENTR
                                           AND I.CDFILIOPELOG IS NOT NULL
                                           AND I.NRSEQUCONSOL IS NOT NULL
                                           AND NVL(I.IDPEDIDOOL, W_N) = W_N
                                           AND I.CDFILIOPELOG <> I.CDFILSOLI
                                           AND NVL(I.IDSOLIAPROV, W_S) = W_S
                                           AND NVL(I.IDITMCONS, W_N) = W_N))
        GROUP BY
           CDFILSOLI,
           CDPRODUTO,
           CDARVPROD,
           DTPROGENTR,
           CDFILIOPELOG,
           NRSEQUCONSOL,
           CDRASTRITM,
           CDMARCA,
           CDSUBGRPROD,
           CDARVPRODEMBARQ
        ORDER BY
           CDFILIOPELOG,
           CDFILSOLI,
           CDSUBGRPROD,
           DTPROGENTR,
           CDARVPRODEMBARQ,
           CDPRODUTO
      )
   LOOP
      V_QTDERESTANTE     := C_ITEMSOLI.QTSOLIPROD;
      V_QTDEPRODUTO      := W_ZERO;
      V_ITEM_CONSOLIDADO := W_N;
      V_QTSOLIPROD       := C_ITEMSOLI.QTSOLIPROD;
      

      SELECT NVL(MAX(RELACPRODOL.CDPRODARVOL), '&')
        INTO V_CDPRODARVOL
        FROM ITMPRODCONSSOLOL, RELACPRODOL, PRODUTO, PRODUTO PRODUTOOL
       WHERE ITMPRODCONSSOLOL.NRSEQUCONSOL  = C_ITEMSOLI.NRSEQUCONSOL
         AND ITMPRODCONSSOLOL.CDFILDEST     = C_ITEMSOLI.CDFILSOLI
         AND ITMPRODCONSSOLOL.CDFILSOLI     = C_ITEMSOLI.CDFILIOPELOG
         AND ITMPRODCONSSOLOL.CDPRODUTO     = RELACPRODOL.CDPRODARVOL
         AND RELACPRODOL.CDPRARVORIG        = PRODUTO.CDPRODUTO
         AND PRODUTO.CDPRODESTO             = C_ITEMSOLI.CDPRODUTO
         AND PRODUTOOL.CDPRODUTO            = RELACPRODOL.CDPRODARVOL
         AND PRODUTO.CDPRODESTO             <> PRODUTOOL.CDPRODESTO;

      IF V_CDPRODARVOL = '&' THEN
         OPEN C_EMBALAGEM FOR
            SELECT PRODUTO.CDPRODUTO,
                   PRODUTO.CDARVPROD,
                   NVL(PRODUTO.VRFATOCONV, W_UM) VRFATOCONV,
                   NVL(PRODUTO.VRARREDCMP, W_ZERO) VRARREDCMP,
                   '' CDMARCA,
                   (NVL(PRODUTO.VRFATOCONV, W_UM)*NVL(PRODUTO.VRARREDCMP, W_UM)),
                   ROWNUM,
                   SUM(W_UM) OVER (PARTITION BY W_UM) CONTADOR
              FROM PRODUTO, PRODCONSSOLOL
             WHERE PRODUTO.CDPRODESTO          = C_ITEMSOLI.CDPRODUTO
               AND PRODCONSSOLOL.CDPRODUTO    = PRODUTO.CDPRODUTO
               AND PRODCONSSOLOL.NRSEQUCONSOL = C_ITEMSOLI.NRSEQUCONSOL
               AND PRODCONSSOLOL.CDFILSOLI    = C_ITEMSOLI.CDFILIOPELOG
               AND EXISTS (SELECT W_UM
                           FROM ITEMCONSSOLOL
                           WHERE ITEMCONSSOLOL.NRSEQUCONSOL  = C_ITEMSOLI.NRSEQUCONSOL
                             AND ITEMCONSSOLOL.CDFILSOLI     = C_ITEMSOLI.CDFILIOPELOG
                             AND ITEMCONSSOLOL.CDFILLAN      = PRODCONSSOLOL.CDFILLAN
                             AND ITEMCONSSOLOL.CDPRODUTO     = PRODCONSSOLOL.CDPRODUTO
                             AND ITEMCONSSOLOL.DTENTRCONSOL <= C_ITEMSOLI.DTPROGENTR)
              AND EXISTS (SELECT W_UM
                           FROM ITMPRODCONSSOLOL
                           WHERE ITMPRODCONSSOLOL.NRSEQUCONSOL    =  PRODCONSSOLOL.NRSEQUCONSOL
                             AND ITMPRODCONSSOLOL.CDFILDEST       =  C_ITEMSOLI.CDFILSOLI
                             AND ITMPRODCONSSOLOL.CDPRODUTO       =  PRODCONSSOLOL.CDPRODUTO
                             AND ITMPRODCONSSOLOL.CDFILSOLI       =  PRODCONSSOLOL.CDFILSOLI
                             AND ITMPRODCONSSOLOL.CDFILLAN        =  PRODCONSSOLOL.CDFILLAN)
            GROUP BY PRODUTO.CDPRODUTO,
                     PRODUTO.CDARVPROD,
                     NVL(PRODUTO.VRFATOCONV, W_UM),
                     NVL(PRODUTO.VRARREDCMP, W_ZERO),
                     (NVL(PRODUTO.VRFATOCONV, W_UM)*NVL(PRODUTO.VRARREDCMP, W_UM)),
                     ROWNUM
            ORDER BY (NVL(PRODUTO.VRFATOCONV, W_UM)*NVL(PRODUTO.VRARREDCMP, W_UM)) DESC;
      ELSE
         OPEN C_EMBALAGEM FOR
            SELECT PRODUTO.CDPRODUTO,
                   PRODUTO.CDARVPROD,
                   NVL(PRODUTO.VRFATOCONV, W_UM) VRFATOCONV,
                   NVL(PRODUTO.VRARREDCMP, W_ZERO) VRARREDCMP,
                   RELACPRODOL.CDMARCA,
                   (NVL(PRODUTO.VRFATOCONV, W_UM)*NVL(PRODUTO.VRARREDCMP, W_UM)),
                   ROWNUM,
                   SUM(W_UM) OVER (PARTITION BY W_UM) CONTADOR
              FROM PRODCONSSOLOL, RELACPRODOL, PRODUTO
             WHERE PRODCONSSOLOL.NRSEQUCONSOL  = C_ITEMSOLI.NRSEQUCONSOL
               AND PRODCONSSOLOL.CDFILSOLI     = C_ITEMSOLI.CDFILIOPELOG
               AND PRODCONSSOLOL.CDPRODUTO     = RELACPRODOL.CDPRODARVOL
               AND PRODCONSSOLOL.CDPRODUTO     = V_CDPRODARVOL
               AND RELACPRODOL.CDPRARVORIG     = PRODUTO.CDPRODUTO
               AND EXISTS (SELECT W_UM
                           FROM ITEMCONSSOLOL
                           WHERE ITEMCONSSOLOL.NRSEQUCONSOL  = C_ITEMSOLI.NRSEQUCONSOL
                             AND ITEMCONSSOLOL.CDFILSOLI     = C_ITEMSOLI.CDFILIOPELOG
                             AND ITEMCONSSOLOL.CDFILLAN      = PRODCONSSOLOL.CDFILLAN
                             AND ITEMCONSSOLOL.CDPRODUTO     = PRODCONSSOLOL.CDPRODUTO
                             AND ITEMCONSSOLOL.DTENTRCONSOL <= C_ITEMSOLI.DTPROGENTR)
              AND EXISTS (SELECT W_UM
                           FROM ITMPRODCONSSOLOL
                           WHERE ITMPRODCONSSOLOL.NRSEQUCONSOL    =  PRODCONSSOLOL.NRSEQUCONSOL
                             AND ITMPRODCONSSOLOL.CDFILDEST       =  C_ITEMSOLI.CDFILSOLI
                             AND ITMPRODCONSSOLOL.CDPRODUTO       =  PRODCONSSOLOL.CDPRODUTO
                             AND ITMPRODCONSSOLOL.CDFILSOLI       =  PRODCONSSOLOL.CDFILSOLI
                             AND ITMPRODCONSSOLOL.CDFILLAN        =  PRODCONSSOLOL.CDFILLAN)
            GROUP BY PRODUTO.CDPRODUTO,
                     PRODUTO.CDARVPROD,
                     NVL(PRODUTO.VRFATOCONV, W_UM),
                     NVL(PRODUTO.VRARREDCMP, W_ZERO),
                     RELACPRODOL.CDMARCA,
                     (NVL(PRODUTO.VRFATOCONV, W_UM)*NVL(PRODUTO.VRARREDCMP, W_UM)),
                     ROWNUM
            ORDER BY (NVL(PRODUTO.VRFATOCONV, W_UM)*NVL(PRODUTO.VRARREDCMP, W_UM)) DESC;
      END IF;
      LOOP
         FETCH C_EMBALAGEM INTO V_EMBALAGEM_CDPRODUTO,  V_EMBALAGEM_CDARVPROD,
                                V_EMBALAGEM_VRFATOCONV, V_EMBALAGEM_VRARREDCMP,
                                V_EMBALAGEM_CDMARCA, V_EMBALAGEM_VRARREDCMP1,
                                V_EMBALAGEM_ROWNUM, V_EMBALAGEM_CONTADOR;
         EXIT WHEN C_EMBALAGEM%NOTFOUND;
         IF V_EMBALAGEM_CDPRODUTO IS NOT NULL THEN
            IF V_EMBALAGEM_VRARREDCMP > W_ZERO THEN
               V_CONTADOR := V_EMBALAGEM_VRARREDCMP;
            ELSE
               V_CONTADOR := W_UM;
            END IF;
            V_QTDEPRODUTO     := W_ZERO;
            V_AUXQTDERESTANTE := V_QTDERESTANTE;
            WHILE ((V_EMBALAGEM_VRFATOCONV*V_CONTADOR) <= V_AUXQTDERESTANTE)
            LOOP
               V_QTDEPRODUTO  := V_CONTADOR;
               V_QTDERESTANTE := V_AUXQTDERESTANTE - (V_EMBALAGEM_VRFATOCONV*V_CONTADOR);
               IF V_EMBALAGEM_VRARREDCMP > W_ZERO THEN
                  V_CONTADOR := V_CONTADOR + V_EMBALAGEM_VRARREDCMP;
               ELSE
                  V_CONTADOR := V_CONTADOR + W_UM;
               END IF;
            END LOOP;
            IF V_EMBALAGEM_CONTADOR = 1 THEN
	            /*GRAVA QUANTIDADE MENOR*/
	            IF ( 1 = V_EMBALAGEM_ROWNUM) THEN
	               IF  ((V_EMBALAGEM_VRFATOCONV*V_QTDEPRODUTO) < V_AUXQTDERESTANTE) THEN
	                  V_QTDEPRODUTO  := V_CONTADOR;
	               END IF;
	            END IF;
	        ELSE
               IF C_EMBALAGEM%NOTFOUND THEN
                  WHILE (V_QTDERESTANTE > W_ZERO)
                  LOOP
                     V_QTDEPRODUTO  := V_CONTADOR;
                     V_QTDERESTANTE := V_AUXQTDERESTANTE - (V_EMBALAGEM_VRFATOCONV*V_CONTADOR);
                     IF V_EMBALAGEM_VRARREDCMP > W_ZERO THEN
                        V_CONTADOR := V_CONTADOR + V_EMBALAGEM_VRARREDCMP;
                     ELSE
                        V_CONTADOR := V_CONTADOR + W_UM;
                     END IF;
                  END LOOP;
               ELSE
                  WHILE ((V_EMBALAGEM_VRFATOCONV*V_CONTADOR) <= V_AUXQTDERESTANTE)
                  LOOP
                     V_QTDEPRODUTO  := V_CONTADOR;
                     V_QTDERESTANTE := V_AUXQTDERESTANTE - (V_EMBALAGEM_VRFATOCONV*V_CONTADOR);
                     IF V_EMBALAGEM_VRARREDCMP > W_ZERO THEN
                        V_CONTADOR := V_CONTADOR + V_EMBALAGEM_VRARREDCMP;
                     ELSE
                        V_CONTADOR := V_CONTADOR + W_UM;
                     END IF;
                  END LOOP;
               END IF;
            END IF;

            IF V_QTDEPRODUTO > W_ZERO THEN

               IF V_CHAVE3 <> C_ITEMSOLI.CDFILIOPELOG||C_ITEMSOLI.CDFILSOLI||NVL(C_ITEMSOLI.CDSUBGRPROD, 'X')||TO_CHAR(C_ITEMSOLI.DTPROGENTR, 'DD/MM/YYYY')||C_ITEMSOLI.CDARVPRODEMBARQ THEN
                  V_CHAVE3 := C_ITEMSOLI.CDFILIOPELOG||C_ITEMSOLI.CDFILSOLI||NVL(C_ITEMSOLI.CDSUBGRPROD, 'X')||TO_CHAR(C_ITEMSOLI.DTPROGENTR, 'DD/MM/YYYY')||C_ITEMSOLI.CDARVPRODEMBARQ;
                  SELECT MAX(CALCULA_DATAEMBARQUE_OL(C_ITEMSOLI.CDFILIOPELOG, C_ITEMSOLI.CDFILSOLI, V_EMBALAGEM_CDARVPROD, C_ITEMSOLI.DTPROGENTR, C_ITEMSOLI.CDARVPRODEMBARQ))
                    INTO V_DTPROGEMBARQ
                    FROM DUAL;
               END IF;
               IF V_CHAVE2 <> C_ITEMSOLI.CDFILIOPELOG||C_ITEMSOLI.CDFILSOLI||NVL(C_ITEMSOLI.CDSUBGRPROD, 'X')||TO_CHAR(C_ITEMSOLI.DTPROGENTR, 'DD/MM/YYYY') THEN
                  V_CHAVE2 := C_ITEMSOLI.CDFILIOPELOG||C_ITEMSOLI.CDFILSOLI||NVL(C_ITEMSOLI.CDSUBGRPROD, 'X')||TO_CHAR(C_ITEMSOLI.DTPROGENTR, 'DD/MM/YYYY');
                  V_NRPEDEXOL := NULL;
                  V_CDFILLANC := NULL;
                  SELECT
                     MAX(CDFILLANC),
                     MAX(NRPEDEXOL)
                  INTO
                     V_CDFILLANC,
                     V_NRPEDEXOL
                  FROM (SELECT DISTINCT
                           PEDIDOEXOL.CDFILLANC,
                           PEDIDOEXOL.NRPEDEXOL
                        FROM
                           PEDIDOEXOL, ITEMPEDEXOL
                        WHERE PEDIDOEXOL.CDFILDEST      = C_ITEMSOLI.CDFILSOLI
                          AND PEDIDOEXOL.CDFILLANC      = P_CDFILLANC
                          AND PEDIDOEXOL.CDFILIOPELOG   = C_ITEMSOLI.CDFILIOPELOG
                          AND PEDIDOEXOL.IDTIPOEXOL     = W_A
                          AND PEDIDOEXOL.IDBAIXEXOL     IS NULL
                          AND PEDIDOEXOL.IDBAIXEXSAI    IS NULL
                          AND ((NVL(PEDIDOEXOL.IDPEDEXOLEXTR, 'N') = NVL(P_EXTRA, 'T')) OR (NVL(P_EXTRA, 'T') = 'T'))
                          AND ITEMPEDEXOL.CDFILDEST = PEDIDOEXOL.CDFILDEST
                          AND ITEMPEDEXOL.CDFILLANC = PEDIDOEXOL.CDFILLANC
                          AND ITEMPEDEXOL.NRPEDEXOL = PEDIDOEXOL.NRPEDEXOL
                          AND ITEMPEDEXOL.DTPROGENPEOL = C_ITEMSOLI.DTPROGENTR
                          AND NVL(ITEMPEDEXOL.CDLOTENVITOL, 'X') = NVL(P_CDLOTENVITOL, 'X')
                          --AND ITEMPEDEXOL.DTPROGENPEOL BETWEEN P_DTINICIAL-V_NRDIAEMBARQUE AND P_DTFINAL  /*MELHORAR PERFORMANCE SAPORE*/
                          --AND DTPROGEMBARQ = V_DTPROGEMBARQ
                          AND ((P_CDSUBGRPROD IS NULL) OR (EXISTS (SELECT W_UM
                                                                     FROM PRSUBGRPROD
                                                                    WHERE PRSUBGRPROD.CDGRUPPROD = P_CDGRUPPROD
                                                                      AND NVL(PRSUBGRPROD.CDSUBGRPROD, 'X')=NVL(C_ITEMSOLI.CDSUBGRPROD, 'X')
                                                                      AND PRSUBGRPROD.CDPRODUTO  = ITEMPEDEXOL.CDPRODUTO))));
               END IF;
               IF (V_NRPEDEXOL IS NULL) THEN
                  V_EMITENTE  := EMITENTE(C_ITEMSOLI.CDFILSOLI, V_EMBALAGEM_CDPRODUTO, NULL);
                  V_CDEMPRESA := SUBSTR(V_EMITENTE, 3, 2);
                  V_IDTIPEMIT := SUBSTR(V_EMITENTE, 1, 1);
                  NOVO_CODIGO('PEDIDOEXOL'||C_ITEMSOLI.CDFILSOLI || P_CDFILLANC, V_NRPEDEXOL, 1);
                  V_NRPEDEXOL := SUBSTR(V_NRPEDEXOL, 11, 10);
                  V_CDFILLANC := P_CDFILLANC;
                  INSERT INTO PEDIDOEXOL (CDFILDEST, CDFILLANC, NRPEDEXOL,
                                          DTPEDEXOL, IDEMITEXOL, CDEMPRESA,
                                          CDFILIOPELOG, IDTIPOEXOL, IDPEDEXOLEXTR)
                  VALUES (C_ITEMSOLI.CDFILSOLI, P_CDFILLANC, V_NRPEDEXOL,
                          TO_DATE(TRUNC(SYSDATE)), V_IDTIPEMIT, V_CDEMPRESA,
                          C_ITEMSOLI.CDFILIOPELOG, W_A, V_IDPEDEXOLEXTR);
               END IF;
               V_MARCA := NULL;
               IF V_EMBALAGEM_CDMARCA IS NULL THEN
               SELECT MAX(PARASUPRI.CDMARCA), NVL(MAX(IDUTLMARPREFOL), 'S')
                 INTO V_MARCA, V_IDUTLMARPREFOL
               FROM PARASUPRI, FILIAL F
               WHERE PARASUPRI.CDFILIAL = NVL(F.CDFILCENTCMP, F.CDFILIAL)
                 AND F.CDFILIAL = C_ITEMSOLI.CDFILSOLI;
               IF V_MARCA IS NULL THEN
                  SELECT
                     MIN(CDMARCA)
                  INTO
                     V_MARCA
                  FROM
                     MARCPRODCOMP
                  WHERE CDPRMARCOMPL = V_EMBALAGEM_CDPRODUTO;
               END IF;
               ELSE
                  V_MARCA := V_EMBALAGEM_CDMARCA;
               END IF;

               SELECT NVL(MAX(RELACPRODOL.CDMARCA), V_MARCA)
                 INTO V_MARCA
                 FROM ESTOCONSSOLOL, RELACPRODOL
                WHERE ESTOCONSSOLOL.CDPRODARVOL   = RELACPRODOL.CDPRODARVOL
                  AND ESTOCONSSOLOL.NRSEQUCONSOL  = C_ITEMSOLI.NRSEQUCONSOL
                  AND ESTOCONSSOLOL.CDFILSOLI     = C_ITEMSOLI.CDFILIOPELOG
                  AND ESTOCONSSOLOL.IDUTESTCONSOL = 'S'
                  AND ESTOCONSSOLOL.CDPRODUTO     = V_EMBALAGEM_CDPRODUTO;

               IF V_IDUTLMARPREFOL = 'S' THEN
                  BEGIN
                     SELECT LISTAGG(TIPO, '_') WITHIN GROUP (ORDER BY TIPO) TIPO
                       INTO V_TIPOPART
                       FROM (SELECT TIPO
                               FROM (SELECT 'M' TIPO
                                       FROM PARTFILI
                                      WHERE CDPRODUTO = C_ITEMSOLI.CDPRODUTO
                                        AND CDFILIAL  = C_ITEMSOLI.CDFILSOLI
                                        AND CDTIPPART IN ('1', '2', '7', '8')
                                      UNION
                                     SELECT 'P' TIPO
                                       FROM PRODPREFMED, PRODUTO
                                      WHERE PRODPREFMED.CDPRODUTO = PRODUTO.CDPRODESTO
                                        AND PRODPREFMED.CDFILIAL  = C_ITEMSOLI.CDFILSOLI
                                        AND PRODUTO.CDPRODUTO     = C_ITEMSOLI.CDPRODUTO));
                  EXCEPTION
                     WHEN OTHERS THEN BEGIN
                        V_TIPOPART := '_';
                     END;
                  END;
                  IF V_TIPOPART = 'M' THEN
                     SELECT NVL(MAX(PARTFILI.CDMARCA), V_MARCA)
                       INTO V_MARCA
                       FROM PARTFILI, RELACPRODOL
                      WHERE PARTFILI.CDPRODUTO = RELACPRODOL.CDPRARVORIG
                        AND PARTFILI.CDFILIAL  = C_ITEMSOLI.CDFILSOLI
                        AND NVL(CDTIPPART, 'X') IN ('1', '2', '7', '8')
                        AND RELACPRODOL.CDPRARVORIG = V_EMBALAGEM_CDPRODUTO
                        AND RELACPRODOL.CDMARCA = PARTFILI.CDMARCA;
                  ELSIF V_TIPOPART = 'P' THEN
                     SELECT NVL(MAX(PRODPREFMED.CDPRODPREF), 'W')
                       INTO V_CDPRODPREF
                       FROM PRODPREFMED, PRODUTO, RELACPRODOL
                      WHERE PRODPREFMED.CDPRODUTO  = PRODUTO.CDPRODESTO
                        AND PRODPREFMED.CDFILIAL   = C_ITEMSOLI.CDFILSOLI
                        AND PRODUTO.CDPRODUTO      = C_ITEMSOLI.CDPRODUTO
                        AND PRODPREFMED.CDPRODPREF = RELACPRODOL.CDPRARVORIG
                        AND RELACPRODOL.CDMARCA    = V_MARCA;
                     IF V_CDPRODPREF = 'W' THEN
                        SELECT NVL(MAX(PRODPREFMED.CDPRODPREF), V_EMBALAGEM_CDPRODUTO),  NVL(MAX(RELACPRODOL.CDMARCA), V_MARCA)
                          INTO V_EMBALAGEM_CDPRODUTO, V_MARCA
                          FROM PRODPREFMED, PRODUTO, RELACPRODOL
                         WHERE PRODPREFMED.CDPRODUTO  = PRODUTO.CDPRODESTO
                           AND PRODPREFMED.CDFILIAL   = C_ITEMSOLI.CDFILSOLI
                           AND PRODUTO.CDPRODUTO      = C_ITEMSOLI.CDPRODUTO
                           AND PRODPREFMED.CDPRODPREF = RELACPRODOL.CDPRARVORIG;
                     ELSE
                        V_EMBALAGEM_CDPRODUTO := V_CDPRODPREF;
                     END IF;
                  ELSIF V_TIPOPART = 'M_P' THEN
                     V_MARCA1 := V_MARCA;
                     SELECT NVL(MAX(PARTFILI.CDMARCA), V_MARCA)
                       INTO V_MARCA
                       FROM PARTFILI, RELACPRODOL
                      WHERE PARTFILI.CDPRODUTO = RELACPRODOL.CDPRARVORIG
                        AND PARTFILI.CDFILIAL  = C_ITEMSOLI.CDFILSOLI
                        AND NVL(CDTIPPART, 'X') IN ('1', '2', '7', '8')
                        AND RELACPRODOL.CDPRARVORIG = V_EMBALAGEM_CDPRODUTO
                        AND RELACPRODOL.CDMARCA = PARTFILI.CDMARCA;

                     SELECT NVL(MAX(PRODPREFMED.CDPRODPREF), 'W')
                       INTO V_CDPRODPREF
                       FROM PRODPREFMED, PRODUTO, RELACPRODOL
                      WHERE PRODPREFMED.CDPRODUTO  = PRODUTO.CDPRODESTO
                        AND PRODPREFMED.CDFILIAL   = C_ITEMSOLI.CDFILSOLI
                        AND PRODUTO.CDPRODUTO      = C_ITEMSOLI.CDPRODUTO
                        AND PRODPREFMED.CDPRODPREF = RELACPRODOL.CDPRARVORIG
                        AND RELACPRODOL.CDMARCA    = V_MARCA;
                     IF V_CDPRODPREF = 'W' THEN
                        SELECT NVL(MAX(PRODPREFMED.CDPRODPREF), 'W')
                          INTO V_CDPRODPREF
                          FROM PRODPREFMED, PRODUTO, RELACPRODOL
                         WHERE PRODPREFMED.CDPRODUTO  = PRODUTO.CDPRODESTO
                           AND PRODPREFMED.CDFILIAL   = C_ITEMSOLI.CDFILSOLI
                           AND PRODUTO.CDPRODUTO      = C_ITEMSOLI.CDPRODUTO
                           AND PRODPREFMED.CDPRODPREF = RELACPRODOL.CDPRARVORIG
                           AND RELACPRODOL.CDMARCA    = V_MARCA1;
                        IF V_CDPRODPREF = 'W' THEN
                           SELECT NVL(MAX(PRODPREFMED.CDPRODPREF), V_EMBALAGEM_CDPRODUTO),  NVL(MAX(RELACPRODOL.CDMARCA), V_MARCA1)
                             INTO V_EMBALAGEM_CDPRODUTO, V_MARCA
                             FROM PRODPREFMED, PRODUTO, RELACPRODOL
                            WHERE PRODPREFMED.CDPRODUTO  = PRODUTO.CDPRODESTO
                              AND PRODPREFMED.CDFILIAL   = C_ITEMSOLI.CDFILSOLI
                              AND PRODUTO.CDPRODUTO      = C_ITEMSOLI.CDPRODUTO
                              AND PRODPREFMED.CDPRODPREF = RELACPRODOL.CDPRARVORIG;
                        ELSE
                           V_EMBALAGEM_CDPRODUTO := V_CDPRODPREF;
                           V_MARCA               := V_MARCA1;
                        END IF;
                     ELSE
                        V_EMBALAGEM_CDPRODUTO := V_CDPRODPREF;
                     END IF;
                  END IF;
                  SELECT NVL(MAX(PARTFILI.CDMARCA), V_MARCA)
                    INTO V_MARCA
                    FROM PARTFILI, RELACPRODOL
                   WHERE PARTFILI.CDPRODUTO = RELACPRODOL.CDPRARVORIG
                     AND PARTFILI.CDFILIAL  = C_ITEMSOLI.CDFILSOLI
                     AND NVL(CDTIPPART, 'X') IN ('1', '2', '7', '8')
                     AND RELACPRODOL.CDPRARVORIG = V_EMBALAGEM_CDPRODUTO
                     AND RELACPRODOL.CDMARCA = PARTFILI.CDMARCA;
               END IF;

               UPDATE ITEMPEDEXOL
               SET
                  QTPROGENPEOL    = QTPROGENPEOL  + V_QTDEPRODUTO,
                  QTORIGPRODPED   = QTORIGPRODPED + V_QTSOLIPROD,
                  CDLOTENVITOL    = P_CDLOTENVITOL
               WHERE CDFILDEST    = C_ITEMSOLI.CDFILSOLI
                 AND CDFILLANC    = V_CDFILLANC
                 AND NRPEDEXOL    = V_NRPEDEXOL
                 AND CDMARCA      = V_MARCA
                 AND CDPRODUTO    = V_EMBALAGEM_CDPRODUTO
                 AND DTPROGENPEOL = C_ITEMSOLI.DTPROGENTR;
               IF SQL%NOTFOUND THEN
                  INSERT INTO ITEMPEDEXOL
                     (CDFILDEST, CDFILLANC, NRPEDEXOL, CDMARCA,
                      CDPRODUTO, DTPROGENPEOL, QTPROGENPEOL,
                      NRSEQLOGIMPOL, CDPRODORIGPEDOL, QTORIGPRODPED, CDRASTRITM,
                      DTPROGEMBARQ, CDLOTENVITOL)
                  VALUES
                     (C_ITEMSOLI.CDFILSOLI, V_CDFILLANC, V_NRPEDEXOL, V_MARCA,
                      V_EMBALAGEM_CDPRODUTO, C_ITEMSOLI.DTPROGENTR, V_QTDEPRODUTO,
                      V_PRXLOG, C_ITEMSOLI.CDPRODUTO, V_QTSOLIPROD,  C_ITEMSOLI.CDRASTRITM,
                      V_DTPROGEMBARQ,
                      P_CDLOTENVITOL
                      );

               END IF;
               V_ITEM_CONSOLIDADO := W_S;
            END IF;
         END IF;
      END LOOP;
      SELECT NVL(MAX(IDCALCPRECFAT), 'E')
        INTO V_IDCALCPRECFAT
        FROM PARAMPEDIDO
       WHERE CDFILIAL = C_ITEMSOLI.CDFILIOPELOG;
      IF (V_IDCALCPRECFAT <> 'L') THEN
         GERA_PED_OL_EXPEDICAO(C_ITEMSOLI.CDFILSOLI, V_CDFILLANC,  V_NRPEDEXOL, P_CDFATPRECO);
      END IF;
      IF V_ITEM_CONSOLIDADO = W_S THEN
         UPDATE ITEMSOLI
            SET IDPEDIDOOL     = W_S,
                NRSEQLOGIMPOL  = V_PRXLOG,
                QTSOLIPRODORIG = QTSOLIPROD,
                CDPRODUTORIG   = CDPRODUTO
          WHERE ITEMSOLI.CDFILSOLI     = C_ITEMSOLI.CDFILSOLI
            AND ITEMSOLI.DTPROGENTR    = C_ITEMSOLI.DTPROGENTR
            AND NVL(ITEMSOLI.IDPEDIDOOL, W_N) = W_N
            AND NVL(ITEMSOLI.IDSOLIAPROV, W_S) = W_S
            AND NVL(ITEMSOLI.IDITMCONS, W_N) = W_N
            AND ITEMSOLI.CDFILIOPELOG <> ITEMSOLI.CDFILSOLI
            AND ITEMSOLI.CDFILIOPELOG IS NOT NULL
            AND ITEMSOLI.NRSEQUCONSOL IS NOT NULL
            AND ((NVL(ITEMSOLI.IDITMSOLEXTRA, 'N') = NVL(P_EXTRA, 'T'))  OR (NVL(P_EXTRA, 'T') = 'T'))
            AND ITEMSOLI.CDPRODUTO    IN (SELECT PRODUTO.CDPRODUTO
                                          FROM PRODUTO
                                          WHERE CDPRODESTO = C_ITEMSOLI.CDPRODUTO);
         P_ROWSAFFECT := W_S;
      END IF;
   END LOOP;
END;
/