create or replace PROCEDURE GERA_NF_RET_ARMAZENA (P_CDFILIAL   IN VARCHAR2 DEFAULT NULL,
                                                  P_NRLANCTONF IN VARCHAR2 DEFAULT NULL)
IS
   /*VARIAVEIS ROTINA DE RETORNO*/
   /*SAIDA*/
   V_NFS_NRLANCTO    VARCHAR2(20);
   V_NFS_CDFILIAL    VARCHAR2(04);
   V_NFS_NRLANCESTQ  VARCHAR2(20);
   V_CDINSCESTAREM   VARCHAR2(16);
   V_CDFILWMSMHAARM  VARCHAR2(04);
   V_CDEMPRESAREM    VARCHAR2(10);
   V_NFS_SERIE       VARCHAR2(03);
   V_DTSAIDA         DATE;

   /*ENTRADA*/
   V_NFE_NRLANCTO    VARCHAR2(20);
   V_NFE_CDFILIAL    VARCHAR2(04);
   V_NFE_NRLANCESTQ  VARCHAR2(20);
   V_NFE_SERIE       VARCHAR2(03);
   V_NFE_CDEMPRESA   VARCHAR2(02);
   V_CDGRUPOFISC     VARCHAR2(03);
   V_INTEREST        VARCHAR2(01);
   V_NFE_VRNOTAFISC  FLOAT;

   V_VRUNITITEM      FLOAT;
   V_TIPOCUSTO       INTEGER;
   V_DTPOSEST        DATE;
   V_NRDECITOTANF    FLOAT;

   V_ERRO VARCHAR2(4000);

