CREATE OR REPLACE PROCEDURE CONSOLIDA_SOLICITA
  (P_CDFILCONS     IN FILIAL.CDFILIAL%TYPE,
   P_CDFILCENT     IN FILIAL.CDFILIAL%TYPE,
   P_CDFILIAL      IN VARCHAR2 DEFAULT NULL,
   P_CDFILEST      IN FILIAL.CDFILIAL%TYPE,
   P_CDCOMPRADOR   IN VARCHAR2 DEFAULT NULL, 
   P_DTENTRINI     IN DATE,
   P_DTENTRFIN     IN DATE,
   P_CDPRODINI     IN PRODUTO.CDARVPROD%TYPE,
   P_CDPRODFIN     IN PRODUTO.CDARVPROD%TYPE,
   P_IDCONSESTOQ   IN VARCHAR2,
   P_IDCONSOLIDA   IN VARCHAR2,
   P_IDPRODORIG    IN VARCHAR2,
   P_DTPROCESS     IN DATE,
   P_LISTA         IN VARCHAR2,
   P_CONSSOL       IN VARCHAR2,
   P_CONSAF        IN VARCHAR2,
   P_CONSLIMSEG    IN VARCHAR2 DEFAULT 'N',
   P_CONSOL        IN VARCHAR2 DEFAULT 'N',
   P_NRSOLICMP     OUT SOLICITA.NRSOLICMP%TYPE)
IS
   V_NRPROXSOLI   VARCHAR2(20);

   V_QTATUEST     FLOAT;
   V_QTATUESTAUX  FLOAT;
   V_IDPRIMVEZ    BOOLEAN;
   V_DTPROCESSA   DATE;
   V_IDUTILDTPROC VARCHAR2(1);

   V_TCDFILIAL    VARCHAR2(1);
   V_TCDCOMPRADOR VARCHAR2(1);

   V_ANTPRODESTO  VARCHAR2(10);
   V_VRARREDCMP   FLOAT;
   V_QTSOLIPROD   FLOAT;
   V_QTSOLI       FLOAT;

   V_QTSOL        FLOAT;
   V_QTAF         FLOAT;

   V_NRDIASEG     FLOAT;
   V_NRLIMISEGCAD LIMISEGPROD.NRLIMISEGU%TYPE;
   V_NOVADATA     DATE;
   V_DTENTREGA    DATE;

   V_CDPRODFIN    VARCHAR2(20);
   V_CDFILIOPELOG VARCHAR2(4);
   V_VRFATOCONV   FLOAT;

