CREATE OR REPLACE PROCEDURE GERA_COMPARATIVO_PLAN_REAL_INF
(
	P_CDFILIAL IN VARCHAR2,
	P_CIAS IN VARCHAR2,
	P_VOOS IN VARCHAR2,
	P_DTINICIAL IN DATE,
	P_DTFINAL IN DATE,
	P_DTCUSTO IN VARCHAR2,
	P_TIPOCUSTO IN NUMBER,
	P_NRORG IN NUMBER,
	P_CDOPERADOR IN VARCHAR2,
	P_NRCTRLCOMPARATIVOPLAREALINF OUT NUMBER
)
AS
	V_DTDECOLAGEM DATE;
	V_CDCIA VARCHAR2(4);
	V_NRVOO VARCHAR2(5);
	V_CDTRECHO VARCHAR2(4);
	V_CDCLASSE VARCHAR2(4);
	V_NRSERVICOCIAFILIPRECO NUMBER;
	V_CDCICLO VARCHAR2(4);
	V_DTINIVIGSE DATE;
	V_DTFIMVIGSE DATE;
	V_IDPROPORCAO VARCHAR2(1);
	V_QTPROPORCAO FLOAT;
	V_CDMANCIA VARCHAR2(4);
	V_NRSERVICOCIAFILI NUMBER;
	V_CDSUBGRU VARCHAR2(10);
	V_NRSEQSUBGRUSEMAM NUMBER;
	V_IDPROPSUBSEMAM VARCHAR2(1); 
	V_QTPROPSUBSEMAM FLOAT;
	V_DTINIVGSUMA DATE;
	V_DTFIMVGSUMA DATE;
	V_CDPRODUTO VARCHAR2(10);
	V_QTPRODUTO FLOAT;
	V_VRCUSTOUNIT FLOAT;

	V_NRTABPRECO VARCHAR2(3);
	V_NUM_TABPRECO_ATIVAS NUMBER;
	V_NRSEQPRECO NUMBER; 
	V_NUM_PRECOS_ITEMFAT NUMBER;
	V_CDEQUIP VARCHAR2(4);
	V_QTPAXREF NUMBER;
	V_QTSUBGRUPO FLOAT;	
	V_NRCTRLCOMPARATIVOPLAREALINF NUMBER;

	PROCEDURE INSERE_COMPARATIVO(P_IDREGISTRO IN VARCHAR2, P_CDRECEITA IN VARCHAR2 DEFAULT NULL, P_NRNIVEL IN NUMBER DEFAULT NULL, P_VRFATOR IN FLOAT DEFAULT NULL)
	AS
		V_NRCOMPARATIVOPLAREALINF NUMBER;
	BEGIN
		V_NRCOMPARATIVOPLAREALINF := TO_NUMBER(RETORNA_NOVO_CODIGO('COMPARATIVOPLAREALINF', 1));
		V_VRCUSTOUNIT := CUSTO_PRODUTO_COC(P_CDFILIAL,V_CDPRODUTO, P_DTCUSTO, P_TIPOCUSTO, V_CDCIA);	

		INSERT INTO COMPARATIVOPLAREALINF
		(NRCOMPARATIVOPLAREALINF, NRCTRLCOMPARATIVOPLAREALINF, CDFILIAL, 
		CDCIA, NRVOO, CDTRECHO, DTDECOLAGEM, CDCLASSE,
		IDREGISTRO, NRTABPRECO, NRSERVICOCIAFILIPRECO, 
		CDCICLO, NRSEQPRECO, DTINIVIGSE, 
		DTFIMVIGSE, IDPROPORCAO, QTPROPORCAO, 
		QTSERVICO, CDMANCIA, NRSERVICOCIAFILI, 
		CDSUBGRU, NRSEQSUBGRUSEMAM, IDPROPSUBSEMAM, 
		QTPROPSUBSEMAM, QTSUBGRUPO, CDPRODUTO, 
		QTPRODUTO, CDRECEITA, NRNIVEL, VRCUSTOUNIT, 
		NRORG, NRORGINCLUSAO, NRORGULTATU,
		CDOPERINCLUSAO, CDOPERULTATU, 
		DTINCLUSAO, DTULTATU, IDATIVO)
		VALUES
		(	V_NRCOMPARATIVOPLAREALINF, P_NRCTRLCOMPARATIVOPLAREALINF, P_CDFILIAL,
		 	V_CDCIA, V_NRVOO, V_CDTRECHO, V_DTDECOLAGEM, V_CDCLASSE,
			P_IDREGISTRO, V_NRTABPRECO, V_NRSERVICOCIAFILIPRECO, 
			V_CDCICLO, V_NRSEQPRECO, V_DTINIVIGSE, 
			V_DTFIMVIGSE, V_IDPROPORCAO, V_QTPROPORCAO, 
			1.0, V_CDMANCIA, V_NRSERVICOCIAFILI, 
			V_CDSUBGRU, V_NRSEQSUBGRUSEMAM, V_IDPROPSUBSEMAM, 
			V_QTPROPSUBSEMAM, V_QTSUBGRUPO, V_CDPRODUTO, 
			V_QTPRODUTO, P_CDRECEITA, P_NRNIVEL, V_VRCUSTOUNIT, 
			P_NRORG, P_NRORG, P_NRORG,
			P_CDOPERADOR, P_CDOPERADOR, 
			SYSDATE, SYSDATE, 'S');
	END;

	PROCEDURE PROCESSA_RECEITA(P_IDREGISTRO IN VARCHAR2, P_CDRECEITA IN VARCHAR2, P_QTRECEITA IN VARCHAR2, P_NRNIVEL NUMBER)
	AS
		V_NRVARIACAOREC NUMBER;
		V_QTRENDIMENTOREC FLOAT;
		V_NROPCOES FLOAT;
		V_VRFATOR FLOAT;
		V_NRSEQUTILRECFLEX NUMBER;
		V_IDRECFLEXIVEL VARCHAR2(1);
	BEGIN
		SELECT MAX(IDRECFLEXIVEL)
        INTO V_IDRECFLEXIVEL
    	  FROM RECEITAM
       WHERE CDRECEITA = P_CDRECEITA;

		SELECT MAX(V.NRVARIACAOREC), MAX(V.QTRENDIMENTOREC), MAX(V.NROPCOES)
        INTO V_NRVARIACAOREC, V_QTRENDIMENTOREC, V_NROPCOES
        FROM FILIRECEITA F
             INNER JOIN VARIACAOREC V ON V.CDRECEITA = F.CDRECEITA AND
                                      V.NRVARIACAOREC = F.NRVARIACAOREC
       WHERE F.CDRECEITA = P_CDRECEITA
         AND F.CDFILIAL = P_CDFILIAL;
      
      V_VRFATOR := CASE WHEN NVL(V_QTRENDIMENTOREC, 0.0) = 0 THEN 0 ELSE P_QTRECEITA/V_QTRENDIMENTOREC END;

      SELECT MAX(NRSEQUTILRECFLEX) 
           INTO V_NRSEQUTILRECFLEX
           FROM UTILRECFLEX
          WHERE CDFILIAL = P_CDFILIAL
            AND CDRECEITA = P_CDRECEITA
            AND V_DTDECOLAGEM BETWEEN DTINIVIGENCIA AND DTFIMVIGENCIA;

		FOR CUR_PROD IN
		(
		SELECT PR.CDPRODUTO, V_VRFATOR * NVL(PR.QTPRODREC,0) AS QTPRODUTO
		  FROM PRORECEITAM PR
		       INNER JOIN PRODUTO PT ON PT.CDPRODUTO = PR.CDPRODUTO
		 WHERE PR.CDRECEITA = P_CDRECEITA
			AND PR.NRVARIACAOREC = V_NRVARIACAOREC
			AND (V_IDRECFLEXIVEL = 'N' OR
				  (COMPOSICAO_EM_PRODUCAO(P_CDFILIAL, P_CDRECEITA, P_NRORG, V_NRSEQUTILRECFLEX, PR.CDPRODUTO, 'P') = 'S') OR
				  (V_NRSEQUTILRECFLEX IS NULL AND PR.IDPREFERENCIA = 'S')
				 )
		) LOOP
			V_CDPRODUTO := CUR_PROD.CDPRODUTO;
			V_QTPRODUTO := CUR_PROD.QTPRODUTO;
			INSERE_COMPARATIVO(P_IDREGISTRO, P_CDRECEITA, P_NRNIVEL, V_VRFATOR);
		END LOOP;

		/*Processa cada uma das subreceitas*/
		FOR CUR_SUB IN
		(
		SELECT SR.CDSUBRECEITA, V_VRFATOR * NVL(SR.QTRENDSUBREC,0) AS QUANTIDADE
		  FROM SUBRECEITAM SR
		 WHERE SR.CDRECEITA = P_CDRECEITA
			AND SR.NRVARIACAOREC = V_NRVARIACAOREC
			AND (V_IDRECFLEXIVEL = 'N' OR
				  (COMPOSICAO_EM_PRODUCAO(P_CDFILIAL, P_CDRECEITA, P_NRORG, V_NRSEQUTILRECFLEX, SR.CDSUBRECEITA, 'S') = 'S') OR
				  (V_NRSEQUTILRECFLEX IS NULL AND SR.IDPREFERENCIA = 'S')
				 )
		) LOOP
			PROCESSA_RECEITA(P_IDREGISTRO, CUR_SUB.CDSUBRECEITA, CUR_SUB.QUANTIDADE, 
								  P_NRNIVEL + 1);
		END LOOP;
	END;

