CREATE OR REPLACE PROCEDURE INSERE_SUBPRODMAN(
  P_CDFILIAL     IN FILIAL.CDFILIAL%TYPE,
  P_LANCESTQ     IN LANCTOESTOQ.NRLANCESTQ%TYPE,
  P_TIPOOPER     IN INCIDENCIA.CDTIPOOPER%TYPE,
  P_CDPRODUTO    IN PRODUTO.CDPRODUTO%TYPE,
  P_QTITEMPROD   IN ITEMPRODUTO.QTITEMPROD%TYPE,
  P_VRTOTAITEM   IN ITEMPRODUTO.VRTOTAITEM%TYPE,
  P_VRDESCITEM   IN ITEMPRODUTO.VRDESCITEM%TYPE,
  P_VRBRUTITEM   IN ITEMPRODUTO.VRBRUTITEM%TYPE,
  P_VRCONTITEM   IN ITEMPRODUTO.VRCONTITEM%TYPE,
  P_VRTOTALANCTO IN NUMBER,
  P_QTDELANCTO   IN NUMBER,
  P_TIPOMOVI     IN ITLANCTOEST.IDTIPOMOVI%TYPE,
  P_INIVALID     IN ALIQUOTA.DTINIVALID%TYPE,
  P_CDPRODESTO   IN PRODUTO.CDPRODESTO%TYPE,
  P_NRPEDIDO     IN ITEMPRODUTO.NRPEDIDO%TYPE,
  P_NRITEMPED    IN ITEMPRODUTO.NRITEMPED%TYPE,
  P_IDTPCOMPPROD IN PARAMPEDIDO.IDTPCOMPPROD%TYPE,
  P_CDALMOXARIFE IN ITEMPRODUTO.CDALMOXARIFE%TYPE DEFAULT ' ',
  P_CDLOCALESTOQ IN ITEMPRODUTO.CDLOCALESTOQ%TYPE DEFAULT ' ',
  P_IDSISTEMA    IN NOTAFISCAL.IDSISTEMA%TYPE DEFAULT NULL

 )IS

  V_EXISTE_PROD     NUMBER;
  V_EXISTE_PRODUTO  NUMBER;
  V_ORDPRODUCAO  ORDPRODUCAO.NRORDPROD%TYPE;
  V_CDREQPROD    VARCHAR2(10);
  V_QTESTOQUE    NUMBER;
  V_NULL         NUMBER;
  V_QTTOTAL      NUMBER;
  V_FATOCONV     NUMBER;
  V_TOTABRUT     NUMBER;
  V_QTDELANCTO   NUMBER;
  V_QTDEAUX      NUMBER;
  V_VRUNITLANCTO NUMBER;
  V_VRTOTALANCTO NUMBER;
  V_TOTACONTAB   NUMBER;
  V_CDPRODESTO   PRODUTO.CDPRODESTO%TYPE;
  V_NRSEQITPROD  NUMBER;
  V_VRUNITITEM   NUMBER;
  V_QTDE         NUMBER;
  V_QTDEESTO     NUMBER;
  V_VALRESTO     NUMBER;
  V_VALRBRUT     NUMBER;

  V_IDUTILALMOX   VARCHAR2(01);
  V_IDUTILLCESTQ  VARCHAR2(01);
  V_IDUTILLOTE    VARCHAR2(01);

  V_CDFILIMOVI   VARCHAR2(04);
  V_CDALMOXARIFE VARCHAR2(06);
  V_CDLOCALESTOQ VARCHAR2(06);
  V_NRLOTEESTQ   VARCHAR2(20);
  V_NRSUBLOTE    VARCHAR2(04);

  V_CDPRODUTO     VARCHAR2(10);
  V_CDSUBPRODUTO  VARCHAR2(10);
  V_QTSUBPRODROT  NUMBER;

  V_PADRAO        VARCHAR2(1);

  V_ROTFABLOC     NUMBER;
  V_ROTFAB        NUMBER;
  V_VRCUSTENTR    NUMBER;
  V_CONTABENTR    NUMBER;
  V_BRUTENTR      NUMBER;
  V_IDCNTRESTOQ   VARCHAR2(1);
  V_CDLOJA        VARCHAR2(10);
  V_IDCUSEXP      PAREXPEDICAO.IDCUSEXP%TYPE;

  w_S             CHAR(1):= 'S';
  w_N             CHAR(1):= 'N';
  w_V             CHAR(1):= 'V'; /*INDICA COMPOSICAO VARIAVEL*/
  w_0             CHAR(1):= '0';
  w_8             CHAR(1):= '8';
  w_06            CHAR(2):= '06';
  w_13            CHAR(2):= '13';

  CURSOR CUR_ROTFABRICA IS
    SELECT R.CDPRODUTO, CDSUBPRODUTO, QTSUBPRODROT
    FROM ROTFABRICA R, PRODFILI P
    WHERE R.CDPRODUTO    =  P_CDPRODUTO  AND
          P.CDFILIAL     =  V_CDFILIMOVI AND
          R.CDSUBPRODUTO =  P.CDPRODUTO  AND
          NVL(P.IDCNTRESTOQ, w_S)  =  w_S AND
          ((TRUNC(SYSDATE) >= NVL(TRUNC(R.DTINIVGPRODROT),TRUNC(SYSDATE))) AND (TRUNC(SYSDATE) <= NVL(TRUNC(R.DTFINVGPRODROT),TRUNC(SYSDATE))));

  CURSOR CUR_ROTFABLOCAL IS
    SELECT R.CDPRODUTO, CDSUBPRODLOC, QTSUBPRODLOC
    FROM ROTFABLOCAL R, PRODFILI P
    WHERE R.CDFILIAL      =  V_CDFILIMOVI AND
          R.CDPRODUTO     =  P_CDPRODUTO  AND
          R.CDFILIAL      =  P.CDFILIAL   AND
          R.CDSUBPRODLOC  =  P.CDPRODUTO  AND
          NVL(P.IDCNTRESTOQ, w_S)    =  w_S AND
          ((TRUNC(SYSDATE) >= NVL(TRUNC(R.DTINIVGPRODLOC),TRUNC(SYSDATE))) AND (TRUNC(SYSDATE) <= NVL(TRUNC(R.DTFINVGPRODLOC),TRUNC(SYSDATE))));


  CURSOR CUR_COMPITEMPED IS
     SELECT C.CDPRODUTO, C.CDPRODCOMPED, SUM(C.QTITCOMPPROD) AS QTITCOMPPROD
     FROM COMPITEMPED C, PRODFILI P
     WHERE
        C.CDFILIAL    =  V_CDFILIMOVI AND
        C.NRPEDIDO    =  P_NRPEDIDO   AND
        C.NRITEMPED   =  P_NRITEMPED  AND
        C.CDFILIAL    =  P.CDFILIAL   AND
        C.CDPRODCOMPED = P.CDPRODUTO  AND
        NVL(P.IDCNTRESTOQ, w_S) =  w_S
     GROUP BY C.CDPRODUTO, C.CDPRODCOMPED
     ORDER BY
        C.CDPRODCOMPED;

