create or replace PROCEDURE USR_IMPORTA_MERCADORIA(P_MENSAGEMERRO OUT VARCHAR2,
                                                   P_CDFILIAL IN ITLANCTOEST.CDFILIAL%TYPE DEFAULT NULL,
                                                   P_NRLANCTOUSR IN USR_ENTR_MERC.NRLANCTOUSR%TYPE DEFAULT NULL
                                                   ) IS
V_IDENTRSAID       USR_ENTR_MERC.IDENTRSAID%TYPE; 
V_CDEXFILIAL       USR_ENTR_MERC.CDEXFILIAL%TYPE;
V_CDFILIAL         USR_ENTR_MERC.CDFILIAL%TYPE;
V_DTENTRADA        USR_ENTR_MERC.DTENTRADA%TYPE;
V_DTENTRADA_OLD    USR_ENTR_MERC.DTENTRADA%TYPE;
V_NRLANCTOUSR      USR_ENTR_MERC.NRLANCTOUSR%TYPE;
V_NRLANCTOUSR_OLD  USR_ENTR_MERC.NRLANCTOUSR%TYPE;
V_NRLANCESTQ_OLD   USR_ENTR_MERC.NRLANCESTQ%TYPE;
V_CDCODOC          USR_ENTR_MERC.CDCODOC%TYPE;
V_CDPRODINTE       PRODUTO.CDPRODINTE%TYPE;
V_VRQUANTIDADE     USR_ITEM_ENTR_MERC.VRQUANTIDADE%TYPE;
V_VRUNITARIO       USR_ITEM_ENTR_MERC.VRUNITARIO%TYPE;
V_DTINCLUSAO       USR_ITEM_ENTR_MERC.DTINCLUSAO%TYPE;
V_DSDESCRICAO      USR_ITEM_ENTR_MERC.DSDESCRICAO%TYPE;
V_CDSERIE          USR_ITEM_ENTR_MERC.CDSERIE%TYPE;
V_NRINSJURFORN     USR_ITEM_ENTR_MERC.NRINSJURFORN%TYPE;
V_CDPRODESTO       PRODUTO.CDPRODESTO%TYPE;
V_CDPRODUTO        PRODUTO.CDPRODUTO%TYPE;
V_CDARVPROD        PRODUTO.CDARVPROD%TYPE;
V_NMPRODUTO        PRODUTO.NMPRODUTO%TYPE;
V_CDALMOXARIFE     PRODFILI.CDALMOXARIFE%TYPE;
V_CDALMOXARIFE_E   PRODFILI.CDALMOXARIFE%TYPE;
V_CDLOCALESTOQ     PRODFILI.CDLOCALESTOQ%TYPE;
V_CDLOCALESTOQ_E   PRODFILI.CDLOCALESTOQ%TYPE;
V_NRLOTEESTQ       ITLANCTOEST.NRLOTEESTQ%TYPE;
V_NRSUBLOTE        ITLANCTOEST.NRSUBLOTE%TYPE;
V_IDUTILLCESTQ     PARAMFILIAL.IDUTILLCESTQ%TYPE;
V_DSPERMMOVI       VARCHAR2(3);
V_IDNEWLANCEST     VARCHAR2(1);
V_NRLANCESTQ_E     VARCHAR2(20);
V_NOVOCODIGO       VARCHAR2(20);
V_ERRO             VARCHAR2(3000);
V_IDUTILLOTE       VARCHAR2(1);
V_IDUTCTRLLOTE     VARCHAR2(1);
V_NRSEQITENTR      NUMBER;
V_QTPRODIMPORTADO  NUMBER;
V_QTTOTALPROD      NUMBER;
V_DTPROCESSA       DATE;
V_IDLANCDTMAIFIL   VARCHAR2(1);
V_IDLANCDTMAI      VARCHAR2(1);
V_IDLANCDTMENFIL   VARCHAR2(1);
V_IDLANCDTMEN      VARCHAR2(1);
V_NRDIASENTRFIL    FLOAT;
V_NRDIASENTR       FLOAT;
V_NRDIASENTRPDFIL  FLOAT;
V_NRDIASENTRPD     FLOAT;
V_CDCODOC_EXISTE   USR_ENTR_MERC.CDCODOC%TYPE;
V_VRFATOCONV       FLOAT;
--Validação nova
V_MASTERJACADASTRADO USR_ENTR_MERC.NRLANCESTQ%TYPE;
V_ITEMJACADASTRADO   NUMBER;