BEGIN
   V_ERRO := NULL;
   FOR C_NOTAS IN (SELECT N.CDFILIAL, N.NRLANCTONF, P.CDFILIAL AS CDFILIALOL,
                          P.CDFILWMSMHAARM, N.CDFILIEMIT, N.CDFILIRECE,
                          N.DTEMISSAO, N.DTENTRSAID, PG.CDTPOPRETSAID, PG.CDTPOPRETENTR
                     FROM PARAMFILIAL P, NOTAFISCAL N, GERPARAMGERAL PG, TIPOOPERREMRET T
                    WHERE P.CDFILWMSMHAARM IS NOT NULL
                      AND N.CDFILIEMIT = P.CDFILIAL
                      AND (NVL(PG.IDNFREMRETAUTO, 'N') = 'S')
                      AND N.IDENTRSAIDOP = 'S'
                      AND N.IDSTATUSNFE = 'A'
                      AND N.IDORIGDESTNF IN ('F', 'L', 'C')
                      AND N.CDTIPOOPER   = T.CDTIPOOPER
                      AND N.IDENTRSAIDOP = T.IDENTRSAIDOP
                      AND T.IDENTRREMRET  = 'T'
                      AND PG.CDTPOPRETSAID IS NOT NULL
                      AND PG.CDTPOPRETENTR IS NOT NULL                      
                      AND N.USR_IDRETORNO IS NULL
                      AND (N.CDFILIAL   = P_CDFILIAL)   --OR (P_CDFILIAL IS NULL))
                      AND (N.NRLANCTONF = P_NRLANCTONF) --OR (P_NRLANCTONF IS NULL))
                      AND NOT EXISTS (SELECT 1
                                        FROM RELACREMESSARET R
                                       WHERE R.CDFILIALUTIL   = P_CDFILIAL
                                         AND R.NRLANCTONFUTIL = P_NRLANCTONF)
                    ORDER BY N.CDFILIEMIT, N.DTEMISSAO) LOOP



      --Retorno de armazenagem

      NOVO_CODIGO_SC('LANCNF/FILIAL'||C_NOTAS.CDFILWMSMHAARM, V_NFS_NRLANCTO);
      NOVO_CODIGO_SC('LANCTOEST'    ||C_NOTAS.CDFILWMSMHAARM, V_NFS_NRLANCESTQ);

      V_NFS_NRLANCTO   := SUBSTR(V_NFS_NRLANCTO,   -10);
      V_NFS_NRLANCESTQ := SUBSTR(V_NFS_NRLANCESTQ, -10);

      SELECT CDSERIE, CDINSCESTA, CDEMPRESA
        INTO V_NFS_SERIE, V_CDINSCESTAREM, V_CDEMPRESAREM
        FROM FILIAL
       WHERE CDFILIAL = C_NOTAS.CDFILWMSMHAARM;

      V_DTSAIDA := C_NOTAS.DTENTRSAID;
      /* Gera corpo nota fiscal de saida */
      BEGIN
         GERA_NOTAFISCAL_CORPO(P_CDFILIAL    => C_NOTAS.CDFILWMSMHAARM,
                               P_CDFILIEMIT  => C_NOTAS.CDFILWMSMHAARM,
                               P_CDEMPRESA   => V_CDEMPRESAREM,
                               P_CDTIPOOPER  => C_NOTAS.CDTPOPRETSAID,
                               P_DTENTRSAID  => TO_DATE(V_DTSAIDA),
                               P_IDSISTEMA   => 'DFS',
                               P_PRXLANCTONF => V_NFS_NRLANCTO,
                               P_PRXLANCESTQ => V_NFS_NRLANCESTQ,
                               P_CDSERIE     => V_NFS_SERIE,
                               P_CDCLIENTE   => C_NOTAS.CDFILIALOL,
                               P_NRLANCTONF  => V_NFS_NRLANCTO,
                               P_NRLANCESTQ  => V_NFS_NRLANCESTQ);
      EXCEPTION
         WHEN OTHERS THEN
            V_NFS_NRLANCESTQ := NULL;
            V_ERRO       := SQLERRM(SQLCODE);
            ROLLBACK;
            RAISE;
      END;

      -- Buscar itens da NF de transferencia para unidade para geracao do Retorno

      FOR C_PRODREM IN (SELECT IP.CDPRODUTO,    IP.CDPRODEMIS, IP.DSPRODEMIS,
                               IP.VRUNITITEM,   IP.VRDESCITEM, IP.CDALMOXARIFE,
                               IP.CDLOCALESTOQ, IP.NRLOTEESTQ, IP.NRSUBLOTE,
                               IP.QTITEMPROD,   P.CDPRODESTO
                          FROM ITEMPRODUTO IP, PRODUTO P
                         WHERE IP.CDFILIAL   = C_NOTAS.CDFILIAL
                           AND IP.NRLANCTONF = C_NOTAS.NRLANCTONF
                           AND IP.CDPRODUTO  = P.CDPRODUTO) LOOP

         SELECT MAX(TO_NUMBER(CDTIPOCUSTO))
           INTO V_TIPOCUSTO
           FROM TIPOOPERAC
          WHERE CDTIPOOPER   = C_NOTAS.CDTPOPRETSAID
            AND IDENTRSAIDOP = 'S';

         IF (V_TIPOCUSTO IS NULL) THEN
            SELECT MAX(TO_NUMBER(IDTCUSNFROMA))
              INTO V_TIPOCUSTO
              FROM PARAMFILIAL
             WHERE CDFILIAL = C_NOTAS.CDFILWMSMHAARM;
         END IF;

         IF (V_TIPOCUSTO IS NULL) THEN
            V_TIPOCUSTO := 3;
         END IF;

         SELECT MAX(DTPOSIESTQ) DTPOSIESTQ
           INTO V_DTPOSEST
           FROM POSESTDIA
          WHERE (CDFILIAL     = C_NOTAS.CDFILWMSMHAARM)
            AND (CDALMOXARIFE = ' ')
            AND (CDLOCALESTOQ = ' ')
            AND (NRLOTEESTQ   = ' ')
            AND (NRSUBLOTE    = ' ')
            AND (CDPRODUTO    = C_PRODREM.CDPRODESTO)
            AND (DTPOSIESTQ  <= TO_DATE(V_DTSAIDA) + 1);

         IF (V_DTPOSEST IS NULL) THEN
            V_DTPOSEST := TO_DATE(V_DTSAIDA);
         END IF;

         BEGIN
            SELECT NVL(CUSTO_PRODUTO_LCEST(C_NOTAS.CDFILWMSMHAARM, D.CDPRODUTO, V_TIPOCUSTO,  TO_DATE(V_DTSAIDA), SYSDATE,
                     D.CDALMOXARIFE, D.CDLOCALESTOQ, D.NRLOTEESTQ, D.NRSUBLOTE),0) * P.VRFATOCONV AS VRCUSTOPROD
              INTO V_VRUNITITEM
              FROM PRODUTO P, POSESTDIA D, LOTE L
             WHERE (D.CDFILIAL     = C_NOTAS.CDFILWMSMHAARM)
               AND (D.CDALMOXARIFE = ' ')
               AND (D.CDLOCALESTOQ = ' ')
               AND (P.CDPRODUTO    = C_PRODREM.CDPRODUTO)
               AND (D.NRLOTEESTQ   = ' ')
               AND (D.NRSUBLOTE    = ' ')
               AND (DTPOSIESTQ     = V_DTPOSEST)
               AND (D.CDPRODUTO    = P.CDPRODESTO)
               AND (D.CDFILIAL     = L.CDFILIAL)
               AND (D.NRLOTEESTQ   = L.NRLOTEESTQ)
               AND (D.NRSUBLOTE    = L.NRSUBLOTE)
               AND (D.CDPRODUTO    = L.CDPRODUTO);
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_VRUNITITEM := 0;
         END;

         SELECT NVL(MAX(NRDECITOTANF), 2)
           INTO V_NRDECITOTANF
           FROM PARAMGERAL;

         IF (V_VRUNITITEM <= 0) THEN
            V_VRUNITITEM := C_PRODREM.VRUNITITEM;
         ELSE
            V_VRUNITITEM := ROUND(V_VRUNITITEM, V_NRDECITOTANF);
         END IF;

         GERA_NOTAFISCAL_PRODUTO(P_CDFILIAL     => C_NOTAS.CDFILWMSMHAARM,
                                 P_NRLANCTONF   => V_NFS_NRLANCTO,
                                 P_CDPRODUTO    => C_PRODREM.CDPRODUTO,
                                 P_CDPRODEMIS   => C_PRODREM.CDPRODEMIS,
                                 P_DSPRODEMIS   => C_PRODREM.DSPRODEMIS,
                                 P_VRUNITITEM   => V_VRUNITITEM,
                                 P_VRDESCITEM   => 0,
                                 P_QTITEMPROD   => C_PRODREM.QTITEMPROD);

      END LOOP;

      BEGIN
         GERA_NOTAFISCAL_FECHAMENTO(P_CDFILIAL   => C_NOTAS.CDFILWMSMHAARM,
                                    P_NRLANCTONF => V_NFS_NRLANCTO,
                                    P_NRLANCESTQ => V_NFS_NRLANCESTQ);
      EXCEPTION
         WHEN OTHERS THEN
            ROLLBACK;
            V_ERRO := SQLERRM(SQLCODE);
            RAISE;
      END;

      IF (V_ERRO IS NULL) THEN
         ATUALIZA_ESTOQUE(C_NOTAS.CDFILWMSMHAARM, TO_DATE(V_DTSAIDA), TO_DATE(SYSDATE), C_NOTAS.CDFILWMSMHAARM, V_NFS_NRLANCESTQ, NULL);

         /* Atualizar a Itlanctoest para nao evoluir estoque caso encontre erro ao atualizar o estoque */
         /*FOR C_PRODIRREG IN (SELECT NRMOVILOTE, CDFILIAL, CDALMOXARIFE, CDLOCALESTOQ,
                                    CDPRODUTO, NRLOTEESTQ, NRSUBLOTE
                               FROM MOVILOTE
                              WHERE NRMOVILOTE = C_NOTAS.CDFILWMSMHAARM||V_NFS_NRLANCESTQ
                                AND CDFILIAL   = C_NOTAS.CDFILWMSMHAARM) LOOP
            UPDATE ITLANCTOEST
               SET IDEVOLESTOQ  = 'N'
             WHERE CDFILIAL     = C_NOTAS.CDFILWMSMHAARM
               AND NRLANCESTQ   = V_NFS_NRLANCESTQ
               AND CDALMOXARIFE = C_PRODIRREG.CDALMOXARIFE
               AND CDLOCALESTOQ = C_PRODIRREG.CDLOCALESTOQ
               AND CDPRODUTO    = C_PRODIRREG.CDPRODUTO
               AND NRLOTEESTQ   = C_PRODIRREG.NRLOTEESTQ
               AND NRSUBLOTE    = C_PRODIRREG.NRSUBLOTE;

            V_ERRO := 'Nota Fiscal de retorno saida. Algum(ns) produto(s) tornariam o estoque irregular.';
         END LOOP;*/

         DELETE MOVILOTE
          WHERE NRMOVILOTE = C_NOTAS.CDFILWMSMHAARM||V_NFS_NRLANCESTQ;

      END IF;
      /* Gravar dados adicionais */

      IF (V_ERRO IS NULL) THEN
         FOR C_DADOSADIC IN (SELECT N.NRINSJURNF,   N.NRNOTAFISC,
                                    F.NRINSJURFILI, EF.DSENDEFILI,
                                    EF.SGESTADO,    M.NMMUNICIPIO
                               FROM NOTAFISCAL N, FILIAL F, ENDEFILI EF, MUNICIPIO M
                              WHERE N.CDFILIAL     = C_NOTAS.CDFILIAL
                                AND N.NRLANCTONF   = C_NOTAS.NRLANCTONF
                                AND N.CDFILIRECE   = F.CDFILIAL
                                AND F.CDFILIAL     = EF.CDFILIAL
                                AND EF.IDTPENDEFILI = 'P'
                                AND M.CDMUNICIPIO   = EF.CDMUNICIPIO
                                AND M.SGESTADO      = EF.SGESTADO) LOOP

            GERA_NOTAFISCAL_DADOSADIC (P_CDFILIAL    => C_NOTAS.CDFILWMSMHAARM,
                                       P_NRLANCTONF  => V_NFS_NRLANCTO,
                                       P_DTINICIO    => SYSDATE,
                                       P_DTFINAL     => SYSDATE,
                                       P_MENSAGEM    => 'NF de retorno referente a NF: '||C_DADOSADIC.NRNOTAFISC||
                                                        ' entregue para CNPJ: '||C_DADOSADIC.NRINSJURFILI||
                                                        ' endereco: '||C_DADOSADIC.DSENDEFILI|| ' - '||C_DADOSADIC.NMMUNICIPIO||
                                                        ' - '||C_DADOSADIC.SGESTADO);

            GERA_NOTAFISCAL_DADOSADIC (P_CDFILIAL    => C_NOTAS.CDFILWMSMHAARM,
                                       P_NRLANCTONF  => V_NFS_NRLANCTO,
                                       P_DTINICIO    => SYSDATE,
                                       P_DTFINAL     => SYSDATE,
                                       P_MENSAGEM    => 'NAO INCIDENCIA DO ICMS ART7, INCISO II DO RICMS/SP');



         END LOOP;

      END IF;

      /* Gravar relacionamento da nota fiscal de retorno com a nota fiscal de saida para unidade*/
      IF (V_ERRO IS NULL) THEN
         INSERT INTO RELACREMESSARET
            (CDFILIALRET, NRLANCTONFRET, CDFILIALUTIL, NRLANCTONFUTIL)
         VALUES
            (C_NOTAS.CDFILWMSMHAARM, V_NFS_NRLANCTO, C_NOTAS.CDFILIAL, C_NOTAS.NRLANCTONF);

      END IF;

      /* Gerar entrada no OL Armazenagem (C_NOTAS.CDFILIALOL - RESTAURANTE) */
      IF (V_ERRO IS NULL) THEN
         /* Gera corpo nota fiscal de Entrada */
         NOVO_CODIGO_SC('LANCNFPROD/FILIAL' || C_NOTAS.CDFILIALOL, V_NFE_NRLANCTO);
         NOVO_CODIGO_SC('LANCNF/FILIAL'||C_NOTAS.CDFILIALOL, V_NFE_NRLANCTO);
         NOVO_CODIGO_SC('LANCTOEST'    ||C_NOTAS.CDFILIALOL, V_NFE_NRLANCESTQ);

         V_NFE_NRLANCTO   := SUBSTR(V_NFE_NRLANCTO,   -10);
         V_NFE_NRLANCESTQ := SUBSTR(V_NFE_NRLANCESTQ, -10);

         SELECT CDSERIE, CDINSCESTA, CDEMPRESA
           INTO V_NFE_SERIE, V_CDINSCESTAREM, V_NFE_CDEMPRESA
           FROM FILIAL
          WHERE CDFILIAL = C_NOTAS.CDFILIALOL;
		  
		  /*Mesma serie da saida*/
		 SELECT MAX(CDSERIEENTR) AS CDSERIE
           INTO V_NFE_SERIE
           FROM SERIEENTR
          WHERE CDSERIEENTR = V_NFS_SERIE;
		  	  
		 
         IF(V_NFE_SERIE IS NULL) THEN
		    SELECT CDSERIE, CDINSCESTA, CDEMPRESA
              INTO V_NFE_SERIE, V_CDINSCESTAREM, V_NFE_CDEMPRESA
              FROM FILIAL
             WHERE CDFILIAL = C_NOTAS.CDFILIALOL;
		 ELSE
		    SELECT CDINSCESTA, CDEMPRESA
              INTO V_CDINSCESTAREM, V_NFE_CDEMPRESA
              FROM FILIAL
             WHERE CDFILIAL = C_NOTAS.CDFILIALOL;
		 END IF;

         SELECT VRNOTAFISC
           INTO V_NFE_VRNOTAFISC
           FROM NOTAFISCAL
          WHERE CDFILIAL    = C_NOTAS.CDFILWMSMHAARM
            AND NRLANCTONF  = V_NFS_NRLANCTO;

         BEGIN
            GERA_NOTAFISCAL_CORPO_ENTRADA (P_CDFILIAL    => C_NOTAS.CDFILIALOL,
                                           P_CDFILIRECE  => C_NOTAS.CDFILIALOL,
                                           P_CDEMPRESA   => V_NFE_CDEMPRESA,
                                           P_CDTIPOOPER  => C_NOTAS.CDTPOPRETENTR,
                                           P_CDSERIEENTR => V_NFE_SERIE,
                                           P_CDCLIENTE   => C_NOTAS.CDFILWMSMHAARM,
                                           P_DTENTRSAID  => TO_DATE(V_DTSAIDA),
                                           P_IDSISTEMA   => 'DFE',
                                           P_VRNOTAFISC  => V_NFE_VRNOTAFISC,
                                           P_PRXLANCTONF => V_NFE_NRLANCTO,
                                           P_PRXLANCESTQ => V_NFE_NRLANCESTQ,
                                           P_NRLANCTONF  => V_NFE_NRLANCTO,
                                           P_NRLANCESTQ  => V_NFE_NRLANCESTQ);

         EXCEPTION
            WHEN OTHERS THEN
               V_NFE_NRLANCESTQ := NULL;
               V_ERRO       := SQLERRM(SQLCODE);
               ROLLBACK;
               RAISE;
         END;

         -- Buscar itens da NF de saida para geracao da entrada do retorno no OL restaurante
         FOR C_PRODREM IN (SELECT IP.CDPRODUTO,    IP.CDPRODEMIS, IP.DSPRODEMIS,
                                  IP.VRUNITITEM,   IP.VRDESCITEM, IP.CDALMOXARIFE,
                                  IP.CDLOCALESTOQ, IP.NRLOTEESTQ, IP.NRSUBLOTE,
                                  IP.QTITEMPROD,   P.CDPRODESTO
                             FROM ITEMPRODUTO IP, PRODUTO P
                            WHERE IP.CDFILIAL   = C_NOTAS.CDFILIAL
                              AND IP.NRLANCTONF = C_NOTAS.NRLANCTONF
                              AND IP.CDPRODUTO  = P.CDPRODUTO) LOOP

            SELECT MAX(TO_NUMBER(CDTIPOCUSTO))
              INTO V_TIPOCUSTO
              FROM TIPOOPERAC
             WHERE CDTIPOOPER = C_NOTAS.CDTPOPRETSAID
               AND IDENTRSAIDOP = 'S';

            IF (V_TIPOCUSTO IS NULL) THEN
               SELECT MAX(TO_NUMBER(IDTCUSNFROMA))
                 INTO V_TIPOCUSTO
                 FROM PARAMFILIAL
                WHERE CDFILIAL = C_NOTAS.CDFILWMSMHAARM;
            END IF;

            IF (V_TIPOCUSTO IS NULL) THEN
               V_TIPOCUSTO := 3;
            END IF;

            SELECT MAX(DTPOSIESTQ) DTPOSIESTQ
              INTO V_DTPOSEST
              FROM POSESTDIA
             WHERE (CDFILIAL     = C_NOTAS.CDFILWMSMHAARM)
               AND (CDALMOXARIFE = ' ')
               AND (CDLOCALESTOQ = ' ')
               AND (NRLOTEESTQ   = ' ')
               AND (NRSUBLOTE    = ' ')
               AND (CDPRODUTO    = C_PRODREM.CDPRODESTO)
               AND (DTPOSIESTQ  <= TO_DATE(V_DTSAIDA) + 1);

            IF (V_DTPOSEST IS NULL) THEN
               V_DTPOSEST := TO_DATE(V_DTSAIDA);
            END IF;

            BEGIN
               SELECT NVL(CUSTO_PRODUTO_LCEST(C_NOTAS.CDFILWMSMHAARM, D.CDPRODUTO, V_TIPOCUSTO,  TO_DATE(V_DTSAIDA), SYSDATE,
                        D.CDALMOXARIFE, D.CDLOCALESTOQ, D.NRLOTEESTQ, D.NRSUBLOTE),0) * P.VRFATOCONV AS VRCUSTOPROD
                 INTO V_VRUNITITEM
                 FROM PRODUTO P, POSESTDIA D, LOTE L
                WHERE (D.CDFILIAL     = C_NOTAS.CDFILWMSMHAARM)
                  AND (D.CDALMOXARIFE = ' ')
                  AND (D.CDLOCALESTOQ = ' ')
                  AND (P.CDPRODUTO    = C_PRODREM.CDPRODUTO)
                  AND (D.NRLOTEESTQ   = ' ')
                  AND (D.NRSUBLOTE    = ' ')
                  AND (DTPOSIESTQ     = V_DTPOSEST)
                  AND (D.CDPRODUTO    = P.CDPRODESTO)
                  AND (D.CDFILIAL     = L.CDFILIAL)
                  AND (D.NRLOTEESTQ   = L.NRLOTEESTQ)
                  AND (D.NRSUBLOTE    = L.NRSUBLOTE)
                  AND (D.CDPRODUTO    = L.CDPRODUTO);
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_VRUNITITEM := 0;
            END;

            SELECT NVL(MAX(NRDECITOTANF), 2)
              INTO V_NRDECITOTANF
              FROM PARAMGERAL;

            IF (V_VRUNITITEM <= 0) THEN
               V_VRUNITITEM := C_PRODREM.VRUNITITEM;
            ELSE
               V_VRUNITITEM := ROUND(V_VRUNITITEM, V_NRDECITOTANF);
            END IF;

            GERA_NOTAFISCAL_PRODUTO(P_CDFILIAL     => C_NOTAS.CDFILIALOL,
                                    P_NRLANCTONF   => V_NFE_NRLANCTO,
                                    P_CDPRODUTO    => C_PRODREM.CDPRODUTO,
                                    P_CDPRODEMIS   => C_PRODREM.CDPRODEMIS,
                                    P_DSPRODEMIS   => C_PRODREM.DSPRODEMIS,
                                    P_VRUNITITEM   => V_VRUNITITEM,
                                    P_VRDESCITEM   => 0,
                                    P_QTITEMPROD   => C_PRODREM.QTITEMPROD);

         END LOOP;
         -- Gravar impostos para os itens da nota fisca de entrada
         FOR C_PRODREM IN (SELECT I.CDPRODUTO,  I.CDPRODEMIS,  I.DSPRODEMIS,
                                  I.VRUNITITEM, I.VRDESCITEM,  P.CDARVPROD,
                                  I.QTITEMPROD, I.NRSEQITPROD, I.VRTOTAITEM
                             FROM ITEMPRODUTO I, PRODUTO P
                            WHERE CDFILIAL    = C_NOTAS.CDFILIALOL
                              AND NRLANCTONF  = V_NFE_NRLANCTO
                              AND I.CDPRODUTO = P.CDPRODUTO) LOOP

            CONSULTA_GRUPOFISCAL (P_IDORIGDESTNF => 'L',
                                  P_CDORIGDESTNF => C_NOTAS.CDFILIALOL,
                                  P_CDFILIFATUR  => C_NOTAS.CDFILIALOL,
                                  P_IDENTRSAIDOP => 'E',
                                  P_CDTIPOOPER   => C_NOTAS.CDTPOPRETENTR,
                                  P_CDGRUPOFISC  => V_CDGRUPOFISC);

            IMPOSTO_ENTRADA_PRODUTO(P_EMPRESA      => V_NFE_CDEMPRESA,
                                    P_INSCESTA     => V_CDINSCESTAREM,
                                    P_TIPOOPER     => C_NOTAS.CDTPOPRETENTR,
                                    P_CDFORNECED   => '',
                                    P_FILIAL       => C_NOTAS.CDFILIALOL,
                                    P_LANCTONF     => V_NFE_NRLANCTO,
                                    P_INIVALID     => TO_DATE(V_DTSAIDA),
                                    P_ENTRSAID     => 'E',
                                    P_CDGRUPOFISC  => V_CDGRUPOFISC,
                                    P_IDINTEREST   => 'N',
                                    P_CDARVPROD    => C_PRODREM.CDARVPROD,
                                    P_CDGRPFISCSV  => '',
                                    P_IDORIGDESTNF => 'L',
                                    P_CDFILIRECE   => C_NOTAS.CDFILIALOL,
                                    P_CDFILIEMIT   => C_NOTAS.CDFILWMSMHAARM,
                                    P_CDCLIENTE    => '',
                                    P_VRPRODUTO    => C_PRODREM.VRTOTAITEM);

            FOR C_ALIQITEM IN(SELECT IM.CDIMPOSTO, IM.SGIMPOSTO, IM.IDTRATIMPO, IM.IDPREIMPENTR,
                                     I.CDFISCTEMP, NVL(AL.VRALIQUTMP, 0) AS VRALIQUOTA
                                FROM INCITEMP I, IMPOSTO IM, ALIQTEMPPROD AL
                               WHERE I.CDIMPOTEMP  = IM.CDIMPOSTO
                                 AND I.NRINCITEMP  = C_NOTAS.CDFILIALOL||V_NFE_NRLANCTO
                                 AND I.NRINCITEMP  = AL.NRALIQTEMP(+)
                                 AND I.CDIMPOTEMP  = AL.CDIMPOTEMP(+)
                                 AND IM.IDPRODNOTA <> 'C') LOOP


                  INSERT INTO TRABITPROIMPOS
                     (CDFILIMPOIT,  NRLANCIMPOIT,   NRSEQIMPOIT,   CDIMPOSTOIT,
                      VRCONTIMPOIT, VRREDBCIMPOIT,  VRBCALCIMPOIT, VRALIQIMPOIT,
                      VRPDEDIMPOIT, VRIMPOSIT,      CDFISCIMPOIT,  NRSEQITPRO,
                      IDVALORINFO,  VR1REDBCIMPOIT, IDTRIMPSTTI,   VRIMPOSVISUIT)

                  VALUES
                     (C_NOTAS.CDFILIALOL, V_NFE_NRLANCTO,  C_PRODREM.NRSEQITPROD, C_ALIQITEM.CDIMPOSTO,
                      C_PRODREM.VRTOTAITEM, 0, C_PRODREM.VRTOTAITEM, C_ALIQITEM.VRALIQUOTA,
                      0, 0, C_ALIQITEM.CDFISCTEMP, '1',
                      'N', 0, '0', 0);

            END LOOP;
            DELETE
              FROM ALIQTEMPPROD
             WHERE NRALIQTEMP = C_NOTAS.CDFILIALOL||V_NFE_NRLANCTO;

            DELETE
              FROM INCITEMP
             WHERE NRINCITEMP = C_NOTAS.CDFILIALOL||V_NFE_NRLANCTO;

         END LOOP;

         FOR C_TRABIMPOSNFTOT IN (SELECT SUM(T.VRIMPOSIT) VRTOTAIMPO, T.CDIMPOSTOIT
                                    FROM TRABITPROIMPOS T, IMPOSTO I
                                   WHERE CDFILIMPOIT  = C_NOTAS.CDFILIALOL
                                     AND NRLANCIMPOIT = V_NFE_NRLANCTO
                                     AND IDPRODNOTA <> 'C'
                                     AND T.CDIMPOSTOIT = I.CDIMPOSTO
                                   GROUP BY CDIMPOSTOIT
                                   ORDER BY CDIMPOSTOIT)LOOP

             INSERT INTO TRABIMPOSNFTOT
                        (CDFILIMPTOT, NRLANCIMPTOT, CDIMPOSTOT, VRIMPOSTOT, VRBCALIMPTOT)

                  VALUES(C_NOTAS.CDFILIALOL, V_NFE_NRLANCTO, C_TRABIMPOSNFTOT.CDIMPOSTOIT, (0 + C_TRABIMPOSNFTOT.VRTOTAIMPO), 0);
         END LOOP;

         BEGIN
            GERA_FECHAMENTO_NFENTRADA(P_CDFILIAL   => C_NOTAS.CDFILIALOL,
                                      P_NRLANCTONF => V_NFE_NRLANCTO,
                                      P_DATAPROC   => TO_DATE(V_DTSAIDA),
                                      P_NRLANCESTQ => V_NFE_NRLANCESTQ);
         EXCEPTION
            WHEN OTHERS THEN
               ROLLBACK;
               V_ERRO := SQLERRM(SQLCODE);
               RAISE;
         END;

         IF (V_ERRO IS NULL) THEN
            ATUALIZA_ESTOQUE(C_NOTAS.CDFILIALOL, TO_DATE(V_DTSAIDA), TO_DATE(SYSDATE), C_NOTAS.CDFILIALOL, V_NFE_NRLANCESTQ, NULL);

            /* Atualizar a Itlanctoest para nao evoluir estoque caso encontre erro ao atualizar o estoque */
            /*FOR C_PRODIRREG IN (SELECT NRMOVILOTE, CDFILIAL, CDALMOXARIFE, CDLOCALESTOQ,
                                       CDPRODUTO, NRLOTEESTQ, NRSUBLOTE
                                  FROM MOVILOTE
                                 WHERE NRMOVILOTE = C_NOTAS.CDFILIALOL||V_NFE_NRLANCESTQ
                                   AND CDFILIAL   = C_NOTAS.CDFILIALOL) LOOP
               UPDATE ITLANCTOEST
                  SET IDEVOLESTOQ  = 'N'
                WHERE CDFILIAL     = C_NOTAS.CDFILIALOL
                  AND NRLANCESTQ   = V_NFE_NRLANCESTQ
                  AND CDALMOXARIFE = C_PRODIRREG.CDALMOXARIFE
                  AND CDLOCALESTOQ = C_PRODIRREG.CDLOCALESTOQ
                  AND CDPRODUTO    = C_PRODIRREG.CDPRODUTO
                  AND NRLOTEESTQ   = C_PRODIRREG.NRLOTEESTQ
                  AND NRSUBLOTE    = C_PRODIRREG.NRSUBLOTE;

               V_ERRO := 'Nota Fiscal de retorno entrada. Algum(ns) produto(s) tornariam o estoque irregular.';
            END LOOP;*/

            DELETE MOVILOTE
             WHERE NRMOVILOTE = C_NOTAS.CDFILIALOL||V_NFE_NRLANCESTQ;

         END IF;
         /* Gravar documento de saida que deu origem a entrada*/
         UPDATE NOTAFISCAL
            SET IDDOCREPLIC = C_NOTAS.CDFILWMSMHAARM||V_NFS_NRLANCTO
          WHERE CDFILIAL    = C_NOTAS.CDFILIALOL
            AND NRLANCTONF  = V_NFE_NRLANCTO;

         UPDATE NOTAFISCAL
            SET USR_IDRETORNO = 'S'
          WHERE CDFILIAL  = C_NOTAS.CDFILIAL
            AND NRLANCTONF = C_NOTAS.NRLANCTONF;

      END IF;
      IF V_ERRO IS NULL THEN
         COMMIT;
      ELSE
         ROLLBACK;
      END IF;
   END LOOP;
END;
/