create or replace PROCEDURE CALCULA_CUSTO_OP_CONS(P_CDFILIAL     IN ORDPRODUCAO.CDFILIAL%TYPE,
                                                  P_NRORDPROD    IN ORDPRODUCAO.NRORDPROD%TYPE,
                                                  P_NRSUBORDPROD IN ORDPRODUCAO.NRSUBORDPROD%TYPE)
IS
   V_SEQUCUSTO    APRCUSTOP.NRAPRCUSTOP%TYPE;
   V_TIPOCUSTO    VARCHAR2(02);
   V_NMTPCUSTO    VARCHAR2(60);
   V_CDCUSTOINDI  VARCHAR2(03);
   V_CDETAPAPROD  VARCHAR2(10);
   V_VRFATOCONVES FLOAT;
   V_QTPERDAOP    FLOAT;
   V_QTPRODUCAO   FLOAT;
   V_QUANTIDADE   FLOAT;
   V_IDTPCALCCUSPROD PARAMAN.IDTPCALCCUSPROD%TYPE;
   V_QTPRODUZIDO     FLOAT;
   V_VRCUSTO         FLOAT;
   V_CDCENTCUST      RETIRADAESTO.CDCENTCUST%TYPE;
   V_SUMQTREALINSUMO FLOAT;
   V_TOTPRODUZIDO    FLOAT;
   V_QTREALINSUMO    FLOAT;
   V_CDINSUMONPREV   VARCHAR2(10);
   V_PERCENTUAL      FLOAT;
   V_IDSITORDPROD VARCHAR2(1);
   V_IDSITPESAGEM    VARCHAR2(10);
   V_IDORDPRODCON    ORDPRODUCAO.IDORDPRODCON%TYPE;
   V_EXISTE          INTEGER;

