CREATE OR REPLACE
PROCEDURE NECESSIDADE_OL (
    P_CDFILIAL                IN  FILIAL.CDFILIAL%TYPE,
    P_DTINICIAL               IN  DATE,
    P_DTFINAL                 IN  DATE,
    P_CDPRODINI               IN  PRODUTO.CDARVPROD%TYPE,
    P_CDPRODFIN               IN  PRODUTO.CDARVPROD%TYPE,
    P_PEACRESCIMO             IN  NUMBER,
    P_CDOPERADOR              IN  OPERADOR.CDOPERADOR%TYPE,
    P_NRSEQCONSOL             IN  TRABNECECOMP.NRNECECOMP%TYPE,
    P_CDFILLANC               IN  FILIAL.CDFILIAL%TYPE,
    P_PRIORIZAREST            IN  VARCHAR2,
    P_PREVISAOCONSUMO         IN  VARCHAR2,
    P_GERASOLOPERLOG          IN  VARCHAR2,
    P_CDGRUPPROD              IN  VARCHAR2 DEFAULT NULL,
    P_CDSUBGRUPO              IN  VARCHAR2 DEFAULT NULL,
    P_CDGRUPFILI              IN  GRUPFILI.CDGRUPFILI%TYPE,
    P_ROWSAFFECT              OUT VARCHAR2,
    P_EXTRA                   IN  VARCHAR2 DEFAULT 'T'
    )
IS
   V_NOVADATA     DATE;
   V_DTENTREGA    DATE;
   V_DTMESENTREGA DATE;
   V_DTPROCESS    DATE;
   V_DTPROCESS_MAIS_UM DATE;

   V_CDOPERADOR     OPERADOR.CDOPERADOR%TYPE;
   V_CDPRODINI      VARCHAR2(20);
   V_CDPRODFIN      VARCHAR2(20);
   V_CDFILANTERIOR  VARCHAR2(4);
   V_CDPRODANTERIOR VARCHAR2(10);

   W_N                CHAR(1):= 'N';
   W_S                CHAR(1):= 'S';
   W_P                CHAR(1):= 'P';
   W_A                CHAR(1):= 'A';
   W_I                CHAR(1):= 'I';
   W_4                CHAR(1):= '4';
   W_5                CHAR(1):= '5';                                    
   W_6                CHAR(1):= '6';
   V_ITEM_CONSOLIDADO CHAR(1):= 'N';
   V_IDUTILLOTE       CHAR(1);
   V_IDUTEMPENCONSOL  CHAR(1);

   W_ZERO         INT    := 0;
   W_UM           INT    := 1;

   V_CONTADOR        FLOAT;
   V_QTDEPRODUTO     FLOAT;
   V_NRDIASEG        FLOAT;
   V_QTDERESTANTE    FLOAT;
   V_AUXQTDERESTANTE FLOAT;
   V_QTESTOQUENECCMP FLOAT;
   V_QTDIAESTOQUE    FLOAT;
   V_VALRESTO        FLOAT;
   V_VALRBRUT        FLOAT;
   V_QTDE_ENTRADA    FLOAT;
   V_QTDE_SAIDA      FLOAT;

   TYPE CURTYPE   IS REF CURSOR;
   C_EMBALAGEM    CURTYPE;
   C_ITEMSOLI     CURTYPE;        

   V_NRLIMISEGCAD LIMISEGPROD.NRLIMISEGU%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_CDPERIENTR PERFILPROD.CDPERIENTR%TYPE;
   V_EMBALAGEM_CDPRARVOL  PRODUTO.CDPRODUTO%TYPE;

   V_LISTA_ESTOQUE        VARCHAR2(20);
   V_COUNT                FLOAT;
   V_LISTA_ESTOQUE_VAZIA  VARCHAR2(1);

   V_ITEMSOLI_CDFILSOLI   ITEMSOLI.CDFILSOLI%TYPE;
   V_ITEMSOLI_CDPRODUTO   ITEMSOLI.CDPRODUTO%TYPE;
   V_ITEMSOLI_DTPROGENTR  ITEMSOLI.DTPROGENTR%TYPE;
   V_ITEMSOLI_QTSOLIPROD  ITEMSOLI.QTSOLIPROD%TYPE;
   V_ITEMSOLI_CDARVPROD   PRODUTO.CDARVPROD%TYPE;
   V_PRXNECECOMP          VARCHAR2(20);

   V_MAX_QTDE_ESTOQUE     FLOAT := 0;
   V_QTDE_ESTOQUE_ATUAL   FLOAT := 0;

   V_PRIMEIRA_VEZ         VARCHAR2(1);

   V_IDUTLMARPREFOL       PARASUPRI.IDUTLMARPREFOL%TYPE;
   V_IDUTPRODPREF         PARCMPSUP.IDUTPRODPREF%TYPE;
   V_PARAM_CDFILSOLI      ITEMSOLI.CDFILSOLI%TYPE := NULL;
   V_CDPRODPREF           ITEMSOLI.CDPRODUTO%TYPE := NULL;
   V_CDPROPARTFILI        VARCHAR2(30);
   V_COUNTPARTFILI        FLOAT;
   V_CDPRODUTOPART        PARTFILI.CDPRODUTO%TYPE;
   V_CDMARCA              PARTFILI.CDMARCA%TYPE;
   V_ITEMSOLI_CDPRODIF    ITEMSOLI.CDPRODUTO%TYPE;
   V_COUNTLISTA           FLOAT := 0;
   V_PRIORIZAREST         VARCHAR2(1);
   V_CDMARCA_PADRAO       PARTFILI.CDMARCA%TYPE;
   V_MAX_LIMISEGU         FLOAT := 0;
   V_MAX_LIMISEGU_OL      FLOAT := 0;
   V_QTESTOQUESEGURANCA   FLOAT := 0;
   V_QTSEGURANCA          FLOAT := 0;
   V_IDUTLPRARVOLCMP      PARASUPRI.IDUTLPRARVOLCMP%TYPE;
   V_CONTADOR1            FLOAT;
   V_DTPRIMEIRA           ITEMSOLI.DTPROGENTR%TYPE;
   V_QTESTOQUENECCMPAUX   FLOAT;
   V_IDCALCALECOMPOL      PARASUPRI.IDCALCALECOMPOL%TYPE;
   V_CDFILIOLAGETERC      FILIAL.CDFILIAL%TYPE;
   V_NRLOGITEMSOLICONS    VARCHAR2(20);
   V_IDEMBCONSPRECONECOL  PARASUPRI.IDEMBCONSPRECONECOL%TYPE;
   V_CDFILCENTCMP         FILIAL.CDFILCENTCMP%TYPE;
   V_CDREGIAO             FILIAL.CDREGIAO%TYPE;
   V_IDTIPOAPUR           PARASUPRI.IDTIPOAPUR%TYPE;
   V_CDPERIENTR           PERFILPROD.CDPERIENTR%TYPE;
   V_DTPROGENTR           ITEMSOLI.DTPROGENTR%TYPE;
   V_DTPOSIESTQ           ITEMSOLI.DTPROGENTR%TYPE;
   V_DTPOSIESTQ_MAX       ITEMSOLI.DTPROGENTR%TYPE;
   V_EXTRA                PARASUPRI.IDUTILCONSSOLIOLEXT%TYPE;

