CREATE OR REPLACE PROCEDURE GERA_EST_DISTRIBUICAO(
   P_FILIAL       IN FILIAL.CDFILIAL%TYPE,
   P_LANCTONF     IN ITEMPRODUTO.NRLANCTONF%TYPE,
   P_NRSEQITPROD  IN ITEMPRODUTO.NRSEQITPROD%TYPE,
   P_LANCESTQ     IN LANCTOESTOQ.NRLANCESTQ%TYPE,
   P_TIPOOPER     IN TIPOOPERAC.CDTIPOOPER%TYPE,
   P_IDTIPOMOVI   IN ITLANCTOEST.IDTIPOMOVI%TYPE,
   P_INIVALID     IN NOTAFISCAL.DTENTRSAID%TYPE,
   P_CDFILIMOVI   IN FILIAL.CDFILIAL%TYPE,
   P_CDPRODUTO    IN PRODUTO.CDPRODUTO%TYPE,
   P_QTTOTLANCTO  IN ITLANCTOEST.QTTOTLANCTO%TYPE,
   P_CDALMOXARIFE IN ALMOXARIFADO.CDALMOXARIFE%TYPE,
   P_CDLOCALESTOQ IN LOCALESTOQUE.CDLOCALESTOQ%TYPE,
   P_CDOPERADOR   IN OPERADOR.CDOPERADOR%TYPE DEFAULT NULL,
   P_NRLISTA      IN VARCHAR DEFAULT NULL,
   P_RESULTADO OUT VARCHAR2
   )
AS
   W_S              CHAR(1) := 'S';
   W_N              CHAR(1) := 'N';
   W_L              CHAR(1) := 'L';
   W_E              CHAR(1) := 'E';
   W_F              CHAR(1) := 'F';
   W_2              CHAR(1) := '2';
   W_0              CHAR(1) := '0';

   V_CDPRODUTO      VARCHAR2(10);
   V_VRUNITITEM     FLOAT;
   V_VRTOTAITEM     FLOAT;
   V_QTITEMPRODNF   FLOAT;
   V_CDPRODESTO     VARCHAR2(10);
   V_VRBRUTITEM     FLOAT;
   V_VRDESCITEM     FLOAT;
   V_VRCONTITEM     FLOAT;
   V_CDALMOXARIFE   VARCHAR2(06);
   V_CDLOCALESTOQ   VARCHAR2(06);
   V_NRLOTEESTQ     VARCHAR2(20);
   V_NRSUBLOTE      VARCHAR2(04);
   V_CDFILIMOVI     VARCHAR2(04);
   V_CDFORNECED     VARCHAR2(21);
   V_IDORIGDESTNF   VARCHAR2(01);
   V_IDDOCREPLIC    VARCHAR2(14);
   V_CDFILIEMIT     VARCHAR2(04);
   V_CDFILIRECE     VARCHAR2(04);

   V_DTATUAL        DATE;
   V_IDCTRLDISTRIB  VARCHAR2(01);

   V_FATOCONV       NUMBER;
   V_CDTIPCUSTEST   NUMBER;

   V_QTDELANCTO     FLOAT;
   V_QTLANCESTQ     FLOAT;
   V_VRTOTALANCTO   FLOAT;
   V_IDNFRETIND     VARCHAR2(01);
   V_IDUTCUSORIGEST VARCHAR2(01);
   V_IDOPERDEVONF   VARCHAR2(01);
   V_VRUNITLANCTO   FLOAT;
   V_TOTABRUT       FLOAT;
   V_TOTACONTAB     FLOAT;
   V_VRCUSTENTR     FLOAT;

   V_VRPESOBRUTPR   FLOAT;
   V_VRPECUSTOLOG   FLOAT;
   V_VRVRCUSTOLOG   FLOAT;
   V_VRPESEGURLOG   FLOAT;
   V_VRCUSTOLOG     FLOAT;
   V_VRCUSTOSEG     FLOAT;
   V_IDORIGEMPROD   VARCHAR2(01);
   V_CDSITUTRIBPR   VARCHAR2(03);

   V_QTDEPALETE     FLOAT;

   V_NRSEQUITEM      VARCHAR2(04);

   V_CDPRODDIFE      VARCHAR2(10);
   V_CDLOCALESTDESM  VARCHAR2(06);
   V_QTITEMPROD      FLOAT;

   V_IDESTPRODDESMEMB  VARCHAR2(01);
   V_CDPRODUTODESMEMB  VARCHAR2(10);
   V_CDPRODESTDESMEMB  VARCHAR2(10);

   V_VRFATOCONV       FLOAT;
   V_VRCAPACPRODPAL   FLOAT;
   V_VRCAPACLOCEST    FLOAT;

   V_INS_LANC_TERC    VARCHAR2(01);

   V_CDPRODXML        VARCHAR2(30);

   V_CDEMPRESA        VARCHAR2(02);
   V_CDINSCMUNI       VARCHAR2(16);
   V_CDINSCESTA       VARCHAR2(16);
   V_CDSERIE          VARCHAR2(05);

   V_LOCDISPONIVEL    NUMBER;

   V_CDALMOXTERCFOR   VARCHAR2(06);
   V_IDBONIFICACAO    VARCHAR2(01);

   V_VRICMSCOMPL      FLOAT;
   V_VRSTCOMPL        FLOAT;
   V_VRFECPSTCOMPL    FLOAT;

   V_IDOPERDEVOOL     VARCHAR2(01);

   V_VRCUSTENTRDEVB   FLOAT;
   V_IDFUNCAOFILRECE  VARCHAR2(01);
   V_IDCOMPRABONI     VARCHAR2(01);
   V_CDFISOPEITEM     VARCHAR2(10);
   V_COMPCUSTPROD     VARCHAR2(01);
