create or replace
PROCEDURE GERA_OP_PREVCOMP
   (P_CDFILIAL         IN FILIAL.CDFILIAL%TYPE,
    P_DTMRP            IN PROGPRODU.DTPROGPRODU%TYPE,
    P_DSORDPROD        IN ORDPRODUCAO.DSORDPROD%TYPE,
    P_CDOPERADOR       IN OPERADOR.CDOPERADOR%TYPE,
    P_NRPREVCOMP       IN PREVCOMP.NRPREVCOMP%TYPE,
    P_NRPLANOPROD      IN LOTE.CDPLANPRODLT%TYPE,
    P_STLISTAPEDIDO    IN VARCHAR2 DEFAULT '',
    P_NRPEDIDO_DIRETO  VARCHAR2,
    P_NRITEMPED_DIRETO VARCHAR2,
    P_CDPRODUTO        IN PRODUTO.CDPRODUTO%TYPE,
    P_QTDE             FLOAT
   ) AS
   V_DSNUMELOTEPR   PARAMAN.DSNUMELOTEPR%TYPE;
   V_DSSEQULOTEPR   PARAMAN.DSSEQULOTEPR%TYPE;
   V_SEQNRORDPROD   VARCHAR2(20);
   V_NRORDPROD      ORDPRODUCAO.NRORDPROD%TYPE;
   V_NRSUBORDPROD   ORDPRODUCAO.NRSUBORDPROD%TYPE;
   V_NRLOTEESTQ     LOTE.NRLOTEESTQ%TYPE;
   V_NRLOTEEXIST    LOTE.NRLOTEESTQ%TYPE;
   V_NRSUBLOTE      LOTE.NRSUBLOTE%TYPE;
   V_PRODPREVI      PRODUTO.CDPRODUTO%TYPE;
   V_CDSETORPROD    SETOR.CDSETOR%TYPE;
   V_NRSEQPREVI     ITPREVCOMP.NRITPREVCOMP%TYPE;
   V_EXISPREVI      PRODUTO.CDPRODUTO%TYPE;
   V_CDPRODFINAL    CALEPRODMRP.CDPRODFINAL%TYPE;
   V_NRORDENAOP     CALEPRODMRP.NRORDENAOP%TYPE;
   V_NRORDENASUBOP  CALEPRODMRP.NRORDENAOP%TYPE;
   V_DTVALILOTE     LOTE.DTVALILOTE%TYPE;
   V_IDSUBOPSEMIACA PARAMAN.IDSUBOPSEMIACA%TYPE;
   V_IDGERAOPCONF   PARAMPRODMRP.IDGERAOPCONF%TYPE;
   V_IDENTRSEQ      CHAR;
   V_IDUTEQUIPLAPROD PARAMAN.IDUTEQUIPLAPROD%TYPE;
   V_IDMRPPEDPREV   PROGPRODU.IDMRPPEDPREV%TYPE;
   V_DSORDPROD      ORDPRODUCAO.DSORDPROD%TYPE;
   V_IDUTRESELOTE   PARAMPEDIDO.IDUTRESELOTE%TYPE;
   V_NRLOTERESERVA  LOTE.NRLOTEESTQ%TYPE;
   V_NRRESPRODPED   RESERPRODPED.NRRESPRODPED%TYPE;
   V_IDCNTRESTOQ    PRODFILI.IDCNTRESTOQ%TYPE;
   V_IDUTCTRLLOTE   PRODFILI.IDUTCTRLLOTE%TYPE;
   V_VRFATOCONV     PRODUTO.VRFATOCONV%TYPE;
   V_IDPEDINDUSTRIA PEDIDO.IDPEDINDUSTRIA%TYPE;
   V_QTPADPROCFAB   FLOAT;
   V_CONTGEROP      FLOAT;
   V_QTDEOP         FLOAT;
   V_IDTPPROPOPF    VARCHAR2(1);
   V_IDTPARREDPF    VARCHAR2(1);
   V_CONTADOR       NUMBER;
   V_CONTADOR2      NUMBER;

   V_NRPEDIDO        ITEMPEDIDO.NRPEDIDO%TYPE;
   V_CDPRODUTO       ITEMPEDIDO.CDPRODUTO%TYPE;
   V_QTITEMPED       ITEMPEDIDO.QTITEMPED%TYPE;
   V_VRPREUNITPED    ITEMPEDIDO.VRPREUNITPED%TYPE;
   V_NRITEMPED       ITEMPEDIDO.NRITEMPED%TYPE;
   V_IDSITITEMPED    ITEMPEDIDO.IDSITITEMPED%TYPE;
   V_QTEXPITEMPED    ITEMPEDIDO.QTEXPITEMPED%TYPE;
   V_CDFILIAL        ITEMPEDIDO.CDFILIAL%TYPE;
   V_CDFATPRECO      ITEMPEDIDO.CDFATPRECO%TYPE;
   V_QTITEMPED2      ITEMPEDIDO.QTITEMPED2%TYPE;
   V_DTENTITPED      ITEMPEDIDO.DTENTITPED%TYPE;
   V_IDITPEDDIFER    ITEMPEDIDO.IDITPEDDIFER%TYPE;
   V_VRPESOITPED     ITEMPEDIDO.VRPESOITPED%TYPE;
   V_VRDESITPED      ITEMPEDIDO.VRDESITPED%TYPE;
   V_IDITPEDRESER    ITEMPEDIDO.IDITPEDRESER%TYPE;
   V_VRPRTABITPED    ITEMPEDIDO.VRPRTABITPED%TYPE;
   V_VRPEDEMAXIPE    ITEMPEDIDO.VRPEDEMAXIPE%TYPE;
   V_CDOPERADOR      ITEMPEDIDO.CDOPERADOR%TYPE;
   V_VRPERCMARKUPIT  ITEMPEDIDO.VRPERCMARKUPIT%TYPE;
   V_CDTIPODESC      ITEMPEDIDO.CDTIPODESC%TYPE;
   V_DSITEMPED       ITEMPEDIDO.DSITEMPED%TYPE;
   V_DSEMISSAOITPED  ITEMPEDIDO.DSEMISSAOITPED%TYPE;
   V_DSPRAZOENTITPED ITEMPEDIDO.DSPRAZOENTITPED%TYPE;
   V_CDEMISSAOITPED  ITEMPEDIDO.CDEMISSAOITPED%TYPE;
   V_NRITORDEMCMPPED ITEMPEDIDO.NRITORDEMCMPPED%TYPE;
   V_IDPRECOPROM     ITEMPEDIDO.IDPRECOPROM%TYPE;
   V_VRVARIAVEL      ITEMPEDIDO.VRVARIAVEL%TYPE;
   V_CDFATOR         ITEMPEDIDO.CDFATOR%TYPE;
   V_IDITEMPEDTERC   ITEMPEDIDO.IDITEMPEDTERC%TYPE;

   V_CDEMPRESA    FILIAL.CDEMPRESA%TYPE;
   V_CDINSCESTA   FILIAL.CDINSCESTA%TYPE;
   V_CDCLIENTE    PEDIDO.CDCLIENTE%TYPE;
   V_CDFILIALPED  PEDIDO.CDFILIALPED%TYPE;
   V_NRPEDID      PEDIDO.NRPEDIDO%TYPE;
   V_CDTIPOOPER   PEDIDO.CDTIPOOPER%TYPE;
   V_IDORIGDESTOP TIPOOPERAC.IDORIGDESTOP%TYPE;
   V_CDVENDEDOR   PEDIDO.CDVENDEDOR%TYPE;

   V_CDPRODESTO     PRODUTO.CDPRODUTO%TYPE;
   V_CDPRODEMANDA   PRODUTO.CDPRODUTO%TYPE;
   V_QTSEMIACAB     FLOAT;
   V_QTESTOQDIA     FLOAT;
   V_QTDEMANDA      FLOAT;
   V_QTESTOQUE      FLOAT;

