CREATE OR REPLACE PROCEDURE ATUALIZA_ESTOQUE( 
   P_FILIMOVI    IN ITLANCTOEST.CDFILIMOVI%TYPE,
   P_DTINICIAL   IN ITLANCTOEST.DTLANCMOVI%TYPE,
   P_DTFINAL     IN ITLANCTOEST.DTLANCMOVI%TYPE,
   P_FILILANCTO  IN ITLANCTOEST.CDFILIAL%TYPE,
   P_NRLANCTO    IN ITLANCTOEST.NRLANCESTQ%TYPE DEFAULT NULL,
   P_IDBLOQTRANS IN ITLANCTOEST.IDEVOLESTOQ%TYPE DEFAULT 'N')
AS

BEGIN

   DECLARE

      V_FILIAUX       VARCHAR2(04);
      V_IDESTONEG     VARCHAR2(04);
      V_IDLOTE        VARCHAR2(04);
      V_DTINICIAL     DATE;
      V_DTINICAUX     DATE;
      V_DTINICEST     DATE;
      V_DTINICPOS     DATE;
      V_DTFINAL       DATE;
      V_COUNTPOS      NUMBER;
      V_QTDEESTO      NUMBER;
      V_VALRESTO      NUMBER;
      V_VALRBRUT      NUMBER;
      V_VALRESTOM1    NUMBER;
      V_VALRBRUTM1    NUMBER;
      V_VALRESTOM2    NUMBER;
      V_VALRBRUTM2    NUMBER;
      V_QTDEANTE      NUMBER;
      V_VRESTANT      NUMBER;
      V_VRBRUANT      NUMBER;
      V_VRESTANTM1    NUMBER;
      V_VRBRUANTM1    NUMBER;
      V_VRESTANTM2    NUMBER;
      V_VRBRUANTM2    NUMBER;
      V_QTDEESTOPOS   NUMBER;
      V_VALRESTOPOS   NUMBER;
      V_VALRBRUTPOS   NUMBER;
      V_VALRESTOPOSM1 NUMBER;
      V_VALRBRUTPOSM1 NUMBER;
      V_VALRESTOPOSM2 NUMBER;
      V_VALRBRUTPOSM2 NUMBER;
      V_QTDEANTEPOS   NUMBER;
      V_VRESTANTPOS   NUMBER;
      V_VRBRUANTPOS   NUMBER;
      V_VRESTANTPOSM1 NUMBER;
      V_VRBRUANTPOSM1 NUMBER;
      V_VRESTANTPOSM2 NUMBER;
      V_VRBRUANTPOSM2 NUMBER;
      V_VRINDICE1     NUMBER;
      V_VRINDICE2     NUMBER;
      V_QTRESPRODPED  NUMBER;
      V_CUSTPROD      NUMBER;

      V_DTSALDO       DATE;
      V_EXISMOV       VARCHAR2(01);
      V_POSIZERO      VARCHAR2(01);
      V_DTPOSIESTQ    DATE;
      V_NRLANCESTQ    VARCHAR2(14);
      V_DTRECALCEST   DATE;
      V_DTAUXILIAR    DATE;

      V_CDINDICEMF    VARCHAR2(04);
      V_CDINDICEMF2   VARCHAR2(04);

      V_CDTPINDICE    VARCHAR2(01);
      V_IDPERVALOR    VARCHAR2(01);
      V_CDTPINDICE2   VARCHAR2(01);
      V_IDPERVALOR2   VARCHAR2(01);
      V_CDPRODUTO     VARCHAR2(10);
      V_MOVNEG        VARCHAR2(01);
      V_IDPERMESTNEG  VARCHAR2(01);
      V_QTRESPRODPEDOL NUMBER;