BEGIN
   SELECT MAX(IDSITORDPROD), NVL(MAX(IDSITPESAGEM),'N'), NVL(MAX(IDORDPRODCON),'N')
     INTO V_IDSITORDPROD, V_IDSITPESAGEM, V_IDORDPRODCON
     FROM ORDPRODUCAO
    WHERE CDFILIAL     = P_CDFILIAL
      AND NRORDPROD    = P_NRORDPROD
      AND NRSUBORDPROD = P_NRSUBORDPROD;

   IF V_IDSITORDPROD <> '3' THEN

      BEGIN
         SELECT COUNT(1)
           INTO V_EXISTE
           FROM APRCUSTOPPREV
          WHERE CDFILIAL     = P_CDFILIAL
            AND NRORDPROD    = P_NRORDPROD
            AND NRSUBORDPROD = P_NRSUBORDPROD;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_EXISTE := 0;
      END;

      IF ((V_EXISTE = 0) OR (V_EXISTE = '')) THEN
         /*TABELA PARA GUARDAR OS VALORES PREVISTOS DA OP*/
         INSERT INTO APRCUSTOPPREV
         (CDFILIAL, NRORDPROD, NRSUBORDPROD, CDETAPAPROD, NRAPRCUSTOP, CDCUSTOINDI, CDFUNCUSTO, NRLOTEESTQ, NRSUBLOTE, CDPRODUTO, CDAPRCUSTOP, NMAPRCUSTOP, QTAPRCUSTOP, VRUNICUSTOP, VRAPRCUSTOP, QTHRAPRCUST, CDTIPOPERDA, CDCENTCUST, IDSTATUSCTBOP, CDEMPRCTBOP, CDLOTECTBOP, DTLANCRETDEV, IDSITMATPRIMA)
         SELECT CDFILIAL, NRORDPROD, NRSUBORDPROD, CDETAPAPROD, NRAPRCUSTOP, CDCUSTOINDI, CDFUNCUSTO, NRLOTEESTQ, NRSUBLOTE, CDPRODUTO, CDAPRCUSTOP, NMAPRCUSTOP, QTAPRCUSTOP, VRUNICUSTOP, VRAPRCUSTOP, QTHRAPRCUST, CDTIPOPERDA, CDCENTCUST, IDSTATUSCTBOP, CDEMPRCTBOP, CDLOTECTBOP, DTLANCRETDEV, IDSITMATPRIMA
           FROM APRCUSTOP
          WHERE CDFILIAL     = P_CDFILIAL
            AND NRORDPROD    = P_NRORDPROD
            AND NRSUBORDPROD = P_NRSUBORDPROD;
      END IF;

      DELETE
        FROM APRCUSTOP
       WHERE CDFILIAL     = P_CDFILIAL
         AND NRORDPROD    = P_NRORDPROD
         AND NRSUBORDPROD = P_NRSUBORDPROD;

      V_SEQUCUSTO := 0;

      BEGIN
         SELECT MAX(NRTPCUSTOOP), MAX(IDTPCALCCUSPROD)
           INTO V_TIPOCUSTO, V_IDTPCALCCUSPROD
           FROM PARAMAN
          WHERE CDFILIAL = P_CDFILIAL;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_TIPOCUSTO := '';
            V_IDTPCALCCUSPROD := '';
      END;

      SELECT MAX(CDCUSTOINDI)
        INTO V_CDCUSTOINDI
        FROM CUSTOINDI
       WHERE CDFUNCUSTO = '001';

      IF NOT V_CDCUSTOINDI IS NULL THEN
         FOR C_PRODACABADO IN
            (SELECT SUM(O.QTAPRODPREOP)/COUNT(O.CDPRODUTO) AS QTAPRODPREOP, COUNT(O.CDPRODUTO) QTOP,
                    O.CDFILIAL, O.CDPRODUTO, O.CDPROCFABRIC,
                    MAX(O.NRLOTEESTQ) AS NRLOTEESTQ, MAX(O.NRSUBLOTE) AS NRSUBLOTE,
                    P.QTPRACABADO
               FROM ORDPRODUCAO O, PRODACABADO P
              WHERE O.CDFILIAL     = P_CDFILIAL
                AND O.NRORDPRODCON = P_NRORDPROD
                AND O.NRSUBOPCON   = P_NRSUBORDPROD
                AND O.NRORDPRODCON = P.NRORDPROD(+)
                AND O.NRSUBOPCON   = P.NRSUBORDPROD(+)
                AND O.CDFILIAL     = P.CDFILIAL(+)
                AND O.CDPRODUTO    = P.CDPRODUTO(+)
                AND V_IDSITPESAGEM <> 'CONCLUIDA'
              GROUP BY O.CDFILIAL, O.CDPRODUTO, O.CDPROCFABRIC, P.QTPRACABADO

             UNION ALL

             SELECT SUM(P.QTPRACABADO)/COUNT(P.CDPRODUTO) AS QTAPRODPREOP, COUNT(P.CDPRODUTO) QTOP,
                    P.CDFILIAL, P.CDPRODUTO, A.CDPROCFABRIC ,
                    MAX(P.NRLOTEESTQ)AS NRLOTEESTQ, MAX(P.NRSUBLOTE) AS NRSUBLOTE,
                    P.QTPRACABADO
               FROM PRODACABADO P, PROCFABRICA A
              WHERE P.CDFILIAL     = P_CDFILIAL
                AND P.NRORDPROD    = P_NRORDPROD
                AND P.NRSUBORDPROD = P_NRSUBORDPROD
                AND P.IDPRODUSUPL  = 'S'
                AND A.CDFILIAL     = P.CDFILIAL
                AND A.CDPRODUTO    = P.CDPRODUTO
                AND A.IDPROFABPADR = 'S'
                AND V_IDSITPESAGEM <> 'CONCLUIDA'
              GROUP BY P.CDFILIAL, P.CDPRODUTO, A.CDPROCFABRIC, P.QTPRACABADO

              UNION ALL

             SELECT (SUM(P.QTLIQACUM)/COUNT(O.CDPRODUTO)) AS QTAPRODPREOP, COUNT(O.CDPRODUTO) QTOP,
                    O.CDFILIAL, O.CDPRODUTO, O.CDPROCFABRIC,
                    MAX(O.NRLOTEESTQ) AS NRLOTEESTQ, MAX(O.NRSUBLOTE) AS NRSUBLOTE,
                    P.QTPRACABADO
               FROM ORDPRODUCAO O, PRODACABADO P
              WHERE O.CDFILIAL     = P_CDFILIAL
                AND O.NRORDPRODCON = P_NRORDPROD
                AND O.NRSUBOPCON   = P_NRSUBORDPROD
                AND O.NRORDPRODCON = P.NRORDPROD(+)
                AND O.NRSUBOPCON   = P.NRSUBORDPROD(+)
                AND O.CDFILIAL     = P.CDFILIAL(+)
                AND O.CDPRODUTO    = P.CDPRODUTO(+)
                AND V_IDSITPESAGEM = 'CONCLUIDA'
                AND NVL(P.QTLIQACUM,0) <> 0
              GROUP BY O.CDFILIAL, O.CDPRODUTO, O.CDPROCFABRIC, P.QTPRACABADO

              UNION ALL

             SELECT SUM(P.QTLIQACUM)/COUNT(P.CDPRODUTO) AS QTAPRODPREOP, COUNT(P.CDPRODUTO) QTOP,
                    P.CDFILIAL, P.CDPRODUTO, A.CDPROCFABRIC ,
                    MAX(P.NRLOTEESTQ)AS NRLOTEESTQ, MAX(P.NRSUBLOTE) AS NRSUBLOTE,
                    P.QTPRACABADO
               FROM PRODACABADO P, PROCFABRICA A
              WHERE P.CDFILIAL     = P_CDFILIAL
                AND P.NRORDPROD    = P_NRORDPROD
                AND P.NRSUBORDPROD = P_NRSUBORDPROD
                AND P.IDPRODUSUPL  = 'S'
                AND A.CDFILIAL     = P.CDFILIAL
                AND A.CDPRODUTO    = P.CDPRODUTO
                AND A.IDPROFABPADR = 'S'
                AND V_IDSITPESAGEM = 'CONCLUIDA'
                AND NVL(P.QTLIQACUM,0) <> 0
              GROUP BY P.CDFILIAL, P.CDPRODUTO, A.CDPROCFABRIC, P.QTPRACABADO
              ORDER BY 4
         ) LOOP
            FOR C_INSUMOS IN (SELECT SUM(QTPREVI_MATPRIMA(C_PRODACABADO.CDFILIAL, C_PRODACABADO.CDPRODUTO, C_PRODACABADO.CDPROCFABRIC,
                                     CDETAPAPROD, CDPRODINSUMO, NVL(C_PRODACABADO.QTPRACABADO,C_PRODACABADO.QTAPRODPREOP))) AS QTDEINSUMO,
                                     CDPRODUTO, CDPRODINSUMO, CDETAPAPROD
                                FROM INSUMETAPA
                               WHERE CDFILIAL      = C_PRODACABADO.CDFILIAL
                                 AND CDPRODUTO     = C_PRODACABADO.CDPRODUTO
                                 AND CDPROCFABRIC  = C_PRODACABADO.CDPROCFABRIC
                               GROUP BY CDPRODUTO, CDPRODINSUMO, CDETAPAPROD
                               ORDER BY CDPRODINSUMO
            )LOOP
               FOR C_CUSTOETAPA IN(SELECT VRCUSTO, QTDE_INSUMO, NMPRODUTO, CDCENTCUST
                                     FROM (SELECT (SELECT SUM(DECODE( IDTPRETEST, 'R', L.QTRETLIQPROD, (L.QTRETLIQPROD*(-1)))*
                                                          CUSTO_PRODUTO_LCEST(P_CDFILIAL, I.CDPRODUTO, V_TIPOCUSTO,
                                                          L.DTLANCRETDEV, SYSDATE, L.CDALMOXARIFE, L.CDLOCALESTOQ,
                                                          L.NRLOTEESTQ, L.NRSUBLOTE) ) / SUM(DECODE( IDTPRETEST, 'R', L.QTRETLIQPROD, (L.QTRETLIQPROD*(-1))))
                                                     FROM LOTITRETIEST L
                                                    WHERE I.CDFILIAL       = L.CDFILIAL     AND
                                                          I.NRRETEST       = L.NRRETEST     AND
                                                          I.NRSEQRETPROD   = L.NRSEQRETPROD AND
                                                          I.CDPRODUTO      = L.CDPRODUTO
                                                  ) AS VRCUSTO,
                                                  CALCULA_RATEIO_PROPORCIONAL_MP(P_CDFILIAL, P_NRORDPROD, P_NRSUBORDPROD, C_INSUMOS.CDPRODINSUMO, C_INSUMOS.QTDEINSUMO, V_IDSITPESAGEM, V_IDORDPRODCON) AS QTDE_INSUMO,
                                                  P.NMPRODUTO, R.CDCENTCUST
                                             FROM RETIRADAESTO R , ITEMRETIEST I, PRODUTO P, PARAMAN PM
                                            WHERE R.CDFILIAL      = P_CDFILIAL                AND
                                                  R.NRORDPROD     = P_NRORDPROD               AND
                                                  R.NRSUBORDPROD  = P_NRSUBORDPROD            AND
                                                  I.CDPRODUTO     = C_INSUMOS.CDPRODINSUMO    AND
                                                  R.CDFILIAL      = I.CDFILIAL                AND
                                                  R.NRRETEST      = I.NRRETEST                AND
                                                  I.CDPRODUTO     = P.CDPRODUTO               AND
                                                  R.CDETAPAPROD   = C_INSUMOS.CDETAPAPROD     AND
                                                  R.CDFILIAL      = PM.CDFILIAL               AND
                                                  (((I.CDPRODUTO     <> PM.CDPRODAGUA)        OR
                                                    (PM.CDPRODAGUA IS NULL))                   AND
                                                  I.CDPRODUTO NOT IN (SELECT CDPRODUTO
                                                                        FROM MULTPRODUTOS
                                                                       WHERE CDFILIAL = P_CDFILIAL)) AND
                                                  V_IDTPCALCCUSPROD = '1'

                                            UNION /*quantidade prvista*/

                                           SELECT DISTINCT (SELECT SUM(DECODE( IDTPRETEST, 'R', L.QTRETLIQPROD, (L.QTRETLIQPROD*(-1)))*
                                                                   ROUND(CUSTO_PRODUTO_LCEST(P_CDFILIAL, I.CDPRODUTO, V_TIPOCUSTO,
                                                                       L.DTLANCRETDEV, SYSDATE, L.CDALMOXARIFE, L.CDLOCALESTOQ,
                                                                       L.NRLOTEESTQ, L.NRSUBLOTE),2 )) / SUM(DECODE( IDTPRETEST, 'R', L.QTRETLIQPROD, (L.QTRETLIQPROD*(-1))))
                                                              FROM LOTITRETIEST L
                                                             WHERE I.CDFILIAL       = L.CDFILIAL     AND
                                                                   I.NRRETEST       = L.NRRETEST     AND
                                                                   I.NRSEQRETPROD   = L.NRSEQRETPROD AND
                                                                   I.CDPRODUTO      = L.CDPRODUTO
                                                           ) AS VRCUSTO,
                                                           C_INSUMOS.QTDEINSUMO AS QTDE_INSUMO,
                                                           P.NMPRODUTO, R.CDCENTCUST
                                             FROM RETIRADAESTO R , ITEMRETIEST I, PRODUTO P, PARAMAN PM
                                            WHERE R.CDFILIAL      = P_CDFILIAL             AND
                                                  R.NRORDPROD     = P_NRORDPROD            AND
                                                  R.NRSUBORDPROD  = P_NRSUBORDPROD         AND
                                                  I.CDPRODUTO     = C_INSUMOS.CDPRODINSUMO AND
                                                  R.CDFILIAL      = I.CDFILIAL             AND
                                                  R.NRRETEST      = I.NRRETEST             AND
                                                  I.CDPRODUTO     = P.CDPRODUTO            AND
                                                  R.CDETAPAPROD   = C_INSUMOS.CDETAPAPROD  AND
                                                  R.CDFILIAL      = PM.CDFILIAL            AND
                                                  (((I.CDPRODUTO     <> PM.CDPRODAGUA)        OR
                                                    (PM.CDPRODAGUA IS NULL))                   AND
                                                   I.CDPRODUTO NOT IN (SELECT CDPRODUTO
                                                                         FROM MULTPRODUTOS
                                                                        WHERE CDFILIAL = P_CDFILIAL)) AND
                                                  V_IDTPCALCCUSPROD = '2'

                  UNION /*quantidade/custo Agua parametrizada produto unico*/

                  SELECT
                     (((ROUND(ITEMRETIEST.QTPRERETPROD, 5) / 1000) * PM.VRPRODAGUA) / NVL(ITEMRETIEST.QTPRERETPROD,1)) AS VRCUSTOPROD,
                     ROUND(ITEMRETIEST.QTPRERETPROD, 5) AS QTRETI,
                     PRODUTO.NMPRODUTO, RETIRADAESTO.CDCENTCUST
                   FROM
                      PRODUTO, RETIRADAESTO, ITEMRETIEST, PARAMAN PM
                   WHERE
                      RETIRADAESTO.CDFILIAL      = P_CDFILIAL              AND
                      RETIRADAESTO.NRORDPROD     = P_NRORDPROD             AND
                      RETIRADAESTO.NRSUBORDPROD  = P_NRSUBORDPROD          AND
                      RETIRADAESTO.CDFILIAL      = ITEMRETIEST.CDFILIAL    AND
                      RETIRADAESTO.NRRETEST      = ITEMRETIEST.NRRETEST    AND
                      RETIRADAESTO.CDETAPAPROD   = C_INSUMOS.CDETAPAPROD   AND
                      ITEMRETIEST.CDPRODUTO      = PRODUTO.CDPRODUTO       AND
                      ITEMRETIEST.CDPRODUTO      = C_INSUMOS.CDPRODINSUMO  AND
                      RETIRADAESTO.CDFILIAL      = PM.CDFILIAL             AND
                      ITEMRETIEST.CDPRODUTO      = PM.CDPRODAGUA           AND
                      PM.IDPRODUTOUNICO          = 'S'                     AND
                      ITEMRETIEST.CDTIPORETI     NOT IN (SELECT CDTIPORETI
                                                           FROM TIPORETI
                                                          WHERE (CDFUNCUSTO = '099'))
                  UNION /*quantidade/custo Agua parametrizada multiplos produtos*/

                  SELECT
                     (((ROUND(ITEMRETIEST.QTPRERETPROD, 5) / 1000) *
                     NVL(MP1.VRPRODAGUA, 0)) / NVL(ITEMRETIEST.QTPRERETPROD, 1)) AS VRCUSTOPROD,
                     ROUND(ITEMRETIEST.QTPRERETPROD, 5) AS QTRETI,
                     PRODUTO.NMPRODUTO, RETIRADAESTO.CDCENTCUST
                    FROM
                     PRODUTO, RETIRADAESTO, ITEMRETIEST, PARAMAN PM, MULTPRODUTOS MP1
                   WHERE
                      RETIRADAESTO.CDFILIAL      = P_CDFILIAL              AND
                      RETIRADAESTO.NRORDPROD     = P_NRORDPROD             AND
                      RETIRADAESTO.NRSUBORDPROD  = P_NRSUBORDPROD          AND
                      RETIRADAESTO.CDFILIAL      = ITEMRETIEST.CDFILIAL    AND
                      RETIRADAESTO.NRRETEST      = ITEMRETIEST.NRRETEST    AND
                      RETIRADAESTO.CDETAPAPROD   = C_INSUMOS.CDETAPAPROD   AND
                      ITEMRETIEST.CDPRODUTO      = PRODUTO.CDPRODUTO       AND
                      ITEMRETIEST.CDPRODUTO      = C_INSUMOS.CDPRODINSUMO  AND
                      RETIRADAESTO.CDFILIAL      = PM.CDFILIAL             AND
                      RETIRADAESTO.CDFILIAL      = MP1.CDFILIAL            AND
                      PM.IDMULTPRODUTOS          = 'S'                     AND
                      ITEMRETIEST.CDPRODUTO      IN (SELECT CDPRODUTO
                                                       FROM MULTPRODUTOS MP2
                                                      WHERE CDFILIAL = P_CDFILIAL
                                                        AND MP2.CDPRODUTO = MP1.CDPRODUTO
                                                        AND MP2.CDFILIAL = MP1.CDFILIAL) AND
                      ITEMRETIEST.CDTIPORETI     NOT IN (SELECT CDTIPORETI
                                                           FROM TIPORETI
                                                          WHERE (CDFUNCUSTO = '099')))
               ) LOOP

                  V_SEQUCUSTO := V_SEQUCUSTO + 1;
                  INSERT INTO APRCUSTOP
                             (CDFILIAL,
                              NRORDPROD,
                              NRSUBORDPROD,
                              CDETAPAPROD,
                              CDPRODUTO,
                              NRAPRCUSTOP,
                              CDCUSTOINDI,
                              CDFUNCUSTO,
                              NRLOTEESTQ,
                              NRSUBLOTE,
                              CDAPRCUSTOP,
                              NMAPRCUSTOP,
                              QTAPRCUSTOP,
                              VRAPRCUSTOP,
                              CDCENTCUST,
                              IDSITMATPRIMA)
                          VALUES
                             (P_CDFILIAL,
                              P_NRORDPROD,
                              P_NRSUBORDPROD,
                              C_INSUMOS.CDETAPAPROD,
                              C_PRODACABADO.CDPRODUTO,  /* Produto de Producao */
                              LPAD(V_SEQUCUSTO, 10, '0'),
                              V_CDCUSTOINDI,
                              '001',
                              C_PRODACABADO.NRLOTEESTQ,
                              C_PRODACABADO.NRSUBLOTE,
                              C_INSUMOS.CDPRODINSUMO, /* Materia Prima / Insumos */
                              C_CUSTOETAPA.NMPRODUTO,
                              ROUND(C_CUSTOETAPA.QTDE_INSUMO,5),
                              ROUND(C_CUSTOETAPA.VRCUSTO,5),
                              C_CUSTOETAPA.CDCENTCUST,
                              'PREVISTA');
               END LOOP;
            END LOOP;
         END LOOP;
         IF V_IDTPCALCCUSPROD = '1' THEN
         /*A CONSULTA FOI ALTERADA PARA CONTEMPLAR:
           #OS INSUMOS INCLUIDOS MANUALMENTE NA RETIRADA DA OP
           #OS INSUMOS RETIRADOS E QUE NAO FAZ PARTE DO PROCESSO DE FABRICACAO DE ALGUM PRODUTO ACABADO PRODUZIDO
         */
            FOR C_INSUMONPREV IN ( (SELECT DISTINCT PR.CDPRODUTO, PR.CDARVPROD, PR.NMPRODUTO
                                     FROM RETIRADAESTO RT, PRODUTO PR, ITEMRETIEST IT, LOTITRETIEST LT
                                    WHERE RT.NRRETEST  = IT.NRRETEST
                                      AND RT.CDFILIAL  = IT.CDFILIAL
                                      AND PR.CDPRODUTO = IT.CDPRODUTO
                                      AND LT.CDFILIAL  = IT.CDFILIAL
                                      AND LT.CDPRODUTO = IT.CDPRODUTO
                                      AND LT.NRRETEST  = RT.NRRETEST
                                      AND RT.NRORDPROD = P_NRORDPROD
                                      AND RT.CDFILIAL = P_CDFILIAL
                                      AND RT.NRSUBORDPROD = P_NRSUBORDPROD
                                    MINUS
                                   SELECT PR.CDPRODUTO, PR.CDARVPROD, PR.NMPRODUTO
                                     FROM PRODUTO PR, INSUMETAPA IP, ORDPRODUCAO OP, PROCFABRICA PF, PRODACABADO PA
                                    WHERE PR.CDPRODUTO = IP.CDPRODINSUMO
                                      AND PA.CDPRODUTO = IP.CDPRODUTO
                                      AND OP.CDFILIAL = IP.CDFILIAL
                                      AND OP.CDFILIAL = PF.CDFILIAL
                                      AND OP.CDPROCFABRIC = PF.CDPROCFABRIC
                                      AND IP.CDPROCFABRIC = PF.CDPROCFABRIC
                                      AND PA.CDPRODUTO = PF.CDPRODUTO
                                      AND OP.NRORDPRODCON = PA.NRORDPROD
                                      AND OP.CDFILIAL = PA.CDFILIAL
                                      AND OP.NRSUBOPCON = PA.NRSUBORDPROD
                                      AND OP.NRORDPRODCON = P_NRORDPROD
                                      AND OP.CDFILIAL = P_CDFILIAL
                                      AND OP.NRSUBOPCON = P_NRSUBORDPROD)
                                    UNION
                                   SELECT CDPRODUTO, CDARVPROD, NMPRODUTO
                                     FROM (SELECT DISTINCT PR.CDPRODUTO, PR.CDARVPROD, PR.NMPRODUTO
                                             FROM RETIRADAESTO RT, PRODUTO PR, ITEMRETIEST IT, LOTITRETIEST LT
                                            WHERE RT.NRRETEST  = IT.NRRETEST
                                              AND RT.CDFILIAL  = IT.CDFILIAL
                                              AND PR.CDPRODUTO = IT.CDPRODUTO
                                              AND LT.CDFILIAL  = IT.CDFILIAL
                                              AND LT.CDPRODUTO = IT.CDPRODUTO
                                              AND LT.NRRETEST  = RT.NRRETEST
                                              AND RT.NRORDPROD = P_NRORDPROD
                                              AND RT.CDFILIAL = P_CDFILIAL
                                              AND RT.NRSUBORDPROD = P_NRSUBORDPROD
                                        INTERSECT
                                           SELECT PR.CDPRODUTO, PR.CDARVPROD, PR.NMPRODUTO
                                             FROM PRODUTO PR, INSUMETAPA IP, ORDPRODUCAO OP, PROCFABRICA PF, PRODACABADO PA
                                            WHERE PR.CDPRODUTO = IP.CDPRODINSUMO
                                              AND OP.CDPRODUTO = IP.CDPRODUTO
                                              AND OP.CDFILIAL = IP.CDFILIAL
                                              AND OP.CDFILIAL = PF.CDFILIAL
                                              AND OP.CDPROCFABRIC = PF.CDPROCFABRIC
                                              AND IP.CDPROCFABRIC = PF.CDPROCFABRIC
                                              AND OP.CDPRODUTO = PF.CDPRODUTO
                                              AND OP.NRORDPRODCON = PA.NRORDPROD
                                              AND OP.CDFILIAL = PA.CDFILIAL
                                              AND OP.NRSUBOPCON = PA.NRSUBORDPROD
                                              AND NVL(PA.QTLIQACUM,0) = 0
                                              AND V_IDSITPESAGEM = 'CONCLUIDA'
                                              AND PA.NRORDPROD = P_NRORDPROD
                                              AND PA.CDFILIAL = P_CDFILIAL
                                              AND PA.NRSUBORDPROD = P_NRSUBORDPROD) A
                                    WHERE NOT EXISTS (SELECT DISTINCT PR.CDPRODUTO, PR.CDARVPROD, PR.NMPRODUTO
                                                        FROM PRODUTO PR, INSUMETAPA IP, ORDPRODUCAO OP, PROCFABRICA PF, PRODACABADO PA
                                                       WHERE PR.CDPRODUTO = IP.CDPRODINSUMO
                                                         AND PA.CDPRODUTO = IP.CDPRODUTO
                                                         AND OP.CDFILIAL = IP.CDFILIAL
                                                         AND OP.CDFILIAL = PF.CDFILIAL
                                                         AND OP.CDPROCFABRIC = PF.CDPROCFABRIC
                                                         AND IP.CDPROCFABRIC = PF.CDPROCFABRIC
                                                         AND PA.CDPRODUTO = PF.CDPRODUTO
                                                         AND OP.NRORDPRODCON = PA.NRORDPROD
                                                         AND OP.CDFILIAL = PA.CDFILIAL
                                                         AND OP.NRSUBOPCON = PA.NRSUBORDPROD
                                                         AND NVL(PA.QTLIQACUM,0) > 0
                                                         AND V_IDSITPESAGEM = 'CONCLUIDA'
                                                         and IP.CDPRODINSUMO  = A.CDPRODUTO
                                                         AND OP.NRORDPRODCON = P_NRORDPROD
                                                         AND op.CDFILIAL = P_CDFILIAL
                                                         AND OP.NRSUBOPCON = P_NRSUBORDPROD)
                                  )
            LOOP

               BEGIN
                  SELECT I.CDPRODUTO, MAX(RT.CDETAPAPROD), MAX(RT.CDCENTCUST)
                    INTO V_CDINSUMONPREV, V_CDETAPAPROD, V_CDCENTCUST
                    FROM RETIRADAESTO RT, ITEMRETIEST I, LOTITRETIEST L
                   WHERE RT.CDFILIAL     = P_CDFILIAL
                     AND RT.NRORDPROD    = P_NRORDPROD
                     AND RT.NRSUBORDPROD = P_NRSUBORDPROD
                     AND I.CDPRODUTO     = C_INSUMONPREV.CDPRODUTO
                     AND RT.CDFILIAL     = I.CDFILIAL
                     AND RT.NRRETEST     = I.NRRETEST
                     AND I.CDFILIAL      = L.CDFILIAL
                     AND I.NRRETEST      = L.NRRETEST
                     AND I.NRSEQRETPROD  = L.NRSEQRETPROD
                     AND I.CDPRODUTO     = L.CDPRODUTO
                     AND L.IDTPRETEST = 'R'
                     GROUP BY I.CDPRODUTO;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_CDETAPAPROD := '';
                     V_VRCUSTO := 0;
                     V_CDCENTCUST := '';
               END;

               FOR C_TOTRETLOTE IN ( SELECT LT.CDALMOXARIFE, LT.CDLOCALESTOQ, LT.NRLOTEESTQ, LT.NRSUBLOTE,
                                            SUM(DECODE(LT.IDTPRETEST, 'R', QTRETLIQPROD, 'D', ((-1)*QTRETLIQPROD))) AS SUMQTREALINSUMO,
                                            CUSTO_PRODUTO_LCEST(P_CDFILIAL, C_INSUMONPREV.CDPRODUTO, V_TIPOCUSTO,
                                                                LT.DTLANCRETDEV, SYSDATE,
                                                                LT.CDALMOXARIFE, LT.CDLOCALESTOQ, LT.NRLOTEESTQ, LT.NRSUBLOTE) AS VRCUSTO
                                       FROM LOTITRETIEST LT, RETIRADAESTO RE
                                      WHERE LT.NRRETEST     = RE.NRRETEST
                                        AND LT.CDFILIAL     = RE.CDFILIAL
                                        AND RE.NRORDPROD    = P_NRORDPROD
                                        AND RE.NRSUBORDPROD = P_NRSUBORDPROD
                                        AND LT.CDPRODUTO    = C_INSUMONPREV.CDPRODUTO
                                        AND LT.CDFILIAL     = P_CDFILIAL
                                     GROUP BY LT.CDALMOXARIFE, LT.CDLOCALESTOQ, LT.NRLOTEESTQ, LT.NRSUBLOTE,
                                              CUSTO_PRODUTO_LCEST(P_CDFILIAL, C_INSUMONPREV.CDPRODUTO, V_TIPOCUSTO,
                                                                  LT.DTLANCRETDEV, SYSDATE,
                                                                   LT.CDALMOXARIFE, LT.CDLOCALESTOQ, LT.NRLOTEESTQ, LT.NRSUBLOTE)
                                    )
               LOOP


                  SELECT SUM(QTPRODUZIDO)
                    INTO V_TOTPRODUZIDO
                    FROM (SELECT NVL(SUM(P.QTPRACABADO), 0) AS QTPRODUZIDO
                            FROM PRODACABADO P
                           WHERE P.NRORDPROD    = P_NRORDPROD
                             AND P.NRSUBORDPROD = P_NRSUBORDPROD
                             AND P.CDFILIAL     = P_CDFILIAL
                             AND V_IDSITPESAGEM <> 'CONCLUIDA'
                           UNION ALL
                          SELECT NVL(SUM(P.QTLIQACUM), 0) AS QTPRODUZIDO
                            FROM PRODACABADO P
                           WHERE P.NRORDPROD    = P_NRORDPROD
                             AND P.NRSUBORDPROD = P_NRSUBORDPROD
                             AND P.CDFILIAL     = P_CDFILIAL
                             AND V_IDSITPESAGEM = 'CONCLUIDA');

                  IF (V_TOTPRODUZIDO IS NULL) OR (V_TOTPRODUZIDO = 0) THEN
                     SELECT SUM(O.QTAPRODPREOP)
                       INTO V_TOTPRODUZIDO
                       FROM ORDPRODUCAO O
                      WHERE O.NRORDPRODCON = P_NRORDPROD
                        AND O.NRSUBOPCON   = P_NRSUBORDPROD
                        AND O.CDFILIAL     = P_CDFILIAL;
                  END IF;

                  FOR C_PRODACABADO IN ( SELECT O.CDFILIAL, O.CDPRODUTO, O.CDPROCFABRIC ,
                                                NVL(SUM(O.QTAPRODPREOP),0)/COUNT(O.CDPRODUTO) AS QTPRODUZIDO, COUNT(O.CDPRODUTO) QTOP,
                                                MAX(O.NRLOTEESTQ) AS NRLOTEESTQ, MAX(O.NRSUBLOTE) AS NRSUBLOTE
                                           FROM ORDPRODUCAO O, PRODACABADO P
                                          WHERE O.NRORDPRODCON = P_NRORDPROD
                                            AND O.NRSUBOPCON   = P_NRSUBORDPROD
                                            AND O.CDFILIAL     = P_CDFILIAL
                                            AND O.NRORDPRODCON = P.NRORDPROD(+)
                                            AND O.NRSUBOPCON   = P.NRSUBORDPROD(+)
                                            AND O.CDFILIAL     = P.CDFILIAL(+)
                                            AND O.CDPRODUTO    = P.CDPRODUTO(+)
                                            AND V_IDSITPESAGEM <> 'CONCLUIDA'
                                          GROUP BY O.CDFILIAL, O.CDPRODUTO, O.CDPROCFABRIC
                                          UNION ALL
                                         SELECT P.CDFILIAL, P.CDPRODUTO, A.CDPROCFABRIC ,
                                                NVL(SUM(P.QTPRACABADO),0)/COUNT(P.CDPRODUTO) AS QTPRODUZIDO, COUNT(P.CDPRODUTO) QTOP,
                                                MAX(P.NRLOTEESTQ) AS NRLOTEESTQ, MAX(P.NRSUBLOTE) AS NRSUBLOTE
                                           FROM PRODACABADO P, PROCFABRICA A
                                          WHERE P.CDFILIAL     = P_CDFILIAL
                                            AND P.NRORDPROD    = P_NRORDPROD
                                            AND P.NRSUBORDPROD = P_NRSUBORDPROD
                                            AND P.IDPRODUSUPL  = 'S'
                                            AND A.CDFILIAL     = P.CDFILIAL
                                            AND A.CDPRODUTO    = P.CDPRODUTO
                                            AND A.IDPROFABPADR = 'S'
                                            AND V_IDSITPESAGEM <> 'CONCLUIDA'
                                       GROUP BY P.CDFILIAL, P.CDPRODUTO, A.CDPROCFABRIC

                                       UNION ALL

                                         SELECT O.CDFILIAL, O.CDPRODUTO, O.CDPROCFABRIC ,
                                                NVL(SUM(P.QTLIQACUM),0)/COUNT(O.CDPRODUTO) AS QTPRODUZIDO, COUNT(O.CDPRODUTO) QTOP,
                                                MAX(O.NRLOTEESTQ) AS NRLOTEESTQ, MAX(O.NRSUBLOTE) AS NRSUBLOTE
                                           FROM ORDPRODUCAO O, PRODACABADO P
                                          WHERE O.NRORDPRODCON = P_NRORDPROD
                                            AND O.NRSUBOPCON   = P_NRSUBORDPROD
                                            AND O.CDFILIAL     = P_CDFILIAL
                                            AND O.NRORDPRODCON = P.NRORDPROD(+)
                                            AND O.NRSUBOPCON   = P.NRSUBORDPROD(+)
                                            AND O.CDFILIAL     = P.CDFILIAL(+)
                                            AND O.CDPRODUTO    = P.CDPRODUTO(+)
                                            AND V_IDSITPESAGEM = 'CONCLUIDA'
                                            AND NVL(P.QTLIQACUM,0) <> 0
                                          GROUP BY O.CDFILIAL, O.CDPRODUTO, O.CDPROCFABRIC
                                          UNION ALL
                                         SELECT P.CDFILIAL, P.CDPRODUTO, A.CDPROCFABRIC ,
                                                NVL(SUM(P.QTLIQACUM),0)/COUNT(P.CDPRODUTO) AS QTPRODUZIDO, COUNT(P.CDPRODUTO) QTOP,
                                                MAX(P.NRLOTEESTQ) AS NRLOTEESTQ, MAX(P.NRSUBLOTE) AS NRSUBLOTE
                                           FROM PRODACABADO P, PROCFABRICA A
                                          WHERE P.CDFILIAL     = P_CDFILIAL
                                            AND P.NRORDPROD    = P_NRORDPROD
                                            AND P.NRSUBORDPROD = P_NRSUBORDPROD
                                            AND P.IDPRODUSUPL  = 'S'
                                            AND A.CDFILIAL     = P.CDFILIAL
                                            AND A.CDPRODUTO    = P.CDPRODUTO
                                            AND A.IDPROFABPADR = 'S'
                                            AND V_IDSITPESAGEM = 'CONCLUIDA'
                                            AND NVL(P.QTLIQACUM,0) <> 0
                                       GROUP BY P.CDFILIAL, P.CDPRODUTO, A.CDPROCFABRIC
                                       ORDER BY CDPRODUTO
                                        )
                  LOOP
                     V_QTPRODUZIDO := C_PRODACABADO.QTPRODUZIDO;
                     IF (V_QTPRODUZIDO IS NULL) OR (V_QTPRODUZIDO = 0) THEN
                        SELECT SUM(QTPRODUZIDO)
                          INTO V_QTPRODUZIDO
                          FROM (SELECT NVL(SUM(P.QTPRACABADO), 0)   AS QTPRODUZIDO
                                  FROM PRODACABADO P
                                 WHERE P.NRORDPROD    = P_NRORDPROD
                                   AND P.NRSUBORDPROD = P_NRSUBORDPROD
                                   AND P.CDFILIAL     = P_CDFILIAL
                                   AND P.CDPRODUTO    = C_PRODACABADO.CDPRODUTO
                                   AND V_IDSITPESAGEM <> 'CONCLUIDA'
                                 UNION ALL
                                SELECT NVL(SUM(P.QTLIQACUM), 0)   AS QTPRODUZIDO
                                  FROM PRODACABADO P
                                 WHERE P.NRORDPROD    = P_NRORDPROD
                                   AND P.NRSUBORDPROD = P_NRSUBORDPROD
                                   AND P.CDFILIAL     = P_CDFILIAL
                                   AND P.CDPRODUTO    = C_PRODACABADO.CDPRODUTO
                                   AND V_IDSITPESAGEM = 'CONCLUIDA');
                     END IF;
                     V_PERCENTUAL := V_QTPRODUZIDO /V_TOTPRODUZIDO;

                     V_QTREALINSUMO := ROUND(V_PERCENTUAL * C_TOTRETLOTE.SUMQTREALINSUMO,5);


                     V_SEQUCUSTO := V_SEQUCUSTO + 1;
                     INSERT INTO APRCUSTOP
                                (CDFILIAL,
                                 NRORDPROD,
                                 NRSUBORDPROD,
                                 CDETAPAPROD,
                                 CDPRODUTO,
                                 NRAPRCUSTOP,
                                 CDCUSTOINDI,
                                 CDFUNCUSTO,
                                 NRLOTEESTQ,
                                 NRSUBLOTE,
                                 CDAPRCUSTOP,
                                 NMAPRCUSTOP,
                                 QTAPRCUSTOP,
                                 VRAPRCUSTOP,
                                 CDCENTCUST,
                                 IDSITMATPRIMA)
                             VALUES
                                (P_CDFILIAL,
                                 P_NRORDPROD,
                                 P_NRSUBORDPROD,
                                 V_CDETAPAPROD,
                                 C_PRODACABADO.CDPRODUTO,
                                 LPAD(V_SEQUCUSTO, 10, '0'),
                                 V_CDCUSTOINDI,
                                 '001',
                                 C_PRODACABADO.NRLOTEESTQ,
                                 C_PRODACABADO.NRSUBLOTE,
                                 C_INSUMONPREV.CDPRODUTO,
                                 C_INSUMONPREV.NMPRODUTO,
                                 V_QTREALINSUMO,
                                 ROUND(C_TOTRETLOTE.VRCUSTO,5),
                                 V_CDCENTCUST,
                                 'N_PREVISTA');

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