BEGIN

   Begin
      SELECT CDFILIMOVI
      INTO   V_CDFILIMOVI
      FROM LANCTOESTOQ
      WHERE CDFILIAL   = P_CDFILIAL AND
            NRLANCESTQ = P_LANCESTQ;
   Exception
      When No_Data_Found Then
         V_CDFILIMOVI := Null;
   End;

   Begin
     SELECT NVL(IDUTILALMOX,w_N), NVL(IDUTILLCESTQ,w_N), NVL(IDUTILLOTE,w_N)
     INTO   V_IDUTILALMOX,        V_IDUTILLCESTQ,        V_IDUTILLOTE
     FROM PARAMFILIAL
     WHERE CDFILIAL = V_CDFILIMOVI;
   Exception
      When No_Data_Found Then
         V_IDUTILALMOX := w_N; V_IDUTILLCESTQ := w_N; V_IDUTILLOTE := w_N;
   End;


   IF P_IDTPCOMPPROD = 'F' THEN
      SELECT COUNT(*)
      INTO   V_ROTFAB
      FROM ROTFABRICA
      WHERE CDPRODUTO = P_CDPRODUTO
        AND ((TRUNC(SYSDATE) >= NVL(TRUNC(DTINIVGPRODROT),TRUNC(SYSDATE))) AND (TRUNC(SYSDATE) <= NVL(TRUNC(DTFINVGPRODROT),TRUNC(SYSDATE))));

      SELECT COUNT(*)
      INTO   V_ROTFABLOC
      FROM ROTFABLOCAL
      WHERE CDFILIAL  = V_CDFILIMOVI AND
            CDPRODUTO = P_CDPRODUTO AND
            ((TRUNC(SYSDATE) >= NVL(TRUNC(DTINIVGPRODLOC),TRUNC(SYSDATE))) AND (TRUNC(SYSDATE) <= NVL(TRUNC(DTFINVGPRODLOC),TRUNC(SYSDATE))));

      IF V_ROTFABLOC = 0 THEN
         V_PADRAO := w_S;
      ELSE
         V_PADRAO := W_N;
      END IF;

      IF V_PADRAO = w_S THEN
         OPEN CUR_ROTFABRICA;
      ELSE
         OPEN CUR_ROTFABLOCAL;
      END IF;
   ELSE
      OPEN CUR_COMPITEMPED;
      V_PADRAO := w_V;
   END IF;


   LOOP
      IF CUR_ROTFABLOCAL%ISOPEN THEN
         FETCH CUR_ROTFABLOCAL
           INTO V_CDPRODUTO, V_CDSUBPRODUTO, V_QTSUBPRODROT;
         EXIT WHEN CUR_ROTFABLOCAL%NOTFOUND;
      ELSE
         IF CUR_ROTFABRICA%ISOPEN THEN
            FETCH CUR_ROTFABRICA
              INTO V_CDPRODUTO, V_CDSUBPRODUTO, V_QTSUBPRODROT;
            EXIT WHEN CUR_ROTFABRICA%NOTFOUND;
         ELSE
            IF CUR_COMPITEMPED%ISOPEN THEN
               FETCH CUR_COMPITEMPED
               INTO V_CDPRODUTO, V_CDSUBPRODUTO, V_QTSUBPRODROT;
               EXIT WHEN CUR_COMPITEMPED%NOTFOUND;
            END IF;
         END IF;
      END IF;

      IF (V_IDUTILALMOX = w_S) THEN
         IF P_IDSISTEMA = 'EXP' THEN
            Begin
               SELECT CDALMOXPRCLI
               INTO   V_CDALMOXARIFE
               FROM PRODFILI
               WHERE CDFILIAL  = V_CDFILIMOVI AND
                    CDPRODUTO = V_CDSUBPRODUTO;
            Exception
               When No_Data_Found Then
                  V_CDALMOXARIFE := Null;
            End;

            IF V_CDALMOXARIFE IS NULL THEN
               Begin
                 SELECT CDALMOXARIFE
                 INTO   V_CDALMOXARIFE
                 FROM PARAMFILIAL
                 WHERE CDFILIAL = V_CDFILIMOVI;
               Exception
                  When No_Data_Found Then
                     V_CDALMOXARIFE := Null;
               End;

            END IF;
         ELSE
            IF P_CDALMOXARIFE IS NULL THEN
               Begin
                 SELECT CDALMOXARIFE
                 INTO   V_CDALMOXARIFE
                 FROM PRODFILI
                 WHERE CDFILIAL  = V_CDFILIMOVI AND
                       CDPRODUTO = V_CDSUBPRODUTO;
               Exception
                  When No_Data_Found Then
                     V_CDALMOXARIFE := Null;
               End;

               IF V_CDALMOXARIFE IS NULL THEN
                  Begin
                    SELECT CDALMOXARIFE
                    INTO   V_CDALMOXARIFE
                    FROM PARAMFILIAL
                    WHERE CDFILIAL = V_CDFILIMOVI;
                  Exception
                     When No_Data_Found Then
                        V_CDALMOXARIFE := Null;
                  End;

               END IF;
            ELSE
               IF NOT(P_CDALMOXARIFE = ' ') THEN
                 V_CDALMOXARIFE := P_CDALMOXARIFE;
               ELSE
                  SELECT MAX(CDLOJA)
                  INTO   V_CDLOJA
                  FROM ITEMVENDA IV, LANCTOESTOQ L
                  WHERE IV.CDPRODUTO   = V_CDPRODUTO  AND
                        IV.NRLANCTONF  = L.NRLANCTONF AND
                        IV.CDFILIALNF  = L.CDFILIAL   AND
                        L.NRLANCESTQ   = P_LANCESTQ   AND
                        L.CDFILIAL     = P_CDFILIAL;

                  SELECT MAX(CDALMOXARIFE)
                  INTO   V_CDALMOXARIFE
                  FROM LOJA
                  WHERE CDLOJA = V_CDLOJA;

                  IF V_CDALMOXARIFE IS NULL THEN
                     Begin
                        SELECT CDALMOXARIFE
                        INTO   V_CDALMOXARIFE
                        FROM PRODFILI PF, PRODUTO P
                        WHERE PF.CDFILIAL  = V_CDFILIMOVI AND
                              PF.CDPRODUTO = P.CDPRODESTO AND
                              P.CDPRODUTO  = V_CDSUBPRODUTO;
                     Exception
                        When No_Data_Found Then
                           V_CDALMOXARIFE := Null;
                     End;

                     IF V_CDALMOXARIFE IS NULL THEN
                        Begin
                          SELECT CDALMOXARIFE
                          INTO   V_CDALMOXARIFE
                          FROM PARAMFILIAL
                          WHERE CDFILIAL = V_CDFILIMOVI;
                        Exception
                           When No_Data_Found Then
                              V_CDALMOXARIFE := Null;
                        End;
                     END IF;

                  END IF;
               END IF;
            END IF;
         END IF;
      ELSE
         V_CDALMOXARIFE := ' ';
      END IF;

      IF (V_IDUTILLCESTQ = w_S) THEN
         IF P_IDSISTEMA = 'EXP' THEN
            Begin
               SELECT CDLOCALPRCLI
               INTO   V_CDLOCALESTOQ
               FROM PRODFILI
               WHERE CDFILIAL  = V_CDFILIMOVI AND
                    CDPRODUTO = V_CDSUBPRODUTO;
            Exception
               When No_Data_Found Then
                  V_CDLOCALESTOQ := Null;
            End;

            IF V_CDLOCALESTOQ IS NULL THEN
               Begin
                 SELECT CDLOCALESTOQ
                 INTO   V_CDLOCALESTOQ
                 FROM PARAMFILIAL
                 WHERE CDFILIAL = V_CDFILIMOVI;
               Exception
                  When No_Data_Found Then
                     V_CDLOCALESTOQ := Null;
               End;

            END IF;
         ELSE
            IF P_CDLOCALESTOQ IS NULL THEN
               Begin
                 SELECT CDLOCALESTOQ
                 INTO   V_CDLOCALESTOQ
                 FROM PRODFILI
                 WHERE CDFILIAL  = V_CDFILIMOVI AND
                       CDPRODUTO = V_CDSUBPRODUTO;
               Exception
                  When No_Data_Found Then
                     V_CDLOCALESTOQ := Null;
               End;

               IF V_CDLOCALESTOQ IS NULL THEN
                  Begin
                    SELECT CDLOCALESTOQ
                    INTO   V_CDLOCALESTOQ
                    FROM PARAMFILIAL
                    WHERE CDFILIAL = V_CDFILIMOVI;
                  Exception
                     When No_Data_Found Then
                        V_CDLOCALESTOQ := Null;
                  End;

               END IF;
            ELSE
               IF NOT(P_CDLOCALESTOQ = ' ') THEN
                 V_CDLOCALESTOQ := P_CDLOCALESTOQ;
               ELSE
                  SELECT MAX(CDLOJA)
                  INTO   V_CDLOJA
                  FROM ITEMVENDA IV, LANCTOESTOQ L
                  WHERE IV.CDPRODUTO   = V_CDPRODUTO  AND
                        IV.NRLANCTONF  = L.NRLANCTONF AND
                        IV.CDFILIALNF  = L.CDFILIAL   AND
                        L.NRLANCESTQ   = P_LANCESTQ   AND
                        L.CDFILIAL     = P_CDFILIAL;

                  SELECT MAX(CDLOCALESTOQ)
                  INTO   V_CDLOCALESTOQ
                  FROM LOJA
                  WHERE CDLOJA = V_CDLOJA;

                  IF V_CDLOCALESTOQ IS NULL THEN
                     Begin
                        SELECT CDLOCALESTOQ
                        INTO   V_CDLOCALESTOQ
                        FROM PRODFILI PF, PRODUTO P
                        WHERE PF.CDFILIAL  = V_CDFILIMOVI AND
                              PF.CDPRODUTO = P.CDPRODESTO AND
                              P.CDPRODUTO  = V_CDSUBPRODUTO;
                     Exception
                        When No_Data_Found Then
                           V_CDLOCALESTOQ := Null;
                     End;

                     IF V_CDLOCALESTOQ IS NULL THEN
                        Begin
                          SELECT CDLOCALESTOQ
                          INTO   V_CDLOCALESTOQ
                          FROM PARAMFILIAL
                          WHERE CDFILIAL = V_CDFILIMOVI;
                        Exception
                           When No_Data_Found Then
                              V_CDLOCALESTOQ := Null;
                        End;
                     END IF;

                  END IF;
               END IF;
            END IF;
         END IF;
      ELSE
         V_CDLOCALESTOQ := ' ';
      END IF;


      CONSULTA_LOTE(V_IDUTILLOTE, V_CDFILIMOVI, V_CDALMOXARIFE, V_CDLOCALESTOQ, V_CDSUBPRODUTO, V_NRLOTEESTQ, V_NRSUBLOTE);

      V_QTDEAUX := P_QTITEMPROD * V_QTSUBPRODROT;

      IF V_PADRAO = w_S THEN
         SELECT COUNT(*)
         INTO   V_EXISTE_PROD
         FROM ROTFABRICA
         WHERE CDPRODUTO = V_CDSUBPRODUTO
           AND ((TRUNC(SYSDATE) >= NVL(TRUNC(DTINIVGPRODROT),TRUNC(SYSDATE))) AND (TRUNC(SYSDATE) <= NVL(TRUNC(DTFINVGPRODROT),TRUNC(SYSDATE))));
      ELSE
         IF V_PADRAO = w_N THEN
            SELECT COUNT(*)
            INTO   V_EXISTE_PROD
            FROM ROTFABLOCAL
            WHERE CDFILIAL  = V_CDFILIMOVI AND
                  CDPRODUTO = V_CDSUBPRODUTO AND
                  ((TRUNC(SYSDATE) >= NVL(TRUNC(DTINIVGPRODLOC),TRUNC(SYSDATE))) AND (TRUNC(SYSDATE) <= NVL(TRUNC(DTFINVGPRODLOC),TRUNC(SYSDATE))));

         END IF;
      END IF;