BEGIN
	P_NRCTRLCOMPARATIVOPLAREALINF := TO_NUMBER(RETORNA_NOVO_CODIGO('CTRLCOMPARATIVOPLAREALINF', 1));
	FOR CUR_DATAS IN
	(
	SELECT DTDATA
	  FROM DATA
	 WHERE DTDATA BETWEEN P_DTINICIAL AND P_DTFINAL
	) LOOP
		V_DTDECOLAGEM := CUR_DATAS.DTDATA;
		FOR CUR_CIAS IN
		(
		SELECT DISTINCT C.SGCIA, CF.CDCIA
		  FROM CIAFILI CF
				 LEFT JOIN COMPANHIA C ON C.CDCIA = CF.CDCIA				 
		 WHERE CF.CDFILIAL = P_CDFILIAL
		   AND VALOR_NA_LISTA(CF.CDCIA, P_CIAS) > 0
		) LOOP
			V_CDCIA := CUR_CIAS.CDCIA;
			/*Verifica se a companhia possui tabela de precos na data (por causa dos vinculos com subgrupos)*/
			SELECT MAX(NRTABPRECO), COUNT(1)
			  INTO V_NRTABPRECO, V_NUM_TABPRECO_ATIVAS
			  FROM TABPRECOSEM
			 WHERE CDFILIAL = P_CDFILIAL
				AND CDCIA = CUR_CIAS.CDCIA
				AND CUR_DATAS.DTDATA BETWEEN DTINIVIGTAB AND DTFIMVIGTAB;

			IF V_NUM_TABPRECO_ATIVAS = 0 THEN
				CONTINUE;
			END IF;

			IF V_NUM_TABPRECO_ATIVAS > 1 THEN
				CONTINUE;
			END IF;

		   FOR CUR_VOOS IN
		   (
		   SELECT V.NRVOO, VT.CDTRECHO
		     FROM VOO V
		    INNER JOIN VOOTRECHO VT ON VT.CDFILIAL = V.CDFILIAL AND
		                               VT.CDCIA = V.CDCIA AND
		                               VT.NRVOO = V.NRVOO
		    WHERE V.CDFILIAL = P_CDFILIAL
		      AND V.CDCIA = CUR_CIAS.CDCIA
		      AND VOO_DECOLA_DATA(VT.CDFILIAL, VT.CDCIA, VT.NRVOO, VT.CDTRECHO, CUR_DATAS.DTDATA) = 'S'
		      AND VALOR_NA_LISTA(VT.CDCIA||'|'||VT.NRVOO||'|'||VT.CDTRECHO, P_VOOS) > 0
		   ) LOOP
		   	V_NRVOO := CUR_VOOS.NRVOO;
				V_CDTRECHO := CUR_VOOS.CDTRECHO;

		   	SELECT MAX(CDEQUIP)
		   	  INTO V_CDEQUIP
		   	  FROM VOOTRECHODATA
		   	 WHERE CDFILIAL = P_CDFILIAL
		   	   AND CDCIA = CUR_CIAS.CDCIA
		   	   AND NRVOO = CUR_VOOS.NRVOO
		   	   AND CDTRECHO = CUR_VOOS.CDTRECHO
		   	   AND CUR_DATAS.DTDATA BETWEEN DTINIVIGENCIA AND NVL(DTFIMVIGENCIA, CUR_DATAS.DTDATA);

		      /*PLANEJADO*/
		   	FOR CUR_CLASSES IN
			   (
			     SELECT CV.CDCLASSE, CL.SGCLASSE, (NVL(CV.QTPAXVOO, 0.0) + NVL(CV.QTPAXSBYVOO, 0.0)) AS QTPAX
			       FROM CONFIGVOO CV
			      INNER JOIN CLASSE CL
			      ON   CL.CDCLASSE = CV.CDCLASSE
			      AND  CL.NRORG    = CV.NRORG
			      WHERE CV.CDFILIAL = P_CDFILIAL
			        AND CV.CDCIA = CUR_CIAS.CDCIA
			        AND CV.NRVOO = CUR_VOOS.NRVOO
			        AND CV.CDTRECHO = CUR_VOOS.CDTRECHO			        

			      UNION ALL

			     SELECT C.CDCLASSE, CL.SGCLASSE, C.QTPAXEQUI AS QTPAX
			       FROM CONFIGEQUI C
			      INNER JOIN CLASSE CL
			      ON   CL.CDCLASSE = C.CDCLASSE
			      AND  CL.NRORG    = C.NRORG
			      WHERE C.CDFILIAL = P_CDFILIAL
			        AND C.CDCIA = CUR_CIAS.CDCIA
			        AND C.CDEQUIP = V_CDEQUIP 
			        AND NOT EXISTS (SELECT 1
			                          FROM CONFIGVOO
			                         WHERE CDFILIAL = P_CDFILIAL
			                           AND CDCIA = CUR_CIAS.CDCIA
			                           AND NRVOO = CUR_VOOS.NRVOO
			                           AND CDTRECHO = CUR_VOOS.CDTRECHO)
			   ) LOOP
					V_CDCLASSE := CUR_CLASSES.CDCLASSE;
					V_QTPAXREF := CUR_CLASSES.QTPAX;

					FOR CUR_ITENS_FAT IN
					( SELECT P.NRSERVICOCIAFILI, P.CDCICLO
						FROM PAD_VOOEQUIPAMENTO P
						     INNER JOIN SERVICOCIAFILI S ON P.CDFILIAL = S.CDFILIAL AND
						                                       P.CDCIA = S.CDCIA AND
						                                       S.NRSERVICOCIAFILI = P.NRSERVICOCIAFILI
							  INNER JOIN SERVICOGEN G ON G.NRSERVICOGEN = S.NRSERVICOGEN
					  WHERE P.CDFILIAL = P_CDFILIAL
						 AND P.DTDATA = CUR_DATAS.DTDATA
						 AND P.IDORIGEM = 'V'
						 AND P.CDCIA = CUR_CIAS.CDCIA
						 AND P.NRVOO = CUR_VOOS.NRVOO
						 AND P.CDTRECHO = CUR_VOOS.CDTRECHO
						 AND P.CDCLASSE = CUR_CLASSES.CDCLASSE
						 AND P.CDCICLO = F_RETORNA_CICLOM(P.CDFILIAL,  P.CDCIA,  P.NRVOO,  P.CDTRECHO, CUR_DATAS.DTDATA,
																	 P.NRSERVICOCIAFILI, P.CDCLASSE, P.CDCICLO)
						 AND G.IDSERVICO NOT IN ('2', '3', '5')
					) LOOP
						V_NRSERVICOCIAFILIPRECO := CUR_ITENS_FAT.NRSERVICOCIAFILI;
						V_CDCICLO := CUR_ITENS_FAT.CDCICLO;
						
						
						SELECT MAX(P.NRSEQPRECO), COUNT(1)
						  INTO V_NRSEQPRECO, V_NUM_PRECOS_ITEMFAT
						  FROM PRECOSECIAM P
						 WHERE P.CDFILIAL = P_CDFILIAL AND
								 P.CDCIA = CUR_CIAS.CDCIA AND
								 P.NRTABPRECO = V_NRTABPRECO AND
								 P.NRSERVICOCIAFILI = CUR_ITENS_FAT.NRSERVICOCIAFILI AND
								 P.CDCLASSE = CUR_CLASSES.CDCLASSE AND
								 P.CDCICLO = CUR_ITENS_FAT.CDCICLO AND
								 CUR_DATAS.DTDATA BETWEEN P.DTINIVIGSE AND P.DTFIMVIGSE;
						IF V_NUM_PRECOS_ITEMFAT > 1 THEN
							/*Mais de um item na tabela de precos*/
							CONTINUE;
						END IF;

						IF V_NUM_PRECOS_ITEMFAT = 0 THEN
							/*Mais de um item na tabela de precos*/
							CONTINUE;
						END IF;


						SELECT MAX(DTINIVIGSE), MAX(DTFIMVIGSE), MAX(IDPROPORCAO), MAX(QTPROPORCAO)	
						  INTO V_DTINIVIGSE, V_DTFIMVIGSE, V_IDPROPORCAO, V_QTPROPORCAO
						  FROM PRECOSECIAM P
						 WHERE P.CDFILIAL = P_CDFILIAL AND
								 P.CDCIA = CUR_CIAS.CDCIA AND
								 P.NRTABPRECO = V_NRTABPRECO AND
								 P.NRSERVICOCIAFILI = CUR_ITENS_FAT.NRSERVICOCIAFILI AND
								 P.CDCLASSE = CUR_CLASSES.CDCLASSE AND
								 P.CDCICLO = CUR_ITENS_FAT.CDCICLO AND
								 P.NRSEQPRECO = V_NRSEQPRECO;

						FOR CUR_SUBGRUPOS IN
						(
						SELECT S.CDMANCIA, S.NRSERVICOCIAFILI, S.CDSUBGRU, S.NRSEQSUBGRUSEMAM, SG.IDPROPSUBSEMAM, SG.QTPROPSUBSEMAM,
						       SG.DTINIVGSUMA, SG.DTFIMVGSUMA
						  FROM SUBGRUTABPRECOM S								 
								 INNER JOIN SUBGRUSEMAM SG ON SG.CDFILIAL = S.CDFILIAL AND
																		SG.CDCIA = S.CDCIA AND
																		SG.CDMANCIA = S.CDMANCIA AND
																		SG.NRSERVICOCIAFILI = S.NRSERVICOCIAFILI AND
																		SG.CDCLASSE = S.CDCLASSE AND
																		SG.CDSUBGRU = S.CDSUBGRU AND
																		SG.NRSEQSUBGRUSEMAM = S.NRSEQSUBGRUSEMAM
								 INNER JOIN MANUALCIAM M ON M.CDFILIAL = SG.CDFILIAL 
                                                AND M.CDCIA = SG.CDCIA 
                                                AND M.CDMANCIA = SG.CDMANCIA
						 WHERE S.CDFILIAL = P_CDFILIAL
							AND S.CDCIA = CUR_CIAS.CDCIA
							AND S.NRTABPRECO = V_NRTABPRECO
							AND S.NRSERVICOCIAFILIPRECO = CUR_ITENS_FAT.NRSERVICOCIAFILI
							AND S.CDCLASSE = CUR_CLASSES.CDCLASSE
							AND S.CDCICLO = CUR_ITENS_FAT.CDCICLO 
							AND S.NRSEQPRECO = V_NRSEQPRECO
							AND M.IDSITUAPROPCIA = 'A'
                     AND CUR_DATAS.DTDATA BETWEEN M.DTINIVGMA AND M.DTFIMVGMA
							AND CUR_DATAS.DTDATA BETWEEN SG.DTINIVGSUMA AND SG.DTFIMVGSUMA
						) LOOP

							V_CDMANCIA := CUR_SUBGRUPOS.CDMANCIA;
							V_NRSERVICOCIAFILI := CUR_SUBGRUPOS.NRSERVICOCIAFILI;
							V_CDSUBGRU := CUR_SUBGRUPOS.CDSUBGRU;
							V_NRSEQSUBGRUSEMAM := CUR_SUBGRUPOS.NRSEQSUBGRUSEMAM;
							V_IDPROPSUBSEMAM := CUR_SUBGRUPOS.IDPROPSUBSEMAM;
							V_QTPROPSUBSEMAM := CUR_SUBGRUPOS.QTPROPSUBSEMAM;
							V_DTINIVGSUMA := CUR_SUBGRUPOS.DTINIVGSUMA;
							V_DTFIMVGSUMA := CUR_SUBGRUPOS.DTFIMVGSUMA;

							IF CUR_SUBGRUPOS.IDPROPSUBSEMAM IS NULL THEN
								CONTINUE;
							END IF;

							IF NVL(CUR_SUBGRUPOS.QTPROPSUBSEMAM, 0) = 0 THEN
								IF CUR_SUBGRUPOS.IDPROPSUBSEMAM IN ('2', '4', '5') THEN
									CONTINUE;
								END IF;
							END IF;

							IF CUR_SUBGRUPOS.IDPROPSUBSEMAM = '1' THEN
								V_QTSUBGRUPO := V_QTPAXREF;
							END IF;
							IF CUR_SUBGRUPOS.IDPROPSUBSEMAM = '2' THEN
								IF CUR_SUBGRUPOS.QTPROPSUBSEMAM > 0 THEN                           
									V_QTSUBGRUPO := CEIL(V_QTPAXREF/CUR_SUBGRUPOS.QTPROPSUBSEMAM);
								END IF;
							END IF;
							IF CUR_SUBGRUPOS.IDPROPSUBSEMAM = '3' THEN
								SELECT MAX(QTSUBGRUPO)
								  INTO V_QTSUBGRUPO
								  FROM PROPSUBGRUSE
								  WHERE CDFILIAL  = P_CDFILIAL AND
										  CDCIA     = CUR_CIAS.CDCIA AND          
										  CDMANCIA = CUR_SUBGRUPOS.CDMANCIA AND
										  NRSERVICOCIAFILI = CUR_SUBGRUPOS.NRSERVICOCIAFILI AND
										  CDCLASSE  = CUR_CLASSES.CDCLASSE AND
										  CDSUBGRU  = CUR_SUBGRUPOS.CDSUBGRU AND
										  NRSEQSUBGRUSEMAM = CUR_SUBGRUPOS.NRSEQSUBGRUSEMAM AND
										  V_QTPAXREF BETWEEN QTPAXDE AND QTPAXATE;

								IF V_QTSUBGRUPO = 0 THEN 
								  CONTINUE;
								END IF;
								
								IF V_QTSUBGRUPO IS NULL THEN
									CONTINUE;
								END IF;
							END IF;

							IF CUR_SUBGRUPOS.IDPROPSUBSEMAM = '4' THEN
								V_QTSUBGRUPO := ((V_QTPAXREF * CUR_SUBGRUPOS.QTPROPSUBSEMAM)/100);
								IF (V_QTSUBGRUPO > 0) AND (V_QTSUBGRUPO < 1) THEN
									V_QTSUBGRUPO := 1;
								ELSE
									V_QTSUBGRUPO := ROUND(V_QTSUBGRUPO);
								END IF;
							END IF;
							
							IF CUR_SUBGRUPOS.IDPROPSUBSEMAM = '5' THEN                        
								V_QTSUBGRUPO := NVL(CUR_SUBGRUPOS.QTPROPSUBSEMAM, 0);
							END IF;

							FOR CUR_PRODUTOS IN
							(
								SELECT P.CDPRODUTO, V_QTSUBGRUPO * P.QTPRODSUMA AS QTPRODUTO
								  FROM PRODSUBSEMAM P
								       INNER JOIN PRODUTO PT ON PT.CDPRODUTO = P.CDPRODUTO
								 WHERE P.CDFILIAL = P_CDFILIAL
									AND P.CDCIA = CUR_CIAS.CDCIA
									AND P.CDMANCIA = CUR_SUBGRUPOS.CDMANCIA
									AND P.NRSERVICOCIAFILI = CUR_SUBGRUPOS.NRSERVICOCIAFILI
									AND P.CDCLASSE = CUR_CLASSES.CDCLASSE
									AND P.CDSUBGRU = CUR_SUBGRUPOS.CDSUBGRU
									AND P.NRSEQSUBGRUSEMAM = CUR_SUBGRUPOS.NRSEQSUBGRUSEMAM
									AND P.CDCICLO = CUR_ITENS_FAT.CDCICLO
							) LOOP
								V_CDPRODUTO := CUR_PRODUTOS.CDPRODUTO;
								V_QTPRODUTO := CUR_PRODUTOS.QTPRODUTO;

								INSERE_COMPARATIVO('PLANEJADO');
							END LOOP;

							FOR CUR_RECEITAS IN
							(
								SELECT R.CDRECEITA, V_QTSUBGRUPO * R.QTRECSUMA AS QTRECEITA
								  FROM RECSUBSEMAM R
								 WHERE R.CDFILIAL = P_CDFILIAL
									AND R.CDCIA = CUR_CIAS.CDCIA
									AND R.CDMANCIA = CUR_SUBGRUPOS.CDMANCIA
									AND R.NRSERVICOCIAFILI = CUR_SUBGRUPOS.NRSERVICOCIAFILI
									AND R.CDCLASSE = CUR_CLASSES.CDCLASSE
									AND R.CDSUBGRU = CUR_SUBGRUPOS.CDSUBGRU
									AND R.NRSEQSUBGRUSEMAM = CUR_SUBGRUPOS.NRSEQSUBGRUSEMAM
									AND R.CDCICLO = CUR_ITENS_FAT.CDCICLO
							) LOOP
								PROCESSA_RECEITA('PLANEJADO', CUR_RECEITAS.CDRECEITA, CUR_RECEITAS.QTRECEITA, 0);
							END LOOP;
						END LOOP;						
					END LOOP;
				END LOOP;
				/*REALIZADO*/
		   	FOR CUR_CLASSES IN
		   	(
					SELECT P.CDCLASSE, NVL(P.QTTOTPAXAT, 0.0) + NVL(P.QTPAXSBY, 0.0) AS QTPAX
					  FROM PREVISAOPAXM P
					 WHERE P.CDFILIAL = P_CDFILIAL
					   AND P.CDCIA = V_CDCIA
					   AND P.NRVOO = V_NRVOO
					   AND P.CDTRECHO = V_CDTRECHO
					   AND P.DTHRPLAVOOPV = V_DTDECOLAGEM
		   	) LOOP
		   		V_CDCLASSE := CUR_CLASSES.CDCLASSE;
					V_QTPAXREF := CUR_CLASSES.QTPAX;
		   		FOR CUR_SERVPLANOM IN
		   		(
		   		SELECT S.NRSERVICOCIAFILI, S.CDCICLO, S.NRITEMPLANSP
					  FROM SERVPLANOM S
					 WHERE S.CDFILIAL = P_CDFILIAL
					   AND S.CDCIA = V_CDCIA
					   AND S.NRVOO = V_NRVOO
					   AND S.CDTRECHO = V_CDTRECHO
					   AND S.DTHRPLAVOOPV = V_DTDECOLAGEM
					   AND S.CDCLASSE = V_CDCLASSE
					   AND S.NRDELIVERY IS NOT NULL
					   AND S.IDSITSERSP = '2'
		   		) LOOP
		   			V_NRSERVICOCIAFILIPRECO := CUR_SERVPLANOM.NRSERVICOCIAFILI;
						V_CDCICLO := CUR_SERVPLANOM.CDCICLO;

						SELECT MAX(P.NRSEQPRECO), COUNT(1)
						  INTO V_NRSEQPRECO, V_NUM_PRECOS_ITEMFAT
						  FROM PRECOSECIAM P
						 WHERE P.CDFILIAL = P_CDFILIAL AND
								 P.CDCIA = CUR_CIAS.CDCIA AND
								 P.NRTABPRECO = V_NRTABPRECO AND
								 P.NRSERVICOCIAFILI = CUR_SERVPLANOM.NRSERVICOCIAFILI AND
								 P.CDCLASSE = CUR_CLASSES.CDCLASSE AND
								 P.CDCICLO = CUR_SERVPLANOM.CDCICLO AND
								 CUR_DATAS.DTDATA BETWEEN P.DTINIVIGSE AND P.DTFIMVIGSE;

						IF V_NUM_PRECOS_ITEMFAT > 1 THEN							
							CONTINUE;
						END IF;

						IF V_NUM_PRECOS_ITEMFAT = 0 THEN							
							CONTINUE;
						END IF;


						SELECT MAX(DTINIVIGSE), MAX(DTFIMVIGSE), MAX(IDPROPORCAO), MAX(QTPROPORCAO)
						  INTO V_DTINIVIGSE, V_DTFIMVIGSE, V_IDPROPORCAO, V_QTPROPORCAO
						  FROM PRECOSECIAM P
						 WHERE P.CDFILIAL = P_CDFILIAL AND
								 P.CDCIA = CUR_CIAS.CDCIA AND
								 P.NRTABPRECO = V_NRTABPRECO AND
								 P.NRSERVICOCIAFILI = CUR_SERVPLANOM.NRSERVICOCIAFILI AND
								 P.CDCLASSE = CUR_CLASSES.CDCLASSE AND
								 P.CDCICLO = CUR_SERVPLANOM.CDCICLO AND
								 P.NRSEQPRECO = V_NRSEQPRECO;

		   			FOR CUR_CONEXAOSUBGRUPO IN
		   			(
							SELECT C.CDMANCIA, C.NRSERVICOCIAFILI, C.CDSUBGRU, C.NRSEQSUBGRUSEMAM, SG.IDPROPSUBSEMAM, SG.QTPROPSUBSEMAM,
						          SG.DTINIVGSUMA, SG.DTFIMVGSUMA
							  FROM CONEXAOSUBGRUPO C
							       INNER JOIN SUBGRUSEMAM SG ON SG.CDFILIAL = C.CDFILIAL AND
																			SG.CDCIA = C.CDCIA AND
																			SG.CDMANCIA = C.CDMANCIA AND
																			SG.NRSERVICOCIAFILI = C.NRSERVICOCIAFILI AND
																			SG.CDCLASSE = C.CDCLASSE AND
																			SG.CDSUBGRU = C.CDSUBGRU AND
																			SG.NRSEQSUBGRUSEMAM = C.NRSEQSUBGRUSEMAM
									 INNER JOIN MANUALCIAM M ON M.CDFILIAL = SG.CDFILIAL
		                                             AND M.CDCIA = SG.CDCIA 
		                                             AND M.CDMANCIA = SG.CDMANCIA
							 WHERE C.CDFILIAL = P_CDFILIAL
							   AND C.CDCIA = V_CDCIA
							   AND C.NRVOO = V_NRVOO
							   AND C.CDTRECHO = V_CDTRECHO
							   AND C.DTHRPLAVOOPV = V_DTDECOLAGEM
							   AND C.NRSERVICOCIAFILISP = V_NRSERVICOCIAFILIPRECO
							   AND C.CDCLASSESP = V_CDCLASSE
							   AND C.CDCICLOSP = V_CDCICLO
							   AND C.NRITEMPLANSP = CUR_SERVPLANOM.NRITEMPLANSP
							   AND M.IDSITUAPROPCIA = 'A'
	                     AND CUR_DATAS.DTDATA BETWEEN M.DTINIVGMA AND M.DTFIMVGMA
								AND CUR_DATAS.DTDATA BETWEEN SG.DTINIVGSUMA AND SG.DTFIMVGSUMA
		   			) LOOP
		   				V_CDMANCIA := CUR_CONEXAOSUBGRUPO.CDMANCIA;
							V_NRSERVICOCIAFILI := CUR_CONEXAOSUBGRUPO.NRSERVICOCIAFILI;
							V_CDSUBGRU := CUR_CONEXAOSUBGRUPO.CDSUBGRU;
							V_NRSEQSUBGRUSEMAM := CUR_CONEXAOSUBGRUPO.NRSEQSUBGRUSEMAM;
							V_IDPROPSUBSEMAM := CUR_CONEXAOSUBGRUPO.IDPROPSUBSEMAM;
							V_QTPROPSUBSEMAM := CUR_CONEXAOSUBGRUPO.QTPROPSUBSEMAM;
							V_DTINIVGSUMA := CUR_CONEXAOSUBGRUPO.DTINIVGSUMA;
							V_DTFIMVGSUMA := CUR_CONEXAOSUBGRUPO.DTFIMVGSUMA;

							IF CUR_CONEXAOSUBGRUPO.IDPROPSUBSEMAM IS NULL THEN
								CONTINUE;
							END IF;

							IF NVL(CUR_CONEXAOSUBGRUPO.QTPROPSUBSEMAM, 0) = 0 THEN
								IF CUR_CONEXAOSUBGRUPO.IDPROPSUBSEMAM IN ('2', '4', '5') THEN
									CONTINUE;
								END IF;
							END IF;

							IF CUR_CONEXAOSUBGRUPO.IDPROPSUBSEMAM = '1' THEN
								V_QTSUBGRUPO := V_QTPAXREF;
							END IF;
							IF CUR_CONEXAOSUBGRUPO.IDPROPSUBSEMAM = '2' THEN
								IF CUR_CONEXAOSUBGRUPO.QTPROPSUBSEMAM > 0 THEN                           
									V_QTSUBGRUPO := CEIL(V_QTPAXREF/CUR_CONEXAOSUBGRUPO.QTPROPSUBSEMAM);
								END IF;
							END IF;
							IF CUR_CONEXAOSUBGRUPO.IDPROPSUBSEMAM = '3' THEN
								SELECT MAX(QTSUBGRUPO)
								  INTO V_QTSUBGRUPO
								  FROM PROPSUBGRUSE
								  WHERE CDFILIAL  = P_CDFILIAL AND
										  CDCIA     = CUR_CIAS.CDCIA AND          
										  CDMANCIA = CUR_CONEXAOSUBGRUPO.CDMANCIA AND
										  NRSERVICOCIAFILI = CUR_CONEXAOSUBGRUPO.NRSERVICOCIAFILI AND
										  CDCLASSE  = CUR_CLASSES.CDCLASSE AND
										  CDSUBGRU  = CUR_CONEXAOSUBGRUPO.CDSUBGRU AND
										  NRSEQSUBGRUSEMAM = CUR_CONEXAOSUBGRUPO.NRSEQSUBGRUSEMAM AND
										  V_QTPAXREF BETWEEN QTPAXDE AND QTPAXATE;

								IF V_QTSUBGRUPO = 0 THEN 
								  CONTINUE;
								END IF;
								
								IF V_QTSUBGRUPO IS NULL THEN
									CONTINUE;
								END IF;
							END IF;

							IF CUR_CONEXAOSUBGRUPO.IDPROPSUBSEMAM = '4' THEN
								V_QTSUBGRUPO := ((V_QTPAXREF * CUR_CONEXAOSUBGRUPO.QTPROPSUBSEMAM)/100);
								IF (V_QTSUBGRUPO > 0) AND (V_QTSUBGRUPO < 1) THEN
									V_QTSUBGRUPO := 1;
								ELSE
									V_QTSUBGRUPO := ROUND(V_QTSUBGRUPO);
								END IF;
							END IF;
							
							IF CUR_CONEXAOSUBGRUPO.IDPROPSUBSEMAM = '5' THEN                        
								V_QTSUBGRUPO := NVL(CUR_CONEXAOSUBGRUPO.QTPROPSUBSEMAM, 0);
							END IF;

							FOR CUR_PRODUTOS IN
							(
								SELECT P.CDPRODUTO, V_QTSUBGRUPO * P.QTPRODSUMA AS QTPRODUTO
								  FROM PRODSUBSEMAM P
								       INNER JOIN PRODUTO PT ON PT.CDPRODUTO = P.CDPRODUTO
								 WHERE P.CDFILIAL = P_CDFILIAL
									AND P.CDCIA = CUR_CIAS.CDCIA
									AND P.CDMANCIA = CUR_CONEXAOSUBGRUPO.CDMANCIA
									AND P.NRSERVICOCIAFILI = CUR_CONEXAOSUBGRUPO.NRSERVICOCIAFILI
									AND P.CDCLASSE = CUR_CLASSES.CDCLASSE
									AND P.CDSUBGRU = CUR_CONEXAOSUBGRUPO.CDSUBGRU
									AND P.NRSEQSUBGRUSEMAM = CUR_CONEXAOSUBGRUPO.NRSEQSUBGRUSEMAM
									AND P.CDCICLO = CUR_SERVPLANOM.CDCICLO
							) LOOP
								V_CDPRODUTO := CUR_PRODUTOS.CDPRODUTO;
								V_QTPRODUTO := CUR_PRODUTOS.QTPRODUTO;

								INSERE_COMPARATIVO('REALIZADO');
							END LOOP;

							FOR CUR_RECEITAS IN
							(
								SELECT R.CDRECEITA, V_QTSUBGRUPO * R.QTRECSUMA AS QTRECEITA
								  FROM RECSUBSEMAM R
								 WHERE R.CDFILIAL = P_CDFILIAL
									AND R.CDCIA = CUR_CIAS.CDCIA
									AND R.CDMANCIA = CUR_CONEXAOSUBGRUPO.CDMANCIA
									AND R.NRSERVICOCIAFILI = CUR_CONEXAOSUBGRUPO.NRSERVICOCIAFILI
									AND R.CDCLASSE = CUR_CLASSES.CDCLASSE
									AND R.CDSUBGRU = CUR_CONEXAOSUBGRUPO.CDSUBGRU
									AND R.NRSEQSUBGRUSEMAM = CUR_CONEXAOSUBGRUPO.NRSEQSUBGRUSEMAM
									AND R.CDCICLO = CUR_SERVPLANOM.CDCICLO
							) LOOP
								PROCESSA_RECEITA('REALIZADO', CUR_RECEITAS.CDRECEITA, CUR_RECEITAS.QTRECEITA, 0);
							END LOOP;
		   			END LOOP;
		   		END LOOP;
		   	END LOOP;			   
	   	END LOOP;
		END LOOP;
	END LOOP;
END;
/