create or replace PROCEDURE USR_PROT_IMPORTA_NFENTRADA(
   P_MENSAGEMERRO OUT VARCHAR2)
IS
   --GERAL
   V_CDCENTCUST     USR_CISORDEM_COMPRA.CDCENTCUST%TYPE;
   V_NRAUTOFORNE    USR_CISORDEM_COMPRA.NRAUTOFORNE%TYPE;
   V_CDFORNECED     USR_CISORDEM_COMPRA.CDFORNECED%TYPE;    --codigo do protheus
   V_NRNOTAFISCAL   USR_CISORDEM_COMPRA.NRNOTAFISCAL%TYPE;
   V_DTENTRADA      USR_CISORDEM_COMPRA.DTENTRADA%TYPE;
   V_DTEMISSAO      USR_CISORDEM_COMPRA.DTEMISSAO%TYPE;
   V_CDSERIE        USR_CISORDEM_COMPRA.CDSERIE%TYPE;

   --PRODUTO
   V_CDPRODUTO      USR_CISORDEM_COMPRA.CDPRODUTO%TYPE;
   V_CDARVPROD      USR_CISORDEM_COMPRA.CDPRODUTO%TYPE;
   V_VRQUANTIDADE   USR_CISORDEM_COMPRA.VRQUANTIDADE%TYPE;
   V_VRQUANTAT      USR_CISORDEM_COMPRA.VRQUANTAT%TYPE;
   V_VRUNITARIO     USR_CISORDEM_COMPRA.VRUNITARIO%TYPE;
   V_CDPRODESTO     PRODUTO.CDPRODESTO%TYPE;
   V_VRFATOCONV     PRODUTO.VRFATOCONV%TYPE;

   --AF
   V_CDMARCA        ITEMAUTF.CDMARCA%TYPE;
   V_DTPROGENTAF    ITEMAUTF.DTPROGENTAF%TYPE;
   V_VRPREUNIAF     ITEMAUTF.VRPREUNIAF%TYPE;
   V_QTPROGENTAF    ITEMAUTF.QTPROGENTAF%TYPE;


   --ESPECIFICO TABELA INT
   V_IDINTERFACE     VARCHAR2(1);
   V_IDINTERFACEORIG VARCHAR2(1);
   V_LOG_ERRO        VARCHAR2(250);
   V_DTGRAVACAO      DATE;
   V_HRGRAVACAO      VARCHAR2(5);
   V_DTIMPORTACAO    DATE;
   V_HRIMPORTACAO    VARCHAR2(5);
   V_ERRO 			   VARCHAR2(5000);
   V_OBS			      VARCHAR2(5000);

   --VARIAVEIS LOCAIS MUTAVEIS
   --NOTAFISCAL/CABECALHO
   V_CDEMPRESA       FILIAL.CDEMPRESA%TYPE;
   V_CDINSCESTA      FILIAL.CDINSCESTA%TYPE;
   V_CDINSCMUNI      FILIAL.CDINSCMUNI%TYPE;
   V_IDTPIJURNF      NOTAFISCAL.IDTPIJURNF%TYPE;
   V_NRINSJURNF      NOTAFISCAL.NRINSJURNF%TYPE;
   V_NRAUTOFORN      AUTOFORNE.NRAUTOFORN%TYPE;

   -- LANCTOEST/PRODUTOS
   V_NRSEQUITEM     VARCHAR2(4);
   V_PRODEMIS       ITEMPRODUTO.CDPRODEMIS%TYPE;
   V_DSPRODEMIS     ITEMPRODUTO.DSPRODEMIS%TYPE;
   V_VRTOTLANCTO    FLOAT(126);
   V_VRTOTALITEM    FLOAT(126);
   V_NRLANCTONF     NOVOCODIGO.NRSEQUENCIAL%TYPE;
   V_NRLANCESTQ     NOVOCODIGO.NRSEQUENCIAL%TYPE;
   V_OLDNRLANCESTQ  LANCTOESTOQ.NRLANCESTQ%TYPE;
   V_OLDNRLANCTONF  NOTAFISCAL.NRLANCTONF%TYPE;
   P_IDERROAF       VARCHAR2(1);
   V_COUNT          NUMBER;
   V_JACADASTRADO   NUMBER;
   V_EXISTESERIE    NUMBER;

   --OUTRAS
   V_FORNECEDOR      FORNECEDOR.CDFORNECED%TYPE;
   V_CDFILIAL        FILIAL.CDFILIAL%TYPE;
   V_CDFILILOGADA    FILIAL.CDFILIAL%TYPE;
   V_EXISTECABECALHONF  NUMBER;
   V_EXISTECABECALHOEST NUMBER;

   CURSOR C_NOTAS IS
      SELECT DISTINCT USR.CDCENTCUST, USR.NRAUTOFORNE, USR.CDFORNECED, USR.NRNOTAFISCAL, USR.DTENTRADA, USR.DTEMISSAO, USR.CDSERIE, USR.IDINTERFACE,
             LOG_ERRO, DTIMPORTACAO, HRIMPORTACAO, USR.NRLANCESTQ, AF.CDFILLANC AS CDFILILOGADA
        FROM USR_CISORDEM_COMPRA USR, AUTOFORNE AF
       WHERE DTIMPORTACAO IS NULL
         AND AF.NRAUTOFORN = LPAD(USR.NRAUTOFORNE, 10, '0');

   CURSOR C_PRODUTONF(C_CDCENTCUST IN VARCHAR2, C_NRNOTAFISCAL IN VARCHAR2, C_CDFORNECED IN VARCHAR2, C_IDINTERFACE IN VARCHAR2) IS
      SELECT USR.CDPRODUTO, VRQUANTIDADE, VRQUANTAT, VRUNITARIO,
             CDMARCA, DTPROGENTAF, VRPREUNIAF, CDPRODESTO, NVL(VRFATOCONV, 1) FATORCONV
        FROM USR_CISORDEM_COMPRA USR, ITEMAUTF IT, PRODUTO P
       WHERE USR.DTIMPORTACAO IS NULL
         AND USR.CDCENTCUST    = C_CDCENTCUST
         AND USR.NRNOTAFISCAL  = C_NRNOTAFISCAL
         AND USR.CDFORNECED    = C_CDFORNECED
         AND USR.IDINTERFACE   = C_IDINTERFACE
         AND IT.NRAUTOFORN     = LPAD(USR.NRAUTOFORNE, 10, '0')
         AND IT.CDPRODUTO      = USR.CDPRODUTO
         AND USR.CDPRODUTO     = P.CDPRODUTO;
