CREATE OR REPLACE FUNCTION CUSTO_RECEITA_COC(
P_CDFILIAL IN VARCHAR2,
P_CDRECEITA IN VARCHAR2,
P_DATACUSTO IN DATE,
P_TIPOCUSTO IN NUMBER
) RETURN FLOAT
IS
V_CUSTOTOTAL FLOAT;
V_QTREND FLOAT;
BEGIN
   /*Custo total da receita*/
   SELECT SUM(ROUND(CASE WHEN P.IDPRODCOMISS IS NULL THEN
                         CUSTO_PRODUTO_COC(P_CDFILIAL, P.CDPRODUTO, P_DATACUSTO, P_TIPOCUSTO)
                         ELSE 
                         CUSTO_RECEITA_COC(P_CDFILIAL, P.CDPRODUTO, P_DATACUSTO, P_TIPOCUSTO)
                    END * 
                    ROUND(NVL(C.QTINSUMO, 0)/(1 - NVL(CASE WHEN P.IDPRODCOMISS IS NULL THEN 
                                              P.VRPEFATOCORR
                                              ELSE 0
                                         END, 0)/100), 3)
              , 3))
          INTO V_CUSTOTOTAL          
     FROM PRODUTO R          
          INNER JOIN (SELECT CDPRODUTO, MAX(CDESPEPROD) AS CDESPEPROD
                        FROM ESPEPROD
                       WHERE (CDMANCIA IS NULL OR IDTPMANUAL IS NULL)
                       GROUP BY CDPRODUTO) E ON E.CDPRODUTO = R.CDPRODUTO
          INNER JOIN (SELECT CDPRODUTO, CDESPEPROD, MAX(CDTIPOCOMP) CDTIPOCOMP
                        FROM TCOMPPRO
                       GROUP BY CDPRODUTO, CDESPEPROD) T ON T.CDPRODUTO = E.CDPRODUTO AND
                                                            T.CDESPEPROD = E.CDESPEPROD
          INNER JOIN COMPPROD C ON C.CDPRODUTO = E.CDPRODUTO AND
                                   C.CDESPEPROD = E.CDESPEPROD AND
                                   C.CDTIPOCOMP = T.CDTIPOCOMP
          INNER JOIN PRODUTO P ON P.CDPRODUTO = C.CDPRODINSUMO
    WHERE R.CDPRODUTO = P_CDRECEITA;
   
   /*Rendimento*/
   SELECT MAX(QTREND)
     INTO V_QTREND
     FROM
   (SELECT NVL(QTRENDRECLOC, 0) AS QTREND
      FROM RENDLOCAL
      WHERE CDRECEITA = P_CDRECEITA
   UNION
   SELECT NVL(QTRENDRECPAD, 0) AS QTREND
     FROM RENDPADRAO
    WHERE CDRECEITA = P_CDRECEITA);

   IF V_QTREND > 0 THEN   
      RETURN ROUND(V_CUSTOTOTAL/V_QTREND, 3);
   END IF;
   
   RETURN 0.00;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('CUSTO_RECEITA_COC','5.85.xxx'); END;
/