CREATE OR REPLACE FUNCTION CUSTO_PRODUTO_COC(
P_CDFILIAL IN VARCHAR2,
P_CDPRODUTO IN VARCHAR2,
P_DATACUSTO IN DATE,
P_TIPOCUSTO IN NUMBER,
P_CDCIA IN VARCHAR2 DEFAULT NULL 
) RETURN FLOAT
IS
V_VRCOMLIQ FLOAT;
V_VRCOMBRU FLOAT;
V_VRMEDLIQ FLOAT;
V_VRMEDBRU FLOAT;

V_VRCOMLIQCIA FLOAT;
V_VRCOMBRUCIA FLOAT;
V_VRMEDLIQCIA FLOAT;
V_VRMEDBRUCIA FLOAT;
V_CONTADOR NUMBER;

BEGIN
   IF P_CDCIA IS NOT NULL THEN
      /* Verifica se o produto e fornecido pela companhia, se sim zera o custo do produto */
      SELECT MAX(1)
        INTO V_CONTADOR
        FROM PRODUTOCIA
       WHERE CDFILIAL = P_CDFILIAL
         AND CDCIA = P_CDCIA
         AND CDPRODUTO = P_CDPRODUTO;

      IF V_CONTADOR IS NOT NULL THEN
         RETURN 0.000;
      END IF;
   END IF;
   SELECT NVL(MAX(VRULTCLIQAP),0) AS VRCOMLIQ,
          NVL(MAX(VRULTCBRUAP),0) AS VRCOMBRU,
          NVL(MAX(VRMEDLIQAP ),0) AS VRMEDLIQ,
          NVL(MAX(VRMEDBRUAP ),0) AS VRMEDBRU          
     INTO V_VRCOMLIQCIA,V_VRCOMBRUCIA,V_VRMEDLIQCIA,V_VRMEDBRUCIA
         FROM PRODUTOAPCIA
         WHERE (CDFILIAL   = P_CDFILIAL)  AND
               (CDPRODUTO  = P_CDPRODUTO) AND
               (CDCIA = P_CDCIA) AND
               (DTCUSTOAP  = P_DATACUSTO);  
   V_VRCOMLIQCIA := NVL(V_VRCOMLIQCIA, 0.00);
   V_VRCOMBRUCIA := NVL(V_VRCOMBRUCIA, 0.00);
   V_VRMEDLIQCIA := NVL(V_VRMEDLIQCIA, 0.00);
   V_VRMEDBRUCIA := NVL(V_VRMEDBRUCIA, 0.00);
   SELECT NVL(MAX(VRULTCLIQAP),0) AS VRCOMLIQ,
          NVL(MAX(VRULTCBRUAP),0) AS VRCOMBRU,
          NVL(MAX(VRMEDLIQAP ),0) AS VRMEDLIQ,
          NVL(MAX(VRMEDBRUAP ),0) AS VRMEDBRU          
     INTO V_VRCOMLIQ,V_VRCOMBRU,V_VRMEDLIQ,V_VRMEDBRU
         FROM PRODUTOAP
         WHERE (CDFILIAL   = P_CDFILIAL)  AND
               (CDPRODUTO  = P_CDPRODUTO) AND
               (DTCUSTOAP  = P_DATACUSTO);
   V_VRCOMLIQ := NVL(V_VRCOMLIQ, 0.00);
   V_VRCOMBRU := NVL(V_VRCOMBRU, 0.00);
   V_VRMEDLIQ := NVL(V_VRMEDLIQ, 0.00);
   V_VRMEDBRU := NVL(V_VRMEDBRU, 0.00);
   IF P_TIPOCUSTO = 0 THEN
      RETURN ROUND(CASE WHEN NVL(V_VRMEDBRUCIA, 0.00) = 0.00 THEN V_VRMEDBRU ELSE V_VRMEDBRUCIA END, 2);
   ELSIF P_TIPOCUSTO = 1 THEN
      RETURN ROUND(CASE WHEN NVL(V_VRMEDLIQCIA, 0.00) = 0.00 THEN V_VRMEDLIQ ELSE V_VRMEDLIQCIA END, 2);
   ELSIF P_TIPOCUSTO = 2 THEN
      RETURN ROUND(CASE WHEN NVL(V_VRCOMBRUCIA, 0.00) = 0.00 THEN V_VRCOMBRU ELSE V_VRCOMBRUCIA END, 2);
   ELSIF P_TIPOCUSTO = 3 THEN
      RETURN ROUND(CASE WHEN NVL(V_VRCOMLIQCIA, 0.00) = 0.00 THEN V_VRCOMLIQ ELSE V_VRCOMLIQCIA END, 2);
   END IF;
   
   RETURN 0.0;
END;
/