/*VARIAVEIS PARA CALCULO DO CUSTO LOGISTICO*/

      V_VRCLOGDIAANT    NUMBER;
      V_VRSEGUDIAANT    NUMBER;
      V_VRCUSTOLOG      NUMBER;
      V_VRCUSTOSEG      NUMBER;
      V_VRCLOGDIAAM1    NUMBER;
      V_VRCLOGDIAAM2    NUMBER;
      V_VRSEGUDIAAM1    NUMBER;
      V_VRSEGUDIAAM2    NUMBER;
      V_VRCLOGDIAM1     NUMBER;
      V_VRCLOGDIAM2     NUMBER;
      V_VRSEGUDIAM1     NUMBER;
      V_VRSEGUDIAM2     NUMBER;
      V_VRCUSTOLOGPOS   NUMBER;
      V_VRCUSTOSEGPOS   NUMBER;

      V_VRCUSTLOGLAN    NUMBER;
      V_VRSEGULOGLAN    NUMBER;

      V_UTILLOTE        CHAR;
      V_UTILALMO        CHAR;

      V_NRLISTA         VARCHAR2(20);

      V_IDNFDEVOOL      VARCHAR2(01);

      -- variaveis host
      wRowId_POSESTDIA         RowId;
      wRowId_POSESTDIAORIG     RowId;
      wRowId_PRODLCESTOQ       RowId;

      w_S                      CHAR(1) := 'S';
      w_N                      CHAR(1) := 'N';

      wCt                      INTEGER := 0;
      wCt_Tables               VARCHAR2(100);

      V_DTENTRSAIDANT           DATE;  /*Data anterior da NF*/
      V_DTLANCMOVANT            DATE;  /*Data anterior do Item na Itlanctoest*/
      V_DATAPOS                 DATE; /*Variavel auxiliar*/
      V_DTULTMOVIMEN            DATE; /*Variavel auxiliar*/

      V_DTPOSESTCONS            DATE;

      V_IDUTORIGPROD            VARCHAR2(01); /* Variavel para verificar se utiliza origem do produto(Estrangeira) */
      V_IDORIGEMPROD            VARCHAR2(01); /* Variavel de identificacao da origem do produto(Estrangeira)*/
      V_QTDEESTOPOSORIG         NUMBER;
      V_QTDEESTOORIG            NUMBER;

      /* Fator de conversao variavel */
      V_NRSEQUITEMVAR           VARCHAR2(4);
      V_CDFILIMOVIVAR           VARCHAR2(4);
      V_NRLOTEESTQVAR           VARCHAR2(20);
      V_NRSUBLOTEVAR            VARCHAR2(4);
      V_CDPRODMOVIVAR           VARCHAR2(10);
      V_QTTOTLANCTOVAR          NUMBER;
      V_VRLANCTOESTVAR          NUMBER;
      V_VRTOTLANCTOVAR          NUMBER;
      V_VRFATOCONVVAR           NUMBER;
      V_QTLANCTESTVAR           NUMBER;
      V_DIFERENCA               NUMBER;

      V_IDTPLANCTO              VARCHAR2(1);

      CURSOR C_MOVILOTE IS
         SELECT M.CDFILIAL, M.CDALMOXARIFE, M.CDLOCALESTOQ,
                M.NRLOTEESTQ, M.NRSUBLOTE, M.CDPRODUTO, M.RowId
         FROM MOVILOTE M
         WHERE M.NRMOVILOTE   = P_FILILANCTO || P_NRLANCTO
         UNION
         SELECT M.CDFILIAL, M.CDALMOXARIFE, M.CDLOCALESTOQ,
                M.NRLOTEESTQ, M.NRSUBLOTE, M.CDPRODUTO, M.RowId
         FROM MOVILOTE M
         WHERE M.NRLANCTOORIG = P_FILILANCTO || P_NRLANCTO

         ORDER BY CDFILIAL, CDALMOXARIFE, CDLOCALESTOQ, CDPRODUTO;

   BEGIN

      SELECT MAX(CDTPINDICE),  MAX(IDPERVALOR),  MAX(CDINDICEMF),
             MAX(CDTPINDICE2), MAX(IDPERVALOR2), MAX(CDINDICEMF2)
      INTO V_CDTPINDICE,  V_IDPERVALOR,  V_CDINDICEMF,
           V_CDTPINDICE2, V_IDPERVALOR2, V_CDINDICEMF2
      FROM PARAMGERAL P
     WHERE P.CDPARGERAL = '0001';

      BEGIN
         SELECT MAX(IDTPLANCTO)
           INTO V_IDTPLANCTO
           FROM LANCTOESTOQ
          WHERE CDFILIAL   = P_FILILANCTO
            AND NRLANCESTQ = P_NRLANCTO;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_IDTPLANCTO := NULL;
      END;

      V_CDPRODUTO := 'X';

      SELECT MAX(NVL(IDUTILLOTE,'N')),
             MAX(NVL(IDUTILALMOX,'N')),
             MAX(NVL(IDPERMESTNEG,'N'))
      INTO V_UTILLOTE,
           V_UTILALMO,
           V_IDPERMESTNEG
      FROM PARAMFILIAL
      WHERE CDFILIAL = P_FILIMOVI;

      /*Gera um numero randomico para chave da tabela lista que recebe os itens
        atualizados, para posterior atualizacao da POSESTCONS*/

      SELECT LPAD(ABS(ROUND(DBMS_RANDOM.VALUE(9999,9999999999))),10,'0')
      INTO V_NRLISTA
      FROM DUAL;

      FOR C_ITLANCTO IN (SELECT IT.IDTIPOMOVI, IT.NRSEQUITEM, IT.CDFILIMOVI, IT.NRLOTEESTQ,
                                IT.NRSUBLOTE, IT.CDPRODMOVI, IT.QTTOTLANCTO, IT.VRTOTLANCTO,
                                IT.VRLANCTOEST, IT.VRLANCTOBRUT
                           FROM ITLANCTOEST IT, PRODUTO P, PRODFILI PF
                          WHERE IT.CDPRODUTO  = P.CDPRODUTO
                            AND P.CDPRODESTO  = PF.CDPRODUTO
                            AND PF.CDFILIAL   = IT.CDFILIMOVI
                            AND IT.CDFILIAL   = P_FILILANCTO
                            AND IT.NRLANCESTQ = P_NRLANCTO
                            AND PF.IDUTVRFTCONVVAR = 'S'
                            /* IMPLANTACAO, AJUSTE, ENTRADA E DEVOLUCAO */
                            AND IT.IDTIPOMOVI IN ('0', '1', '2', '5'))
      LOOP
         V_DIFERENCA      := 0;
         V_VRLANCTOESTVAR := 0;

         SELECT VRFATOCONV
           INTO V_VRFATOCONVVAR
           FROM LOTE
          WHERE CDFILIAL   = C_ITLANCTO.CDFILIMOVI
            AND NRLOTEESTQ = C_ITLANCTO.NRLOTEESTQ
            AND NRSUBLOTE  = C_ITLANCTO.NRSUBLOTE
            AND CDPRODUTO  = C_ITLANCTO.CDPRODMOVI;

         V_QTLANCTESTVAR := (C_ITLANCTO.QTTOTLANCTO*V_VRFATOCONVVAR);
         IF ((C_ITLANCTO.VRLANCTOEST > 0) AND (V_QTLANCTESTVAR <> 0)) THEN
            V_DIFERENCA      := (C_ITLANCTO.VRLANCTOBRUT/C_ITLANCTO.VRLANCTOEST);
            V_VRLANCTOESTVAR := (C_ITLANCTO.VRTOTLANCTO/V_QTLANCTESTVAR);
         END IF;

         UPDATE ITLANCTOEST
            SET QTLANCTOEST  = V_QTLANCTESTVAR,
                VRLANCTOEST  = V_VRLANCTOESTVAR,
                VRLANCTOBRUT = (V_VRLANCTOESTVAR * V_DIFERENCA)
          WHERE CDFILIAL   = P_FILILANCTO
            AND NRLANCESTQ = P_NRLANCTO
            AND NRSEQUITEM = C_ITLANCTO.NRSEQUITEM;
      END LOOP;

      /* LER OS PRODUTOS QUE SERAO ATUALIZADOS  */
      FOR C_PRODUTO IN C_MOVILOTE LOOP
         IF V_CDPRODUTO = 'X' THEN
            V_CDPRODUTO := C_PRODUTO.CDPRODUTO;

            INSERT INTO LISTA
              (NRLISTA, CDLISTA)
              (SELECT V_NRLISTA, V_CDPRODUTO FROM DUAL
               MINUS
               SELECT V_NRLISTA, CDLISTA
               FROM LISTA
               WHERE NRLISTA = V_NRLISTA);

         END IF;

         IF V_CDPRODUTO <> C_PRODUTO.CDPRODUTO THEN

            IF (NVL(V_UTILALMO,w_N) = w_S) OR  (NVL(V_UTILLOTE, w_N) = w_S) THEN
               ATUALIZA_ESTOQUE_CONS(P_FILIMOVI, V_CDPRODUTO, P_DTINICIAL, P_DTFINAL);
               V_CDPRODUTO := C_PRODUTO.CDPRODUTO;
            ELSE
               V_CDPRODUTO := C_PRODUTO.CDPRODUTO;
               INSERT INTO LISTA
                 (NRLISTA, CDLISTA)
              (SELECT V_NRLISTA, V_CDPRODUTO FROM DUAL
               MINUS
               SELECT V_NRLISTA, CDLISTA
               FROM LISTA
               WHERE NRLISTA = V_NRLISTA);

            END IF;
         END IF;


         IF P_IDBLOQTRANS = 'N' THEN
            BEGIN
              SELECT DTRECALCEST, CDFILIAL, Rowid
              INTO V_DTRECALCEST, V_FILIAUX, wRowId_PRODLCESTOQ
              FROM PRODLCESTOQ
              WHERE (CDFILIAL     = C_PRODUTO.CDFILIAL)     AND
                    (CDALMOXARIFE = C_PRODUTO.CDALMOXARIFE) AND
                    (CDLOCALESTOQ = C_PRODUTO.CDLOCALESTOQ) AND
                    (CDPRODUTO    = C_PRODUTO.CDPRODUTO)
              FOR UPDATE;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_DTRECALCEST := Null; V_FILIAUX := Null; wRowId_PRODLCESTOQ := Null;
            END;
         ELSE
            /* Nao bloqueia a transacao */
            BEGIN
              SELECT DTRECALCEST, CDFILIAL, Rowid
              INTO V_DTRECALCEST, V_FILIAUX, wRowId_PRODLCESTOQ
              FROM PRODLCESTOQ
              WHERE (CDFILIAL     = C_PRODUTO.CDFILIAL)     AND
                    (CDALMOXARIFE = C_PRODUTO.CDALMOXARIFE) AND
                    (CDLOCALESTOQ = C_PRODUTO.CDLOCALESTOQ) AND
                    (CDPRODUTO    = C_PRODUTO.CDPRODUTO)
              FOR UPDATE NOWAIT;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_DTRECALCEST := Null; V_FILIAUX := Null; wRowId_PRODLCESTOQ := Null;
            END;
         END IF;

        /* ATUALIZA AS DATAS INICIAL/FINAL PARA ATUALIZAR TODO PERIODO */

         SELECT MIN(DTLANCMOVI) INTO V_DTINICEST
         FROM ITLANCTOEST
         WHERE (CDFILIMOVI   = C_PRODUTO.CDFILIAL)     AND
               (CDALMOXARIFE = C_PRODUTO.CDALMOXARIFE) AND
               (CDLOCALESTOQ = C_PRODUTO.CDLOCALESTOQ) AND
               (NRLOTEESTQ   = C_PRODUTO.NRLOTEESTQ)   AND
               (NRSUBLOTE    = C_PRODUTO.NRSUBLOTE)    AND
               (CDPRODMOVI   = C_PRODUTO.CDPRODUTO);

         SELECT MIN(DTPOSIESTQ) INTO V_DTINICPOS
         FROM POSESTDIA
         WHERE (CDFILIAL     = C_PRODUTO.CDFILIAL)     AND
               (CDALMOXARIFE = C_PRODUTO.CDALMOXARIFE) AND
               (CDLOCALESTOQ = C_PRODUTO.CDLOCALESTOQ) AND
               (NRLOTEESTQ   = C_PRODUTO.NRLOTEESTQ)   AND
               (NRSUBLOTE    = C_PRODUTO.NRSUBLOTE)    AND
               (CDPRODUTO    = C_PRODUTO.CDPRODUTO);

         /* DATA INICIAL */

         IF NOT(V_DTRECALCEST IS NULL) AND
            (V_DTRECALCEST < P_DTINICIAL) THEN
            V_DTINICIAL := V_DTRECALCEST;
         ELSE
            V_DTINICIAL := P_DTINICIAL;
         END IF;

         IF NOT(V_DTINICEST IS NULL) OR
            NOT(V_DTINICPOS IS NULL) THEN

            IF NOT(V_DTINICEST IS NULL) THEN
               V_DTINICAUX := V_DTINICEST;
            END IF;

            IF NOT(V_DTINICPOS IS NULL) THEN
               IF (V_DTINICPOS < V_DTINICAUX) THEN
                   V_DTINICAUX := V_DTINICPOS;
               END IF;
            END IF;

            IF (V_DTINICIAL < V_DTINICAUX) THEN
                V_DTINICIAL := V_DTINICAUX;
            END IF;

            DELETE POSESTDIA
            WHERE (CDFILIAL     = C_PRODUTO.CDFILIAL)     AND
                  (CDALMOXARIFE = C_PRODUTO.CDALMOXARIFE) AND
                  (CDLOCALESTOQ = C_PRODUTO.CDLOCALESTOQ) AND
                  (NRLOTEESTQ   = C_PRODUTO.NRLOTEESTQ)   AND
                  (NRSUBLOTE    = C_PRODUTO.NRSUBLOTE)    AND
                  (CDPRODUTO    = C_PRODUTO.CDPRODUTO)    AND
                  (DTPOSIESTQ  <= V_DTINICEST);
         END IF;

         /* DATA FINAL */
         SELECT MAX(DTLANCMOVI) INTO V_DTFINAL
         FROM ITLANCTOEST
         WHERE (CDFILIMOVI   = C_PRODUTO.CDFILIAL)     AND
               (CDALMOXARIFE = C_PRODUTO.CDALMOXARIFE) AND
               (CDLOCALESTOQ = C_PRODUTO.CDLOCALESTOQ) AND
               (NRLOTEESTQ   = C_PRODUTO.NRLOTEESTQ)   AND
               (NRSUBLOTE    = C_PRODUTO.NRSUBLOTE)    AND
               (CDPRODMOVI   = C_PRODUTO.CDPRODUTO);

         IF V_DTFINAL IS NULL THEN
            V_DTFINAL := P_DTFINAL;
         ELSE
            IF (V_DTFINAL <= P_DTFINAL) THEN
                V_DTFINAL := P_DTFINAL;
            END IF;
         END IF;

         /* LER SALDO INICIAL DO PRODUTO */

         BEGIN
           SELECT NVL(QTESTOQDIA,   0),
                  NVL(VRESTOQDIA,   0),
                  NVL(VRESTOQBRUT,  0),
                  NVL(VRESTOQDIAM1, 0),
                  NVL(VRESTOQBRUM1, 0),
                  NVL(VRESTOQDIAM2, 0),
                  NVL(VRESTOQBRUM2, 0),
                  NVL(QTESTOQANT,   0),
                  NVL(VRESTOQANT,   0),
                  NVL(VRBRUTOANT,   0),
                  NVL(VRESTOQANTM1, 0),
                  NVL(VRBRUTOANTM1, 0),
                  NVL(VRESTOQANTM2, 0),
                  NVL(VRBRUTOANTM2, 0),
                  DTPOSIESTQ,
                  NVL(VRCLOGDIAANT,0),
                  NVL(VRSEGUDIAANT,0),
                  NVL(VRCLOGDIAAM1,0),
                  NVL(VRCLOGDIAAM2,0),
                  NVL(VRSEGUDIAAM1,0),
                  NVL(VRSEGUDIAAM2,0),
                  NVL(VRCLOGDIA,0),
                  NVL(VRSEGUDIA,0),
                  NVL(VRCLOGDIAM1,0),
                  NVL(VRCLOGDIAM2,0),
                  NVL(VRSEGUDIAM1,0),
                  NVL(VRSEGUDIAM2,0)
           INTO   V_QTDEESTOPOS,
                  V_VALRESTOPOS,
                  V_VALRBRUTPOS,
                  V_VALRESTOPOSM1,
                  V_VALRBRUTPOSM1,
                  V_VALRESTOPOSM2,
                  V_VALRBRUTPOSM2,
                  V_QTDEANTEPOS,
                  V_VRESTANTPOS,
                  V_VRBRUANTPOS,
                  V_VRESTANTPOSM1,
                  V_VRBRUANTPOSM1,
                  V_VRESTANTPOSM2,
                  V_VRBRUANTPOSM2,
                  V_DTAUXILIAR,
                  V_VRCLOGDIAANT,
                  V_VRSEGUDIAANT,
                  V_VRCLOGDIAAM1,
                  V_VRCLOGDIAAM2,
                  V_VRSEGUDIAAM1,
                  V_VRSEGUDIAAM2,
                  V_VRCUSTOLOGPOS,
                  V_VRCUSTOSEGPOS,
                  V_VRCLOGDIAM1,
                  V_VRCLOGDIAM2,
                  V_VRSEGUDIAM1,
                  V_VRSEGUDIAM2
           FROM POSESTDIA
           WHERE (CDFILIAL     = C_PRODUTO.CDFILIAL)        AND
                 (CDALMOXARIFE = C_PRODUTO.CDALMOXARIFE)    AND
                 (CDLOCALESTOQ = C_PRODUTO.CDLOCALESTOQ)    AND
                 (NRLOTEESTQ   = C_PRODUTO.NRLOTEESTQ)      AND
                 (NRSUBLOTE    = C_PRODUTO.NRSUBLOTE)       AND
                 (CDPRODUTO    = C_PRODUTO.CDPRODUTO)       AND
                 (DTPOSIESTQ   = (SELECT MAX(DTPOSIESTQ)
                                  FROM POSESTDIA
                                  WHERE (CDFILIAL     =  C_PRODUTO.CDFILIAL)     AND
                                        (CDALMOXARIFE =  C_PRODUTO.CDALMOXARIFE) AND
                                        (CDLOCALESTOQ =  C_PRODUTO.CDLOCALESTOQ) AND
                                        (NRLOTEESTQ   =  C_PRODUTO.NRLOTEESTQ)   AND
                                        (NRSUBLOTE    =  C_PRODUTO.NRSUBLOTE)    AND
                                        (CDPRODUTO    =  C_PRODUTO.CDPRODUTO)    AND
                                        (DTPOSIESTQ   <= V_DTINICIAL)));
         EXCEPTION
           WHEN NO_DATA_FOUND THEN
                V_QTDEESTOPOS    := 0;
                V_VALRESTOPOS    := 0;
                V_VALRBRUTPOS    := 0;
                V_VALRESTOPOSM1  := 0;
                V_VALRBRUTPOSM1  := 0;
                V_VALRESTOPOSM2  := 0;
                V_VALRBRUTPOSM2  := 0;
                V_QTDEANTEPOS    := 0;
                V_VRESTANTPOS    := 0;
                V_VRBRUANTPOS    := 0;
                V_VRESTANTPOSM1  := 0;
                V_VRBRUANTPOSM1  := 0;
                V_VRESTANTPOSM2  := 0;
                V_VRBRUANTPOSM2  := 0;
                V_DTAUXILIAR     := Null;
                V_VRCLOGDIAANT   := 0;
                V_VRSEGUDIAANT   := 0;
                V_VRCLOGDIAAM1   := 0;
                V_VRCLOGDIAAM2   := 0;
                V_VRSEGUDIAAM1   := 0;
                V_VRSEGUDIAAM2   := 0;
                V_VRCUSTOLOGPOS  := 0;
                V_VRCUSTOSEGPOS  := 0;
                V_VRCLOGDIAM1    := 0;
                V_VRCLOGDIAM2    := 0;
                V_VRSEGUDIAM1    := 0;
                V_VRSEGUDIAM2    := 0;
         END;

         DELETE POSESTATU
         WHERE (CDFILIAL     = C_PRODUTO.CDFILIAL)     AND
               (CDALMOXARIFE = C_PRODUTO.CDALMOXARIFE) AND
               (CDLOCALESTOQ = C_PRODUTO.CDLOCALESTOQ) AND
               (NRLOTEESTQ   = C_PRODUTO.NRLOTEESTQ)   AND
               (NRSUBLOTE    = C_PRODUTO.NRSUBLOTE)    AND
               (CDPRODUTO    = C_PRODUTO.CDPRODUTO);

         DELETE POSESTDIA
         WHERE (CDFILIAL     = C_PRODUTO.CDFILIAL)     AND
               (CDALMOXARIFE = C_PRODUTO.CDALMOXARIFE) AND
               (CDLOCALESTOQ = C_PRODUTO.CDLOCALESTOQ) AND
               (NRLOTEESTQ   = C_PRODUTO.NRLOTEESTQ)   AND
               (NRSUBLOTE    = C_PRODUTO.NRSUBLOTE)    AND
               (CDPRODUTO    = C_PRODUTO.CDPRODUTO)    AND
               (DTPOSIESTQ   > V_DTINICIAL);

         BEGIN
            SELECT IDUTORIGPROD
              INTO V_IDUTORIGPROD
              FROM PARAMGERAL
             WHERE CDPARGERAL = '0001';
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_IDUTORIGPROD := 'N';
         END;

         IF(V_IDUTORIGPROD = 'S') THEN
            /* SALDO PRODUTO ORIGEM ESTRANGEIRA */
            BEGIN
              SELECT NVL(QTESTOQDIA, 0)
                INTO V_QTDEESTOPOSORIG
              FROM POSESTDIAORIG
              WHERE (CDFILIAL     = C_PRODUTO.CDFILIAL)        AND
                    (CDALMOXARIFE = C_PRODUTO.CDALMOXARIFE)    AND
                    (CDLOCALESTOQ = C_PRODUTO.CDLOCALESTOQ)    AND
                    (NRLOTEESTQ   = C_PRODUTO.NRLOTEESTQ)      AND
                    (NRSUBLOTE    = C_PRODUTO.NRSUBLOTE)       AND
                    (CDPRODUTO    = C_PRODUTO.CDPRODUTO)       AND
                    (DTPOSIESTQ   = (SELECT MAX(DTPOSIESTQ)
                                       FROM POSESTDIAORIG
                                      WHERE (CDFILIAL     =  C_PRODUTO.CDFILIAL)     AND
                                            (CDALMOXARIFE =  C_PRODUTO.CDALMOXARIFE) AND
                                            (CDLOCALESTOQ =  C_PRODUTO.CDLOCALESTOQ) AND
                                            (NRLOTEESTQ   =  C_PRODUTO.NRLOTEESTQ)   AND
                                            (NRSUBLOTE    =  C_PRODUTO.NRSUBLOTE)    AND
                                            (CDPRODUTO    =  C_PRODUTO.CDPRODUTO)    AND
                                            (DTPOSIESTQ   <= V_DTINICIAL)));
            EXCEPTION
              WHEN NO_DATA_FOUND THEN
                   V_QTDEESTOPOSORIG    := 0;
            END;

            /* SALDO PRODUTO ORIGEM ESTRANGEIRA */

            DELETE POSESTATUORIG
            WHERE (CDFILIAL     = C_PRODUTO.CDFILIAL)     AND
                  (CDALMOXARIFE = C_PRODUTO.CDALMOXARIFE) AND
                  (CDLOCALESTOQ = C_PRODUTO.CDLOCALESTOQ) AND
                  (NRLOTEESTQ   = C_PRODUTO.NRLOTEESTQ)   AND
                  (NRSUBLOTE    = C_PRODUTO.NRSUBLOTE)    AND
                  (CDPRODUTO    = C_PRODUTO.CDPRODUTO);

            DELETE POSESTDIAORIG
            WHERE (CDFILIAL     = C_PRODUTO.CDFILIAL)     AND
                  (CDALMOXARIFE = C_PRODUTO.CDALMOXARIFE) AND
                  (CDLOCALESTOQ = C_PRODUTO.CDLOCALESTOQ) AND
                  (NRLOTEESTQ   = C_PRODUTO.NRLOTEESTQ)   AND
                  (NRSUBLOTE    = C_PRODUTO.NRSUBLOTE)    AND
                  (CDPRODUTO    = C_PRODUTO.CDPRODUTO)    AND
                  (DTPOSIESTQ   > V_DTINICIAL);
         END IF;

         /* ATUALIZA SALDO DE ESTOQUE DESDE A DATA INICIAL */
         /* ATE A DATA DE PROCESSAMENTO                    */

         V_EXISMOV    := w_N;
         V_DTSALDO    := V_DTINICIAL;
         V_NRLANCESTQ := 'X';

         V_QTDEESTO   := V_QTDEESTOPOS;
         V_VALRESTO   := V_VALRESTOPOS;
         V_VALRBRUT   := V_VALRBRUTPOS;
         V_VALRESTOM1 := V_VALRESTOPOSM1;
         V_VALRBRUTM1 := V_VALRBRUTPOSM1;
         V_VALRESTOM2 := V_VALRESTOPOSM2;
         V_VALRBRUTM2 := V_VALRBRUTPOSM2;
         V_QTDEANTE   := V_QTDEANTEPOS;
         V_VRESTANT   := V_VRESTANTPOS;
         V_VRBRUANT   := V_VRBRUANTPOS;
         V_VRESTANTM1 := V_VRESTANTPOSM1;
         V_VRBRUANTM1 := V_VRBRUANTPOSM1;
         V_VRESTANTM2 := V_VRESTANTPOSM2;
         V_VRBRUANTM2 := V_VRBRUANTPOSM2;
         V_VRCUSTOLOG := V_VRCUSTOLOGPOS;
         V_VRCUSTOSEG := V_VRCUSTOSEGPOS;

         V_QTDEESTOORIG := V_QTDEESTOPOSORIG; /* Posicao origem estrangeira */

         IF (V_QTDEESTO <> 0) THEN
            V_QTDEANTE   := V_QTDEANTEPOS;
            V_VRESTANT   := V_VRESTANTPOS;
            V_VRBRUANT   := V_VRBRUANTPOS;
            V_VRESTANTM1 := V_VRESTANTPOSM1;
            V_VRBRUANTM1 := V_VRBRUANTPOSM1;
            V_VRESTANTM2 := V_VRESTANTPOSM2;
            V_VRBRUANTM2 := V_VRBRUANTPOSM2;
         END IF;

         IF V_VRCUSTOLOG <> 0 THEN
            V_VRCLOGDIAANT  := V_VRCUSTOLOG;
         END IF;

         IF V_VRCUSTOSEG <> 0 THEN
            V_VRSEGUDIAANT := V_VRCUSTOSEG;
         END IF;


         V_MOVNEG := w_N;

         FOR C_LANCTOEST IN (SELECT I.IDTIPOMOVI, I.DTLANCMOVI, NVL(I.VRLANCTOEST,0) VRLANCTOEST,
                                    NVL(I.VRLANCTOBRUT, 0) VRLANCTOBRUT, I.QTLANCTOEST, I.IDALTCMEDMV,
                                    I.CDFILIAL, I.NRLANCESTQ, I.VRCUSTLOGLAN, I.VRSEGULOGLAN, I.NRSEQUITEM,
                                    L.CDTIPOOPER, I.IDORIGEMPROD
                             FROM ITLANCTOEST I, LANCTOESTOQ L
                             WHERE (I.CDFILIMOVI   = C_PRODUTO.CDFILIAL)     AND
                                   (I.CDALMOXARIFE = C_PRODUTO.CDALMOXARIFE) AND
                                   (I.CDLOCALESTOQ = C_PRODUTO.CDLOCALESTOQ) AND
                                   (I.NRLOTEESTQ   = C_PRODUTO.NRLOTEESTQ)   AND
                                   (I.NRSUBLOTE    = C_PRODUTO.NRSUBLOTE)    AND
                                   (I.CDPRODMOVI   = C_PRODUTO.CDPRODUTO)    AND
                                   (I.CDFILIAL   = L.CDFILIAL)             AND
                                   (I.NRLANCESTQ = L.NRLANCESTQ)           AND
/*O between foi alterado devido a problema no select na coan- geracao de nf por romaneio sem o */
                                   (I.DTLANCMOVI   BETWEEN TO_CHAR(V_DTINICIAL,'DD/MM/YYYY')  AND TO_CHAR(V_DTFINAL,'DD/MM/YYYY'))  AND
                                   (NVL(I.IDEVOLESTOQ,w_S) = w_S)
                             ORDER BY I.DTLANCMOVI, NVL(DECODE (IDORDEMCLC, 'U', '99', IDORDEMCLC),IDTIPOMOVI), I.NRLANCESTQ, NRSEQUITEM) LOOP

            IF (V_CDINDICEMF IS NOT NULL) THEN

               SELECT MAX(VRINDICE)
               INTO V_VRINDICE1
               FROM  INDICE I, MOVINDICE M
               WHERE I.CDTPINDICE = V_CDTPINDICE AND
                     I.IDPERVALOR = V_IDPERVALOR AND
                     I.CDINDICE   = V_CDINDICEMF AND
                     I.CDTPINDICE = M.CDTPINDICE AND
                     I.IDPERVALOR = M.IDPERVALOR AND
                     I.CDINDICE   = M.CDINDICE   AND
                     C_LANCTOEST.DTLANCMOVI = M.DTREFIND;

               IF (NVL(V_VRINDICE1,0) = 0) THEN
                  raise_application_error(-20501, 'Indice Financeiro Parametrizado na Personalizacao do Sistema nao Possui valor Cadastrado para a Data '||TO_CHAR(C_LANCTOEST.DTLANCMOVI,'DD/MM/YYYY')  , True);
               END IF;
            END IF;

            IF (V_CDINDICEMF2 IS NOT NULL) THEN
               SELECT MAX(VRINDICE)
               INTO V_VRINDICE2
               FROM  INDICE I, MOVINDICE M
               WHERE I.CDTPINDICE = V_CDTPINDICE2 AND
                     I.IDPERVALOR = V_IDPERVALOR2 AND
                     I.CDINDICE   = V_CDINDICEMF2 AND
                     I.CDTPINDICE = M.CDTPINDICE AND
                     I.IDPERVALOR = M.IDPERVALOR AND
                     I.CDINDICE   = M.CDINDICE   AND
                     C_LANCTOEST.DTLANCMOVI = M.DTREFIND;


               IF (NVL(V_VRINDICE2,0) = 0) THEN
                  raise_application_error(-20501, 'Indice Financeiro Parametrizado na Personalizacao do Sistema nao Possui valor Cadastrado para a Data '||TO_CHAR(C_LANCTOEST.DTLANCMOVI,'DD/MM/YYYY')  , True);
               END IF;
            END IF;

            V_VRCUSTLOGLAN := NVL(C_LANCTOEST.VRCUSTLOGLAN, 0);
            V_VRSEGULOGLAN := NVL(C_LANCTOEST.VRSEGULOGLAN, 0);


            IF (V_DTSALDO > C_LANCTOEST.DTLANCMOVI) THEN
               V_DTSALDO := C_LANCTOEST.DTLANCMOVI + 1;
            END IF;

            IF (V_QTDEESTO <> 0) THEN
               V_QTDEANTE   := V_QTDEESTO;
               V_VRESTANT   := V_VALRESTO;
               V_VRBRUANT   := V_VALRBRUT;

               V_VRESTANTM1 :=  V_VALRESTOPOSM1;
               V_VRBRUANTM1 :=  V_VALRBRUTPOSM1;
               V_VRESTANTM2 :=  V_VALRESTOPOSM2;
               V_VRBRUANTM2 :=  V_VALRBRUTPOSM2;

               V_VRCLOGDIAANT := V_VRCUSTOLOG;
               V_VRSEGUDIAANT := V_VRCUSTOSEG;

            END IF;

            IF (C_LANCTOEST.DTLANCMOVI + 1) = V_DTAUXILIAR THEN
               V_QTDEESTO   := 0;
               V_VALRESTO   := 0;
               V_VALRBRUT   := 0;
               V_QTDEANTE   := 0;
               V_VRESTANT   := 0;
               V_VRBRUANT   := 0;

               V_VRESTANTM1 := 0;
               V_VRBRUANTM1 := 0;
               V_VRESTANTM2 := 0;
               V_VRBRUANTM2 := 0;

               V_VRCUSTOLOG   := 0;                /*AQUI*/
               V_VRCUSTOSEG   := 0;
               V_VRCLOGDIAANT := 0;
               V_VRSEGUDIAANT := 0;

               V_QTDEESTOORIG := 0; /* Origem Estrangeira */
            END IF;

            V_EXISMOV := 'S';

            /* GRAVACAO DOS SALDOS DIARIOS PARA O PRODUTO */

            /* TRATAMENTO PARA CADA REGISTRO DE LANCAMENTO DE ESTOQUE */

            IF (C_LANCTOEST.IDTIPOMOVI = '0') THEN    /* IMPLANTACAO */
               IF V_NRLANCESTQ <> C_LANCTOEST.CDFILIAL||C_LANCTOEST.NRLANCESTQ THEN
                  V_VALRBRUT    := C_LANCTOEST.VRLANCTOBRUT;
                  V_VALRESTO    := C_LANCTOEST.VRLANCTOEST;
                  V_QTDEESTO    := C_LANCTOEST.QTLANCTOEST;
               ELSE
                  V_VALRBRUT    := V_VALRBRUT   + C_LANCTOEST.VRLANCTOBRUT;
                  V_VALRESTO    := V_VALRESTO   + C_LANCTOEST.VRLANCTOEST;
                  V_QTDEESTO    := V_QTDEESTO   + C_LANCTOEST.QTLANCTOEST;
               END IF;
               V_VRCUSTOLOG   := 0;                /*AQUI*/
               V_VRCUSTOSEG   := 0;
            ELSIF (C_LANCTOEST.IDTIPOMOVI = '1') THEN    /* AJUSTES     */
               IF NVL(C_LANCTOEST.IDALTCMEDMV,w_N) <> 'S' THEN
                  IF V_QTDEESTO = 0 THEN
                     IF V_QTDEANTE <> 0 THEN
                        IF (C_LANCTOEST.QTLANCTOEST <> 0) THEN
                           V_VALRBRUT := (V_VRBRUANT/V_QTDEANTE)*C_LANCTOEST.QTLANCTOEST;
                           V_VALRESTO := (V_VRESTANT /V_QTDEANTE)*C_LANCTOEST.QTLANCTOEST;

                           IF V_QTDEANTE > C_LANCTOEST.QTLANCTOEST THEN
                              V_VRCUSTOLOG := V_VRCUSTOLOG - ((V_VRCUSTOLOG/V_QTDEANTE) * ABS(C_LANCTOEST.QTLANCTOEST-V_QTDEANTE));
                              V_VRCUSTOSEG := V_VRCUSTOSEG - ((V_VRCUSTOSEG/V_QTDEANTE) * ABS(C_LANCTOEST.QTLANCTOEST-V_QTDEANTE));
                           ELSE
                              IF V_QTDEANTE > C_LANCTOEST.QTLANCTOEST THEN
                                 V_VRCUSTOLOG := V_VRCUSTOLOG + ((V_VRCUSTOLOG/V_QTDEANTE) * ABS(C_LANCTOEST.QTLANCTOEST-V_QTDEANTE));
                                 V_VRCUSTOSEG := V_VRCUSTOSEG + ((V_VRCUSTOSEG/V_QTDEANTE) * ABS(C_LANCTOEST.QTLANCTOEST-V_QTDEANTE));
                              END IF;
                           END IF;


                           V_VRBRUANT := 0;
                           V_VRESTANT := 0;
                           V_QTDEANTE := 0;

                           V_VRESTANTM1 := 0;
                           V_VRBRUANTM1 := 0;
                           V_VRESTANTM2 := 0;
                           V_VRBRUANTM2 := 0;

                           V_VRCLOGDIAANT := 0;
                           V_VRSEGUDIAANT := 0;
                        ELSE
                           V_VALRBRUT   := 0;
                           V_VALRESTO   := 0;
                        END IF;
                     ELSE
                        V_VALRBRUT   := 0;
                        V_VALRESTO   := 0;
                        V_VRBRUANT   := 0;
                        V_VRESTANT   := 0;
                        V_QTDEANTE   := 0;
                        V_VRCLOGDIAANT := 0;
                        V_VRSEGUDIAANT := 0;

                        V_VRESTANTM1 := 0;
                        V_VRBRUANTM1 := 0;
                        V_VRESTANTM2 := 0;
                        V_VRBRUANTM2 := 0;
                     END IF;
                     V_QTDEESTO := C_LANCTOEST.QTLANCTOEST;
                  ELSE
                     V_VALRBRUT := (V_VALRBRUT/V_QTDEESTO)*C_LANCTOEST.QTLANCTOEST;
                     V_VALRESTO := (V_VALRESTO/V_QTDEESTO)*C_LANCTOEST.QTLANCTOEST;

                     IF V_QTDEESTO > C_LANCTOEST.QTLANCTOEST THEN
                        V_VRCUSTOLOG := V_VRCUSTOLOG - ((V_VRCUSTOLOG/V_QTDEESTO) * ABS(C_LANCTOEST.QTLANCTOEST-V_QTDEESTO));
                        V_VRCUSTOSEG := V_VRCUSTOSEG - ((V_VRCUSTOSEG/V_QTDEESTO) * ABS(C_LANCTOEST.QTLANCTOEST-V_QTDEESTO));
                     ELSE
                        IF V_QTDEESTO < C_LANCTOEST.QTLANCTOEST THEN
                           V_VRCUSTOLOG := V_VRCUSTOLOG + ((V_VRCUSTOLOG/V_QTDEESTO) * ABS(C_LANCTOEST.QTLANCTOEST-V_QTDEESTO));
                           V_VRCUSTOSEG := V_VRCUSTOSEG + ((V_VRCUSTOSEG/V_QTDEESTO) * ABS(C_LANCTOEST.QTLANCTOEST-V_QTDEESTO));
                        END IF;
                     END IF;
                  END IF;
               END IF;
               V_QTDEESTO := C_LANCTOEST.QTLANCTOEST;

            ELSIF (C_LANCTOEST.IDTIPOMOVI = '2') THEN    /* ENTRADA */

               IF (V_IDPERMESTNEG = 'S') AND
                  (((V_QTDEESTOPOS + C_LANCTOEST.QTLANCTOEST) = ABS(V_QTDEESTOPOS + C_LANCTOEST.QTLANCTOEST)) AND ((V_VALRESTOPOS + (C_LANCTOEST.QTLANCTOEST*C_LANCTOEST.VRLANCTOEST)) <> ABS(V_VALRESTOPOS + (C_LANCTOEST.QTLANCTOEST*C_LANCTOEST.VRLANCTOEST)))) OR
                  (((V_QTDEESTOPOS + C_LANCTOEST.QTLANCTOEST) <> ABS(V_QTDEESTOPOS + C_LANCTOEST.QTLANCTOEST)) AND ((V_VALRESTOPOS + (C_LANCTOEST.QTLANCTOEST*C_LANCTOEST.VRLANCTOEST)) = ABS(V_VALRESTOPOS + (C_LANCTOEST.QTLANCTOEST*C_LANCTOEST.VRLANCTOEST)))) THEN

                     UPDATE ITLANCTOEST
                        SET VRUNILANCTO  = ROUND(V_VALRESTOPOS / V_QTDEESTOPOS,5),
                            VRLANCTOEST  = ROUND(V_VALRESTOPOS / V_QTDEESTOPOS,5),
                            VRLANCTOBRUT = ROUND(V_VALRBRUTPOS / V_QTDEESTOPOS,5)
                        WHERE CDFILIAL   = P_FILILANCTO
                          AND NRLANCESTQ = P_NRLANCTO
                          AND NRSEQUITEM = C_LANCTOEST.NRSEQUITEM;

                     IF (C_LANCTOEST.QTLANCTOEST <> 0 OR C_LANCTOEST.CDTIPOOPER = '03' ) THEN
                        V_QTDEESTO     := V_QTDEESTO   +  C_LANCTOEST.QTLANCTOEST;
                        IF (C_LANCTOEST.IDORIGEMPROD = 'E') THEN
                           V_QTDEESTOORIG := V_QTDEESTOORIG + C_LANCTOEST.QTLANCTOEST;
                        END IF;

                        V_VRCUSTOLOG   := V_VRCUSTOLOG +  V_VRCUSTLOGLAN;
                        V_VRCUSTOSEG   := V_VRCUSTOSEG +  V_VRSEGULOGLAN;
                        IF C_LANCTOEST.QTLANCTOEST = 0 THEN
                           V_VALRBRUT := V_VALRBRUT + ROUND(V_VALRBRUTPOS / V_QTDEESTOPOS,5);
                           V_VALRESTO := V_VALRESTO + ROUND(V_VALRESTOPOS / V_QTDEESTOPOS,5);
                        ELSE
                           V_VALRBRUT := V_VALRBRUT + (C_LANCTOEST.QTLANCTOEST * ROUND(V_VALRBRUTPOS / V_QTDEESTOPOS,5));
                           V_VALRESTO := V_VALRESTO + (C_LANCTOEST.QTLANCTOEST * ROUND(V_VALRESTOPOS / V_QTDEESTOPOS,5));
                        END IF;

                        IF V_QTDEESTO  = 0 THEN
                           V_VALRBRUT   := 0;
                           V_VALRESTO   := 0;
                        END IF;
                     END IF;
               ELSE
                  IF (C_LANCTOEST.QTLANCTOEST <> 0 OR C_LANCTOEST.CDTIPOOPER = '03' ) THEN
                     V_QTDEESTO     := V_QTDEESTO   +  C_LANCTOEST.QTLANCTOEST;
                     IF (C_LANCTOEST.IDORIGEMPROD = 'E') THEN
                        V_QTDEESTOORIG := V_QTDEESTOORIG + C_LANCTOEST.QTLANCTOEST;
                     END IF;

                     V_VRCUSTOLOG   := V_VRCUSTOLOG +  V_VRCUSTLOGLAN;
                     V_VRCUSTOSEG   := V_VRCUSTOSEG +  V_VRSEGULOGLAN;
                     IF C_LANCTOEST.QTLANCTOEST = 0 THEN
                        V_VALRBRUT := V_VALRBRUT + C_LANCTOEST.VRLANCTOBRUT;
                        V_VALRESTO := V_VALRESTO + C_LANCTOEST.VRLANCTOEST;
                     ELSE
                        V_VALRBRUT := V_VALRBRUT + (C_LANCTOEST.QTLANCTOEST*C_LANCTOEST.VRLANCTOBRUT);
                        V_VALRESTO := V_VALRESTO + (C_LANCTOEST.QTLANCTOEST*C_LANCTOEST.VRLANCTOEST);
                     END IF;

                     IF V_QTDEESTO  = 0 THEN
                        V_VALRBRUT   := 0;
                        V_VALRESTO   := 0;
                     END IF;
                  END IF;
               END IF;

            ELSIF (C_LANCTOEST.IDTIPOMOVI = '3') THEN    /* RETIRADA    */
               IF V_QTDEESTO > 0 THEN
                  V_VALRBRUT := V_VALRBRUT - ((V_VALRBRUT/V_QTDEESTO)*C_LANCTOEST.QTLANCTOEST);
                  V_VALRESTO := V_VALRESTO - ((V_VALRESTO/V_QTDEESTO)*C_LANCTOEST.QTLANCTOEST);

                  V_VRCUSTOLOG := ROUND(V_VRCUSTOLOG,8) - ROUND(((V_VRCUSTOLOG/V_QTDEESTO) *C_LANCTOEST.QTLANCTOEST),8);
                  V_VRCUSTOSEG := ROUND(V_VRCUSTOSEG,8) - ROUND(((V_VRCUSTOSEG/V_QTDEESTO) *C_LANCTOEST.QTLANCTOEST),8);
               END IF;

               V_QTDEESTO := V_QTDEESTO - C_LANCTOEST.QTLANCTOEST;

               IF (V_QTDEESTO < 0) THEN
                  IF (V_QTDEANTE <> 0) THEN
                     V_VALRESTO := ((V_VRESTANT/V_QTDEANTE)*V_QTDEESTO);
                     V_VALRBRUT := ((V_VRBRUANT/V_QTDEANTE)*V_QTDEESTO);
                  ELSE
                     V_VALRESTO := 0;
                     V_VALRBRUT := 0;
                  END IF;
               END IF;

               IF V_QTDEESTO = 0 THEN
                  V_QTDEESTO := 0;
               END IF;

               IF V_QTDEESTO  = 0 THEN
                  V_VALRBRUT   := 0;
                  V_VALRESTO   := 0;
               END IF;

               IF (V_QTDEESTO < -0.0000001) THEN
                  V_MOVNEG := 'S';
               END IF;
            ELSIF (C_LANCTOEST.IDTIPOMOVI = '4') THEN    /* SAIDA       */
               IF (C_LANCTOEST.QTLANCTOEST <> 0 OR C_LANCTOEST.CDTIPOOPER = '03' ) THEN
                  IF V_QTDEESTO > 0 THEN
                     V_VALRBRUT   := V_VALRBRUT - ((V_VALRBRUT/V_QTDEESTO)*C_LANCTOEST.QTLANCTOEST);
                     V_VALRESTO   := V_VALRESTO - ((V_VALRESTO/V_QTDEESTO)*C_LANCTOEST.QTLANCTOEST);
                     V_VRCUSTOLOG := V_VRCUSTOLOG - ((V_VRCUSTOLOG/V_QTDEESTO) * C_LANCTOEST.QTLANCTOEST);
                     V_VRCUSTOSEG := V_VRCUSTOSEG - ((V_VRCUSTOSEG/V_QTDEESTO) * C_LANCTOEST.QTLANCTOEST);
                  END IF;

                  V_QTDEESTO := V_QTDEESTO - C_LANCTOEST.QTLANCTOEST;

                  IF (C_LANCTOEST.IDORIGEMPROD = 'E') THEN
                     V_QTDEESTOORIG := V_QTDEESTOORIG - C_LANCTOEST.QTLANCTOEST;
                  END IF;

                  IF (V_QTDEESTO < 0) THEN
                     IF (V_QTDEANTE <> 0) THEN
                        V_VALRESTO := ((V_VRESTANT/V_QTDEANTE)*V_QTDEESTO);
                        V_VALRBRUT := ((V_VRBRUANT/V_QTDEANTE)*V_QTDEESTO);
                     ELSE
                        V_VALRESTO := 0;
                        V_VALRBRUT := 0;
                     END IF;
                  END IF;

                  IF V_QTDEESTO = 0 THEN
                     V_QTDEESTO := 0;
                  END IF;

                  IF V_QTDEESTO  = 0 THEN
                     V_VALRBRUT   := 0;
                     V_VALRESTO   := 0;
                  END IF;

                  IF (V_QTDEESTO < -0.0000001) THEN
                     V_MOVNEG := 'S';
                  END IF;

                  IF (V_QTDEESTOORIG < 0) THEN
                     V_QTDEESTOORIG := 0;
                  END IF;
               END IF;

            ELSIF (C_LANCTOEST.IDTIPOMOVI = '5') THEN    /* DEV. FORN.  */

               IF C_LANCTOEST.QTLANCTOEST = 0 THEN
                  V_VALRBRUT := V_VALRBRUT - C_LANCTOEST.VRLANCTOBRUT;
                  V_VALRESTO := V_VALRESTO - C_LANCTOEST.VRLANCTOEST;
               ELSE
                  V_CUSTPROD := 0;
                  IF V_QTDEESTO <> 0 THEN
                     V_CUSTPROD := V_VALRBRUT / V_QTDEESTO;
                  ELSE
                     IF V_QTDEANTE <> 0 THEN
                        V_CUSTPROD := V_VRBRUANT / V_QTDEANTE;
                     END IF;
                  END IF;

                  IF (V_VALRBRUT - (C_LANCTOEST.QTLANCTOEST*C_LANCTOEST.VRLANCTOBRUT)) >= 0 THEN
                     V_VALRBRUT := V_VALRBRUT - (C_LANCTOEST.QTLANCTOEST*C_LANCTOEST.VRLANCTOBRUT);
                  ELSE
                     V_VALRBRUT := V_VALRBRUT - (C_LANCTOEST.QTLANCTOEST*V_CUSTPROD);
                  END IF;

                  V_CUSTPROD := 0;
                  IF V_QTDEESTO <> 0 THEN
                     V_CUSTPROD := V_VALRESTO / V_QTDEESTO;
                  ELSE
                     IF V_QTDEANTE <> 0 THEN
                        V_CUSTPROD := V_VRESTANT / V_QTDEANTE;
                     END IF;
                  END IF;

                  IF (V_VALRESTO - (C_LANCTOEST.QTLANCTOEST*C_LANCTOEST.VRLANCTOEST)) >= 0 THEN
                     V_VALRESTO := V_VALRESTO - (C_LANCTOEST.QTLANCTOEST*C_LANCTOEST.VRLANCTOEST);
                  ELSE
                     V_VALRESTO := V_VALRESTO - (C_LANCTOEST.QTLANCTOEST*V_CUSTPROD);
                  END IF;
               END IF;

               V_QTDEESTO := V_QTDEESTO - C_LANCTOEST.QTLANCTOEST;

               IF (C_LANCTOEST.IDORIGEMPROD = 'E') THEN
                  V_QTDEESTOORIG := V_QTDEESTOORIG - C_LANCTOEST.QTLANCTOEST;
               END IF;

               IF V_QTDEESTO = 0 THEN
                  V_QTDEESTO := 0;
               END IF;

               IF V_QTDEESTO  = 0 THEN
                  V_VALRBRUT   := 0;
                  V_VALRESTO   := 0;
               END IF;

               IF (V_QTDEESTO < -0.0000001) THEN
                  V_MOVNEG := 'S';
               END IF;

               IF V_QTDEESTOORIG < 0 THEN
                  V_QTDEESTOORIG := 0;
               END IF;
            END IF;

            WHILE (V_DTSALDO <= (C_LANCTOEST.DTLANCMOVI + 1)) LOOP
               IF (V_CDINDICEMF IS NOT NULL) AND V_VRINDICE1 > 0 THEN
                  V_VALRBRUTM1  := V_VALRBRUT / V_VRINDICE1;
                  V_VALRESTOM1  := V_VALRESTO / V_VRINDICE1;
                  V_VRCLOGDIAM1 := V_VRCUSTOLOG / V_VRINDICE1;
                  V_VRSEGUDIAM1 := V_VRCUSTOSEG / V_VRINDICE1;
               END IF;

               IF (V_CDINDICEMF2 IS NOT NULL)AND V_VRINDICE2 > 0 THEN
                  V_VALRBRUTM2  := V_VALRBRUT / V_VRINDICE2;
                  V_VALRESTOM2  := V_VALRESTO / V_VRINDICE2;
                  V_VRCLOGDIAM2 := V_VRCUSTOLOG / V_VRINDICE2;
                  V_VRSEGUDIAM2 := V_VRCUSTOSEG / V_VRINDICE2;
               END IF;

               BEGIN
                 V_COUNTPOS:=1;
                 SELECT V_COUNTPOS, RowId
                 INTO V_COUNTPOS, wRowId_POSESTDIA
                 FROM POSESTDIA
                 WHERE (CDFILIAL     = C_PRODUTO.CDFILIAL)        AND
                       (CDALMOXARIFE = C_PRODUTO.CDALMOXARIFE)    AND
                       (CDLOCALESTOQ = C_PRODUTO.CDLOCALESTOQ)    AND
                       (NRLOTEESTQ   = C_PRODUTO.NRLOTEESTQ)      AND
                       (NRSUBLOTE    = C_PRODUTO.NRSUBLOTE)       AND
                       (CDPRODUTO    = C_PRODUTO.CDPRODUTO)       AND
                       (DTPOSIESTQ   = V_DTSALDO);
               EXCEPTION
                 WHEN NO_DATA_FOUND THEN
                      V_COUNTPOS:=0;
               END;

               IF (V_COUNTPOS = 0) THEN
                  IF V_QTDEESTO = 0 THEN
                     V_POSIZERO := 'S';
                  ELSE
                     V_POSIZERO := 'N';
                  END IF;

                  IF (V_DTSALDO > C_LANCTOEST.DTLANCMOVI) THEN
                     INSERT INTO POSESTDIA
                        (CDFILIAL,     CDALMOXARIFE,  CDLOCALESTOQ, NRLOTEESTQ,   NRSUBLOTE,   CDPRODUTO,
                         DTPOSIESTQ,   QTESTOQDIA,    VRESTOQDIA,   VRESTOQBRUT,  IDPOSIZERO,  QTESTOQANT,
                         VRESTOQANT,   VRBRUTOANT,    VRESTOQDIAM1, VRESTOQBRUM1, VRESTOQANTM1, VRBRUTOANTM1,
                         VRESTOQDIAM2, VRESTOQBRUM2,  VRESTOQANTM2, VRBRUTOANTM2,
                         VRCLOGDIAANT, VRSEGUDIAANT,  VRCLOGDIA,    VRSEGUDIA,
                         VRCLOGDIAAM1, VRCLOGDIAAM2,  VRSEGUDIAAM1, VRSEGUDIAAM2,
                         VRCLOGDIAM1,  VRCLOGDIAM2,   VRSEGUDIAM1,  VRSEGUDIAM2)
                      VALUES
                        (C_PRODUTO.CDFILIAL, C_PRODUTO.CDALMOXARIFE, C_PRODUTO.CDLOCALESTOQ, C_PRODUTO.NRLOTEESTQ,
                         C_PRODUTO.NRSUBLOTE, C_PRODUTO.CDPRODUTO, V_DTSALDO, V_QTDEESTO,  V_VALRESTO,   V_VALRBRUT ,
                         V_POSIZERO, V_QTDEANTE,   V_VRESTANT,   V_VRBRUANT, V_VALRESTOM1, V_VALRBRUTM1, V_VRESTANTM1,
                         V_VRBRUANTM1,   V_VALRESTOM2,    V_VALRBRUTM2, V_VRESTANTM2, V_VRBRUANTM2,
                         V_VRCLOGDIAANT, V_VRSEGUDIAANT,  V_VRCUSTOLOG,   V_VRCUSTOSEG,
                         V_VRCLOGDIAAM1,  V_VRCLOGDIAAM2, V_VRSEGUDIAAM1, V_VRSEGUDIAAM2,
                         V_VRCLOGDIAM1,   V_VRCLOGDIAM2,  V_VRSEGUDIAM1,  V_VRSEGUDIAM2 );
                  END IF;
               ELSE
                  IF (V_DTSALDO < (C_LANCTOEST.DTLANCMOVI + 1)) THEN
                     IF V_QTDEESTOPOS = 0 THEN
                        V_POSIZERO := 'S';
                     ELSE
                        V_POSIZERO := 'N';
                     END IF;
                     UPDATE POSESTDIA
                     SET QTESTOQDIA    = V_QTDEESTOPOS,
                         VRESTOQDIA    = V_VALRESTOPOS,
                         VRESTOQBRUT   = V_VALRBRUTPOS,
                         VRESTOQDIAM1  = V_VALRESTOPOSM1,
                         VRESTOQBRUM1  = V_VALRBRUTPOSM1,
                         VRESTOQDIAM2  = V_VALRESTOPOSM2,
                         VRESTOQBRUM2  = V_VALRBRUTPOSM2,
                         IDPOSIZERO    = V_POSIZERO,
                         QTESTOQANT    = V_QTDEANTEPOS,
                         VRESTOQANT    = V_VRESTANTPOS,
                         VRBRUTOANT    = V_VRBRUANTPOS,
                         VRESTOQANTM1  = V_VRESTANTPOSM1,
                         VRBRUTOANTM1  = V_VRBRUANTPOSM1,
                         VRESTOQANTM2  = V_VRESTANTPOSM2,
                         VRBRUTOANTM2  = V_VRBRUANTPOSM2,
                         VRCLOGDIAANT  = V_VRCLOGDIAANT,
                         VRSEGUDIAANT  = V_VRSEGUDIAANT,
                         VRCLOGDIA     = V_VRCUSTOLOGPOS,
                         VRSEGUDIA     = V_VRCUSTOSEGPOS,
                         VRCLOGDIAAM1  = V_VRCLOGDIAAM1,
                         VRCLOGDIAAM2  = V_VRCLOGDIAAM2,
                         VRSEGUDIAAM1  = V_VRSEGUDIAAM1,
                         VRSEGUDIAAM2  = V_VRSEGUDIAAM2,
                         VRCLOGDIAM1   = V_VRCLOGDIAM1,
                         VRCLOGDIAM2   = V_VRCLOGDIAM2,
                         VRSEGUDIAM1   = V_VRSEGUDIAM1,
                         VRSEGUDIAM2   = V_VRSEGUDIAM2
                     WHERE RowId = wRowId_POSESTDIA;
                  ELSE
                     IF V_QTDEESTO = 0 THEN
                        V_POSIZERO := 'S';
                     ELSE
                        V_POSIZERO := 'N';
                     END IF;
                     UPDATE POSESTDIA
                     SET QTESTOQDIA    = V_QTDEESTO,
                         VRESTOQDIA    = V_VALRESTO,
                         VRESTOQBRUT   = V_VALRBRUT,
                         VRESTOQDIAM1  = V_VALRESTOM1,
                         VRESTOQBRUM1  = V_VALRBRUTM1,
                         VRESTOQDIAM2  = V_VALRESTOM2,
                         VRESTOQBRUM2  = V_VALRBRUTM2,
                         IDPOSIZERO    = V_POSIZERO,
                         QTESTOQANT    = V_QTDEANTE,
                         VRESTOQANT    = V_VRESTANT,
                         VRBRUTOANT    = V_VRBRUANT,
                         VRESTOQANTM1  = V_VRESTANTM1,
                         VRBRUTOANTM1  = V_VRBRUANTM1,
                         VRESTOQANTM2  = V_VRESTANTM2,
                         VRBRUTOANTM2  = V_VRBRUANTM2,
                         VRCLOGDIAANT  = V_VRCLOGDIAANT,
                         VRSEGUDIAANT  = V_VRSEGUDIAANT,
                         VRCLOGDIA     = V_VRCUSTOLOG,
                         VRSEGUDIA     = V_VRCUSTOSEG,
                         VRCLOGDIAAM1  = V_VRCLOGDIAAM1,
                         VRCLOGDIAAM2  = V_VRCLOGDIAAM2,
                         VRSEGUDIAAM1  = V_VRSEGUDIAAM1,
                         VRSEGUDIAAM2  = V_VRSEGUDIAAM2,
                         VRCLOGDIAM1   = V_VRCLOGDIAM1,
                         VRCLOGDIAM2   = V_VRCLOGDIAM2,
                         VRSEGUDIAM1   = V_VRSEGUDIAM1,
                         VRSEGUDIAM2   = V_VRSEGUDIAM2
                     WHERE RowId = wRowId_POSESTDIA;
                  END IF;
               END IF;

               /* ORIGEM ESTRANGEIRA */
               IF (C_LANCTOEST.IDORIGEMPROD = 'E') THEN

                  BEGIN
                     SELECT IDUTORIGPROD
                       INTO V_IDUTORIGPROD
                       FROM PARAMGERAL
                      WHERE CDPARGERAL = '0001';
                  EXCEPTION
                     WHEN NO_DATA_FOUND THEN
                        V_IDUTORIGPROD := 'N';
                  END;

                  IF (V_IDUTORIGPROD = 'S') THEN
                     BEGIN
                       V_COUNTPOS:=1;
                       SELECT V_COUNTPOS, RowId
                       INTO V_COUNTPOS, wRowId_POSESTDIAORIG
                       FROM POSESTDIAORIG
                       WHERE (CDFILIAL     = C_PRODUTO.CDFILIAL)        AND
                             (CDALMOXARIFE = C_PRODUTO.CDALMOXARIFE)    AND
                             (CDLOCALESTOQ = C_PRODUTO.CDLOCALESTOQ)    AND
                             (NRLOTEESTQ   = C_PRODUTO.NRLOTEESTQ)      AND
                             (NRSUBLOTE    = C_PRODUTO.NRSUBLOTE)       AND
                             (CDPRODUTO    = C_PRODUTO.CDPRODUTO)       AND
                             (DTPOSIESTQ   = V_DTSALDO);
                     EXCEPTION
                       WHEN NO_DATA_FOUND THEN
                            V_COUNTPOS:=0;
                     END;

                     IF (V_COUNTPOS = 0) THEN
                        IF V_QTDEESTO = 0 THEN
                           V_POSIZERO := 'S';
                        ELSE
                           V_POSIZERO := 'N';
                        END IF;
                        IF (V_DTSALDO > C_LANCTOEST.DTLANCMOVI) THEN
                           INSERT INTO POSESTDIAORIG
                           (CDFILIAL,  CDALMOXARIFE, CDLOCALESTOQ, NRLOTEESTQ,
                            NRSUBLOTE, CDPRODUTO,    DTPOSIESTQ,   QTESTOQDIA)
                           VALUES
                           (C_PRODUTO.CDFILIAL,  C_PRODUTO.CDALMOXARIFE, C_PRODUTO.CDLOCALESTOQ, C_PRODUTO.NRLOTEESTQ,
                            C_PRODUTO.NRSUBLOTE, C_PRODUTO.CDPRODUTO,    V_DTSALDO,              V_QTDEESTOORIG);

                        END IF;
                     ELSE
                        IF (V_DTSALDO < (C_LANCTOEST.DTLANCMOVI + 1)) THEN
                           IF V_QTDEESTOPOS = 0 THEN
                              V_POSIZERO := 'S';
                           ELSE
                              V_POSIZERO := 'N';
                           END IF;
                           UPDATE POSESTDIAORIG
                           SET QTESTOQDIA    = V_QTDEESTOPOSORIG
                           WHERE RowId = wRowId_POSESTDIAORIG;
                        ELSE
                           IF V_QTDEESTO = 0 THEN
                              V_POSIZERO := 'S';
                           ELSE
                              V_POSIZERO := 'N';
                           END IF;
                           UPDATE POSESTDIAORIG
                           SET QTESTOQDIA    = V_QTDEESTOORIG
                           WHERE RowId = wRowId_POSESTDIAORIG;
                        END IF;
                     END IF;
                  END IF;
               END IF;
               /* ORIGEM ESTRANGEIRA */

               V_DTSALDO  := V_DTSALDO + 1;
            END LOOP;

            /* GUARDA OS VALORES DE ESTOQUE ANTERIORES A PROXIMA MOVIMENTACAO */
            V_QTDEESTOPOS   := V_QTDEESTO;
            V_VALRESTOPOS   := V_VALRESTO;
            V_VALRBRUTPOS   := V_VALRBRUT;
            V_VALRESTOPOSM1 := V_VALRESTOM1;
            V_VALRBRUTPOSM1 := V_VALRBRUTM1;
            V_VALRESTOPOSM2 := V_VALRESTOM2;
            V_VALRBRUTPOSM2 := V_VALRBRUTM2;
            V_QTDEANTEPOS   := V_QTDEANTE;
            V_VRESTANTPOS   := V_VRESTANT;
            V_VRBRUANTPOS   := V_VRBRUANT;
            V_VRESTANTPOSM1 := V_VRESTANTM1;
            V_VRBRUANTPOSM1 := V_VRBRUANTM1;
            V_VRESTANTPOSM2 := V_VRESTANTM2;
            V_VRBRUANTPOSM2 := V_VRBRUANTM2;
            V_VRCUSTOLOGPOS := V_VRCUSTOLOG;
            V_VRCUSTOSEGPOS := V_VRCUSTOSEG;
            V_IDORIGEMPROD  := C_LANCTOEST.IDORIGEMPROD;

            IF (C_LANCTOEST.IDORIGEMPROD = 'E') THEN
               V_QTDEESTOPOSORIG := V_QTDEESTOORIG;
            END IF;

            V_NRLANCESTQ := C_LANCTOEST.CDFILIAL||C_LANCTOEST.NRLANCESTQ;
         END LOOP;

         /* GRAVACAO DOS SALDOS DIARIOS PARA O PRODUTO ATE A DATA FINAL */

         UPDATE PRODLCESTOQ
         SET DTRECALCEST  = V_DTSALDO-1
         WHERE RowId = wRowId_PRODLCESTOQ;

         SELECT MAX(CDFILIAL)
         INTO V_IDESTONEG
         FROM POSESTDIA
         WHERE (CDFILIAL     = C_PRODUTO.CDFILIAL)     AND
               (CDALMOXARIFE = C_PRODUTO.CDALMOXARIFE) AND
               (CDLOCALESTOQ = C_PRODUTO.CDLOCALESTOQ) AND
               (NRLOTEESTQ   = C_PRODUTO.NRLOTEESTQ)   AND
               (NRSUBLOTE    = C_PRODUTO.NRSUBLOTE)    AND
               (CDPRODUTO    = C_PRODUTO.CDPRODUTO)    AND
               (DTPOSIESTQ   > P_DTINICIAL)            AND
               (QTESTOQDIA   < -0.0000001);

         UPDATE POSESTDIA
         SET VRESTOQDIA    = Decode(QTESTOQDIA, 0, 0, VRESTOQDIA),
             VRESTOQBRUT   = Decode(QTESTOQDIA, 0, 0, VRESTOQBRUT),
             VRESTOQDIAM1  = Decode(QTESTOQDIA, 0, 0, VRESTOQDIAM1),
             VRESTOQBRUM1  = Decode(QTESTOQDIA, 0, 0, VRESTOQBRUM1),
             VRESTOQDIAM2  = Decode(QTESTOQDIA, 0, 0, VRESTOQDIAM2),
             VRESTOQBRUM2  = Decode(QTESTOQDIA, 0, 0, VRESTOQBRUM2),
             VRCLOGDIAM1   = Decode(QTESTOQDIA, 0, 0, VRCLOGDIAM1),
             VRCLOGDIAM2   = Decode(QTESTOQDIA, 0, 0, VRCLOGDIAM2),
             VRSEGUDIAM1   = Decode(QTESTOQDIA, 0, 0, VRSEGUDIAM1),
             VRSEGUDIAM2   = Decode(QTESTOQDIA, 0, 0, VRSEGUDIAM2),
             --
             VRESTOQANT    = Decode(QTESTOQANT, 0, 0, VRESTOQANT),
             VRESTOQANTM1  = Decode(QTESTOQANT, 0, 0, VRESTOQANTM1),
             VRESTOQANTM2  = Decode(QTESTOQANT, 0, 0, VRESTOQANTM2),
             VRBRUTOANT    = Decode(QTESTOQANT, 0, 0, VRBRUTOANT),
             VRBRUTOANTM1  = Decode(QTESTOQANT, 0, 0, VRBRUTOANTM1),
             VRBRUTOANTM2  = Decode(QTESTOQANT, 0, 0, VRBRUTOANTM2),
             VRCLOGDIAAM1  = Decode(QTESTOQANT, 0, 0, VRCLOGDIAAM1),
             VRCLOGDIAAM2  = Decode(QTESTOQANT, 0, 0, VRCLOGDIAAM2),
             VRSEGUDIAAM1  = Decode(QTESTOQANT, 0, 0, VRSEGUDIAAM1),
             VRSEGUDIAAM2  = Decode(QTESTOQANT, 0, 0, VRSEGUDIAAM2)
         WHERE (CDFILIAL     = C_PRODUTO.CDFILIAL)          AND
               (CDALMOXARIFE = C_PRODUTO.CDALMOXARIFE)      AND
               (CDLOCALESTOQ = C_PRODUTO.CDLOCALESTOQ)      AND
               (NRLOTEESTQ   = C_PRODUTO.NRLOTEESTQ)        AND
               (NRSUBLOTE    = C_PRODUTO.NRSUBLOTE)         AND
               (CDPRODUTO    = C_PRODUTO.CDPRODUTO)         AND
               (QTESTOQDIA   = 0 OR QTESTOQANT = 0)         AND
               (DTPOSIESTQ  >= P_DTINICIAL);

         BEGIN
           SELECT NVL(QTESTOQDIA,   0),
                  NVL(VRESTOQDIA,   0),
                  NVL(VRESTOQBRUT,  0),
                  NVL(VRESTOQDIAM1, 0),
                  NVL(VRESTOQDIAM2, 0),
                  DTPOSIESTQ,
                  NVL(VRCLOGDIA,0),
                  NVL(VRCLOGDIAM1,0),
                  NVL(VRCLOGDIAM2,0),
                  NVL(VRSEGUDIA,0),
                  NVL(VRSEGUDIAM1,0),
                  NVL(VRSEGUDIAM2,0)
           INTO   V_QTDEESTO,
                  V_VALRESTO,
                  V_VALRBRUT,
                  V_VALRESTOM1,
                  V_VALRESTOM2,
                  V_DTPOSIESTQ,
                  V_VRCUSTOLOG,
                  V_VRCLOGDIAM1,
                  V_VRCLOGDIAM2,
                  V_VRCUSTOSEG,
                  V_VRSEGUDIAM1,
                  V_VRSEGUDIAM2
           FROM POSESTDIA
           WHERE (CDFILIAL     = C_PRODUTO.CDFILIAL)        AND
                 (CDALMOXARIFE = C_PRODUTO.CDALMOXARIFE)    AND
                 (CDLOCALESTOQ = C_PRODUTO.CDLOCALESTOQ)    AND
                 (NRLOTEESTQ   = C_PRODUTO.NRLOTEESTQ)      AND
                 (NRSUBLOTE    = C_PRODUTO.NRSUBLOTE)       AND
                 (CDPRODUTO    = C_PRODUTO.CDPRODUTO)       AND
                 (DTPOSIESTQ   = (SELECT MAX(DTPOSIESTQ)
                                  FROM POSESTDIA
                                  WHERE (CDFILIAL     = C_PRODUTO.CDFILIAL)      AND
                                        (CDALMOXARIFE = C_PRODUTO.CDALMOXARIFE)  AND
                                        (CDLOCALESTOQ = C_PRODUTO.CDLOCALESTOQ)  AND
                                        (NRLOTEESTQ   = C_PRODUTO.NRLOTEESTQ)    AND
                                        (NRSUBLOTE    = C_PRODUTO.NRSUBLOTE)     AND
                                        (CDPRODUTO    = C_PRODUTO.CDPRODUTO)));
         EXCEPTION
           WHEN NO_DATA_FOUND THEN
              V_QTDEESTO    := 0;
              V_VALRESTO    := 0;
              V_VALRBRUT    := 0;
              V_VALRESTOM1  := 0;
              V_VALRESTOM2  := 0;
              V_DTPOSIESTQ  := Null;
              V_VRCUSTOLOG  := 0;
              V_VRCLOGDIAM1 := 0;
              V_VRCLOGDIAM2 := 0;
              V_VRCUSTOSEG  := 0;
              V_VRSEGUDIAM1 := 0;
              V_VRSEGUDIAM2 := 0;

         END;

         IF V_IDESTONEG IS NULL THEN
            IF (V_MOVNEG <> 'S') THEN
               SELECT NVL(SUM(QTRESPRODPED),0)
               INTO V_QTRESPRODPED
               FROM RESERPRODPED
               WHERE CDFILIAL     = C_PRODUTO.CDFILIAL     AND
                     CDPRODUTO    = C_PRODUTO.CDPRODUTO    AND
                     CDALMOXARIFE = C_PRODUTO.CDALMOXARIFE AND
                     CDLOCALESTOQ = C_PRODUTO.CDLOCALESTOQ AND
                     NRLOTEESTQ   = C_PRODUTO.NRLOTEESTQ   AND
                     NRSUBLOTE    = C_PRODUTO.NRSUBLOTE;

               SELECT NVL(MAX(IDNFDEVOOL), 'N')
                 INTO V_IDNFDEVOOL
                 FROM NOTAFISCAL N, LANCTOESTOQ L
                WHERE N.CDFILIAL = L.CDFILIAL
                  AND N.NRLANCTONF = L.NRLANCTONF
                  AND L.CDFILIAL = P_FILILANCTO
                  AND L.NRLANCESTQ = P_NRLANCTO;

               IF (V_IDNFDEVOOL = 'N') THEN
                   SELECT NVL(SUM(RE.QTRESERVESTOL), 0)
                    INTO V_QTRESPRODPEDOL
                    FROM RESERVAPEDEXOL RE, RELACPRODOL R
                   WHERE R.CDPRODARVOL = C_PRODUTO.CDPRODUTO
                     AND RE.CDPRODUTO  =  R.CDPRARVORIG
                     AND RE.CDFILRESOL =  C_PRODUTO.CDFILIAL
                   AND RE.CDMARCA    =  R.CDMARCA;
               ELSE
                  SELECT NVL(SUM(RE.QTRESERVESTOL), 0)
                    INTO V_QTRESPRODPEDOL
                    FROM RESERVAPEDEXOL RE, RELACPRODOL R
                   WHERE R.CDPRARVORIG = C_PRODUTO.CDPRODUTO
                     AND RE.CDPRODUTO  =  R.CDPRARVORIG
                     AND RE.CDFILRESOL =  C_PRODUTO.CDFILIAL
                     AND RE.CDMARCA    =  R.CDMARCA;
               END IF;

               V_QTRESPRODPED := V_QTRESPRODPED + V_QTRESPRODPEDOL;

               V_QTRESPRODPED := V_QTDEESTO - V_QTRESPRODPED;

               IF (V_QTRESPRODPED >= -0.00001) THEN
                  IF (V_QTDEESTO = 0) THEN

                     SELECT MAX(CDFILIAL)
                       INTO V_IDLOTE
                       FROM POSESTDIA
                      WHERE (CDFILIAL     = C_PRODUTO.CDFILIAL)     AND
                            (NRLOTEESTQ   = C_PRODUTO.NRLOTEESTQ)   AND
                            (NRSUBLOTE    = C_PRODUTO.NRSUBLOTE)    AND
                            (CDPRODUTO    = C_PRODUTO.CDPRODUTO)    AND
                            (DTPOSIESTQ   > P_DTINICIAL)            AND
                            (QTESTOQDIA   > 0);

                     IF V_IDLOTE IS NULL THEN
                        UPDATE LOTE
                        SET IDSTATLOTE = 'E'
                        WHERE CDFILIAL   = C_PRODUTO.CDFILIAL   AND
                              CDPRODUTO  = C_PRODUTO.CDPRODUTO  AND
                              NRLOTEESTQ = C_PRODUTO.NRLOTEESTQ AND
                              NRSUBLOTE  = C_PRODUTO.NRSUBLOTE;

                     END IF;
                     DELETE MOVILOTE
                     WHERE RowId = C_Produto.RowId;

                  ELSIF (V_QTDEESTO > -0.00001) THEN
                     UPDATE LOTE
                     SET IDSTATLOTE = 'L'
                     WHERE CDFILIAL   = C_PRODUTO.CDFILIAL   AND
                           CDPRODUTO  = C_PRODUTO.CDPRODUTO  AND
                           NRLOTEESTQ = C_PRODUTO.NRLOTEESTQ AND
                           NRSUBLOTE  = C_PRODUTO.NRSUBLOTE;

                     DELETE MOVILOTE
                     WHERE RowId = C_Produto.RowId;
                  ELSE
                     IF (V_IDPERMESTNEG = 'S') THEN
                        DELETE MOVILOTE
                         WHERE RowId = C_Produto.RowId;
                     END IF;
                  END IF;
               ELSE
                  IF (V_IDPERMESTNEG = 'S') THEN
                     DELETE MOVILOTE
                      WHERE RowId = C_Produto.RowId;
                  END IF;
               END IF;
            ELSE
               IF (V_IDPERMESTNEG = 'S') THEN
                  DELETE MOVILOTE
                   WHERE RowId = C_Produto.RowId;
               END IF;
            END IF;
         ELSE
            IF (V_IDPERMESTNEG = 'S') THEN
               DELETE MOVILOTE
                WHERE RowId = C_Produto.RowId;
            END IF;
         END IF;

         IF (V_QTDEESTO <> 0) THEN

            UPDATE POSESTATU
            SET QTTOTALESTOQ = V_QTDEESTO,
                VRTOTALESTOQ = V_VALRESTO,
                VRTOTALESTM1 = V_VALRESTOM2,
                VRTOTALESTM2 = V_VALRESTOM2,
                DTULTMOVIMEN = V_DTPOSIESTQ,
                VRCLOGATU    = V_VRCUSTOLOG,
                VRCLOGATUM1  = V_VRCLOGDIAM1,
                VRCLOGATUM2  = V_VRCLOGDIAM2,
                VRSEGUATU    = V_VRCUSTOSEG,
                VRSEGUATUM1  = V_VRSEGUDIAM1,
                VRSEGUATUM2  = V_VRSEGUDIAM2
            WHERE CDFILIAL     = C_PRODUTO.CDFILIAL     AND
                  CDALMOXARIFE = C_PRODUTO.CDALMOXARIFE AND
                  CDLOCALESTOQ = C_PRODUTO.CDLOCALESTOQ AND
                  NRLOTEESTQ   = C_PRODUTO.NRLOTEESTQ   AND
                  NRSUBLOTE    = C_PRODUTO.NRSUBLOTE    AND
                  CDPRODUTO    = C_PRODUTO.CDPRODUTO;

            IF (SQL%ROWCOUNT = 0) THEN
               INSERT INTO POSESTATU
                  (CDFILIAL, CDPRODUTO, CDALMOXARIFE, CDLOCALESTOQ, NRLOTEESTQ,
                   NRSUBLOTE, QTTOTALESTOQ, VRTOTALESTOQ, DTULTMOVIMEN, VRTOTALESTM1, VRTOTALESTM2,
                   VRCLOGATU, VRCLOGATUM1,VRCLOGATUM2,VRSEGUATU,VRSEGUATUM1,VRSEGUATUM2)
               VALUES
                  (C_PRODUTO.CDFILIAL, C_PRODUTO.CDPRODUTO, C_PRODUTO.CDALMOXARIFE, C_PRODUTO.CDLOCALESTOQ, C_PRODUTO.NRLOTEESTQ,
                   C_PRODUTO.NRSUBLOTE, V_QTDEESTO, V_VALRESTO, V_DTPOSIESTQ, V_VALRESTOM1, V_VALRESTOM2,
                   V_VRCUSTOLOG, V_VRCLOGDIAM1, V_VRCLOGDIAM2, V_VRCUSTOSEG, V_VRSEGUDIAM1, V_VRSEGUDIAM2);
            END IF;
         END IF;
         IF (V_QTDEESTOORIG <> 0) THEN
            /* ORIGEM ESTRANGEIRA */
            /* IF (V_IDORIGEMPROD = 'E') THEN */
               BEGIN
                  SELECT IDUTORIGPROD
                    INTO V_IDUTORIGPROD
                    FROM PARAMGERAL
                   WHERE CDPARGERAL = '0001';
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_IDUTORIGPROD := 'N';
               END;

               IF (V_IDUTORIGPROD = 'S') THEN
                  UPDATE POSESTATUORIG
                     SET QTTOTALESTOQ = V_QTDEESTOORIG
                   WHERE CDFILIAL     = C_PRODUTO.CDFILIAL     AND
                         CDALMOXARIFE = C_PRODUTO.CDALMOXARIFE AND
                         CDLOCALESTOQ = C_PRODUTO.CDLOCALESTOQ AND
                         NRLOTEESTQ   = C_PRODUTO.NRLOTEESTQ   AND
                         NRSUBLOTE    = C_PRODUTO.NRSUBLOTE    AND
                         CDPRODUTO    = C_PRODUTO.CDPRODUTO;

                  IF (SQL%ROWCOUNT = 0) THEN
                     INSERT INTO POSESTATUORIG
                        (CDFILIAL,   CDPRODUTO, CDALMOXARIFE, CDLOCALESTOQ,
                         NRLOTEESTQ, NRSUBLOTE, QTTOTALESTOQ)
                     VALUES
                        (C_PRODUTO.CDFILIAL,     C_PRODUTO.CDPRODUTO,  C_PRODUTO.CDALMOXARIFE,
                         C_PRODUTO.CDLOCALESTOQ, C_PRODUTO.NRLOTEESTQ, C_PRODUTO.NRSUBLOTE,  V_QTDEESTOORIG);
                  END IF;
               END IF;
            /* END IF; */
            /* ORIGEM ESTRANGEIRA */
         END IF;
      END LOOP;

      IF (NVL(V_UTILALMO,w_N) = w_S) OR  (NVL(V_UTILLOTE, w_N) = w_S) THEN
         ATUALIZA_ESTOQUE_CONS(P_FILIMOVI, V_CDPRODUTO, P_DTINICIAL, P_DTFINAL);
      ELSE
         INSERT INTO LISTA
            (NRLISTA, CDLISTA)
         (SELECT V_NRLISTA, V_CDPRODUTO FROM DUAL
          MINUS
          SELECT V_NRLISTA, CDLISTA
          FROM LISTA
          WHERE NRLISTA = V_NRLISTA);
         FOR C_ITENS IN(SELECT CDLISTA CDPRODUTO
                          FROM LISTA
                         WHERE  NRLISTA = V_NRLISTA) LOOP

            IF V_DTINICIAL < P_DTINICIAL THEN
               V_DTPOSESTCONS := V_DTINICIAL;
            ELSE
               V_DTPOSESTCONS := P_DTINICIAL;
            END IF;

            DELETE FROM POSESTCONS
            WHERE CDFILIAL  = P_FILIMOVI         AND
                  CDPRODUTO = C_ITENS.CDPRODUTO  AND
                  DTPOSESTCON >= V_DTPOSESTCONS;

               INSERT INTO POSESTCONS
                  (CDFILIAL,  CDPRODUTO, DTPOSESTCON, QTESTDIACON, VRESTDIACON, VRESTDIACOM1, VRESTDIACOM2,
                   QTESTANTCON, DTCUSTANTCON, VRESTANTCON, VRESTANTCOM1, VRESTANTCOM2, VRESTBRUTCON,
                   VRESTBRUTCM1, VRESTBRUTCM2, VRBRUTANTCON, VRBRUTANTCM1, VRBRUTANTCM2, IDPOSZEROCON,
                   VRCLOGCON, VRCLOGCONANT, VRCLOGCONM1, VRCLOGCONAM1, VRCLOGCONM2, VRCLOGCONAM2,
                   VRSEGUCON, VRSEGUCONANT, VRSEGUCONM1, VRSEGUCONAM1, VRSEGUCONM2, VRSEGUCONAM2)
               (SELECT
                  P.CDFILIAL,  P.CDPRODUTO,  P.DTPOSIESTQ, SUM(QTESTOQDIA),
                 SUM(VRESTOQDIA), SUM(VRESTOQDIAM1), SUM(VRESTOQDIAM2), SUM(QTESTOQANT),
                 MAX(DTCUSTANT), SUM(VRESTOQANT), SUM(VRESTOQANTM1), SUM(VRESTOQANTM2),
                 SUM(VRESTOQBRUT), SUM(VRESTOQBRUM1), SUM(VRESTOQBRUM2),  SUM(VRBRUTOANT),
                 SUM(VRBRUTOANTM1), SUM(VRBRUTOANTM1), MAX(IDPOSIZERO), SUM(VRCLOGDIA),
                 SUM(VRCLOGDIAANT), SUM(VRCLOGDIAM1), SUM(VRCLOGDIAAM1), SUM(VRCLOGDIAM2),
                 SUM(VRCLOGDIAAM2), SUM(VRSEGUDIA), SUM(VRSEGUDIAANT), SUM(VRSEGUDIAM1),
                 SUM(VRSEGUDIAAM1), SUM(VRSEGUDIAM2), SUM(VRSEGUDIAAM2)
               FROM POSESTDIA P
               WHERE (P.CDFILIAL   = P_FILIMOVI)          AND
                     (P.CDPRODUTO  = C_ITENS.CDPRODUTO)   AND
                     (DTPOSIESTQ   >= V_DTPOSESTCONS)
               GROUP BY CDFILIAL, CDPRODUTO, DTPOSIESTQ);
         END LOOP;

         /* Limpa listas geradas */
         DELETE LISTA
         WHERE NRLISTA = V_NRLISTA;
      END IF;

      IF (V_IDPERMESTNEG = 'S') THEN
           DELETE MOVILOTE
           WHERE NRMOVILOTE = P_FILIMOVI||P_NRLANCTO;
      END IF;
   END;
END;