/* SE O PRODUTO DA COMPOSICAO TAMBEM CONTER COMPOSICAO */

      IF V_EXISTE_PROD > 0  THEN

         INSERE_SUBPRODMAN(P_CDFILIAL, P_LANCESTQ, P_TIPOOPER, V_CDSUBPRODUTO,
                           V_QTDEAUX, P_VRTOTAITEM, P_VRDESCITEM, P_VRBRUTITEM,
                           P_VRCONTITEM, P_VRTOTALANCTO, P_QTDELANCTO, P_TIPOMOVI,
                           P_INIVALID, P_CDPRODESTO, P_NRPEDIDO, P_NRITEMPED, P_IDTPCOMPPROD,
                           V_CDALMOXARIFE, V_CDLOCALESTOQ);

      ELSE
         /* BUSCAR O PRECO DO CDSUBPRODUTO */

         Begin
           SELECT VRFATOCONV, CDPRODESTO
           INTO   V_FATOCONV, V_CDPRODESTO
           FROM PRODUTO
           WHERE CDPRODUTO = V_CDSUBPRODUTO;
         Exception
            When No_Data_Found Then
               V_FATOCONV := 0; V_CDPRODESTO := Null;
         End;

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

         V_QTDELANCTO   := V_QTDEAUX;
         V_VRTOTALANCTO := P_VRTOTAITEM - P_VRDESCITEM;

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

         IF (P_TIPOOPER = w_06) THEN
            IF (V_QTDELANCTO <> 0) THEN
               V_TOTABRUT   := (P_VRBRUTITEM/V_QTDELANCTO)/V_FATOCONV;
               V_TOTACONTAB := (P_VRCONTITEM/V_QTDELANCTO)/V_FATOCONV;
            ELSE
               V_TOTABRUT   := P_VRBRUTITEM/V_FATOCONV;
               V_TOTACONTAB := P_VRCONTITEM/V_FATOCONV;
            END IF;
         ELSE
            V_TOTABRUT   := 0;
            V_TOTACONTAB := 0;
         END IF;

         /* TESTA SE EXISTE O PRODUTO NA ITLANCTOEST */
         SELECT COUNT(*)
         INTO   V_EXISTE_PRODUTO
         FROM ITLANCTOEST
         WHERE CDFILIAL   = P_CDFILIAL AND
               NRLANCESTQ = P_LANCESTQ AND
               CDPRODUTO  = V_CDSUBPRODUTO;

         IF (P_TIPOOPER <> w_13) THEN

            BEGIN
               SELECT IDCUSEXP
               INTO V_IDCUSEXP
               FROM PAREXPEDICAO
               WHERE
                  CDFILIAL = P_CDFILIAL;
            EXCEPTION
               WHEN  NO_DATA_FOUND THEN
                  V_IDCUSEXP := NULL;
            END;