CURSOR C_CABEC IS
SELECT USR.IDENTRSAID, USR.CDEXFILIAL, TO_DATE(USR.DTENTRADA), MAX(USR.NRLANCTOUSR), USR.CDCODOC, USR.DSDESCRICAO, USR.CDFILIAL, USR.CDSERIE, USR.NRINSJURFORN
  FROM USR_ENTR_MERC USR
 WHERE NRLANCESTQ IS NULL
   AND LOG_ERRO IS NULL
   AND CDFILIAL = NVL(P_CDFILIAL, CDFILIAL)
   AND NRLANCTOUSR = NVL(P_NRLANCTOUSR, NRLANCTOUSR)
   GROUP BY USR.IDENTRSAID, USR.CDEXFILIAL, TO_DATE(USR.DTENTRADA), USR.CDCODOC, USR.DSDESCRICAO, USR.CDFILIAL, USR.CDSERIE, USR.NRINSJURFORN;
   
CURSOR C_ITEM (C_NRLANCTOUSR IN VARCHAR2, C_CDFILIAL IN VARCHAR2) IS
SELECT USR.CDPRODINTE, USR.VRQUANTIDADE, USR.VRUNITARIO, USR.CDEXFILIAL, USR.DTINCLUSAO, R.CDPRODESTO, PR.CDPRODUTO, PR.CDARVPROD, PR.NMPRODUTO,
       NVL(NVL(PF.CDALMOXARIFE,PFL.CDALMOXARIFE),' ') AS CDALMOXARIFE_E, NVL(NVL(PF.CDLOCALESTOQ,PFL.CDLOCALESTOQ),' ') AS CDLOCALESTOQ_E, PFL.IDUTILLCESTQ,
       CASE WHEN PFL.IDUTILALMOX = 'S'
            THEN (CASE WHEN NVL(PF.CDALMOXARIFE,PFL.CDALMOXARIFE) IS NULL
                       THEN 'NAO'
                       ELSE 'SIM'
                  END)
            ELSE (CASE WHEN PFL.IDUTILLCESTQ = 'S'
                       THEN (CASE WHEN NVL(PF.CDLOCALESTOQ,PFL.CDLOCALESTOQ) IS NULL
                                  THEN 'NAO'
                                  ELSE 'SIM'
                             END)
                       ELSE 'SIM'
                  END)
       END AS DSPERMMOVI, PFL.IDUTILLOTE, PF.IDUTCTRLLOTE, PR.VRFATOCONV,
       USR.CDALMOXARIFE, USR.CDLOCALESTOQ, USR.NRLOTEESTQ, USR.NRSUBLOTE
  FROM USR_ITEM_ENTR_MERC USR
 INNER JOIN PRODUTO PR
    ON USR.CDPRODINTE = NVL(PR.CDPRODINTE, PR.CDPRODUTO)
 INNER JOIN FILIAL F
    ON F.CDFILIAL = C_CDFILIAL
 INNER JOIN PARAMFILIAL PFL
    ON PFL.CDFILIAL = C_CDFILIAL
 INNER JOIN PRODUTO R
    ON R.CDPRODUTO = PR.CDPRODUTO
 INNER JOIN PRODFILI PF
    ON PF.CDFILIAL = C_CDFILIAL
   AND PF.CDPRODUTO = R.CDPRODESTO
 WHERE USR.NRLANCTOUSR = C_NRLANCTOUSR
   AND USR.CDFILIAL = C_CDFILIAL;