BEGIN
   V_ERRO := NULL;
   V_OBS  := NULL;
   P_MENSAGEMERRO := NULL;

   OPEN C_NOTAS;
   LOOP
      FETCH C_NOTAS INTO V_CDCENTCUST,
                         V_NRAUTOFORNE,
                         V_CDFORNECED, -- codigo do protheus
                         V_NRNOTAFISCAL,
                         V_DTENTRADA,
                         V_DTEMISSAO,
                         V_CDSERIE,
                         V_IDINTERFACE,
                         V_LOG_ERRO,
                         V_DTIMPORTACAO,
                         V_HRIMPORTACAO,
                         V_OLDNRLANCESTQ,
                         V_CDFILILOGADA;
      EXIT WHEN C_NOTAS%NOTFOUND;

      V_NRAUTOFORN := LPAD(V_NRAUTOFORNE, 10, '0');

      BEGIN
         SELECT CDFILIAL
           INTO V_CDFILIAL
           FROM PARAMFILIAL
          WHERE CDEXFILIAL = V_CDCENTCUST;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_ERRO := 'NF='||V_NRNOTAFISCAL||' AF='||V_NRAUTOFORNE||' CENTRO DE CUSTO '||V_CDCENTCUST||' NAO CADASTRADO';
            V_CDFILIAL := NULL;
            P_MENSAGEMERRO := V_ERRO;
            GOTO PROCEDUREEND;
      END;

      V_COUNT := 0;
      V_VRTOTLANCTO := 0;

      NOVO_CODIGO_SC('LANCNF/FILIAL'||V_CDFILILOGADA, V_NRLANCTONF);
      V_NRLANCTONF := SUBSTR(V_NRLANCTONF, 11, 10);
      NOVO_CODIGO_SC('LANCTOEST'||V_CDFILILOGADA, V_NRLANCESTQ);
      V_NRLANCESTQ := SUBSTR(V_NRLANCESTQ, 11, 10);

      SELECT COUNT(CDPRODUTO)
        INTO V_JACADASTRADO
        FROM USR_CISORDEM_COMPRA
       WHERE CDCENTCUST   = V_CDCENTCUST
         AND NRNOTAFISCAL = V_NRNOTAFISCAL
         AND CDFORNECED   = V_CDFORNECED
         AND NRLANCESTQ IS NOT NULL AND IDINTERFACE <> '3';

      SELECT CDEMPRESA, CDINSCESTA, CDINSCMUNI
        INTO V_CDEMPRESA, V_CDINSCESTA, V_CDINSCMUNI
        FROM FILIAL
       WHERE CDFILIAL = V_CDFILIAL;

      SELECT CDFORNECED
        INTO V_FORNECEDOR
        FROM FORNECEDOR
       WHERE CDEXFORNECED = V_CDFORNECED;

      SELECT IDTPIJURFORN, NRINSJURFORN
        INTO V_IDTPIJURNF, V_NRINSJURNF
        FROM FORNECEDOR
       WHERE CDFORNECED = V_FORNECEDOR;

      SELECT SUM(VRQUANTIDADE * VRUNITARIO)
        INTO V_VRTOTLANCTO
        FROM USR_CISORDEM_COMPRA
       WHERE CDCENTCUST   = V_CDCENTCUST
         AND NRNOTAFISCAL = V_NRNOTAFISCAL
         AND CDFORNECED   = V_CDFORNECED
       GROUP BY NRNOTAFISCAL;

      V_IDINTERFACEORIG := V_IDINTERFACE;

      IF (V_JACADASTRADO = 0) AND (V_IDINTERFACE <> 3) THEN
          V_IDINTERFACE := 1;
      END IF;

      IF (V_JACADASTRADO > 0 AND V_IDINTERFACE <> 3) THEN
          V_IDINTERFACE := 2;
      END IF;

      IF(V_JACADASTRADO > 0 AND V_OLDNRLANCESTQ IS NULL AND V_IDINTERFACE <> 3) THEN
         V_IDINTERFACE := 1;

         SELECT MAX(NRLANCESTQ)
           INTO V_NRLANCESTQ
           FROM USR_CISORDEM_COMPRA
          WHERE CDCENTCUST   = V_CDCENTCUST
            AND NRNOTAFISCAL = V_NRNOTAFISCAL
            AND CDFORNECED   = V_CDFORNECED
            AND NRLANCESTQ IS NOT NULL;

         SELECT MAX(NRLANCTONF)
           INTO V_NRLANCTONF
           FROM LANCTOESTOQ
          WHERE NRLANCESTQ = V_NRLANCESTQ;

         IF (V_NRLANCTONF IS NULL) THEN
            NOVO_CODIGO_SC('LANCNF/FILIAL'||V_CDFILILOGADA, V_NRLANCTONF);
            V_NRLANCTONF := SUBSTR(V_NRLANCTONF, 11, 10);
         END IF;
         
         SELECT COUNT(*)
           INTO V_COUNT
           FROM ITEMPRODUTO
          WHERE CDFILIAL   = V_CDFILILOGADA
            AND NRLANCTONF = V_NRLANCTONF; 
      END IF;

      BEGIN
         SELECT COUNT(*)
           INTO V_EXISTECABECALHONF
           FROM NOTAFISCAL
          WHERE NRNOTAFISC  = LPAD(V_NRNOTAFISCAL, 9, '0')
            AND CDSERIEENTR = V_CDSERIE
            AND CDFORNECED  = V_FORNECEDOR;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_EXISTECABECALHONF := 0;
      END;
      
      BEGIN
         SELECT COUNT(*)
           INTO V_EXISTECABECALHOEST
           FROM LANCTOESTOQ
          WHERE CDFILIAL   = V_CDFILILOGADA
            AND NRLANCESTQ = V_OLDNRLANCESTQ;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_EXISTECABECALHOEST := 0;
      END;
      
      BEGIN
         IF(V_EXISTECABECALHONF = 0 AND V_IDINTERFACE <> 3) THEN
            V_IDINTERFACE := 1;
            --** CONFERENCIA E CADASTRO AUTOMATICO DA SERIE DE ENTRADA **--
            SELECT COUNT(CDSERIEENTR)
              INTO V_EXISTESERIE
              FROM SERIEENTR
             WHERE CDSERIEENTR = V_CDSERIE;

            IF(V_EXISTESERIE = 0) THEN
               INSERT INTO SERIEENTR
                  (CDSERIEENTR, DSSERIEENTR)
               VALUES
                  (V_CDSERIE, 'SERIE '||V_CDSERIE);
            END IF;

            INSERT INTO NOTAFISCAL
               (CDFILIAL, NRLANCTONF, CDFILIRECE, CDEMPRESA, CDINSCESTA, CDSERIE, CDINSCMUNI,
                IDTPIJURNF, NRINSJURNF, CDFORNECED, IDBLOQUEADO, IDDOCFISCAL, IDDOCFINANC,
                NRNOTAFISC, DTEMISSAO, DTENTRSAID, VRPRODUTOS, VRNOTAFISC, IDENTRSAIDOP,
                CDTIPOOPER, CDSERIEENTR, CDCLIENTE, CDFILIEMIT, IDORIGDESTNF, IDSTATUS)
            VALUES
               (V_CDFILILOGADA, V_NRLANCTONF, V_CDFILIAL, V_CDEMPRESA, V_CDINSCESTA, NULL, V_CDINSCMUNI,
                V_IDTPIJURNF, V_NRINSJURNF, V_FORNECEDOR, 'N', 'N', 'S',
                LPAD(V_NRNOTAFISCAL, 9, '0'), V_DTEMISSAO, V_DTENTRADA, V_VRTOTLANCTO, V_VRTOTLANCTO, 'E',
                '10', V_CDSERIE, NULL, NULL, 'F', 'A');

            INSERT INTO LANCTOESTOQ
               (CDFILIAL, NRLANCESTQ, IDTPLANCTO, DTLANCESTQ, DSLANCESTQ, IDALTCUSMED,
                NRLANCTONF, CDFILIMOVI, CDOPERADOR)
            VALUES
               (V_CDFILILOGADA, V_NRLANCESTQ, '2', V_DTENTRADA, 'INTEGRACAO NF: '||LPAD(V_NRNOTAFISCAL, 9, '0')||' AF: '||V_NRAUTOFORN, 'S',
                V_NRLANCTONF, V_CDFILILOGADA, '000000009999'); -- CRIAR OPERADOR PARA INTEGRACAO?
         ELSE
            IF (V_IDINTERFACE = 2) THEN
               UPDATE NOTAFISCAL
                  SET DTEMISSAO  = V_DTEMISSAO,
                      DTENTRSAID = V_DTENTRADA,
                      VRPRODUTOS = V_VRTOTLANCTO,
                      VRNOTAFISC = V_VRTOTLANCTO
                WHERE CDFILIAL   = V_CDFILILOGADA
                  AND NRLANCTONF = V_OLDNRLANCTONF;

               UPDATE LANCTOESTOQ
                  SET DTLANCESTQ = V_DTENTRADA
                WHERE CDFILIAL   = V_CDFILILOGADA
                  AND NRLANCESTQ = V_OLDNRLANCESTQ;
            END IF;
         END IF;
      EXCEPTION
         WHEN OTHERS THEN
            V_ERRO := SQLERRM(SQLCODE);
            P_MENSAGEMERRO := V_ERRO;
      END;

      OPEN C_PRODUTONF(V_CDCENTCUST, V_NRNOTAFISCAL, V_CDFORNECED, V_IDINTERFACEORIG);
      LOOP
         FETCH C_PRODUTONF INTO V_CDPRODUTO,
                                V_VRQUANTIDADE,
                                V_VRQUANTAT,
                                V_VRUNITARIO,
                                V_CDMARCA,
                                V_DTPROGENTAF,
                                V_VRPREUNIAF,
                                V_CDPRODESTO,
                                V_VRFATOCONV;
         EXIT WHEN C_PRODUTONF%NOTFOUND;

         SELECT NMPRODUTO, CDARVPROD
           INTO V_DSPRODEMIS, V_CDARVPROD
           FROM PRODUTO
          WHERE CDPRODUTO = V_CDPRODUTO;

         V_VRTOTALITEM := V_VRQUANTIDADE * V_VRUNITARIO;

         IF (V_IDINTERFACE = 1) THEN
            V_COUNT := V_COUNT +1;
            V_NRSEQUITEM := LPAD(TO_CHAR(V_COUNT), 4, '0');

            BEGIN
               INSERT INTO ITEMPRODUTO
                  (CDFILIAL, NRLANCTONF, NRSEQITPROD, CDPRODUTO,
                   CDPRODEMIS, DSPRODEMIS, IDATUVRESTOQ, QTITEMPROD,
                   VRUNITITEM, VRDESCITEM, VRTOTAITEM, VRCONTITEM,
                   VRBRUTITEM, IDCONFORITEM, CDFILIMOVI,
                   CDALMOXARIFE, CDLOCALESTOQ, NRLOTEESTQ, NRSUBLOTE,
                   CDPRODMOVI, NRAUTOFORN, CDMARCA, DTPROGENTAF)
               VALUES
                  (V_CDFILILOGADA, V_NRLANCTONF, V_NRSEQUITEM, V_CDPRODUTO,
                   V_CDPRODUTO, V_DSPRODEMIS, 'S', V_VRQUANTIDADE,
                   V_VRUNITARIO, 0, V_VRTOTALITEM, V_VRTOTALITEM,
                   V_VRTOTALITEM, 'S', V_CDFILIAL,
                   ' ', ' ', ' ', ' ',
                   V_CDPRODESTO,  V_NRAUTOFORN, V_CDMARCA, V_DTPROGENTAF);

               INSERT INTO ITLANCTOEST
                  (CDFILIAL, NRLANCESTQ, NRSEQUITEM, IDTIPOMOVI, CDPRODUTO, QTTOTLANCTO, VRUNILANCTO,
                   VRTOTLANCTO, DTLANCMOVI, IDORDEMCLC, CDPRODMOVI, QTLANCTOEST, VRLANCTOBRUT, VRLANCTOEST,
                   CDFILIMOVI, CDALMOXARIFE, CDLOCALESTOQ, NRLOTEESTQ, NRSUBLOTE)
               VALUES
                  (V_CDFILILOGADA, V_NRLANCESTQ, V_NRSEQUITEM, '2', V_CDPRODUTO, V_VRQUANTIDADE, V_VRUNITARIO,
                   V_VRTOTALITEM, V_DTENTRADA, '2', V_CDPRODESTO, (V_VRQUANTIDADE * V_VRFATOCONV), (V_VRUNITARIO / V_VRFATOCONV), (V_VRUNITARIO / V_VRFATOCONV),
                   V_CDFILILOGADA, ' ', ' ', ' ', ' ');

               INSERT INTO LOTE
                  (CDFILIAL, NRLOTEESTQ, NRSUBLOTE, CDPRODUTO, IDSTATLOTE, DTENTRLOTE)
                   (SELECT V_CDFILIAL CDFILIAL, ' '  NRLOTEESTQ, ' ' NRSUBLOTE, V_CDPRODESTO CDPRODUTO,
                           'L' IDSTATLOTE, SYSDATE DTENTRLOTE
                      FROM DUAL
                     MINUS
                    SELECT CDFILIAL, NRLOTEESTQ, NRSUBLOTE, V_CDPRODESTO CDPRODUTO, 'L', SYSDATE
                      FROM LOTE
                     WHERE V_CDFILIAL   =  CDFILIAL
                       AND ' '  =  NRLOTEESTQ
                       AND ' '  =  NRSUBLOTE
                       AND V_CDPRODESTO  =  CDPRODUTO);

               IF V_NRAUTOFORN IS NOT NULL THEN
                  INSERT INTO NFRELACAF
                     (CDFILIAL, NRLANCTONF, CDFILDEST, CDFILLANC, NRAUTOFORN, CDMARCA,
                      CDPRODUTO, DTPROGENTAF, QTNFRELACAF, VRNFRELACAF)
                  SELECT V_CDFILILOGADA, V_NRLANCTONF, V_CDFILIAL, V_CDFILILOGADA, V_NRAUTOFORN, V_CDMARCA,
                         V_CDPRODUTO, DTPROGENTAF, V_VRQUANTIDADE, V_VRUNITARIO
                    FROM ITEMAUTF
                   WHERE CDFILDEST = V_CDFILIAL
                     AND CDFILLANC = V_CDFILILOGADA
                     AND NRAUTOFORN = V_NRAUTOFORN
                     AND CDMARCA = V_CDMARCA
                     AND CDPRODUTO = V_CDPRODUTO
                     AND DTPROGENTAF = V_DTPROGENTAF;
               END IF;

               UPDATE USR_CISORDEM_COMPRA
                  SET NRLANCESTQ =  NVL(V_NRLANCESTQ, V_OLDNRLANCESTQ)
                WHERE CDCENTCUST   = V_CDCENTCUST
                  AND NRNOTAFISCAL = V_NRNOTAFISCAL
                  AND CDFORNECED   = V_CDFORNECED
                  AND NRAUTOFORNE  = V_NRAUTOFORNE
                  AND CDPRODUTO    = V_CDPRODUTO;
            EXCEPTION
               WHEN OTHERS THEN
                   V_ERRO := SQLERRM(SQLCODE);
                   P_MENSAGEMERRO := V_ERRO;
            END;

            IF(V_ERRO IS NULL) THEN
               BEGIN
                  NF_BAIXA_AF(V_CDFILILOGADA,	V_NRLANCTONF, V_NRSEQUITEM, 'I', V_CDARVPROD , V_CDARVPROD,
                              V_CDPRODUTO, V_CDPRODUTO, 'T', 'T', V_VRQUANTIDADE, V_VRQUANTIDADE,	P_IDERROAF);
               EXCEPTION
                  WHEN OTHERS THEN
                     V_ERRO := SQLERRM(SQLCODE);
                     P_MENSAGEMERRO := V_ERRO;
               END;
            END IF;
         END IF; -- end idinterface = 1

         IF(V_IDINTERFACE = 2) THEN
            BEGIN
               SELECT NRLANCTONF
                 INTO V_OLDNRLANCTONF
                 FROM LANCTOESTOQ
                WHERE CDFILIAL   = V_CDFILILOGADA
                  AND NRLANCESTQ = V_OLDNRLANCESTQ;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_OLDNRLANCTONF := NULL;
            END;

            BEGIN
               UPDATE ITEMPRODUTO
                  SET DSPRODEMIS = V_DSPRODEMIS,
                      QTITEMPROD = V_VRQUANTIDADE,
                      VRUNITITEM = V_VRUNITARIO,
                      VRTOTAITEM = V_VRTOTALITEM,
                      VRCONTITEM = V_VRTOTALITEM,
                      VRBRUTITEM = V_VRTOTALITEM
                WHERE CDFILIAL   = V_CDFILILOGADA
                  AND NRLANCTONF = V_OLDNRLANCTONF
                  AND CDPRODUTO  = V_CDPRODUTO
                  AND CDMARCA    = V_CDMARCA;

               UPDATE ITLANCTOEST
                  SET QTTOTLANCTO  = V_VRQUANTIDADE,
                      VRUNILANCTO  = V_VRUNITARIO,
                      VRTOTLANCTO  = V_VRTOTALITEM,
                      DTLANCMOVI   = V_DTENTRADA,
                      QTLANCTOEST  = (V_VRQUANTIDADE * V_VRFATOCONV),
                      VRLANCTOBRUT = V_VRUNITARIO,
                      VRLANCTOEST  = V_VRUNITARIO
                WHERE CDFILIAL   = V_CDFILILOGADA
                  AND NRLANCESTQ = V_OLDNRLANCESTQ
                  AND CDPRODUTO  = V_CDPRODUTO;

            EXCEPTION
               WHEN OTHERS THEN
                  V_ERRO := SQLERRM(SQLCODE);
                  P_MENSAGEMERRO := V_ERRO;
            END;

            IF(V_ERRO IS NULL) THEN
               BEGIN
                  NF_BAIXA_AF(V_CDFILILOGADA,	V_OLDNRLANCTONF, V_NRSEQUITEM, 'A', V_CDARVPROD , V_CDARVPROD,
                              V_CDPRODUTO, V_CDPRODUTO, 'T', 'T', V_VRQUANTIDADE, V_VRQUANTIDADE,	P_IDERROAF);
               EXCEPTION
                   WHEN OTHERS THEN
                      V_ERRO := SQLERRM(SQLCODE);
                      P_MENSAGEMERRO := V_ERRO;
               END;
            END IF;
         END IF; -- END V_IDINTERFACE = 2

         IF(V_IDINTERFACE = 3) THEN
            BEGIN
               SELECT NRLANCTONF
                 INTO V_OLDNRLANCTONF
                 FROM LANCTOESTOQ
                WHERE CDFILIAL   = V_CDFILILOGADA
                  AND NRLANCESTQ = V_OLDNRLANCESTQ;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_OLDNRLANCTONF := NULL;
            END;

            P_IDERROAF := 'N';
            IF (V_OLDNRLANCTONF IS NOT NULL) THEN
               BEGIN
                  --ja está pronto exclusão é somente isso
                  NF_BAIXA_AF(V_CDFILILOGADA, V_OLDNRLANCTONF, null, 'E', V_CDARVPROD , V_CDARVPROD,
                              V_CDPRODUTO, V_CDPRODUTO, 'T', 'T', V_VRQUANTIDADE, V_VRQUANTIDADE,	P_IDERROAF);
               EXCEPTION
                  WHEN OTHERS THEN
                     V_ERRO := SQLERRM(SQLCODE);
                     P_MENSAGEMERRO := V_ERRO;
               END;
            END IF;
         END IF; -- END V_IDINTERFACE = 3
      END LOOP;
      CLOSE C_PRODUTONF;

      IF(V_IDINTERFACE = 3) THEN
         IF (V_OLDNRLANCTONF IS NOT NULL) THEN
            BEGIN
               --DELETAR CABECALHOS
               DELETA_NF(V_CDFILILOGADA, V_OLDNRLANCTONF, 'I');
               
               ATUALIZA_ESTOQUE(V_CDFILIAL, V_DTEMISSAO, SYSDATE, V_CDFILILOGADA, V_OLDNRLANCESTQ, NULL);
               DELETA_NF(V_CDFILILOGADA, V_OLDNRLANCTONF, 'C');

			   -- excluir entrada na matriz --
               DELETE FROM LANCTOESTOQ
                WHERE CDFILIAL   = V_CDFILILOGADA
                  AND NRLANCESTQ = V_OLDNRLANCESTQ;

               ATUALIZA_ESTOQUE(V_CDFILILOGADA, V_DTEMISSAO, SYSDATE, V_CDFILILOGADA, V_OLDNRLANCESTQ, NULL);

               /* Atualiza a Itlanctoest para não 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 = V_CDFILILOGADA||V_OLDNRLANCESTQ
                                      AND CDFILIAL   = V_CDFILILOGADA)
               LOOP
                  UPDATE ITLANCTOEST
                     SET IDEVOLESTOQ  = 'N'
                   WHERE CDFILIAL     = V_CDFILILOGADA
                     AND NRLANCESTQ   = V_OLDNRLANCESTQ
                     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: '||V_NRNOTAFISCAL||'. Algum(ns) produto(s) tornariam o estoque irregular.';
                  P_MENSAGEMERRO := V_ERRO;
               END LOOP;

               DELETE MOVILOTE
                WHERE NRMOVILOTE = V_CDFILILOGADA||V_OLDNRLANCESTQ;
            EXCEPTION
               WHEN OTHERS THEN
                  V_ERRO := SQLERRM(SQLCODE);
                  P_MENSAGEMERRO := V_ERRO;
            END;
         END IF;
      END IF;

      BEGIN
         CUSTO_LIQUIDO(V_CDFILILOGADA, V_NRLANCESTQ, 0, 0, 'S'); -- nao pode ficar no loop de produto
         ATUALIZA_ESTOQUE(V_CDFILILOGADA, V_DTENTRADA, SYSDATE, V_CDFILILOGADA, V_NRLANCESTQ, NULL); -- nao pode ficar no loop de produto
         ATUALIZA_ESTOQUE(V_CDFILIAL, V_DTENTRADA, SYSDATE, V_CDFILILOGADA, V_NRLANCESTQ, NULL); -- nao pode ficar no loop de produto
      EXCEPTION
         WHEN OTHERS THEN
            V_ERRO := SQLERRM(SQLCODE);
            P_MENSAGEMERRO := V_ERRO;
      END;

      IF(V_IDINTERFACE = 3) THEN
         DELETE USR_CISORDEM_COMPRA
          WHERE CDCENTCUST   = V_CDCENTCUST
            AND NRNOTAFISCAL = V_NRNOTAFISCAL
            AND CDFORNECED   = V_CDFORNECED;
      ELSE
         UPDATE USR_CISORDEM_COMPRA
            SET DTIMPORTACAO = SYSDATE,
                HRIMPORTACAO = TO_CHAR(SYSDATE, 'HH:MM'),
                LOG_ERRO     = V_ERRO||' ERRO AF: '||P_IDERROAF
          WHERE CDCENTCUST   = V_CDCENTCUST
            AND NRNOTAFISCAL = V_NRNOTAFISCAL
            AND CDFORNECED   = V_CDFORNECED;
      END IF;

      <<PROCEDUREEND>>

      IF(P_IDERROAF = 'N' AND V_ERRO IS NULL) THEN
         COMMIT;
      ELSE
         V_ERRO := V_ERRO||P_IDERROAF;
         P_MENSAGEMERRO := V_ERRO;
         ROLLBACK;
      END IF;

      V_ERRO := NULL;
   END LOOP;
   CLOSE C_NOTAS;
EXCEPTION
   WHEN OTHERS THEN
      V_ERRO := SQLERRM(SQLCODE);
      P_MENSAGEMERRO := V_ERRO;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('USR_PROT_IMPORTA_NFENTRADA','6.45.024'); END;
/
