CREATE OR REPLACE FUNCTION CUSTO_SUBGRU_COC(
    P_CDFILIAL         IN VARCHAR2,
    P_CDCIA            IN VARCHAR2,
    P_CDMANCIA         IN VARCHAR2,
    P_NRSERVICOCIAFILI IN NUMBER,
    P_CDCLASSE         IN VARCHAR2,
    P_CDSUBGRU         IN VARCHAR2,
    P_NRSEQSUBGRUSEMAM IN NUMBER,
    P_CDCICLO          IN VARCHAR2,
    P_NRORG            IN NUMBER,
    P_DATACUSTO        IN VARCHAR2,
    P_TIPOCUSTO        IN VARCHAR2,
    P_INFLACAO         IN FLOAT DEFAULT 0)
  RETURN FLOAT
AS
  V_SOMAPROD FLOAT;
  V_CUSTO_PRODUTO FLOAT;
  V_SOMAREC  FLOAT;
  V_CUSTO_RECEITA FLOAT;
  V_CUSTOBASE FLOAT;
  V_CUSTONETO FLOAT;
  V_APROVEITAMENTO FLOAT;
BEGIN
  V_SOMAPROD := 0;
  V_SOMAREC := 0;
  FOR CUR_PROD IN (
    SELECT CUSTO_PRODUTO_COC(PSM.CDFILIAL, PSM.CDPRODUTO, P_DATACUSTO, P_TIPOCUSTO) AS CUSTO,
     NVL(PSM.QTPRODSUMA,0) AS QTPRODSUMA,
     NVL(PRO.VRPEFATOCORR,0) AS VRPEFATOCORR
      FROM PRODSUBSEMAM PSM
      INNER JOIN PRODUTO PRO
      ON PRO.CDPRODUTO         = PSM.CDPRODUTO
      AND PRO.NRORG            = PSM.NRORG
      WHERE PSM.CDFILIAL       = P_CDFILIAL
      AND PSM.CDCIA            = P_CDCIA
      AND PSM.CDMANCIA         = P_CDMANCIA
      AND PSM.NRSERVICOCIAFILI = P_NRSERVICOCIAFILI
      AND PSM.CDCLASSE         = P_CDCLASSE
    AND PSM.CDSUBGRU         = P_CDSUBGRU
    AND PSM.NRSEQSUBGRUSEMAM = P_NRSEQSUBGRUSEMAM
    AND PSM.CDCICLO          = P_CDCICLO
    AND PSM.NRORG            = P_NRORG
  ) LOOP
      V_APROVEITAMENTO := (100 - NVL(CUR_PROD.VRPEFATOCORR, 0))/100;
      IF V_APROVEITAMENTO = 0 OR CUR_PROD.CUSTO = 0 THEN
        V_CUSTO_PRODUTO := 0;
      ELSE
        --CALCULA CUSTOBASE
        IF ROUND(CUR_PROD.CUSTO, 2) = 0 THEN
          V_CUSTOBASE := 0.01;
        ELSE
          V_CUSTOBASE := ROUND(CUR_PROD.CUSTO, 2);
        END IF;

        V_CUSTOBASE := ROUND(V_CUSTOBASE + (V_CUSTOBASE * P_INFLACAO/100), 2);
        --CALCULA CUSTONETO
        V_CUSTONETO := V_CUSTOBASE / V_APROVEITAMENTO;
        IF ROUND(V_CUSTONETO, 2) = 0 THEN
          V_CUSTONETO := 0.01;
        ELSE
          V_CUSTONETO := ROUND(V_CUSTONETO, 2);
        END IF;
        --CALCULA CUSTO FINAL
        V_CUSTO_PRODUTO := V_CUSTONETO * NVL(CUR_PROD.QTPRODSUMA, 0);
        IF ROUND(V_CUSTO_PRODUTO, 2) = 0 THEN
          V_CUSTO_PRODUTO := 0.01;
        ELSE
          V_CUSTO_PRODUTO := ROUND(V_CUSTO_PRODUTO, 2);
        END IF;
      END IF;
     V_SOMAPROD := V_SOMAPROD + V_CUSTO_PRODUTO;
  END LOOP;

  FOR CUR_REC IN
  (
    SELECT CUSTO_RECEITAM_COC(RSM.CDFILIAL, REC.CDRECEITA, (SELECT NRVARIACAOREC
            FROM FILIRECEITA
            WHERE CDRECEITA = RSM.CDRECEITA AND CDFILIAL    = RSM.CDFILIAL
          ), P_DATACUSTO, P_TIPOCUSTO) AS CUSTO,
      RSM.QTRECSUMA
    FROM RECSUBSEMAM RSM
    INNER JOIN RECEITAM REC ON REC.CDRECEITA         = RSM.CDRECEITA AND REC.NRORG            = RSM.NRORG
    WHERE RSM.CDFILIAL       = P_CDFILIAL
      AND RSM.CDCIA            = P_CDCIA
      AND RSM.CDMANCIA         = P_CDMANCIA
      AND RSM.NRSERVICOCIAFILI = P_NRSERVICOCIAFILI
      AND RSM.CDCLASSE         = P_CDCLASSE
      AND RSM.CDSUBGRU         = P_CDSUBGRU
      AND RSM.NRSEQSUBGRUSEMAM = P_NRSEQSUBGRUSEMAM
      AND RSM.CDCICLO          = P_CDCICLO
      AND RSM.NRORG            = P_NRORG
  ) LOOP
     V_CUSTO_RECEITA := NVL(CUR_REC.CUSTO, 0) *
                        NVL(CUR_REC.QTRECSUMA,0);
    IF V_CUSTO_RECEITA > 0 THEN
       IF ROUND(V_CUSTO_RECEITA, 2) = 0 THEN
          V_CUSTO_RECEITA := 0.01;
       ELSE
          V_CUSTO_RECEITA := ROUND(V_CUSTO_RECEITA, 2);
       END IF;
    END IF;
    
    V_CUSTO_RECEITA := ROUND(V_CUSTO_RECEITA + (V_CUSTO_RECEITA * P_INFLACAO/100), 2);

    V_SOMAREC := V_SOMAREC + V_CUSTO_RECEITA;
  END LOOP;
  RETURN (V_SOMAPROD + V_SOMAREC);
END;
/