BEGIN
   V_QTPRODIMPORTADO := 0;
   V_QTTOTALPROD     := 0;
   OPEN C_CABEC;
   LOOP
      FETCH C_CABEC INTO V_IDENTRSAID, V_CDEXFILIAL, V_DTENTRADA, V_NRLANCTOUSR, V_CDCODOC, V_DSDESCRICAO, V_CDFILIAL, V_CDSERIE, V_NRINSJURFORN;
      EXIT WHEN C_CABEC%NOTFOUND;
      V_NRLANCTOUSR_OLD := NULL;
      V_IDNEWLANCEST  := 'S';
      V_NRSEQITENTR   := 0;
      P_MENSAGEMERRO  := NULL;
      V_ERRO          := NULL;
      V_NRLANCESTQ_E  := NULL;
      V_MASTERJACADASTRADO := NULL;
      
      SELECT COUNT(*) 
        INTO V_QTTOTALPROD
        FROM USR_ITEM_ENTR_MERC
       WHERE CDFILIAL = V_CDFILIAL
         AND NRLANCTOUSR = V_NRLANCTOUSR;
      
      SELECT COUNT(*) 
        INTO V_QTPRODIMPORTADO
        FROM USR_ITEM_ENTR_MERC U,  PRODUTO P
       WHERE CDFILIAL = V_CDFILIAL
         AND NRLANCTOUSR = V_NRLANCTOUSR
         AND U.CDPRODINTE = NVL(P.CDPRODINTE, P.CDPRODUTO);
         
      --Corrige lançamentos duplicados
     /* FOR C_DUPLICADO IN (SELECT COUNT(*),  CDFILIAL, CDCODOC, CDSERIE, NRINSJURFORN, MAX(NRLANCTOUSR) AS MAXNRLANCTOUSR FROM USR_ENTR_MERC
                           WHERE CDCODOC = V_CDCODOC
                           AND CDFILIAL = V_CDFILIAL
                           AND CDCODOC IS NOT NULL
                           GROUP BY  CDFILIAL, CDCODOC, CDSERIE, NRINSJURFORN
                           HAVING COUNT(*) > 1) LOOP
            
            FOR  C_EXCLUIR IN (SELECT CDFILIAL, DTENTRADA AS DTENTRADA_OLD, NRLANCESTQ AS NRLANCESTQ_OLD, NRLANCTOUSR AS NRLANCTOUSR_OLD
                                 FROM USR_ENTR_MERC
                                 WHERE CDFILIAL = C_DUPLICADO.CDFILIAL
                                 AND CDCODOC = C_DUPLICADO.CDCODOC
                                 AND NVL(CDSERIE, 'N') = NVL(C_DUPLICADO.CDSERIE, 'N')
                                 AND NVL(NRINSJURFORN, 'N') = NVL(C_DUPLICADO.NRINSJURFORN, 'N')
                                 AND NRLANCTOUSR <> C_DUPLICADO.MAXNRLANCTOUSR) LOOP
            
                  DELETE ITLANCTOEST
                  WHERE CDFILIAL = C_EXCLUIR.CDFILIAL
                  AND NRLANCESTQ = C_EXCLUIR.NRLANCESTQ_OLD;
      
                  DELETE CUSTOCMPPROD
                  WHERE CDFILLANCEST = C_EXCLUIR.CDFILIAL
                  AND NRLANCESTQ   = C_EXCLUIR.NRLANCESTQ_OLD;
      
                  DELETE LANCTOESTOQ
                  WHERE CDFILIAL = C_EXCLUIR.CDFILIAL
                  AND NRLANCESTQ = C_EXCLUIR.NRLANCESTQ_OLD;
      
                  DELETE USR_ENTR_MERC
                  WHERE CDFILIAL = C_EXCLUIR.CDFILIAL
                  AND NRLANCTOUSR = C_EXCLUIR.NRLANCTOUSR_OLD;
      
                  DELETE USR_ITEM_ENTR_MERC
                  WHERE CDFILIAL = C_EXCLUIR.CDFILIAL
                  AND NRLANCTOUSR = C_EXCLUIR.NRLANCTOUSR_OLD;
                  
                  ATUALIZA_ESTOQUE(C_EXCLUIR.CDFILIAL, TO_DATE(C_EXCLUIR.DTENTRADA_OLD), SYSDATE, C_EXCLUIR.CDFILIAL, C_EXCLUIR.NRLANCESTQ_OLD, NULL); --Atualiza Registro natigo
                  
                  IF C_EXCLUIR.NRLANCTOUSR_OLD = P_NRLANCTOUSR THEN
                     V_ERRO         := 'Lançamento desatualizado. Já existe lançamento posterior';
                     P_MENSAGEMERRO := V_ERRO;
                  END IF;
            
            END LOOP;
            
      END LOOP; */
      
      BEGIN
         SELECT NRLANCESTQ 
         INTO V_MASTERJACADASTRADO 
         FROM  USR_ENTR_MERC 
         WHERE CDCODOC = V_CDCODOC 
         AND   CDFILIAL = V_CDFILIAL 
         AND   NVL(CDSERIE, ' ') = NVL(V_CDSERIE, ' ')
         AND   NVL(NRINSJURFORN, ' ') = NVL(V_NRINSJURFORN, ' ')
         AND   NRLANCESTQ IS NOT NULL
         ORDER BY NRLANCTOUSR DESC
         FETCH FIRST ROW ONLY;
      EXCEPTION 
         WHEN NO_DATA_FOUND THEN
            V_MASTERJACADASTRADO := NULL;
      END;
      
      -- verifica data de lanÃ§amento dentro do perÃ­odo
      BEGIN
         SELECT DECODE(PG.IDUTILDTPROC,'S',NVL(PF.DTPROCESSA, TO_DATE(SYSDATE)),TO_DATE(SYSDATE)) AS DTPROCESSA,
                PF.IDLANCDTMAIFIL, PE.IDLANCDTMAI, PF.IDLANCDTMENFIL, PE.IDLANCDTMEN,
                PF.NRDIASENTRFIL, PE.NRDIASENTR, PF.NRDIASENTRPDFIL, PE.NRDIASENTRPD
           INTO V_DTPROCESSA,
                V_IDLANCDTMAIFIL, V_IDLANCDTMAI, V_IDLANCDTMENFIL, V_IDLANCDTMEN,
                V_NRDIASENTRFIL, V_NRDIASENTR, V_NRDIASENTRPDFIL, V_NRDIASENTRPD
           FROM PARAMESTOQUE PE, PARAMGERAL PG, PARAMFILIAL PF
          WHERE PE.CDPARESTOQ = '1'
            AND PG.CDPARGERAL = '0001'
            AND PF.CDFILIAL = V_CDFILIAL;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_DTPROCESSA := TO_DATE(SYSDATE);
            V_IDLANCDTMAIFIL := 'N'; V_IDLANCDTMAI := 'N'; V_IDLANCDTMENFIL := 'N'; V_IDLANCDTMEN := 'N';
            V_NRDIASENTRFIL := NULL; V_NRDIASENTR := NULL; V_NRDIASENTRPDFIL := NULL; V_NRDIASENTRPD := NULL;
      END;
      IF V_DTENTRADA IS NULL THEN
         V_ERRO := 'Data da entrada deve ser informada.';
      END IF;
      IF (V_IDLANCDTMAIFIL = 'N') AND (V_IDLANCDTMAI = 'N') AND (V_DTENTRADA > V_DTPROCESSA) THEN
         V_ERRO := 'Data da entrada fora do periodo permitido.';
      END IF;
      IF (V_IDLANCDTMENFIL = 'N') AND (V_IDLANCDTMEN = 'N') AND (V_DTENTRADA < V_DTPROCESSA) THEN
         V_ERRO := 'Data da entrada fora do periodo permitido. entrada:'||V_DTENTRADA||' processa:'||V_DTPROCESSA||'FILIAL='||V_CDFILIAL||'/'||V_CDEXFILIAL;
      END IF;
      IF (V_IDLANCDTMENFIL = 'S') AND (V_DTENTRADA < V_DTPROCESSA) THEN
         IF (V_DTENTRADA < (V_DTPROCESSA - V_NRDIASENTRFIL)) THEN
            V_ERRO := 'Data da entrada fora do periodo permitido.';
         END IF;
      END IF;
      IF (V_IDLANCDTMEN = 'S') AND (V_DTENTRADA < V_DTPROCESSA) THEN
         IF (V_DTENTRADA < (V_DTPROCESSA - V_NRDIASENTR)) THEN
            V_ERRO := 'Data da entrada fora do periodo permitido.';
         END IF;
      END IF;
      IF (V_IDLANCDTMAIFIL = 'S') AND (V_DTENTRADA > V_DTPROCESSA) THEN
         IF (V_DTENTRADA > (V_DTPROCESSA + V_NRDIASENTRPDFIL)) THEN
            V_ERRO := 'Data da entrada fora do periodo permitido.';
         END IF;
      END IF;
      IF (V_IDLANCDTMAI = 'S') AND (V_DTENTRADA > V_DTPROCESSA) THEN
         IF (V_DTENTRADA > (V_DTPROCESSA + V_NRDIASENTRPD)) THEN
            V_ERRO := 'Data da entrada fora do periodo permitido.';
         END IF;
      END IF;
      IF V_ERRO IS NULL THEN
         IF V_QTPRODIMPORTADO = V_QTTOTALPROD THEN
            OPEN C_ITEM(V_NRLANCTOUSR, V_CDFILIAL);
            LOOP
               FETCH C_ITEM INTO V_CDPRODINTE, V_VRQUANTIDADE, V_VRUNITARIO, V_CDEXFILIAL, V_DTINCLUSAO, V_CDPRODESTO, V_CDPRODUTO, V_CDARVPROD, V_NMPRODUTO,
                                 V_CDALMOXARIFE_E, V_CDLOCALESTOQ_E, V_IDUTILLCESTQ, V_DSPERMMOVI, V_IDUTILLOTE, V_IDUTCTRLLOTE, V_VRFATOCONV, V_CDALMOXARIFE, V_CDLOCALESTOQ, V_NRLOTEESTQ, V_NRSUBLOTE;
               EXIT WHEN C_ITEM%NOTFOUND;

               IF (V_VRQUANTIDADE * V_VRFATOCONV) = 0 THEN
                  V_ERRO := 'Operação Bloqueada! Existe(m) algum(ns) produto(s) com quantidade zerada ou sem fator de conversão.';
                  P_MENSAGEMERRO := V_ERRO;
                  ROLLBACK;

                  EXIT;
               END IF;

               IF (V_DSPERMMOVI = 'SIM') THEN
                  BEGIN
                     INSERT INTO PRODLCESTOQ (CDFILIAL, CDALMOXARIFE, CDLOCALESTOQ, CDPRODUTO)
                     SELECT V_CDFILIAL, NVL(V_CDALMOXARIFE, V_CDALMOXARIFE_E), NVL(V_CDLOCALESTOQ, V_CDLOCALESTOQ_E), V_CDPRODESTO
                       FROM PRODFILI
                      WHERE CDFILIAL  = V_CDFILIAL
                        AND CDPRODUTO = V_CDPRODUTO
                        AND NVL(IDCNTRESTOQ, 'S') <> 'N'
                      MINUS
                     SELECT CDFILIAL, CDALMOXARIFE, CDLOCALESTOQ, CDPRODUTO
                       FROM PRODLCESTOQ
                      WHERE CDFILIAL     = V_CDFILIAL
                        AND CDALMOXARIFE = NVL(V_CDALMOXARIFE, V_CDALMOXARIFE_E)
                        AND CDLOCALESTOQ = NVL(V_CDLOCALESTOQ, V_CDLOCALESTOQ_E)
                        AND CDPRODUTO    = V_CDPRODESTO;
                  EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_ERRO         := SQLERRM(SQLCODE);
                     P_MENSAGEMERRO := V_ERRO;
                  WHEN OTHERS THEN
                     V_ERRO         := 'Almoxarifado='||NVL(V_CDALMOXARIFE, V_CDALMOXARIFE_E)||' ou Localestoque='||NVL(V_CDLOCALESTOQ, V_CDLOCALESTOQ_E)||' não cadastrado na Filial='||V_CDFILIAL;
                     P_MENSAGEMERRO := V_ERRO;
                  END;
                  IF V_ERRO IS NOT NULL THEN
                     GOTO BREAK_STP;
                  END IF;
                     IF V_IDNEWLANCEST = 'S' THEN
                        NOVO_CODIGO_SC('LANCTOEST' || V_CDFILIAL, V_NOVOCODIGO);
                        V_NRLANCESTQ_E := SUBSTR(V_NOVOCODIGO,11,10);
                        BEGIN
                        IF V_MASTERJACADASTRADO IS NULL THEN
                           INSERT INTO LANCTOESTOQ
                              (CDFILIAL, NRLANCESTQ, DSLANCESTQ, IDTPLANCTO, CDTIPOOPER, DTLANCESTQ, IDENTRSAIDOP, CDFILIMOVI, NRLANCTONF)
                           VALUES
                              (V_CDFILIAL, V_NRLANCESTQ_E, V_DSDESCRICAO||'('||V_CDCODOC||')', '2', '10', V_DTENTRADA, 'E', V_CDFILIAL, NULL);
                           UPDATE USR_ENTR_MERC
                              SET NRLANCESTQ  = V_NRLANCESTQ_E
                            WHERE NRLANCTOUSR = V_NRLANCTOUSR
                              AND CDFILIAL  = V_CDFILIAL;
                        ELSE
                           V_NRLANCESTQ_E := V_MASTERJACADASTRADO;
                           
                           UPDATE LANCTOESTOQ
                           SET DSLANCESTQ = V_DSDESCRICAO||'('||V_CDCODOC||')'
                           WHERE CDFILIAL = V_CDFILIAL
                           AND NRLANCESTQ = V_MASTERJACADASTRADO; -- UPDATE MASTER
                        END IF;
                        EXCEPTION
                           WHEN OTHERS THEN
                              V_ERRO         := SQLERRM(SQLCODE);
                              P_MENSAGEMERRO := V_ERRO;
                        END;
                        V_IDNEWLANCEST := 'N';
                     END IF;
                     V_NRSEQITENTR := V_NRSEQITENTR + 1;
                     BEGIN
                        IF V_IDUTCTRLLOTE = 'S' THEN
                           PRXLOTEPRODEST(V_CDFILIAL, V_DTENTRADA, V_CDPRODESTO, V_NRLOTEESTQ);
                        ELSE
                           V_NRLOTEESTQ := ' ';
                        END IF;
                        
                        SELECT COUNT(NRSEQUITEM) INTO V_ITEMJACADASTRADO FROM ITLANCTOEST 
                        WHERE CDFILIAL = V_CDFILIAL
                          AND NRLANCESTQ = V_MASTERJACADASTRADO
                          AND CDPRODUTO = V_CDPRODUTO;
                          
                          --AND NRSEQUITEM = LPAD(RTRIM(TO_CHAR(V_NRSEQITENTR)), 4, '0');
                        IF V_ITEMJACADASTRADO = 0 THEN
                           INSERT INTO ITLANCTOEST
                              (CDFILIAL, NRLANCESTQ, NRSEQUITEM, CDPRODUTO,
                               QTLANCTOEST, VRUNILANCTO,VRTOTLANCTO, QTTOTLANCTO,
                               CDPRODMOVI, CDFILIMOVI, CDALMOXARIFE, CDLOCALESTOQ,
                               NRLOTEESTQ, NRSUBLOTE, IDTIPOMOVI, DTLANCMOVI,
                               IDORDEMCLC, VRLANCTOEST, VRLANCTOBRUT, VRCUSTENTR)
                           VALUES
                              (V_CDFILIAL, V_NRLANCESTQ_E, LPAD(RTRIM(TO_CHAR(V_NRSEQITENTR)), 4, '0'), V_CDPRODUTO,
                               (V_VRQUANTIDADE * V_VRFATOCONV), V_VRUNITARIO, (V_VRQUANTIDADE * V_VRUNITARIO), V_VRQUANTIDADE,
                               V_CDPRODESTO, V_CDFILIAL, NVL(V_CDALMOXARIFE, V_CDALMOXARIFE_E), NVL(V_CDLOCALESTOQ, V_CDLOCALESTOQ_E),
                               V_NRLOTEESTQ, ' ', '2', V_DTENTRADA,
                               '2', ((V_VRQUANTIDADE*V_VRUNITARIO)/(V_VRQUANTIDADE * V_VRFATOCONV)), ((V_VRQUANTIDADE*V_VRUNITARIO)/(V_VRQUANTIDADE * V_VRFATOCONV)), (V_VRQUANTIDADE*V_VRUNITARIO));
                        ELSE
                           UPDATE ITLANCTOEST
                           SET QTLANCTOEST  = (V_VRQUANTIDADE * V_VRFATOCONV),
                               VRUNILANCTO  = V_VRUNITARIO,
                               VRTOTLANCTO  = (V_VRQUANTIDADE * V_VRUNITARIO),
                               QTTOTLANCTO  = V_VRQUANTIDADE,
                               CDPRODMOVI   = V_CDPRODESTO,
                               CDFILIMOVI   = V_CDFILIAL,
                               CDALMOXARIFE = NVL(V_CDALMOXARIFE, V_CDALMOXARIFE_E),
                               CDLOCALESTOQ = NVL(V_CDLOCALESTOQ, V_CDLOCALESTOQ_E),
                               NRLOTEESTQ   = V_NRLOTEESTQ,
                               VRLANCTOEST  = ((V_VRQUANTIDADE*V_VRUNITARIO)/(V_VRQUANTIDADE * V_VRFATOCONV)),
                               VRLANCTOBRUT = ((V_VRQUANTIDADE*V_VRUNITARIO)/(V_VRQUANTIDADE * V_VRFATOCONV)),
                               VRCUSTENTR   = (V_VRQUANTIDADE*V_VRUNITARIO)
                           WHERE CDFILIAL   = V_CDFILIAL
                             AND NRLANCESTQ = V_MASTERJACADASTRADO
                             AND CDPRODUTO  = V_CDPRODUTO;
                        END IF;

                        -- Atuliza estoque referente a GeraÃ§Ã£o de Entrada
                        ATUALIZA_ESTOQUE(V_CDFILIAL, V_DTENTRADA, SYSDATE, V_CDFILIAL, V_NRLANCESTQ_E, NULL); --Atualiza Registro Novo
                        IF V_NRLANCTOUSR_OLD IS NOT NULL THEN
                           ATUALIZA_ESTOQUE(V_CDFILIAL, TO_DATE(V_DTENTRADA_OLD), SYSDATE, V_CDFILIAL, V_NRLANCESTQ_OLD, NULL); --Atualiza Registro natigo
                        END IF;
                        /* 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 IN (V_CDFILIAL||V_NRLANCESTQ_E, V_CDFILIAL||V_NRLANCESTQ_OLD)
                                               AND CDFILIAL   = V_CDFILIAL)
                        LOOP
                           UPDATE ITLANCTOEST
                              SET IDEVOLESTOQ  = 'N'
                            WHERE CDFILIAL     = V_CDFILIAL
                              AND NRLANCESTQ   = V_NRLANCESTQ_E
                              AND CDALMOXARIFE = NVL(V_CDALMOXARIFE, V_CDALMOXARIFE_E)
                              AND CDLOCALESTOQ = NVL(V_CDLOCALESTOQ, V_CDLOCALESTOQ_E)
                              AND CDPRODUTO    = V_CDPRODUTO
                              AND NRLOTEESTQ   = ' '
                              AND NRSUBLOTE    = ' ';
                           V_ERRO := 'Operação Bloqueada! Algum(ns) produto(s) tornariam o estoque irregular.';
                        END LOOP;
                        DELETE MOVILOTE
                         WHERE NRMOVILOTE = V_CDFILIAL||V_NRLANCESTQ_E;
                     EXCEPTION
                        WHEN NO_DATA_FOUND THEN
                           V_ERRO         := SQLERRM(SQLCODE);
                           P_MENSAGEMERRO := V_ERRO;
                     END;
               ELSE
                  V_ERRO := 'Operação Bloqueada! Existe(m) algum(ns) produto(s) com parametrização não definida.';
                  P_MENSAGEMERRO := V_ERRO;
               END IF;
            END LOOP;
            CLOSE C_ITEM;

            CUSTO_LIQUIDO(V_CDFILIAL, V_NRLANCESTQ_E, 0, NULL, 'N');

            <<BREAK_STP>>
            NULL; -- EVITAR ERRO DE GOTO
         ELSE
            V_ERRO := 'Operação Bloqueada! Existe(em) produto(s) que nÃ£o foi(ram) cadastrado(s) na Ãrvore de produtos.';
            P_MENSAGEMERRO := V_ERRO;
         END IF;
         IF P_MENSAGEMERRO IS NULL THEN
            UPDATE USR_ENTR_MERC
               SET LOG_ERRO    = 'Operação realizada com sucesso.;'||V_NRLANCTOUSR||';'||V_NRLANCESTQ_E
             WHERE NRLANCTOUSR = V_NRLANCTOUSR
               AND CDFILIAL  = V_CDFILIAL;
         ELSE
            UPDATE USR_ENTR_MERC
               SET LOG_ERRO    = P_MENSAGEMERRO
             WHERE NRLANCTOUSR = V_NRLANCTOUSR
               AND CDFILIAL  = V_CDFILIAL;
               
            P_MENSAGEMERRO := P_MENSAGEMERRO||';'||V_NRLANCTOUSR||';'||V_NRLANCESTQ_E;
         END IF;
      ELSE
         P_MENSAGEMERRO := V_ERRO;
         UPDATE USR_ENTR_MERC
            SET LOG_ERRO    = P_MENSAGEMERRO||';'||V_NRLANCTOUSR||';'||V_NRLANCESTQ_E
          WHERE NRLANCTOUSR = V_NRLANCTOUSR
            AND CDFILIAL  = V_CDFILIAL;
         P_MENSAGEMERRO := P_MENSAGEMERRO||';'||V_NRLANCTOUSR||';'||V_NRLANCESTQ_E;
      END IF; -- endif verro is null
      COMMIT;
   END LOOP;
   CLOSE C_CABEC;
   
   IF P_MENSAGEMERRO IS NULL THEN
      P_MENSAGEMERRO := 'S;'||V_NRLANCTOUSR||';'||V_NRLANCESTQ_E;
   END IF;
   COMMIT;
END;