BEGIN

   P_ROWSAFFECT := W_N;
   V_CDPRODINI  := P_CDPRODINI;
   V_CDPRODFIN  := RPAD(P_CDPRODFIN, 20, 'Z');
   IF NVL(P_EXTRA, 'T') = 'T' THEN
      V_EXTRA := 'N';
   ELSE
      V_EXTRA := 'S';
   END IF;
   SELECT
      DECODE(NVL(MAX(P.IDUTILDTPROC), W_N), W_S, NVL(MAX(PF.DTPROCESSA), TRUNC(SYSDATE)), TRUNC(SYSDATE) ) DTPROCESS,
      NVL(MAX(PF.IDUTILLOTE), W_N) IDUTILLOTE
   INTO
      V_DTPROCESS,
      V_IDUTILLOTE
   FROM
      PARAMFILIAL PF, PARAMGERAL P
   WHERE PF.CDFILIAL = P_CDFILIAL;

   SELECT MAX(CDMARCA)
     INTO V_CDMARCA_PADRAO
     FROM MARCA;

   SELECT
      NVL(MAX(IDUTEMPENCONSOL), W_N),
      NVL(MAX(CDMARCA), V_CDMARCA_PADRAO),
      NVL(MAX(IDUTLPRARVOLCMP), W_N),
      MAX(IDCALCALECOMPOL),
      NVL(MAX(IDEMBCONSPRECONECOL), 'N'),
      NVL(MAX(FILIAL.CDFILCENTCMP), MAX(FILIAL.CDFILIAL)),
      NVL(MAX(IDTIPOAPUR), '0')
   INTO
      V_IDUTEMPENCONSOL,
      V_CDMARCA_PADRAO,
      V_IDUTLPRARVOLCMP,
      V_IDCALCALECOMPOL,
      V_IDEMBCONSPRECONECOL,
      V_CDFILCENTCMP,
      V_IDTIPOAPUR
   FROM
      FILIAL, PARASUPRI
   WHERE PARASUPRI.CDFILIAL = NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL)
     AND FILIAL.CDFILIAL    = P_CDFILIAL;

   V_DTPROCESS_MAIS_UM := TRUNC(SYSDATE) + W_UM;

   SELECT NVL(MAX(CDFILIAL), P_CDFILIAL)
     INTO V_CDFILIOLAGETERC
     FROM FILIAL
    WHERE CDFILIOLAGETERC = P_CDFILIAL;

   IF P_CDOPERADOR IS NOT NULL THEN
      INSERT INTO CONSSOLOL
        (NRSEQUCONSOL, DTINICONSSOLOL, DTFINCONSSOLOL,
         IDSITUCONSSOL, DTCONSSOLOL, CDOPERADOR, CDFILIOPELOG,
         IDEMBESTCONSOL, IDCONSPREVCONOL, CDPRODINICONSOL, CDPRODFINCONSOL,
         CDGRUPFILI, CDSUBGRPROD, IDUTILCONSSOLOLEXT)
      VALUES
        (P_NRSEQCONSOL, P_DTINICIAL, P_DTFINAL,
         W_P, SYSDATE, P_CDOPERADOR, P_CDFILIAL,
         P_PRIORIZAREST, P_PREVISAOCONSUMO, P_CDPRODINI, P_CDPRODFIN,
         P_CDGRUPFILI, P_CDSUBGRUPO, NVL(P_EXTRA, 'T'));
   ELSE
      SELECT
         MAX(CDOPERADOR)
      INTO
         V_CDOPERADOR
      FROM CONSSOLOL
      WHERE NRSEQUCONSOL = P_NRSEQCONSOL;
   END IF;

   V_CDFILANTERIOR     := ' ';
   V_CDPRODANTERIOR    := ' ';
   V_ITEMSOLI_CDPRODIF := '';
   V_PRXNECECOMP       := NULL;
   V_NRLOGITEMSOLICONS := NULL;
   SELECT NVL(MAX(CDREGIAO), 'XXX')
     INTO V_CDREGIAO
     FROM FILIAL
    WHERE CDFILIAL = P_CDFILIAL;
   IF P_PREVISAOCONSUMO = W_N THEN
      OPEN C_ITEMSOLI FOR
         SELECT
            ITEMSOLI.CDFILSOLI,
            PRODESTO.CDPRODUTO,
            PRODESTO.CDARVPROD,
            ITEMSOLI.DTPROGENTR,
            SUM(ITEMSOLI.QTSOLIPROD*PRODUTO.VRFATOCONV) QTSOLIPROD
         FROM ITEMSOLI, PRODUTO, PRODUTO PRODESTO
         WHERE ITEMSOLI.DTPROGENTR BETWEEN P_DTINICIAL AND P_DTFINAL+(CASE P_GERASOLOPERLOG
                                                                         WHEN 'S'
                                                                         THEN 30
                                                                         ELSE 0
                                                                      END)
           AND PRODESTO.CDARVPROD  BETWEEN V_CDPRODINI AND V_CDPRODFIN
           AND ((P_CDSUBGRUPO IS NULL)  OR  (EXISTS(SELECT 1
                                                      FROM PRSUBGRPROD
                                                     WHERE PRSUBGRPROD.CDGRUPPROD  = P_CDGRUPPROD
                                                       AND INSTR(P_CDSUBGRUPO, PRSUBGRPROD.CDSUBGRPROD) > 0
                                                       AND PRSUBGRPROD.CDFILISUBGR = 'P'
                                                       AND PRSUBGRPROD.CDPRODUTO   = PRODESTO.CDPRODUTO)))
           AND ((ITEMSOLI.CDFILIOPELOG  = P_CDFILIAL) OR (P_CDOPERADOR IS NULL))
           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 ITEMSOLI.CDFILSOLI    <> P_CDFILIAL
           AND ITEMSOLI.NRSEQUCONSOL  IS NULL
           AND ((P_CDGRUPFILI IS NULL)
            OR (EXISTS (SELECT 1
                          FROM FILGRUPFILI
                         WHERE FILGRUPFILI.CDGRUPFILI  = P_CDGRUPFILI
                           AND FILGRUPFILI.CDFILIAL    = ITEMSOLI.CDFILSOLI)))
           AND ((NVL(ITEMSOLI.IDITMSOLEXTRA, 'N') = NVL(P_EXTRA, 'T'))  OR (NVL(P_EXTRA, 'T') = 'T'))
         GROUP BY
            ITEMSOLI.CDFILSOLI,
            PRODESTO.CDPRODUTO,
            PRODESTO.CDARVPROD,
            ITEMSOLI.DTPROGENTR
         ORDER BY
            ITEMSOLI.CDFILSOLI,
            PRODESTO.CDPRODUTO,
            ITEMSOLI.DTPROGENTR;
   ELSE
      NOVO_CODIGO('NECECOMP', V_PRXNECECOMP);
      V_PRXNECECOMP := SUBSTR(V_PRXNECECOMP,11,10);
      IF P_GERASOLOPERLOG = 'S' THEN
         SELECT NVL(MAX(CARREGA_LIMISEGU(P_CDFILIAL, CDARVPROD, P_DTFINAL)), 0)
           INTO V_MAX_LIMISEGU_OL
           FROM PRODUTO
          WHERE CDARVPROD BETWEEN V_CDPRODINI AND V_CDPRODFIN
            AND ((P_CDSUBGRUPO IS NULL)  OR  (EXISTS(SELECT 1
                                                       FROM PRSUBGRPROD
                                                      WHERE PRSUBGRPROD.CDGRUPPROD  = P_CDGRUPPROD
                                                        AND INSTR(P_CDSUBGRUPO, PRSUBGRPROD.CDSUBGRPROD) > 0
                                                        AND PRSUBGRPROD.CDFILISUBGR = 'P'
                                                        AND PRSUBGRPROD.CDPRODUTO   = PRODUTO.CDPRODUTO)))
            AND CDPRODESTO IS NOT NULL;
      END IF;
      FOR C_FILIALNECECOMP IN
         (SELECT CDFILIAL
            FROM FILIAL
           WHERE EXISTS (SELECT 1
                           FROM PARAMPRODSUP, PRODUTO
                          WHERE PARAMPRODSUP.CDFILIOPELOG = P_CDFILIAL
                            AND PARAMPRODSUP.CDFILIAL     = FILIAL.CDFILIAL
                            AND PARAMPRODSUP.CDPRODUTO    = PRODUTO.CDPRODUTO
                            AND PRODUTO.CDARVPROD BETWEEN V_CDPRODINI AND V_CDPRODFIN
                            AND ((P_CDSUBGRUPO IS NULL)  OR  (EXISTS(SELECT 1
                                                                       FROM PRSUBGRPROD
                                                                      WHERE PRSUBGRPROD.CDGRUPPROD  = P_CDGRUPPROD
                                                                        AND INSTR(P_CDSUBGRUPO, PRSUBGRPROD.CDSUBGRPROD) > 0
                                                                        AND PRSUBGRPROD.CDFILISUBGR = 'P'
                                                                        AND PRSUBGRPROD.CDPRODUTO   = PRODUTO.CDPRODUTO)))))
      LOOP
         V_COUNT := 0;
         SELECT COUNT(1)
           INTO V_COUNT
           FROM V_PREVISAO_COMPRA, PRODUTO
          WHERE V_PREVISAO_COMPRA.CDFILIAL = C_FILIALNECECOMP.CDFILIAL
            AND V_PREVISAO_COMPRA.DTPREVCONS BETWEEN P_DTINICIAL AND P_DTFINAL
            AND PRODUTO.CDPRODUTO = V_PREVISAO_COMPRA.CDPRODUTO
            AND PRODUTO.CDARVPROD BETWEEN V_CDPRODINI AND V_CDPRODFIN
            AND ((P_CDSUBGRUPO IS NULL)  OR  (EXISTS(SELECT 1
                                                       FROM PRSUBGRPROD
                                                      WHERE PRSUBGRPROD.CDGRUPPROD  = P_CDGRUPPROD
                                                        AND INSTR(P_CDSUBGRUPO, PRSUBGRPROD.CDSUBGRPROD) > 0
                                                        AND PRSUBGRPROD.CDFILISUBGR = 'P'
                                                        AND PRSUBGRPROD.CDPRODUTO   = PRODUTO.CDPRODUTO)));

         IF V_COUNT > 0 THEN
            V_MAX_LIMISEGU := 0;
            IF P_GERASOLOPERLOG = 'S' THEN
               SELECT NVL(MAX(CARREGA_LIMISEGU(C_FILIALNECECOMP.CDFILIAL, CDARVPROD, P_DTFINAL)), 0)
                 INTO V_MAX_LIMISEGU
                 FROM PRODUTO
                WHERE CDARVPROD BETWEEN V_CDPRODINI AND V_CDPRODFIN
                  AND ((P_CDSUBGRUPO IS NULL)  OR  (EXISTS(SELECT 1
                                                             FROM PRSUBGRPROD
                                                            WHERE PRSUBGRPROD.CDGRUPPROD  = P_CDGRUPPROD
                                                              AND INSTR(P_CDSUBGRUPO, PRSUBGRPROD.CDSUBGRPROD) > 0
                                                              AND PRSUBGRPROD.CDFILISUBGR = 'P'
                                                              AND PRSUBGRPROD.CDPRODUTO   = PRODUTO.CDPRODUTO)))
                  AND CDPRODESTO IS NOT NULL;
               V_MAX_LIMISEGU_OL := V_MAX_LIMISEGU_OL+V_MAX_LIMISEGU+5;
            END IF;
            NECESSIDADE_DE_COMPRAS(C_FILIALNECECOMP.CDFILIAL,  /*P_CDFILIAL   */
                                   NULL,                       /*P_TCDFILIAL  */
                                   NULL,                       /*P_CDGRUPFILI */
                                   V_DTPROCESS,                /*P_DTINICIAL  */
                                   P_DTFINAL+V_MAX_LIMISEGU_OL,/*P_DTFINAL    */
                                   P_CDPRODINI,                /*P_CDPRODINI  */
                                   P_CDPRODFIN,                /*P_CDPRODFIN  */
                                   0,                          /*P_PEACRESCIMO*/
                                   P_CDOPERADOR,               /*P_CDOPERADOR */
                                   SYSDATE,                    /*P_DTHRCALCNC */
                                   W_N,                        /*P_IDQTDEZERO */
                                   V_PRXNECECOMP,              /*P_NRNECECOMP */
                                   V_EXTRA,                    /*NVL(P_EXTRA, 'T')      */
                                   P_CDGRUPPROD,               /*P_CDGRUPPROD */
                                   P_CDSUBGRUPO);              /*P_CDSUBGRUPO */
         END IF;
      END LOOP;
      OPEN C_ITEMSOLI FOR
         SELECT
            TRABNECECOMP.CDFILNECECMP,
            PRODESTO.CDPRODUTO,
            PRODESTO.CDARVPROD,
            TRABNECECOMP.DTENTRNECCMP,
            SUM(TRABNECECOMP.QTPRCNVCOMPR*PRODUTO.VRFATOCONV) QTSOLIPROD
         FROM TRABNECECOMP, PRODUTO, PRODUTO PRODESTO
         WHERE TRABNECECOMP.DTENTRNECCMP BETWEEN P_DTINICIAL AND P_DTFINAL+(CASE P_GERASOLOPERLOG
                                                                               WHEN 'S'
                                                                               THEN V_MAX_LIMISEGU_OL
                                                                               ELSE 0
                                                                            END)
           AND PRODESTO.CDARVPROD  BETWEEN V_CDPRODINI AND V_CDPRODFIN
           AND ((P_CDSUBGRUPO IS NULL)  OR  (EXISTS(SELECT 1
                                                      FROM PRSUBGRPROD
                                                     WHERE PRSUBGRPROD.CDGRUPPROD  = P_CDGRUPPROD
                                                       AND INSTR(P_CDSUBGRUPO, PRSUBGRPROD.CDSUBGRPROD) > 0
                                                       AND PRSUBGRPROD.CDFILISUBGR = 'P'
                                                       AND PRSUBGRPROD.CDPRODUTO   = PRODESTO.CDPRODUTO)))
           AND PRODUTO.CDPRODUTO          = TRABNECECOMP.CDPRODNECCMP
           AND PRODUTO.CDPRODESTO         = PRODESTO.CDPRODUTO
           AND TRABNECECOMP.CDFILNECECMP <> P_CDFILIAL
           AND (TRABNECECOMP.NRNECECOMP   = V_PRXNECECOMP)
           AND (TRABNECECOMP.IDMARCNECCMP = W_S)
           AND (TRABNECECOMP.CDFILIOPELOG = P_CDFILIAL)
         GROUP BY
            TRABNECECOMP.CDFILNECECMP,
            PRODESTO.CDPRODUTO,
            PRODESTO.CDARVPROD,
            TRABNECECOMP.DTENTRNECCMP
         ORDER BY
            TRABNECECOMP.CDFILNECECMP,
            PRODESTO.CDPRODUTO,
            TRABNECECOMP.DTENTRNECCMP;
   END IF;
   LOOP
      FETCH C_ITEMSOLI INTO V_ITEMSOLI_CDFILSOLI,
                            V_ITEMSOLI_CDPRODUTO,
                            V_ITEMSOLI_CDARVPROD,
                            V_ITEMSOLI_DTPROGENTR,
                            V_ITEMSOLI_QTSOLIPROD;
      EXIT WHEN C_ITEMSOLI%NOTFOUND;

      NOVO_CODIGO('LOGITEMSOLICONS', V_NRLOGITEMSOLICONS);

      INSERT INTO LOGITEMSOLICONS
        (NRLOGITEMSOLICONS, NRSEQUCONSOL, CDFILIOPELOG, CDFILSOLI, CDFILLAN,
         CDPRODUTO, DTPROGENTR, QTSOLIPROD)
      VALUES
        (V_NRLOGITEMSOLICONS, P_NRSEQCONSOL, P_CDFILIAL, V_ITEMSOLI_CDFILSOLI, P_CDFILLANC,
         V_ITEMSOLI_CDPRODUTO, V_ITEMSOLI_DTPROGENTR, V_ITEMSOLI_QTSOLIPROD);

      IF NVL(V_PARAM_CDFILSOLI, W_N) <> V_ITEMSOLI_CDFILSOLI THEN
         V_PARAM_CDFILSOLI := V_ITEMSOLI_CDFILSOLI;
         V_IDUTLMARPREFOL  := W_N;
         V_IDUTPRODPREF    := W_N;
         SELECT NVL(MAX(IDUTLMARPREFOL), W_N)
           INTO V_IDUTLMARPREFOL
           FROM PARASUPRI, FILIAL
          WHERE PARASUPRI.CDFILIAL = NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL)
            AND FILIAL.CDFILIAL    = V_PARAM_CDFILSOLI;
         SELECT NVL(MAX(IDUTPRODPREF), W_N)
           INTO V_IDUTPRODPREF
           FROM PARCMPSUP
          WHERE CDFILIAL           = V_PARAM_CDFILSOLI;
      END IF;
      IF (V_CDFILANTERIOR = ' ') AND (V_CDPRODANTERIOR = ' ') THEN
         V_CDFILANTERIOR  := V_ITEMSOLI_CDFILSOLI;
         V_CDPRODANTERIOR := V_ITEMSOLI_CDPRODUTO;
      ELSE
         IF V_IDUTEMPENCONSOL = W_S THEN
            IF (V_CDFILANTERIOR <> V_ITEMSOLI_CDFILSOLI) OR (V_CDPRODANTERIOR <> V_ITEMSOLI_CDPRODUTO) THEN
               EMPENHO_OL(P_NRSEQCONSOL, P_CDFILIAL, V_CDFILANTERIOR, V_CDPRODANTERIOR, NVL(P_CDOPERADOR, V_CDOPERADOR), V_PRXNECECOMP, P_PREVISAOCONSUMO);
               V_CDFILANTERIOR  := V_ITEMSOLI_CDFILSOLI;
               V_CDPRODANTERIOR := V_ITEMSOLI_CDPRODUTO;
            END IF;
         END IF;
      END IF;

      V_QTDERESTANTE     := V_ITEMSOLI_QTSOLIPROD;
      V_QTDEPRODUTO      := W_ZERO;
      V_ITEM_CONSOLIDADO := W_N;
      V_CDPRODPREF       := NULL;
      V_CDPROPARTFILI    := NULL;
      V_CDPRODUTOPART    := NULL;
      V_CDMARCA          := V_CDMARCA_PADRAO;
      V_COUNTPARTFILI    := 0;
      V_PRIORIZAREST     :=  P_PRIORIZAREST;
      IF (V_IDUTLMARPREFOL = W_S) AND (V_PRIORIZAREST = W_S) AND (V_IDEMBCONSPRECONECOL = 'N') THEN
         IF V_IDUTPRODPREF = W_S THEN
            SELECT MAX(CDPRODPREF)
              INTO V_CDPRODPREF
              FROM PRODPREFMED
             WHERE CDFILIAL   = V_ITEMSOLI_CDFILSOLI
               AND CDPRODUTO  = V_ITEMSOLI_CDPRODUTO;
         END IF;
         BEGIN
            SELECT PARTFILI.CDPRODUTO, PARTFILI.CDMARCA, COUNT(CDTIPPART)
              INTO V_CDPRODUTOPART, V_CDMARCA, V_COUNTPARTFILI
              FROM PARTFILI, PRODUTO, RELACPRODOL, PRODUTO PRODUTOOL
             WHERE PARTFILI.CDPRODUTO = PRODUTO.CDPRODUTO
               AND PARTFILI.CDFILIAL  = V_ITEMSOLI_CDFILSOLI
               AND PRODUTO.CDPRODESTO = V_ITEMSOLI_CDPRODUTO
               AND NVL(CDTIPPART, 'X') IN ('1', '2', '7', '8')
               AND ROWNUM = '1'
               AND RELACPRODOL.CDPRARVORIG = PRODUTO.CDPRODUTO
               AND RELACPRODOL.CDPRODARVOL = PRODUTOOL.CDPRODUTO
               AND (((PRODUTOOL.CDPRODUTO  = PRODUTOOL.CDPRODESTO) AND (V_IDUTLPRARVOLCMP = 'S')) OR
                   (V_IDUTLPRARVOLCMP = 'N'))
             GROUP BY PARTFILI.CDPRODUTO, PARTFILI.CDMARCA;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN BEGIN
               V_CDPRODUTOPART := NULL;
               V_CDMARCA       := V_CDMARCA_PADRAO;
               V_COUNTPARTFILI := 0;
               V_PRIORIZAREST  :=  'N';
            END;
         END;
         SELECT MAX(CDPRODARVOL||'_'||CDPRARVORIG)
           INTO V_CDPROPARTFILI
           FROM RELACPRODOL, PRODUTO PRODUTOOL
          WHERE RELACPRODOL.CDPRARVORIG = V_CDPRODUTOPART
            AND RELACPRODOL.CDMARCA     = V_CDMARCA
            AND RELACPRODOL.CDPRODARVOL = PRODUTOOL.CDPRODUTO
            AND (((PRODUTOOL.CDPRODUTO  = PRODUTOOL.CDPRODESTO) AND (V_IDUTLPRARVOLCMP = 'S')) OR
                (V_IDUTLPRARVOLCMP = 'N'));
      END IF;
      IF ((V_PRIORIZAREST = W_N) AND (V_COUNTPARTFILI <= 0 )) THEN
         IF ((NVL(V_CDPRODPREF, 'X')) <> (NVL(SUBSTR(V_CDPROPARTFILI, 12, 10), 'Y'))) THEN
            V_COUNTPARTFILI := 0;
            IF V_CDPRODPREF IS NULL THEN
               V_CDPRODPREF := SUBSTR(V_CDPROPARTFILI, 12, 10);
            END IF;
         END IF;
         IF V_IDEMBCONSPRECONECOL = 'N' THEN
            OPEN C_EMBALAGEM FOR
               SELECT
                  PRODUTO.CDPRODUTO,
                  PRODUTO.CDARVPROD,
                  NVL(PRODUTO.VRFATOCONV, W_UM) VRFATOCONV,
                  NVL(PRODUTO.VRARREDCMP, W_ZERO) VRARREDCMP,
                  PERFILPROD.CDPERIENTR,
                  SUBSTR(V_CDPROPARTFILI, 1, 10) CDPRODARVOL
               FROM PRODUTO, PRODUTO PRODPERIENTR, PERFILPROD
               WHERE (((NVL(PRODUTO.IDPRCMPATIVO, W_S)= W_S) AND (V_CDPRODPREF IS NULL))
                  OR (V_CDPRODPREF = PRODUTO.CDPRODUTO))
                  AND PRODUTO.CDPRODESTO    = V_ITEMSOLI_CDPRODUTO
                  AND PERFILPROD.CDPRODUTO  = PRODPERIENTR.CDPRODUTO
                  AND PERFILPROD.CDFILIAL   = P_CDFILIAL
                  AND EXISTS (SELECT 1
                              FROM PRODFILI
                              WHERE PRODFILI.CDFILIAL = P_CDFILIAL
                                AND PRODFILI.CDPRODUTO = PRODUTO.CDPRODUTO
                                AND NVL(PRODFILI.IDPRODATIV, W_A) = W_A)
                  AND PRODPERIENTR.CDARVPROD = (SELECT
                                                   MAX(B.CDARVPROD)
                                                FROM
                                                   PERFILPROD A,
                                                   PRODUTO B
                                                WHERE A.CDPRODUTO = B.CDPRODUTO
                                                 AND  A.CDFILIAL  = P_CDFILIAL
                                                 AND  INSTR(PRODUTO.CDARVPROD, B.CDARVPROD) = W_UM)
                  AND ((EXISTS(SELECT 1
                                FROM RELACPRODOL
                               WHERE RELACPRODOL.CDPRARVORIG = PRODUTO.CDPRODUTO
                                 AND RELACPRODOL.CDMARCA     = V_CDMARCA
                                 AND V_COUNTPARTFILI         = 0)) OR
                      (EXISTS(SELECT 1
                                FROM RELACPRODOL
                               WHERE RELACPRODOL.CDPRARVORIG = PRODUTO.CDPRODUTO
                                 AND RELACPRODOL.CDPRODARVOL = SUBSTR(V_CDPROPARTFILI, 1, 10)
                                 AND V_COUNTPARTFILI         = 1)))
               ORDER BY
                  ((NVL(PRODUTO.VRFATOCONV, 1))*(NVL(PRODUTO.VRARREDCMP, 1))) DESC;
         ELSE
            SELECT NVL(MAX(IDUTLMARPREFOL), W_N)
              INTO V_IDUTLMARPREFOL
              FROM PARASUPRI, FILIAL
             WHERE PARASUPRI.CDFILIAL = NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL)
               AND FILIAL.CDFILIAL    = V_ITEMSOLI_CDFILSOLI;
            SELECT NVL(MAX(IDUTPRODPREF), W_N)
              INTO V_IDUTPRODPREF
              FROM PARCMPSUP
             WHERE CDFILIAL           = V_ITEMSOLI_CDFILSOLI;

            V_NRDIASEG := 0;
            SELECT NVL(MAX(NRLIMISEGU), 0)
              INTO V_NRDIASEG
              FROM LIMISEGPROD, PRODUTO, PRODUTO PRODNIVELCOMPL
             WHERE CDFILIAL = P_CDFILIAL
               AND LIMISEGPROD.CDPRODUTO = PRODUTO.CDPRODUTO
               AND PRODNIVELCOMPL.CDPRODUTO = V_ITEMSOLI_CDPRODUTO
               AND PRODNIVELCOMPL.CDARVPROD LIKE PRODUTO.CDARVPROD||'%'
               AND PRODUTO.CDARVPROD = (SELECT MAX(B.CDARVPROD)
                                          FROM LIMISEGPROD A, PRODUTO B
                                         WHERE A.CDPRODUTO = B.CDPRODUTO
                                           AND A.CDFILIAL  = P_CDFILIAL
                                           AND INSTR(PRODNIVELCOMPL.CDARVPROD, B.CDARVPROD) = 1);
            IF V_NRDIASEG IS NULL THEN
               V_NRDIASEG := 0;
            END IF;

            V_NOVADATA := V_ITEMSOLI_DTPROGENTR - V_NRDIASEG;
            SELECT TO_DATE('01/'||TO_CHAR(V_NOVADATA,'MM/YYYY'), 'DD/MM/YYYY')
              INTO V_DTMESENTREGA
              FROM DUAL;

            SELECT MAX(PERFILPROD.CDPERIENTR)
              INTO V_CDPERIENTR
              FROM PERFILPROD, PRODUTO
             WHERE PERFILPROD.CDFILIAL  = P_CDFILIAL
               AND PERFILPROD.CDPRODUTO = PRODUTO.CDPRODUTO
               AND PRODUTO.CDARVPROD    = (SELECT MAX(B.CDARVPROD)
                                             FROM PERFILPROD A, PRODUTO B
                                            WHERE A.CDPRODUTO = B.CDPRODUTO
                                              AND A.CDFILIAL  = P_CDFILIAL
                                              AND INSTR(V_ITEMSOLI_CDARVPROD, B.CDARVPROD) = 1);

            SELECT NVL(MAX(CALECOMP.DTENTREGA), V_NOVADATA)
              INTO V_DTPROGENTR
              FROM CALECOMP
             WHERE CALECOMP.CDFILIAL    = P_CDFILIAL
               AND CALECOMP.CDPERIENTR  = V_CDPERIENTR
               AND CALECOMP.DTENTREGA  >= V_DTMESENTREGA
               AND CALECOMP.DTENTREGA  <= V_NOVADATA;

            OPEN C_EMBALAGEM FOR
               SELECT
                  PRODUTO.CDPRODUTO,
                  PRODUTO.CDARVPROD,
                  NVL(PRODUTO.VRFATOCONV, W_UM) VRFATOCONV,
                  NVL(PRODUTO.VRARREDCMP, W_ZERO) VRARREDCMP,
                  PERFILPROD.CDPERIENTR,
                  SUBSTR(ITEMCOLE.CDPRODARVOL, 1, 10) CDPRODARVOL
               FROM PRODUTO, PRODUTO PRODPERIENTR, PERFILPROD,
                    TABLE(APURA_PRECO_CONS_OL(V_CDFILCENTCMP, V_ITEMSOLI_CDFILSOLI,
                                              V_CDREGIAO, V_ITEMSOLI_CDPRODUTO,
                                              V_DTPROGENTR, V_ITEMSOLI_QTSOLIPROD,
                                              V_IDUTLMARPREFOL, V_IDTIPOAPUR,
                                              V_IDUTPRODPREF, P_CDFILIAL,
                                              V_CDMARCA)) ITEMCOLE
               WHERE (((NVL(PRODUTO.IDPRCMPATIVO, W_S)= W_S) AND (V_CDPRODPREF IS NULL))
                  OR (V_CDPRODPREF = PRODUTO.CDPRODUTO))
                  AND PRODUTO.CDPRODESTO    = V_ITEMSOLI_CDPRODUTO
                  AND PERFILPROD.CDPRODUTO  = PRODPERIENTR.CDPRODUTO
                  AND PERFILPROD.CDFILIAL   = P_CDFILIAL
                  AND EXISTS (SELECT 1
                              FROM PRODFILI
                              WHERE PRODFILI.CDFILIAL = P_CDFILIAL
                                AND PRODFILI.CDPRODUTO = PRODUTO.CDPRODUTO
                                AND NVL(PRODFILI.IDPRODATIV, W_A) = W_A)
                  AND PRODPERIENTR.CDARVPROD = (SELECT
                                                   MAX(B.CDARVPROD)
                                                FROM
                                                   PERFILPROD A,
                                                   PRODUTO B
                                                WHERE A.CDPRODUTO = B.CDPRODUTO
                                                 AND  A.CDFILIAL  = P_CDFILIAL
                                                 AND  INSTR(PRODUTO.CDARVPROD, B.CDARVPROD) = W_UM)
                  AND PRODUTO.CDPRODUTO  = ITEMCOLE.CDPRODUTO
               ORDER BY VRCALCULADO;
            V_NRDIASEG     := NULL;
            V_NOVADATA     := NULL;
            V_DTMESENTREGA := NULL;
         END IF;
      ELSE
         V_LISTA_ESTOQUE_VAZIA := W_S;
         NOVO_CODIGO('LISTA', V_LISTA_ESTOQUE, 1);
         V_LISTA_ESTOQUE := SUBSTR(V_LISTA_ESTOQUE, 11, 10);
         V_MAX_QTDE_ESTOQUE := 0;

         FOR C_PROD_ESTOQUE IN
            (SELECT RELACPRODOL.CDPRODARVOL, RELACPRODOL.CDPRARVORIG, DECODE(NVL(PRODUTO.VRFATOCONV, 0), 0, 1, NVL(PRODUTO.VRFATOCONV, 0)) VRFATOCONV
               FROM PRODUTO, RELACPRODOL, PRODUTO PRODUTOOL
              WHERE PRODUTO.CDPRODESTO = V_ITEMSOLI_CDPRODUTO
                AND RELACPRODOL.CDPRARVORIG = PRODUTO.CDPRODUTO
                AND RELACPRODOL.CDPRODARVOL = PRODUTOOL.CDPRODUTO
                AND RELACPRODOL.CDPRARVORIG = NVL(V_CDPRODPREF, RELACPRODOL.CDPRARVORIG)
                AND (((PRODUTOOL.CDPRODUTO  = PRODUTOOL.CDPRODESTO) AND (V_IDUTLPRARVOLCMP = 'S')) OR
                    (V_IDUTLPRARVOLCMP = 'N')))
         LOOP
            V_COUNT := 0;
            SELECT COUNT(1)
            INTO V_COUNT
            FROM PRODUTO
            WHERE PRODUTO.CDPRODUTO = C_PROD_ESTOQUE.CDPRODARVOL
              AND PRODUTO.CDPRODUTO = PRODUTO.CDPRODESTO;
            IF V_COUNT > 0 THEN
               V_QTDE_ESTOQUE_ATUAL := (CALC_ESTOQ_CONS(V_CDFILIOLAGETERC, C_PROD_ESTOQUE.CDPRODARVOL, V_DTPROCESS_MAIS_UM));
               IF (V_QTDE_ESTOQUE_ATUAL > 0) THEN
                  IF V_MAX_QTDE_ESTOQUE < V_QTDE_ESTOQUE_ATUAL THEN
                     V_MAX_QTDE_ESTOQUE := V_QTDE_ESTOQUE_ATUAL;
                     V_LISTA_ESTOQUE_VAZIA := W_N;
                     DELETE FROM LISTA
                        WHERE NRLISTA = V_LISTA_ESTOQUE;
                     INSERT INTO LISTA
                        (NRLISTA, CDLISTA)
                     SELECT V_LISTA_ESTOQUE, C_PROD_ESTOQUE.CDPRARVORIG
                       FROM DUAL
                      WHERE NOT EXISTS(SELECT 1
                                         FROM LISTA L
                                        WHERE L.NRLISTA = V_LISTA_ESTOQUE
                                          AND L.CDLISTA = C_PROD_ESTOQUE.CDPRARVORIG) ;
                  END IF;
               END IF;
            END IF;
         END LOOP;
         IF V_LISTA_ESTOQUE_VAZIA = W_S THEN
            V_DTPOSIESTQ     := TO_DATE('01/01/1000', 'DD/MM/YYYY');
            V_DTPOSIESTQ_MAX := TO_DATE('01/01/1000', 'DD/MM/YYYY');
            FOR C_PROD_ESTOQUE IN
               (SELECT DISTINCT PRODUTOOL.CDPRODESTO, RELACPRODOL.CDPRARVORIG
                  FROM PRODUTO, RELACPRODOL, PRODUTO PRODUTOOL
                 WHERE PRODUTO.CDPRODESTO = V_ITEMSOLI_CDPRODUTO
                   AND RELACPRODOL.CDPRARVORIG = PRODUTO.CDPRODUTO
                   AND RELACPRODOL.CDPRODARVOL = PRODUTOOL.CDPRODUTO
                   AND RELACPRODOL.CDPRARVORIG = NVL(V_CDPRODPREF, RELACPRODOL.CDPRARVORIG)
                   AND (((PRODUTOOL.CDPRODUTO  = PRODUTOOL.CDPRODESTO) AND (V_IDUTLPRARVOLCMP = 'S')) OR
                       (V_IDUTLPRARVOLCMP = 'N')))
            LOOP
               SELECT NVL(MAX(DTPOSIESTQ), TO_DATE('01/01/1000', 'DD/MM/YYYY'))
                 INTO V_DTPOSIESTQ
                 FROM POSESTDIA
                WHERE CDFILIAL  = V_CDFILIOLAGETERC
                  AND CDPRODUTO = C_PROD_ESTOQUE.CDPRODESTO
                  AND NVL(QTESTOQDIA, 0)   > 0;
               IF (V_DTPOSIESTQ > TO_DATE('01/01/1000', 'DD/MM/YYYY')) THEN
                  IF V_DTPOSIESTQ_MAX < V_DTPOSIESTQ THEN
                     V_DTPOSIESTQ_MAX := V_DTPOSIESTQ;
                     V_LISTA_ESTOQUE_VAZIA := W_N;
                     DELETE FROM LISTA
                        WHERE NRLISTA = V_LISTA_ESTOQUE;
                     INSERT INTO LISTA
                        (NRLISTA, CDLISTA)
                     SELECT V_LISTA_ESTOQUE, C_PROD_ESTOQUE.CDPRARVORIG
                       FROM DUAL
                      WHERE NOT EXISTS(SELECT 1
                                         FROM LISTA L
                                        WHERE L.NRLISTA = V_LISTA_ESTOQUE
                                          AND L.CDLISTA = C_PROD_ESTOQUE.CDPRARVORIG) ;
                  END IF;
               END IF;
            END LOOP;
         END IF;
         IF V_LISTA_ESTOQUE_VAZIA = W_S THEN
            V_PRIMEIRA_VEZ := 'S';
            FOR C_PRODUTO_FILIAL IN
               (SELECT PRODUTO.CDPRODUTO
                  FROM PRODFILI, PRODUTO
                 WHERE PRODFILI.CDFILIAL = P_CDFILIAL
                   AND PRODFILI.CDPRODUTO = PRODUTO.CDPRODUTO
                   AND PRODUTO.CDPRODESTO = V_ITEMSOLI_CDPRODUTO
                   AND PRODUTO.CDPRODESTO <> PRODUTO.CDPRODUTO
                   AND NVL(PRODFILI.IDPRODATIV, W_A) = W_A
                   AND (((NVL(PRODUTO.IDPRCMPATIVO, W_S)= W_S) AND (V_CDPRODPREF IS NULL))
                    OR (V_CDPRODPREF = PRODUTO.CDPRODUTO))
                ORDER BY ((NVL(PRODUTO.VRFATOCONV, 1))*(NVL(PRODUTO.VRARREDCMP, 1))) DESC)
            LOOP
               IF V_PRIMEIRA_VEZ = 'S' THEN
                  INSERT INTO LISTA
                     (NRLISTA, CDLISTA)
                  VALUES
                     (V_LISTA_ESTOQUE, C_PRODUTO_FILIAL.CDPRODUTO);
                  V_PRIMEIRA_VEZ := W_N;
                  V_LISTA_ESTOQUE_VAZIA := W_N;
               END IF;
            END LOOP;
         END IF;
         IF ((V_COUNTPARTFILI >= 1) AND (V_IDEMBCONSPRECONECOL = 'N')) THEN
            SELECT VERIFICA_MARCA_OL(P_CDFILIAL, V_ITEMSOLI_CDFILSOLI, V_ITEMSOLI_CDPRODUTO,
                                     V_ITEMSOLI_DTPROGENTR, V_DTPROCESS, V_IDUTPRODPREF, V_LISTA_ESTOQUE_VAZIA, V_IDUTLPRARVOLCMP)
              INTO V_CDPROPARTFILI
              FROM DUAL;
            IF NVL(SUBSTR(V_CDPROPARTFILI, 23, 1), 'X') = '2' THEN
                V_LISTA_ESTOQUE_VAZIA := W_S;
            END IF;
            IF V_CDPRODPREF IS NULL THEN
               V_CDPRODPREF := SUBSTR(V_CDPROPARTFILI, 12, 10);
            END IF;
         END IF;
         IF V_IDEMBCONSPRECONECOL = 'N' THEN
            OPEN C_EMBALAGEM FOR
               SELECT
                  PRODUTO.CDPRODUTO,
                  PRODUTO.CDARVPROD,
                  NVL(PRODUTO.VRFATOCONV, W_UM) VRFATOCONV,
                  NVL(PRODUTO.VRARREDCMP, W_ZERO) VRARREDCMP,
                  PERFILPROD.CDPERIENTR,
                  SUBSTR(V_CDPROPARTFILI, 1, 10)  CDPRODARVOL
               FROM PRODUTO, PRODUTO PRODPERIENTR, PERFILPROD
               WHERE ((((NVL(PRODUTO.IDPRCMPATIVO, W_S)= W_S) AND (V_CDPRODPREF IS NULL)) OR (V_CDPRODPREF = PRODUTO.CDPRODUTO))
                  OR (((V_LISTA_ESTOQUE_VAZIA = W_N) AND (V_CDPRODPREF IS NULL)) OR (V_CDPRODPREF = PRODUTO.CDPRODUTO)))
                  AND PRODUTO.CDPRODESTO   = V_ITEMSOLI_CDPRODUTO
                  AND PERFILPROD.CDPRODUTO = PRODPERIENTR.CDPRODUTO
                  AND PERFILPROD.CDFILIAL  = P_CDFILIAL
                  AND ((V_LISTA_ESTOQUE_VAZIA = W_S) OR
                       (EXISTS (SELECT 1
                                FROM LISTA
                                WHERE LISTA.NRLISTA = V_LISTA_ESTOQUE
                                  AND LISTA.CDLISTA = PRODUTO.CDPRODUTO))
                      )
                  AND ((V_LISTA_ESTOQUE_VAZIA = W_N) OR
                       EXISTS (SELECT 1
                              FROM PRODFILI
                              WHERE PRODFILI.CDFILIAL = P_CDFILIAL
                                AND PRODFILI.CDPRODUTO = PRODUTO.CDPRODUTO
                                AND NVL(PRODFILI.IDPRODATIV, W_A) = W_A))
                  AND PRODPERIENTR.CDARVPROD = (SELECT
                                                   MAX(B.CDARVPROD)
                                                FROM
                                                   PERFILPROD A,
                                                   PRODUTO B
                                                WHERE A.CDPRODUTO = B.CDPRODUTO
                                                 AND  A.CDFILIAL  = P_CDFILIAL
                                                 AND  INSTR(PRODUTO.CDARVPROD, B.CDARVPROD) = W_UM)
                  AND ((LENGTH(V_CDPROPARTFILI) IS NULL) OR ((EXISTS(SELECT 1
                                                                     FROM RELACPRODOL
                                                                    WHERE RELACPRODOL.CDPRARVORIG = PRODUTO.CDPRODUTO
                                                                      AND RELACPRODOL.CDPRODARVOL = NVL(SUBSTR(V_CDPROPARTFILI, 1, 10), 'X')))))
               ORDER BY
                  ((NVL(PRODUTO.VRFATOCONV, 1))*(NVL(PRODUTO.VRARREDCMP, 1))) DESC;
         ELSE
            SELECT NVL(MAX(IDUTLMARPREFOL), W_N)
              INTO V_IDUTLMARPREFOL
              FROM PARASUPRI, FILIAL
             WHERE PARASUPRI.CDFILIAL = NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL)
               AND FILIAL.CDFILIAL    = V_ITEMSOLI_CDFILSOLI;
            SELECT NVL(MAX(IDUTPRODPREF), W_N)
              INTO V_IDUTPRODPREF
              FROM PARCMPSUP
             WHERE CDFILIAL           = V_ITEMSOLI_CDFILSOLI;

            V_NRDIASEG := 0;
            SELECT NVL(MAX(NRLIMISEGU), 0)
              INTO V_NRDIASEG
              FROM LIMISEGPROD, PRODUTO, PRODUTO PRODNIVELCOMPL
             WHERE CDFILIAL = P_CDFILIAL
               AND LIMISEGPROD.CDPRODUTO = PRODUTO.CDPRODUTO
               AND PRODNIVELCOMPL.CDPRODUTO = V_ITEMSOLI_CDPRODUTO
               AND PRODNIVELCOMPL.CDARVPROD LIKE PRODUTO.CDARVPROD||'%'
               AND PRODUTO.CDARVPROD = (SELECT MAX(B.CDARVPROD)
                                          FROM LIMISEGPROD A, PRODUTO B
                                         WHERE A.CDPRODUTO = B.CDPRODUTO
                                           AND A.CDFILIAL  = P_CDFILIAL
                                           AND INSTR(PRODNIVELCOMPL.CDARVPROD, B.CDARVPROD) = 1);
            IF V_NRDIASEG IS NULL THEN
               V_NRDIASEG := 0;
            END IF;

            V_NOVADATA := V_ITEMSOLI_DTPROGENTR - V_NRDIASEG;
            SELECT TO_DATE('01/'||TO_CHAR(V_NOVADATA,'MM/YYYY'), 'DD/MM/YYYY')
              INTO V_DTMESENTREGA
              FROM DUAL;

            SELECT MAX(PERFILPROD.CDPERIENTR)
              INTO V_CDPERIENTR
              FROM PERFILPROD, PRODUTO
             WHERE PERFILPROD.CDFILIAL  = P_CDFILIAL
               AND PERFILPROD.CDPRODUTO = PRODUTO.CDPRODUTO
               AND PRODUTO.CDARVPROD    = (SELECT MAX(B.CDARVPROD)
                                             FROM PERFILPROD A, PRODUTO B
                                            WHERE A.CDPRODUTO = B.CDPRODUTO
                                              AND A.CDFILIAL  = P_CDFILIAL
                                              AND INSTR(V_ITEMSOLI_CDARVPROD, B.CDARVPROD) = 1);

            SELECT NVL(MAX(CALECOMP.DTENTREGA), V_NOVADATA)
              INTO V_DTPROGENTR
              FROM CALECOMP
             WHERE CALECOMP.CDFILIAL    = P_CDFILIAL
               AND CALECOMP.CDPERIENTR  = V_CDPERIENTR
               AND CALECOMP.DTENTREGA  >= V_DTMESENTREGA
               AND CALECOMP.DTENTREGA  <= V_NOVADATA;

            OPEN C_EMBALAGEM FOR
               SELECT
                  PRODUTO.CDPRODUTO,
                  PRODUTO.CDARVPROD,
                  NVL(PRODUTO.VRFATOCONV, W_UM) VRFATOCONV,
                  NVL(PRODUTO.VRARREDCMP, W_ZERO) VRARREDCMP,
                  PERFILPROD.CDPERIENTR,
                  SUBSTR(ITEMCOLE.CDPRODARVOL, 1, 10) CDPRODARVOL
               FROM PRODUTO, PRODUTO PRODPERIENTR, PERFILPROD,
                    TABLE(APURA_PRECO_CONS_OL(V_CDFILCENTCMP, V_ITEMSOLI_CDFILSOLI,
                                              V_CDREGIAO, V_ITEMSOLI_CDPRODUTO,
                                              V_DTPROGENTR, V_ITEMSOLI_QTSOLIPROD,
                                              V_IDUTLMARPREFOL, V_IDTIPOAPUR,
                                              V_IDUTPRODPREF, P_CDFILIAL,
                                              V_CDMARCA)) ITEMCOLE
               WHERE (((NVL(PRODUTO.IDPRCMPATIVO, W_S)= W_S) AND (V_CDPRODPREF IS NULL))
                  OR (V_CDPRODPREF = PRODUTO.CDPRODUTO))
                  AND PRODUTO.CDPRODESTO    = V_ITEMSOLI_CDPRODUTO
                  AND PERFILPROD.CDPRODUTO  = PRODPERIENTR.CDPRODUTO
                  AND PERFILPROD.CDFILIAL   = P_CDFILIAL
                  AND EXISTS (SELECT 1
                              FROM PRODFILI
                              WHERE PRODFILI.CDFILIAL = P_CDFILIAL
                                AND PRODFILI.CDPRODUTO = PRODUTO.CDPRODUTO
                                AND NVL(PRODFILI.IDPRODATIV, W_A) = W_A)
                  AND PRODPERIENTR.CDARVPROD = (SELECT
                                                   MAX(B.CDARVPROD)
                                                FROM
                                                   PERFILPROD A,
                                                   PRODUTO B
                                                WHERE A.CDPRODUTO = B.CDPRODUTO
                                                 AND  A.CDFILIAL  = P_CDFILIAL
                                                 AND  INSTR(PRODUTO.CDARVPROD, B.CDARVPROD) = W_UM)
                  AND PRODUTO.CDPRODUTO  = ITEMCOLE.CDPRODUTO
               ORDER BY VRCALCULADO;
            V_NRDIASEG     := NULL;
            V_NOVADATA     := NULL;
            V_DTMESENTREGA := NULL;
         END IF;
         DELETE FROM LISTA
         WHERE NRLISTA = V_LISTA_ESTOQUE;
      END IF;
      LOOP
         FETCH C_EMBALAGEM INTO V_EMBALAGEM_CDPRODUTO,  V_EMBALAGEM_CDARVPROD,
                                V_EMBALAGEM_VRFATOCONV, V_EMBALAGEM_VRARREDCMP,
                                V_EMBALAGEM_CDPERIENTR, V_EMBALAGEM_CDPRARVOL;

         IF V_IDUTLMARPREFOL = 'N' THEN
            V_EMBALAGEM_CDPRARVOL := NULL;
         END IF;
         IF V_EMBALAGEM_CDPRODUTO IS NOT NULL THEN
            V_COUNT := 0;
            SELECT COUNT(1)
              INTO V_COUNT
              FROM PRODFILI
             WHERE PRODFILI.CDPRODUTO = V_EMBALAGEM_CDPRODUTO
               AND PRODFILI.CDFILIAL = P_CDFILIAL;
            IF V_COUNT > 0 THEN
               UPDATE PRODFILI
                  SET IDPRODATIV = W_A
                WHERE PRODFILI.CDPRODUTO = V_EMBALAGEM_CDPRODUTO
                  AND PRODFILI.CDFILIAL = P_CDFILIAL
                  AND PRODFILI.IDPRODATIV = W_I;
            ELSE
               INSERT INTO PRODFILI (CDFILIAL, CDPRODUTO, IDPRODATIV)
               VALUES(P_CDFILIAL, V_EMBALAGEM_CDPRODUTO, W_A);
            END IF;

            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;
            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;
               /*Alteracao comprando a menos na Apetit*/
               IF (V_QTDERESTANTE > W_ZERO) AND (V_EMBALAGEM_VRARREDCMP > W_UM) THEN
                  V_QTDEPRODUTO := V_QTDEPRODUTO + V_EMBALAGEM_VRARREDCMP;
                  V_QTDERESTANTE := W_ZERO;
                  V_CONTADOR := V_CONTADOR + V_EMBALAGEM_VRARREDCMP;
               END IF;
            END IF;
            IF V_QTDEPRODUTO > W_ZERO THEN
               V_NRDIASEG := 0;
               SELECT MAX(NRLIMISEGU)
                 INTO V_NRDIASEG
                 FROM LIMISEGPROD, PRODUTO, PRODUTO PRODNIVELCOMPL
                WHERE CDFILIAL = P_CDFILIAL
                  AND LIMISEGPROD.CDPRODUTO = PRODUTO.CDPRODUTO
                  AND PRODNIVELCOMPL.CDPRODUTO = V_EMBALAGEM_CDPRODUTO
                  AND PRODNIVELCOMPL.CDARVPROD LIKE PRODUTO.CDARVPROD||'%'
                  AND PRODUTO.CDARVPROD = (SELECT MAX(B.CDARVPROD)
                                             FROM LIMISEGPROD A, PRODUTO B
                                            WHERE A.CDPRODUTO = B.CDPRODUTO
                                              AND A.CDFILIAL  = P_CDFILIAL
                                              AND INSTR(PRODNIVELCOMPL.CDARVPROD, B.CDARVPROD) = 1);
               IF V_NRDIASEG IS NULL THEN
                  V_NRDIASEG := 0;
               END IF;

               V_NOVADATA := V_ITEMSOLI_DTPROGENTR - V_NRDIASEG;
               SELECT
                  TO_DATE('01/'||TO_CHAR(V_NOVADATA,'MM/YYYY'), 'DD/MM/YYYY')
               INTO
                  V_DTMESENTREGA
               FROM
                  DUAL;

               SELECT
                  MAX(CALECOMP.DTENTREGA)
               INTO
                  V_DTENTREGA
               FROM
                  CALECOMP
               WHERE CALECOMP.CDFILIAL    = P_CDFILIAL
                 AND CALECOMP.CDPERIENTR  = V_EMBALAGEM_CDPERIENTR
                 AND CALECOMP.DTENTREGA  >= V_DTMESENTREGA
                 AND CALECOMP.DTENTREGA  <= V_NOVADATA;

               IF V_DTENTREGA IS NULL THEN
                  IF V_IDCALCALECOMPOL = 'S' THEN
                     CALC_DATA_ENTR_MES(P_CDFILIAL,
                                        V_EMBALAGEM_CDPERIENTR,
                                        V_DTMESENTREGA,
                                        W_UM,
                                        V_DTPROCESS);
                  END IF;

                  SELECT
                     MAX(CALECOMP.DTENTREGA)
                  INTO
                     V_DTENTREGA
                  FROM
                     CALECOMP
                  WHERE CALECOMP.CDFILIAL    = P_CDFILIAL
                    AND CALECOMP.CDPERIENTR  = V_EMBALAGEM_CDPERIENTR
                    AND CALECOMP.DTENTREGA  <= V_NOVADATA;
               END IF;

               IF (((V_DTENTREGA IS NOT NULL) AND (V_DTENTREGA >= P_DTINICIAL) AND (V_DTENTREGA <= P_DTFINAL) AND (P_GERASOLOPERLOG = 'S')) OR
                  ((V_DTENTREGA IS NOT NULL) AND (P_GERASOLOPERLOG = 'N')))  THEN
                  INSERT INTO PRODCONSSOLOL
                     (NRSEQUCONSOL, CDFILSOLI, CDFILLAN, CDPRODUTO, QTESTUTILCONSOL)
                  SELECT
                     P_NRSEQCONSOL,
                     P_CDFILIAL,
                     P_CDFILLANC,
                     NVL(V_EMBALAGEM_CDPRARVOL, V_EMBALAGEM_CDPRODUTO),
                     W_ZERO
                  FROM
                     DUAL
                  WHERE
                     NOT EXISTS (SELECT W_UM
                                 FROM PRODCONSSOLOL P
                                 WHERE P.NRSEQUCONSOL =  P_NRSEQCONSOL
                                   AND P.CDFILSOLI    =  P_CDFILIAL
                                   AND P.CDFILLAN     =  P_CDFILLANC
                                   AND P.CDPRODUTO    =  NVL(V_EMBALAGEM_CDPRARVOL, V_EMBALAGEM_CDPRODUTO)
                                 );
                  V_QTSEGURANCA        := 0;
                  V_QTESTOQUESEGURANCA := 0;
                  IF SQL%ROWCOUNT > 0 THEN

                     FOR C_ESTOQUE IN
                       (SELECT
                           RELACPRODOL.CDPRODARVOL,
                           PRODUTO.CDPRODESTO,
                           RELACPRODOL.CDMARCA
                        FROM
                           RELACPRODOL, PRODUTO
                        WHERE ((RELACPRODOL.CDPRARVORIG = V_EMBALAGEM_CDPRODUTO AND V_EMBALAGEM_CDPRARVOL IS NULL) OR
                               (RELACPRODOL.CDPRODARVOL = V_EMBALAGEM_CDPRARVOL AND V_EMBALAGEM_CDPRARVOL IS NOT NULL))
                          AND RELACPRODOL.CDPRODARVOL = PRODUTO.CDPRODUTO
                        )
                     LOOP
                        V_QTESTOQUENECCMP    := W_ZERO;
                        V_QTDE_ENTRADA       := W_ZERO;
                        V_QTDE_SAIDA         := W_ZERO;
                        V_QTESTOQUENECCMPAUX := W_ZERO;

                        IF C_ESTOQUE.CDPRODARVOL = C_ESTOQUE.CDPRODESTO THEN
                           SELECT
                              CALC_ESTOQ_CONS(V_CDFILIOLAGETERC, C_ESTOQUE.CDPRODARVOL, V_DTPROCESS_MAIS_UM)
                           INTO
                              V_QTESTOQUENECCMP
                           FROM
                              DUAL;

                           SELECT
                              SUM(ITEMAUTF.QTPROGENTAF)
                           INTO
                              V_QTDE_ENTRADA
                           FROM
                              ITEMAUTF
                           WHERE ITEMAUTF.CDFILDEST   = P_CDFILIAL
                             AND ITEMAUTF.DTPROGENTAF BETWEEN V_DTPROCESS AND P_DTFINAL
                             AND ITEMAUTF.CDPRODUTO   = C_ESTOQUE.CDPRODARVOL
                             AND ITEMAUTF.IDBAIXITMAF IS NULL
                             AND EXISTS (SELECT
                                             W_UM
                                          FROM
                                             AUTOFORNE
                                          WHERE AUTOFORNE.CDFILLANC  = ITEMAUTF.CDFILLANC
                                            AND AUTOFORNE.CDFILDEST  = ITEMAUTF.CDFILDEST
                                            AND AUTOFORNE.NRAUTOFORN = ITEMAUTF.NRAUTOFORN
                                            AND NVL(AUTOFORNE.IDBAIXAAF, '1') = '1');
                           IF P_PREVISAOCONSUMO = W_N THEN
                              IF V_EMBALAGEM_CDPRARVOL IS NULL THEN
                                 SELECT
                                    SUM(NVL(ITEMPEDEXOL.QTATENDPEDOL, ITEMPEDEXOL.QTPROGENPEOL))
                                 INTO
                                    V_QTDE_SAIDA
                                 FROM
                                    ITEMPEDEXOL,
                                    PEDIDOEXOL
                                 WHERE ITEMPEDEXOL.CDFILDEST     = PEDIDOEXOL.CDFILDEST
                                   AND ITEMPEDEXOL.CDFILLANC     = PEDIDOEXOL.CDFILLANC
                                   AND ITEMPEDEXOL.NRPEDEXOL     = PEDIDOEXOL.NRPEDEXOL
                                   AND ITEMPEDEXOL.IDBAIXAOLSAI  IS NULL
                                   AND PEDIDOEXOL.CDFILIOPELOG   = P_CDFILIAL
                                   AND ITEMPEDEXOL.CDPRODUTO     = V_EMBALAGEM_CDPRODUTO
                                   AND ITEMPEDEXOL.CDMARCA       = C_ESTOQUE.CDMARCA
                                   AND NVL(ITEMPEDEXOL.QTATENDPEDOL, 1) > 0
                                   AND ITEMPEDEXOL.DTPROGEMBARQ  BETWEEN V_DTPROCESS AND P_DTFINAL;
                              ELSE
                                 SELECT
                                    SUM(NVL(ITEMPEDEXOL.QTATENDPEDOL, ITEMPEDEXOL.QTPROGENPEOL))
                                 INTO
                                    V_QTDE_SAIDA
                                 FROM
                                    ITEMPEDEXOL,
                                    PEDIDOEXOL, RELACPRODOL
                                 WHERE ITEMPEDEXOL.CDFILDEST     = PEDIDOEXOL.CDFILDEST
                                   AND ITEMPEDEXOL.CDFILLANC     = PEDIDOEXOL.CDFILLANC
                                   AND ITEMPEDEXOL.NRPEDEXOL     = PEDIDOEXOL.NRPEDEXOL
                                   AND ITEMPEDEXOL.IDBAIXAOLSAI  IS NULL
                                   AND PEDIDOEXOL.CDFILIOPELOG   = P_CDFILIAL
                                   AND ITEMPEDEXOL.CDPRODUTO     = V_EMBALAGEM_CDPRODUTO
                                   AND ITEMPEDEXOL.CDPRODUTO     = RELACPRODOL.CDPRARVORIG
                                   AND ITEMPEDEXOL.CDMARCA       = RELACPRODOL.CDMARCA
                                   AND RELACPRODOL.CDPRODARVOL   = V_EMBALAGEM_CDPRARVOL
                                   AND ITEMPEDEXOL.CDMARCA       = C_ESTOQUE.CDMARCA
                                   AND NVL(ITEMPEDEXOL.QTATENDPEDOL, 1) > 0
                                   AND ITEMPEDEXOL.DTPROGEMBARQ  BETWEEN V_DTPROCESS AND P_DTFINAL;
                              END IF;
                              V_QTESTOQUENECCMP    := NVL(V_QTESTOQUENECCMP, W_ZERO);
                              V_QTDE_ENTRADA       := NVL(V_QTDE_ENTRADA, W_ZERO);
                              V_QTDE_SAIDA         := NVL(V_QTDE_SAIDA, W_ZERO);
                              V_QTESTOQUENECCMPAUX := V_QTESTOQUENECCMP;
                              V_QTESTOQUENECCMP    := V_QTESTOQUENECCMP + V_QTDE_ENTRADA - V_QTDE_SAIDA;

                           ELSE
                              V_MAX_LIMISEGU    := 0;
                              V_MAX_LIMISEGU_OL := 0;
                              SELECT NVL(MAX(CARREGA_LIMISEGU(V_ITEMSOLI_CDFILSOLI, CDARVPROD, P_DTINICIAL)), 0)
                                INTO V_MAX_LIMISEGU
                                FROM PRODUTO
                               WHERE CDPRODUTO = V_EMBALAGEM_CDPRODUTO
                                 AND CDPRODESTO IS NOT NULL;

                              SELECT NVL(MAX(CARREGA_LIMISEGU(P_CDFILIAL, CDARVPROD, P_DTINICIAL)), 0)
                                INTO V_MAX_LIMISEGU_OL
                                FROM PRODUTO
                               WHERE CDPRODUTO = V_EMBALAGEM_CDPRODUTO
                                 AND CDPRODESTO IS NOT NULL;

                              IF P_GERASOLOPERLOG = 'S' THEN
                                 SELECT MIN(CALECOMP.DTENTREGA) /*PRIMEIRA ENTREGA NO OL*/
                                   INTO V_DTPRIMEIRA
                                   FROM CALECOMP
                                  WHERE CALECOMP.CDFILIAL   =  P_CDFILIAL
                                    AND CALECOMP.CDPERIENTR =  V_EMBALAGEM_CDPERIENTR
                                    AND CALECOMP.DTENTREGA  > P_DTINICIAL;

                                 SELECT MAX(CEIL(SUM(TRABNECECOMP.QTPRCNVCOMPR*PRODUTONECE.VRFATOCONV)/V_EMBALAGEM_VRFATOCONV))
                                   INTO V_QTDE_SAIDA
                                   FROM TRABNECECOMP, PRODUTO PRODUTONECE, PRODUTO PRODCMP
                                  WHERE PRODUTONECE.CDPRODUTO       = TRABNECECOMP.CDPRODNECCMP
                                    AND PRODUTONECE.CDPRODESTO      = PRODCMP.CDPRODESTO
                                    AND (PRODCMP.CDPRODUTO          = V_EMBALAGEM_CDPRODUTO)
                                    AND (TRABNECECOMP.DTENTRNECCMP >= V_DTPROCESS)
                                    AND (TRABNECECOMP.DTENTRNECCMP <= V_DTPRIMEIRA+V_MAX_LIMISEGU_OL-1)
                                    AND (TRABNECECOMP.CDFILNECECMP <> P_CDFILIAL)
                                    AND (TRABNECECOMP.NRNECECOMP    = V_PRXNECECOMP)
                                    AND (TRABNECECOMP.CDFILIOPELOG  = P_CDFILIAL)
                                  GROUP BY PRODUTONECE.VRFATOCONV;
                              ELSE
                                 SELECT MAX(CEIL(SUM(TRABNECECOMP.QTPRCNVCOMPR*PRODUTONECE.VRFATOCONV)/V_EMBALAGEM_VRFATOCONV))
                                   INTO V_QTDE_SAIDA
                                   FROM TRABNECECOMP, PRODUTO PRODUTONECE, PRODUTO PRODCMP
                                  WHERE PRODUTONECE.CDPRODUTO       = TRABNECECOMP.CDPRODNECCMP
                                    AND PRODUTONECE.CDPRODESTO      = PRODCMP.CDPRODESTO
                                    AND (PRODCMP.CDPRODUTO          = V_EMBALAGEM_CDPRODUTO)
                                    AND (TRABNECECOMP.DTENTRNECCMP  BETWEEN V_DTPROCESS AND P_DTINICIAL+V_MAX_LIMISEGU)
                                    AND (TRABNECECOMP.CDFILNECECMP  <> P_CDFILIAL)
                                    AND (TRABNECECOMP.NRNECECOMP    = V_PRXNECECOMP)
                                    AND (TRABNECECOMP.CDFILIOPELOG  = P_CDFILIAL)
                                  GROUP BY PRODUTONECE.VRFATOCONV;
                              END IF;

                              V_QTESTOQUENECCMP    := NVL(V_QTESTOQUENECCMP, W_ZERO);
                              V_QTDE_ENTRADA       := NVL(V_QTDE_ENTRADA, W_ZERO);
                              V_QTDE_SAIDA         := NVL(V_QTDE_SAIDA, W_ZERO);
                              V_QTESTOQUENECCMPAUX := V_QTESTOQUENECCMP;
                              V_QTESTOQUENECCMP    := V_QTESTOQUENECCMP + V_QTDE_ENTRADA - V_QTDE_SAIDA;

                           END IF;
                           SELECT NVL(MAX(QTESTOSEGU), 0)
                             INTO V_QTSEGURANCA
                             FROM ESTOSEGU, RELACPRODOL, PRODUTO
                            WHERE ESTOSEGU.CDPRODESTO     = PRODUTO.CDPRODESTO
                              AND PRODUTO.CDPRODUTO       = RELACPRODOL.CDPRODARVOL
                              AND ESTOSEGU.CDFILIAL       = P_CDFILIAL
                              AND RELACPRODOL.CDPRARVORIG = V_EMBALAGEM_CDPRODUTO
                              AND RELACPRODOL.CDMARCA     = V_CDMARCA_PADRAO;
                           IF V_QTESTOQUENECCMP - V_QTSEGURANCA> W_ZERO THEN
                              INSERT INTO
                                 ESTOCONSSOLOL (NRSEQUCONSOL, CDFILSOLI, CDFILLAN,
                                                CDPRODUTO, CDPRODARVOL, QTESTOPRODOL,
                                                QTORIGPRODOL, IDUTESTCONSOL, QTENTRCONSOL,
                                                QTSAIDACONSOL, DTCONSESTCONSOL)
                              SELECT
                                 P_NRSEQCONSOL,
                                 P_CDFILIAL,
                                 P_CDFILLANC,
                                 NVL(V_EMBALAGEM_CDPRARVOL, V_EMBALAGEM_CDPRODUTO),
                                 C_ESTOQUE.CDPRODARVOL,
                                 V_QTESTOQUENECCMP - V_QTSEGURANCA,
                                 V_QTESTOQUENECCMP,
                                 W_N,
                                 V_QTDE_ENTRADA,
                                 V_QTDE_SAIDA,
                                 V_DTPROCESS
                              FROM
                                 DUAL
                              WHERE
                                 NOT EXISTS (SELECT W_UM
                                             FROM ESTOCONSSOLOL E
                                             WHERE E.NRSEQUCONSOL = P_NRSEQCONSOL
                                               AND E.CDFILSOLI    = P_CDFILIAL
                                               AND E.CDFILLAN     = P_CDFILLANC
                                               AND E.CDPRODUTO    = NVL(V_EMBALAGEM_CDPRARVOL, V_EMBALAGEM_CDPRODUTO)
                                               AND E.CDPRODARVOL  = C_ESTOQUE.CDPRODARVOL);
                           END IF;
                           V_QTSEGURANCA := 0;
                        ELSE
                           SELECT
                              CALC_ESTOQ_CONS(V_CDFILIOLAGETERC, C_ESTOQUE.CDPRODESTO, V_DTPROCESS_MAIS_UM)
                           INTO
                              V_QTESTOQUENECCMP
                           FROM
                              DUAL;

                           SELECT
                              SUM(ITEMAUTF.QTPROGENTAF*NVL(PRODUTO.VRFATOCONV, 1))
                           INTO
                              V_QTDE_ENTRADA
                           FROM
                              ITEMAUTF, PRODUTO
                           WHERE ITEMAUTF.CDFILDEST   = P_CDFILIAL
                             AND ITEMAUTF.DTPROGENTAF BETWEEN V_DTPROCESS AND P_DTFINAL
                             AND ITEMAUTF.CDPRODUTO   = PRODUTO.CDPRODUTO
                             AND PRODUTO.CDPRODESTO   = C_ESTOQUE.CDPRODESTO
                             AND ITEMAUTF.IDBAIXITMAF IS NULL
                             AND EXISTS (SELECT
                                             W_UM
                                          FROM
                                             AUTOFORNE
                                          WHERE AUTOFORNE.CDFILLANC  = ITEMAUTF.CDFILLANC
                                            AND AUTOFORNE.CDFILDEST  = ITEMAUTF.CDFILDEST
                                            AND AUTOFORNE.NRAUTOFORN = ITEMAUTF.NRAUTOFORN
                                            AND NVL(AUTOFORNE.IDBAIXAAF, '1') = '1');
                           IF P_PREVISAOCONSUMO = W_N THEN
                              SELECT
                                 SUM(NVL(ITEMPEDEXOL.QTATENDPEDOL, ITEMPEDEXOL.QTPROGENPEOL)*NVL(PRODUTO.VRFATOCONV,1))
                              INTO
                                 V_QTDE_SAIDA
                              FROM
                                 ITEMPEDEXOL,
                                 PEDIDOEXOL,
                                 PRODUTO
                              WHERE ITEMPEDEXOL.CDFILDEST     = PEDIDOEXOL.CDFILDEST
                                AND ITEMPEDEXOL.CDFILLANC     = PEDIDOEXOL.CDFILLANC
                                AND ITEMPEDEXOL.NRPEDEXOL     = PEDIDOEXOL.NRPEDEXOL
                                AND ITEMPEDEXOL.IDBAIXAOLSAI  IS NULL
                                AND PEDIDOEXOL.CDFILIOPELOG   = P_CDFILIAL
                                AND ITEMPEDEXOL.CDPRODUTO     = PRODUTO.CDPRODUTO
                                AND PRODUTO.CDPRODESTO        = C_ESTOQUE.CDPRODESTO
                                AND ITEMPEDEXOL.CDMARCA       = C_ESTOQUE.CDMARCA
                                AND NVL(ITEMPEDEXOL.QTATENDPEDOL, 1) > 0
                                AND ITEMPEDEXOL.DTPROGEMBARQ  BETWEEN V_DTPROCESS AND P_DTFINAL;

                              V_QTESTOQUENECCMP    := NVL(V_QTESTOQUENECCMP, W_ZERO);
                              V_QTDE_ENTRADA       := NVL(V_QTDE_ENTRADA, W_ZERO);
                              V_QTDE_SAIDA         := NVL(V_QTDE_SAIDA, W_ZERO);
                              V_QTESTOQUENECCMPAUX := V_QTESTOQUENECCMP;
                              V_QTESTOQUENECCMP    := V_QTESTOQUENECCMP + V_QTDE_ENTRADA - V_QTDE_SAIDA;
                              
                           ELSE
                              V_MAX_LIMISEGU    := 0;
                              V_MAX_LIMISEGU_OL := 0;
                              SELECT NVL(MAX(CARREGA_LIMISEGU(V_ITEMSOLI_CDFILSOLI, CDARVPROD, P_DTINICIAL)), 0)
                                INTO V_MAX_LIMISEGU
                                FROM PRODUTO
                               WHERE CDPRODUTO = V_EMBALAGEM_CDPRODUTO
                                 AND CDPRODESTO IS NOT NULL;

                              SELECT NVL(MAX(CARREGA_LIMISEGU(P_CDFILIAL, CDARVPROD, P_DTINICIAL)), 0)
                                INTO V_MAX_LIMISEGU_OL
                                FROM PRODUTO
                               WHERE CDPRODUTO = V_EMBALAGEM_CDPRODUTO
                                 AND CDPRODESTO IS NOT NULL;

                              IF P_GERASOLOPERLOG = 'S' THEN
                                 SELECT MIN(CALECOMP.DTENTREGA) /*PRIMEIRA ENTREGA NO OL*/
                                   INTO V_DTPRIMEIRA
                                   FROM CALECOMP
                                  WHERE CALECOMP.CDFILIAL   =  P_CDFILIAL
                                    AND CALECOMP.CDPERIENTR =  V_EMBALAGEM_CDPERIENTR
                                    AND CALECOMP.DTENTREGA  > P_DTINICIAL;

                                 SELECT MAX(CEIL(SUM(TRABNECECOMP.QTPRCNVCOMPR*PRODUTONECE.VRFATOCONV)/V_EMBALAGEM_VRFATOCONV))
                                   INTO V_QTDE_SAIDA
                                   FROM TRABNECECOMP, PRODUTO PRODUTONECE, PRODUTO PRODCMP
                                  WHERE PRODUTONECE.CDPRODUTO       = TRABNECECOMP.CDPRODNECCMP
                                    AND PRODUTONECE.CDPRODESTO      = PRODCMP.CDPRODESTO
                                    AND (PRODCMP.CDPRODUTO          = V_EMBALAGEM_CDPRODUTO)
                                    AND (TRABNECECOMP.DTENTRNECCMP >= V_DTPROCESS)
                                    AND (TRABNECECOMP.DTENTRNECCMP <= V_DTPRIMEIRA+V_MAX_LIMISEGU_OL-1)
                                    AND (TRABNECECOMP.CDFILNECECMP <> P_CDFILIAL)
                                    AND (TRABNECECOMP.NRNECECOMP    = V_PRXNECECOMP)
                                    AND (TRABNECECOMP.CDFILIOPELOG  = P_CDFILIAL)
                                  GROUP BY PRODUTONECE.VRFATOCONV;
                              ELSE
                                 SELECT MAX(CEIL(SUM(TRABNECECOMP.QTPRCNVCOMPR*PRODUTONECE.VRFATOCONV)/V_EMBALAGEM_VRFATOCONV))
                                   INTO V_QTDE_SAIDA
                                   FROM TRABNECECOMP, PRODUTO PRODUTONECE, PRODUTO PRODCMP
                                  WHERE PRODUTONECE.CDPRODUTO       = TRABNECECOMP.CDPRODNECCMP
                                    AND PRODUTONECE.CDPRODESTO      = PRODCMP.CDPRODESTO
                                    AND (PRODCMP.CDPRODUTO          = V_EMBALAGEM_CDPRODUTO)
                                    AND (TRABNECECOMP.DTENTRNECCMP  BETWEEN V_DTPROCESS AND P_DTINICIAL+V_MAX_LIMISEGU)
                                    AND (TRABNECECOMP.CDFILNECECMP  <> P_CDFILIAL)
                                    AND (TRABNECECOMP.NRNECECOMP    = V_PRXNECECOMP)
                                    AND (TRABNECECOMP.CDFILIOPELOG  = P_CDFILIAL)
                                  GROUP BY PRODUTONECE.VRFATOCONV;
                              END IF;

                              V_QTESTOQUENECCMP    := NVL(V_QTESTOQUENECCMP, W_ZERO);
                              V_QTDE_ENTRADA       := NVL(V_QTDE_ENTRADA, W_ZERO);
                              V_QTDE_SAIDA         := NVL(V_QTDE_SAIDA, W_ZERO);
                              V_QTESTOQUENECCMPAUX := V_QTESTOQUENECCMP;
                              V_QTESTOQUENECCMP    := V_QTESTOQUENECCMP + V_QTDE_ENTRADA - V_QTDE_SAIDA;

                           END IF;
                           SELECT NVL(MAX(QTESTOSEGU), 0)
                             INTO V_QTSEGURANCA
                             FROM ESTOSEGU, RELACPRODOL, PRODUTO
                            WHERE ESTOSEGU.CDPRODESTO     = PRODUTO.CDPRODESTO
                              AND PRODUTO.CDPRODUTO       = RELACPRODOL.CDPRODARVOL
                              AND ESTOSEGU.CDFILIAL       = P_CDFILIAL
                              AND RELACPRODOL.CDPRARVORIG = V_EMBALAGEM_CDPRODUTO
                              AND RELACPRODOL.CDMARCA     = V_CDMARCA_PADRAO;
                           IF V_QTESTOQUENECCMP - V_QTSEGURANCA> W_ZERO THEN
                              INSERT INTO
                                 ESTOCONSSOLOL (NRSEQUCONSOL, CDFILSOLI, CDFILLAN,
                                                CDPRODUTO, CDPRODARVOL, QTESTOPRODOL,
                                                QTORIGPRODOL, IDUTESTCONSOL,
                                                QTENTRCONSOL, QTSAIDACONSOL, DTCONSESTCONSOL)
                              SELECT
                                 P_NRSEQCONSOL,
                                 P_CDFILIAL,
                                 P_CDFILLANC,
                                 NVL(V_EMBALAGEM_CDPRARVOL, V_EMBALAGEM_CDPRODUTO),
                                 C_ESTOQUE.CDPRODESTO,
                                 V_QTESTOQUENECCMP - V_QTSEGURANCA,
                                 V_QTESTOQUENECCMP,
                                 W_N,
                                 V_QTDE_ENTRADA,
                                 V_QTDE_SAIDA,
                                 V_DTPROCESS
                              FROM
                                 DUAL
                              WHERE
                                 NOT EXISTS (SELECT W_UM
                                             FROM ESTOCONSSOLOL E
                                             WHERE E.NRSEQUCONSOL = P_NRSEQCONSOL
                                               AND E.CDFILSOLI    = P_CDFILIAL
                                               AND E.CDFILLAN     = P_CDFILLANC
                                               AND E.CDPRODUTO    = NVL(V_EMBALAGEM_CDPRARVOL, V_EMBALAGEM_CDPRODUTO)
                                               AND E.CDPRODARVOL  = C_ESTOQUE.CDPRODESTO);
                           END IF;
                           V_QTSEGURANCA := 0;
                        END IF;
                        SELECT NVL(MAX(QTESTOSEGU), 0)
                          INTO V_QTSEGURANCA
                          FROM ESTOSEGU, RELACPRODOL
                         WHERE ESTOSEGU.CDPRODESTO     = RELACPRODOL.CDPRODARVOL
                           AND ESTOSEGU.CDFILIAL       = P_CDFILIAL
                           AND RELACPRODOL.CDPRARVORIG = V_EMBALAGEM_CDPRODUTO
                           AND RELACPRODOL.CDMARCA     = V_CDMARCA_PADRAO;
                        IF (V_QTSEGURANCA > 0) THEN
                           IF (V_QTSEGURANCA - V_QTESTOQUENECCMPAUX) > 0 THEN
                              V_QTSEGURANCA := (V_QTSEGURANCA - V_QTESTOQUENECCMPAUX);
                           ELSE
                              V_QTSEGURANCA := 0;
                           END IF;
                        END IF;
                     END LOOP;
                  END IF;
                  INSERT INTO ITMPRODCONSSOLOL
                     (NRSEQUCONSOL, CDFILSOLI, CDFILLAN, CDPRODUTO, QTESTUTILCONSOL, CDFILDEST)
                  SELECT
                     P_NRSEQCONSOL,
                     P_CDFILIAL,
                     P_CDFILLANC,
                     NVL(V_EMBALAGEM_CDPRARVOL, V_EMBALAGEM_CDPRODUTO),
                     W_ZERO,
                     V_ITEMSOLI_CDFILSOLI
                  FROM
                     DUAL
                  WHERE
                     NOT EXISTS (SELECT W_UM
                                 FROM ITMPRODCONSSOLOL I
                                 WHERE I.NRSEQUCONSOL =  P_NRSEQCONSOL
                                   AND I.CDFILSOLI    =  P_CDFILIAL
                                   AND I.CDFILLAN     =  P_CDFILLANC
                                   AND I.CDPRODUTO    =  NVL(V_EMBALAGEM_CDPRARVOL, V_EMBALAGEM_CDPRODUTO)
                                   AND I.CDFILDEST    =  V_ITEMSOLI_CDFILSOLI
                                 );
                  V_QTDEPRODUTO := V_QTDEPRODUTO * (1 + (P_PEACRESCIMO / 100));

                  UPDATE ITEMCONSSOLOL
                  SET
                     QTENTRCONSOL    = QTENTRCONSOL + V_QTDEPRODUTO,
                     QTESTOCONSOL    = W_ZERO,
                     IDENTREGAVIAOL  = W_S
                  WHERE NRSEQUCONSOL =  P_NRSEQCONSOL
                    AND CDFILSOLI    =  P_CDFILIAL
                    AND CDFILLAN     =  P_CDFILLANC
                    AND CDPRODUTO    =  NVL(V_EMBALAGEM_CDPRARVOL, V_EMBALAGEM_CDPRODUTO)
                    AND DTENTRCONSOL =  V_DTENTREGA;

                  IF SQL%NOTFOUND THEN
                     SELECT COUNT(1)
                       INTO V_CONTADOR1
                       FROM ITEMCONSSOLOL
                      WHERE NRSEQUCONSOL =  P_NRSEQCONSOL
                        AND CDFILSOLI    =  P_CDFILIAL
                        AND CDFILLAN     =  P_CDFILLANC
                        AND CDPRODUTO    =  NVL(V_EMBALAGEM_CDPRARVOL, V_EMBALAGEM_CDPRODUTO);
                     IF V_CONTADOR1 > 0 THEN
                        V_QTSEGURANCA := 0;
                     END IF;
                     INSERT INTO ITEMCONSSOLOL
                        (NRSEQUCONSOL, CDFILSOLI, CDFILLAN, CDPRODUTO, DTENTRCONSOL,
                         QTENTRCONSOL, QTESTOCONSOL, IDENTREGAVIAOL)
                     VALUES
                        (P_NRSEQCONSOL, P_CDFILIAL, P_CDFILLANC, NVL(V_EMBALAGEM_CDPRARVOL, V_EMBALAGEM_CDPRODUTO),
                         V_DTENTREGA, V_QTDEPRODUTO+V_QTSEGURANCA, W_ZERO, W_S);
                  END IF;

                  UPDATE LOGITEMSOLICONS
                     SET DTENTRCONSOL = V_DTENTREGA
                   WHERE NRSEQUCONSOL = P_NRSEQCONSOL
                     AND CDFILIOPELOG = P_CDFILIAL
                     AND CDFILSOLI    = V_ITEMSOLI_CDFILSOLI
                     AND CDFILLAN     = P_CDFILLANC
                     AND CDPRODUTO    = V_ITEMSOLI_CDPRODUTO
                     AND DTPROGENTR   = V_ITEMSOLI_DTPROGENTR;

                  IF P_PREVISAOCONSUMO = W_N THEN
                     BEGIN
                        INSERT INTO RELACONSOLOL
                           (CDFILSOLI, CDFILLAN, NRSOLICMP, CDPRODUTO, DTPROGENTR,
                            NRSEQUCONSOL, CDFILSOLCONS, CDFILLANCONS, CDPRODUTOCONS, DTENTRCONSOL, QTENTRCONS)
                        SELECT
                           ITEMSOLI.CDFILSOLI,
                           ITEMSOLI.CDFILLAN,
                           ITEMSOLI.NRSOLICMP,
                           ITEMSOLI.CDPRODUTO,
                           ITEMSOLI.DTPROGENTR,
                           ITEMCONSSOLOL.NRSEQUCONSOL,
                           ITEMCONSSOLOL.CDFILSOLI,
                           ITEMCONSSOLOL.CDFILLAN,
                           NVL(V_EMBALAGEM_CDPRARVOL, V_EMBALAGEM_CDPRODUTO),
                           ITEMCONSSOLOL.DTENTRCONSOL,
                           V_QTDEPRODUTO
                        FROM
                           ITEMCONSSOLOL, ITEMSOLI
                        WHERE ITEMSOLI.CDFILSOLI     = V_ITEMSOLI_CDFILSOLI
                          AND ITEMSOLI.DTPROGENTR    = V_ITEMSOLI_DTPROGENTR
                          AND ((ITEMSOLI.CDFILIOPELOG  = P_CDFILIAL) OR (P_CDOPERADOR IS NULL))
                          AND ITEMSOLI.CDFILSOLI    <> P_CDFILIAL
                          AND NVL(ITEMSOLI.IDSOLIAPROV, W_S) = W_S
                          AND NVL(ITEMSOLI.IDITMCONS, W_N) = W_N
                          AND ITEMSOLI.NRSEQUCONSOL  IS NULL
                          AND ITEMSOLI.CDPRODUTO  IN (SELECT PRODUTO.CDPRODUTO
                                                      FROM PRODUTO
                                                      WHERE CDPRODESTO = V_ITEMSOLI_CDPRODUTO)
                          AND ITEMCONSSOLOL.NRSEQUCONSOL = P_NRSEQCONSOL
                          AND ITEMCONSSOLOL.CDFILSOLI    =  P_CDFILIAL
                          AND ITEMCONSSOLOL.CDFILLAN     =  P_CDFILLANC
                          AND ITEMCONSSOLOL.CDPRODUTO    =  NVL(V_EMBALAGEM_CDPRARVOL, V_EMBALAGEM_CDPRODUTO)
                          AND ITEMCONSSOLOL.DTENTRCONSOL =  V_DTENTREGA;
                     EXCEPTION
                        WHEN OTHERS THEN BEGIN
                           UPDATE RELACONSOLOL
                           SET QTENTRCONS = QTENTRCONS + V_QTDEPRODUTO
                           WHERE NRSEQUCONSOL  = P_NRSEQCONSOL
                             AND CDFILSOLCONS  = P_CDFILIAL
                             AND CDFILLANCONS  = P_CDFILLANC
                             AND CDPRODUTOCONS = NVL(V_EMBALAGEM_CDPRARVOL, V_EMBALAGEM_CDPRODUTO)
                             AND DTENTRCONSOL  = V_DTENTREGA
                             AND CDPRODUTO  IN (SELECT PRODUTO.CDPRODUTO
                                                FROM PRODUTO
                                                WHERE CDPRODESTO = V_ITEMSOLI_CDPRODUTO)
                             AND CDFILSOLI  = V_ITEMSOLI_CDFILSOLI
                             AND DTPROGENTR = V_ITEMSOLI_DTPROGENTR;
                        END;
                     END;
                  ELSE
                     BEGIN
                        INSERT INTO RELACONSOLOLNC
                           (NRNCPREVCONSOL, CDFILIAL, CDPRODUTO, DTNCPREVCONSOL,
                            NRSEQUCONSOL,CDPRODUTOCONS,CDFILSOLCONS,CDFILLANCONS,
                            DTENTRCONSOL, QTNCPREVCONSOL)
                        VALUES
                           (V_PRXNECECOMP, V_ITEMSOLI_CDFILSOLI, V_ITEMSOLI_CDPRODUTO,
                            V_ITEMSOLI_DTPROGENTR, P_NRSEQCONSOL, NVL(V_EMBALAGEM_CDPRARVOL, V_EMBALAGEM_CDPRODUTO),
                            P_CDFILIAL, P_CDFILLANC, V_DTENTREGA, V_QTDEPRODUTO);
                     EXCEPTION
                        WHEN OTHERS THEN BEGIN
                           UPDATE RELACONSOLOLNC
                           SET QTNCPREVCONSOL   = QTNCPREVCONSOL + V_QTDEPRODUTO
                           WHERE NRSEQUCONSOL   = P_NRSEQCONSOL
                             AND CDFILSOLCONS   = P_CDFILIAL
                             AND CDFILLANCONS   = P_CDFILLANC
                             AND CDPRODUTOCONS  = NVL(V_EMBALAGEM_CDPRARVOL, V_EMBALAGEM_CDPRODUTO)
                             AND DTENTRCONSOL   = V_DTENTREGA
                             AND NRNCPREVCONSOL = V_PRXNECECOMP
                             AND CDPRODUTO      = V_ITEMSOLI_CDPRODUTO
                             AND CDFILIAL       = V_ITEMSOLI_CDFILSOLI
                             AND DTNCPREVCONSOL = V_ITEMSOLI_DTPROGENTR;
                        END;
                     END;
                  END IF;
                  V_ITEM_CONSOLIDADO := W_S;
               END IF;
            END IF;
         END IF;
         IF C_EMBALAGEM%NOTFOUND THEN
            V_EMBALAGEM_CDPRODUTO := NULL;
         END IF;
         EXIT WHEN C_EMBALAGEM%NOTFOUND;
      END LOOP;
      IF V_ITEM_CONSOLIDADO = W_S THEN
         IF P_PREVISAOCONSUMO = W_N THEN
            UPDATE ITEMSOLI
            SET NRSEQUCONSOL           = P_NRSEQCONSOL,
                CDFILIOPELOG           = P_CDFILIAL,
                DTENTRCONSOL           = V_DTENTREGA
            WHERE ITEMSOLI.CDFILSOLI   = V_ITEMSOLI_CDFILSOLI
              AND ITEMSOLI.DTPROGENTR  = V_ITEMSOLI_DTPROGENTR
              AND ITEMSOLI.CDFILSOLI  <> P_CDFILIAL
              AND NVL(ITEMSOLI.IDSOLIAPROV, W_S) = W_S
              AND NVL(ITEMSOLI.IDITMCONS, W_N) = W_N
              AND ((ITEMSOLI.CDFILIOPELOG = P_CDFILIAL) OR (P_CDOPERADOR IS NULL))
              AND ITEMSOLI.NRSEQUCONSOL IS 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 = V_ITEMSOLI_CDPRODUTO);
         END IF;
         P_ROWSAFFECT := W_S;
      END IF;
   END LOOP;
   IF V_IDUTEMPENCONSOL = W_S THEN
      EMPENHO_OL(P_NRSEQCONSOL, P_CDFILIAL, V_CDFILANTERIOR, V_CDPRODANTERIOR, NVL(P_CDOPERADOR, V_CDOPERADOR), V_PRXNECECOMP, P_PREVISAOCONSUMO);
   END IF;
   IF (P_ROWSAFFECT = W_N) AND (P_CDOPERADOR IS NOT NULL) THEN
      DELETE FROM CONSSOLOL
      WHERE NRSEQUCONSOL = P_NRSEQCONSOL;
   END IF;
END;
/