CREATE OR REPLACE PROCEDURE RASTREIA_INSUMOS_OP(
   P_CDFILIAL     IN FILIAL.CDFILIAL%TYPE,
   P_CDPRODUTO    IN PRODUTO.CDPRODUTO%TYPE,
   P_NRLOTEESTQ   IN LOTE.NRLOTEESTQ%TYPE,
   P_NRSUBLOTE    IN LOTE.NRSUBLOTE%TYPE,
   P_NRRASTREIA   IN TRAB_RASTREIAINSUMOOP.NRRASTREIA%TYPE)
IS
   V_NRSEQRASTREIAINS   INTEGER;
   V_NRSEQITRASTREIAINS INTEGER;
   V_NRSEQESTOQINS      INTEGER;
BEGIN

   /*CURSOR QUE LISTA AS OP'S QUE DERAM ORIGEM AO PRODUTO/LOTE*/
   FOR C_OP IN (SELECT P.CDFILIAL, P.NRORDPROD, P.NRSUBORDPROD, P.CDSUBPRODETA, O.CDPROCFABRIC,
                       P.NRLOTEESTQ, P.NRSUBLOTE, NVL(P.QTLIQACUM, P.QTPRACABADO) QTPRACABADO,
                       O.DTHRFIMREAOP
                  FROM PRODACABADO P, ORDPRODUCAO O
                 WHERE P.CDFILIAL = P_CDFILIAL
                   AND P.CDPRODUTO = P_CDPRODUTO
                   AND P.NRLOTEESTQ = P_NRLOTEESTQ
                   AND P.NRSUBLOTE = P_NRSUBLOTE
                   AND P.CDFILIAL = O.CDFILIAL
                   AND P.NRORDPROD = O.NRORDPROD
                   AND P.NRSUBORDPROD = O.NRSUBORDPROD)
   LOOP
      SELECT NVL(MAX(NRSEQRASTREIAINS),0)
        INTO V_NRSEQRASTREIAINS
        FROM TRAB_RASTREIAINSUMOOP
       WHERE NRRASTREIA = P_NRRASTREIA;

      V_NRSEQRASTREIAINS := V_NRSEQRASTREIAINS+1;

      INSERT INTO TRAB_RASTREIAINSUMOOP
      (NRRASTREIA, NRSEQRASTREIAINS, CDFILIAL, CDPRODUTO, NRLOTEESTQ, NRSUBLOTE,
       NRORDPROD, NRSUBORDPROD, QTPRACABADO, DTHRFIMREAOP)
      VALUES
      (P_NRRASTREIA, V_NRSEQRASTREIAINS, P_CDFILIAL, P_CDPRODUTO, P_NRLOTEESTQ, P_NRSUBLOTE,
       C_OP.NRORDPROD, C_OP.NRSUBORDPROD, C_OP.QTPRACABADO, C_OP.DTHRFIMREAOP);

      /*CURSOR QUE LISTA OS INSUMOS UTILIZADOS EM CADA OP*/
      FOR C_INSUMO IN (SELECT L.CDFILIAL, L.NRRETEST, L.NRSEQRETPROD, L.CDPRODUTO, L.NRLOTEESTQ, L.NRSUBLOTE,
                              L.QTRETLIQPROD, L.CDALMOXARIFE, L.CDLOCALESTOQ
                         FROM RETIRADAESTO R, ITEMRETIEST I, LOTITRETIEST L
                        WHERE R.CDFILIAL = C_OP.CDFILIAL
                          AND R.NRORDPROD = C_OP.NRORDPROD
                          AND R.NRSUBORDPROD = C_OP.NRSUBORDPROD
                          AND R.CDFILIAL = I.CDFILIAL
                          AND R.NRRETEST = I.NRRETEST
                          AND I.CDFILIAL = L.CDFILIAL
                          AND I.NRRETEST = L.NRRETEST
                          AND I.CDPRODUTO = L.CDPRODUTO
                          AND I.NRSEQRETPROD = L.NRSEQRETPROD
                          AND L.IDTPRETEST = 'R')
      LOOP
         SELECT NVL(MAX(NRSEQITRASTREIAINS),0)
           INTO V_NRSEQITRASTREIAINS
           FROM TRAB_ITRASTREIAINSOP
          WHERE NRSEQRASTREIAINS = V_NRSEQRASTREIAINS
            AND NRRASTREIA = P_NRRASTREIA;

         V_NRSEQITRASTREIAINS := V_NRSEQITRASTREIAINS +1;

         INSERT INTO TRAB_ITRASTREIAINSOP
         (NRRASTREIA, NRSEQRASTREIAINS, CDFILIAL, CDPRODUTO, NRLOTEESTQ, NRSUBLOTE, NRSEQITRASTREIAINS,
          CDPRODINSUMO, NRLOTEINSUMO, NRSUBLOTEINS, QTUTILIZADA, CDALMOXARIFE, CDLOCALESTOQ)
         VALUES
         (P_NRRASTREIA, V_NRSEQRASTREIAINS, P_CDFILIAL, P_CDPRODUTO, P_NRLOTEESTQ, P_NRSUBLOTE, V_NRSEQITRASTREIAINS,
          C_INSUMO.CDPRODUTO, C_INSUMO.NRLOTEESTQ, C_INSUMO.NRSUBLOTE, C_INSUMO.QTRETLIQPROD, C_INSUMO.CDALMOXARIFE, C_INSUMO.CDLOCALESTOQ);

         /*CURSOR QUE LISTA AS ENTRADAS EM ESTOQUE DO INSUMO */
         FOR C_ESTOQUE IN (SELECT I.CDFILIAL, I.NRLANCESTQ, I.CDALMOXARIFE, I.CDLOCALESTOQ, P.NRORDPROD, P.NRSUBORDPROD,
                                  O.DTHRFIMREAOP, N.NRLANCTONF, N.DTEMISSAO, N.NRNOTAFISC, I.DSLANCESTIT, I.DTLANCMOVI, I.IDTIPOMOVI
                             FROM ITLANCTOEST I, PRODACABADO P, LANCTOESTOQ L, NOTAFISCAL N, ORDPRODUCAO O
                            WHERE I.CDFILIMOVI = C_INSUMO.CDFILIAL
                              AND I.CDPRODMOVI = C_INSUMO.CDPRODUTO
                              AND I.NRLOTEESTQ = C_INSUMO.NRLOTEESTQ
                              AND I.NRSUBLOTE  = C_INSUMO.NRSUBLOTE
                              AND I.IDTIPOMOVI IN ('0', '2')
                              AND I.CDFILIAL = L.CDFILIAL
                              AND I.NRLANCESTQ = L.NRLANCESTQ
                              AND L.CDFILIAL = N.CDFILIAL(+)
                              AND L.NRLANCTONF = N.NRLANCTONF(+)
                              AND I.CDFILIAL = P.CDFILIAL(+)
                              AND I.NRLANCESTQ = P.NRLANCESTQ(+)
                              AND I.NRSEQUITEM = P.NRSEQUITEM(+)
                              AND P.CDFILIAL = O.CDFILIAL(+)
                              AND P.NRORDPROD = O.NRORDPROD(+)
                              AND P.NRSUBORDPROD = O.NRSUBORDPROD(+)
                           ORDER BY I.DTLANCMOVI, I.NRLANCESTQ)
         LOOP
            SELECT NVL(MAX(NRSEQESTOQINS), 0)
              INTO V_NRSEQESTOQINS
              FROM TRAB_ESTOQUEINSOP
             WHERE NRRASTREIA = P_NRRASTREIA
               AND NRSEQRASTREIAINS = V_NRSEQRASTREIAINS
               AND NRSEQITRASTREIAINS = V_NRSEQITRASTREIAINS;

            V_NRSEQESTOQINS := V_NRSEQESTOQINS +1;

            INSERT INTO TRAB_ESTOQUEINSOP
            (NRRASTREIA, NRSEQRASTREIAINS, CDFILIAL, CDPRODUTO, NRLOTEESTQ, NRSUBLOTE, NRSEQITRASTREIAINS, NRSEQESTOQINS,
             NRLANCESTQ, CDALMOXARIFE, CDLOCALESTOQ, NRORDPROD, NRSUBORDPROD, DTCONCLUSAO,
             NRLANCTONF, DTEMISSAO, NRNOTAFISC, DSLANCESTIT, DTLANCMOVI, IDTIPOMOVI)
            VALUES
            (P_NRRASTREIA, V_NRSEQRASTREIAINS, P_CDFILIAL, P_CDPRODUTO, P_NRLOTEESTQ, P_NRSUBLOTE, V_NRSEQITRASTREIAINS, V_NRSEQESTOQINS,
             C_ESTOQUE.NRLANCESTQ, C_ESTOQUE.CDALMOXARIFE, C_ESTOQUE.CDLOCALESTOQ, C_ESTOQUE.NRORDPROD, C_ESTOQUE.NRSUBORDPROD, C_ESTOQUE.DTHRFIMREAOP,
             C_ESTOQUE.NRLANCTONF, C_ESTOQUE.DTEMISSAO, C_ESTOQUE.NRNOTAFISC, C_ESTOQUE.DSLANCESTIT, C_ESTOQUE.DTLANCMOVI, C_ESTOQUE.IDTIPOMOVI);

         END LOOP;

         RASTREIA_INSUMOS_OP(P_CDFILIAL, C_INSUMO.CDPRODUTO, C_INSUMO.NRLOTEESTQ, C_INSUMO.NRSUBLOTE, P_NRRASTREIA);
      END LOOP;

   END LOOP;


END;
/