/*Retorna se algum item de sua composicao (recursivamente) nao possui custo para a data*/
CREATE OR REPLACE FUNCTION EXISTE_CUSTO_ZERO_COMP_REC 
(
P_CDRECEITA IN VARCHAR2,
P_NRVARIACAOREC IN NUMBER,
P_CDFILIAL IN VARCHAR2,
P_CDCIA IN VARCHAR2,
P_DTCUSTO IN DATE,
P_IDTIPOCUSTO IN VARCHAR2,
P_NRORG IN NUMBER
) RETURN VARCHAR2
AS
	V_NUM_REC NUMBER;
	V_NUM_PROD NUMBER;
	V_VRCUSTOPROD FLOAT;
	V_VRCUSTOREC FLOAT;
	V_COMP_CUSTO_ZERO VARCHAR2(1);
BEGIN
	V_NUM_REC := 0;
	V_NUM_PROD := 0;

	FOR CUR_PROD IN
	(SELECT P.CDPRODUTO
	   FROM PRORECEITAM P
	        INNER JOIN RECEITAM RECPAI ON RECPAI.CDRECEITA = P.CDRECEITA AND
	                                      ((RECPAI.IDRECFLEXIVEL <> 'P') OR (P.IDPREFERENCIA = 'S') )
	  WHERE P.CDRECEITA = P_CDRECEITA
	    AND P.NRVARIACAOREC = P_NRVARIACAOREC) LOOP
		
		V_NUM_PROD := V_NUM_PROD + 1;

		V_VRCUSTOPROD := CUSTO_PRODUTO_COC(P_CDFILIAL,CUR_PROD.CDPRODUTO,P_DTCUSTO,P_IDTIPOCUSTO,P_CDCIA);
		IF V_VRCUSTOPROD = 0.00 THEN
			RETURN 'S';
		END IF;

	END LOOP;

	FOR CUR_SUBREC IN
	(SELECT S.CDSUBRECEITA AS CDRECEITA, F.NRVARIACAOREC
	   FROM SUBRECEITAM S
	        INNER JOIN RECEITAM RECPAI ON RECPAI.CDRECEITA = S.CDRECEITA AND
	                                      ((RECPAI.IDRECFLEXIVEL <> 'P') OR (S.IDPREFERENCIA = 'S') )
	   		LEFT JOIN FILIRECEITA F ON F.CDRECEITA = S.CDSUBRECEITA AND
	   		                           F.CDFILIAL = P_CDFILIAL
	  WHERE S.CDRECEITA = P_CDRECEITA
	    AND S.NRVARIACAOREC = P_NRVARIACAOREC
	) LOOP
		
		V_NUM_REC := V_NUM_REC + 1;

		V_VRCUSTOREC := CUSTO_RECEITAM_COC(P_CDFILIAL, CUR_SUBREC.CDRECEITA, CUR_SUBREC.NRVARIACAOREC, P_DTCUSTO, P_IDTIPOCUSTO,P_CDCIA);
		IF V_VRCUSTOREC = 0.00 THEN
			RETURN 'S';
		ELSE
			V_COMP_CUSTO_ZERO := EXISTE_CUSTO_ZERO_COMP_REC(CUR_SUBREC.CDRECEITA, CUR_SUBREC.NRVARIACAOREC, P_CDFILIAL, P_CDCIA, P_DTCUSTO, P_IDTIPOCUSTO, P_NRORG);
			IF V_COMP_CUSTO_ZERO = 'S' THEN
				RETURN 'S';
			END IF;
		END IF;

	END LOOP;
	IF V_NUM_REC = 0 AND V_NUM_PROD = 0 THEN
		RETURN 'S';
	END IF;
	RETURN 'N';
END;
/

CREATE OR REPLACE FUNCTION EXISTE_CUSTO_ZERO_REC
(
P_CDRECEITA IN VARCHAR2,
P_CDFILIAL IN VARCHAR2,
P_CDCIA IN VARCHAR2,
P_DTCUSTO IN DATE,
P_IDTIPOCUSTO IN VARCHAR2,
P_NRORG IN NUMBER
) RETURN VARCHAR2
AS
   V_VRCUSTOREC FLOAT;
   V_NRVARIACAOREC NUMBER;
BEGIN
	SELECT MAX(NRVARIACAOREC)
	  INTO V_NRVARIACAOREC
	  FROM FILIRECEITA
	 WHERE CDRECEITA = P_CDRECEITA
	   AND CDFILIAL = P_CDFILIAL;

	V_VRCUSTOREC := CUSTO_RECEITAM_COC(P_CDFILIAL,P_CDRECEITA, V_NRVARIACAOREC, P_DTCUSTO, P_IDTIPOCUSTO,P_CDCIA);
	IF V_VRCUSTOREC = 0.00 THEN
		RETURN 'S';
	ELSE
		RETURN EXISTE_CUSTO_ZERO_COMP_REC(P_CDRECEITA, V_NRVARIACAOREC, P_CDFILIAL, P_CDCIA, P_DTCUSTO, P_IDTIPOCUSTO, P_NRORG);
	END IF;
END;
/