create or replace FUNCTION CUST_COMP_PROD (  P_CDPRODUTO    IN PRODUTO.CDPRODUTO%TYPE,
P_CDFILIAL     IN FILIAL.CDFILIAL%TYPE,
P_TIPOCUSTO    IN NUMBER,
P_QTDE         IN FLOAT,
P_CDLOJA       IN VARCHAR2,
P_COMP         IN BOOLEAN DEFAULT TRUE,
P_DTREFERENCIA IN DATE DEFAULT SYSDATE
)RETURN FLOAT
AS
V_CUSTO          FLOAT;
V_CDFILIAL       VARCHAR2(4);
V_CDALMOXARIFE   VARCHAR2(6);
V_CDLOCALESTOQ   VARCHAR2(6);
V_INCTREG        INTEGER;
V_CDPRODUTORF    ROTFABRICA.CDPRODUTO%TYPE;
V_CDSUBPRODUTORF ROTFABRICA.CDSUBPRODUTO%TYPE;
V_QTSUBPRODROTRF ROTFABRICA.QTSUBPRODROT%TYPE;
V_CDFILIALRL     ROTFABLOCAL.CDFILIAL%TYPE;
V_CDPRODUTORL    ROTFABLOCAL.CDPRODUTO%TYPE;
V_CDSUBPRODUTORL ROTFABLOCAL.CDSUBPRODLOC%TYPE;
V_QTSUBPRODROTRL ROTFABLOCAL.QTSUBPRODLOC%TYPE;
CURSOR C_ROTFABRICA IS
SELECT
CDPRODUTO, CDSUBPRODUTO, QTSUBPRODROT
FROM
ROTFABRICA
WHERE
(CDPRODUTO = P_CDPRODUTO);
CURSOR C_ROTFABLOCAL IS
SELECT
RL.CDFILIAL, RL.CDPRODUTO, RL.CDSUBPRODLOC AS CDSUBPRODUTO,
RL.QTSUBPRODLOC AS QTSUBPRODROT
FROM
ROTFABLOCAL RL
WHERE
(RL.CDFILIAL     = P_CDFILIAL)  AND
(RL.CDPRODUTO    = P_CDPRODUTO);
BEGIN
V_CDFILIAL := P_CDFILIAL;
V_CUSTO := 0;
IF P_COMP THEN
SELECT COUNT(*)
INTO V_INCTREG
FROM
ROTFABLOCAL
WHERE(CDFILIAL  = V_CDFILIAL )AND
(CDPRODUTO = P_CDPRODUTO);
IF V_INCTREG = 0 THEN
V_CDFILIAL := 'P';
END IF;
IF V_CDFILIAL <> 'P' THEN
V_CDFILIAL :=  COMP_LOCAL( P_CDFILIAL,  P_CDPRODUTO);
END IF;
END IF;
IF( V_CDFILIAL = 'P')OR(V_CDFILIAL = 'N') THEN
SELECT COUNT(*)
INTO  V_INCTREG
FROM
ROTFABRICA
WHERE
(CDPRODUTO = P_CDPRODUTO);
OPEN C_ROTFABRICA;
ELSE
SELECT COUNT(*)
INTO V_INCTREG
FROM
ROTFABLOCAL RL
WHERE
(RL.CDFILIAL     = P_CDFILIAL)  AND
(RL.CDPRODUTO    = P_CDPRODUTO);
OPEN C_ROTFABLOCAL;
END IF;
LOOP
IF( V_CDFILIAL = 'P')OR(V_CDFILIAL = 'N') THEN
FETCH C_ROTFABRICA INTO V_CDPRODUTORF, V_CDSUBPRODUTORF, V_QTSUBPRODROTRF;
EXIT WHEN C_ROTFABRICA%NOTFOUND;
ELSE
FETCH C_ROTFABLOCAL INTO V_CDFILIALRL, V_CDPRODUTORL, V_CDSUBPRODUTORL, V_QTSUBPRODROTRL;
EXIT WHEN C_ROTFABLOCAL%NOTFOUND;
END IF;
END LOOP;
IF V_INCTREG > 0 THEN
FOR C_PRODUTO IN( SELECT
CDPRODUTO, CDSUBPRODUTO, QTSUBPRODROT
FROM
ROTFABRICA
WHERE
(CDPRODUTO = P_CDPRODUTO)) LOOP
IF V_CDFILIAL = 'P' THEN
SELECT COUNT(*) INTO V_INCTREG
FROM
ROTFABRICA
WHERE
(CDPRODUTO = C_PRODUTO.CDPRODUTO);
IF V_INCTREG >0 THEN
V_CUSTO := V_CUSTO + ROUND( CUST_COMP_PROD( C_PRODUTO.CDPRODUTO,  P_CDFILIAL, P_TIPOCUSTO,
C_PRODUTO.QTSUBPRODROT, P_CDLOJA, P_COMP),4);
RETURN (V_CUSTO);
ELSE
V_CUSTO := V_CUSTO + ROUND((CUSTO_PROD_COMP( P_CDFILIAL, C_PRODUTO.CDSUBPRODUTO,
P_TIPOCUSTO, P_CDLOJA, P_DTREFERENCIA))* C_PRODUTO.QTSUBPRODROT * P_QTDE, 4);
RETURN (V_CUSTO);
END IF;
ELSE
SELECT COUNT(*)
INTO V_INCTREG
FROM
ROTFABLOCAL
WHERE
(CDFILIAL  = P_CDFILIAL ) AND
(CDPRODUTO = P_CDPRODUTO);
IF V_INCTREG = 0 THEN
V_CUSTO := V_CUSTO + ROUND(CUST_COMP_PROD( C_PRODUTO.CDSUBPRODUTO, P_CDFILIAL, P_TIPOCUSTO, C_PRODUTO.QTSUBPRODROT *
P_QTDE, P_CDLOJA, P_COMP, SYSDATE),4);
RETURN (V_CUSTO);
ELSE
V_CUSTO := V_CUSTO + ROUND((CUSTO_PROD_COMP( P_CDFILIAL, C_PRODUTO.CDSUBPRODUTO, P_TIPOCUSTO, P_CDLOJA, P_DTREFERENCIA) *
C_PRODUTO.QTSUBPRODROT * P_QTDE),4);
RETURN (V_CUSTO);
END IF;
END IF;
END LOOP;
ELSE
V_CUSTO := ROUND((CUSTO_PROD_COMP( P_CDFILIAL, P_CDPRODUTO, P_TIPOCUSTO, P_CDLOJA, P_DTREFERENCIA) * P_QTDE),4);
RETURN (V_CUSTO);
END IF;
RETURN (V_CUSTO);
END;