/* SE A COMPOSICAO DO PRODUTO E VARIAVEL */
            IF (V_PADRAO = w_V) AND (P_IDSISTEMA <> 'EXP') THEN
               SELECT MAX(VRPREUNICOMP)
               INTO V_VRUNITITEM
               FROM  COMPITEMPED
               WHERE
                  CDFILIAL  = P_CDFILIAL AND
                  NRPEDIDO  = P_NRPEDIDO AND
                  NRITEMPED = P_NRITEMPED AND
                  CDPRODCOMPED = V_CDSUBPRODUTO;
            ELSE
               V_VRUNITITEM := CUSTO_PROD(V_CDFILIMOVI, V_CDSUBPRODUTO, TO_NUMBER(V_IDCUSEXP), P_INIVALID, V_CDALMOXARIFE, V_CDLOCALESTOQ, V_NRLOTEESTQ, V_NRSUBLOTE);
            END IF;

            IF V_CDLOCALESTOQ is null THEN
              raise_application_error(-20501, V_CDSUBPRODUTO, True);
            END IF;

            /*  SE NAO EXISTIR O PRODUTO   */
            IF V_EXISTE_PRODUTO = 0 THEN
               IF (V_IDUTILLOTE = w_S) THEN

                  V_QTDE := V_QTDELANCTO;

                  FOR CUR_LOTE IN (SELECT NVL(LOTE.NRLOTEESTQ, ' ') NRLOTEESTQ
                                    INTO V_NRLOTEESTQ FROM(
                                    SELECT NVL(POSESTATU.NRLOTEESTQ, ' ') NRLOTEESTQ
                                     FROM POSESTATU, LOTE, PRODFILI
                                    WHERE POSESTATU.CDFILIAL     = LOTE.CDFILIAL   AND
                                          POSESTATU.NRLOTEESTQ   = LOTE.NRLOTEESTQ AND
                                          POSESTATU.NRSUBLOTE    = LOTE.NRSUBLOTE  AND
                                          POSESTATU.CDPRODUTO    = LOTE.CDPRODUTO  AND
                                          POSESTATU.CDFILIAL     = V_CDFILIMOVI    AND
                                          POSESTATU.CDALMOXARIFE = V_CDALMOXARIFE  AND
                                          POSESTATU.CDLOCALESTOQ = V_CDLOCALESTOQ  AND
                                          POSESTATU.CDPRODUTO    = V_CDSUBPRODUTO  AND
                                          POSESTATU.QTTOTALESTOQ > 0               AND
                                          POSESTATU.CDFILIAL     = PRODFILI.CDFILIAL   AND
                                          POSESTATU.CDPRODUTO    = PRODFILI.CDPRODUTO  AND
                                          PRODFILI.IDUTCTRLLOTE  = 'S' AND
                                          LOTE.DTVALILOTE        > SYSDATE

                                    UNION ALL

                                    SELECT NVL(POSESTATU.NRLOTEESTQ, ' ') NRLOTEESTQ
                                     FROM POSESTATU, LOTE, PRODFILI
                                    WHERE POSESTATU.CDFILIAL     = LOTE.CDFILIAL   AND
                                          POSESTATU.NRLOTEESTQ   = LOTE.NRLOTEESTQ AND
                                          POSESTATU.NRSUBLOTE    = LOTE.NRSUBLOTE  AND
                                          POSESTATU.CDPRODUTO    = LOTE.CDPRODUTO  AND
                                          POSESTATU.CDFILIAL     = V_CDFILIMOVI    AND
                                          POSESTATU.CDALMOXARIFE = V_CDALMOXARIFE  AND
                                          POSESTATU.CDLOCALESTOQ = V_CDLOCALESTOQ  AND
                                          POSESTATU.CDPRODUTO    = V_CDSUBPRODUTO  AND
                                          POSESTATU.QTTOTALESTOQ > 0               AND
                                          POSESTATU.CDFILIAL     = PRODFILI.CDFILIAL   AND
                                          POSESTATU.CDPRODUTO    = PRODFILI.CDPRODUTO  AND
                                          PRODFILI.IDUTCTRLLOTE  = 'N') LOTE
                                   ) LOOP

                     IF (CUR_LOTE.NRLOTEESTQ IS NULL) OR (CUR_LOTE.NRLOTEESTQ = '') OR (CUR_LOTE.NRLOTEESTQ = ' ') THEN
                        IF NOT (CUR_LOTE.NRLOTEESTQ = ' ') THEN
                           CUR_LOTE.NRLOTEESTQ := ' ';
                           V_NRSUBLOTE         := ' ';
                        END IF;

                        V_QTDEAUX := V_QTDELANCTO;
                        V_QTDE    := 0;
                     ELSE
                        SELECT NVL(MAX(NRSUBLOTE), ' ')
                          INTO V_NRSUBLOTE
                          FROM LOTE
                         WHERE (CDFILIAL   = P_CDFILIAL) AND
                               (NRLOTEESTQ = CUR_LOTE.NRLOTEESTQ);  

                        POSICAO_ESTOQUE(V_CDFILIMOVI, V_CDSUBPRODUTO, SYSDATE + 1, V_QTDEESTO, V_VALRESTO, V_VALRBRUT, 'S', V_CDALMOXARIFE, 
                                        V_CDLOCALESTOQ, NULL, NULL, NULL, CUR_LOTE.NRLOTEESTQ, V_NRSUBLOTE);
                           
                        IF (V_QTDEESTO > V_QTDE) OR (V_QTDEESTO = V_QTDE) THEN
                           V_QTDEAUX := V_QTDE;
                        ELSE
                           V_QTDEAUX := V_QTDEESTO;
                        END IF;

                        V_QTDE := V_QTDE - V_QTDEAUX;                   
                     
                        IF (V_QTDEAUX = 0) THEN
                           V_QTDEAUX := V_QTDELANCTO;
                        END IF;                     
                     END IF;                      
              
            /* SE A COMPOSICAO DO PRODUTO E VARIAVEL */
                     IF (V_PADRAO = w_V) AND (P_IDSISTEMA <> 'EXP') THEN
                        SELECT MAX(VRPREUNICOMP)
                        INTO V_VRUNITITEM
                        FROM  COMPITEMPED
                        WHERE
                           CDFILIAL     = P_CDFILIAL  AND
                           NRPEDIDO     = P_NRPEDIDO  AND
                           NRITEMPED    = P_NRITEMPED AND
                           CDPRODCOMPED = V_CDSUBPRODUTO;
                     ELSE
                        V_VRUNITITEM := CUSTO_PROD(V_CDFILIMOVI, V_CDSUBPRODUTO, TO_NUMBER(V_IDCUSEXP), P_INIVALID, V_CDALMOXARIFE, V_CDLOCALESTOQ, CUR_LOTE.NRLOTEESTQ, V_NRSUBLOTE);
                     END IF;                  
            
                     SELECT NVL(MAX(NRSEQUITEM),0) + 1
                     INTO   V_NRSEQITPROD
                     FROM ITLANCTOEST
                     WHERE CDFILIAL   = P_CDFILIAL AND
                           NRLANCESTQ = P_LANCESTQ;                       

                     INSERT INTO ITLANCTOEST
                        (CDFILIAL,NRLANCESTQ,NRSEQUITEM,CDPRODUTO,QTTOTLANCTO,VRUNILANCTO,VRTOTLANCTO,
                         IDTIPOMOVI,DTLANCMOVI,IDORDEMCLC,CDPRODMOVI,QTLANCTOEST,VRLANCTOBRUT, VRLANCTOEST, VRCUSTENTR,
                         CDFILIMOVI, CDALMOXARIFE, CDLOCALESTOQ, NRLOTEESTQ, NRSUBLOTE)
                     VALUES
                        (P_CDFILIAL,P_LANCESTQ,LPAD(V_NRSEQITPROD,4,w_0),V_CDSUBPRODUTO,
                         V_QTDEAUX,V_VRUNITLANCTO,V_VRTOTALANCTO,
                         P_TIPOMOVI,P_INIVALID,w_8,V_CDPRODESTO,
                         (V_QTDEAUX * V_FATOCONV), V_BRUTENTR, V_CONTABENTR, V_VRCUSTENTR,
                         V_CDFILIMOVI, V_CDALMOXARIFE, V_CDLOCALESTOQ, CUR_LOTE.NRLOTEESTQ, V_NRSUBLOTE);
                      
                     IF (V_QTDE = 0) THEN
                        EXIT;
                     END IF;                      
          
                  END LOOP;                   
               ELSE
                  V_NRLOTEESTQ := ' ';
                  V_NRSUBLOTE  := ' ';

                  SELECT NVL(MAX(NRSEQUITEM),0) + 1
                  INTO   V_NRSEQITPROD
                  FROM ITLANCTOEST
                  WHERE CDFILIAL   = P_CDFILIAL AND
                        NRLANCESTQ = P_LANCESTQ;
                  
                  INSERT INTO ITLANCTOEST
                     (CDFILIAL,NRLANCESTQ,NRSEQUITEM,CDPRODUTO,QTTOTLANCTO,VRUNILANCTO,VRTOTLANCTO,
                      IDTIPOMOVI,DTLANCMOVI,IDORDEMCLC,CDPRODMOVI,QTLANCTOEST,VRLANCTOBRUT, VRLANCTOEST,
                      CDFILIMOVI, CDALMOXARIFE, CDLOCALESTOQ, NRLOTEESTQ, NRSUBLOTE)
                  VALUES
                     (P_CDFILIAL,P_LANCESTQ,LPAD(V_NRSEQITPROD,4,W_0),V_CDSUBPRODUTO,
                      V_QTDELANCTO, V_VRUNITITEM, (V_VRUNITITEM * (V_QTDELANCTO * V_FATOCONV)),
                      P_TIPOMOVI,P_INIVALID,W_8,V_CDPRODESTO,
                      (V_QTDELANCTO * V_FATOCONV), (V_VRUNITITEM * (V_QTDELANCTO * V_FATOCONV)), (V_VRUNITITEM * (V_QTDELANCTO * V_FATOCONV)),
                      V_CDFILIMOVI, V_CDALMOXARIFE, V_CDLOCALESTOQ, V_NRLOTEESTQ, V_NRSUBLOTE); 
                      
               END IF;

            ELSE
               UPDATE ITLANCTOEST
               SET QTTOTLANCTO  = QTTOTLANCTO  +  V_QTDELANCTO,
                   QTLANCTOEST  = QTLANCTOEST  + (V_QTDELANCTO * V_FATOCONV),
                   VRTOTLANCTO  = VRTOTLANCTO  + (V_VRUNITITEM * (V_QTDELANCTO * V_FATOCONV)),
                   VRLANCTOBRUT = VRLANCTOBRUT + (V_VRUNITITEM * (V_QTDELANCTO * V_FATOCONV)),
                   VRLANCTOEST  = VRLANCTOEST  + (V_VRUNITITEM * (V_QTDELANCTO * V_FATOCONV))
               WHERE CDFILIAL   = P_CDFILIAL AND
                     NRLANCESTQ = P_LANCESTQ AND
                     CDPRODUTO  = V_CDSUBPRODUTO;

            END IF;

         ELSIF (P_TIPOOPER <> w_06) OR ((P_TIPOOPER = w_06) AND (V_QTDELANCTO <> 0)) THEN

            IF P_TIPOOPER = w_13 THEN
               V_VRCUSTENTR   := CUSTO_PROD(P_CDFILIAL,V_CDSUBPRODUTO,6,P_INIVALID,
                                            V_CDALMOXARIFE, V_CDLOCALESTOQ, V_NRLOTEESTQ, V_NRSUBLOTE);
               V_CONTABENTR   := V_VRCUSTENTR;
               V_BRUTENTR     := CUSTO_PROD(P_CDFILIAL,V_CDSUBPRODUTO,9,P_INIVALID,
                                            V_CDALMOXARIFE, V_CDLOCALESTOQ, V_NRLOTEESTQ, V_NRSUBLOTE);
               V_VRUNITLANCTO := V_VRCUSTENTR;
               V_VRTOTALANCTO := V_VRCUSTENTR * V_QTDELANCTO;
            ELSE
               V_VRCUSTENTR   := 0;
               V_CONTABENTR   := 0;
               V_BRUTENTR     := 0;
            END IF;

            /*  SE NAO EXISTIR O PRODUTO   */
            IF V_EXISTE_PRODUTO = 0 THEN
               
               IF (V_IDUTILLOTE = w_S) THEN
               
                  V_QTDE := V_QTDELANCTO;               

                  FOR CUR_LOTE IN (SELECT NVL(POSESTATU.NRLOTEESTQ, ' ') NRLOTEESTQ
                                     INTO V_NRLOTEESTQ
                                     FROM POSESTATU, LOTE
                                    WHERE POSESTATU.CDFILIAL     = LOTE.CDFILIAL   AND
                                          POSESTATU.NRLOTEESTQ   = LOTE.NRLOTEESTQ AND
                                          POSESTATU.NRSUBLOTE    = LOTE.NRSUBLOTE  AND
                                          POSESTATU.CDPRODUTO    = LOTE.CDPRODUTO  AND
                                          POSESTATU.CDFILIAL     = V_CDFILIMOVI    AND
                                          POSESTATU.CDALMOXARIFE = V_CDALMOXARIFE  AND
                                          POSESTATU.CDLOCALESTOQ = V_CDLOCALESTOQ  AND
                                          POSESTATU.CDPRODUTO    = V_CDSUBPRODUTO  AND
                                          POSESTATU.QTTOTALESTOQ > 0               AND
                                          LOTE.DTVALILOTE        > SYSDATE
                                    ORDER BY LOTE.DTVALILOTE) LOOP

                     IF (CUR_LOTE.NRLOTEESTQ IS NULL) OR (CUR_LOTE.NRLOTEESTQ = '') OR (CUR_LOTE.NRLOTEESTQ = ' ') THEN
                        IF NOT (CUR_LOTE.NRLOTEESTQ = ' ') THEN
                           CUR_LOTE.NRLOTEESTQ := ' ';
                           V_NRSUBLOTE         := ' ';                        
                        END IF;

                        V_QTDEAUX := V_QTDELANCTO;                        
                        V_QTDE    := 0;                        
                     ELSE
                        SELECT NVL(MAX(NRSUBLOTE), ' ')
                          INTO V_NRSUBLOTE
                          FROM LOTE
                         WHERE (CDFILIAL   = P_CDFILIAL) AND
                               (NRLOTEESTQ = CUR_LOTE.NRLOTEESTQ);  

                        POSICAO_ESTOQUE(V_CDFILIMOVI, V_CDSUBPRODUTO, SYSDATE + 1, V_QTDEESTO, V_VALRESTO, V_VALRBRUT, 'S', V_CDALMOXARIFE, 
                                        V_CDLOCALESTOQ, NULL, NULL, NULL, CUR_LOTE.NRLOTEESTQ, V_NRSUBLOTE);
   
                        IF (V_QTDEESTO > V_QTDE) OR (V_QTDEESTO = V_QTDE) THEN
                           V_QTDEAUX := V_QTDE;
                        ELSE
                           V_QTDEAUX := V_QTDEESTO;
                        END IF;

                        V_QTDE := V_QTDE - V_QTDEAUX;            
                        
                        IF (V_QTDEAUX = 0) THEN
                           V_QTDEAUX := V_QTDELANCTO;
                        END IF;                        
                     END IF;   
                     
                     IF P_TIPOOPER = w_13 THEN
                        V_VRCUSTENTR   := CUSTO_PROD(P_CDFILIAL,V_CDSUBPRODUTO,6,P_INIVALID,
                                                     V_CDALMOXARIFE, V_CDLOCALESTOQ, CUR_LOTE.NRLOTEESTQ, V_NRSUBLOTE);
                        V_CONTABENTR   := V_VRCUSTENTR;
                        V_BRUTENTR     := CUSTO_PROD(P_CDFILIAL,V_CDSUBPRODUTO,9,P_INIVALID,
                                                     V_CDALMOXARIFE, V_CDLOCALESTOQ, CUR_LOTE.NRLOTEESTQ, V_NRSUBLOTE);
                        V_VRUNITLANCTO := V_VRCUSTENTR;
                        V_VRTOTALANCTO := V_VRCUSTENTR * V_QTDELANCTO;
                     ELSE
                        V_VRCUSTENTR   := 0;
                        V_CONTABENTR   := 0;
                        V_BRUTENTR     := 0;
                     END IF;                     
            
                     SELECT NVL(MAX(NRSEQUITEM),0) + 1
                     INTO   V_NRSEQITPROD
                     FROM ITLANCTOEST
                     WHERE CDFILIAL   = P_CDFILIAL AND
                           NRLANCESTQ = P_LANCESTQ;

                     INSERT INTO ITLANCTOEST
                        (CDFILIAL,NRLANCESTQ,NRSEQUITEM,CDPRODUTO,QTTOTLANCTO,VRUNILANCTO,VRTOTLANCTO,
                         IDTIPOMOVI,DTLANCMOVI,IDORDEMCLC,CDPRODMOVI,QTLANCTOEST,VRLANCTOBRUT, VRLANCTOEST, VRCUSTENTR,
                         CDFILIMOVI, CDALMOXARIFE, CDLOCALESTOQ, NRLOTEESTQ, NRSUBLOTE)
                     VALUES
                        (P_CDFILIAL,P_LANCESTQ,LPAD(V_NRSEQITPROD,4,w_0),V_CDSUBPRODUTO,
                         V_QTDEAUX,V_VRUNITLANCTO,V_VRTOTALANCTO,
                         P_TIPOMOVI,P_INIVALID,w_8,V_CDPRODESTO,
                         (V_QTDEAUX * V_FATOCONV), V_BRUTENTR, V_CONTABENTR, V_VRCUSTENTR,
                         V_CDFILIMOVI, V_CDALMOXARIFE, V_CDLOCALESTOQ, CUR_LOTE.NRLOTEESTQ, V_NRSUBLOTE);
                         
                     IF (V_QTDE = 0) THEN
                        EXIT;
                     END IF;                         
                   
                  END LOOP;                   
               ELSE
                  V_NRLOTEESTQ := ' ';
                  V_NRSUBLOTE  := ' ';

                  SELECT NVL(MAX(NRSEQUITEM),0) + 1
                  INTO   V_NRSEQITPROD
                  FROM ITLANCTOEST
                  WHERE CDFILIAL   = P_CDFILIAL AND
                        NRLANCESTQ = P_LANCESTQ;
                  
                  INSERT INTO ITLANCTOEST
                     (CDFILIAL,NRLANCESTQ,NRSEQUITEM,CDPRODUTO,QTTOTLANCTO,VRUNILANCTO,VRTOTLANCTO,
                      IDTIPOMOVI,DTLANCMOVI,IDORDEMCLC,CDPRODMOVI,QTLANCTOEST,VRLANCTOBRUT, VRLANCTOEST,
                      CDFILIMOVI, CDALMOXARIFE, CDLOCALESTOQ, NRLOTEESTQ, NRSUBLOTE)
                  VALUES
                     (P_CDFILIAL,P_LANCESTQ,LPAD(V_NRSEQITPROD,4,W_0),V_CDSUBPRODUTO,
                      V_QTDELANCTO, V_VRUNITITEM, (V_VRUNITITEM * (V_QTDELANCTO * V_FATOCONV)),
                      P_TIPOMOVI,P_INIVALID,W_8,V_CDPRODESTO,
                      (V_QTDELANCTO * V_FATOCONV), (V_VRUNITITEM * (V_QTDELANCTO * V_FATOCONV)), (V_VRUNITITEM * (V_QTDELANCTO * V_FATOCONV)),
                      V_CDFILIMOVI, V_CDALMOXARIFE, V_CDLOCALESTOQ, V_NRLOTEESTQ, V_NRSUBLOTE); 
                      
               END IF;
            ELSE
               UPDATE ITLANCTOEST
               SET QTTOTLANCTO = (QTTOTLANCTO + V_QTDELANCTO),
                   QTLANCTOEST = (QTLANCTOEST + (V_QTDELANCTO * V_FATOCONV)),
                   VRTOTLANCTO = VRTOTLANCTO + V_VRTOTALANCTO
               WHERE CDFILIAL   = P_CDFILIAL AND
                     NRLANCESTQ = P_LANCESTQ AND
                     CDPRODUTO  = V_CDSUBPRODUTO;
            END IF;
         END IF;
      END IF;
   END LOOP;
END;
/