BEGIN
   /* Verifica parametros do manufatura */
   SELECT
      MAX(DSNUMELOTEPR),
      MAX(DSSEQULOTEPR),
      NVL(MAX(IDSUBOPSEMIACA),'N'),
      MAX(NVL(IDENTRSEQLOTE,'N')),
      MAX(NVL(IDUTEQUIPLAPROD, 'N'))
   INTO
      V_DSNUMELOTEPR,
      V_DSSEQULOTEPR,
      V_IDSUBOPSEMIACA,
      V_IDENTRSEQ,
      V_IDUTEQUIPLAPROD
   FROM
      PARAMAN M, PARAMFILIAL F
   WHERE
      M.CDFILIAL = P_CDFILIAL    AND
      M.CDFILIAL = F.CDFILIAL;

   SELECT MAX(IDUTRESELOTE)
   INTO V_IDUTRESELOTE
   FROM PARAMPEDIDO
   WHERE
       CDFILIAL = P_CDFILIAL;

   V_NRORDENAOP  := 'X';
   V_CDPRODFINAL := 'X';
   V_QTDEMANDA   := 0;
   V_QTESTOQUE   := 0;
   V_QTESTOQDIA  := 0;
   V_QTDEOP      := 0;

   -- Limpa a tabela de estoque temporaria.
   DELETE FROM ESTSEMIACAB;

   -- Agrupa as demandas geradas pelos pedidos ou pelo estoque de seguranca para verificar estoque.
   FOR C_ITENS IN (
       SELECT I.CDFILIAL,
             I.NRPEDIDO,
             F.CDPROCFABRIC,
             P.CDPRODESTO AS CDPRODUTO,
             SUM(I.QTITEMPED - NVL(I.QTEXPITEMPED,0)) AS QUANTIDADE
        FROM PROCFABRICA F,
             ITEMPEDIDO  I,
             PRODUTO     P
       WHERE (I.CDFILIAL     = P_CDFILIAL  )
         AND (I.CDPRODUTO    = P.CDPRODUTO )
         AND (F.CDFILIAL     = I.CDFILIAL  )
         AND (F.CDPRODUTO    = P.CDPRODESTO)
         AND (F.IDPROFABPADR = 'S'         )
         AND ((I.QTITEMPED - NVL(I.QTEXPITEMPED,0)) > 0)
         AND ((INSTR(P_NRPEDIDO_DIRETO, I.NRPEDIDO) > 0) OR (P_NRPEDIDO_DIRETO = 'T'))
         AND (P_NRPEDIDO_DIRETO IS NOT NULL)
       GROUP BY I.CDFILIAL, I.NRPEDIDO, F.CDPROCFABRIC, P.CDPRODESTO

       UNION

       SELECT I.CDFILIAL,
             I.NRPEDIDO,
             F.CDPROCFABRIC,
             P.CDPRODESTO AS CDPRODUTO,
             SUM(I.QTITEMPED - NVL(I.QTEXPITEMPED,0)) AS QUANTIDADE
        FROM PROCFABRICA F,
             ITEMPEDIDO  I,
             PRODUTO     P
       WHERE (I.CDFILIAL     = P_CDFILIAL  )
         AND (I.CDPRODUTO    = P.CDPRODUTO )
         AND (F.CDFILIAL     = I.CDFILIAL  )
         AND (F.CDPRODUTO    = P.CDPRODESTO)
         AND ((F.CDPROCFABRIC = I.CDPROCFABRIC) OR (F.IDPROFABPADR = 'S'))
         AND ((I.QTITEMPED - NVL(I.QTEXPITEMPED,0)) > 0)
         AND (INSTR(P_NRITEMPED_DIRETO, I.NRPEDIDO||I.NRITEMPED) > 0)
         AND (P_NRITEMPED_DIRETO IS NOT NULL)
       GROUP BY I.CDFILIAL, I.NRPEDIDO, F.CDPROCFABRIC, P.CDPRODESTO

       UNION

       -- Rotina de geracao de MRP pela tela de Estoque de Seguranca
       SELECT P_CDFILIAL,
             '' AS NRPEDIDO,
             F.CDPROCFABRIC,
             P.CDPRODESTO AS CDPRODUTO,
             P_QTDE AS QUANTIDADE
        FROM PROCFABRICA F,
             PRODUTO     P
       WHERE (F.CDFILIAL     = P_CDFILIAL  )
         AND (P.CDPRODUTO    = P_CDPRODUTO )
         AND (P.CDPRODESTO   = F.CDPRODUTO )
         AND (F.IDPROFABPADR = 'S')
         AND (P_QTDE > 0)
         AND (P_CDPRODUTO IS NOT NULL)

       )
       --ORDER BY CDFILIAL, CDPROCFABRIC, CDPRODUTO)
   LOOP

      IF C_ITENS.QUANTIDADE > 0 THEN

         -- Consulta o estoque do dia para os produtos.
         BEGIN
            SELECT PE.CDPRODUTO, SUM(QTESTDIACON) AS QTESTOQDIA
              INTO V_CDPRODESTO, V_QTESTOQDIA
              FROM POSESTCONS PE, PARAMPEDIDO PA, PRODUTO PR
             WHERE (PE.QTESTDIACON <>  0              )
               AND (PE.CDPRODUTO   = PR.CDPRODESTO    )
               AND (PE.CDFILIAL    = PA.CDFILIAL      )
               AND (NVL(PA.IDCONSESTGEROP, 'N') = 'S' )
               AND (P_CDPRODUTO IS NULL)
               AND (PE.CDFILIAL    = C_ITENS.CDFILIAL )
               AND (PR.CDPRODUTO   = C_ITENS.CDPRODUTO)
               AND (PE.DTPOSESTCON = (
                                      SELECT MAX(PO.DTPOSESTCON)
                                        FROM POSESTCONS PO
                                       WHERE (PO.CDFILIAL     = PE.CDFILIAL )
                                         AND (PO.CDPRODUTO    = PE.CDPRODUTO)
                                         AND (PO.DTPOSESTCON <= SYSDATE+1)
                                      )
                   )
             GROUP BY PE.CDPRODUTO;
          EXCEPTION
             WHEN NO_DATA_FOUND THEN
                V_CDPRODESTO := '';
                V_QTESTOQDIA := 0;
          END;

         IF V_QTESTOQDIA > 0 THEN

            -- Verifica se a quantidade em estoque ja esta salva na tabela temporaria.
            BEGIN
               SELECT CDPRODUTO, QTDEMANDA, QTESTOQUE
                 INTO V_CDPRODEMANDA, V_QTDEMANDA, V_QTESTOQUE
                 FROM ESTSEMIACAB
                WHERE (CDFILIAL  = C_ITENS.CDFILIAL)
                  AND (NRPEDIDO  = C_ITENS.NRPEDIDO)
                  AND (CDPRODUTO = V_CDPRODESTO    );
             EXCEPTION
                WHEN NO_DATA_FOUND THEN
                   V_CDPRODEMANDA := '';
                   V_QTDEMANDA    := 0;
                   V_QTESTOQUE    := 0;
             END;

            IF (NOT V_CDPRODEMANDA = '') THEN

               -- Altera a quantidade da demanda deste produto.
               UPDATE ESTSEMIACAB
                  SET QTDEMANDA = V_QTDEMANDA + C_ITENS.QUANTIDADE
                WHERE (CDFILIAL  = C_ITENS.CDFILIAL)
                  AND (NRPEDIDO  = C_ITENS.NRPEDIDO)
                  AND (CDPRODUTO = V_CDPRODEMANDA  );

            ELSE
               -- Insere a demanda e a quantidade disponivel do produto.
               INSERT INTO ESTSEMIACAB (CDFILIAL, CDPRODUTO, QTDEMANDA, QTESTOQUE, NRPEDIDO)
               VALUES (C_ITENS.CDFILIAL, V_CDPRODESTO, C_ITENS.QUANTIDADE, V_QTESTOQDIA, C_ITENS.NRPEDIDO);

            END IF;
         END IF;

         V_QTDEOP := C_ITENS.QUANTIDADE - V_QTESTOQDIA;

         IF V_QTDEOP > 0 THEN

            -- Consulta os semiacabados do produto passado com parametro.
            FOR C_SEMIACABADO IN (
               SELECT I.CDFILIAL,
                      I.CDPRODUTO,
                      I.CDPRODINSUMO,
                      F.CDPROCFABRIC,
                      (QTPREVI_MATPRIMA(I.CDFILIAL, I.CDPRODUTO, I.CDPROCFABRIC, I.CDETAPAPROD, I.CDPRODINSUMO, C_ITENS.QUANTIDADE)) AS QTAINSUMPREOP
                 FROM PROCFABRICA F,
                      INSUMETAPA  I
                WHERE (I.IDSEMIACETAP = 'S'           )
                  AND (F.IDPROFABPADR = 'S'           )
                  AND (F.CDFILIAL     = I.CDFILIAL    )
                  AND (F.CDPRODUTO    = I.CDPRODINSUMO)
                  AND (I.CDFILIAL     = C_ITENS.CDFILIAL    )
                  AND (I.CDPRODUTO    = C_ITENS.CDPRODUTO   )
                  AND (I.CDPROCFABRIC = C_ITENS.CDPROCFABRIC)
                ORDER BY I.CDPRODUTO, I.CDPRODINSUMO)
            LOOP

               IF C_SEMIACABADO.QTAINSUMPREOP > 0 THEN

                  -- Consulta o estoque do dia para os produtos.

                  /* Se for referente a rotina de Estoque Minimo:
                     Produto Principal: Nao verifica estoque para geracao de OP
                     Semi Acabados    : Verificam estoque para geracao de OP
                  */

                  BEGIN
                     SELECT PE.CDPRODUTO, SUM(QTESTDIACON) AS QTESTOQDIA
                       INTO V_CDPRODESTO, V_QTESTOQDIA
                       FROM POSESTCONS PE, PARAMPEDIDO PA, PRODUTO PR
                      WHERE (PE.QTESTDIACON <>  0              )
                        AND (PE.CDPRODUTO   = PR.CDPRODESTO    )
                        AND (PE.CDFILIAL    = PA.CDFILIAL      )
                        AND (NVL(PA.IDCONSESTGEROP, 'N') = 'S' )
                        AND (PE.CDFILIAL    = C_SEMIACABADO.CDFILIAL    )
                        AND (PR.CDPRODUTO   = C_SEMIACABADO.CDPRODINSUMO)
                        AND (PE.DTPOSESTCON = (
                                               SELECT MAX(PO.DTPOSESTCON)
                                                 FROM POSESTCONS PO
                                                WHERE (PO.CDFILIAL     = PE.CDFILIAL )
                                                  AND (PO.CDPRODUTO    = PE.CDPRODUTO)
                                                  AND (PO.DTPOSESTCON <= SYSDATE+1)
                                               )
                            )
                      GROUP BY PE.CDPRODUTO;
                   EXCEPTION
                      WHEN NO_DATA_FOUND THEN
                         V_CDPRODESTO := '';
                         V_QTESTOQDIA := 0;
                   END;

                  IF V_QTESTOQDIA > 0 THEN

                     -- Verifica se a quantidade em estoque ja esta salva na tabela temporaria.
                     BEGIN
                        SELECT CDPRODUTO, QTDEMANDA, QTESTOQUE
                          INTO V_CDPRODEMANDA, V_QTDEMANDA, V_QTESTOQUE
                          FROM ESTSEMIACAB
                         WHERE (CDFILIAL  = C_SEMIACABADO.CDFILIAL)
                           AND (NRPEDIDO  = C_ITENS.NRPEDIDO)
                           AND (CDPRODUTO = V_CDPRODESTO    );
                      EXCEPTION
                         WHEN NO_DATA_FOUND THEN
                            V_CDPRODEMANDA := '';
                            V_QTDEMANDA    := 0;
                            V_QTESTOQUE    := 0;
                      END;

                     IF (NOT V_CDPRODEMANDA = '') THEN

                        -- Altera a quantidade da demanda deste produto.
                        UPDATE ESTSEMIACAB
                           SET QTDEMANDA = V_QTDEMANDA + C_SEMIACABADO.QTAINSUMPREOP
                         WHERE (CDFILIAL  = C_ITENS.CDFILIAL)
                           AND (NRPEDIDO  = C_ITENS.NRPEDIDO)
                           AND (CDPRODUTO = V_CDPRODEMANDA  );

                     ELSE
                        -- Insere a demanda e a quantidade disponivel do produto.
                        INSERT INTO ESTSEMIACAB (CDFILIAL, CDPRODUTO, QTDEMANDA, QTESTOQUE, NRPEDIDO)
                        VALUES (C_SEMIACABADO.CDFILIAL, V_CDPRODESTO, C_SEMIACABADO.QTAINSUMPREOP, V_QTESTOQDIA, C_ITENS.NRPEDIDO);

                     END IF;
                  END IF;

                  V_QTSEMIACAB := C_SEMIACABADO.QTAINSUMPREOP - V_QTESTOQDIA;

                  IF V_QTSEMIACAB > 0 THEN

                     -- Chama a mesma ESTOQUE_SEMIACABADO recursivamente verificando estoque para os semiacabados dos semiacabados.
                     ESTOQUE_SEMIACABADO(C_SEMIACABADO.CDFILIAL, C_ITENS.NRPEDIDO, C_SEMIACABADO.CDPRODINSUMO, C_SEMIACABADO.CDPROCFABRIC, V_QTSEMIACAB);
                  END IF;
               END IF;
            END LOOP;
         END IF;
      END IF;
   END LOOP;

   V_QTDEOP      := 0;

   IF (NOT V_DSNUMELOTEPR IS NULL) AND
      (NOT V_DSSEQULOTEPR IS NULL) THEN
      /* Verifica produtos MRP para geracao de OP */
      FOR C_CALECOMP IN
         (SELECT CDPRODUTO,
                 CDPROCFABRIC,
                 VALIDADE_PRODUTO(CDPRODUTO, DTCONCPROMRP) AS DTVALIDADE,
                 DTCONCPROMRP,
                 QTAFABRICMRP,
                 NRORDENAOP,
                 NRORDENASUBOP,
                 CDPRODFINAL,
                 NRSEQLOTEDIA,
                 DTENTPRODPROG,
                 CDFILIAL,
                 NRPEDIDO,
                 NRITEMPED
           FROM (SELECT P.CDPRODUTO,
                        PF.CDPROCFABRIC,
                        VALIDADE_PRODUTO(P.CDPRODUTO, P.DTCONCPROMRP) AS DTVALIDADE,
                        P.DTCONCPROMRP,
                        P.QTAFABRICMRP,
                        P.NRORDENAOP,
                        P.NRORDENASUBOP,
                        P.CDPRODFINAL,
                        NRSEQLOTEDIA,
                        DTENTPRODPROG,
                        P.CDFILIAL,
                        '' AS NRPEDIDO,
                        '' AS NRITEMPED
                   FROM PROCFABRICA PF,
                        PRODUTO PROD,
                        CALEPRODMRP P
                  WHERE (P.CDFILIAL         = P_CDFILIAL    ) AND
                        (P.DTPROGPRODCP     = P_DTMRP       ) AND
                        (P.QTAFABRICMRP     > 0             ) AND
                        (P.CDPRODUTO        = PROD.CDPRODUTO) AND
                        (PF.CDFILIAL        = P.CDFILIAL    ) AND
                        (PF.CDPRODUTO       = P.CDPRODUTO   ) AND
                        (PF.IDPROFABPADR    = 'S'           ) AND
                        (P_NRPEDIDO_DIRETO  is null         ) AND (P_NRITEMPED_DIRETO is null)

                 UNION

                 SELECT P.CDPRODUTO,
                        PF.CDPROCFABRIC,
                        VALIDADE_PRODUTO(P.CDPRODUTO, SYSDATE) AS DTVALIDADE,
                        SYSDATE AS DTCONCPROMRP,
                        (P.QTITEMPED - NVL(P.QTEXPITEMPED,0)) AS QTAFABRICMRP,

                        ' ' AS NRORDENAOP,
                        ' ' AS NRORDENASUBOP,
                        ' ' AS CDPRODFINAL,
                        ' ' AS NRSEQLOTEDIA,
                        SYSDATE AS DTENTPRODPROG,
                        P.CDFILIAL,
                        P.NRPEDIDO,
                        P.NRITEMPED
                   FROM PROCFABRICA PF,
                        PRODUTO PROD,
                        ITEMPEDIDO P,
                        ORDPRODUCAO O
                  WHERE (P.CDFILIAL      = P_CDFILIAL       ) AND
                        (P.QTITEMPED     > 0                ) AND
                        (P.CDPRODUTO     = PROD.CDPRODUTO   ) AND
                        (PF.CDFILIAL     = P.CDFILIAL       ) AND
                        (PF.CDPRODUTO    = P.CDPRODUTO      ) AND
                        ((PF.CDPROCFABRIC = P.CDPROCFABRIC) OR (PF.IDPROFABPADR = 'S')) AND
                        (P.CDFILIAL      = O.CDFILIAL    (+)) AND
                        (P.NRPEDIDO      = O.NRPEDIDO    (+)) AND
                        (P.NRITEMPED     = O.NRITEMPED   (+)) AND
                        (NVL(O.IDSITORDPROD, '0') <> '4') AND
                        ((((INSTR(P_NRPEDIDO_DIRETO, P.NRPEDIDO) > 0) OR (P_NRPEDIDO_DIRETO = 'T'))
                            AND (P_NRPEDIDO_DIRETO IS NOT NULL)) OR
                        (((INSTR(P_NRITEMPED_DIRETO, P.NRPEDIDO||P.NRITEMPED) > 0) OR (P_NRITEMPED_DIRETO = 'T'))
                            AND (P_NRITEMPED_DIRETO IS NOT NULL)))

                  UNION

                  -- Rotina de geracao de MRP pela tela de Estoque de Seguranca
                  SELECT P.CDPRODUTO,
                         F.CDPROCFABRIC,
                         VALIDADE_PRODUTO(P.CDPRODUTO, SYSDATE) AS DTVALIDADE,
                         SYSDATE AS DTCONCPROMRP,
                         P_QTDE AS QTAFABRICMRP,

                         ' ' AS NRORDENAOP,
                         ' ' AS NRORDENASUBOP,
                         ' ' AS CDPRODFINAL,
                         ' ' AS NRSEQLOTEDIA,
                         SYSDATE AS DTENTPRODPROG,
                         F.CDFILIAL,
                         '' AS NRPEDIDO,
                         '' AS NRITEMPED
                   FROM PROCFABRICA F,
                        PRODUTO     P
                  WHERE (F.CDFILIAL     = P_CDFILIAL  )
                    AND (P.CDPRODUTO    = P_CDPRODUTO )
                    AND (P.CDPRODESTO   = F.CDPRODUTO )
                    AND (F.IDPROFABPADR = 'S')
                    AND (P_QTDE > 0)
                    AND (P_CDPRODUTO IS NOT NULL)
                 )
          ORDER BY NRORDENAOP DESC,
                   NRORDENASUBOP DESC,
                   DTCONCPROMRP,
                   CDFILIAL DESC,
                   NRPEDIDO DESC,
                   NRITEMPED,
                   CDPRODUTO
         )
      LOOP

         IF (P_NRPEDIDO_DIRETO IS NULL) AND (P_NRITEMPED_DIRETO IS NULL) AND (P_CDPRODUTO IS NULL) THEN
            IF ((V_NRORDENAOP <> C_CALECOMP.NRORDENAOP) OR (V_IDSUBOPSEMIACA = 'N')) THEN
               /* Gera o numero do Lote de Producao */

               PRXLOTEPROD(P_CDFILIAL, C_CALECOMP.DTCONCPROMRP, C_CALECOMP.CDPRODUTO, V_NRLOTEESTQ);

               /* Gera o numero da OP/SubOP */
               NOVO_CODIGO_SC('NRORDPROD'||P_CDFILIAL, V_SEQNRORDPROD, 1);
               V_NRORDPROD     := SUBSTR(V_SEQNRORDPROD, 11, 10);
               V_NRORDENASUBOP := '0';

               V_NRORDENAOP := C_CALECOMP.NRORDENAOP;
            END IF;

            IF V_CDPRODFINAL <> C_CALECOMP.CDPRODFINAL THEN
               V_DTVALILOTE := C_CALECOMP.DTVALIDADE;
               V_CDPRODFINAL := C_CALECOMP.CDPRODFINAL;
            END IF;

            V_NRSUBLOTE := ' ';

            SELECT
               MAX(NRLOTEESTQ)
            INTO
               V_NRLOTEEXIST
            FROM
               LOTE
            WHERE
               CDFILIAL     = P_CDFILIAL    AND
               CDPRODUTO    = C_CALECOMP.CDPRODUTO AND
               NRLOTEESTQ   = V_NRLOTEESTQ;

            BEGIN
               SELECT NVL(IDGERAOPCONF,'N')
               INTO V_IDGERAOPCONF
               FROM PARAMPRODMRP
               WHERE
                  CDFILIAL = P_CDFILIAL AND
                  CDPRODUTO =  C_CALECOMP.CDPRODUTO;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_IDGERAOPCONF := 'N';
            END;

            IF V_NRLOTEEXIST IS NULL THEN
               INSERT INTO LOTE
                  (CDFILIAL, NRLOTEESTQ, NRSUBLOTE, CDPRODUTO, IDSTATLOTE,
                  DTENTRLOTE, DTVALILOTE, IDSTPRODLOTE, CDPLANPRODLT)
               VALUES
                  (P_CDFILIAL, V_NRLOTEESTQ, V_NRSUBLOTE, C_CALECOMP.CDPRODUTO, 'I',
                   C_CALECOMP.DTCONCPROMRP, V_DTVALILOTE, '1', P_NRPLANOPROD);
            END IF;

            V_DSORDPROD := P_DSORDPROD;

            INSERT INTO ORDPRODUCAO
               (CDFILIAL, NRORDPROD, NRSUBORDPROD, CDPRODUTO,
                CDPROCFABRIC, IDSITORDPROD, IDTIPORDPROD, DTGERORDPROD, QTAPRODPREOP,
               DTHRINIPREOP, NRLOTEESTQ, NRSUBLOTE, DSORDPROD, CDPLANPRODOP, IDCONFIRMAOP,
               NRPEDIDO, NRITEMPED)
            VALUES
               (P_CDFILIAL, V_NRORDPROD, V_NRORDENASUBOP, C_CALECOMP.CDPRODUTO,
               C_CALECOMP.CDPROCFABRIC, '1', '3', C_CALECOMP.DTCONCPROMRP, C_CALECOMP.QTAFABRICMRP,
               C_CALECOMP.DTCONCPROMRP, V_NRLOTEESTQ, V_NRSUBLOTE, V_DSORDPROD, P_NRPLANOPROD, V_IDGERAOPCONF,
               C_CALECOMP.NRPEDIDO, C_CALECOMP.NRITEMPED);
         ELSE

            V_QTDEMANDA := 0;
            V_NRITEMPED := C_CALECOMP.NRITEMPED;

            -- Consulta tabela temporaria de estoque.
            BEGIN
               SELECT CDPRODUTO, QTESTOQUE
                 INTO V_CDPRODEMANDA, V_QTESTOQUE
                 FROM ESTSEMIACAB
                WHERE (CDFILIAL  = P_CDFILIAL)
                  AND (NRPEDIDO  = C_CALECOMP.NRPEDIDO )
                  AND (CDPRODUTO = C_CALECOMP.CDPRODUTO);
             EXCEPTION
                WHEN NO_DATA_FOUND THEN
                   V_CDPRODEMANDA := '';
                   V_QTESTOQUE    := 0;
             END;

            IF V_QTESTOQUE > 0 THEN
               V_QTDEMANDA := C_CALECOMP.QTAFABRICMRP - V_QTESTOQUE;

               IF (V_QTESTOQUE - C_CALECOMP.QTAFABRICMRP) > 0 THEN
                  -- Altera a quantidade de estoque deste produto.
                  UPDATE ESTSEMIACAB
                     SET QTESTOQUE = V_QTESTOQUE - C_CALECOMP.QTAFABRICMRP
                   WHERE (CDFILIAL  = P_CDFILIAL)
                     AND (NRPEDIDO  = C_CALECOMP.NRPEDIDO )
                     AND (CDPRODUTO = C_CALECOMP.CDPRODUTO);
               ELSE
                  -- Zera a quantidade de estoque deste produto.
                  UPDATE ESTSEMIACAB
                     SET QTESTOQUE = 0
                   WHERE (CDFILIAL  = P_CDFILIAL)
                     AND (NRPEDIDO  = C_CALECOMP.NRPEDIDO )
                     AND (CDPRODUTO = C_CALECOMP.CDPRODUTO);
               END IF;

            ELSE
               V_QTDEMANDA := C_CALECOMP.QTAFABRICMRP;
            END IF;

            IF V_QTDEMANDA > 0 THEN

               -- Rotina de Pedido
               BEGIN
                  SELECT QTPADPROCFAB, IDTPPROPOPF, IDTPARREDPF
                     INTO V_QTPADPROCFAB, V_IDTPPROPOPF, V_IDTPARREDPF
                     FROM PROCFABRICA
                    WHERE CDFILIAL  = P_CDFILIAL
                      AND CDPRODUTO = C_CALECOMP.CDPRODUTO
                      AND IDPROFABPADR = 'S';
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_QTPADPROCFAB := 0;
                     V_IDTPPROPOPF  := 'N';
                     V_IDTPARREDPF  := '1';
               END;

               BEGIN
                  SELECT NVL(IDPEDINDUSTRIA, 'N')
                    INTO V_IDPEDINDUSTRIA
                    FROM PEDIDO
                   WHERE CDFILIAL = P_CDFILIAL
                     AND NRPEDIDO = C_CALECOMP.NRPEDIDO;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_IDPEDINDUSTRIA := 'N';
               END;

               /* se a quantidade a fabricar for diferente da quantidade padrao do processo de fabricacao, e necessario
                  verificar o tipo de proporcao e arredondamento para gerar as ops de acordo com eles */
               IF (V_QTDEMANDA <> V_QTPADPROCFAB) THEN
                  V_CONTADOR  := 1;
                  V_CONTADOR2 := 1;
                  V_CONTGEROP := 0;

                  IF V_IDTPPROPOPF = 'N' THEN
                     V_CONTGEROP := V_QTDEMANDA / V_QTPADPROCFAB;
                     V_CONTGEROP := V_CONTGEROP + 1;
                     V_CONTGEROP := TRUNC(V_CONTGEROP, 0);
                     V_QTDEOP := V_QTDEMANDA;

                     FOR V_CONTADOR IN V_CONTADOR2..V_CONTGEROP LOOP
                        IF (V_CONTADOR <> V_CONTGEROP) THEN
                           V_QTDEOP := V_QTPADPROCFAB;
                        ELSE
                           V_QTDEOP :=  V_QTDEMANDA - (V_QTPADPROCFAB * (V_CONTGEROP - 1));
                        END IF;


                        IF V_QTDEOP > 0 THEN
                           /* Gera o numero do Lote de Producao */
                           PRXLOTEPROD(P_CDFILIAL, C_CALECOMP.DTCONCPROMRP, C_CALECOMP.CDPRODUTO, V_NRLOTEESTQ);

                           /* Gera o numero da OP/SubOP */
                           NOVO_CODIGO_SC('NRORDPROD'||P_CDFILIAL, V_SEQNRORDPROD, 1);
                           V_NRORDPROD     := SUBSTR(V_SEQNRORDPROD, 11, 10);
                           V_NRORDENASUBOP := '0';

                           V_NRORDENAOP := C_CALECOMP.NRORDENAOP;

                           IF V_CDPRODFINAL <> C_CALECOMP.CDPRODFINAL THEN
                              V_DTVALILOTE := C_CALECOMP.DTVALIDADE;
                              V_CDPRODFINAL := C_CALECOMP.CDPRODFINAL;
                           END IF;

                           V_NRSUBLOTE := ' ';

                           SELECT
                              MAX(NRLOTEESTQ)
                           INTO
                              V_NRLOTEEXIST
                           FROM
                              LOTE
                           WHERE
                              CDFILIAL     = P_CDFILIAL    AND
                              CDPRODUTO    = C_CALECOMP.CDPRODUTO AND
                              NRLOTEESTQ   = V_NRLOTEESTQ;

                           BEGIN
                              SELECT NVL(IDGERAOPCONF,'N')
                              INTO V_IDGERAOPCONF
                              FROM PARAMPRODMRP
                              WHERE
                                 CDFILIAL = P_CDFILIAL AND
                                 CDPRODUTO =  C_CALECOMP.CDPRODUTO;
                           EXCEPTION
                              WHEN NO_DATA_FOUND THEN
                                 V_IDGERAOPCONF := 'N';
                           END;

                           IF V_NRLOTEEXIST IS NULL THEN
                              INSERT INTO LOTE
                                 (CDFILIAL, NRLOTEESTQ, NRSUBLOTE, CDPRODUTO, IDSTATLOTE,
                                 DTENTRLOTE, DTVALILOTE, IDSTPRODLOTE, CDPLANPRODLT)
                              VALUES
                                 (P_CDFILIAL, V_NRLOTEESTQ, V_NRSUBLOTE, C_CALECOMP.CDPRODUTO, 'I',
                                  C_CALECOMP.DTCONCPROMRP, V_DTVALILOTE, '1', P_NRPLANOPROD);
                           END IF;

                           IF V_IDPEDINDUSTRIA = 'S' THEN
                              IF (V_CONTADOR = '1') THEN
                                 BEGIN
                                    SELECT VRFATOCONV
                                      INTO V_VRFATOCONV
                                      FROM PRODUTO
                                     WHERE
                                       CDPRODESTO =  C_CALECOMP.CDPRODUTO;
                                 EXCEPTION
                                    WHEN NO_DATA_FOUND THEN
                                       V_VRFATOCONV := '1';
                                 END;

                                 V_NRITEMPED := C_CALECOMP.NRITEMPED;

                                 IF (V_QTDEMANDA > V_QTDEOP) THEN
                                    BEGIN
                                       UPDATE ITEMPEDIDO
                                         SET QTITEMPED  = V_QTDEOP,
                                             QTITEMPED2 = V_VRFATOCONV * V_QTDEOP
                                        WHERE CDFILIAL  = P_CDFILIAL
                                          AND CDPRODUTO = C_CALECOMP.CDPRODUTO
                                          AND NRPEDIDO  = C_CALECOMP.NRPEDIDO;
                                    END;

                                    SELECT F.CDEMPRESA, F.CDINSCESTA, PE.CDCLIENTE, PE.CDFILIALPED, F.CDFILIAL,
                                        PE.NRPEDIDO, I.NRITEMPED, I.DTENTITPED, PE.CDTIPOOPER, T.IDENTRSAIDOP,
                                        PE.CDVENDEDOR, I.CDOPERADOR, I.IDSITITEMPED, I.VRPREUNITPED
                                    INTO V_CDEMPRESA, V_CDINSCESTA, V_CDCLIENTE, V_CDFILIALPED, V_CDFILIAL,
                                         V_NRPEDIDO, V_NRITEMPED, V_DTENTITPED, V_CDTIPOOPER, V_IDORIGDESTOP,
                                         V_CDVENDEDOR, V_CDOPERADOR, V_IDSITITEMPED, V_VRPREUNITPED
                                    FROM FILIAL F, PEDIDO PE, ITEMPEDIDO I, TIPOOPERAC T, VENDEDOR V
                                   WHERE PE.CDFILIAL    = P_CDFILIAL
                                     AND PE.NRPEDIDO    = C_CALECOMP.NRPEDIDO
                                     AND I.CDFILIAL     = PE.CDFILIAL
                                     AND I.NRPEDIDO     = PE.NRPEDIDO
                                     AND I.CDPRODUTO    = C_CALECOMP.CDPRODUTO
                                     AND PE.CDFILIAL    = F.CDFILIAL
                                     AND PE.CDTIPOOPER  = T.CDTIPOOPER
                                     AND T.IDENTRSAIDOP = 'S'
                                     AND PE.CDVENDEDOR  = V.CDVENDEDOR
                                     AND ROWNUM = '1';

                                    IMPOSTO_ITEMPEDIDO(V_CDEMPRESA, V_CDINSCESTA, V_CDCLIENTE, V_CDFILIALPED, V_CDFILIAL,
                                                       V_NRPEDIDO, V_NRITEMPED, V_DTENTITPED, V_CDTIPOOPER, V_IDORIGDESTOP);
                                    GERA_COMISSAOVEND(V_CDFILIAL, V_NRPEDIDO, V_CDVENDEDOR, V_CDOPERADOR, V_NRITEMPED, V_IDSITITEMPED,
                                                      C_CALECOMP.CDPRODUTO, V_VRPREUNITPED, '');
                                 END IF;
                              ELSE
                                 SELECT NRPEDIDO,       CDPRODUTO,       QTITEMPED,    VRPREUNITPED,
                                        NRITEMPED,      IDSITITEMPED,    QTEXPITEMPED, CDFILIAL,
                                        CDFATPRECO,     QTITEMPED2,      DTENTITPED,
                                        IDITPEDDIFER,   VRPESOITPED,     VRDESITPED,
                                        IDITPEDRESER,   VRPRTABITPED,    VRPEDEMAXIPE,
                                        CDOPERADOR,     VRPERCMARKUPIT,  CDTIPODESC,
                                        DSITEMPED,      DSEMISSAOITPED,  DSPRAZOENTITPED,
                                        CDEMISSAOITPED, NRITORDEMCMPPED, IDPRECOPROM,
                                        VRVARIAVEL,     CDFATOR,         IDITEMPEDTERC

                                   INTO V_NRPEDIDO,       V_CDPRODUTO,       V_QTITEMPED,    V_VRPREUNITPED,
                                        V_NRITEMPED,      V_IDSITITEMPED,    V_QTEXPITEMPED, V_CDFILIAL,
                                        V_CDFATPRECO,     V_QTITEMPED2,      V_DTENTITPED,
                                        V_IDITPEDDIFER,   V_VRPESOITPED,     V_VRDESITPED,
                                        V_IDITPEDRESER,   V_VRPRTABITPED,    V_VRPEDEMAXIPE,
                                        V_CDOPERADOR,     V_VRPERCMARKUPIT,  V_CDTIPODESC,
                                        V_DSITEMPED,      V_DSEMISSAOITPED,  V_DSPRAZOENTITPED,
                                        V_CDEMISSAOITPED, V_NRITORDEMCMPPED, V_IDPRECOPROM,
                                        V_VRVARIAVEL,     V_CDFATOR,         V_IDITEMPEDTERC
                                   FROM ITEMPEDIDO
                                  WHERE CDFILIAL  = P_CDFILIAL
                                    AND CDPRODUTO = C_CALECOMP.CDPRODUTO
                                    AND NRPEDIDO  = C_CALECOMP.NRPEDIDO
                                    AND ROWNUM = '1'
                                   ORDER BY NRITEMPED;

                                  BEGIN
                                     SELECT LPAD((NVL(MAX(NRITEMPED), '0') + 1), 10, '0')
                                       INTO V_NRITEMPED
                                       FROM ITEMPEDIDO
                                      WHERE CDFILIAL = P_CDFILIAL
                                        AND NRPEDIDO  = C_CALECOMP.NRPEDIDO;
                                  EXCEPTION
                                    WHEN NO_DATA_FOUND THEN
                                       V_NRITEMPED := '1';
                                  END;

                                  INSERT INTO ITEMPEDIDO
                                     (NRPEDIDO,       CDPRODUTO,       QTITEMPED,    VRPREUNITPED,
                                      NRITEMPED,      IDSITITEMPED,    QTEXPITEMPED, CDFILIAL,
                                      CDFATPRECO,     QTITEMPED2,      DTENTITPED,
                                      IDITPEDDIFER,   VRPESOITPED,     VRDESITPED,
                                      IDITPEDRESER,   VRPRTABITPED,    VRPEDEMAXIPE,
                                      CDOPERADOR,     VRPERCMARKUPIT,  CDTIPODESC,
                                      DSITEMPED,      DSEMISSAOITPED,  DSPRAZOENTITPED,
                                      CDEMISSAOITPED, NRITORDEMCMPPED, IDPRECOPROM,
                                      VRVARIAVEL,     CDFATOR,         IDITEMPEDTERC)
                                  VALUES
                                     (V_NRPEDIDO,      V_CDPRODUTO,       V_QTDEOP,    V_VRPREUNITPED,
                                     V_NRITEMPED,      V_IDSITITEMPED,    V_QTEXPITEMPED, V_CDFILIAL,
                                     V_CDFATPRECO,     V_VRFATOCONV * V_QTDEOP, V_DTENTITPED,
                                     V_IDITPEDDIFER,   V_VRPESOITPED,     V_VRDESITPED,
                                     V_IDITPEDRESER,   V_VRPRTABITPED,    V_VRPEDEMAXIPE,
                                     V_CDOPERADOR,     V_VRPERCMARKUPIT,  V_CDTIPODESC,
                                     V_DSITEMPED,      V_DSEMISSAOITPED,  V_DSPRAZOENTITPED,
                                     V_CDEMISSAOITPED, V_NRITORDEMCMPPED, V_IDPRECOPROM,
                                     V_VRVARIAVEL,     V_CDFATOR,         V_IDITEMPEDTERC);

                                  SELECT F.CDEMPRESA, F.CDINSCESTA, PE.CDCLIENTE, PE.CDFILIALPED, F.CDFILIAL,
                                        PE.NRPEDIDO, I.NRITEMPED, I.DTENTITPED, PE.CDTIPOOPER, T.IDENTRSAIDOP,
                                        PE.CDVENDEDOR, I.CDOPERADOR, I.IDSITITEMPED, I.VRPREUNITPED
                                    INTO V_CDEMPRESA, V_CDINSCESTA, V_CDCLIENTE, V_CDFILIALPED, V_CDFILIAL,
                                         V_NRPEDIDO, V_NRITEMPED, V_DTENTITPED, V_CDTIPOOPER, V_IDORIGDESTOP,
                                         V_CDVENDEDOR, V_CDOPERADOR, V_IDSITITEMPED, V_VRPREUNITPED
                                    FROM FILIAL F, PEDIDO PE, ITEMPEDIDO I, TIPOOPERAC T, VENDEDOR V
                                   WHERE PE.CDFILIAL    = P_CDFILIAL
                                     AND PE.NRPEDIDO    = C_CALECOMP.NRPEDIDO
                                     AND I.CDFILIAL     = PE.CDFILIAL
                                     AND I.NRPEDIDO     = PE.NRPEDIDO
                                     AND I.CDPRODUTO    = C_CALECOMP.CDPRODUTO
                                     AND PE.CDFILIAL    = F.CDFILIAL
                                     AND PE.CDTIPOOPER  = T.CDTIPOOPER
                                     AND T.IDENTRSAIDOP = 'S'
                                     AND PE.CDVENDEDOR  = V.CDVENDEDOR
                                     AND I.NRITEMPED    = V_NRITEMPED;

                                  IMPOSTO_ITEMPEDIDO(V_CDEMPRESA, V_CDINSCESTA, V_CDCLIENTE, V_CDFILIALPED, V_CDFILIAL,
                                                      V_NRPEDIDO, V_NRITEMPED, V_DTENTITPED, V_CDTIPOOPER, V_IDORIGDESTOP);
                                  GERA_COMISSAOVEND(V_CDFILIAL, V_NRPEDIDO, V_CDVENDEDOR, V_CDOPERADOR, V_NRITEMPED, V_IDSITITEMPED,
                                                     C_CALECOMP.CDPRODUTO, V_VRPREUNITPED, '');
                              END IF;
                           END IF;

                           IF P_CDPRODUTO IS NULL THEN
                              V_DSORDPROD := P_DSORDPROD||': '||C_CALECOMP.NRPEDIDO||' Item: '||V_NRITEMPED;
                           ELSE
                              V_DSORDPROD := 'OP gerada atraves da tela de Estoque Minimo.';
                           END IF;

                           INSERT INTO ORDPRODUCAO
                              (CDFILIAL, NRORDPROD, NRSUBORDPROD, CDPRODUTO,
                               CDPROCFABRIC, IDSITORDPROD, IDTIPORDPROD, DTGERORDPROD, QTAPRODPREOP,
                              DTHRINIPREOP, NRLOTEESTQ, NRSUBLOTE, DSORDPROD, CDPLANPRODOP, IDCONFIRMAOP,
                              NRPEDIDO, NRITEMPED)
                           VALUES
                              (P_CDFILIAL, V_NRORDPROD, V_NRORDENASUBOP, C_CALECOMP.CDPRODUTO,
                              C_CALECOMP.CDPROCFABRIC, '1', '3', C_CALECOMP.DTCONCPROMRP, V_QTDEOP,
                              C_CALECOMP.DTCONCPROMRP, V_NRLOTEESTQ, V_NRSUBLOTE, V_DSORDPROD, P_NRPLANOPROD, V_IDGERAOPCONF,
                              C_CALECOMP.NRPEDIDO, V_NRITEMPED);

                           V_DSITEMPED := 'OP: '||V_NRORDPROD||'/'||V_NRORDENASUBOP;

                           /* Coloca o numero da OP na observacao do item */
                           IF NOT (V_DSITEMPED IS NULL) THEN
                              UPDATE ITEMPEDIDO
                                 SET DSITEMPED = V_DSITEMPED
                               WHERE CDFILIAL  = P_CDFILIAL
                                 AND NRPEDIDO  = C_CALECOMP.NRPEDIDO
                                 AND NRITEMPED = V_NRITEMPED;
                           END IF;

                           FOR C_SEMIACABADO IN (
                                                SELECT I.CDPRODUTO   ,
                                                       I.CDETAPAPROD ,
                                                       I.CDPRODINSUMO,
                                                       F.CDPROCFABRIC,
                                                       (SYSDATE) AS DTVALIDADE,
                                                       I.IDUTAPRREQET,
                                                       I.IDSEMIACETAP,
                                                       I.QTINSUMETAPA,
                                                       I.QTRENDINSU  ,
                                                       O.QTAPRODPREOP,
                                                       QTPREVI_MATPRIMA(I.CDFILIAL, I.CDPRODUTO, I.CDPROCFABRIC, I.CDETAPAPROD, I.CDPRODINSUMO, O.QTAPRODPREOP) AS QTAINSUMPREOP
                                                  FROM ORDPRODUCAO O,
                                                       PROCFABRICA F,
                                                       INSUMETAPA  I
                                                 WHERE (I.IDSEMIACETAP = 'S'            )
                                                   AND (F.IDPROFABPADR = 'S'            )
                                                   AND (F.CDFILIAL     = I.CDFILIAL     )
                                                   AND (F.CDPRODUTO    = I.CDPRODINSUMO )
                                                   AND (O.CDFILIAL     = I.CDFILIAL     )
                                                   AND (O.CDPRODUTO    = I.CDPRODUTO    )
                                                   AND (O.CDPROCFABRIC = I.CDPROCFABRIC )
                                                   AND (O.CDFILIAL     = P_CDFILIAL     )
                                                   AND (O.NRORDPROD    = V_NRORDPROD    )
                                                   AND (O.NRSUBORDPROD = V_NRORDENASUBOP)
                                                   AND (O.CDPRODUTO    = C_CALECOMP.CDPRODUTO   )
                                                   AND (O.CDPROCFABRIC = C_CALECOMP.CDPROCFABRIC)
                                                 ORDER BY I.CDETAPAPROD, I.CDPRODINSUMO
                                                 ) LOOP

                              IF C_SEMIACABADO.QTAINSUMPREOP > 0 THEN

                                 V_QTSEMIACAB := 0;

                                 -- Consulta tabela temporaria de estoque.

                                 BEGIN
                                    SELECT CDPRODUTO, QTESTOQUE
                                      INTO V_CDPRODEMANDA, V_QTESTOQUE
                                      FROM ESTSEMIACAB
                                     WHERE (CDFILIAL  = P_CDFILIAL)
                                       AND (NRPEDIDO  = C_CALECOMP.NRPEDIDO)
                                       AND (CDPRODUTO = C_SEMIACABADO.CDPRODINSUMO);
                                 EXCEPTION
                                    WHEN NO_DATA_FOUND THEN
                                       V_CDPRODEMANDA := '';
                                       V_QTESTOQUE    := 0;
                                 END;

                                 IF V_QTESTOQUE > 0 THEN
                                    V_QTSEMIACAB := C_SEMIACABADO.QTAINSUMPREOP - V_QTESTOQUE;

                                    IF (V_QTESTOQUE - C_SEMIACABADO.QTAINSUMPREOP) > 0 THEN
                                       -- Altera a quantidade de estoque deste produto.
                                       UPDATE ESTSEMIACAB
                                          SET QTESTOQUE  = V_QTESTOQUE - C_SEMIACABADO.QTAINSUMPREOP
                                        WHERE (CDFILIAL  = P_CDFILIAL)
                                          AND (NRPEDIDO  = C_CALECOMP.NRPEDIDO)
                                          AND (CDPRODUTO = C_SEMIACABADO.CDPRODINSUMO);
                                    ELSE
                                       -- Zera a quantidade de estoque deste produto.
                                       UPDATE ESTSEMIACAB
                                          SET QTESTOQUE  = 0
                                        WHERE (CDFILIAL  = P_CDFILIAL)
                                          AND (NRPEDIDO  = C_CALECOMP.NRPEDIDO)
                                          AND (CDPRODUTO = C_SEMIACABADO.CDPRODINSUMO);
                                    END IF;

                                 ELSE
                                    V_QTSEMIACAB := C_SEMIACABADO.QTAINSUMPREOP;
                                 END IF;

                                 IF V_QTSEMIACAB > 0 THEN

                                     GERA_OP_SEMIACABADO(P_CDFILIAL, C_SEMIACABADO.CDPRODINSUMO, C_SEMIACABADO.CDPROCFABRIC, '1', '3', C_CALECOMP.DTCONCPROMRP, C_SEMIACABADO.DTVALIDADE,
                                                         V_QTSEMIACAB, V_DSORDPROD, P_NRPLANOPROD, V_IDGERAOPCONF, C_CALECOMP.NRPEDIDO, V_NRITEMPED);
                                 END IF;
                              END IF;
                            END LOOP;

                        END IF;
                     END LOOP;
                  ELSE
                     IF V_IDTPPROPOPF = 'L' THEN
                        IF V_IDTPARREDPF = '1' THEN
                           V_CONTADOR  := 1;
                           V_CONTADOR2 := 1;

                           IF (MOD(V_QTDEMANDA, V_QTPADPROCFAB) <> 0) THEN
                              V_QTDEOP := ((TRUNC(V_QTDEMANDA / V_QTPADPROCFAB) + 1) * V_QTPADPROCFAB);
                           ELSE
                              V_QTDEOP := ((V_QTDEMANDA / V_QTPADPROCFAB) * V_QTPADPROCFAB);
                           END IF;

                           V_CONTGEROP := V_QTDEOP / V_QTPADPROCFAB;

                           FOR V_CONTADOR IN V_CONTADOR2..V_CONTGEROP LOOP
                              V_QTDEOP := V_QTPADPROCFAB;

                              /* Gera o numero do Lote de Producao */

                              PRXLOTEPROD(P_CDFILIAL, C_CALECOMP.DTCONCPROMRP, C_CALECOMP.CDPRODUTO, V_NRLOTEESTQ);

                              /* Gera o numero da OP/SubOP */
                              NOVO_CODIGO_SC('NRORDPROD'||P_CDFILIAL, V_SEQNRORDPROD, 1);
                              V_NRORDPROD     := SUBSTR(V_SEQNRORDPROD, 11, 10);
                              V_NRORDENASUBOP := '0';

                              V_NRORDENAOP := C_CALECOMP.NRORDENAOP;

                              IF V_CDPRODFINAL <> C_CALECOMP.CDPRODFINAL THEN
                                 V_DTVALILOTE := C_CALECOMP.DTVALIDADE;
                                 V_CDPRODFINAL := C_CALECOMP.CDPRODFINAL;
                              END IF;

                              V_NRSUBLOTE := ' ';

                              SELECT
                                 MAX(NRLOTEESTQ)
                              INTO
                                 V_NRLOTEEXIST
                              FROM
                                 LOTE
                              WHERE
                                 CDFILIAL     = P_CDFILIAL    AND
                                 CDPRODUTO    = C_CALECOMP.CDPRODUTO AND
                                 NRLOTEESTQ   = V_NRLOTEESTQ;

                              BEGIN
                                 SELECT NVL(IDGERAOPCONF,'N')
                                 INTO V_IDGERAOPCONF
                                 FROM PARAMPRODMRP
                                 WHERE
                                    CDFILIAL = P_CDFILIAL AND
                                    CDPRODUTO =  C_CALECOMP.CDPRODUTO;
                              EXCEPTION
                                 WHEN NO_DATA_FOUND THEN
                                    V_IDGERAOPCONF := 'N';
                              END;

                              IF V_NRLOTEEXIST IS NULL THEN
                                 INSERT INTO LOTE
                                    (CDFILIAL, NRLOTEESTQ, NRSUBLOTE, CDPRODUTO, IDSTATLOTE,
                                    DTENTRLOTE, DTVALILOTE, IDSTPRODLOTE, CDPLANPRODLT)
                                 VALUES
                                    (P_CDFILIAL, V_NRLOTEESTQ, V_NRSUBLOTE, C_CALECOMP.CDPRODUTO, 'I',
                                     C_CALECOMP.DTCONCPROMRP, V_DTVALILOTE, '1', P_NRPLANOPROD);
                              END IF;

                              IF V_IDPEDINDUSTRIA = 'S' THEN
                                 IF (V_CONTADOR = '1') THEN
                                    BEGIN
                                       SELECT VRFATOCONV
                                         INTO V_VRFATOCONV
                                         FROM PRODUTO
                                        WHERE
                                          CDPRODESTO =  C_CALECOMP.CDPRODUTO;
                                    EXCEPTION
                                       WHEN NO_DATA_FOUND THEN
                                          V_VRFATOCONV := '1';
                                    END;

                                    BEGIN
                                       UPDATE ITEMPEDIDO
                                         SET QTITEMPED  = V_QTDEOP,
                                             QTITEMPED2 = V_VRFATOCONV * V_QTDEOP
                                        WHERE CDFILIAL  = P_CDFILIAL
                                          AND CDPRODUTO = C_CALECOMP.CDPRODUTO
                                          AND NRPEDIDO  = C_CALECOMP.NRPEDIDO;
                                    END;

                                    V_NRITEMPED := C_CALECOMP.NRITEMPED;

                                    SELECT F.CDEMPRESA, F.CDINSCESTA, PE.CDCLIENTE, PE.CDFILIALPED, F.CDFILIAL,
                                        PE.NRPEDIDO, I.NRITEMPED, I.DTENTITPED, PE.CDTIPOOPER, T.IDENTRSAIDOP,
                                        PE.CDVENDEDOR, I.CDOPERADOR, I.IDSITITEMPED, I.VRPREUNITPED
                                    INTO V_CDEMPRESA, V_CDINSCESTA, V_CDCLIENTE, V_CDFILIALPED, V_CDFILIAL,
                                         V_NRPEDIDO, V_NRITEMPED, V_DTENTITPED, V_CDTIPOOPER, V_IDORIGDESTOP,
                                         V_CDVENDEDOR, V_CDOPERADOR, V_IDSITITEMPED, V_VRPREUNITPED
                                    FROM FILIAL F, PEDIDO PE, ITEMPEDIDO I, TIPOOPERAC T, VENDEDOR V
                                   WHERE PE.CDFILIAL    = P_CDFILIAL
                                     AND PE.NRPEDIDO    = C_CALECOMP.NRPEDIDO
                                     AND I.CDFILIAL     = PE.CDFILIAL
                                     AND I.NRPEDIDO     = PE.NRPEDIDO
                                     AND I.CDPRODUTO    = C_CALECOMP.CDPRODUTO
                                     AND PE.CDFILIAL    = F.CDFILIAL
                                     AND PE.CDTIPOOPER  = T.CDTIPOOPER
                                     AND T.IDENTRSAIDOP = 'S'
                                     AND PE.CDVENDEDOR  = V.CDVENDEDOR
                                     AND ROWNUM = '1';

                                    IMPOSTO_ITEMPEDIDO(V_CDEMPRESA, V_CDINSCESTA, V_CDCLIENTE, V_CDFILIALPED, V_CDFILIAL,
                                                       V_NRPEDIDO, V_NRITEMPED, V_DTENTITPED, V_CDTIPOOPER, V_IDORIGDESTOP);
                                    GERA_COMISSAOVEND(V_CDFILIAL, V_NRPEDIDO, V_CDVENDEDOR, V_CDOPERADOR, V_NRITEMPED, V_IDSITITEMPED,
                                                      C_CALECOMP.CDPRODUTO, V_VRPREUNITPED, '');
                                 ELSE
                                    SELECT NRPEDIDO,       CDPRODUTO,       QTITEMPED,    VRPREUNITPED,
                                           NRITEMPED,      IDSITITEMPED,    QTEXPITEMPED, CDFILIAL,
                                           CDFATPRECO,     QTITEMPED2,      DTENTITPED,
                                           IDITPEDDIFER,   VRPESOITPED,     VRDESITPED,
                                           IDITPEDRESER,   VRPRTABITPED,    VRPEDEMAXIPE,
                                           CDOPERADOR,     VRPERCMARKUPIT,  CDTIPODESC,
                                           DSITEMPED,      DSEMISSAOITPED,  DSPRAZOENTITPED,
                                           CDEMISSAOITPED, NRITORDEMCMPPED, IDPRECOPROM,
                                           VRVARIAVEL,     CDFATOR,         IDITEMPEDTERC

                                      INTO V_NRPEDIDO,       V_CDPRODUTO,       V_QTITEMPED,    V_VRPREUNITPED,
                                           V_NRITEMPED,      V_IDSITITEMPED,    V_QTEXPITEMPED, V_CDFILIAL,
                                           V_CDFATPRECO,     V_QTITEMPED2,      V_DTENTITPED,
                                           V_IDITPEDDIFER,   V_VRPESOITPED,     V_VRDESITPED,
                                           V_IDITPEDRESER,   V_VRPRTABITPED,    V_VRPEDEMAXIPE,
                                           V_CDOPERADOR,     V_VRPERCMARKUPIT,  V_CDTIPODESC,
                                           V_DSITEMPED,      V_DSEMISSAOITPED,  V_DSPRAZOENTITPED,
                                           V_CDEMISSAOITPED, V_NRITORDEMCMPPED, V_IDPRECOPROM,
                                           V_VRVARIAVEL,     V_CDFATOR,         V_IDITEMPEDTERC
                                      FROM ITEMPEDIDO
                                     WHERE CDFILIAL  = P_CDFILIAL
                                       AND CDPRODUTO = C_CALECOMP.CDPRODUTO
                                       AND NRPEDIDO  = C_CALECOMP.NRPEDIDO
                                       AND ROWNUM = '1'
                                      ORDER BY NRITEMPED;

                                     BEGIN
                                        SELECT LPAD((NVL(MAX(NRITEMPED), '0') + 1), 10, '0')
                                          INTO V_NRITEMPED
                                          FROM ITEMPEDIDO
                                         WHERE CDFILIAL = P_CDFILIAL
                                           AND NRPEDIDO  = C_CALECOMP.NRPEDIDO;
                                     EXCEPTION
                                       WHEN NO_DATA_FOUND THEN
                                          V_NRITEMPED := '1';
                                     END;

                                     INSERT INTO ITEMPEDIDO
                                        (NRPEDIDO,       CDPRODUTO,       QTITEMPED,    VRPREUNITPED,
                                         NRITEMPED,      IDSITITEMPED,    QTEXPITEMPED, CDFILIAL,
                                         CDFATPRECO,     QTITEMPED2,      DTENTITPED,
                                         IDITPEDDIFER,   VRPESOITPED,     VRDESITPED,
                                         IDITPEDRESER,   VRPRTABITPED,    VRPEDEMAXIPE,
                                         CDOPERADOR,     VRPERCMARKUPIT,  CDTIPODESC,
                                         DSITEMPED,      DSEMISSAOITPED,  DSPRAZOENTITPED,
                                         CDEMISSAOITPED, NRITORDEMCMPPED, IDPRECOPROM,
                                         VRVARIAVEL,     CDFATOR,         IDITEMPEDTERC)
                                     VALUES
                                        (V_NRPEDIDO,      V_CDPRODUTO,       V_QTDEOP,    V_VRPREUNITPED,
                                        V_NRITEMPED,      V_IDSITITEMPED,    V_QTEXPITEMPED, V_CDFILIAL,
                                        V_CDFATPRECO,     V_VRFATOCONV * V_QTDEOP, V_DTENTITPED,
                                        V_IDITPEDDIFER,   V_VRPESOITPED,     V_VRDESITPED,
                                        V_IDITPEDRESER,   V_VRPRTABITPED,    V_VRPEDEMAXIPE,
                                        V_CDOPERADOR,     V_VRPERCMARKUPIT,  V_CDTIPODESC,
                                        V_DSITEMPED,      V_DSEMISSAOITPED,  V_DSPRAZOENTITPED,
                                        V_CDEMISSAOITPED, V_NRITORDEMCMPPED, V_IDPRECOPROM,
                                        V_VRVARIAVEL,     V_CDFATOR,         V_IDITEMPEDTERC);

                                 SELECT F.CDEMPRESA, F.CDINSCESTA, PE.CDCLIENTE, PE.CDFILIALPED, F.CDFILIAL,
                                        PE.NRPEDIDO, I.NRITEMPED, I.DTENTITPED, PE.CDTIPOOPER, T.IDENTRSAIDOP,
                                        PE.CDVENDEDOR, I.CDOPERADOR, I.IDSITITEMPED, I.VRPREUNITPED
                                    INTO V_CDEMPRESA, V_CDINSCESTA, V_CDCLIENTE, V_CDFILIALPED, V_CDFILIAL,
                                         V_NRPEDIDO, V_NRITEMPED, V_DTENTITPED, V_CDTIPOOPER, V_IDORIGDESTOP,
                                         V_CDVENDEDOR, V_CDOPERADOR, V_IDSITITEMPED, V_VRPREUNITPED
                                    FROM FILIAL F, PEDIDO PE, ITEMPEDIDO I, TIPOOPERAC T, VENDEDOR V
                                   WHERE PE.CDFILIAL    = P_CDFILIAL
                                     AND PE.NRPEDIDO    = C_CALECOMP.NRPEDIDO
                                     AND I.CDFILIAL     = PE.CDFILIAL
                                     AND I.NRPEDIDO     = PE.NRPEDIDO
                                     AND I.CDPRODUTO    = C_CALECOMP.CDPRODUTO
                                     AND PE.CDFILIAL    = F.CDFILIAL
                                     AND PE.CDTIPOOPER  = T.CDTIPOOPER
                                     AND T.IDENTRSAIDOP = 'S'
                                     AND PE.CDVENDEDOR  = V.CDVENDEDOR
                                     AND I.NRITEMPED    = V_NRITEMPED;

                                     IMPOSTO_ITEMPEDIDO(V_CDEMPRESA, V_CDINSCESTA, V_CDCLIENTE, V_CDFILIALPED, V_CDFILIAL,
                                                   V_NRPEDIDO, V_NRITEMPED, V_DTENTITPED, V_CDTIPOOPER, V_IDORIGDESTOP);
                                     GERA_COMISSAOVEND(V_CDFILIAL, V_NRPEDIDO, V_CDVENDEDOR, V_CDOPERADOR, V_NRITEMPED, V_IDSITITEMPED,
                                                  C_CALECOMP.CDPRODUTO, V_VRPREUNITPED, '');
                                 END IF;
                              END IF;

                              IF P_CDPRODUTO IS NULL THEN
                                 V_DSORDPROD := P_DSORDPROD||': '||C_CALECOMP.NRPEDIDO||' Item: '||V_NRITEMPED;
                              ELSE
                                 V_DSORDPROD := 'OP gerada atraves da tela de Estoque Minimo.';
                              END IF;

                              INSERT INTO ORDPRODUCAO
                                 (CDFILIAL, NRORDPROD, NRSUBORDPROD, CDPRODUTO,
                                  CDPROCFABRIC, IDSITORDPROD, IDTIPORDPROD, DTGERORDPROD, QTAPRODPREOP,
                                 DTHRINIPREOP, NRLOTEESTQ, NRSUBLOTE, DSORDPROD, CDPLANPRODOP, IDCONFIRMAOP,
                                 NRPEDIDO, NRITEMPED)
                              VALUES
                                 (P_CDFILIAL, V_NRORDPROD, V_NRORDENASUBOP, C_CALECOMP.CDPRODUTO,
                                 C_CALECOMP.CDPROCFABRIC, '1', '3', C_CALECOMP.DTCONCPROMRP, V_QTDEOP,
                                 C_CALECOMP.DTCONCPROMRP, V_NRLOTEESTQ, V_NRSUBLOTE, V_DSORDPROD, P_NRPLANOPROD, V_IDGERAOPCONF,
                                 C_CALECOMP.NRPEDIDO, V_NRITEMPED);

                              V_DSITEMPED := 'OP: '||V_NRORDPROD||'/'||V_NRORDENASUBOP;

                              /* Coloca o numero da OP na observacao do item */
                              IF NOT (V_DSITEMPED IS NULL) THEN
                                 UPDATE ITEMPEDIDO
                                    SET DSITEMPED = V_DSITEMPED
                                  WHERE CDFILIAL  = P_CDFILIAL
                                    AND NRPEDIDO  = C_CALECOMP.NRPEDIDO
                                    AND NRITEMPED = V_NRITEMPED;
                              END IF;

                              FOR C_SEMIACABADO IN (
                                                    SELECT I.CDPRODUTO   ,
                                                           I.CDETAPAPROD ,
                                                           I.CDPRODINSUMO,
                                                           F.CDPROCFABRIC,
                                                           (SYSDATE) AS DTVALIDADE,
                                                           I.IDUTAPRREQET,
                                                           I.IDSEMIACETAP,
                                                           I.QTINSUMETAPA,
                                                           I.QTRENDINSU  ,
                                                           O.QTAPRODPREOP,
                                                           QTPREVI_MATPRIMA(I.CDFILIAL, I.CDPRODUTO, I.CDPROCFABRIC, I.CDETAPAPROD, I.CDPRODINSUMO, O.QTAPRODPREOP) AS QTAINSUMPREOP
                                                      FROM ORDPRODUCAO O,
                                                           PROCFABRICA F,
                                                           INSUMETAPA  I
                                                     WHERE (I.IDSEMIACETAP = 'S'            )
                                                       AND (F.IDPROFABPADR = 'S'            )
                                                       AND (F.CDFILIAL     = I.CDFILIAL     )
                                                       AND (F.CDPRODUTO    = I.CDPRODINSUMO )
                                                       AND (O.CDFILIAL     = I.CDFILIAL     )
                                                       AND (O.CDPRODUTO    = I.CDPRODUTO    )
                                                       AND (O.CDPROCFABRIC = I.CDPROCFABRIC )
                                                       AND (O.CDFILIAL     = P_CDFILIAL     )
                                                       AND (O.NRORDPROD    = V_NRORDPROD    )
                                                       AND (O.NRSUBORDPROD = V_NRORDENASUBOP)
                                                       AND (O.CDPRODUTO    = C_CALECOMP.CDPRODUTO   )
                                                       AND (O.CDPROCFABRIC = C_CALECOMP.CDPROCFABRIC)
                                                     ORDER BY I.CDETAPAPROD, I.CDPRODINSUMO
                                                   ) LOOP

                                 IF C_SEMIACABADO.QTAINSUMPREOP > 0 THEN

                                    V_QTSEMIACAB := 0;

                                    -- Consulta tabela temporaria de estoque.
                                    BEGIN
                                       SELECT CDPRODUTO, QTESTOQUE
                                         INTO V_CDPRODEMANDA, V_QTESTOQUE
                                         FROM ESTSEMIACAB
                                        WHERE (CDFILIAL  = P_CDFILIAL)
                                          AND (NRPEDIDO  = C_CALECOMP.NRPEDIDO)
                                          AND (CDPRODUTO = C_SEMIACABADO.CDPRODINSUMO);
                                    EXCEPTION
                                       WHEN NO_DATA_FOUND THEN
                                          V_CDPRODEMANDA := '';
                                          V_QTESTOQUE    := 0;
                                    END;

                                    IF V_QTESTOQUE > 0 THEN
                                       V_QTSEMIACAB := C_SEMIACABADO.QTAINSUMPREOP - V_QTESTOQUE;

                                       IF (V_QTESTOQUE - C_SEMIACABADO.QTAINSUMPREOP) > 0 THEN
                                          -- Altera a quantidade de estoque deste produto.
                                          UPDATE ESTSEMIACAB
                                             SET QTESTOQUE  = V_QTESTOQUE - C_SEMIACABADO.QTAINSUMPREOP
                                           WHERE (CDFILIAL  = P_CDFILIAL)
                                             AND (NRPEDIDO  = C_CALECOMP.NRPEDIDO)
                                             AND (CDPRODUTO = C_SEMIACABADO.CDPRODINSUMO);
                                       ELSE
                                          -- Zera a quantidade de estoque deste produto.
                                          UPDATE ESTSEMIACAB
                                             SET QTESTOQUE  = 0
                                           WHERE (CDFILIAL  = P_CDFILIAL)
                                             AND (NRPEDIDO  = C_CALECOMP.NRPEDIDO)
                                             AND (CDPRODUTO = C_SEMIACABADO.CDPRODINSUMO);
                                       END IF;

                                    ELSE
                                       V_QTSEMIACAB := C_SEMIACABADO.QTAINSUMPREOP;
                                    END IF;

                                    IF V_QTSEMIACAB > 0 THEN

                                        GERA_OP_SEMIACABADO(P_CDFILIAL, C_SEMIACABADO.CDPRODINSUMO, C_SEMIACABADO.CDPROCFABRIC, '1', '3', C_CALECOMP.DTCONCPROMRP, C_SEMIACABADO.DTVALIDADE,
                                                            V_QTSEMIACAB, V_DSORDPROD, P_NRPLANOPROD, V_IDGERAOPCONF, C_CALECOMP.NRPEDIDO, V_NRITEMPED);
                                    END IF;
                                 END IF;
                              END LOOP;

                           END LOOP;
                        ELSE
                           IF V_IDTPARREDPF = '2' THEN
                              V_CONTADOR  := 1;
                              V_CONTADOR2 := 1;

                              V_QTDEOP := ((TRUNC(V_QTDEMANDA / V_QTPADPROCFAB)) * V_QTPADPROCFAB);
                              V_CONTGEROP := V_QTDEOP / V_QTPADPROCFAB;

                              FOR V_CONTADOR IN V_CONTADOR2..V_CONTGEROP LOOP
                                 V_QTDEOP := V_QTPADPROCFAB;

                                 /* Gera o numero do Lote de Producao */

                                 PRXLOTEPROD(P_CDFILIAL, C_CALECOMP.DTCONCPROMRP, C_CALECOMP.CDPRODUTO, V_NRLOTEESTQ);

                                 /* Gera o numero da OP/SubOP */
                                 NOVO_CODIGO_SC('NRORDPROD'||P_CDFILIAL, V_SEQNRORDPROD, 1);
                                 V_NRORDPROD     := SUBSTR(V_SEQNRORDPROD, 11, 10);
                                 V_NRORDENASUBOP := '0';

                                 V_NRORDENAOP := C_CALECOMP.NRORDENAOP;

                                 IF V_CDPRODFINAL <> C_CALECOMP.CDPRODFINAL THEN
                                    V_DTVALILOTE := C_CALECOMP.DTVALIDADE;
                                    V_CDPRODFINAL := C_CALECOMP.CDPRODFINAL;
                                 END IF;

                                 V_NRSUBLOTE := ' ';

                                 SELECT
                                    MAX(NRLOTEESTQ)
                                 INTO
                                    V_NRLOTEEXIST
                                 FROM
                                    LOTE
                                 WHERE
                                    CDFILIAL     = P_CDFILIAL    AND
                                    CDPRODUTO    = C_CALECOMP.CDPRODUTO AND
                                    NRLOTEESTQ   = V_NRLOTEESTQ;

                                 BEGIN
                                    SELECT NVL(IDGERAOPCONF,'N')
                                    INTO V_IDGERAOPCONF
                                    FROM PARAMPRODMRP
                                    WHERE
                                       CDFILIAL = P_CDFILIAL AND
                                       CDPRODUTO =  C_CALECOMP.CDPRODUTO;
                                 EXCEPTION
                                    WHEN NO_DATA_FOUND THEN
                                       V_IDGERAOPCONF := 'N';
                                 END;

                                 IF V_NRLOTEEXIST IS NULL THEN
                                    INSERT INTO LOTE
                                       (CDFILIAL, NRLOTEESTQ, NRSUBLOTE, CDPRODUTO, IDSTATLOTE,
                                       DTENTRLOTE, DTVALILOTE, IDSTPRODLOTE, CDPLANPRODLT)
                                    VALUES
                                       (P_CDFILIAL, V_NRLOTEESTQ, V_NRSUBLOTE, C_CALECOMP.CDPRODUTO, 'I',
                                        C_CALECOMP.DTCONCPROMRP, V_DTVALILOTE, '1', P_NRPLANOPROD);
                                 END IF;

                                 IF V_IDPEDINDUSTRIA = 'S' THEN
                                    IF (V_CONTADOR = '1') THEN
                                       BEGIN
                                          SELECT VRFATOCONV
                                            INTO V_VRFATOCONV
                                            FROM PRODUTO
                                           WHERE
                                             CDPRODESTO =  C_CALECOMP.CDPRODUTO;
                                       EXCEPTION
                                          WHEN NO_DATA_FOUND THEN
                                             V_VRFATOCONV := '1';
                                       END;

                                       BEGIN
                                          UPDATE ITEMPEDIDO
                                            SET QTITEMPED  = V_QTDEOP,
                                                QTITEMPED2 = V_VRFATOCONV * V_QTDEOP
                                           WHERE CDFILIAL  = P_CDFILIAL
                                             AND CDPRODUTO = C_CALECOMP.CDPRODUTO
                                             AND NRPEDIDO  = C_CALECOMP.NRPEDIDO;
                                       END;

                                       V_NRITEMPED := C_CALECOMP.NRITEMPED;

                                       SELECT F.CDEMPRESA, F.CDINSCESTA, PE.CDCLIENTE, PE.CDFILIALPED, F.CDFILIAL,
                                           PE.NRPEDIDO, I.NRITEMPED, I.DTENTITPED, PE.CDTIPOOPER, T.IDENTRSAIDOP,
                                           PE.CDVENDEDOR, I.CDOPERADOR, I.IDSITITEMPED, I.VRPREUNITPED
                                       INTO V_CDEMPRESA, V_CDINSCESTA, V_CDCLIENTE, V_CDFILIALPED, V_CDFILIAL,
                                            V_NRPEDIDO, V_NRITEMPED, V_DTENTITPED, V_CDTIPOOPER, V_IDORIGDESTOP,
                                            V_CDVENDEDOR, V_CDOPERADOR, V_IDSITITEMPED, V_VRPREUNITPED
                                       FROM FILIAL F, PEDIDO PE, ITEMPEDIDO I, TIPOOPERAC T, VENDEDOR V
                                      WHERE PE.CDFILIAL    = P_CDFILIAL
                                        AND PE.NRPEDIDO    = C_CALECOMP.NRPEDIDO
                                        AND I.CDFILIAL     = PE.CDFILIAL
                                        AND I.NRPEDIDO     = PE.NRPEDIDO
                                        AND I.CDPRODUTO    = C_CALECOMP.CDPRODUTO
                                        AND PE.CDFILIAL    = F.CDFILIAL
                                        AND PE.CDTIPOOPER  = T.CDTIPOOPER
                                        AND T.IDENTRSAIDOP = 'S'
                                        AND PE.CDVENDEDOR  = V.CDVENDEDOR
                                        AND ROWNUM = '1';

                                       IMPOSTO_ITEMPEDIDO(V_CDEMPRESA, V_CDINSCESTA, V_CDCLIENTE, V_CDFILIALPED, V_CDFILIAL,
                                                          V_NRPEDIDO, V_NRITEMPED, V_DTENTITPED, V_CDTIPOOPER, V_IDORIGDESTOP);
                                       GERA_COMISSAOVEND(V_CDFILIAL, V_NRPEDIDO, V_CDVENDEDOR, V_CDOPERADOR, V_NRITEMPED, V_IDSITITEMPED,
                                                         C_CALECOMP.CDPRODUTO, V_VRPREUNITPED, '');
                                    ELSE
                                       SELECT NRPEDIDO,       CDPRODUTO,       QTITEMPED,    VRPREUNITPED,
                                              NRITEMPED,      IDSITITEMPED,    QTEXPITEMPED, CDFILIAL,
                                              CDFATPRECO,     QTITEMPED2,      DTENTITPED,
                                              IDITPEDDIFER,   VRPESOITPED,     VRDESITPED,
                                              IDITPEDRESER,   VRPRTABITPED,    VRPEDEMAXIPE,
                                              CDOPERADOR,     VRPERCMARKUPIT,  CDTIPODESC,
                                              DSITEMPED,      DSEMISSAOITPED,  DSPRAZOENTITPED,
                                              CDEMISSAOITPED, NRITORDEMCMPPED, IDPRECOPROM,
                                              VRVARIAVEL,     CDFATOR,         IDITEMPEDTERC

                                         INTO V_NRPEDIDO,       V_CDPRODUTO,       V_QTITEMPED,    V_VRPREUNITPED,
                                              V_NRITEMPED,      V_IDSITITEMPED,    V_QTEXPITEMPED, V_CDFILIAL,
                                              V_CDFATPRECO,     V_QTITEMPED2,      V_DTENTITPED,
                                              V_IDITPEDDIFER,   V_VRPESOITPED,     V_VRDESITPED,
                                              V_IDITPEDRESER,   V_VRPRTABITPED,    V_VRPEDEMAXIPE,
                                              V_CDOPERADOR,     V_VRPERCMARKUPIT,  V_CDTIPODESC,
                                              V_DSITEMPED,      V_DSEMISSAOITPED,  V_DSPRAZOENTITPED,
                                              V_CDEMISSAOITPED, V_NRITORDEMCMPPED, V_IDPRECOPROM,
                                              V_VRVARIAVEL,     V_CDFATOR,         V_IDITEMPEDTERC
                                         FROM ITEMPEDIDO
                                        WHERE CDFILIAL  = P_CDFILIAL
                                          AND CDPRODUTO = C_CALECOMP.CDPRODUTO
                                          AND NRPEDIDO  = C_CALECOMP.NRPEDIDO
                                          AND ROWNUM = '1'
                                         ORDER BY NRITEMPED;

                                        BEGIN
                                           SELECT LPAD((NVL(MAX(NRITEMPED), '0') + 1), 10, '0')
                                             INTO V_NRITEMPED
                                             FROM ITEMPEDIDO
                                            WHERE CDFILIAL = P_CDFILIAL
                                              AND NRPEDIDO  = C_CALECOMP.NRPEDIDO;
                                        EXCEPTION
                                          WHEN NO_DATA_FOUND THEN
                                             V_NRITEMPED := '1';
                                        END;

                                        INSERT INTO ITEMPEDIDO
                                           (NRPEDIDO,       CDPRODUTO,       QTITEMPED,    VRPREUNITPED,
                                            NRITEMPED,      IDSITITEMPED,    QTEXPITEMPED, CDFILIAL,
                                            CDFATPRECO,     QTITEMPED2,      DTENTITPED,
                                            IDITPEDDIFER,   VRPESOITPED,     VRDESITPED,
                                            IDITPEDRESER,   VRPRTABITPED,    VRPEDEMAXIPE,
                                            CDOPERADOR,     VRPERCMARKUPIT,  CDTIPODESC,
                                            DSITEMPED,      DSEMISSAOITPED,  DSPRAZOENTITPED,
                                            CDEMISSAOITPED, NRITORDEMCMPPED, IDPRECOPROM,
                                            VRVARIAVEL,     CDFATOR,         IDITEMPEDTERC)
                                        VALUES
                                           (V_NRPEDIDO,      V_CDPRODUTO,       V_QTDEOP,    V_VRPREUNITPED,
                                           V_NRITEMPED,      V_IDSITITEMPED,    V_QTEXPITEMPED, V_CDFILIAL,
                                           V_CDFATPRECO,     V_VRFATOCONV * V_QTDEOP, V_DTENTITPED,
                                           V_IDITPEDDIFER,   V_VRPESOITPED,     V_VRDESITPED,
                                           V_IDITPEDRESER,   V_VRPRTABITPED,    V_VRPEDEMAXIPE,
                                           V_CDOPERADOR,     V_VRPERCMARKUPIT,  V_CDTIPODESC,
                                           V_DSITEMPED,      V_DSEMISSAOITPED,  V_DSPRAZOENTITPED,
                                           V_CDEMISSAOITPED, V_NRITORDEMCMPPED, V_IDPRECOPROM,
                                           V_VRVARIAVEL,     V_CDFATOR,         V_IDITEMPEDTERC);

                                        SELECT F.CDEMPRESA, F.CDINSCESTA, PE.CDCLIENTE, PE.CDFILIALPED, F.CDFILIAL,
                                           PE.NRPEDIDO, I.NRITEMPED, I.DTENTITPED, PE.CDTIPOOPER, T.IDENTRSAIDOP,
                                           PE.CDVENDEDOR, I.CDOPERADOR, I.IDSITITEMPED, I.VRPREUNITPED
                                       INTO V_CDEMPRESA, V_CDINSCESTA, V_CDCLIENTE, V_CDFILIALPED, V_CDFILIAL,
                                            V_NRPEDIDO, V_NRITEMPED, V_DTENTITPED, V_CDTIPOOPER, V_IDORIGDESTOP,
                                            V_CDVENDEDOR, V_CDOPERADOR, V_IDSITITEMPED, V_VRPREUNITPED
                                       FROM FILIAL F, PEDIDO PE, ITEMPEDIDO I, TIPOOPERAC T, VENDEDOR V
                                      WHERE PE.CDFILIAL    = P_CDFILIAL
                                        AND PE.NRPEDIDO    = C_CALECOMP.NRPEDIDO
                                        AND I.CDFILIAL     = PE.CDFILIAL
                                        AND I.NRPEDIDO     = PE.NRPEDIDO
                                        AND I.CDPRODUTO    = C_CALECOMP.CDPRODUTO
                                        AND PE.CDFILIAL    = F.CDFILIAL
                                        AND PE.CDTIPOOPER  = T.CDTIPOOPER
                                        AND T.IDENTRSAIDOP = 'S'
                                        AND PE.CDVENDEDOR  = V.CDVENDEDOR
                                        AND I.NRITEMPED    = V_NRITEMPED;

                                        IMPOSTO_ITEMPEDIDO(V_CDEMPRESA, V_CDINSCESTA, V_CDCLIENTE, V_CDFILIALPED, V_CDFILIAL,
                                                   V_NRPEDIDO, V_NRITEMPED, V_DTENTITPED, V_CDTIPOOPER, V_IDORIGDESTOP);
                                        GERA_COMISSAOVEND(V_CDFILIAL, V_NRPEDIDO, V_CDVENDEDOR, V_CDOPERADOR, V_NRITEMPED, V_IDSITITEMPED,
                                                  C_CALECOMP.CDPRODUTO, V_VRPREUNITPED, '');
                                    END IF;
                                 END IF;

                                 IF P_CDPRODUTO IS NULL THEN
                                    V_DSORDPROD := P_DSORDPROD||': '||C_CALECOMP.NRPEDIDO||' Item: '||V_NRITEMPED;
                                 ELSE
                                    V_DSORDPROD := 'OP gerada atraves da tela de Estoque Minimo.';
                                 END IF;

                                 INSERT INTO ORDPRODUCAO
                                    (CDFILIAL, NRORDPROD, NRSUBORDPROD, CDPRODUTO,
                                     CDPROCFABRIC, IDSITORDPROD, IDTIPORDPROD, DTGERORDPROD, QTAPRODPREOP,
                                    DTHRINIPREOP, NRLOTEESTQ, NRSUBLOTE, DSORDPROD, CDPLANPRODOP, IDCONFIRMAOP,
                                    NRPEDIDO, NRITEMPED)
                                 VALUES
                                    (P_CDFILIAL, V_NRORDPROD, V_NRORDENASUBOP, C_CALECOMP.CDPRODUTO,
                                    C_CALECOMP.CDPROCFABRIC, '1', '3', C_CALECOMP.DTCONCPROMRP, V_QTDEOP,
                                    C_CALECOMP.DTCONCPROMRP, V_NRLOTEESTQ, V_NRSUBLOTE, V_DSORDPROD, P_NRPLANOPROD, V_IDGERAOPCONF,
                                    C_CALECOMP.NRPEDIDO, V_NRITEMPED);

                                 V_DSITEMPED := 'OP: '||V_NRORDPROD||'/'||V_NRORDENASUBOP;

                                 /* Coloca o numero da OP na observacao do item */
                                 IF NOT (V_DSITEMPED IS NULL) THEN
                                    UPDATE ITEMPEDIDO
                                       SET DSITEMPED = V_DSITEMPED
                                     WHERE CDFILIAL  = P_CDFILIAL
                                       AND NRPEDIDO  = C_CALECOMP.NRPEDIDO
                                       AND NRITEMPED = V_NRITEMPED;
                                 END IF;

                                 FOR C_SEMIACABADO IN (
                                                        SELECT I.CDPRODUTO   ,
                                                               I.CDETAPAPROD ,
                                                               I.CDPRODINSUMO,
                                                               F.CDPROCFABRIC,
                                                               (SYSDATE) AS DTVALIDADE,
                                                               I.IDUTAPRREQET,
                                                               I.IDSEMIACETAP,
                                                               I.QTINSUMETAPA,
                                                               I.QTRENDINSU  ,
                                                               O.QTAPRODPREOP,
                                                               QTPREVI_MATPRIMA(I.CDFILIAL, I.CDPRODUTO, I.CDPROCFABRIC, I.CDETAPAPROD, I.CDPRODINSUMO, O.QTAPRODPREOP) AS QTAINSUMPREOP
                                                          FROM ORDPRODUCAO O,
                                                               PROCFABRICA F,
                                                               INSUMETAPA  I
                                                         WHERE (I.IDSEMIACETAP = 'S'            )
                                                           AND (F.IDPROFABPADR = 'S'            )
                                                           AND (F.CDFILIAL     = I.CDFILIAL     )
                                                           AND (F.CDPRODUTO    = I.CDPRODINSUMO )
                                                           AND (O.CDFILIAL     = I.CDFILIAL     )
                                                           AND (O.CDPRODUTO    = I.CDPRODUTO    )
                                                           AND (O.CDPROCFABRIC = I.CDPROCFABRIC )
                                                           AND (O.CDFILIAL     = P_CDFILIAL     )
                                                           AND (O.NRORDPROD    = V_NRORDPROD    )
                                                           AND (O.NRSUBORDPROD = V_NRORDENASUBOP)
                                                           AND (O.CDPRODUTO    = C_CALECOMP.CDPRODUTO   )
                                                           AND (O.CDPROCFABRIC = C_CALECOMP.CDPROCFABRIC)
                                                         ORDER BY I.CDETAPAPROD, I.CDPRODINSUMO
                                                         ) LOOP

                                       IF C_SEMIACABADO.QTAINSUMPREOP > 0 THEN

                                          V_QTSEMIACAB := 0;

                                          -- Consulta tabela temporaria de estoque.
                                          BEGIN
                                             SELECT CDPRODUTO, QTESTOQUE
                                               INTO V_CDPRODEMANDA, V_QTESTOQUE
                                               FROM ESTSEMIACAB
                                              WHERE (CDFILIAL  = P_CDFILIAL)
                                                AND (NRPEDIDO  = C_CALECOMP.NRPEDIDO)
                                                AND (CDPRODUTO = C_SEMIACABADO.CDPRODINSUMO);
                                          EXCEPTION
                                             WHEN NO_DATA_FOUND THEN
                                                V_CDPRODEMANDA := '';
                                                V_QTESTOQUE    := 0;
                                          END;

                                          IF V_QTESTOQUE > 0 THEN
                                             V_QTSEMIACAB := C_SEMIACABADO.QTAINSUMPREOP - V_QTESTOQUE;

                                             IF (V_QTESTOQUE - C_SEMIACABADO.QTAINSUMPREOP) > 0 THEN
                                                -- Altera a quantidade de estoque deste produto.
                                                UPDATE ESTSEMIACAB
                                                   SET QTESTOQUE  = V_QTESTOQUE - C_SEMIACABADO.QTAINSUMPREOP
                                                 WHERE (CDFILIAL  = P_CDFILIAL)
                                                   AND (NRPEDIDO  = C_CALECOMP.NRPEDIDO)
                                                   AND (CDPRODUTO = C_SEMIACABADO.CDPRODINSUMO);
                                             ELSE
                                                -- Zera a quantidade de estoque deste produto.
                                                UPDATE ESTSEMIACAB
                                                   SET QTESTOQUE  = 0
                                                 WHERE (CDFILIAL  = P_CDFILIAL)
                                                   AND (NRPEDIDO  = C_CALECOMP.NRPEDIDO)
                                                   AND (CDPRODUTO = C_SEMIACABADO.CDPRODINSUMO);
                                             END IF;

                                          ELSE
                                             V_QTSEMIACAB := C_SEMIACABADO.QTAINSUMPREOP;
                                          END IF;

                                          IF V_QTSEMIACAB > 0 THEN

                                              GERA_OP_SEMIACABADO(P_CDFILIAL, C_SEMIACABADO.CDPRODINSUMO, C_SEMIACABADO.CDPROCFABRIC, '1', '3', C_CALECOMP.DTCONCPROMRP, C_SEMIACABADO.DTVALIDADE,
                                                                  V_QTSEMIACAB, V_DSORDPROD, P_NRPLANOPROD, V_IDGERAOPCONF, C_CALECOMP.NRPEDIDO, V_NRITEMPED);
                                          END IF;
                                       END IF;

                                    END LOOP;

                              END LOOP;
                           END IF;
                        END IF;
                     ELSE
                        IF V_IDTPPROPOPF = 'U' THEN
                           IF ((V_NRORDENAOP <> C_CALECOMP.NRORDENAOP) OR (V_IDSUBOPSEMIACA = 'N')) THEN
                              /* Gera o numero do Lote de Producao */

                              PRXLOTEPROD(P_CDFILIAL, C_CALECOMP.DTCONCPROMRP, C_CALECOMP.CDPRODUTO, V_NRLOTEESTQ);

                              /* Gera o numero da OP/SubOP */
                              NOVO_CODIGO_SC('NRORDPROD'||P_CDFILIAL, V_SEQNRORDPROD, 1);
                              V_NRORDPROD     := SUBSTR(V_SEQNRORDPROD, 11, 10);
                              V_NRORDENASUBOP := '0';

                              V_NRORDENAOP := C_CALECOMP.NRORDENAOP;
                           END IF;

                           IF V_CDPRODFINAL <> C_CALECOMP.CDPRODFINAL THEN
                              V_DTVALILOTE := C_CALECOMP.DTVALIDADE;
                              V_CDPRODFINAL := C_CALECOMP.CDPRODFINAL;
                           END IF;

                           V_NRSUBLOTE := ' ';

                           SELECT
                              MAX(NRLOTEESTQ)
                           INTO
                              V_NRLOTEEXIST
                           FROM
                              LOTE
                           WHERE
                              CDFILIAL     = P_CDFILIAL    AND
                              CDPRODUTO    = C_CALECOMP.CDPRODUTO AND
                              NRLOTEESTQ   = V_NRLOTEESTQ;

                           BEGIN
                              SELECT NVL(IDGERAOPCONF,'N')
                              INTO V_IDGERAOPCONF
                              FROM PARAMPRODMRP
                              WHERE
                                 CDFILIAL = P_CDFILIAL AND
                                 CDPRODUTO =  C_CALECOMP.CDPRODUTO;
                           EXCEPTION
                              WHEN NO_DATA_FOUND THEN
                                 V_IDGERAOPCONF := 'N';
                           END;

                           IF V_NRLOTEEXIST IS NULL THEN
                              INSERT INTO LOTE
                                 (CDFILIAL, NRLOTEESTQ, NRSUBLOTE, CDPRODUTO, IDSTATLOTE,
                                 DTENTRLOTE, DTVALILOTE, IDSTPRODLOTE, CDPLANPRODLT)
                              VALUES
                                 (P_CDFILIAL, V_NRLOTEESTQ, V_NRSUBLOTE, C_CALECOMP.CDPRODUTO, 'I',
                                  C_CALECOMP.DTCONCPROMRP, V_DTVALILOTE, '1', P_NRPLANOPROD);
                           END IF;

                           IF P_CDPRODUTO IS NULL THEN
                              V_DSORDPROD := P_DSORDPROD||': '||C_CALECOMP.NRPEDIDO||' Item: '||C_CALECOMP.NRITEMPED;
                           ELSE
                              V_DSORDPROD := 'OP gerada atraves da tela de Estoque Minimo.';
                           END IF;

                           INSERT INTO ORDPRODUCAO
                              (CDFILIAL, NRORDPROD, NRSUBORDPROD, CDPRODUTO,
                               CDPROCFABRIC, IDSITORDPROD, IDTIPORDPROD, DTGERORDPROD, QTAPRODPREOP,
                              DTHRINIPREOP, NRLOTEESTQ, NRSUBLOTE, DSORDPROD, CDPLANPRODOP, IDCONFIRMAOP,
                              NRPEDIDO, NRITEMPED)
                           VALUES
                              (P_CDFILIAL, V_NRORDPROD, V_NRORDENASUBOP, C_CALECOMP.CDPRODUTO,
                              C_CALECOMP.CDPROCFABRIC, '1', '3', C_CALECOMP.DTCONCPROMRP, V_QTDEMANDA,
                              C_CALECOMP.DTCONCPROMRP, V_NRLOTEESTQ, V_NRSUBLOTE, V_DSORDPROD, P_NRPLANOPROD, V_IDGERAOPCONF,
                              C_CALECOMP.NRPEDIDO, C_CALECOMP.NRITEMPED);

                           V_DSITEMPED := 'OP: '||V_NRORDPROD||'/'||V_NRORDENASUBOP;

                           /* Coloca o numero da OP na observacao do item */
                           IF NOT (V_DSITEMPED IS NULL) THEN
                              UPDATE ITEMPEDIDO
                                 SET DSITEMPED = V_DSITEMPED
                               WHERE CDFILIAL  = P_CDFILIAL
                                 AND NRPEDIDO  = C_CALECOMP.NRPEDIDO
                                 AND NRITEMPED = C_CALECOMP.NRITEMPED;
                           END IF;

                           FOR C_SEMIACABADO IN (
                                                SELECT I.CDPRODUTO   ,
                                                       I.CDETAPAPROD ,
                                                       I.CDPRODINSUMO,
                                                       F.CDPROCFABRIC,
                                                       (SYSDATE) AS DTVALIDADE,
                                                       I.IDUTAPRREQET,
                                                       I.IDSEMIACETAP,
                                                       I.QTINSUMETAPA,
                                                       I.QTRENDINSU  ,
                                                       O.QTAPRODPREOP,
                                                       QTPREVI_MATPRIMA(I.CDFILIAL, I.CDPRODUTO, I.CDPROCFABRIC, I.CDETAPAPROD, I.CDPRODINSUMO, O.QTAPRODPREOP) AS QTAINSUMPREOP
                                                  FROM ORDPRODUCAO O,
                                                       PROCFABRICA F,
                                                       INSUMETAPA  I
                                                 WHERE (I.IDSEMIACETAP = 'S'            )
                                                   AND (F.IDPROFABPADR = 'S'            )
                                                   AND (F.CDFILIAL     = I.CDFILIAL     )
                                                   AND (F.CDPRODUTO    = I.CDPRODINSUMO )
                                                   AND (O.CDFILIAL     = I.CDFILIAL     )
                                                   AND (O.CDPRODUTO    = I.CDPRODUTO    )
                                                   AND (O.CDPROCFABRIC = I.CDPROCFABRIC )
                                                   AND (O.CDFILIAL     = P_CDFILIAL     )
                                                   AND (O.NRORDPROD    = V_NRORDPROD    )
                                                   AND (O.NRSUBORDPROD = V_NRORDENASUBOP)
                                                   AND (O.CDPRODUTO    = C_CALECOMP.CDPRODUTO   )
                                                   AND (O.CDPROCFABRIC = C_CALECOMP.CDPROCFABRIC)
                                                 ORDER BY I.CDETAPAPROD, I.CDPRODINSUMO
                                                 ) LOOP

                              IF C_SEMIACABADO.QTAINSUMPREOP > 0 THEN

                                 V_QTSEMIACAB := 0;

                                 -- Consulta tabela temporaria de estoque.
                                 BEGIN
                                    SELECT CDPRODUTO, QTESTOQUE
                                      INTO V_CDPRODEMANDA, V_QTESTOQUE
                                      FROM ESTSEMIACAB
                                     WHERE (CDFILIAL  = P_CDFILIAL)
                                       AND (NRPEDIDO  = C_CALECOMP.NRPEDIDO)
                                       AND (CDPRODUTO = C_SEMIACABADO.CDPRODINSUMO);
                                 EXCEPTION
                                    WHEN NO_DATA_FOUND THEN
                                       V_CDPRODEMANDA := '';
                                       V_QTESTOQUE    := 0;
                                 END;

                                 IF V_QTESTOQUE > 0 THEN
                                    V_QTSEMIACAB := C_SEMIACABADO.QTAINSUMPREOP - V_QTESTOQUE;

                                    IF (V_QTESTOQUE - C_SEMIACABADO.QTAINSUMPREOP) > 0 THEN
                                       -- Altera a quantidade de estoque deste produto.
                                       UPDATE ESTSEMIACAB
                                          SET QTESTOQUE  = V_QTESTOQUE - C_SEMIACABADO.QTAINSUMPREOP
                                        WHERE (CDFILIAL  = P_CDFILIAL)
                                          AND (NRPEDIDO  = C_CALECOMP.NRPEDIDO)
                                          AND (CDPRODUTO = C_SEMIACABADO.CDPRODINSUMO);
                                    ELSE
                                       -- Zera a quantidade de estoque deste produto.
                                       UPDATE ESTSEMIACAB
                                          SET QTESTOQUE  = 0
                                        WHERE (CDFILIAL  = P_CDFILIAL)
                                          AND (NRPEDIDO  = C_CALECOMP.NRPEDIDO)
                                          AND (CDPRODUTO = C_SEMIACABADO.CDPRODINSUMO);
                                    END IF;

                                 ELSE
                                    V_QTSEMIACAB := C_SEMIACABADO.QTAINSUMPREOP;
                                 END IF;

                                 IF V_QTSEMIACAB > 0 THEN

                                     GERA_OP_SEMIACABADO(P_CDFILIAL, C_SEMIACABADO.CDPRODINSUMO, C_SEMIACABADO.CDPROCFABRIC, '1', '3', C_CALECOMP.DTCONCPROMRP, C_SEMIACABADO.DTVALIDADE,
                                                         V_QTSEMIACAB, V_DSORDPROD, P_NRPLANOPROD, V_IDGERAOPCONF, C_CALECOMP.NRPEDIDO, V_NRITEMPED);
                                 END IF;
                              END IF;

                           END LOOP;
                        END IF;
                     END IF;
                  END IF;
               ELSE
                  IF ((V_NRORDENAOP <> C_CALECOMP.NRORDENAOP) OR (V_IDSUBOPSEMIACA = 'N')) THEN

                     /* Gera o numero do Lote de Producao */
                     PRXLOTEPROD(P_CDFILIAL, C_CALECOMP.DTCONCPROMRP, C_CALECOMP.CDPRODUTO, V_NRLOTEESTQ);

                     /* Gera o numero da OP/SubOP */
                     NOVO_CODIGO_SC('NRORDPROD'||P_CDFILIAL, V_SEQNRORDPROD, 1);
                     V_NRORDPROD     := SUBSTR(V_SEQNRORDPROD, 11, 10);
                     V_NRORDENASUBOP := '0';

                     V_NRORDENAOP := C_CALECOMP.NRORDENAOP;
                  END IF;

                  IF V_CDPRODFINAL <> C_CALECOMP.CDPRODFINAL THEN
                     V_DTVALILOTE := C_CALECOMP.DTVALIDADE;
                     V_CDPRODFINAL := C_CALECOMP.CDPRODFINAL;
                  END IF;

                  V_NRSUBLOTE := ' ';

                  SELECT
                     MAX(NRLOTEESTQ)
                  INTO
                     V_NRLOTEEXIST
                  FROM
                     LOTE
                  WHERE
                     CDFILIAL     = P_CDFILIAL    AND
                     CDPRODUTO    = C_CALECOMP.CDPRODUTO AND
                     NRLOTEESTQ   = V_NRLOTEESTQ;

                  BEGIN
                     SELECT NVL(IDGERAOPCONF,'N')
                     INTO V_IDGERAOPCONF
                     FROM PARAMPRODMRP
                     WHERE
                        CDFILIAL = P_CDFILIAL AND
                        CDPRODUTO =  C_CALECOMP.CDPRODUTO;
                  EXCEPTION
                     WHEN NO_DATA_FOUND THEN
                        V_IDGERAOPCONF := 'N';
                  END;

                  IF V_NRLOTEEXIST IS NULL THEN
                     INSERT INTO LOTE
                        (CDFILIAL, NRLOTEESTQ, NRSUBLOTE, CDPRODUTO, IDSTATLOTE,
                        DTENTRLOTE, DTVALILOTE, IDSTPRODLOTE, CDPLANPRODLT)
                     VALUES
                        (P_CDFILIAL, V_NRLOTEESTQ, V_NRSUBLOTE, C_CALECOMP.CDPRODUTO, 'I',
                         C_CALECOMP.DTCONCPROMRP, V_DTVALILOTE, '1', P_NRPLANOPROD);
                  END IF;

                  IF P_CDPRODUTO IS NULL THEN
                     V_DSORDPROD := P_DSORDPROD||': '||C_CALECOMP.NRPEDIDO||' Item: '||C_CALECOMP.NRITEMPED;
                  ELSE
                     V_DSORDPROD := 'OP gerada atraves da tela de Estoque Minimo.';
                  END IF;

                  INSERT INTO ORDPRODUCAO
                     (CDFILIAL, NRORDPROD, NRSUBORDPROD, CDPRODUTO,
                      CDPROCFABRIC, IDSITORDPROD, IDTIPORDPROD, DTGERORDPROD, QTAPRODPREOP,
                     DTHRINIPREOP, NRLOTEESTQ, NRSUBLOTE, DSORDPROD, CDPLANPRODOP, IDCONFIRMAOP,
                     NRPEDIDO, NRITEMPED)
                  VALUES
                     (P_CDFILIAL, V_NRORDPROD, V_NRORDENASUBOP, C_CALECOMP.CDPRODUTO,
                     C_CALECOMP.CDPROCFABRIC, '1', '3', C_CALECOMP.DTCONCPROMRP, V_QTDEMANDA,
                     C_CALECOMP.DTCONCPROMRP, V_NRLOTEESTQ, V_NRSUBLOTE, V_DSORDPROD, P_NRPLANOPROD, V_IDGERAOPCONF,
                     C_CALECOMP.NRPEDIDO, C_CALECOMP.NRITEMPED);

                 V_DSITEMPED := 'OP: '||V_NRORDPROD||'/'||V_NRORDENASUBOP;

                 /* Coloca o numero da OP na observacao do item */
                 IF NOT (V_DSITEMPED IS NULL) THEN
                    UPDATE ITEMPEDIDO
                       SET DSITEMPED = V_DSITEMPED
                     WHERE CDFILIAL  = P_CDFILIAL
                       AND NRPEDIDO  = C_CALECOMP.NRPEDIDO
                       AND NRITEMPED = C_CALECOMP.NRITEMPED;
                 END IF;

                 FOR C_SEMIACABADO IN (
                                        SELECT I.CDPRODUTO   ,
                                               I.CDETAPAPROD ,
                                               I.CDPRODINSUMO,
                                               F.CDPROCFABRIC,
                                               (SYSDATE) AS DTVALIDADE,
                                               I.IDUTAPRREQET,
                                               I.IDSEMIACETAP,
                                               I.QTINSUMETAPA,
                                               I.QTRENDINSU  ,
                                               O.QTAPRODPREOP,
                                               QTPREVI_MATPRIMA(I.CDFILIAL, I.CDPRODUTO, I.CDPROCFABRIC, I.CDETAPAPROD, I.CDPRODINSUMO, O.QTAPRODPREOP) AS QTAINSUMPREOP
                                          FROM ORDPRODUCAO O,
                                               PROCFABRICA F,
                                               INSUMETAPA  I
                                         WHERE (I.IDSEMIACETAP = 'S'            )
                                           AND (F.IDPROFABPADR = 'S'            )
                                           AND (F.CDFILIAL     = I.CDFILIAL     )
                                           AND (F.CDPRODUTO    = I.CDPRODINSUMO )
                                           AND (O.CDFILIAL     = I.CDFILIAL     )
                                           AND (O.CDPRODUTO    = I.CDPRODUTO    )
                                           AND (O.CDPROCFABRIC = I.CDPROCFABRIC )
                                           AND (O.CDFILIAL     = P_CDFILIAL     )
                                           AND (O.NRORDPROD    = V_NRORDPROD    )
                                           AND (O.NRSUBORDPROD = V_NRORDENASUBOP)
                                           AND (O.CDPRODUTO    = C_CALECOMP.CDPRODUTO   )
                                           AND (O.CDPROCFABRIC = C_CALECOMP.CDPROCFABRIC)
                                         ORDER BY I.CDETAPAPROD, I.CDPRODINSUMO
                                         ) LOOP

                        IF C_SEMIACABADO.QTAINSUMPREOP > 0 THEN

                           V_QTSEMIACAB := 0;

                           -- Consulta tabela temporaria de estoque.
                           BEGIN
                              SELECT CDPRODUTO, QTESTOQUE
                                INTO V_CDPRODEMANDA, V_QTESTOQUE
                                FROM ESTSEMIACAB
                               WHERE (CDFILIAL  = P_CDFILIAL)
                                 AND (NRPEDIDO  = C_CALECOMP.NRPEDIDO)
                                 AND (CDPRODUTO = C_SEMIACABADO.CDPRODINSUMO);
                           EXCEPTION
                              WHEN NO_DATA_FOUND THEN
                                 V_CDPRODEMANDA := '';
                                 V_QTESTOQUE    := 0;
                           END;

                           IF V_QTESTOQUE > 0 THEN
                              V_QTSEMIACAB := C_SEMIACABADO.QTAINSUMPREOP - V_QTESTOQUE;

                              IF (V_QTESTOQUE - C_SEMIACABADO.QTAINSUMPREOP) > 0 THEN
                                 -- Altera a quantidade de estoque deste produto.
                                 UPDATE ESTSEMIACAB
                                    SET QTESTOQUE  = V_QTESTOQUE - C_SEMIACABADO.QTAINSUMPREOP
                                  WHERE (CDFILIAL  = P_CDFILIAL)
                                    AND (NRPEDIDO  = C_CALECOMP.NRPEDIDO)
                                    AND (CDPRODUTO = C_SEMIACABADO.CDPRODINSUMO);
                              ELSE
                                 -- Zera a quantidade de estoque deste produto.
                                 UPDATE ESTSEMIACAB
                                    SET QTESTOQUE  = 0
                                  WHERE (CDFILIAL  = P_CDFILIAL)
                                    AND (NRPEDIDO  = C_CALECOMP.NRPEDIDO)
                                    AND (CDPRODUTO = C_SEMIACABADO.CDPRODINSUMO);
                              END IF;

                           ELSE
                              V_QTSEMIACAB := C_SEMIACABADO.QTAINSUMPREOP;
                           END IF;

                           IF V_QTSEMIACAB > 0 THEN

                               GERA_OP_SEMIACABADO(P_CDFILIAL, C_SEMIACABADO.CDPRODINSUMO, C_SEMIACABADO.CDPROCFABRIC, '1', '3', C_CALECOMP.DTCONCPROMRP, C_SEMIACABADO.DTVALIDADE,
                                                   V_QTSEMIACAB, V_DSORDPROD, P_NRPLANOPROD, V_IDGERAOPCONF, C_CALECOMP.NRPEDIDO, C_CALECOMP.NRITEMPED);
                           END IF;
                        END IF;

                    END LOOP;
               END IF;
            END IF;
         END IF;

         /* Verifica se a OP vem de um Pedido */
         IF NOT (C_CALECOMP.NRPEDIDO IS NULL) THEN

               SELECT MAX(IDCNTRESTOQ), MAX(IDUTCTRLLOTE)
                 INTO V_IDCNTRESTOQ, V_IDUTCTRLLOTE
                 FROM PRODFILI
                WHERE CDPRODUTO = C_CALECOMP.CDPRODUTO
                  AND CDFILIAL = P_CDFILIAL;

               IF ((V_IDCNTRESTOQ = 'S') AND (V_IDUTCTRLLOTE = 'S')) THEN

                  SELECT MAX(NRRESPRODPED), MAX(NRLOTEESTQ)
                    INTO V_NRRESPRODPED, V_NRLOTERESERVA
                    FROM RESERPRODPED
                   WHERE CDFILIAL  = P_CDFILIAL
                     AND NRPEDIDO  = C_CALECOMP.NRPEDIDO
                     AND NRITEMPED = C_CALECOMP.NRITEMPED;

                  /* Verifica se existe uma reserva sem lote para este item */
                  IF NOT (V_NRRESPRODPED IS NULL) THEN
                     IF (V_NRLOTERESERVA IS NULL) THEN

                        UPDATE RESERPRODPED
                           SET NRLOTEESTQ = V_NRLOTEESTQ,
                               NRSUBLOTE  = V_NRSUBLOTE
                         WHERE CDFILIAL  = P_CDFILIAL
                           AND NRPEDIDO  = C_CALECOMP.NRPEDIDO
                           AND NRITEMPED = C_CALECOMP.NRITEMPED;
                     END IF;
                  END IF;
               END IF;
         END IF;

         IF V_IDUTEQUIPLAPROD = 'S' THEN
            FOR C_EQUIP IN( SELECT CDFILIAL, CDEQUIPPRO, DTHRINIUTEQUIP, DTHRFINUTEQUIP,
                                   DTPROGUTEQUIP, CDPRODUTO, QTPRODPROCEQUIP, CDGRUPOEQUIPA,
                                   CDETAPAPROD, CDINSPECAO, NRINSPETAPAPROD
                              FROM CALENDEQUIPAPRO
                             WHERE
                                CDFILIAL = P_CDFILIAL AND
                                DTPROGUTEQUIP = P_DTMRP AND
                                CDPRODUTO = C_CALECOMP.CDPRODUTO AND
                                NRSEQLOTEDIAPRO = C_CALECOMP.NRSEQLOTEDIA AND
                                DTCONCPRODEQUIP = C_CALECOMP.DTCONCPROMRP )LOOP

               INSERT INTO RESERVEQUIPAPRO( CDFILIAL, NRORDPROD, NRSUBORDPROD,
                                        CDEQUIPPRO, DTHRINIPROD, DTHRFINPROD,
                                        DTMRPRESEQUIP, CDPRODUTO, QTPRODRESPROC,
                                        CDGRUPOEQUIPA, CDETAPAPROD, CDINSPECAO, NRINSPETAPARES)

                                 VALUES( P_CDFILIAL, V_NRORDPROD, V_NRORDENASUBOP,
                                         C_EQUIP.CDEQUIPPRO, C_EQUIP.DTHRINIUTEQUIP, C_EQUIP.DTHRFINUTEQUIP,
                                         P_DTMRP, C_EQUIP.CDPRODUTO,  C_EQUIP.QTPRODPROCEQUIP,
                                         C_EQUIP.CDGRUPOEQUIPA, C_EQUIP.CDETAPAPROD, C_EQUIP.CDINSPECAO, C_EQUIP.NRINSPETAPAPROD);
            END LOOP;
         END IF;

         SELECT MAX(IDMRPPEDPREV)
         INTO V_IDMRPPEDPREV
         FROM PROGPRODU
         WHERE
            CDFILIAL = P_CDFILIAL AND
            DTPROGPRODU = P_DTMRP;

         IF ((INSTR( V_IDMRPPEDPREV, 'P') > 0)OR (INSTR( V_IDMRPPEDPREV, 'O') > 0) ) THEN

            FOR C_REG IN(  SELECT P.NRPEDIDO,  P.NRITEMPED, P.CDFILIAL
                             FROM PEDIDOMRP P, ITEMPEDIDO I
                             WHERE
                                  P.CDFILIAL =  P_CDFILIAL AND
                                  P.DTHRPEDIDOMRP = P_DTMRP AND
                                  P.CDFILIAL = I.CDFILIAL AND
                                  P.NRPEDIDO = I.NRPEDIDO AND
                                  P.NRITEMPED = I.NRITEMPED AND
                                  I.CDPRODUTO = C_CALECOMP.CDPRODUTO AND
                                  (NOT EXISTS( SELECT CDFILIAL
                                                  FROM PEDIDOP
                                                 WHERE
                                                    (CDFILIAL  = I.CDFILIAL)AND
                                                    (NRPEDIDO  = I.NRPEDIDO)AND
                                                    (NRITEMPED = I.NRITEMPED)AND
                                                    (NRORDPROD = V_NRORDPROD)AND
                                                    (NRSUBORDPROD = V_NRORDENASUBOP))))LOOP

               INSERT INTO PEDIDOP
                  (CDFILIAL, NRORDPROD, NRSUBORDPROD, NRPEDIDO, NRITEMPED)
                  VALUES
                  (P_CDFILIAL, V_NRORDPROD, V_NRORDENASUBOP, C_REG.NRPEDIDO, C_REG.NRITEMPED);
            END LOOP;

            FOR C_ITEMPEDIDO IN (
                  SELECT DISTINCT
                     IT.NRPEDIDO,
                     IT.NRITEMPED,
                     IT.DTENTITPED
                  FROM INSUMETAPA I, ITEMPEDIDO IT, PEDIDOMRP P
                  WHERE
                        (P.CDFILIAL      = P_CDFILIAL)
                    AND (P.DTHRPEDIDOMRP = P_DTMRP)
                    AND (IT.CDFILIAL     = P.CDFILIAL)
                    AND (IT.NRPEDIDO     = P.NRPEDIDO)
                    AND (IT.CDPRODUTO    = I.CDPRODUTO)
                    AND (I.CDFILIAL     = P_CDFILIAL)
                    AND (I.CDPROCFABRIC = C_CALECOMP.CDPROCFABRIC)
                    AND (I.CDPRODINSUMO = C_CALECOMP.CDPRODUTO)
                    AND (I.IDSEMIACETAP = 'S')) LOOP

                  INSERT INTO INSUPEDIDOP
                  (CDFILIAL, NRORDPROD, NRSUBORDPROD, NRPEDIDO, NRITEMPED, CDPRODINSUMO)
                  VALUES
                  (P_CDFILIAL, V_NRORDPROD, V_NRORDENASUBOP, C_ITEMPEDIDO.NRPEDIDO, C_ITEMPEDIDO.NRITEMPED, C_CALECOMP.CDPRODUTO);
            END LOOP;
         ELSE
            IF (INSTR( V_IDMRPPEDPREV, 'S') > 0) THEN

               FOR C_REG IN( SELECT S.CDFILSOLI, S.CDFILLAN, S.NRSOLICMP, S.CDPRODUTO, S.DTPROGENTR, S.CDFILIAL
                               FROM SOLICITAMRP S
                              WHERE
                                 S.CDFILIAL = P_CDFILIAL AND
                                 S.DTHRSOLICITAMRP = P_DTMRP AND
                                 S.CDPRODUTO = C_CALECOMP.CDPRODUTO AND
                                 ( NOT EXISTS ( SELECT  CDFILIAL
                                                  FROM SOLICITAOP
                                                 WHERE
                                                    CDFILIAL = S.CDFILIAL AND
                                                    NRORDPROD = V_NRORDPROD AND
                                                    NRSUBORDPROD = V_NRORDENASUBOP AND
                                                    CDFILSOLI = S.CDFILSOLI AND
                                                    CDFILLAN  = S.CDFILLAN AND
                                                    NRSOLICMP = S.NRSOLICMP AND
                                                    CDPRODUTO = S.CDPRODUTO AND
                                                    DTPROGENTR = S.DTPROGENTR))) LOOP

                  INSERT INTO SOLICITAOP( CDFILIAL, NRORDPROD, NRSUBORDPROD, CDFILSOLI, CDFILLAN, NRSOLICMP, CDPRODUTO, DTPROGENTR)
                                  VALUES( C_REG.CDFILIAL, V_NRORDPROD, V_NRORDENASUBOP, C_REG.CDFILSOLI, C_REG.CDFILLAN, C_REG.NRSOLICMP, C_REG.CDPRODUTO, C_REG.DTPROGENTR);
               END LOOP;
            END IF;
         END IF;

         UPDATE CALEPRODMRP
         SET IDGERAOPPREV = 'S'
         WHERE
            (CDFILIAL     = P_CDFILIAL)               AND
            (DTPROGPRODCP = P_DTMRP)                  AND
            (CDPRODUTO    = C_CALECOMP.CDPRODUTO)     AND
            (DTCONCPROMRP = C_CALECOMP.DTCONCPROMRP);

         V_NRORDENASUBOP := TO_CHAR(TO_NUMBER(V_NRORDENASUBOP) + 1);
      END LOOP;

      /*Gera previsao de compras das materias primas do MRP*/
      SELECT
         MAX(CDPRODPREVMP)
      INTO
         V_EXISPREVI
      FROM
         PREMATPPROGP
      WHERE
         CDFILIAL     = P_CDFILIAL  AND
         DTPROGPRODMP = P_DTMRP     AND
         QTPREVMATPRI > 0;

      IF NOT V_EXISPREVI IS NULL THEN
         SELECT
            MAX(CDSETORPROD)
         INTO
            V_CDSETORPROD
         FROM
            PARAMAN
         WHERE
            (CDFILIAL  = P_CDFILIAL) AND
            (CDPARAMAN = '1');

         INSERT INTO PREVCOMP
            (CDFILIAL, NRPREVCOMP, CDSETOR, CDOPGERPRCOM, DTHRPREVCOMP, IDSTPREVCOMP)
         VALUES
            (P_CDFILIAL, P_NRPREVCOMP, V_CDSETORPROD, P_CDOPERADOR, SYSDATE, 'P');

         FOR C_MPRIMAMRP IN
            (SELECT
                CDPRODPREVMP,
                DTUTILPROD,
                QTPREVMATPRI
             FROM
                PREMATPPROGP
             WHERE
                CDFILIAL     = P_CDFILIAL  AND
                DTPROGPRODMP = P_DTMRP     AND
                QTPREVMATPRI > 0
             ORDER BY
                CDPRODPREVMP,
                DTUTILPROD
            )
         LOOP
            SELECT
               NVL(MAX(NRITPREVCOMP), 0) + 1 AS NRITPREVCOMP
            INTO
               V_NRSEQPREVI
            FROM
               ITPREVCOMP
            WHERE
               CDFILIAL   = P_CDFILIAL    AND
               NRPREVCOMP = P_NRPREVCOMP;

            INSERT INTO ITPREVCOMP
               (CDFILIAL, NRPREVCOMP, NRITPREVCOMP, CDPRODUTO,
                DTENTPRECOMP, QTPREVCOMP)
            VALUES
               (P_CDFILIAL, P_NRPREVCOMP, LPAD(TO_CHAR(V_NRSEQPREVI), 4, '0'), C_MPRIMAMRP.CDPRODPREVMP,
                C_MPRIMAMRP.DTUTILPROD, C_MPRIMAMRP.QTPREVMATPRI);
         END LOOP;
      END IF;
   END IF;
   -- Limpa a tabela de estoque temporaria.
   DELETE FROM ESTSEMIACAB;
END;
/