BEGIN
   P_RESULTADO := '';

   V_VRCUSTENTRDEVB := 0;

   -- Se for Implantacao ou Ajuste
   IF P_IDTIPOMOVI IN ('0', '1') THEN
      BEGIN
         SELECT P.CDPRODESTO, P_QTTOTLANCTO, NVL(P_CDALMOXARIFE, ' ') CDALMOXARIFE, NVL(P_CDLOCALESTOQ, ' ') CDLOCALESTOQ,
                P_CDFILIMOVI, NVL(F.IDCTRLDISTRIB, W_N)
           INTO V_CDPRODESTO, V_QTITEMPROD, V_CDALMOXARIFE, V_CDLOCALESTOQ,
                V_CDFILIMOVI, V_IDCTRLDISTRIB
           FROM PRODUTO P, PRODFILI PF, PARAMFILIAL F
          WHERE P.CDPRODUTO    = P_CDPRODUTO
            AND PF.CDFILIAL    = P_CDFILIMOVI
            AND PF.CDPRODUTO   = P.CDPRODESTO
            AND NVL(IDCNTRESTOQ, W_S) <> W_N
            AND F.CDFILIAL     = P_CDFILIMOVI;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_CDPRODESTO := NULL; V_QTITEMPROD := 0; V_CDALMOXARIFE := ' '; V_CDLOCALESTOQ := ' ';
            V_CDFILIMOVI := NULL; V_IDCTRLDISTRIB := 'N';
      END;

      -- Verifica se a filial possui controle de distribuicao
      IF V_IDCTRLDISTRIB = 'S' THEN
         -- Verifica se possui estoque de outro produto na localizacao informada
         BEGIN
            SELECT MAX(CDPRODUTO)
              INTO V_CDPRODDIFE
              FROM (SELECT CDPRODUTO
                      FROM POSESTATU
                     WHERE CDFILIAL     = V_CDFILIMOVI
                       AND CDPRODUTO    <> V_CDPRODESTO
                       AND CDALMOXARIFE = V_CDALMOXARIFE
                       AND CDLOCALESTOQ = V_CDLOCALESTOQ
                       AND QTTOTALESTOQ > 0
                     UNION ALL
                    SELECT CDPRODUTO
                      FROM ITLANCTOEST
                     WHERE CDFILIAL     = P_FILIAL
                       AND NRLANCESTQ   = P_LANCESTQ
                       AND CDPRODMOVI   <> V_CDPRODESTO
                       AND CDALMOXARIFE = V_CDALMOXARIFE
                       AND CDLOCALESTOQ = V_CDLOCALESTOQ);
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_CDPRODDIFE := NULL;
         END;

         -- Se nao existe outro produto na localizacao (rua)
         IF V_CDPRODDIFE IS NULL THEN

            BEGIN
               SELECT P.VRFATOCONV, (R.VRCAPACPALETE * P.VRFATOCONV) AS VRCAPACPRODPAL, L.VRCAPACLOCEST
                 INTO V_VRFATOCONV, V_VRCAPACPRODPAL, V_VRCAPACLOCEST
                 FROM PRODFILI PF, PRODUTO P, PRODPALETE R, LOCALESTOQUE L
                WHERE P.CDPRODESTO    = V_CDPRODESTO
                  AND PF.CDFILIAL     = V_CDFILIMOVI
                  AND PF.CDPRODUTO    = P.CDPRODUTO
                  AND PF.IDUNPADRAO   = W_S
                  AND R.CDFILIAL      = PF.CDFILIAL
                  AND R.CDPRODUTO     = PF.CDPRODUTO
                  AND R.VRCAPACPALETE > 0
                  AND L.CDFILIAL     = PF.CDFILIAL
                  AND L.CDALMOXARIFE = V_CDALMOXARIFE
                  AND L.CDLOCALESTOQ = V_CDLOCALESTOQ
                  AND L.IDESTDESMEMB = W_N;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_VRFATOCONV := 1; V_VRCAPACPRODPAL := 0; V_VRCAPACLOCEST := 0;
            END;

            -- Qtde de paletes do produto
            IF V_VRCAPACPRODPAL <> 0 THEN
               V_QTDEPALETE := (V_QTITEMPROD * V_VRFATOCONV) / V_VRCAPACPRODPAL;

               IF V_QTDEPALETE > V_VRCAPACLOCEST THEN
                  P_RESULTADO := 'TOT_MCAPAC';
               ELSE
                  IF (V_QTDEPALETE - TRUNC(V_QTDEPALETE)) <> 0 THEN
                     V_QTDEPALETE := TRUNC(V_QTDEPALETE) + 1;
                  END IF;

                  -- Atualiza a quantidade de paletes utilizados na localizacao (rua)
                  UPDATE LOCALESTOQUE
                     SET VRCAPACLOCUTIL = V_QTDEPALETE
                   WHERE CDFILIAL     = V_CDFILIMOVI
                     AND CDALMOXARIFE = V_CDALMOXARIFE
                     AND CDLOCALESTOQ = V_CDLOCALESTOQ;
               END IF;
            END IF;
         ELSE
            P_RESULTADO := 'LOCAL_JUTIL';
         END IF;
      END IF;
   ELSE
      -- Se for Entrada
      IF P_IDTIPOMOVI <> '7' THEN
         SELECT IP.CDPRODUTO, IP.VRUNITITEM, IP.VRTOTAITEM, IP.QTITEMPROD,
                P.CDPRODESTO, IP.VRBRUTITEM, IP.VRDESCITEM, IP.VRCONTITEM,
                NVL(IP.CDALMOXARIFE, ' ') CDALMOXARIFE, NVL(IP.CDLOCALESTOQ, ' ') CDLOCALESTOQ,
                NVL(IP.NRLOTEESTQ, ' ') NRLOTEESTQ, NVL(IP.NRSUBLOTE, ' ') NRSUBLOTE, IP.CDFILIMOVI, NVL(N.IDORIGDESTNF, W_F),
                N.CDFORNECED, N.IDDOCREPLIC, P.VRFATOCONV, N.CDFILIEMIT, N.CDFILIRECE, NVL(IP.IDORIGEMPROD, 'N') AS IDORIGEMPROD,
                IP.CDSITUTRIBPR, NVL(F.IDFUNCAOFILI, 'X') AS IDFUNCAOFILRECE, IP.CDFISOPEITEM
           INTO V_CDPRODUTO, V_VRUNITITEM, V_VRTOTAITEM, V_QTITEMPRODNF,
                V_CDPRODESTO, V_VRBRUTITEM, V_VRDESCITEM, V_VRCONTITEM,
                V_CDALMOXARIFE, V_CDLOCALESTOQ,
                V_NRLOTEESTQ, V_NRSUBLOTE, V_CDFILIMOVI, V_IDORIGDESTNF,
                V_CDFORNECED, V_IDDOCREPLIC, V_FATOCONV, V_CDFILIEMIT,
                V_CDFILIRECE, V_IDORIGEMPROD, V_CDSITUTRIBPR, V_IDFUNCAOFILRECE, V_CDFISOPEITEM
           FROM ITEMPRODUTO IP, PRODUTO P, PRODFILI PF, NOTAFISCAL N, FILIAL F
          WHERE IP.CDFILIAL    = P_FILIAL
            AND IP.NRLANCTONF  = P_LANCTONF
            AND IP.NRSEQITPROD = P_NRSEQITPROD
            AND N.CDFILIAL     = IP.CDFILIAL
            AND N.NRLANCTONF   = IP.NRLANCTONF
            AND P.CDPRODUTO    = IP.CDPRODUTO
            AND PF.CDFILIAL    = N.CDFILIRECE
            AND PF.CDPRODUTO   = P.CDPRODESTO
            AND NVL(IDCNTRESTOQ, W_S) <> W_N
            AND N.CDFILIRECE   = F.CDFILIAL;

         BEGIN
            SELECT ROUND((NVL(I.VRIMPOSIT, 0)/V_QTITEMPRODNF), 2) AS VRIMPOUNIT
              INTO V_VRICMSCOMPL
              FROM TRABITPROIMPOS I, IMPOSTO II, IMPOSTONFE IP
             WHERE I.CDFILIMPOIT   = P_FILIAL
               AND I.NRLANCIMPOIT  = P_LANCTONF
               AND I.NRSEQIMPOIT   = P_NRSEQITPROD
               AND I.CDIMPOSTOIT   = II.CDIMPOSTO
               AND II.CDIMPOSTONFE = IP.CDIMPOSTONFE
               AND IP.CDIMPOSTONFE = '05'
               AND I.NRSEQITPRO    = '1';
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_VRICMSCOMPL := 0;
         END;

         BEGIN
            SELECT ROUND((NVL(I.VRIMPOSIT, 0)/V_QTITEMPRODNF), 2) AS VRIMPOUNIT,
                   ROUND((NVL(I.VRADICFECP, 0)/V_QTITEMPRODNF), 2)  AS VRFECPUNIT
              INTO V_VRSTCOMPL, V_VRFECPSTCOMPL
              FROM TRABITPROIMPOS I, IMPOSTO II, IMPOSTONFE IP
             WHERE I.CDFILIMPOIT   = P_FILIAL
               AND I.NRLANCIMPOIT  = P_LANCTONF
               AND I.NRSEQIMPOIT   = P_NRSEQITPROD
               AND I.CDIMPOSTOIT   = II.CDIMPOSTO
               AND II.CDIMPOSTONFE = IP.CDIMPOSTONFE
               AND IP.CDIMPOSTONFE = '06'
               AND I.NRSEQITPRO    = '1';
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_VRSTCOMPL := 0; V_VRFECPSTCOMPL := 0;
         END;

         INSERT INTO LOTE
            (CDFILIAL, NRLOTEESTQ, NRSUBLOTE, CDPRODUTO, IDSTATLOTE, DTENTRLOTE)
            (SELECT V_CDFILIMOVI, V_NRLOTEESTQ, V_NRSUBLOTE, V_CDPRODESTO, W_L, SYSDATE
               FROM PARAMGERAL
              MINUS
             SELECT CDFILIAL, NRLOTEESTQ, NRSUBLOTE, V_CDPRODESTO, W_L, SYSDATE
               FROM LOTE
              WHERE V_CDFILIMOVI = CDFILIAL
                AND V_NRLOTEESTQ = NRLOTEESTQ
                AND V_NRSUBLOTE  = NRSUBLOTE
                AND V_CDPRODESTO = CDPRODUTO);

         UPDATE ITEMPRODUTO
            SET CDPRODMOVI  = V_CDPRODESTO
          WHERE CDFILIAL    = P_FILIAL
            AND NRLANCTONF  = P_LANCTONF
            AND NRSEQITPROD = P_NRSEQITPROD;

         IF (V_FATOCONV IS NULL) OR (V_FATOCONV = 0) THEN
            V_FATOCONV := 1;
         END IF;

         BEGIN
         SELECT NVL(TO_NUMBER(P.CDTIPCUSTEST),3), NVL(P.DTPROCESSA, SYSDATE), NVL(IDCTRLDISTRIB, W_N)
           INTO V_CDTIPCUSTEST, V_DTATUAL, V_IDCTRLDISTRIB
           FROM PARAMFILIAL P
          WHERE P.CDFILIAL = V_CDFILIRECE;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_CDTIPCUSTEST := 3; V_DTATUAL := SYSDATE; V_IDCTRLDISTRIB := W_N;
         END;

         -- SE A NOTA FISCAL E RETORNO DE INDUSTRIALIZACAO O CUSTO DO ITEM QUE ATUALIZA ESTOQUE E A SOMA DE TODOS OS OUTROS ITENS
         BEGIN
            SELECT NVL(IDNFRETIND, W_N),   NVL(IDUTCUSORIGEST, W_N), NVL(IDOPERDEVONF, W_N), NVL(IDBONIFICACAO, W_N),
                   NVL(IDOPERDEVOOL, W_N), NVL(IDCMPVNDBONI, W_N)
              INTO V_IDNFRETIND,   V_IDUTCUSORIGEST, V_IDOPERDEVONF, V_IDBONIFICACAO,
                   V_IDOPERDEVOOL, V_IDCOMPRABONI
              FROM TIPOOPERAC
             WHERE CDTIPOOPER   = P_TIPOOPER
               AND IDENTRSAIDOP = W_E;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_IDNFRETIND := W_N; V_IDUTCUSORIGEST := W_N; V_IDOPERDEVONF := W_N; V_IDBONIFICACAO := W_N; V_IDOPERDEVOOL := W_N;
         END;

         -- Se a filial utiliza gestao de estoque e distribuicao e se for entrada no estoque
         IF (P_IDTIPOMOVI = W_2) AND (V_IDCTRLDISTRIB = W_S) THEN

            -- Retorna localizacao desmembrada (localizacao - prateleira)
            BEGIN
               SELECT MIN(CDLOCALESTOQ)
                 INTO V_CDLOCALESTDESM
                 FROM LOCALESTOQUE
                WHERE CDFILIAL     = V_CDFILIRECE
                  AND CDALMOXARIFE = V_CDALMOXARIFE
                  AND IDESTDESMEMB = W_S;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_CDLOCALESTDESM := NULL;
            END;

            -- Quantidade restante do produto
            V_QTITEMPROD := V_QTITEMPRODNF;

            -- verificando localizacoes disponiveis
            FOR C_LOCALESTOQ IN (
               SELECT P.CDPRODESTO, P.CDPRODUTO, P.VRFATOCONV, R.VRCAPACPALETE,
                     (R.VRCAPACPALETE * P.VRFATOCONV) AS VRCAPACPRODPAL, L.CDLOCALESTOQ,
                     (R.VRCAPACPALETE * L.VRCAPACLOCEST * P.VRFATOCONV) - NVL(U.QTTOTALESTOQ, 0) AS SALDOLOCALI,
                     R.IDESTPRODDESMEMB, NVL(VRCAPACLOCEST,0) AS VRCAPACLOCEST, NVL(L.VRCAPACLOCUTIL,0) AS VRCAPACLOCUTIL
                 FROM PRODFILI PF, PRODUTO P, PRODPALETE R, LOCALESTOQUE L,
                     (SELECT CDLOCALESTOQ, SUM(QTTOTALESTOQ) AS QTTOTALESTOQ
                        FROM POSESTATU
                       WHERE CDFILIAL     = V_CDFILIRECE
                         AND CDPRODUTO    = V_CDPRODESTO
                         AND CDALMOXARIFE = V_CDALMOXARIFE
                       GROUP BY CDLOCALESTOQ
                      ) U
                WHERE P.CDPRODESTO    = V_CDPRODESTO
                  AND PF.CDFILIAL     = V_CDFILIRECE
                  AND PF.CDPRODUTO    = P.CDPRODUTO
                  AND PF.IDUNPADRAO   = W_S
                  AND R.CDFILIAL      = PF.CDFILIAL
                  AND R.CDPRODUTO     = PF.CDPRODUTO
                  AND R.VRCAPACPALETE > 0
                  AND L.CDFILIAL     = PF.CDFILIAL
                  AND L.CDALMOXARIFE = V_CDALMOXARIFE
                  AND L.CDLOCALESTOQ <> ' '
                  AND L.IDESTDESMEMB = W_N
                  AND NVL(L.VRCAPACLOCUTIL,0) < NVL(VRCAPACLOCEST,0)
                  AND L.CDLOCALESTOQ = U.CDLOCALESTOQ (+)
                ORDER BY L.CDLOCALESTOQ)

            LOOP
               -- Verifica se possui estoque de outro produto na localizacao sugerida
               BEGIN
                  SELECT MAX(CDPRODUTO)
                    INTO V_CDPRODDIFE
                    FROM (SELECT CDPRODUTO
                            FROM POSESTATU
                           WHERE CDFILIAL     = V_CDFILIRECE
                             AND CDPRODUTO    <> C_LOCALESTOQ.CDPRODESTO
                             AND CDALMOXARIFE = V_CDALMOXARIFE
                             AND CDLOCALESTOQ = C_LOCALESTOQ.CDLOCALESTOQ
                             AND QTTOTALESTOQ > 0
                           UNION ALL
                          SELECT CDPRODUTO
                            FROM ITLANCTOEST
                           WHERE CDFILIAL     = P_FILIAL
                             AND NRLANCESTQ   = P_LANCESTQ
                             AND CDPRODMOVI   <> C_LOCALESTOQ.CDPRODESTO
                             AND CDALMOXARIFE = V_CDALMOXARIFE
                             AND CDLOCALESTOQ = C_LOCALESTOQ.CDLOCALESTOQ);
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_CDPRODDIFE := NULL;
               END;

               -- Se nao existe outro produto na localizacao (rua)
               IF V_CDPRODDIFE IS NULL THEN

                  V_CDLOCALESTOQ := C_LOCALESTOQ.CDLOCALESTOQ;

                  -- Qtde de paletes do produto
                  V_QTDEPALETE := TRUNC((V_QTITEMPROD * V_FATOCONV) / C_LOCALESTOQ.VRCAPACPRODPAL);

                  -- Se a quantidade de paletes for superior ao disponivel e gerado a quantidade disponivel
                  IF (V_QTDEPALETE > (C_LOCALESTOQ.VRCAPACLOCEST - C_LOCALESTOQ.VRCAPACLOCUTIL)) THEN
                     V_QTDEPALETE := (C_LOCALESTOQ.VRCAPACLOCEST - C_LOCALESTOQ.VRCAPACLOCUTIL);
                  END IF;

                  IF (V_QTDEPALETE > 0) THEN
                     V_QTDELANCTO   := V_QTDEPALETE * C_LOCALESTOQ.VRCAPACPALETE;
                     V_VRTOTALANCTO := ((V_VRTOTAITEM - V_VRDESCITEM) * V_QTDELANCTO) / V_QTITEMPRODNF;

                     IF (V_IDNFRETIND = w_S) AND (V_QTDELANCTO > 0) THEN

                        SELECT (SUM(VRTOTAITEM) - SUM(VRDESCITEM)), ((SUM(VRBRUTITEM)/V_QTDELANCTO)/V_FATOCONV), (((SUM(VRCONTITEM))/V_QTDELANCTO)/V_FATOCONV)
                          INTO V_VRTOTALANCTO, V_TOTABRUT, V_TOTACONTAB
                          FROM ITEMPRODUTO
                         WHERE CDFILIAL   = P_FILIAL
                           AND NRLANCTONF = P_LANCTONF;

                        V_VRTOTALANCTO := (V_VRTOTALANCTO * V_QTDELANCTO) / V_QTITEMPRODNF;
                        V_TOTABRUT     := (V_TOTABRUT * V_QTDELANCTO) / V_QTITEMPRODNF;
                        V_TOTACONTAB   := (V_TOTACONTAB * V_QTDELANCTO) / V_QTITEMPRODNF;
                     END IF;

                     IF NOT(V_QTDELANCTO = 0) THEN
                        V_VRUNITLANCTO := V_VRTOTALANCTO/V_QTDELANCTO;
                     ELSE
                        V_VRUNITLANCTO := V_VRTOTALANCTO;
                     END IF;

                     V_COMPCUSTPROD := 'S';

                     IF (V_IDCOMPRABONI = 'S') THEN
                        SELECT NVL(MAX(IDCOMPOEVENC),'S')
                          INTO V_COMPCUSTPROD
                          FROM TPOPERCFOP
                         WHERE CDTIPOOPER   = P_TIPOOPER
                           AND IDENTRSAIDOP = 'E'
                           AND CDFISCOPER   = V_CDFISOPEITEM;
                     END IF;      

                     IF (P_TIPOOPER = '06') OR (V_IDBONIFICACAO = w_S) OR (V_COMPCUSTPROD = 'N') THEN
                        V_TOTABRUT   := 0;
                        V_TOTACONTAB := 0;
                        V_VRCUSTENTR := 0;
                     ELSE
                        IF NOT(V_IDNFRETIND = w_S) THEN
                           IF NOT(V_QTDELANCTO = 0) THEN
                              V_TOTABRUT   := (((V_VRBRUTITEM/V_QTDELANCTO)/V_FATOCONV) * V_QTDELANCTO) / V_QTITEMPRODNF;
                              V_TOTACONTAB := (((V_VRCONTITEM/V_QTDELANCTO)/V_FATOCONV) * V_QTDELANCTO) / V_QTITEMPRODNF;
                           ELSE
                              V_TOTABRUT   := ((V_VRBRUTITEM * V_QTDELANCTO) / V_QTITEMPRODNF);
                              V_TOTACONTAB := ((V_VRCONTITEM * V_QTDELANCTO) / V_QTITEMPRODNF);
                           END IF;
                           V_VRCUSTENTR := ((V_VRCONTITEM * V_QTDELANCTO) / V_QTITEMPRODNF);
                        ELSE
                           V_VRCUSTENTR := V_TOTACONTAB;
                        END IF;
                     END IF;

                     IF ((V_IDOPERDEVONF = W_S) OR ((V_IDOPERDEVOOL = W_S) AND (V_IDFUNCAOFILRECE = 'O'))) AND (V_IDUTCUSORIGEST = W_S) THEN
                        V_VRCUSTENTR := ROUND(CUSTO_PRODUTO_LCEST(V_CDFILIRECE, V_CDPRODESTO, V_CDTIPCUSTEST, P_INIVALID,
                                                                  V_DTATUAL, V_CDALMOXARIFE, V_CDLOCALESTOQ,
                                                                  V_NRLOTEESTQ, V_NRSUBLOTE), 5);

                        V_VRCUSTENTRDEVB := ROUND(CUSTO_PRODUTO_LCEST(V_CDFILIRECE, V_CDPRODESTO, V_CDTIPCUSTEST + 1, P_INIVALID,
                                                                      V_DTATUAL, V_CDALMOXARIFE, V_CDLOCALESTOQ,
                                                                      V_NRLOTEESTQ, V_NRSUBLOTE), 5);

                        IF V_VRCUSTENTRDEVB <= 0 THEN
                           V_VRCUSTENTRDEVB := V_VRCUSTENTR;
                        END IF;

                        IF V_VRCUSTENTR = 0 THEN
                           V_TOTABRUT   := V_VRUNITITEM;
                           V_TOTACONTAB := V_VRUNITITEM;
                        ELSE
                           V_TOTABRUT   := V_VRCUSTENTRDEVB;
                           V_TOTACONTAB := V_VRCUSTENTR;
                        END IF;
                     END IF;

                     IF V_IDORIGDESTNF = W_L THEN
                        BEGIN
                           SELECT CDFORNOPELOG
                             INTO V_CDFORNECED
                             FROM FILIAL
                            WHERE CDFILIAL = V_CDFILIEMIT;
                        EXCEPTION
                           WHEN NO_DATA_FOUND THEN
                              V_CDFORNECED := NULL;
                        END;
                     END IF;

                     SELECT NVL(MAX(X.VRPESOBRUTPR),0), NVL(MAX(VRPECUSTOLOG),0), NVL(MAX(VRVRCUSTOLOG),0), NVL(MAX(VRPESEGURLOG),0)
                       INTO V_VRPESOBRUTPR, V_VRPECUSTOLOG, V_VRVRCUSTOLOG, V_VRPESEGURLOG
                       FROM PRODUTO P, CUSTOLOGIST C,
                           (SELECT NVL(MAX(A.VRPESOBRUTPR),0) VRPESOBRUTPR,
                                   MAX(P.CDARVPROD) CDPRODUTO, MAX(C.DTINIVIGCLOG) DTINIVIGCLOG
                              FROM PRODUTO P, CUSTOLOGIST C, PRODUTO A
                             WHERE INSTR(A.CDARVPROD, P.CDARVPROD) = 1
                               AND A.CDPRODUTO    = V_CDPRODUTO
                               AND P.CDPRODUTO    = C.CDPRODUTO
                               AND C.CDFILIAL     = V_CDFILIMOVI
                               AND C.CDFORNECED   = V_CDFORNECED
                               AND C.DTINIVIGCLOG = (SELECT MAX(DTINIVIGCLOG)
                                                       FROM CUSTOLOGIST A, PRODUTO B, PRODUTO Q
                                                      WHERE A.CDFILIAL     = C.CDFILIAL
                                                        AND A.CDFORNECED   = C.CDFORNECED
                                                        AND INSTR(B.CDARVPROD, Q.CDARVPROD) = 1
                                                        AND B.CDPRODUTO    = V_CDPRODUTO
                                                        AND Q.CDPRODUTO    = A.CDPRODUTO
                                                        AND A.DTINIVIGCLOG <= P_INIVALID)) X
                      WHERE C.CDFILIAL     = V_CDFILIMOVI
                        AND C.CDPRODUTO    = P.CDPRODUTO
                        AND C.CDPRODUTO    = X.CDPRODUTO
                        AND C.CDFORNECED   = V_CDFORNECED
                        AND C.DTINIVIGCLOG = X.DTINIVIGCLOG;

                     V_VRCUSTOLOG := 0;
                     V_VRCUSTOSEG := 0;

                     IF (V_VRVRCUSTOLOG > 0) AND (V_VRPESOBRUTPR > 0) THEN
                        V_VRCUSTOLOG := (V_QTDELANCTO * V_VRPESOBRUTPR) * V_VRVRCUSTOLOG;
                     END IF;

                     IF (V_VRPECUSTOLOG > 0) THEN
                        V_VRCUSTOLOG := (V_VRTOTAITEM * V_VRPECUSTOLOG) / 100;
                     END IF;

                     IF (V_VRPESEGURLOG > 0) THEN
                        V_VRCUSTOSEG := (V_VRTOTAITEM * V_VRPESEGURLOG) / 100;
                     END IF;

                     BEGIN
                        SELECT LPAD(NVL(MAX(NRSEQUITEM),0) + 1,4, W_0)
                          INTO V_NRSEQUITEM
                          FROM ITLANCTOEST
                         WHERE CDFILIAL   = P_FILIAL
                           AND NRLANCESTQ = P_LANCESTQ;
                     EXCEPTION
                        WHEN NO_DATA_FOUND THEN
                            V_NRSEQUITEM := '0001';
                     END;

                     INSERT INTO ITLANCTOEST
                        (CDFILIAL,     NRLANCESTQ, NRSEQUITEM,     CDPRODUTO,     QTTOTLANCTO, VRUNILANCTO,  VRTOTLANCTO,
                         IDTIPOMOVI,   DTLANCMOVI, IDORDEMCLC,     CDPRODMOVI,    QTLANCTOEST, VRLANCTOBRUT, VRLANCTOEST,
                         VRCUSTENTR,   CDFILIMOVI, CDALMOXARIFE,   CDLOCALESTOQ,  NRLOTEESTQ,  NRSUBLOTE,    NRLANCORIGRP,
                         VRCUSTLOGLAN, VRSEGULOGLAN, IDORIGEMPROD, CDSITUTRIBEST, VRICMSCOMPL, VRSTCOMPL,    VRFECPSTCOMPL)
                     VALUES
                        (P_FILIAL,     P_LANCESTQ,   V_NRSEQUITEM, C_LOCALESTOQ.CDPRODUTO, V_QTDELANCTO, V_VRUNITLANCTO, V_VRTOTALANCTO,
                         P_IDTIPOMOVI, P_INIVALID,   W_2, C_LOCALESTOQ.CDPRODESTO, (V_QTDELANCTO * V_FATOCONV), V_TOTABRUT, V_TOTACONTAB,
                         V_VRCUSTENTR, V_CDFILIRECE, V_CDALMOXARIFE, V_CDLOCALESTOQ, V_NRLOTEESTQ, V_NRSUBLOTE, V_IDDOCREPLIC,
                         V_VRCUSTOLOG, V_VRCUSTOSEG, V_IDORIGEMPROD, V_CDSITUTRIBPR, V_VRICMSCOMPL, V_VRSTCOMPL, V_VRFECPSTCOMPL);

                     V_QTITEMPROD := V_QTITEMPROD - V_QTDELANCTO;

                     -- Atualiza a quantidade de paletes utilizados na localizacao (rua)
                     UPDATE LOCALESTOQUE
                        SET VRCAPACLOCUTIL = NVL(VRCAPACLOCUTIL,0) + V_QTDEPALETE
                      WHERE CDFILIAL     = V_CDFILIRECE
                        AND CDALMOXARIFE = V_CDALMOXARIFE
                        AND CDLOCALESTOQ = V_CDLOCALESTOQ;

                     -- Se possuir quantidade e se a localizacao tiver palete disponivel
                     IF V_QTITEMPROD > 0 THEN
                        BEGIN
                           SELECT VRCAPACLOCEST - NVL(VRCAPACLOCUTIL,0)
                             INTO V_LOCDISPONIVEL
                             FROM LOCALESTOQUE
                            WHERE CDFILIAL     = V_CDFILIRECE
                              AND CDALMOXARIFE = V_CDALMOXARIFE
                              AND CDLOCALESTOQ = V_CDLOCALESTOQ;
                        EXCEPTION
                           WHEN NO_DATA_FOUND THEN
                               V_LOCDISPONIVEL := 0;
                        END;

                        IF V_LOCDISPONIVEL > 0 THEN

                           V_IDESTPRODDESMEMB := C_LOCALESTOQ.IDESTPRODDESMEMB;
                           V_CDPRODUTODESMEMB := C_LOCALESTOQ.CDPRODUTO;
                           V_CDPRODESTDESMEMB := C_LOCALESTOQ.CDPRODESTO;

                           -- Insere quantidade restante (seja desmembrada ou nao)
                           V_QTDELANCTO  := V_QTITEMPROD;
                           V_QTLANCESTQ  := V_QTDELANCTO * V_FATOCONV;

                           V_VRTOTALANCTO := ((V_VRTOTAITEM - V_VRDESCITEM) * V_QTDELANCTO) / V_QTITEMPRODNF;

                           IF (V_IDNFRETIND = w_S) AND (V_QTDELANCTO > 0) THEN

                              SELECT (SUM(VRTOTAITEM) - SUM(VRDESCITEM)), ((SUM(VRBRUTITEM)/V_QTDELANCTO)/V_FATOCONV), (((SUM(VRCONTITEM))/V_QTDELANCTO)/V_FATOCONV)
                                INTO V_VRTOTALANCTO, V_TOTABRUT, V_TOTACONTAB
                                FROM ITEMPRODUTO
                               WHERE CDFILIAL   = P_FILIAL
                                 AND NRLANCTONF = P_LANCTONF;

                              V_VRTOTALANCTO := (V_VRTOTALANCTO * V_QTDELANCTO) / V_QTITEMPRODNF;
                              V_TOTABRUT     := (V_TOTABRUT * V_QTDELANCTO) / V_QTITEMPRODNF;
                              V_TOTACONTAB   := (V_TOTACONTAB * V_QTDELANCTO) / V_QTITEMPRODNF;
                           END IF;

                           IF NOT(V_QTDELANCTO = 0) THEN
                              V_VRUNITLANCTO := V_VRTOTALANCTO/V_QTDELANCTO;
                           ELSE
                              V_VRUNITLANCTO := V_VRTOTALANCTO;
                           END IF;

                           V_COMPCUSTPROD := 'S';

                           IF (V_IDCOMPRABONI = 'S') THEN
                              SELECT NVL(MAX(IDCOMPOEVENC),'S')
                                INTO V_COMPCUSTPROD
                                FROM TPOPERCFOP
                               WHERE CDTIPOOPER   = P_TIPOOPER
                                 AND IDENTRSAIDOP = 'E'
                                 AND CDFISCOPER   = V_CDFISOPEITEM;
                           END IF;

                           IF (P_TIPOOPER = '06') OR (V_IDBONIFICACAO = w_S) OR (V_COMPCUSTPROD = 'N') THEN
                              V_TOTABRUT   := 0;
                              V_TOTACONTAB := 0;
                              V_VRCUSTENTR := 0;
                           ELSE
                              IF NOT(V_IDNFRETIND = w_S) THEN
                                 IF NOT(V_QTDELANCTO = 0) THEN
                                    V_TOTABRUT   := (((V_VRBRUTITEM/V_QTDELANCTO)/V_FATOCONV) * V_QTDELANCTO) / V_QTITEMPRODNF;
                                    V_TOTACONTAB := (((V_VRCONTITEM/V_QTDELANCTO)/V_FATOCONV) * V_QTDELANCTO) / V_QTITEMPRODNF;
                                 ELSE
                                    V_TOTABRUT   := ((V_VRBRUTITEM * V_QTDELANCTO) / V_QTITEMPRODNF);
                                    V_TOTACONTAB := ((V_VRCONTITEM * V_QTDELANCTO) / V_QTITEMPRODNF);
                                 END IF;
                                 V_VRCUSTENTR := ((V_VRCONTITEM * V_QTDELANCTO) / V_QTITEMPRODNF);
                              ELSE
                                 V_VRCUSTENTR := V_TOTACONTAB;
                              END IF;
                           END IF;

                           IF ((V_IDOPERDEVONF = W_S) OR ((V_IDOPERDEVOOL = W_S) AND (V_IDFUNCAOFILRECE = 'O'))) AND (V_IDUTCUSORIGEST = W_S) THEN
                              V_VRCUSTENTR := ROUND(CUSTO_PRODUTO_LCEST(V_CDFILIRECE, V_CDPRODESTO, V_CDTIPCUSTEST, P_INIVALID,
                                                                        V_DTATUAL, V_CDALMOXARIFE, V_CDLOCALESTOQ,
                                                                        V_NRLOTEESTQ, V_NRSUBLOTE), 5);

                              V_VRCUSTENTRDEVB := ROUND(CUSTO_PRODUTO_LCEST(V_CDFILIRECE, V_CDPRODESTO, V_CDTIPCUSTEST + 1, P_INIVALID,
                                                                            V_DTATUAL, V_CDALMOXARIFE, V_CDLOCALESTOQ,
                                                                            V_NRLOTEESTQ, V_NRSUBLOTE), 5);

                              IF V_VRCUSTENTRDEVB <= 0 THEN
                                 V_VRCUSTENTRDEVB := V_VRCUSTENTR;
                              END IF;

                              IF V_VRCUSTENTR = 0 THEN
                                 V_TOTABRUT   := V_VRUNITITEM;
                                 V_TOTACONTAB := V_VRUNITITEM;
                              ELSE
                                 V_TOTABRUT   := V_VRCUSTENTRDEVB;
                                 V_TOTACONTAB := V_VRCUSTENTR;
                              END IF;
                           END IF;

                           IF V_IDORIGDESTNF = W_L THEN
                              BEGIN
                                 SELECT CDFORNOPELOG
                                   INTO V_CDFORNECED
                                   FROM FILIAL
                                  WHERE CDFILIAL = V_CDFILIEMIT;
                              EXCEPTION
                                 WHEN NO_DATA_FOUND THEN
                                    V_CDFORNECED := NULL;
                              END;
                           END IF;

                           SELECT NVL(MAX(X.VRPESOBRUTPR),0), NVL(MAX(VRPECUSTOLOG),0), NVL(MAX(VRVRCUSTOLOG),0), NVL(MAX(VRPESEGURLOG),0)
                             INTO V_VRPESOBRUTPR, V_VRPECUSTOLOG, V_VRVRCUSTOLOG, V_VRPESEGURLOG
                             FROM PRODUTO P, CUSTOLOGIST C,
                                 (SELECT NVL(MAX(A.VRPESOBRUTPR),0) VRPESOBRUTPR,
                                         MAX(P.CDARVPROD) CDPRODUTO, MAX(C.DTINIVIGCLOG) DTINIVIGCLOG
                                    FROM PRODUTO P, CUSTOLOGIST C, PRODUTO A
                                   WHERE INSTR(A.CDARVPROD, P.CDARVPROD) = 1
                                     AND A.CDPRODUTO    = V_CDPRODUTO
                                     AND P.CDPRODUTO    = C.CDPRODUTO
                                     AND C.CDFILIAL     = V_CDFILIMOVI
                                     AND C.CDFORNECED   = V_CDFORNECED
                                     AND C.DTINIVIGCLOG = (SELECT MAX(DTINIVIGCLOG)
                                                             FROM CUSTOLOGIST A, PRODUTO B, PRODUTO Q
                                                            WHERE A.CDFILIAL     = C.CDFILIAL
                                                              AND A.CDFORNECED   = C.CDFORNECED
                                                              AND INSTR(B.CDARVPROD, Q.CDARVPROD) = 1
                                                              AND B.CDPRODUTO    = V_CDPRODUTO
                                                              AND Q.CDPRODUTO    = A.CDPRODUTO
                                                              AND A.DTINIVIGCLOG <= P_INIVALID)) X
                            WHERE C.CDFILIAL     = V_CDFILIMOVI
                              AND C.CDPRODUTO    = P.CDPRODUTO
                              AND C.CDPRODUTO    = X.CDPRODUTO
                              AND C.CDFORNECED   = V_CDFORNECED
                              AND C.DTINIVIGCLOG = X.DTINIVIGCLOG;

                           V_VRCUSTOLOG := 0;
                           V_VRCUSTOSEG := 0;

                           IF (V_VRVRCUSTOLOG > 0) AND (V_VRPESOBRUTPR > 0) THEN
                              V_VRCUSTOLOG := (V_QTDELANCTO * V_VRPESOBRUTPR) * V_VRVRCUSTOLOG;
                           END IF;

                           IF (V_VRPECUSTOLOG > 0) THEN
                              V_VRCUSTOLOG := (V_VRTOTAITEM * V_VRPECUSTOLOG) / 100;
                           END IF;

                           IF (V_VRPESEGURLOG > 0) THEN
                              V_VRCUSTOSEG := (V_VRTOTAITEM * V_VRPESEGURLOG) / 100;
                           END IF;

                           BEGIN
                              SELECT LPAD(NVL(MAX(NRSEQUITEM),0) + 1,4, W_0)
                                INTO V_NRSEQUITEM
                                FROM ITLANCTOEST
                               WHERE CDFILIAL   = P_FILIAL
                                 AND NRLANCESTQ = P_LANCESTQ;
                           EXCEPTION
                              WHEN NO_DATA_FOUND THEN
                                  V_NRSEQUITEM := '0001';
                           END;

                           -- Se produto utiliza estoque desmembrado
                           IF V_IDESTPRODDESMEMB = W_S THEN
                              V_CDPRODUTODESMEMB := V_CDPRODESTDESMEMB;           -- movimentara o produto de estoque
                              V_CDLOCALESTOQ     := V_CDLOCALESTDESM;             -- local de estoque referente a desmembrado
                              V_QTDELANCTO       := V_QTDELANCTO * V_FATOCONV;
                              V_VRUNITLANCTO     := V_VRUNITLANCTO / V_FATOCONV;
                           END IF;

                           INSERT INTO ITLANCTOEST
                              (CDFILIAL,     NRLANCESTQ, NRSEQUITEM,   CDPRODUTO,    QTTOTLANCTO, VRUNILANCTO,  VRTOTLANCTO,
                               IDTIPOMOVI,   DTLANCMOVI, IDORDEMCLC,   CDPRODMOVI,   QTLANCTOEST, VRLANCTOBRUT, VRLANCTOEST,
                               VRCUSTENTR,   CDFILIMOVI, CDALMOXARIFE, CDLOCALESTOQ, NRLOTEESTQ,  NRSUBLOTE,    NRLANCORIGRP,
                               VRCUSTLOGLAN, VRSEGULOGLAN, IDORIGEMPROD, CDSITUTRIBEST, VRICMSCOMPL, VRSTCOMPL,    VRFECPSTCOMPL)
                           VALUES
                              (P_FILIAL,     P_LANCESTQ,   V_NRSEQUITEM, V_CDPRODUTODESMEMB, V_QTDELANCTO, V_VRUNITLANCTO, V_VRTOTALANCTO,
                               P_IDTIPOMOVI, P_INIVALID,   W_2, V_CDPRODESTDESMEMB, V_QTLANCESTQ, V_TOTABRUT, V_TOTACONTAB,
                               V_VRCUSTENTR, V_CDFILIRECE, V_CDALMOXARIFE, V_CDLOCALESTOQ, V_NRLOTEESTQ, V_NRSUBLOTE, V_IDDOCREPLIC,
                               V_VRCUSTOLOG, V_VRCUSTOSEG, V_IDORIGEMPROD, V_CDSITUTRIBPR, V_VRICMSCOMPL, V_VRSTCOMPL, V_VRFECPSTCOMPL);

                              V_QTITEMPROD := V_QTITEMPROD - V_QTDELANCTO;

                           -- Atualiza a quantidade de paletes utilizados na localizacao (rua) para localizacao nao desmembrada
                           IF V_IDESTPRODDESMEMB <> W_S THEN
                              UPDATE LOCALESTOQUE
                                 SET VRCAPACLOCUTIL = NVL(VRCAPACLOCUTIL,0) + 1
                               WHERE CDFILIAL     = V_CDFILIRECE
                                 AND CDALMOXARIFE = V_CDALMOXARIFE
                                 AND CDLOCALESTOQ = V_CDLOCALESTOQ;
                           END IF;
                        END IF;
                     END IF;
                  ELSE
                     V_IDESTPRODDESMEMB := C_LOCALESTOQ.IDESTPRODDESMEMB;
                     V_CDPRODUTODESMEMB := C_LOCALESTOQ.CDPRODUTO;
                     V_CDPRODESTDESMEMB := C_LOCALESTOQ.CDPRODESTO;

                     EXIT;
                  END IF;
               END IF;

               V_IDESTPRODDESMEMB := C_LOCALESTOQ.IDESTPRODDESMEMB;
               V_CDPRODUTODESMEMB := C_LOCALESTOQ.CDPRODUTO;
               V_CDPRODESTDESMEMB := C_LOCALESTOQ.CDPRODESTO;
            END LOOP;

            -- Insere quantidade restante (seja desmembrada ou nao)
            V_QTDELANCTO  := V_QTITEMPROD;
            V_QTLANCESTQ  := V_QTDELANCTO * V_FATOCONV;

            IF V_QTDELANCTO > 0 THEN

               V_VRTOTALANCTO := ((V_VRTOTAITEM - V_VRDESCITEM) * V_QTDELANCTO) / V_QTITEMPRODNF;

               IF (V_IDNFRETIND = w_S) AND (V_QTDELANCTO > 0) THEN

                  SELECT (SUM(VRTOTAITEM) - SUM(VRDESCITEM)), ((SUM(VRBRUTITEM)/V_QTDELANCTO)/V_FATOCONV), (((SUM(VRCONTITEM))/V_QTDELANCTO)/V_FATOCONV)
                    INTO V_VRTOTALANCTO, V_TOTABRUT, V_TOTACONTAB
                    FROM ITEMPRODUTO
                   WHERE CDFILIAL   = P_FILIAL
                     AND NRLANCTONF = P_LANCTONF;

                  V_VRTOTALANCTO := (V_VRTOTALANCTO * V_QTDELANCTO) / V_QTITEMPRODNF;
                  V_TOTABRUT     := (V_TOTABRUT * V_QTDELANCTO) / V_QTITEMPRODNF;
                  V_TOTACONTAB   := (V_TOTACONTAB * V_QTDELANCTO) / V_QTITEMPRODNF;
               END IF;

               IF NOT(V_QTDELANCTO = 0) THEN
                  V_VRUNITLANCTO := V_VRTOTALANCTO/V_QTDELANCTO;
               ELSE
                  V_VRUNITLANCTO := V_VRTOTALANCTO;
               END IF;

               V_COMPCUSTPROD := 'S';

               IF (V_IDCOMPRABONI = 'S') THEN
                  SELECT NVL(MAX(IDCOMPOEVENC),'S')
                    INTO V_COMPCUSTPROD
                    FROM TPOPERCFOP
                   WHERE CDTIPOOPER   = P_TIPOOPER
                     AND IDENTRSAIDOP = 'E'
                     AND CDFISCOPER   = V_CDFISOPEITEM;
               END IF;

               IF (P_TIPOOPER = '06') OR (V_IDBONIFICACAO = w_S) OR (V_COMPCUSTPROD = 'N') THEN
                  V_TOTABRUT   := 0;
                  V_TOTACONTAB := 0;
                  V_VRCUSTENTR := 0;
               ELSE
                  IF NOT(V_IDNFRETIND = w_S) THEN
                     IF NOT(V_QTDELANCTO = 0) THEN
                        V_TOTABRUT   := (((V_VRBRUTITEM/V_QTDELANCTO)/V_FATOCONV) * V_QTDELANCTO) / V_QTITEMPRODNF;
                        V_TOTACONTAB := (((V_VRCONTITEM/V_QTDELANCTO)/V_FATOCONV) * V_QTDELANCTO) / V_QTITEMPRODNF;
                     ELSE
                        V_TOTABRUT   := ((V_VRBRUTITEM * V_QTDELANCTO) / V_QTITEMPRODNF);
                        V_TOTACONTAB := ((V_VRCONTITEM * V_QTDELANCTO) / V_QTITEMPRODNF);
                     END IF;
                     V_VRCUSTENTR := ((V_VRCONTITEM * V_QTDELANCTO) / V_QTITEMPRODNF);
                  ELSE
                     V_VRCUSTENTR := V_TOTACONTAB;
                  END IF;
               END IF;

               IF ((V_IDOPERDEVONF = W_S) OR ((V_IDOPERDEVOOL = W_S) AND (V_IDFUNCAOFILRECE = 'O'))) AND (V_IDUTCUSORIGEST = W_S) THEN
                  V_VRCUSTENTR := ROUND(CUSTO_PRODUTO_LCEST(V_CDFILIRECE, V_CDPRODESTO, V_CDTIPCUSTEST, P_INIVALID,
                                                            V_DTATUAL, V_CDALMOXARIFE, V_CDLOCALESTOQ,
                                                            V_NRLOTEESTQ, V_NRSUBLOTE), 5);

                  V_VRCUSTENTRDEVB := ROUND(CUSTO_PRODUTO_LCEST(V_CDFILIRECE, V_CDPRODESTO, V_CDTIPCUSTEST + 1, P_INIVALID,
                                                                V_DTATUAL, V_CDALMOXARIFE, V_CDLOCALESTOQ,
                                                                V_NRLOTEESTQ, V_NRSUBLOTE), 5);

                  IF V_VRCUSTENTRDEVB <= 0 THEN
                     V_VRCUSTENTRDEVB := V_VRCUSTENTR;
                  END IF;

                  IF V_VRCUSTENTR = 0 THEN
                     V_TOTABRUT   := V_VRUNITITEM;
                     V_TOTACONTAB := V_VRUNITITEM;
                  ELSE
                     V_TOTABRUT   := V_VRCUSTENTRDEVB;
                     V_TOTACONTAB := V_VRCUSTENTR;
                  END IF;
               END IF;

               IF V_IDORIGDESTNF = W_L THEN
                  BEGIN
                     SELECT CDFORNOPELOG
                       INTO V_CDFORNECED
                       FROM FILIAL
                      WHERE CDFILIAL = V_CDFILIEMIT;
                  EXCEPTION
                     WHEN NO_DATA_FOUND THEN
                        V_CDFORNECED := NULL;
                  END;
               END IF;

               SELECT NVL(MAX(X.VRPESOBRUTPR),0), NVL(MAX(VRPECUSTOLOG),0), NVL(MAX(VRVRCUSTOLOG),0), NVL(MAX(VRPESEGURLOG),0)
                 INTO V_VRPESOBRUTPR, V_VRPECUSTOLOG, V_VRVRCUSTOLOG, V_VRPESEGURLOG
                 FROM PRODUTO P, CUSTOLOGIST C,
                     (SELECT NVL(MAX(A.VRPESOBRUTPR),0) VRPESOBRUTPR,
                             MAX(P.CDARVPROD) CDPRODUTO, MAX(C.DTINIVIGCLOG) DTINIVIGCLOG
                        FROM PRODUTO P, CUSTOLOGIST C, PRODUTO A
                       WHERE INSTR(A.CDARVPROD, P.CDARVPROD) = 1
                         AND A.CDPRODUTO    = V_CDPRODUTO
                         AND P.CDPRODUTO    = C.CDPRODUTO
                         AND C.CDFILIAL     = V_CDFILIMOVI
                         AND C.CDFORNECED   = V_CDFORNECED
                         AND C.DTINIVIGCLOG = (SELECT MAX(DTINIVIGCLOG)
                                                 FROM CUSTOLOGIST A, PRODUTO B, PRODUTO Q
                                                WHERE A.CDFILIAL     = C.CDFILIAL
                                                  AND A.CDFORNECED   = C.CDFORNECED
                                                  AND INSTR(B.CDARVPROD, Q.CDARVPROD) = 1
                                                  AND B.CDPRODUTO    = V_CDPRODUTO
                                                  AND Q.CDPRODUTO    = A.CDPRODUTO
                                                  AND A.DTINIVIGCLOG <= P_INIVALID)) X
                WHERE C.CDFILIAL     = V_CDFILIMOVI
                  AND C.CDPRODUTO    = P.CDPRODUTO
                  AND C.CDPRODUTO    = X.CDPRODUTO
                  AND C.CDFORNECED   = V_CDFORNECED
                  AND C.DTINIVIGCLOG = X.DTINIVIGCLOG;

               V_VRCUSTOLOG := 0;
               V_VRCUSTOSEG := 0;

               IF (V_VRVRCUSTOLOG > 0) AND (V_VRPESOBRUTPR > 0) THEN
                  V_VRCUSTOLOG := (V_QTDELANCTO * V_VRPESOBRUTPR) * V_VRVRCUSTOLOG;
               END IF;

               IF (V_VRPECUSTOLOG > 0) THEN
                  V_VRCUSTOLOG := (V_VRTOTAITEM * V_VRPECUSTOLOG) / 100;
               END IF;

               IF (V_VRPESEGURLOG > 0) THEN
                  V_VRCUSTOSEG := (V_VRTOTAITEM * V_VRPESEGURLOG) / 100;
               END IF;

               BEGIN
                  SELECT LPAD(NVL(MAX(NRSEQUITEM),0) + 1,4, W_0)
                    INTO V_NRSEQUITEM
                    FROM ITLANCTOEST
                   WHERE CDFILIAL   = P_FILIAL
                     AND NRLANCESTQ = P_LANCESTQ;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                      V_NRSEQUITEM := '0001';
               END;

               -- Se produto utiliza estoque desmembrado
               IF V_IDESTPRODDESMEMB = W_S THEN
                  V_CDPRODUTODESMEMB := V_CDPRODESTDESMEMB;           -- movimentara o produto de estoque
                  V_CDLOCALESTOQ     := V_CDLOCALESTDESM;             -- local de estoque referente a desmembrado
                  V_QTDELANCTO       := V_QTDELANCTO * V_FATOCONV;
                  V_VRUNITLANCTO     := V_VRUNITLANCTO / V_FATOCONV;
               END IF;

               INSERT INTO ITLANCTOEST
                  (CDFILIAL,     NRLANCESTQ, NRSEQUITEM,   CDPRODUTO,    QTTOTLANCTO, VRUNILANCTO,  VRTOTLANCTO,
                   IDTIPOMOVI,   DTLANCMOVI, IDORDEMCLC,   CDPRODMOVI,   QTLANCTOEST, VRLANCTOBRUT, VRLANCTOEST,
                   VRCUSTENTR,   CDFILIMOVI, CDALMOXARIFE, CDLOCALESTOQ, NRLOTEESTQ,  NRSUBLOTE,    NRLANCORIGRP,
                   VRCUSTLOGLAN, VRSEGULOGLAN, IDORIGEMPROD, CDSITUTRIBEST, VRICMSCOMPL, VRSTCOMPL,    VRFECPSTCOMPL)
               VALUES
                  (P_FILIAL,     P_LANCESTQ,   V_NRSEQUITEM, V_CDPRODUTODESMEMB, V_QTDELANCTO, V_VRUNITLANCTO, V_VRTOTALANCTO,
                   P_IDTIPOMOVI, P_INIVALID,   W_2, V_CDPRODESTDESMEMB, V_QTLANCESTQ, V_TOTABRUT, V_TOTACONTAB,
                   V_VRCUSTENTR, V_CDFILIRECE, V_CDALMOXARIFE, V_CDLOCALESTOQ, V_NRLOTEESTQ, V_NRSUBLOTE, V_IDDOCREPLIC,
                   V_VRCUSTOLOG, V_VRCUSTOSEG, V_IDORIGEMPROD, V_CDSITUTRIBPR, V_VRICMSCOMPL, V_VRSTCOMPL, V_VRFECPSTCOMPL);

               -- Atualiza a quantidade de paletes utilizados na localizacao (rua) para localizacao nao desmembrada
               IF V_IDESTPRODDESMEMB <> W_S THEN
                  UPDATE LOCALESTOQUE
                     SET VRCAPACLOCUTIL = NVL(VRCAPACLOCUTIL,0) + 1
                   WHERE CDFILIAL     = V_CDFILIRECE
                     AND CDALMOXARIFE = V_CDALMOXARIFE
                     AND CDLOCALESTOQ = V_CDLOCALESTOQ;
               END IF;
            END IF;
         -- Nao utiliza controle gestao de estoque e distribuicao
         ELSE
            IF (P_IDTIPOMOVI <> W_0) THEN
               V_QTDELANCTO   := V_QTITEMPRODNF;
               V_VRTOTALANCTO := (V_VRTOTAITEM - V_VRDESCITEM);

               IF (V_IDNFRETIND = w_S) AND (V_QTDELANCTO > 0) THEN

                  SELECT (SUM(VRTOTAITEM) - SUM(VRDESCITEM)), ((SUM(VRBRUTITEM)/V_QTDELANCTO)/V_FATOCONV), (((SUM(VRCONTITEM))/V_QTDELANCTO)/V_FATOCONV)
                    INTO V_VRTOTALANCTO, V_TOTABRUT, V_TOTACONTAB
                    FROM ITEMPRODUTO
                   WHERE CDFILIAL   = P_FILIAL
                     AND NRLANCTONF = P_LANCTONF;
               END IF;

               IF NOT(V_QTDELANCTO = 0) THEN
                  V_VRUNITLANCTO := V_VRTOTALANCTO/V_QTDELANCTO;
               ELSE
                  V_VRUNITLANCTO := V_VRTOTALANCTO;
               END IF;


               V_COMPCUSTPROD := 'S';

               IF (V_IDCOMPRABONI = 'S') THEN
                  SELECT NVL(MAX(IDCOMPOEVENC),'S')
                    INTO V_COMPCUSTPROD
                    FROM TPOPERCFOP
                   WHERE CDTIPOOPER   = P_TIPOOPER
                     AND IDENTRSAIDOP = 'E'
                     AND CDFISCOPER   = V_CDFISOPEITEM;
               END IF;

               IF (P_TIPOOPER = '06') OR (V_IDBONIFICACAO = w_S) OR (V_COMPCUSTPROD = 'N') THEN
                  V_TOTABRUT   := 0;
                  V_TOTACONTAB := 0;
                  V_VRCUSTENTR := 0;
               ELSE
                  IF NOT(V_IDNFRETIND = w_S) THEN
                     IF NOT(V_QTDELANCTO = 0) THEN
                        V_TOTABRUT   := (V_VRBRUTITEM/V_QTDELANCTO)/V_FATOCONV;
                        V_TOTACONTAB := (V_VRCONTITEM/V_QTDELANCTO)/V_FATOCONV;
                     ELSE
                        V_TOTABRUT   := V_VRBRUTITEM;
                        V_TOTACONTAB := V_VRCONTITEM;
                     END IF;
                     V_VRCUSTENTR := V_VRCONTITEM;
                  ELSE
                     V_VRCUSTENTR := V_TOTACONTAB;
                  END IF;
               END IF;

               IF ((V_IDOPERDEVONF = W_S) OR ((V_IDOPERDEVOOL = W_S) AND (V_IDFUNCAOFILRECE = 'O'))) AND (V_IDUTCUSORIGEST = W_S) THEN
                  V_VRCUSTENTR := ROUND(CUSTO_PRODUTO_LCEST(V_CDFILIRECE, V_CDPRODESTO, V_CDTIPCUSTEST, P_INIVALID,
                                                            V_DTATUAL, V_CDALMOXARIFE, V_CDLOCALESTOQ,
                                                            V_NRLOTEESTQ, V_NRSUBLOTE), 5);

                  V_VRCUSTENTRDEVB := ROUND(CUSTO_PRODUTO_LCEST(V_CDFILIRECE, V_CDPRODESTO, V_CDTIPCUSTEST + 1, P_INIVALID,
                                                                V_DTATUAL, V_CDALMOXARIFE, V_CDLOCALESTOQ,
                                                                V_NRLOTEESTQ, V_NRSUBLOTE), 5);

                  IF V_VRCUSTENTRDEVB <= 0 THEN
                     V_VRCUSTENTRDEVB := V_VRCUSTENTR;
                  END IF;

                  IF V_VRCUSTENTR = 0 THEN
                     V_TOTABRUT   := V_VRUNITITEM;
                     V_TOTACONTAB := V_VRUNITITEM;
                  ELSE
                     V_TOTABRUT   := V_VRCUSTENTRDEVB;
                     V_TOTACONTAB := V_VRCUSTENTR;
                  END IF;
               END IF;

               IF V_IDORIGDESTNF = W_L THEN
                  BEGIN
                     SELECT CDFORNOPELOG
                       INTO V_CDFORNECED
                       FROM FILIAL
                      WHERE CDFILIAL = V_CDFILIEMIT;
                  EXCEPTION
                     WHEN NO_DATA_FOUND THEN
                        V_CDFORNECED := NULL;
                  END;
               END IF;

               SELECT NVL(MAX(X.VRPESOBRUTPR),0), NVL(MAX(VRPECUSTOLOG),0), NVL(MAX(VRVRCUSTOLOG),0), NVL(MAX(VRPESEGURLOG),0)
                 INTO V_VRPESOBRUTPR, V_VRPECUSTOLOG, V_VRVRCUSTOLOG, V_VRPESEGURLOG
                 FROM PRODUTO P, CUSTOLOGIST C,
                     (SELECT NVL(MAX(A.VRPESOBRUTPR),0) VRPESOBRUTPR,
                             MAX(P.CDARVPROD) CDPRODUTO, MAX(C.DTINIVIGCLOG) DTINIVIGCLOG
                        FROM PRODUTO P, CUSTOLOGIST C, PRODUTO A
                       WHERE INSTR(A.CDARVPROD, P.CDARVPROD) = 1
                         AND A.CDPRODUTO    = V_CDPRODUTO
                         AND P.CDPRODUTO    = C.CDPRODUTO
                         AND C.CDFILIAL     = V_CDFILIMOVI
                         AND C.CDFORNECED   = V_CDFORNECED
                         AND C.DTINIVIGCLOG = (SELECT MAX(DTINIVIGCLOG)
                                                 FROM CUSTOLOGIST A, PRODUTO B, PRODUTO Q
                                                WHERE A.CDFILIAL     = C.CDFILIAL
                                                  AND A.CDFORNECED   = C.CDFORNECED
                                                  AND INSTR(B.CDARVPROD, Q.CDARVPROD) = 1
                                                  AND B.CDPRODUTO    = V_CDPRODUTO
                                                  AND Q.CDPRODUTO    = A.CDPRODUTO
                                                  AND A.DTINIVIGCLOG <= P_INIVALID)) X
                WHERE C.CDFILIAL     = V_CDFILIMOVI
                  AND C.CDPRODUTO    = P.CDPRODUTO
                  AND C.CDPRODUTO    = X.CDPRODUTO
                  AND C.CDFORNECED   = V_CDFORNECED
                  AND C.DTINIVIGCLOG = X.DTINIVIGCLOG;

               V_VRCUSTOLOG := 0;
               V_VRCUSTOSEG := 0;

               IF (V_VRVRCUSTOLOG > 0) AND (V_VRPESOBRUTPR > 0) THEN
                  V_VRCUSTOLOG := (V_QTITEMPROD * V_VRPESOBRUTPR) * V_VRVRCUSTOLOG;
               END IF;

               IF (V_VRPECUSTOLOG > 0) THEN
                  V_VRCUSTOLOG := (V_VRTOTAITEM * V_VRPECUSTOLOG) / 100;
               END IF;

               IF (V_VRPESEGURLOG > 0) THEN
                  V_VRCUSTOSEG := (V_VRTOTAITEM * V_VRPESEGURLOG) / 100;
               END IF;

               INSERT INTO ITLANCTOEST
                  (CDFILIAL,     NRLANCESTQ, NRSEQUITEM,   CDPRODUTO,    QTTOTLANCTO, VRUNILANCTO,  VRTOTLANCTO,
                   IDTIPOMOVI,   DTLANCMOVI, IDORDEMCLC,   CDPRODMOVI,   QTLANCTOEST, VRLANCTOBRUT, VRLANCTOEST,
                   VRCUSTENTR,   CDFILIMOVI, CDALMOXARIFE, CDLOCALESTOQ, NRLOTEESTQ,  NRSUBLOTE,    NRLANCORIGRP,
                   VRCUSTLOGLAN, VRSEGULOGLAN, IDORIGEMPROD, CDSITUTRIBEST, VRICMSCOMPL, VRSTCOMPL,    VRFECPSTCOMPL)
               VALUES
                  (P_FILIAL,     P_LANCESTQ,   P_NRSEQITPROD, V_CDPRODUTO, V_QTDELANCTO, V_VRUNITLANCTO, V_VRTOTALANCTO,
                   P_IDTIPOMOVI, P_INIVALID,   W_2, V_CDPRODESTO, (V_QTDELANCTO * V_FATOCONV), V_TOTABRUT, V_TOTACONTAB,
                   V_VRCUSTENTR, V_CDFILIRECE, V_CDALMOXARIFE, V_CDLOCALESTOQ, V_NRLOTEESTQ, V_NRSUBLOTE, V_IDDOCREPLIC,
                   V_VRCUSTOLOG, V_VRCUSTOSEG, V_IDORIGEMPROD, V_CDSITUTRIBPR, V_VRICMSCOMPL, V_VRSTCOMPL, V_VRFECPSTCOMPL);
            END IF;
         END IF;
      ELSE
         -- Se for Entrada XML Terceiros
         V_INS_LANC_TERC := 'N';

         -- Verifica se os produtos do XML estao relacionados com os produtos na base
         BEGIN
            SELECT MAX(IP.CDPRODUTO)
              INTO V_CDPRODXML
              FROM INTG_SAID_NF NF, INTG_SAID_PROD IP, LISTA LT
             WHERE LT.NRLISTA      = P_NRLISTA
               AND NF.NRACESSONFS  = LT.CDLISTA
               AND IP.NRACESSONFS  = NF.NRACESSONFS
               AND NOT EXISTS (SELECT PX.CDPRODUTO
                                 FROM PRODFORNXML PX, FORNECEDOR F
                                WHERE F.NRINSJURFORN = NF.NRINSJURNF
                                  AND PX.CDFORNECED   = F.CDFORNECED
                                  AND PX.CDPRODUTOXML = IP.CDPRODUTO);
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_CDPRODXML := NULL;
         END;

         IF V_CDPRODXML IS NULL THEN

            -- Verifica se possui agente de terceirizacao cadastrado
            BEGIN
               SELECT MAX(A.CDALMOXTERCFOR)
                 INTO V_CDALMOXTERCFOR
                 FROM INTG_SAID_NF NF, LISTA LT, AGENTETERCEFOR A, FORNECEDOR F
                WHERE LT.NRLISTA      = P_NRLISTA
                  AND NF.NRACESSONFS  = LT.CDLISTA
                  AND F.NRINSJURFORN  = NF.NRINSJURNF
                  AND A.CDFILIAL   = P_FILIAL
                  AND A.CDFORNECED = F.CDFORNECED;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_CDALMOXTERCFOR := NULL;
            END;

            IF NOT V_CDALMOXTERCFOR IS NULL THEN

               FOR C_XML_TERCEIRO IN (
                  SELECT P.CDARVPROD, P.CDPRODUTO, P.CDPRODESTO,
                         NVL(A.CDALMOXTERCFOR, ' ') AS CDALMOXARIFE, NVL(A.CDLOCALTERCFOR, ' ') AS CDLOCALESTOQ,
                         ' ' AS NRLOTEESTQ, ' ' AS NRSUBLOTE, P.VRFATOCONV,
                         SUM(IP.QTITEMPROD) AS QTITEMPRODNF, SUM(IP.VRTOTAITEM) AS VRTOTAITEM, SUM(IP.VRDESCITEM) AS VRDESCITEM,
                         F.CDFORNECED, F.IDTPIJURFORN, F.NRINSJURFORN, SUM(NF.VRNOTAFISC) AS VRNOTAFISC
                    FROM INTG_SAID_NF NF, INTG_SAID_PROD IP, LISTA LT, PRODUTO P, PRODFILI PF,
                         PRODFORNXML PX, AGENTETERCEFOR A, FORNECEDOR F
                   WHERE LT.NRLISTA      = P_NRLISTA
                     AND NF.NRACESSONFS  = LT.CDLISTA
                     AND IP.NRACESSONFS  = NF.NRACESSONFS
                     AND A.CDFILIAL      = P_FILIAL
                     AND F.NRINSJURFORN  = NF.NRINSJURNF
                     AND A.CDFORNECED    = F.CDFORNECED
                     AND PX.CDFORNECED   = F.CDFORNECED
                     AND PX.CDPRODUTOXML = IP.CDPRODUTO
                     AND P.CDPRODUTO     = PX.CDPRODUTO
                     AND PF.CDFILIAL     = P_FILIAL
                     AND PF.CDPRODUTO    = P.CDPRODESTO
                     AND NVL(IDCNTRESTOQ, W_S) <> W_N
                   GROUP BY P.CDARVPROD, P.CDPRODUTO, P.CDPRODESTO,
                         NVL(A.CDALMOXTERCFOR, ' '), NVL(A.CDLOCALTERCFOR, ' '),
                         ' ', ' ', P.VRFATOCONV,
                         F.CDFORNECED, F.IDTPIJURFORN, F.NRINSJURFORN
                   ORDER BY P.CDARVPROD)

               LOOP

                  IF V_INS_LANC_TERC = 'N' THEN
                     BEGIN
                        SELECT CDEMPRESA, CDINSCMUNI, CDINSCESTA
                          INTO V_CDEMPRESA, V_CDINSCMUNI, V_CDINSCESTA
                          FROM FILIAL
                         WHERE CDFILIAL = P_FILIAL;
                     EXCEPTION
                        WHEN NO_DATA_FOUND THEN
                           V_CDEMPRESA := NULL; V_CDINSCMUNI := NULL; V_CDINSCESTA := NULL;
                     END;

                     BEGIN
                     SELECT MIN(CDSERIEENTR)
                       INTO V_CDSERIE
                       FROM SERIEENTR;
                     EXCEPTION
                        WHEN NO_DATA_FOUND THEN
                           V_CDSERIE := NULL;
                     END;

                     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)
                     VALUES (P_FILIAL, P_LANCTONF, P_FILIAL, V_CDEMPRESA, V_CDINSCESTA, NULL, V_CDINSCMUNI,
                             C_XML_TERCEIRO.IDTPIJURFORN, C_XML_TERCEIRO.NRINSJURFORN, C_XML_TERCEIRO.CDFORNECED, 'N', 'N', 'S',
                             NULL, P_INIVALID, P_INIVALID, C_XML_TERCEIRO.VRNOTAFISC, C_XML_TERCEIRO.VRNOTAFISC, 'E',
                             '10', V_CDSERIE, NULL, NULL, 'F');

                     INSERT INTO LANCTOESTOQ(CDFILIAL,NRLANCESTQ,NRLANCTONF,DSLANCESTQ,IDTPLANCTO,DTLANCESTQ,CDOPERADOR,CDFILIMOVI)
                                      VALUES(P_FILIAL, P_LANCESTQ, P_LANCTONF, 'Importacao de XML de Clientes', 'E', P_INIVALID, P_CDOPERADOR, P_FILIAL);

                     V_INS_LANC_TERC := 'S';
                  END IF;

                  INSERT INTO LOTE
                     (CDFILIAL, NRLOTEESTQ, NRSUBLOTE, CDPRODUTO, IDSTATLOTE, DTENTRLOTE)
                     (SELECT P_FILIAL, C_XML_TERCEIRO.NRLOTEESTQ, C_XML_TERCEIRO.NRSUBLOTE, C_XML_TERCEIRO.CDPRODESTO, W_L, SYSDATE
                        FROM PARAMGERAL
                       MINUS
                      SELECT CDFILIAL, NRLOTEESTQ, NRSUBLOTE, C_XML_TERCEIRO.CDPRODESTO, W_L, SYSDATE
                        FROM LOTE
                       WHERE P_FILIAL   = CDFILIAL
                         AND C_XML_TERCEIRO.NRLOTEESTQ = NRLOTEESTQ
                         AND C_XML_TERCEIRO.NRSUBLOTE  = NRSUBLOTE
                         AND C_XML_TERCEIRO.CDPRODESTO = CDPRODUTO);

                  IF (C_XML_TERCEIRO.VRFATOCONV IS NULL) OR (C_XML_TERCEIRO.VRFATOCONV = 0) THEN
                     V_FATOCONV := 1;
                  ELSE
                     V_FATOCONV := C_XML_TERCEIRO.VRFATOCONV;
                  END IF;

                  BEGIN
                     SELECT NVL(IDCTRLDISTRIB, W_N)
                       INTO V_IDCTRLDISTRIB
                       FROM PARAMFILIAL P
                      WHERE P.CDFILIAL = P_FILIAL;
                  EXCEPTION
                     WHEN NO_DATA_FOUND THEN
                        V_IDCTRLDISTRIB := W_N;
                  END;

                  -- Se a filial utiliza gestao de estoque e distribuicao
                  IF V_IDCTRLDISTRIB = W_S THEN

                     -- Retorna localizacao desmembrada (localizacao - prateleira)
                     BEGIN
                        SELECT MIN(CDLOCALESTOQ)
                          INTO V_CDLOCALESTDESM
                          FROM LOCALESTOQUE
                         WHERE CDFILIAL     = P_FILIAL
                           AND CDALMOXARIFE = C_XML_TERCEIRO.CDALMOXARIFE
                           AND IDESTDESMEMB = W_S;
                     EXCEPTION
                        WHEN NO_DATA_FOUND THEN
                           V_CDLOCALESTDESM := NULL;
                     END;

                     -- Quantidade restante do produto
                     V_QTITEMPROD := C_XML_TERCEIRO.QTITEMPRODNF;

                     -- verificando localizacoes disponiveis
                     FOR C_LOCALESTOQ IN (
                        SELECT P.CDPRODESTO, P.CDPRODUTO, P.VRFATOCONV, R.VRCAPACPALETE,
                              (R.VRCAPACPALETE * P.VRFATOCONV) AS VRCAPACPRODPAL, L.CDLOCALESTOQ,
                              (R.VRCAPACPALETE * L.VRCAPACLOCEST * P.VRFATOCONV) - NVL(U.QTTOTALESTOQ, 0) AS SALDOLOCALI,
                              R.IDESTPRODDESMEMB, NVL(VRCAPACLOCEST,0) AS VRCAPACLOCEST, NVL(L.VRCAPACLOCUTIL,0) AS VRCAPACLOCUTIL
                          FROM PRODFILI PF, PRODUTO P, PRODPALETE R, LOCALESTOQUE L,
                              (SELECT CDLOCALESTOQ, SUM(QTTOTALESTOQ) AS QTTOTALESTOQ
                                 FROM POSESTATU
                                WHERE CDFILIAL     = P_FILIAL
                                  AND CDPRODUTO    = C_XML_TERCEIRO.CDPRODESTO
                                  AND CDALMOXARIFE = C_XML_TERCEIRO.CDALMOXARIFE
                                GROUP BY CDLOCALESTOQ
                               ) U
                         WHERE P.CDPRODESTO    = C_XML_TERCEIRO.CDPRODESTO
                           AND PF.CDFILIAL     = P_FILIAL
                           AND PF.CDPRODUTO    = P.CDPRODUTO
                           AND PF.IDUNPADRAO   = W_S
                           AND R.CDFILIAL      = PF.CDFILIAL
                           AND R.CDPRODUTO     = PF.CDPRODUTO
                           AND R.VRCAPACPALETE > 0
                           AND L.CDFILIAL     = PF.CDFILIAL
                           AND L.CDALMOXARIFE = C_XML_TERCEIRO.CDALMOXARIFE
                           AND L.CDLOCALESTOQ <> ' '
                           AND L.IDESTDESMEMB = W_N
                           AND NVL(L.VRCAPACLOCUTIL,0) < NVL(VRCAPACLOCEST,0)
                           AND L.CDLOCALESTOQ = U.CDLOCALESTOQ (+)
                         ORDER BY L.CDLOCALESTOQ)

                     LOOP
                        -- Verifica se possui estoque de outro produto na localizacao sugerida
                        BEGIN
                           SELECT MAX(CDPRODUTO)
                             INTO V_CDPRODDIFE
                             FROM (SELECT CDPRODUTO
                                     FROM POSESTATU
                                    WHERE CDFILIAL     = P_FILIAL
                                      AND CDPRODUTO    <> C_LOCALESTOQ.CDPRODESTO
                                      AND CDALMOXARIFE = C_XML_TERCEIRO.CDALMOXARIFE
                                      AND CDLOCALESTOQ = C_LOCALESTOQ.CDLOCALESTOQ
                                      AND QTTOTALESTOQ > 0
                                    UNION ALL
                                   SELECT CDPRODUTO
                                     FROM ITLANCTOEST
                                    WHERE CDFILIAL     = P_FILIAL
                                      AND NRLANCESTQ   = P_LANCESTQ
                                      AND CDPRODMOVI   <> C_LOCALESTOQ.CDPRODESTO
                                      AND CDALMOXARIFE = C_XML_TERCEIRO.CDALMOXARIFE
                                      AND CDLOCALESTOQ = C_LOCALESTOQ.CDLOCALESTOQ);
                        EXCEPTION
                           WHEN NO_DATA_FOUND THEN
                              V_CDPRODDIFE := NULL;
                        END;

                        -- Se nao existe outro produto na localizacao (rua)
                        IF V_CDPRODDIFE IS NULL THEN

                           V_CDLOCALESTOQ := C_LOCALESTOQ.CDLOCALESTOQ;

                           -- Qtde de paletes do produto
                           V_QTDEPALETE := TRUNC((V_QTITEMPROD * V_FATOCONV) / C_LOCALESTOQ.VRCAPACPRODPAL);

                           -- Se a quantidade de paletes for superior ao disponivel e gerado a quantidade disponivel
                           IF (V_QTDEPALETE > (C_LOCALESTOQ.VRCAPACLOCEST - C_LOCALESTOQ.VRCAPACLOCUTIL)) THEN
                              V_QTDEPALETE := (C_LOCALESTOQ.VRCAPACLOCEST - C_LOCALESTOQ.VRCAPACLOCUTIL);
                           END IF;

                           IF (V_QTDEPALETE > 0) THEN
                              V_QTDELANCTO   := V_QTDEPALETE * C_LOCALESTOQ.VRCAPACPALETE;
                              V_VRTOTALANCTO := ((C_XML_TERCEIRO.VRTOTAITEM - C_XML_TERCEIRO.VRDESCITEM) * V_QTDELANCTO) / C_XML_TERCEIRO.QTITEMPRODNF;

                              IF NOT(V_QTDELANCTO = 0) THEN
                                 V_VRUNITLANCTO := V_VRTOTALANCTO/V_QTDELANCTO;
                              ELSE
                                 V_VRUNITLANCTO := V_VRTOTALANCTO;
                              END IF;

                              IF NOT(V_QTDELANCTO = 0) THEN
                                 V_TOTABRUT   := (((V_VRTOTALANCTO/V_QTDELANCTO)/V_FATOCONV) * V_QTDELANCTO) / C_XML_TERCEIRO.QTITEMPRODNF;
                                 V_TOTACONTAB := (((V_VRTOTALANCTO/V_QTDELANCTO)/V_FATOCONV) * V_QTDELANCTO) / C_XML_TERCEIRO.QTITEMPRODNF;
                              ELSE
                                 V_TOTABRUT   := ((V_VRTOTALANCTO * V_QTDELANCTO) / C_XML_TERCEIRO.QTITEMPRODNF);
                                 V_TOTACONTAB := ((V_VRTOTALANCTO * V_QTDELANCTO) / C_XML_TERCEIRO.QTITEMPRODNF);
                              END IF;
                              V_VRCUSTENTR := ((V_VRTOTALANCTO * V_QTDELANCTO) / C_XML_TERCEIRO.QTITEMPRODNF);

                              V_VRCUSTOLOG := 0;
                              V_VRCUSTOSEG := 0;

                              BEGIN
                                 SELECT LPAD(NVL(MAX(NRSEQUITEM),0) + 1,4, W_0)
                                   INTO V_NRSEQUITEM
                                   FROM ITLANCTOEST
                                  WHERE CDFILIAL   = P_FILIAL
                                    AND NRLANCESTQ = P_LANCESTQ;
                              EXCEPTION
                                 WHEN NO_DATA_FOUND THEN
                                     V_NRSEQUITEM := '0001';
                              END;

                              INSERT INTO ITLANCTOEST
                                 (CDFILIAL,     NRLANCESTQ, NRSEQUITEM,   CDPRODUTO,    QTTOTLANCTO, VRUNILANCTO,  VRTOTLANCTO,
                                  IDTIPOMOVI,   DTLANCMOVI, IDORDEMCLC,   CDPRODMOVI,   QTLANCTOEST, VRLANCTOBRUT, VRLANCTOEST,
                                  VRCUSTENTR,   CDFILIMOVI, CDALMOXARIFE, CDLOCALESTOQ, NRLOTEESTQ,  NRSUBLOTE,    NRLANCORIGRP,
                                  VRCUSTLOGLAN, VRSEGULOGLAN, IDORIGEMPROD, CDSITUTRIBEST, VRICMSCOMPL, VRSTCOMPL,    VRFECPSTCOMPL)
                              VALUES
                                 (P_FILIAL,     P_LANCESTQ,   V_NRSEQUITEM, C_LOCALESTOQ.CDPRODUTO, V_QTDELANCTO, V_VRUNITLANCTO, V_VRTOTALANCTO,
                                  W_2, P_INIVALID,   W_2, C_LOCALESTOQ.CDPRODESTO, (V_QTDELANCTO * V_FATOCONV), V_TOTABRUT, V_TOTACONTAB,
                                  V_VRCUSTENTR, P_FILIAL,   C_XML_TERCEIRO.CDALMOXARIFE, V_CDLOCALESTOQ, C_XML_TERCEIRO.NRLOTEESTQ, C_XML_TERCEIRO.NRSUBLOTE, 'N',
                                  V_VRCUSTOLOG, V_VRCUSTOSEG, V_IDORIGEMPROD, V_CDSITUTRIBPR, V_VRICMSCOMPL, V_VRSTCOMPL, V_VRFECPSTCOMPL);

                              V_QTITEMPROD := V_QTITEMPROD - V_QTDELANCTO;

                              -- Atualiza a quantidade de paletes utilizados na localizacao (rua)
                              UPDATE LOCALESTOQUE
                                 SET VRCAPACLOCUTIL = NVL(VRCAPACLOCUTIL,0) + V_QTDEPALETE
                               WHERE CDFILIAL     = P_FILIAL
                                 AND CDALMOXARIFE = C_XML_TERCEIRO.CDALMOXARIFE
                                 AND CDLOCALESTOQ = V_CDLOCALESTOQ;

                              -- Se possuir quantidade e se a localizacao tiver palete disponivel
                              IF V_QTITEMPROD > 0 THEN
                                 BEGIN
                                    SELECT VRCAPACLOCEST - NVL(VRCAPACLOCUTIL,0)
                                      INTO V_LOCDISPONIVEL
                                      FROM LOCALESTOQUE
                                     WHERE CDFILIAL     = V_CDFILIRECE
                                       AND CDALMOXARIFE = V_CDALMOXARIFE
                                       AND CDLOCALESTOQ = V_CDLOCALESTOQ;
                                 EXCEPTION
                                    WHEN NO_DATA_FOUND THEN
                                        V_LOCDISPONIVEL := 0;
                                 END;

                                 IF V_LOCDISPONIVEL > 0 THEN
                                    V_IDESTPRODDESMEMB := C_LOCALESTOQ.IDESTPRODDESMEMB;
                                    V_CDPRODUTODESMEMB := C_LOCALESTOQ.CDPRODUTO;
                                    V_CDPRODESTDESMEMB := C_LOCALESTOQ.CDPRODESTO;

                                    -- Insere quantidade restante (seja desmembrada ou nao)
                                    V_QTDELANCTO  := V_QTITEMPROD;
                                    V_QTLANCESTQ  := V_QTDELANCTO * V_FATOCONV;

                                    V_VRTOTALANCTO := ((C_XML_TERCEIRO.VRTOTAITEM - C_XML_TERCEIRO.VRDESCITEM) * V_QTDELANCTO) / C_XML_TERCEIRO.QTITEMPRODNF;

                                    IF NOT(V_QTDELANCTO = 0) THEN
                                       V_VRUNITLANCTO := V_VRTOTALANCTO/V_QTDELANCTO;
                                    ELSE
                                       V_VRUNITLANCTO := V_VRTOTALANCTO;
                                    END IF;

                                    IF NOT(V_QTDELANCTO = 0) THEN
                                       V_TOTABRUT   := (((V_VRTOTALANCTO/V_QTDELANCTO)/V_FATOCONV) * V_QTDELANCTO) / C_XML_TERCEIRO.QTITEMPRODNF;
                                       V_TOTACONTAB := (((V_VRTOTALANCTO/V_QTDELANCTO)/V_FATOCONV) * V_QTDELANCTO) / C_XML_TERCEIRO.QTITEMPRODNF;
                                    ELSE
                                       V_TOTABRUT   := ((V_VRTOTALANCTO * V_QTDELANCTO) / C_XML_TERCEIRO.QTITEMPRODNF);
                                       V_TOTACONTAB := ((V_VRTOTALANCTO * V_QTDELANCTO) / C_XML_TERCEIRO.QTITEMPRODNF);
                                    END IF;
                                    V_VRCUSTENTR := ((V_VRTOTALANCTO * V_QTDELANCTO) / C_XML_TERCEIRO.QTITEMPRODNF);

                                    V_VRCUSTOLOG := 0;
                                    V_VRCUSTOSEG := 0;

                                    BEGIN
                                       SELECT LPAD(NVL(MAX(NRSEQUITEM),0) + 1,4, W_0)
                                         INTO V_NRSEQUITEM
                                         FROM ITLANCTOEST
                                        WHERE CDFILIAL   = P_FILIAL
                                          AND NRLANCESTQ = P_LANCESTQ;
                                    EXCEPTION
                                       WHEN NO_DATA_FOUND THEN
                                           V_NRSEQUITEM := '0001';
                                    END;

                                    -- Se produto utiliza estoque desmembrado
                                    IF V_IDESTPRODDESMEMB = W_S THEN
                                       V_CDPRODUTODESMEMB := V_CDPRODESTDESMEMB;           -- movimentara o produto de estoque
                                       V_CDLOCALESTOQ     := V_CDLOCALESTDESM;             -- local de estoque referente a desmembrado
                                       V_QTDELANCTO       := V_QTDELANCTO * V_FATOCONV;
                                       V_VRUNITLANCTO     := V_VRUNITLANCTO / V_FATOCONV;
                                    ELSE
                                       V_CDPRODUTODESMEMB := C_XML_TERCEIRO.CDPRODUTO;
                                       V_CDPRODESTDESMEMB := C_XML_TERCEIRO.CDPRODESTO;

                                       IF V_CDLOCALESTOQ IS NULL THEN
                                          V_CDLOCALESTOQ := C_XML_TERCEIRO.CDLOCALESTOQ;
                                       END IF;
                                    END IF;

                                    INSERT INTO ITLANCTOEST
                                       (CDFILIAL,     NRLANCESTQ, NRSEQUITEM,   CDPRODUTO,    QTTOTLANCTO, VRUNILANCTO,  VRTOTLANCTO,
                                        IDTIPOMOVI,   DTLANCMOVI, IDORDEMCLC,   CDPRODMOVI,   QTLANCTOEST, VRLANCTOBRUT, VRLANCTOEST,
                                        VRCUSTENTR,   CDFILIMOVI, CDALMOXARIFE, CDLOCALESTOQ, NRLOTEESTQ,  NRSUBLOTE,    NRLANCORIGRP,
                                        VRCUSTLOGLAN, VRSEGULOGLAN, IDORIGEMPROD, CDSITUTRIBEST, VRICMSCOMPL, VRSTCOMPL,    VRFECPSTCOMPL)
                                    VALUES
                                       (P_FILIAL,     P_LANCESTQ,   V_NRSEQUITEM, V_CDPRODUTODESMEMB, V_QTDELANCTO, V_VRUNITLANCTO, V_VRTOTALANCTO,
                                        W_2, P_INIVALID,   W_2, V_CDPRODESTDESMEMB, V_QTLANCESTQ, V_TOTABRUT, V_TOTACONTAB,
                                        V_VRCUSTENTR, P_FILIAL, C_XML_TERCEIRO.CDALMOXARIFE, V_CDLOCALESTOQ, C_XML_TERCEIRO.NRLOTEESTQ, C_XML_TERCEIRO.NRSUBLOTE, 'N',
                                        V_VRCUSTOLOG, V_VRCUSTOSEG, V_IDORIGEMPROD, V_CDSITUTRIBPR, V_VRICMSCOMPL, V_VRSTCOMPL, V_VRFECPSTCOMPL);

                                    -- Atualiza a quantidade de paletes utilizados na localizacao (rua) para localizacao nao desmembrada
                                    IF V_IDESTPRODDESMEMB <> W_S THEN
                                       UPDATE LOCALESTOQUE
                                          SET VRCAPACLOCUTIL = NVL(VRCAPACLOCUTIL,0) + 1
                                        WHERE CDFILIAL     = P_FILIAL
                                          AND CDALMOXARIFE = C_XML_TERCEIRO.CDALMOXARIFE
                                          AND CDLOCALESTOQ = V_CDLOCALESTOQ;
                                    END IF;
                                 END IF;
                              END IF;   
                           ELSE
                              V_IDESTPRODDESMEMB := C_LOCALESTOQ.IDESTPRODDESMEMB;
                              V_CDPRODUTODESMEMB := C_LOCALESTOQ.CDPRODUTO;
                              V_CDPRODESTDESMEMB := C_LOCALESTOQ.CDPRODESTO;

                              EXIT;
                           END IF;
                        END IF;

                        V_IDESTPRODDESMEMB := C_LOCALESTOQ.IDESTPRODDESMEMB;
                        V_CDPRODUTODESMEMB := C_LOCALESTOQ.CDPRODUTO;
                        V_CDPRODESTDESMEMB := C_LOCALESTOQ.CDPRODESTO;
                     END LOOP;

                     -- Insere quantidade restante (seja desmembrada ou nao)
                     V_QTDELANCTO  := V_QTITEMPROD;
                     V_QTLANCESTQ  := V_QTDELANCTO * V_FATOCONV;

                     IF V_QTDELANCTO > 0 THEN

                        V_VRTOTALANCTO := ((C_XML_TERCEIRO.VRTOTAITEM - C_XML_TERCEIRO.VRDESCITEM) * V_QTDELANCTO) / C_XML_TERCEIRO.QTITEMPRODNF;

                        IF NOT(V_QTDELANCTO = 0) THEN
                           V_VRUNITLANCTO := V_VRTOTALANCTO/V_QTDELANCTO;
                        ELSE
                           V_VRUNITLANCTO := V_VRTOTALANCTO;
                        END IF;

                        IF NOT(V_QTDELANCTO = 0) THEN
                           V_TOTABRUT   := (((V_VRTOTALANCTO/V_QTDELANCTO)/V_FATOCONV) * V_QTDELANCTO) / C_XML_TERCEIRO.QTITEMPRODNF;
                           V_TOTACONTAB := (((V_VRTOTALANCTO/V_QTDELANCTO)/V_FATOCONV) * V_QTDELANCTO) / C_XML_TERCEIRO.QTITEMPRODNF;
                        ELSE
                           V_TOTABRUT   := ((V_VRTOTALANCTO * V_QTDELANCTO) / C_XML_TERCEIRO.QTITEMPRODNF);
                           V_TOTACONTAB := ((V_VRTOTALANCTO * V_QTDELANCTO) / C_XML_TERCEIRO.QTITEMPRODNF);
                        END IF;
                        V_VRCUSTENTR := ((V_VRTOTALANCTO * V_QTDELANCTO) / C_XML_TERCEIRO.QTITEMPRODNF);

                        V_VRCUSTOLOG := 0;
                        V_VRCUSTOSEG := 0;

                        BEGIN
                           SELECT LPAD(NVL(MAX(NRSEQUITEM),0) + 1,4, W_0)
                             INTO V_NRSEQUITEM
                             FROM ITLANCTOEST
                            WHERE CDFILIAL   = P_FILIAL
                              AND NRLANCESTQ = P_LANCESTQ;
                        EXCEPTION
                           WHEN NO_DATA_FOUND THEN
                               V_NRSEQUITEM := '0001';
                        END;

                        -- Se produto utiliza estoque desmembrado
                        IF V_IDESTPRODDESMEMB = W_S THEN
                           V_CDPRODUTODESMEMB := V_CDPRODESTDESMEMB;           -- movimentara o produto de estoque
                           V_CDLOCALESTOQ     := V_CDLOCALESTDESM;             -- local de estoque referente a desmembrado
                           V_QTDELANCTO       := V_QTDELANCTO * V_FATOCONV;
                           V_VRUNITLANCTO     := V_VRUNITLANCTO / V_FATOCONV;
                        ELSE
                           V_CDPRODUTODESMEMB := C_XML_TERCEIRO.CDPRODUTO;
                           V_CDPRODESTDESMEMB := C_XML_TERCEIRO.CDPRODESTO;

                           IF V_CDLOCALESTOQ IS NULL THEN
                              V_CDLOCALESTOQ := C_XML_TERCEIRO.CDLOCALESTOQ;
                           END IF;
                        END IF;

                        INSERT INTO ITLANCTOEST
                           (CDFILIAL,     NRLANCESTQ, NRSEQUITEM,   CDPRODUTO,    QTTOTLANCTO, VRUNILANCTO,  VRTOTLANCTO,
                            IDTIPOMOVI,   DTLANCMOVI, IDORDEMCLC,   CDPRODMOVI,   QTLANCTOEST, VRLANCTOBRUT, VRLANCTOEST,
                            VRCUSTENTR,   CDFILIMOVI, CDALMOXARIFE, CDLOCALESTOQ, NRLOTEESTQ,  NRSUBLOTE,    NRLANCORIGRP,
                            VRCUSTLOGLAN, VRSEGULOGLAN, IDORIGEMPROD, CDSITUTRIBEST, VRICMSCOMPL, VRSTCOMPL,    VRFECPSTCOMPL)
                        VALUES
                           (P_FILIAL,     P_LANCESTQ,   V_NRSEQUITEM, V_CDPRODUTODESMEMB, V_QTDELANCTO, V_VRUNITLANCTO, V_VRTOTALANCTO,
                            W_2, P_INIVALID,   W_2, V_CDPRODESTDESMEMB, V_QTLANCESTQ, V_TOTABRUT, V_TOTACONTAB,
                            V_VRCUSTENTR, P_FILIAL, C_XML_TERCEIRO.CDALMOXARIFE, V_CDLOCALESTOQ, C_XML_TERCEIRO.NRLOTEESTQ, C_XML_TERCEIRO.NRSUBLOTE, 'N',
                            V_VRCUSTOLOG, V_VRCUSTOSEG, V_IDORIGEMPROD, V_CDSITUTRIBPR, V_VRICMSCOMPL, V_VRSTCOMPL, V_VRFECPSTCOMPL);

                        -- Atualiza a quantidade de paletes utilizados na localizacao (rua) para localizacao nao desmembrada
                        IF V_IDESTPRODDESMEMB <> W_S THEN
                           UPDATE LOCALESTOQUE
                              SET VRCAPACLOCUTIL = NVL(VRCAPACLOCUTIL,0) + 1
                            WHERE CDFILIAL     = P_FILIAL
                              AND CDALMOXARIFE = C_XML_TERCEIRO.CDALMOXARIFE
                              AND CDLOCALESTOQ = V_CDLOCALESTOQ;
                        END IF;
                     END IF;
                  -- Nao utiliza controle gestao de estoque e distribuicao
                  ELSE
                     V_QTDELANCTO   := C_XML_TERCEIRO.QTITEMPRODNF;
                     V_VRTOTALANCTO := (C_XML_TERCEIRO.VRTOTAITEM - C_XML_TERCEIRO.VRDESCITEM);

                     IF NOT(V_QTDELANCTO = 0) THEN
                        V_VRUNITLANCTO := V_VRTOTALANCTO/V_QTDELANCTO;
                     ELSE
                        V_VRUNITLANCTO := V_VRTOTALANCTO;
                     END IF;

                     IF NOT(V_QTDELANCTO = 0) THEN
                        V_TOTABRUT   := (V_VRTOTALANCTO/V_QTDELANCTO)/V_FATOCONV;
                        V_TOTACONTAB := (V_VRTOTALANCTO/V_QTDELANCTO)/V_FATOCONV;
                     ELSE
                        V_TOTABRUT   := V_VRTOTALANCTO;
                        V_TOTACONTAB := V_VRTOTALANCTO;
                     END IF;
                     V_VRCUSTENTR := V_VRTOTALANCTO;

                     V_VRCUSTOLOG := 0;
                     V_VRCUSTOSEG := 0;

                     BEGIN
                        SELECT LPAD(NVL(MAX(NRSEQUITEM),0) + 1,4, W_0)
                          INTO V_NRSEQUITEM
                          FROM ITLANCTOEST
                         WHERE CDFILIAL   = P_FILIAL
                           AND NRLANCESTQ = P_LANCESTQ;
                     EXCEPTION
                        WHEN NO_DATA_FOUND THEN
                            V_NRSEQUITEM := '0001';
                     END;

                     INSERT INTO ITLANCTOEST
                        (CDFILIAL,     NRLANCESTQ, NRSEQUITEM,   CDPRODUTO,    QTTOTLANCTO, VRUNILANCTO,  VRTOTLANCTO,
                         IDTIPOMOVI,   DTLANCMOVI, IDORDEMCLC,   CDPRODMOVI,   QTLANCTOEST, VRLANCTOBRUT, VRLANCTOEST,
                         VRCUSTENTR,   CDFILIMOVI, CDALMOXARIFE, CDLOCALESTOQ, NRLOTEESTQ,  NRSUBLOTE,    NRLANCORIGRP,
                         VRCUSTLOGLAN, VRSEGULOGLAN, IDORIGEMPROD, CDSITUTRIBEST, VRICMSCOMPL, VRSTCOMPL, VRFECPSTCOMPL)
                     VALUES
                        (P_FILIAL,     P_LANCESTQ,   V_NRSEQUITEM, C_XML_TERCEIRO.CDPRODUTO, V_QTDELANCTO, V_VRUNITLANCTO, V_VRTOTALANCTO,
                         W_2, P_INIVALID,   W_2, C_XML_TERCEIRO.CDPRODESTO, (V_QTDELANCTO * V_FATOCONV), V_TOTABRUT, V_TOTACONTAB,
                         V_VRCUSTENTR, P_FILIAL, C_XML_TERCEIRO.CDALMOXARIFE, C_XML_TERCEIRO.CDLOCALESTOQ, C_XML_TERCEIRO.NRLOTEESTQ, C_XML_TERCEIRO.NRSUBLOTE, 'N',
                         V_VRCUSTOLOG, V_VRCUSTOSEG, V_IDORIGEMPROD, V_CDSITUTRIBPR, V_VRICMSCOMPL, V_VRSTCOMPL, V_VRFECPSTCOMPL);
                  END IF;
               END LOOP;
            ELSE
               P_RESULTADO := 'AGENTETER_NCAD';
            END IF;
         ELSE
            P_RESULTADO := 'PRODXML_NRELAC';
         END IF;
      END IF;
   END IF;
END;
/