CREATE OR REPLACE FUNCTION CUSTO_RECEITAM_COC(
P_CDFILIAL IN VARCHAR2,
P_CDRECEITA IN VARCHAR2,
P_NRVARIACAOREC IN NUMBER,
P_DATACUSTO IN DATE,
P_TIPOCUSTO IN NUMBER,
P_CDCIA IN VARCHAR2 DEFAULT NULL 
) RETURN FLOAT
IS
V_CUSTO_PROD FLOAT;
V_CUSTO_REC FLOAT;
V_CUSTOTOTAL_PRODUTOS FLOAT;
V_CUSTOTOTAL_SUBRECEITAS FLOAT;
V_QTREND FLOAT;
V_CUSTO FLOAT;
V_IDRECFLEXIVEL VARCHAR2(1);

BEGIN

   V_CUSTOTOTAL_PRODUTOS    := 0;
   V_CUSTOTOTAL_SUBRECEITAS := 0;

   SELECT MAX(IDRECFLEXIVEL)
     INTO V_IDRECFLEXIVEL
     FROM RECEITAM
    WHERE CDRECEITA = P_CDRECEITA;
   
   /*Custo total dos produtos da receita*/
   FOR CUR_PRODUTOS IN
   (SELECT CUSTO_PRODUTO_COC(P_CDFILIAL, PR.CDPRODUTO, P_DATACUSTO, P_TIPOCUSTO, P_CDCIA) AS CUSTO, 
           NVL(PR.QTPRODREC,0)/(1 - NVL(PO.VRPEFATOCORR,0)/100) AS QUANTIDADE          
     FROM PRORECEITAM PR, PRODUTO PO
    WHERE PR.CDRECEITA      = P_CDRECEITA
      AND PR.NRVARIACAOREC  = P_NRVARIACAOREC
      AND PR.CDPRODUTO      = PO.CDPRODUTO
      AND ((V_IDRECFLEXIVEL <> 'P') OR (PR.IDPREFERENCIA = 'S')) )  LOOP
      
      V_CUSTO_PROD := CUR_PRODUTOS.CUSTO * CUR_PRODUTOS.QUANTIDADE;
      
      IF (V_CUSTO_PROD > 0.00 AND ROUND(V_CUSTO_PROD,2) = 0.00 ) THEN
         V_CUSTO_PROD := 0.01;
      ELSE
         V_CUSTO_PROD := ROUND(V_CUSTO_PROD, 2);
      END IF;

      V_CUSTOTOTAL_PRODUTOS := V_CUSTOTOTAL_PRODUTOS + V_CUSTO_PROD;
   END LOOP;

   
   FOR CUR_RECEITAS IN
   (
    SELECT CUSTO_RECEITAM_COC(P_CDFILIAL, SR.CDSUBRECEITA, F.NRVARIACAOREC, P_DATACUSTO, P_TIPOCUSTO, P_CDCIA) AS CUSTO, 
           NVL(SR.QTRENDSUBREC,0) AS QUANTIDADE          
     FROM SUBRECEITAM SR
          INNER JOIN FILIRECEITA F ON F.CDRECEITA = SR.CDSUBRECEITA
    WHERE SR.CDRECEITA      = P_CDRECEITA
      AND SR.NRVARIACAOREC  = P_NRVARIACAOREC
      AND F.CDFILIAL = P_CDFILIAL
      AND ((V_IDRECFLEXIVEL <> 'P') OR (SR.IDPREFERENCIA = 'S'))
   ) LOOP
      V_CUSTO_REC := CUR_RECEITAS.CUSTO * CUR_RECEITAS.QUANTIDADE;
      
      IF (V_CUSTO_REC > 0.00 AND ROUND(V_CUSTO_REC,2) = 0.00 ) THEN
         V_CUSTO_REC := 0.01;
      ELSE
         V_CUSTO_REC := ROUND(V_CUSTO_REC, 2);
      END IF;

      V_CUSTOTOTAL_SUBRECEITAS := V_CUSTOTOTAL_SUBRECEITAS + V_CUSTO_REC;
   END LOOP;

   /*Rendimento*/
   SELECT MAX(QTRENDIMENTOREC)
     INTO V_QTREND
     FROM VARIACAOREC
    WHERE CDRECEITA     = P_CDRECEITA
      AND NRVARIACAOREC = P_NRVARIACAOREC;

   IF V_QTREND > 0 THEN
      V_CUSTO := (NVL(V_CUSTOTOTAL_PRODUTOS,0)+NVL(V_CUSTOTOTAL_SUBRECEITAS,0))/V_QTREND;
      V_CUSTO := CASE WHEN V_CUSTO > 0 AND ROUND(V_CUSTO, 2) = 0.00 THEN 0.01
                 ELSE ROUND(V_CUSTO, 2)
                 END;
      RETURN V_CUSTO;
   END IF;

   RETURN 0.00;
END;
/