BEGIN
  V_IDPRIMVEZ := TRUE;
  P_NRSOLICMP := NULL;

  IF P_CDFILIAL IS NULL THEN
    V_TCDFILIAL := 'T';
  END IF;
  IF P_CDCOMPRADOR IS NULL THEN
    V_TCDCOMPRADOR := 'T';
  END IF;

  V_ANTPRODESTO := ' '; /*A variavel deve receber espaco, nao mude isso */

  V_CDPRODFIN  := RPAD(P_CDPRODFIN, 20, 'Z');

  FOR C_ITEMS IN
    (SELECT
      ITEMSOLI.CDFILSOLI, ITEMSOLI.CDFILLAN, ITEMSOLI.NRSOLICMP,
      ITEMSOLI.CDPRODUTO, ITEMSOLI.DTPROGENTR, PRODUTO.VRFATOCONV,
      (ITEMSOLI.QTSOLIPROD * (1 + NVL(PRODUTO.VRFATACRCMP, 0) + DECODE(P_IDPRODORIG,
                                                                       'S', NVL(PRODUTO.VRFATPERDCMP, 0),
                                                                       0))) * PRODUTO.VRFATOCONV AS QTPRODESTO,
      PRODUTO.CDPRODESTO,
      DECODE(P_IDPRODORIG, /* ESTE CAMPO FOI CRIADO PARA QUE SE VERIFIQUE O ESTOQUE UMA VEZ PARA CADA PRODUTO DE ESTOQUE OU UMA VEZ PARA CADA PRODUTO DE ORIGEM DEPENDENDO DE P_IDPRODORIG */
             'S', NVL(PRODUTO.CDPRODORIG, PRODUTO.CDPRODESTO),
             PRODUTO.CDPRODESTO) AS CDPRODORIG,
      PRODUTO.CDPRODORIG AS CDEXISTEPRODORIG,
      DECODE(P_IDPRODORIG, /* ESTE CAMPO FOI CRIADO PARA SER USADO NA VERIFICACAO DO CADASTRO DE CONVERSAO PARA UNIDADE DE ESTOQUE */
             'S', NVL(PRODUTO.CDPRODORIG, PRODUTO.CDPRODUTO),
             PRODUTO.CDPRODUTO) AS CDESTPROD
     FROM
      ITEMSOLI,
      PRODUTO,
      SOLICITA,
      (SELECT CDLISTA FROM LISTA WHERE NRLISTA = P_LISTA
       UNION ALL
       SELECT '1' AS CDLISTA FROM PARAMGERAL WHERE P_LISTA IS NULL) LI
     WHERE
      ((SOLICITA.CDFILSOLI = P_CDFILCONS AND SOLICITA.IDTIPLAN <> 'C') OR
       (SOLICITA.CDFILSOLI <> P_CDFILCONS)) AND

      (ITEMSOLI.CDFILSOLI = SOLICITA.CDFILSOLI)  AND
      (ITEMSOLI.CDFILLAN  = SOLICITA.CDFILLANCA) AND
      (ITEMSOLI.NRSOLICMP = SOLICITA.NRSOLICMP)  AND

      (INSTR(P_CDFILIAL,ITEMSOLI.CDFILSOLI) <> 0 OR V_TCDFILIAL = 'T') AND
      (ITEMSOLI.DTPROGENTR BETWEEN P_DTENTRINI AND P_DTENTRFIN) AND
      (PRODUTO.CDARVPROD BETWEEN P_CDPRODINI AND V_CDPRODFIN) AND

      (SOLICITA.CDFILLANCA||SOLICITA.CDFILSOLI||SOLICITA.NRSOLICMP = LI.CDLISTA OR P_LISTA IS NULL) AND
      EXISTS
       (SELECT PC.CDOPERADOR
        FROM
          PRODUTO PR, PRODCOMP PC
        WHERE
          PC.CDPRODUTO = PR.CDPRODUTO AND
         (INSTR(P_CDCOMPRADOR,PC.CDOPERADOR) <> 0 OR V_TCDCOMPRADOR = 'T') AND
         (PRODUTO.CDARVPROD LIKE PR.CDARVPROD ||'%')) AND

      (ITEMSOLI.IDITMCONS = 'N' OR P_IDCONSOLIDA = 'T') AND
      (ITEMSOLI.CDPRODUTO = PRODUTO.CDPRODUTO) AND
      (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S')    AND
      ((NVL(ITEMSOLI.CDFILIOPELOG,'X') = P_CDFILCONS AND P_CONSOL = 'S') OR (P_CONSOL = 'N'))
     ORDER BY
       DECODE(P_IDPRODORIG,
             'S', NVL(PRODUTO.CDPRODORIG, PRODUTO.CDPRODESTO),
             PRODUTO.CDPRODESTO),
       ITEMSOLI.DTPROGENTR,
       PRODUTO.VRFATOCONV)
  LOOP
    /* ARREDONDA A QUANTIDADE DO PRODUTO */
    SELECT
       NVL(MAX(VRARREDCMP), 0), NVL(MAX(VRFATOCONV), 1) INTO V_VRARREDCMP, V_VRFATOCONV
    FROM
       PRODUTO
    WHERE
       CDPRODUTO = C_ITEMS.CDPRODUTO;

    V_QTSOLIPROD := C_ITEMS.QTPRODESTO;
    IF (MOD(V_QTSOLIPROD, V_VRARREDCMP*V_VRFATOCONV) <> 0) AND V_VRARREDCMP > 0 THEN
       V_QTSOLIPROD := CEIL(V_QTSOLIPROD / V_VRARREDCMP) * V_VRARREDCMP;
    END IF;

   /* SE DEVE CONSIDERAR O ESTOQUE */
    IF C_ITEMS.CDPRODORIG <> V_ANTPRODESTO THEN
      V_QTATUEST  := 0;
      SELECT
         NVL(MAX(PARAMFILIAL.DTPROCESSA), P_DTPROCESS),
         MAX(PARAMGERAL.IDUTILDTPROC)
      INTO
         V_DTPROCESSA,
         V_IDUTILDTPROC
      FROM
         PARAMGERAL,
         PARAMFILIAL
      WHERE
         PARAMFILIAL.CDFILIAL = P_CDFILEST;
      IF V_IDUTILDTPROC = 'N' THEN
         V_DTPROCESSA := P_DTPROCESS;
      END IF;
      IF P_IDCONSESTOQ = 'S' THEN /* BUSCA O ESTOQUE DO PRODUTO ATE A DATA DE PROCESSAMENTO */
         FOR C_CNVPRODUNEST IN
            (SELECT
                NVL(CDPRUNEST, PRODUTO.CDPRODESTO) AS CDPRODUTO,
                NVL(VRFATUNEST, 1) AS VRFATUNEST
             FROM
                CNVPRODUNEST,
                PRODUTO
             WHERE
                PRODUTO.CDPRODUTO = C_ITEMS.CDESTPROD AND
                PRODUTO.CDPRODUTO = CNVPRODUNEST.CDPRODUTO(+)) LOOP
            SELECT
               CALC_ESTOQ_PREV(P_CDFILEST, C_CNVPRODUNEST.CDPRODUTO, V_DTPROCESSA + 1) * C_CNVPRODUNEST.VRFATUNEST INTO V_QTATUESTAUX
            FROM
               PARAMGERAL;
            V_QTATUEST := V_QTATUEST + V_QTATUESTAUX;
         END LOOP;
      END IF;
      IF P_CONSSOL = 'S' THEN
         SELECT
            SUM(ITEMSOLI.QTSOLIPROD*PRODUTO.VRFATOCONV/P.VRFATOCONV)
         INTO
            V_QTSOL
         FROM
            ITEMSOLI, PRODUTO, PRODUTO P
         WHERE
            ITEMSOLI.CDFILSOLI = P_CDFILCONS AND
            ITEMSOLI.CDPRODUTO = PRODUTO.CDPRODUTO AND
            ITEMSOLI.DTPROGENTR BETWEEN V_DTPROCESSA AND P_DTENTRINI - 1 AND
            PRODUTO.CDPRODESTO = P.CDPRODESTO AND
            P.CDPRODUTO = C_ITEMS.CDESTPROD AND
            ITEMSOLI.IDITMCONS = 'N' AND
            (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S');
         V_QTATUEST := V_QTATUEST - NVL(V_QTSOL, 0);
      END IF;
      IF P_CONSAF = 'S' THEN
         SELECT
            SUM(ITEMAUTF.QTPROGENTAF*PRODUTO.VRFATOCONV/P.VRFATOCONV)
         INTO
            V_QTAF
         FROM
            PRODUTO, ITEMAUTF, AUTOFORNE, PRODUTO P
         WHERE
            AUTOFORNE.CDFILDEST = ITEMAUTF.CDFILDEST AND
            AUTOFORNE.CDFILLANC = ITEMAUTF.CDFILLANC AND
            AUTOFORNE.NRAUTOFORN = ITEMAUTF.NRAUTOFORN AND
            ITEMAUTF.CDPRODUTO = PRODUTO.CDPRODUTO AND
            PRODUTO.CDPRODESTO = P.CDPRODESTO AND
            P.CDPRODUTO = C_ITEMS.CDESTPROD AND
            ITEMAUTF.CDFILDEST = P_CDFILCONS AND
            ITEMAUTF.DTPROGENTAF BETWEEN V_DTPROCESSA AND P_DTENTRINI - 1 AND
            AUTOFORNE.IDSITUATUAAF IS NULL AND
            AUTOFORNE.IDAFFORALIM = 'N' AND
            AUTOFORNE.IDAUTOFORNEX = 'N' AND
            NVL(AUTOFORNE.IDBAIXAAF,'0') <> '5';
         V_QTATUEST := V_QTATUEST + NVL(V_QTAF, 0);
      END IF;

      /* Considera fator de conversao do produto origem */
      IF (P_IDPRODORIG = 'S') AND (V_ANTPRODESTO <> ' ') THEN
         FOR C_ITEM IN
            (
             SELECT
                ITEMSOLI.CDFILSOLI,
                ITEMSOLI.CDFILLAN,
                ITEMSOLI.NRSOLICMP,
                ITEMSOLI.CDPRODUTO,
                ITEMSOLI.DTPROGENTR,
                ITEMSOLI.QTSOLIPROD,
                NVL(PRODUTO.VRFATOCONV, 1) VRFATOCONV,
                NVL(VRARREDCMP, 0) VRARREDCMP
             FROM
                ITEMSOLI, PRODUTO
             WHERE ITEMSOLI.CDPRODUTO = PRODUTO.CDPRODUTO
               AND ITEMSOLI.CDFILSOLI = P_CDFILCONS
               AND ITEMSOLI.CDFILLAN  = P_CDFILCENT
               AND ITEMSOLI.NRSOLICMP = SUBSTR(V_NRPROXSOLI, 11, 10)
               AND ITEMSOLI.CDPRODUTO = V_ANTPRODESTO
               AND EXISTS (SELECT 1
                           FROM PRODUTO P
                           WHERE P.CDPRODORIG = V_ANTPRODESTO)
             )
         LOOP
            V_QTSOLI := C_ITEM.QTSOLIPROD/C_ITEM.VRFATOCONV;
            IF (MOD(V_QTSOLI, C_ITEM.VRARREDCMP) <> 0) AND C_ITEM.VRARREDCMP > 0 THEN
               V_QTSOLI := CEIL(V_QTSOLI / C_ITEM.VRARREDCMP) * C_ITEM.VRARREDCMP;
            END IF;

            UPDATE ITEMSOLI
               SET QTSOLIPROD = V_QTSOLI
            WHERE CDFILSOLI   = C_ITEM.CDFILSOLI
              AND CDFILLAN    = C_ITEM.CDFILLAN
              AND NRSOLICMP   = C_ITEM.NRSOLICMP
              AND CDPRODUTO   = C_ITEM.CDPRODUTO
              AND DTPROGENTR  = C_ITEM.DTPROGENTR;
         END LOOP;
      END IF;
      V_ANTPRODESTO := C_ITEMS.CDPRODORIG;
    END IF;

    IF V_QTATUEST >= V_QTSOLIPROD THEN
      V_QTATUEST := V_QTATUEST - V_QTSOLIPROD;

      UPDATE ITEMSOLI
      SET IDITMCONS    = 'S'
      WHERE
         CDFILSOLI  = C_ITEMS.CDFILSOLI AND
         CDFILLAN   = C_ITEMS.CDFILLAN AND
         NRSOLICMP  = C_ITEMS.NRSOLICMP AND
         CDPRODUTO  = C_ITEMS.CDPRODUTO AND
         DTPROGENTR = C_ITEMS.DTPROGENTR;
    ELSE
      IF V_IDPRIMVEZ THEN
        NOVO_CODIGO('SOLICOMP'|| P_CDFILCONS || P_CDFILCENT, V_NRPROXSOLI, 1);

        /* INCLUI NOVA SOLICITACAO COM TIPO DE LANCAMENTO = CONSOLIDADA */
        INSERT INTO SOLICITA
        (CDFILSOLI, CDFILLANCA, NRSOLICMP, DTSOLCMP, IDTIPLAN,
         CDFILCENT)
        VALUES
        (P_CDFILCONS, P_CDFILCENT, SUBSTR(V_NRPROXSOLI, 11, 10), TRUNC(SYSDATE), 'C',
         P_CDFILCENT);
        /*REMOVIDO TO_DATA(SYSDATE) PARA TRUNC(SYSDATE) A FIM DE RESOLVER O PROBLEMA DA ISSUE 225455*/
        V_IDPRIMVEZ := FALSE;
      END IF;

      BEGIN

         IF NOT ((C_ITEMS.CDEXISTEPRODORIG IS NOT NULL) AND (P_IDPRODORIG = 'S')) THEN
            UPDATE ITEMSOLI
            SET QTSOLIPROD = QTSOLIPROD + ((V_QTSOLIPROD - V_QTATUEST) / C_ITEMS.VRFATOCONV)
            WHERE
               CDFILSOLI  = P_CDFILCONS AND
               CDFILLAN   = P_CDFILCENT AND
               NRSOLICMP  = SUBSTR(V_NRPROXSOLI, 11, 10) AND
               CDPRODUTO  = C_ITEMS.CDESTPROD AND
               DTPROGENTR = C_ITEMS.DTPROGENTR;

            IF SQL%NOTFOUND THEN

               SELECT MAX(CDFILIOPELOG)
                 INTO V_CDFILIOPELOG
                 FROM PARAMPRODSUP
                WHERE CDFILIAL  = P_CDFILCONS
                  AND CDPRODUTO = C_ITEMS.CDESTPROD
                  AND CDFILIOPELOG IS NOT NULL;

               INSERT INTO ITEMSOLI
                  (CDFILSOLI,CDFILLAN,NRSOLICMP,CDPRODUTO,DTPROGENTR,
                   QTSOLIPROD,DTUTILIZA, CDFILIOPELOG)
               VALUES
                  (P_CDFILCONS, P_CDFILCENT, SUBSTR(V_NRPROXSOLI, 11, 10), C_ITEMS.CDESTPROD,
                   C_ITEMS.DTPROGENTR,(V_QTSOLIPROD - V_QTATUEST) / C_ITEMS.VRFATOCONV,
                   C_ITEMS.DTPROGENTR, V_CDFILIOPELOG);
                   V_QTATUEST := 0;
            END IF;
         ELSE
            UPDATE ITEMSOLI
            SET QTSOLIPROD = QTSOLIPROD + (V_QTSOLIPROD - V_QTATUEST)
            WHERE
               CDFILSOLI  = P_CDFILCONS AND
               CDFILLAN   = P_CDFILCENT AND
               NRSOLICMP  = SUBSTR(V_NRPROXSOLI, 11, 10) AND
               CDPRODUTO  = C_ITEMS.CDESTPROD AND
               DTPROGENTR = C_ITEMS.DTPROGENTR;

            IF SQL%NOTFOUND THEN

               SELECT MAX(CDFILIOPELOG)
                 INTO V_CDFILIOPELOG
                 FROM PARAMPRODSUP
                WHERE CDFILIAL  = P_CDFILCONS
                  AND CDPRODUTO = C_ITEMS.CDESTPROD
                  AND CDFILIOPELOG IS NOT NULL;

               INSERT INTO ITEMSOLI
                  (CDFILSOLI,CDFILLAN,NRSOLICMP,CDPRODUTO,DTPROGENTR,
                   QTSOLIPROD,DTUTILIZA, CDFILIOPELOG)
               VALUES
                  (P_CDFILCONS, P_CDFILCENT, SUBSTR(V_NRPROXSOLI, 11, 10), C_ITEMS.CDESTPROD,
                   C_ITEMS.DTPROGENTR,(V_QTSOLIPROD - V_QTATUEST),
                   C_ITEMS.DTPROGENTR, V_CDFILIOPELOG);
                   V_QTATUEST := 0;
            END IF;
         END IF;
      END;

      UPDATE ITEMSOLI
      SET IDITMCONS = 'S',
          CDFILLANCONS = P_CDFILCENT,
          CDFILSOLCONS = P_CDFILCONS,
          NRSOLCMPCONS = SUBSTR(V_NRPROXSOLI, 11, 10),
          CDPRODUTCONS = C_ITEMS.CDESTPROD,
          DTPROGENCONS = C_ITEMS.DTPROGENTR
      WHERE
         CDFILSOLI  = C_ITEMS.CDFILSOLI AND
         CDFILLAN   = C_ITEMS.CDFILLAN AND
         NRSOLICMP  = C_ITEMS.NRSOLICMP AND
         CDPRODUTO  = C_ITEMS.CDPRODUTO AND
         DTPROGENTR = C_ITEMS.DTPROGENTR;

      P_NRSOLICMP := SUBSTR(V_NRPROXSOLI, 11, 10);
    END IF;
  END LOOP;

  /* Calcula calendario de compras para as periodicidades que ainda nao possuem */

  FOR C_PERIODNCALC IN
     (SELECT DISTINCT
         PERFILPROD.CDPERIENTR,
         TO_DATE('01/'||TO_CHAR(ITEMSOLI.DTPROGENTR,'MM/YYYY'), 'DD/MM/YYYY') AS DTPREVCONS
      FROM
        (SELECT
            ITEMSOLI.DTPROGENTR,
            P.CDARVPROD
         FROM
            ITEMSOLI,
            PRODUTO P
         WHERE
            ITEMSOLI.CDFILSOLI = P_CDFILCONS AND
            ITEMSOLI.CDFILLAN = P_CDFILCENT AND
            ITEMSOLI.NRSOLICMP = SUBSTR(V_NRPROXSOLI, 11, 10) AND
            ITEMSOLI.CDPRODUTO = P.CDPRODUTO) ITEMSOLI,
         PERFILPROD,
         PRODUTO PROD_PER
      WHERE
        (PERFILPROD.CDPRODUTO = PROD_PER.CDPRODUTO) AND
        (PERFILPROD.CDFILIAL  = P_CDFILCONS) AND
        (PROD_PER.CDARVPROD = (SELECT
                                  MAX(PRODUTO.CDARVPROD)
                               FROM
                                  PERFILPROD A,
                                  PRODUTO
                               WHERE
                                  (A.CDPRODUTO = PRODUTO.CDPRODUTO) AND
                                  (A.CDFILIAL = P_CDFILCONS) AND
                                  (INSTR(ITEMSOLI.CDARVPROD,PRODUTO.CDARVPROD) = 1))) AND
        (PERFILPROD.CDPERIENTR NOT IN (SELECT
                                          CDPERIENTR
                                       FROM
                                          CALECOMP
                                       WHERE
                                          (CALECOMP.CDFILIAL = P_CDFILCONS) AND
                                          (TO_CHAR(CALECOMP.DTENTREGA,'MMYYYY') =
                                           TO_CHAR(ITEMSOLI.DTPROGENTR,'MMYYYY')))))
  LOOP
     CALC_DATA_ENTR_MES(P_CDFILCONS,
                        C_PERIODNCALC.CDPERIENTR,
                        C_PERIODNCALC.DTPREVCONS,
                        1,
                        V_DTPROCESSA);
     COMMIT;
  END LOOP;

  FOR C_ITEMANTECIP IN
     (SELECT
         ITEMSOLI.CDPRODUTO,
         PRODUTO.CDARVPROD,
         ITEMSOLI.DTPROGENTR,
         ITEMSOLI.QTSOLIPROD,
         PERFILPROD.CDPERIENTR
      FROM
         ITEMSOLI, PRODUTO, PRODUTO PRODPERIENTR, PERFILPROD
      WHERE ITEMSOLI.CDFILSOLI     = P_CDFILCONS
        AND ITEMSOLI.CDFILLAN      = P_CDFILCENT
        AND ITEMSOLI.NRSOLICMP     = SUBSTR(V_NRPROXSOLI, 11, 10)
        AND ITEMSOLI.CDPRODUTO     = PRODUTO.CDPRODUTO
        AND PERFILPROD.CDPRODUTO   = PRODPERIENTR.CDPRODUTO
        AND PERFILPROD.CDFILIAL    = P_CDFILCONS
        AND PRODPERIENTR.CDARVPROD = (SELECT
                                         MAX(B.CDARVPROD)
                                      FROM
                                         PERFILPROD A,
                                         PRODUTO B
                                      WHERE A.CDPRODUTO = B.CDPRODUTO
                                       AND  A.CDFILIAL  = P_CDFILCONS
                                       AND  INSTR(PRODUTO.CDARVPROD, B.CDARVPROD) = 1)
      ORDER BY PRODUTO.CDARVPROD, ITEMSOLI.DTPROGENTR
      )
  LOOP
     IF P_CONSLIMSEG = 'S' THEN
        SELECT MAX(NRLIMISEGU)
          INTO V_NRDIASEG
          FROM LIMISEGPROD, PRODUTO, PRODUTO PRODNIVELCOMPL
         WHERE CDFILIAL = P_CDFILCONS
           AND LIMISEGPROD.CDPRODUTO = PRODUTO.CDPRODUTO
           AND PRODNIVELCOMPL.CDPRODUTO = C_ITEMANTECIP.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_CDFILCONS
                                       AND INSTR(PRODNIVELCOMPL.CDARVPROD, B.CDARVPROD) = 1);
     ELSE
        V_NRDIASEG := 0;
     END IF;
     V_NOVADATA := C_ITEMANTECIP.DTPROGENTR - V_NRDIASEG;
     SELECT
        MAX(CALECOMP.DTENTREGA)
     INTO
        V_DTENTREGA
     FROM
        CALECOMP
     WHERE CALECOMP.CDFILIAL    =  P_CDFILCONS
       AND CALECOMP.CDPERIENTR  =  C_ITEMANTECIP.CDPERIENTR
       AND CALECOMP.DTENTREGA  <= V_NOVADATA;

     IF (V_DTENTREGA IS NOT NULL) AND (V_DTENTREGA <> C_ITEMANTECIP.DTPROGENTR) THEN
        UPDATE ITEMSOLI
        SET QTSOLIPROD   = QTSOLIPROD + C_ITEMANTECIP.QTSOLIPROD
        WHERE CDFILSOLI  = P_CDFILCONS
          AND CDFILLAN   = P_CDFILCENT
          AND NRSOLICMP  = SUBSTR(V_NRPROXSOLI, 11, 10)
          AND CDPRODUTO  = C_ITEMANTECIP.CDPRODUTO
          AND DTPROGENTR = V_DTENTREGA;

        IF SQL%NOTFOUND THEN

        SELECT MAX(CDFILIOPELOG)
          INTO V_CDFILIOPELOG
          FROM PARAMPRODSUP
         WHERE CDFILIAL  = P_CDFILCONS
           AND CDPRODUTO = C_ITEMANTECIP.CDPRODUTO
           AND CDFILIOPELOG IS NOT NULL;

           INSERT INTO ITEMSOLI
            (CDFILSOLI,
             CDFILLAN,
             NRSOLICMP,
             CDPRODUTO,
             DTPROGENTR,
             QTSOLIPROD,
             DTUTILIZA,
             IDITMCONS,
             TXOBSITMSOL,
             IDBAIXITMSOL,
             QTTRANSFSOL,
             NRLOTEESTQ,
             NRSUBLOTE,
             CDPRODPROD,
             CDFILLANCONS,
             CDFILSOLCONS,
             NRSOLCMPCONS,
             CDPRODUTCONS,
             DTPROGENCONS,
             CDFILIOPELOG)
           SELECT
             CDFILSOLI,
             CDFILLAN,
             NRSOLICMP,
             CDPRODUTO,
             V_DTENTREGA,
             QTSOLIPROD,
             DTUTILIZA,
             IDITMCONS,
             TXOBSITMSOL,
             IDBAIXITMSOL,
             QTTRANSFSOL,
             NRLOTEESTQ,
             NRSUBLOTE,
             CDPRODPROD,
             CDFILLANCONS,
             CDFILSOLCONS,
             NRSOLCMPCONS,
             CDPRODUTCONS,
             DTPROGENCONS,
             V_CDFILIOPELOG
           FROM
             ITEMSOLI
           WHERE
             CDFILSOLI = P_CDFILCONS AND
             CDFILLAN = P_CDFILCENT AND
             NRSOLICMP = SUBSTR(V_NRPROXSOLI, 11, 10) AND
             CDPRODUTO = C_ITEMANTECIP.CDPRODUTO AND
             DTPROGENTR = C_ITEMANTECIP.DTPROGENTR;

        END IF;
        UPDATE ITEMSOLI
        SET DTPROGENCONS = V_DTENTREGA
        WHERE CDFILLANCONS = P_CDFILCONS
          AND CDFILSOLCONS = P_CDFILCENT
          AND NRSOLCMPCONS = SUBSTR(V_NRPROXSOLI, 11, 10)
          AND CDPRODUTCONS = C_ITEMANTECIP.CDPRODUTO
          AND DTPROGENCONS = C_ITEMANTECIP.DTPROGENTR;
        DELETE FROM ITEMSOLI
        WHERE
           CDFILSOLI = P_CDFILCONS AND
           CDFILLAN = P_CDFILCENT AND
           NRSOLICMP = SUBSTR(V_NRPROXSOLI, 11, 10) AND
           CDPRODUTO = C_ITEMANTECIP.CDPRODUTO AND
           DTPROGENTR = C_ITEMANTECIP.DTPROGENTR;
     END IF;
  END LOOP;
/* Considera fator de conversao do produto origem */
  IF (P_IDPRODORIG = 'S') AND (V_ANTPRODESTO <> ' ') THEN
     FOR C_ITEM IN
        (
         SELECT
            ITEMSOLI.CDFILSOLI,
            ITEMSOLI.CDFILLAN,
            ITEMSOLI.NRSOLICMP,
            ITEMSOLI.CDPRODUTO,
            ITEMSOLI.DTPROGENTR,
            ITEMSOLI.QTSOLIPROD,
            NVL(PRODUTO.VRFATOCONV, 1) VRFATOCONV,
            NVL(VRARREDCMP, 0) VRARREDCMP
         FROM
            ITEMSOLI, PRODUTO
         WHERE ITEMSOLI.CDPRODUTO = PRODUTO.CDPRODUTO
           AND ITEMSOLI.CDFILSOLI = P_CDFILCONS
           AND ITEMSOLI.CDFILLAN  = P_CDFILCENT
           AND ITEMSOLI.NRSOLICMP = SUBSTR(V_NRPROXSOLI, 11, 10)
           AND ITEMSOLI.CDPRODUTO = V_ANTPRODESTO
           AND EXISTS (SELECT 1
                       FROM PRODUTO P
                       WHERE P.CDPRODORIG = V_ANTPRODESTO)
         )
     LOOP
        V_QTSOLI := C_ITEM.QTSOLIPROD/C_ITEM.VRFATOCONV;
        IF (MOD(V_QTSOLI, C_ITEM.VRARREDCMP) <> 0) AND C_ITEM.VRARREDCMP > 0 THEN
           V_QTSOLI := CEIL(V_QTSOLI / C_ITEM.VRARREDCMP) * C_ITEM.VRARREDCMP;
        END IF;
        UPDATE ITEMSOLI
           SET QTSOLIPROD = V_QTSOLI
        WHERE CDFILSOLI   = C_ITEM.CDFILSOLI
          AND CDFILLAN    = C_ITEM.CDFILLAN
          AND NRSOLICMP   = C_ITEM.NRSOLICMP
          AND CDPRODUTO   = C_ITEM.CDPRODUTO
          AND DTPROGENTR  = C_ITEM.DTPROGENTR;
     END LOOP;
  END IF;
END;