create or replace FUNCTION CALCULA_RATEIO_PROPORCIONAL_MP(P_CDFILIAL     IN ORDPRODUCAO.CDFILIAL%TYPE,
                                                          P_NRORDPROD    IN ORDPRODUCAO.NRORDPROD%TYPE,
                                                          P_NRSUBORDPROD IN ORDPRODUCAO.NRSUBORDPROD%TYPE,
                                                          P_CDPRODINSUMO IN PRODUTO.CDPRODUTO%TYPE,
                                                          P_QTPREVINSUMO IN ITEMRETIEST.QTPRERETPROD%TYPE,
                                                          P_IDSITPESAGEM IN ORDPRODUCAO.IDSITPESAGEM%TYPE,
                                                          P_IDORDPRODCON IN ORDPRODUCAO.IDORDPRODCON%TYPE) RETURN NUMBER
IS
V_QTREALINSUMO    NUMBER;
V_SUMQTPREVINSUMO NUMBER;
V_SUMQTREALINSUMO NUMBER;
 
BEGIN 
   V_QTREALINSUMO := 1;
   V_SUMQTPREVINSUMO := 0;
   
   /*
   IDORDPRODCON
        N --> Normal (nao consolidada)
        C --> Consolidada 
        O --> OP original da consolidacao
   */

   IF P_IDORDPRODCON <> 'N' THEN /*OP'S CONSOLIDADAS*/

      SELECT SUM(QTDEINSUMO)
        INTO V_SUMQTPREVINSUMO
        FROM (/*CLIENTES QUE NAO UTILIZA BALANCA NO FECHAMENTO DA OP*/
              SELECT SUM(QTDEINSUMO) AS QTDEINSUMO
                FROM(SELECT O.CDFILIAL, O. NRORDPRODCON, O.NRSUBOPCON, O.CDPRODUTO, SUM(QTPREVI_MATPRIMA(O.CDFILIAL, O.CDPRODUTO, O.CDPROCFABRIC, I.CDETAPAPROD, P_CDPRODINSUMO, O.QTAPRODPREOP)) AS QTDEINSUMO
                       FROM ORDPRODUCAO O, INSUMETAPA I, PRODACABADO P
                      WHERE O.CDFILIAL     = P_CDFILIAL
                        AND O.NRORDPRODCON = P_NRORDPROD
                        AND O.NRSUBOPCON   = P_NRSUBORDPROD
                        AND O.CDFILIAL     = I.CDFILIAL
                        AND O.CDPRODUTO    = I.CDPRODUTO
                        AND O.CDPROCFABRIC = I.CDPROCFABRIC
                        AND I.CDPRODINSUMO = P_CDPRODINSUMO
                        AND O.NRORDPRODCON = P.NRORDPROD(+)
                        AND O.NRSUBOPCON   = P.NRSUBORDPROD(+)
                        AND O.CDFILIAL     = P.CDFILIAL(+)
                        AND O.CDPRODUTO    = P.CDPRODUTO(+)
                        AND P_IDSITPESAGEM <> 'CONCLUIDA'
                      GROUP BY O.CDFILIAL, O. NRORDPRODCON, O.NRSUBOPCON, O.CDPRODUTO)
               UNION ALL
              SELECT SUM(QTDEINSUMO) AS QTDEINSUMO
                FROM(SELECT P.CDFILIAL, P.NRORDPROD, P.NRSUBORDPROD, P.CDPRODUTO, SUM(QTPREVI_MATPRIMA(P.CDFILIAL, P.CDPRODUTO, A.CDPROCFABRIC, I.CDETAPAPROD, P_CDPRODINSUMO, P.QTPRACABADO)) AS QTDEINSUMO
                       FROM PRODACABADO P, PROCFABRICA A, ETAFABRIC E, INSUMETAPA I
                      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 E.CDFILIAL     = A.CDFILIAL
                        AND E.CDPRODUTO    = A.CDPRODUTO
                        AND E.CDPROCFABRIC = A.CDPROCFABRIC
                        AND I.CDFILIAL     = E.CDFILIAL
                        AND I.CDPRODUTO    = E.CDPRODUTO
                        AND I.CDPROCFABRIC = E.CDPROCFABRIC
                        AND I.CDETAPAPROD  = E.CDETAPAPROD
                        AND I.CDPRODINSUMO = P_CDPRODINSUMO
                        AND P_IDSITPESAGEM <> 'CONCLUIDA'
                      GROUP BY P.CDFILIAL, P.NRORDPROD, P.NRSUBORDPROD, P.CDPRODUTO)

               UNION ALL

              /*CLIENTES QUE UTILIZA BALANCA NO FECHAMENTO DA OP*/
              SELECT SUM(QTDEINSUMO) AS QTDEINSUMO
                FROM (SELECT DISTINCT O.CDFILIAL, O. NRORDPRODCON, O.NRSUBOPCON, O.CDPRODUTO, (QTPREVI_MATPRIMA(O.CDFILIAL, O.CDPRODUTO, O.CDPROCFABRIC, I.CDETAPAPROD, P_CDPRODINSUMO, P.QTLIQACUM)) AS QTDEINSUMO
                        FROM ORDPRODUCAO O, INSUMETAPA I, PRODACABADO P
                       WHERE O.CDFILIAL     = P_CDFILIAL
                         AND O.NRORDPRODCON = P_NRORDPROD
                         AND O.NRSUBOPCON   = P_NRSUBORDPROD
                         AND O.CDFILIAL     = I.CDFILIAL
                         AND O.CDPRODUTO    = I.CDPRODUTO
                         AND O.CDPROCFABRIC = I.CDPROCFABRIC
                         AND I.CDPRODINSUMO = P_CDPRODINSUMO
                         AND O.NRORDPRODCON = P.NRORDPROD(+)
                         AND O.NRSUBOPCON   = P.NRSUBORDPROD(+)
                         AND O.CDFILIAL     = P.CDFILIAL(+)
                         AND O.CDPRODUTO    = P.CDPRODUTO(+)
                         AND P_IDSITPESAGEM = 'CONCLUIDA'
                         AND NVL(P.QTLIQACUM,0) <> 0)
               UNION ALL
              SELECT SUM(QTDEINSUMO) AS QTDEINSUMO
                FROM(SELECT DISTINCT P.CDFILIAL , P.NRORDPROD, P.NRSUBORDPROD, P.CDPRODUTO, (QTPREVI_MATPRIMA(P.CDFILIAL, P.CDPRODUTO, A.CDPROCFABRIC, I.CDETAPAPROD, P_CDPRODINSUMO, P.QTLIQACUM)) AS QTDEINSUMO
                       FROM PRODACABADO P, PROCFABRICA A, ETAFABRIC E, INSUMETAPA I
                      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 E.CDFILIAL     = A.CDFILIAL
                       AND E.CDPRODUTO    = A.CDPRODUTO
                       AND E.CDPROCFABRIC = A.CDPROCFABRIC
                       AND I.CDFILIAL     = E.CDFILIAL
                       AND I.CDPRODUTO    = E.CDPRODUTO
                       AND I.CDPROCFABRIC = E.CDPROCFABRIC
                       AND I.CDETAPAPROD  = E.CDETAPAPROD
                       AND I.CDPRODINSUMO = P_CDPRODINSUMO
                       AND P_IDSITPESAGEM = 'CONCLUIDA'
                       AND NVL(P.QTLIQACUM,0) <> 0));
                       
                       

   ELSE/*OP'S NAO CONSOLIDADAS(NORMAL)*/
      
      SELECT SUM(QTDEINSUMO)
        INTO V_SUMQTPREVINSUMO
        FROM (/*CLIENTES QUE NAO UTILIZA BALANCA NO FECHAMENTO DA OP*/
              SELECT SUM(QTDEINSUMO) AS QTDEINSUMO
                FROM(SELECT DISTINCT O.CDFILIAL, O. NRORDPROD, O.NRSUBORDPROD, O.CDPRODUTO, (QTPREVI_MATPRIMA(O.CDFILIAL, O.CDPRODUTO, O.CDPROCFABRIC, I.CDETAPAPROD, P_CDPRODINSUMO, O.QTAPRODPREOP)) AS QTDEINSUMO
                       FROM ORDPRODUCAO O, INSUMETAPA I, PRODACABADO P
                      WHERE O.CDFILIAL     = P_CDFILIAL
                        AND O.NRORDPROD    = P_NRORDPROD
                        AND O.NRSUBORDPROD = P_NRSUBORDPROD
                        AND O.CDFILIAL     = I.CDFILIAL
                        AND O.CDPRODUTO    = I.CDPRODUTO
                        AND O.CDPROCFABRIC = I.CDPROCFABRIC
                        AND I.CDPRODINSUMO = P_CDPRODINSUMO
                        AND O.NRORDPROD    = P.NRORDPROD(+)
                        AND O.NRSUBORDPROD = P.NRSUBORDPROD(+)
                        AND O.CDFILIAL     = P.CDFILIAL(+)
                        AND O.CDPRODUTO    = P.CDPRODUTO(+)
                        AND P_IDSITPESAGEM <> 'CONCLUIDA')
               UNION ALL
              SELECT SUM(QTDEINSUMO) AS QTDEINSUMO
                FROM(SELECT DISTINCT P.CDFILIAL, P.NRORDPROD, P.NRSUBORDPROD, P.CDPRODUTO, (QTPREVI_MATPRIMA(P.CDFILIAL, P.CDPRODUTO, A.CDPROCFABRIC, I.CDETAPAPROD, P_CDPRODINSUMO, P.QTPRACABADO)) AS QTDEINSUMO
                       FROM PRODACABADO P, PROCFABRICA A, ETAFABRIC E, INSUMETAPA I
                      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 E.CDFILIAL     = A.CDFILIAL
                        AND E.CDPRODUTO    = A.CDPRODUTO
                        AND E.CDPROCFABRIC = A.CDPROCFABRIC
                        AND I.CDFILIAL     = E.CDFILIAL
                        AND I.CDPRODUTO    = E.CDPRODUTO
                        AND I.CDPROCFABRIC = E.CDPROCFABRIC
                        AND I.CDETAPAPROD  = E.CDETAPAPROD
                        AND I.CDPRODINSUMO = P_CDPRODINSUMO
                        AND P_IDSITPESAGEM <> 'CONCLUIDA')

               UNION ALL

              /*CLIENTES QUE UTILIZA BALANCA NO FECHAMENTO DA OP*/
              SELECT SUM(QTDEINSUMO) AS QTDEINSUMO
                FROM(SELECT DISTINCT O.CDFILIAL, O. NRORDPROD, O.NRSUBORDPROD, O.CDPRODUTO, (QTPREVI_MATPRIMA(O.CDFILIAL, O.CDPRODUTO, O.CDPROCFABRIC, I.CDETAPAPROD, P_CDPRODINSUMO, P.QTLIQACUM)) AS QTDEINSUMO
                       FROM ORDPRODUCAO O, INSUMETAPA I, PRODACABADO P
                      WHERE O.CDFILIAL     = P_CDFILIAL
                        AND O.NRORDPROD = P_NRORDPROD
                        AND O.NRSUBORDPROD   = P_NRSUBORDPROD
                        AND O.CDFILIAL     = I.CDFILIAL
                        AND O.CDPRODUTO    = I.CDPRODUTO
                        AND O.CDPROCFABRIC = I.CDPROCFABRIC
                        AND I.CDPRODINSUMO = P_CDPRODINSUMO
                        AND O.NRORDPROD = P.NRORDPROD(+)
                        AND O.NRSUBORDPROD   = P.NRSUBORDPROD(+)
                        AND O.CDFILIAL     = P.CDFILIAL(+)
                        AND O.CDPRODUTO    = P.CDPRODUTO(+)
                        AND P_IDSITPESAGEM = 'CONCLUIDA'
                        AND NVL(P.QTLIQACUM,0) <> 0)
               UNION ALL
              SELECT SUM(QTDEINSUMO) AS QTDEINSUMO
                FROM(SELECT DISTINCT P.CDFILIAL, P.NRORDPROD, P.NRSUBORDPROD, P.CDPRODUTO, (QTPREVI_MATPRIMA(P.CDFILIAL, P.CDPRODUTO, A.CDPROCFABRIC, I.CDETAPAPROD, P_CDPRODINSUMO, P.QTLIQACUM)) AS QTDEINSUMO
                       FROM PRODACABADO P, PROCFABRICA A, ETAFABRIC E, INSUMETAPA I
                      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 E.CDFILIAL     = A.CDFILIAL
                        AND E.CDPRODUTO    = A.CDPRODUTO
                        AND E.CDPROCFABRIC = A.CDPROCFABRIC
                        AND I.CDFILIAL     = E.CDFILIAL
                        AND I.CDPRODUTO    = E.CDPRODUTO
                        AND I.CDPROCFABRIC = E.CDPROCFABRIC
                        AND I.CDETAPAPROD  = E.CDETAPAPROD
                        AND I.CDPRODINSUMO = P_CDPRODINSUMO
                        AND P_IDSITPESAGEM = 'CONCLUIDA'
                        AND NVL(P.QTLIQACUM,0) <> 0));

   END IF;
   

   /*VERIFICA O TOTAL EFETIVAMENTE RETIRADO PARA A OP*/
   SELECT NVL(R.QTRETIRADA,0) - NVL(D.QTDEVOLVIDA,0)
     INTO V_SUMQTREALINSUMO 
     FROM  ( SELECT SUM(QTRETLIQPROD) QTRETIRADA   
               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    = P_CDPRODINSUMO
                AND LT.CDFILIAL     = P_CDFILIAL
                AND LT.IDTPRETEST   = 'R'
            )R,
           ( SELECT SUM(QTRETLIQPROD) QTDEVOLVIDA
               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    = P_CDPRODINSUMO
                AND LT.CDFILIAL     = P_CDFILIAL
                AND LT.IDTPRETEST   = 'D'
            )D; 
   --RAISE_APPLICATION_ERROR(-20405, 'P_QTPREVINSUMO >> '||P_QTPREVINSUMO||'***V_SUMQTREALINSUMO >> '||V_SUMQTREALINSUMO||'***V_SUMQTPREVINSUMO >> '||V_SUMQTPREVINSUMO, TRUE);

   /*CALCULO DA PROPORCAO SOBRE A PREVISAO DO QUE ESTAVA PREVISTO PARA SER PRODUZIDO*/
   V_QTREALINSUMO := (P_QTPREVINSUMO * V_SUMQTREALINSUMO)/V_SUMQTPREVINSUMO;
 
   RETURN(V_QTREALINSUMO); 
END;
/