CREATE OR REPLACE PROCEDURE GERA_PREVCONSINF
(
P_CDFILIAL IN VARCHAR2,
P_DATAINI IN DATE,
P_DATAFIN IN DATE,
P_CDOPERADOR IN VARCHAR2,
P_NRORG IN NUMBER,
P_NRLISTAERROS OUT NUMBER
)
AS
	V_MAX_ANTECEDENCIA NUMBER;
	V_NRPREVCONSINF NUMBER;
	V_CDPREVCONSINF VARCHAR2(20);
	V_MAXCDPREVCONSINF VARCHAR2(20);
	V_SEQPREVCONS NUMBER;
	V_PREFIXO VARCHAR2(20);
	
	V_CDMANCIA VARCHAR2(4); 
	V_DSMANUAL VARCHAR2(500);
	V_NRTIPONEGOCIOINF NUMBER;
	V_DSTIPONEGOCIOINF VARCHAR2(200);
	V_IDSITUAPROPCIA VARCHAR2(1); 
	V_DTINIVGMA DATE;
	V_DTFIMVGMA DATE;
	v_NUM_MENU_ATIVOS NUMBER;

	V_NRTIPOPROD NUMBER;	

	V_NRTABPRECO VARCHAR2(3);
	v_NUM_TABPRECO_ATIVAS NUMBER;

	V_NRSEQPRECO NUMBER;
	V_NUM_PRECOS_ITEMFAT NUMBER;

	V_NRORDEMERROS NUMBER;
	V_SEQ VARCHAR2(20);

	V_NUM_ITEMFAT NUMBER;
	V_NUM_SUBGRUPOS NUMBER;


	V_DATA VARCHAR2(20);
	V_DTDATA DATE;
	V_SGCIA VARCHAR2(20);
	V_CDCIA VARCHAR2(4);
	V_VOO VARCHAR2(50);   
	V_NRVOO VARCHAR2(5);
	V_CDTRECHO VARCHAR2(4);
	V_NRTURNOETD VARCHAR2(2);
	V_SGCLASSE VARCHAR2(20);
	V_CDCLASSE VARCHAR2(4);
	V_DSSERVICOCIAFILIPRECO VARCHAR2(500);
	V_NRSERVICOCIAFILIPRECO NUMBER;   
	V_DSSERVICOCIAFILI VARCHAR2(500);
	V_NRSERVICOCIAFILI NUMBER;
	V_IDCICLO VARCHAR2(20);
	V_CDCICLO VARCHAR2(4);
	V_DSSUBGRU VARCHAR2(500);
	V_CDSUBGRU VARCHAR2(10);
	V_NRSEQSUBGRUSEMAM NUMBER;

	V_QTSUBGRUPO FLOAT;  
	
	V_QTPAXREF NUMBER;

	V_MSGERRO VARCHAR2(4000);

	V_HRQUEBRA VARCHAR2(4);
	V_HRQUEBRACIA VARCHAR2(4);
	V_HRQUEBRAFILI VARCHAR2(4);

	V_EXISTE_INSUMO NUMBER;

	/*Classifica receita, valida inconsistencias, insere em checklists*/
	PROCEDURE PROCESSA_RECEITA
	(
	P_CDRECEITA IN VARCHAR2,
	P_QTRECEITA IN FLOAT,
	P_CDSETORDEST IN VARCHAR2,
	P_NRCATEGORIAPRODDEST IN NUMBER,
	P_NRSUBCATEGORIAPRODDEST IN NUMBER,
	P_CDRECEITADEST IN VARCHAR2,
	P_QTRECEITADEST IN FLOAT,   
	P_DTPRODUCAODEST IN DATE,
	P_CDSETORROOT IN VARCHAR2,
	P_NRCATEGORIAPRODROOT IN NUMBER,
	P_NRSUBCATEGORIAPRODROOT IN NUMBER,
	P_CDRECEITAROOT IN VARCHAR2
	)
	AS
	  V_CODRECEITA VARCHAR2(20);
	  V_DSRECEITA VARCHAR2(250);
	  V_IDRECFLEXIVEL VARCHAR2(1);
	  V_NRVARIACAOREC NUMBER;
	  V_QTRENDIMENTOREC FLOAT;      
	  V_NRSEQUTILRECFLEX NUMBER;
	  V_CONTEXTO_MSGERRO VARCHAR2(4000);
	  V_VRFATOR FLOAT;

	  V_DTPRODUCAOREC DATE;   

	  V_CDSETOR VARCHAR2(4);
	  V_NMSETOR VARCHAR2(200);
	  V_NRTURNO VARCHAR2(2);
	  V_NRCATEGORIAPROD NUMBER;   
	  V_NMCATEGORIAPROD VARCHAR2(200);
	  V_NRSUBCATEGORIAPROD NUMBER;
	  V_NMSUBCATEGORIAPROD VARCHAR2(200);
	  V_NRTIPOPRODREC NUMBER;
	  V_DSTIPOPROD VARCHAR2(200);     
	  V_NRDIASANTECEDENCIA NUMBER;
	  V_QTRECEITA_PRODUZIR FLOAT;
	  V_QTRECEITA_JA_PLANEJADA FLOAT;
	BEGIN
		V_CONTEXTO_MSGERRO := V_IDCICLO || '$$' ||
									 V_DSSUBGRU || '$$' ||
									 V_DSSERVICOCIAFILI || '$$' ||
									 V_SGCLASSE || '$$' ||
									 V_CDMANCIA || '$$' ||
									 V_DSMANUAL || '$$' ||
									 V_SGCIA    || '$$' ||
									 V_DATA;

		/*Classificacao da receita para producao*/
		CLASSIFICA_PROD_RECEITA(P_CDFILIAL, P_CDRECEITA, V_CDCIA, V_DTDATA, V_NRTURNOETD,
										V_CDCLASSE, V_NRVOO, V_CDTRECHO, V_CDMANCIA, V_NRTIPONEGOCIOINF, 
										V_NRSERVICOCIAFILI, V_CDSUBGRU, V_NRSEQSUBGRUSEMAM, V_CDCICLO, 
										P_CDSETORDEST, P_NRCATEGORIAPRODDEST, P_NRSUBCATEGORIAPRODDEST, P_CDRECEITADEST,
										P_CDSETORROOT, P_NRCATEGORIAPRODROOT, P_NRSUBCATEGORIAPRODROOT, P_CDRECEITAROOT,
										P_NRORG, 
										V_CDSETOR, V_NRCATEGORIAPROD, V_NRSUBCATEGORIAPROD, 
										V_NRTIPOPRODREC, V_NRTURNO, V_NRDIASANTECEDENCIA);
		
		V_DTPRODUCAOREC := V_DTDATA - NVL(V_NRDIASANTECEDENCIA, 0);

		/*Busca informacoes da receita, fazendo as devidas consistencias*/
		DADOS_RECEITA_PRODUCAO(P_CDFILIAL, P_CDRECEITA, V_DTPRODUCAOREC,
									  P_CDOPERADOR, P_NRORG, 'M', V_CONTEXTO_MSGERRO,
									  P_NRLISTAERROS, V_NRORDEMERROS, 
									  V_CODRECEITA, V_DSRECEITA,
									  V_IDRECFLEXIVEL, V_NRVARIACAOREC, 
									  V_QTRENDIMENTOREC, V_NRSEQUTILRECFLEX);

		/*Se setor estiver vazio*/
		IF V_CDSETOR IS NULL THEN
			
			/*Receita [CDRECEITA] - [DSRECEITA] nao possui padrao de producao cadastrado para a unidade informada e tipo de negocio [DSTIPONEGOCIOINF] e e utilizada no ciclo [IDCICLO] do subgrupo [SUBGRUPO] do servico [SERVICO] da classe [CLASSE] do menu grid [CODMENU] - [MENU] da companhia [COMPANHIA] na data [DATA]*/
			INSERE_LISTA_ERROS(P_CDFILIAL,
									 'APPERRMSGSTR' || 'APP-00114' || '$$' ||
									 V_CODRECEITA || '$$' ||
									 V_DSRECEITA || '$$' ||
									 V_DSTIPONEGOCIOINF || '$$' ||
									 V_CONTEXTO_MSGERRO
									 || 'APPERRMSGEND',
									 P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
			V_NRORDEMERROS := V_NRORDEMERROS + 1;
												
		END IF;

		/*Se tipo de producao estiver vazio*/
		IF V_NRTIPOPRODREC IS NULL THEN
		  
		  /*Receita [CDRECEITA] - [DSRECEITA] nao possui tipo de producao cadastrado para a unidade informada no ciclo [IDCICLO] do subgrupo [SUBGRUPO] do servico [SERVICO] da classe [CLASSE] do menu grid [CODMENU] - [MENU] da companhia [COMPANHIA] na data [DATA]*/
		  INSERE_LISTA_ERROS(P_CDFILIAL,
									'APPERRMSGSTR' || 'APP-00115' || '$$' ||
									V_CODRECEITA || '$$' ||
									V_DSRECEITA || '$$' ||
									V_CONTEXTO_MSGERRO
									|| 'APPERRMSGEND',
									P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
		  V_NRORDEMERROS := V_NRORDEMERROS + 1;
											  
		END IF;

		/*Se o turno estiver vazio*/
		IF V_CDSETOR IS NOT NULL AND V_NRTIPOPRODREC IS NOT NULL AND V_NRTURNO IS NULL THEN

		  SELECT MAX(NMSETOR)
			 INTO V_NMSETOR
			 FROM SETOR
			WHERE CDSETOR = V_CDSETOR;

		  SELECT MAX(DSTIPOPROD)
			 INTO V_DSTIPOPROD
			 FROM TIPOPROD
			WHERE NRTIPOPROD = V_NRTIPOPRODREC;

		  SELECT MAX(NMCATEGORIAPROD)
			 INTO V_NMCATEGORIAPROD
			 FROM CATEGORIAPROD
			WHERE NRCATEGORIAPROD = V_NRCATEGORIAPROD;

		  SELECT MAX(NMCATEGORIAPROD)
			 INTO V_NMSUBCATEGORIAPROD
			 FROM CATEGORIAPROD
			WHERE NRCATEGORIAPROD = V_NRSUBCATEGORIAPROD;
		  
		  /*Receita [CDRECEITA] - [DSRECEITA] nao possui fluxo de producao definido para a unidade informada, setor [NMSETOR], categoria [NMCATEGORIAPROD], subcategoria [NMSUBCATEGORIA], tipo de producao [DSTIPOPROD], voo [VOO] no ciclo [IDCICLO] do subgrupo [SUBGRUPO] do servico [SERVICO] da classe [CLASSE] do menu grid [CODMENU] - [MENU] da companhia [COMPANHIA] na data [DATA]*/
		  INSERE_LISTA_ERROS(P_CDFILIAL,
									'APPERRMSGSTR' || 'APP-00116' || '$$' ||
									V_CODRECEITA || '$$' ||
									V_DSRECEITA || '$$' ||
									V_NMSETOR || '$$' ||
									V_NMCATEGORIAPROD || '$$' ||
									V_NMSUBCATEGORIAPROD || '$$' ||
									V_DSTIPOPROD || '$$' ||
									V_VOO || '$$' ||
									V_CONTEXTO_MSGERRO
									|| 'APPERRMSGEND',
									P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
		  V_NRORDEMERROS := V_NRORDEMERROS + 1;
											  
		END IF;

		V_QTRECEITA_PRODUZIR := P_QTRECEITA;

		V_VRFATOR := CASE WHEN V_QTRENDIMENTOREC = 0 THEN 0 ELSE P_QTRECEITA/V_QTRENDIMENTOREC END;
		
		/*Somente insere se data de producao da receita esta dentro do periodo estimado */
		IF V_DTPRODUCAOREC BETWEEN P_DATAINI AND P_DATAFIN THEN

			IF V_QTRECEITA_PRODUZIR > 0.0 AND ROUND(V_QTRECEITA_PRODUZIR, 3) = 0 THEN
				V_QTRECEITA_PRODUZIR := 0.001;
			ELSE
				V_QTRECEITA_PRODUZIR := ROUND(V_QTRECEITA_PRODUZIR, 3);
			END IF;        

			/*Somente inclui receitas que ainda nao tenham sido planejadas*/
			IF V_QTRECEITA_PRODUZIR > 0 THEN
				/*Insere cada um dos produtos da receita*/
				FOR CUR_PROD IN
				(
				SELECT PR.CDPRODUTO, V_VRFATOR * NVL(PR.QTPRODREC,0) AS QUANTIDADE
				  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
				   DBMS_OUTPUT.PUT_LINE('Produto: ' || CUR_PROD.CDPRODUTO || ' da receita:' || P_CDRECEITA);
					INSERE_INSUMOS_PREVCONSINF(V_NRPREVCONSINF, CUR_PROD.CDPRODUTO, CUR_PROD.QUANTIDADE,
														V_DTPRODUCAOREC, V_DTDATA, P_CDFILIAL, V_CDCIA, V_NRVOO, V_CDTRECHO, V_NRSERVICOCIAFILIPRECO,
														V_CDMANCIA, V_NRSERVICOCIAFILI, V_CDCLASSE, V_CDSUBGRU, V_NRSEQSUBGRUSEMAM,
														V_CDCICLO, V_NRTIPOPRODREC, V_NRTIPONEGOCIOINF,
														CASE WHEN P_CDRECEITAROOT IS NULL THEN P_CDRECEITA ELSE P_CDRECEITAROOT END, P_CDRECEITADEST, P_CDRECEITA,
														V_CDSETOR, V_NRTURNO, V_NRCATEGORIAPROD, V_NRSUBCATEGORIAPROD,
														P_CDOPERADOR, P_NRORG);
				END LOOP;
				
			END IF;
		END IF;

		/*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(CUR_SUB.CDSUBRECEITA, CUR_SUB.QUANTIDADE, 
								  V_CDSETOR, V_NRCATEGORIAPROD, V_NRSUBCATEGORIAPROD, 
								  P_CDRECEITA, V_QTRECEITA_PRODUZIR, 
								  V_DTPRODUCAOREC, 
								  CASE WHEN P_CDRECEITAROOT IS NULL THEN V_CDSETOR ELSE P_CDSETORROOT END,
								  CASE WHEN P_CDRECEITAROOT IS NULL THEN V_NRCATEGORIAPROD ELSE P_NRCATEGORIAPRODROOT END,
								  CASE WHEN P_CDRECEITAROOT IS NULL THEN V_NRSUBCATEGORIAPROD ELSE P_NRSUBCATEGORIAPRODROOT END,
								  NVL(P_CDRECEITAROOT, P_CDRECEITA));
		END LOOP;
		
	END;

BEGIN
	V_MAX_ANTECEDENCIA := GET_MAX_ANTECEDENCIA_PROD(P_CDFILIAL);

	V_NRORDEMERROS := 1;

	/*******************************************************************/
	/*Inclusao da previsao de consumo>>>>>*/
	/*******************************************************************/
	NOVO_CODIGO_NT('PREVCONSINF', V_SEQ);
	V_NRPREVCONSINF := TO_NUMBER(V_SEQ);

	/*Numeracao da previsao de consumo>>>>>*/
	
	V_PREFIXO := 'P' || P_CDFILIAL || TO_CHAR(SYSDATE, 'YYYYMMDD');

	/*Busca ultima previsao na data de geracao*/
	SELECT MAX(CDPREVCONSINF)
	  INTO V_MAXCDPREVCONSINF
	  FROM PREVCONSINF
	 WHERE CDFILIAL = P_CDFILIAL
		AND DTGERACAO = TRUNC(SYSDATE);

	IF V_MAXCDPREVCONSINF IS NULL THEN
		 V_SEQPREVCONS := 1;
	 ELSE
		 V_SEQPREVCONS := TO_NUMBER(SUBSTR(V_MAXCDPREVCONSINF, -5)) + 1;
	 END IF;

	 V_CDPREVCONSINF := V_PREFIXO || LPAD(TO_CHAR(V_SEQPREVCONS), 5, '0');
	/*<<<<<Numeracao da previsao de consumo*/

	INSERT INTO PREVCONSINF
	(
	NRPREVCONSINF, CDPREVCONSINF, CDFILIAL, DTGERACAO,   
	DTINIPREVCONSINF, DTFIMPREVCONSINF,
	NRORG, NRORGINCLUSAO, NRORGULTATU,
	DTINCLUSAO, DTULTATU,
	CDOPERINCLUSAO, CDOPERULTATU, IDATIVO
	)
	VALUES
	(
	V_NRPREVCONSINF, V_CDPREVCONSINF, P_CDFILIAL, TRUNC(SYSDATE),
	P_DATAINI, P_DATAFIN,
	P_NRORG, P_NRORG, P_NRORG,
	SYSDATE, SYSDATE,
	P_CDOPERADOR, P_CDOPERADOR, 'S'
	);

	/*******************************************************************/
	/*<<<<<Fim da inclusao da previsao de consumo*/
	/*******************************************************************/

	FOR CUR_DATAS IN
	(
	SELECT DTDATA
	  FROM DATA
	 WHERE DTDATA BETWEEN P_DATAINI AND P_DATAFIN + V_MAX_ANTECEDENCIA
	) LOOP      
		V_DATA := TO_CHAR(CUR_DATAS.DTDATA, 'DD/MM/YYYY');
		V_DTDATA := CUR_DATAS.DTDATA;      

		DBMS_OUTPUT.PUT_LINE('Dia: ' || V_DATA);
		FOR CUR_CIAS IN
		(
		SELECT DISTINCT C.SGCIA, CF.CDCIA, NVL(CF.IDVINCULOMANUAL, 'N') AS IDVINCULOMANUAL
		  FROM CIAFILI CF
				 INNER JOIN COMPANHIA C ON C.CDCIA = CF.CDCIA
				 INNER JOIN VOOTRECHO VT ON VT.CDFILIAL = CF.CDFILIAL AND
														VT.CDCIA = CF.CDCIA
				 INNER JOIN VOO V ON V.CDFILIAL = VT.CDFILIAL AND
											V.CDCIA = VT.CDCIA AND
											V.NRVOO = VT.NRVOO                                         
				 INNER JOIN BASE BO ON BO.CDBASE = VT.CDBASEORI
				 INNER JOIN BASE BD ON BD.CDBASE = VT.CDBASEDES
				 INNER JOIN VOOTRECHODATA VD ON VD.CDFILIAL = VT.CDFILIAL AND
														  VD.CDCIA = VT.CDCIA AND
														  VD.NRVOO = VT.NRVOO AND
														  VD.CDTRECHO = VT.CDTRECHO AND
														  V_DTDATA BETWEEN VD.DTINIVIGENCIA AND NVL(VD.DTFIMVIGENCIA, V_DTDATA)
		 WHERE CF.CDFILIAL = P_CDFILIAL
			AND VOO_DECOLA_DATA(VT.CDFILIAL, VT.CDCIA, VT.NRVOO, VT.CDTRECHO, V_DTDATA) = 'S'
			AND V.IDCONSIDERAPLANPROD = 'S'
		) LOOP

			V_SGCIA := CUR_CIAS.SGCIA;
			V_CDCIA := CUR_CIAS.CDCIA;

			/*Verifica se a companhia possui menu grid aprovado e vigente*/
			SELECT COUNT(1)
			  INTO V_NUM_MENU_ATIVOS
			  FROM MANUALCIAM M
			 WHERE M.CDFILIAL = P_CDFILIAL
				AND M.CDCIA = CUR_CIAS.CDCIA
				AND M.IDSITUAPROPCIA = 'A'
				AND V_DTDATA BETWEEN M.DTINIVGMA AND M.DTFIMVGMA;

			IF V_NUM_MENU_ATIVOS = 0 THEN
				IF CUR_CIAS.IDVINCULOMANUAL = 'N' THEN
					CONTINUE;
				END IF;
				/*Nao ha menu grid vigente e aprovado para a companhia [SIGLA] na data [DATA]*/
				INSERE_LISTA_ERROS(P_CDFILIAL, 'APPERRMSGSTR' || 'APP-00118' || '$$' || V_SGCIA || '$$' || V_DATA || 'APPERRMSGEND',
									 P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
				V_NRORDEMERROS := V_NRORDEMERROS + 1;
			END IF;         

			/*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 V_DTDATA BETWEEN DTINIVIGTAB AND DTFIMVIGTAB;

			IF V_NUM_TABPRECO_ATIVAS = 0 THEN
				/*Nao ha tabela de precos vigente para a companhia [SIGLA] na data [DATA]*/
				INSERE_LISTA_ERROS(P_CDFILIAL, 'APPERRMSGSTR' || 'APP-00121' || '$$' || V_SGCIA || '$$' || V_DATA || 'APPERRMSGEND',
									 P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
				V_NRORDEMERROS := V_NRORDEMERROS + 1;
			END IF;

			IF V_NUM_TABPRECO_ATIVAS > 1 THEN
				/*Ha mais de uma tabela de precos vigente para a companhia [SIGLA] na data [DATA]*/
				INSERE_LISTA_ERROS(P_CDFILIAL, 'APPERRMSGSTR' || 'APP-00122' || '$$' || V_SGCIA || '$$' || V_DATA || 'APPERRMSGEND',
									 P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
				V_NRORDEMERROS := V_NRORDEMERROS + 1;
			END IF;

			IF V_NUM_TABPRECO_ATIVAS <> 1 OR V_NUM_MENU_ATIVOS = 0 THEN
				CONTINUE;
			END IF;

			FOR CUR_VOOS IN
			(
			SELECT VT.NRVOO, VT.CDTRECHO, VD.HRETD, VD.CDEQUIP
				FROM CIAFILI CF
					  INNER JOIN COMPANHIA C ON C.CDCIA = CF.CDCIA
					  INNER JOIN VOOTRECHO VT ON VT.CDFILIAL = CF.CDFILIAL AND
															 VT.CDCIA = CF.CDCIA
					  INNER JOIN VOO V ON V.CDFILIAL = VT.CDFILIAL AND
												 V.CDCIA = VT.CDCIA AND
												 V.NRVOO = VT.NRVOO                                         
					  INNER JOIN BASE BO ON BO.CDBASE = VT.CDBASEORI
					  INNER JOIN BASE BD ON BD.CDBASE = VT.CDBASEDES
					  INNER JOIN VOOTRECHODATA VD ON VD.CDFILIAL = VT.CDFILIAL AND
																VD.CDCIA = VT.CDCIA AND
																VD.NRVOO = VT.NRVOO AND
																VD.CDTRECHO = VT.CDTRECHO AND
																V_DTDATA BETWEEN VD.DTINIVIGENCIA AND NVL(VD.DTFIMVIGENCIA, V_DTDATA)
			  WHERE CF.CDFILIAL = P_CDFILIAL
			    AND CF.CDCIA = CUR_CIAS.CDCIA
				 AND VOO_DECOLA_DATA(VT.CDFILIAL, VT.CDCIA, VT.NRVOO, VT.CDTRECHO, V_DTDATA) = 'S'
				 AND V.IDCONSIDERAPLANPROD = 'S'
			) LOOP
				
				V_VOO := CUR_CIAS.SGCIA||'-'||CUR_VOOS.NRVOO;
				V_NRVOO := CUR_VOOS.NRVOO;
				V_CDTRECHO := CUR_VOOS.CDTRECHO;
				
				SELECT MAX(HRQUEBRAETD)
				  INTO V_HRQUEBRACIA
				  FROM CIAFILI
				 WHERE CDFILIAL = P_CDFILIAL
					AND CDCIA = CUR_CIAS.CDCIA;

				V_HRQUEBRA := V_HRQUEBRACIA;

				IF V_HRQUEBRA IS NULL THEN
					SELECT MAX(HRQUEBRAETD)
					  INTO V_HRQUEBRAFILI
					  FROM PARAMCOMIS
					 WHERE CDFILIAL = P_CDFILIAL;   

					V_HRQUEBRA := V_HRQUEBRAFILI;
				END IF;


				IF V_HRQUEBRA IS NULL THEN
					/*Nao ha horario de quebra definido para companhia [SGCIA]*/
					INSERE_LISTA_ERROS(P_CDFILIAL, 'APPERRMSGSTR' || 'APP-00142' || '$$' || V_SGCIA || 'APPERRMSGEND',
											 P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
					CONTINUE;
				END IF;

				IF CUR_VOOS.HRETD IS NULL THEN
					/*Nao ha horario de decolagem definido para o voo [VOO]*/
					INSERE_LISTA_ERROS(P_CDFILIAL, 'APPERRMSGSTR' || 'APP-00143' || '$$' || V_VOO ||  'APPERRMSGEND',
											 P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);               
					CONTINUE;
				END IF;

				IF NVL(CUR_VOOS.HRETD, '0000') BETWEEN '0000' AND V_HRQUEBRA THEN
					V_NRTURNOETD := '01';
				ELSE
					V_NRTURNOETD := '02';
				END IF;

				DBMS_OUTPUT.PUT_LINE('Voo: ' || V_VOO);

				FOR CUR_CLASSES IN
				(
				SELECT C.CDCLASSE, C.QTPAX, CL.SGCLASSE
				  FROM CONFIGURACAO_PAX_VOO_PRODM C
						 INNER JOIN CLASSE CL ON CL.CDCLASSE = C.CDCLASSE
				 WHERE C.CDFILIAL = P_CDFILIAL
					AND C.CDCIA = CUR_CIAS.CDCIA
					AND C.NRVOO = CUR_VOOS.NRVOO
					AND C.CDTRECHO = CUR_VOOS.CDTRECHO
					AND ((C.CDEQUIP IS NULL) OR (C.CDEQUIP = CUR_VOOS.CDEQUIP))
				) LOOP

					V_SGCLASSE := CUR_CLASSES.SGCLASSE;
					V_CDCLASSE := CUR_CLASSES.CDCLASSE;

					DBMS_OUTPUT.PUT_LINE('Classe: ' || V_SGCLASSE);
					
					/*Considera apenas as classes com quantidade de passageiros informada*/
					IF NVL(CUR_CLASSES.QTPAX, 0) = 0 THEN
						CONTINUE;
					END IF;

					FOR CUR_ITENS_FAT IN
					( SELECT P.NRSERVICOCIAFILI, P.CDCICLO, S.DSSERVICOCIAFILI, CI.IDCICLO, 0 AS QTSERVICOINF
						FROM PAD_VOOEQUIPAMENTO P
							  INNER JOIN SERVICOCIAFILI S ON S.CDFILIAL = P.CDFILIAL AND
																		S.CDCIA = P.CDCIA AND
																		S.NRSERVICOCIAFILI = P.NRSERVICOCIAFILI
							  INNER JOIN CICLO CI ON CI.CDCICLO = P.CDCICLO
							  INNER JOIN SERVICOGEN G ON G.NRSERVICOGEN = S.NRSERVICOGEN
					  WHERE P.CDFILIAL = P_CDFILIAL
						 AND P.DTDATA = V_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, V_DTDATA,
																	 P.NRSERVICOCIAFILI, P.CDCLASSE, P.CDCICLO)
						 AND G.IDSERVICO NOT IN ('2', '3', '5')
					) LOOP
						V_DSSERVICOCIAFILIPRECO := CUR_ITENS_FAT.DSSERVICOCIAFILI;
						V_NRSERVICOCIAFILIPRECO := CUR_ITENS_FAT.NRSERVICOCIAFILI;
						V_IDCICLO := CUR_ITENS_FAT.IDCICLO;
						V_CDCICLO := CUR_ITENS_FAT.CDCICLO;
						V_QTPAXREF := CUR_CLASSES.QTPAX;

						DBMS_OUTPUT.PUT_LINE('Servico: ' || V_DSSERVICOCIAFILIPRECO || ' ' || V_IDCICLO);
						/*Verifica se o item possui preco na tabela de preco ativa da companhia*/
						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
								 V_DTDATA BETWEEN P.DTINIVIGSE AND P.DTFIMVIGSE;

						IF V_NUM_PRECOS_ITEMFAT > 1 THEN
							/*Ha mais de um preco para o item de faturamento [NOME] da classe [CLASSE] do ciclo [IDCICLO] na tabela ativa da companhia [SIGLA] na data [DATA]*/
							INSERE_LISTA_ERROS(P_CDFILIAL, 
													 'APPERRMSGSTR' || 'APP-00123' || '$$' ||
													 CUR_ITENS_FAT.DSSERVICOCIAFILI || '$$' ||
													 CUR_CLASSES.SGCLASSE || '$$' ||
													 CUR_ITENS_FAT.IDCICLO || '$$' ||
													 V_SGCIA || '$$' || 
													 V_DATA
													 || 'APPERRMSGEND',
													 P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
							V_NRORDEMERROS := V_NRORDEMERROS + 1;
						END IF;

						IF V_NUM_PRECOS_ITEMFAT = 0 THEN
							/*Nao ha preco para o item de faturamento [NOME] da classe [CLASSE] do ciclo [IDCICLO] na tabela ativa da companhia [SIGLA] na data [DATA]*/
							INSERE_LISTA_ERROS(P_CDFILIAL, 
													 'APPERRMSGSTR' || 'APP-00124' || '$$' ||
													 CUR_ITENS_FAT.DSSERVICOCIAFILI || '$$' ||
													 CUR_CLASSES.SGCLASSE || '$$' ||
													 CUR_ITENS_FAT.IDCICLO || '$$' ||
													 V_SGCIA || '$$' || 
													 V_DATA
													 || 'APPERRMSGEND',
													 P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
							V_NRORDEMERROS := V_NRORDEMERROS + 1;
						END IF;

						CONEXAO_COM_SUBGRU_PLANOVOOM(P_CDFILIAL, V_CDCIA, V_NRVOO, V_CDTRECHO, V_DTDATA, 
													V_NRSERVICOCIAFILIPRECO, V_CDCLASSE, V_CDCICLO, V_DTDATA, 
													'S', NULL, P_CDOPERADOR, P_NRORG, V_MSGERRO);
						IF V_MSGERRO IS NOT NULL THEN
							FOR CUR_MSERROS IN
							(
							 SELECT REGEXP_SUBSTR(V_MSGERRO,'[^'||'>><<'||']+', 1, LEVEL) AS MSG FROM DUAL
								CONNECT BY REGEXP_SUBSTR(V_MSGERRO, '[^'||'>><<'||']+', 1, LEVEL) IS NOT NULL
							) LOOP
								INSERE_LISTA_ERROS(P_CDFILIAL, CUR_MSERROS.MSG, P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
							END LOOP;
						END IF;

						IF (V_NUM_PRECOS_ITEMFAT <> 1) OR V_MSGERRO IS NOT NULL THEN
							CONTINUE;
						END IF;

						V_NUM_SUBGRUPOS := 0;

						FOR CUR_SUBGRUPOS IN
						(
						SELECT S.CDMANCIA, S.NRSERVICOCIAFILI, S.CDSUBGRU, S.NRSEQSUBGRUSEMAM, SG.IDPROPSUBSEMAM, SG.QTPROPSUBSEMAM, SE.DSSERVICOCIAFILI, 
								 SU.DSSUBGRU || ' (' || TO_CHAR(SG.DTINIVGSUMA, 'DD/MM/YYYY') || ' a ' || TO_CHAR(SG.DTFIMVGSUMA, 'DD/MM/YYYY') || ')' AS DSSUBGRU
						  FROM SUBGRUTABPRECOM S
								 INNER JOIN SERVICOCIAFILI SE ON SE.CDFILIAL = S.CDFILIAL AND
																			SE.CDCIA = S.CDCIA AND
																			SE.NRSERVICOCIAFILI = S.NRSERVICOCIAFILI
								 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 SUBGRUPOM SU ON SU.CDSUBGRU = SG.CDSUBGRU
						 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 V_DTDATA BETWEEN SG.DTINIVGSUMA AND SG.DTFIMVGSUMA
						) LOOP
							V_DSSERVICOCIAFILI := CUR_SUBGRUPOS.DSSERVICOCIAFILI;
							V_NRSERVICOCIAFILI := CUR_SUBGRUPOS.NRSERVICOCIAFILI;
							V_DSSUBGRU := CUR_SUBGRUPOS.DSSUBGRU;
							V_CDSUBGRU := CUR_SUBGRUPOS.CDSUBGRU;
							V_NRSEQSUBGRUSEMAM := CUR_SUBGRUPOS.NRSEQSUBGRUSEMAM;

							V_NUM_SUBGRUPOS := V_NUM_SUBGRUPOS + 1;


							/*Verifica se o menu do subgrupo esta aprovado e vigente*/
							SELECT MAX(M.CDMANCIA), MAX(M.NRTIPONEGOCIOINF), MAX(M.DSMANUAL), MAX(M.IDSITUAPROPCIA), MAX(M.DTINIVGMA), MAX(DTFIMVGMA), MAX(DSTIPONEGOCIOINF)
							  INTO V_CDMANCIA, V_NRTIPONEGOCIOINF, V_DSMANUAL, V_IDSITUAPROPCIA, V_DTINIVGMA, V_DTFIMVGMA, V_DSTIPONEGOCIOINF
							  FROM MANUALCIAM M
									 LEFT JOIN TIPONEGOCIOINF T ON T.NRTIPONEGOCIOINF = M.NRTIPONEGOCIOINF
							 WHERE M.CDFILIAL = P_CDFILIAL
								AND M.CDCIA = CUR_CIAS.CDCIA
								AND M.CDMANCIA = CUR_SUBGRUPOS.CDMANCIA;
							
							DBMS_OUTPUT.PUT_LINE('Subgrupo: ' || V_DSSUBGRU || ' ' || V_DSSERVICOCIAFILI || ' ' || V_CDMANCIA || '-' || V_DSMANUAL );

							IF NVL(V_IDSITUAPROPCIA, 'E') <> 'A' THEN
								/*Item de Faturamento [DSSERVICOCIAFILI] da classe [SGCLASSE] DO ciclo [IDCICLO] do voo [VOO] na data [DATA] vinculado ao menu [CDMANCIA] - [DSMANUAL] que nao esta aprovado*/
								INSERE_LISTA_ERROS(P_CDFILIAL, 'APPERRMSGSTR' || 'APP-00144' || '$$' || 
																		  V_DSSERVICOCIAFILIPRECO || '$$' ||
																		  V_SGCLASSE || '$$' ||
																		  V_IDCICLO || '$$' ||
																		  V_VOO || '$$' ||
																		  V_DATA || '$$' ||
																		  V_CDMANCIA || '$$' ||
																		  V_DSMANUAL
																		  || 'APPERRMSGEND',
																		  P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
								V_NRORDEMERROS := V_NRORDEMERROS + 1;
							END IF;

							IF NOT (V_DTDATA BETWEEN V_DTINIVGMA AND V_DTFIMVGMA) THEN
								/*Item de Faturamento [DSSERVICOCIAFILI] da classe [SGCLASSE] DO ciclo [IDCICLO] do voo [VOO] na data [DATA] vinculado ao menu [CDMANCIA] - [DSMANUAL] que nao esta vigente*/
								INSERE_LISTA_ERROS(P_CDFILIAL, 'APPERRMSGSTR' || 'APP-00145' || '$$' || 
																		  V_DSSERVICOCIAFILIPRECO || '$$' ||
																		  V_SGCLASSE || '$$' ||
																		  V_IDCICLO || '$$' ||
																		  V_VOO || '$$' ||
																		  V_DATA || '$$' ||
																		  V_CDMANCIA || '$$' ||
																		  V_DSMANUAL
																		  || 'APPERRMSGEND',
																		  P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
								V_NRORDEMERROS := V_NRORDEMERROS + 1;
							END IF;

							IF V_NRTIPONEGOCIOINF IS NULL THEN
								/*Tipo de negocio nao informado para o menu [CDMANCIA] - [DSMANUAL] da companhia [SIGLA]*/
								INSERE_LISTA_ERROS(P_CDFILIAL, 'APPERRMSGSTR' || 'APP-00120' || '$$' || 
																		  V_CDMANCIA || '$$' ||
																		  V_DSMANUAL || '$$' ||
																		  V_SGCIA
																		  || 'APPERRMSGEND',
																		  P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
								V_NRORDEMERROS := V_NRORDEMERROS + 1;
							END IF;

							/*Se apresentou algum problema no menu*/
							IF NVL(V_IDSITUAPROPCIA, 'E') <> 'A' OR
								NOT (V_DTDATA BETWEEN V_DTINIVGMA AND V_DTFIMVGMA) OR
								V_NRTIPONEGOCIOINF IS NULL THEN
								CONTINUE;
							END IF;

							V_QTSUBGRUPO := 0;
							IF CUR_SUBGRUPOS.IDPROPSUBSEMAM IS NULL THEN
								/*Loading nao foi informado para o subgrupo [SUBGRUPO] do servico [SERVICO] da classe [CLASSE] do menu grid [CODMENU] - [MENU] da companhia [COMPANHIA] na data [DATA]*/
								INSERE_LISTA_ERROS(P_CDFILIAL, 
														 'APPERRMSGSTR' || 'APP-00125' || '$$' ||
														 V_DSSUBGRU || '$$' ||
														 V_DSSERVICOCIAFILI || '$$' ||
														 V_SGCLASSE || '$$' ||
														 V_CDMANCIA || '$$' ||
														 V_DSMANUAL || '$$' ||
														 V_SGCIA || '$$' ||
														 V_DATA
														 || 'APPERRMSGEND',
														 P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
								V_NRORDEMERROS := V_NRORDEMERROS + 1;
							END IF;

							IF NVL(CUR_SUBGRUPOS.QTPROPSUBSEMAM, 0) = 0 THEN
								IF CUR_SUBGRUPOS.IDPROPSUBSEMAM IN ('2', '4', '5') THEN
									/*Quantidade do loading nao foi informada para o subgrupo [SUBGRUPO] do servico [SERVICO] da classe [CLASSE] do menu grid [CODMENU] - [MENU] da companhia [COMPANHIA] na data [DATA]*/
									INSERE_LISTA_ERROS(P_CDFILIAL, 
															 'APPERRMSGSTR' || 'APP-00126' || '$$' ||
															 V_DSSUBGRU || '$$' ||
															 V_DSSERVICOCIAFILI || '$$' ||
															 V_SGCLASSE || '$$' ||
															 V_CDMANCIA || '$$' ||
															 V_DSMANUAL || '$$' ||
															 V_SGCIA || '$$' ||
															 V_DATA
															 || 'APPERRMSGEND',
															 P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
									V_NRORDEMERROS := V_NRORDEMERROS + 1;
								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 = V_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
									/*Nao foi encontrada quantidade na tabela de loading do subgrupo [SUBGRUPO] do servico [SERVICO] da classe [CLASSE] do menu grid [CODMENU] - [MENU] para a quantidade de passageiros[QTPAX] do voo [VOO] na data [DATA]*/
									INSERE_LISTA_ERROS(P_CDFILIAL, 
															 'APPERRMSGSTR' || 'APP-00127' || '$$' ||
															 V_DSSUBGRU || '$$' ||
															 V_DSSERVICOCIAFILI || '$$' ||
															 V_SGCLASSE || '$$' ||
															 V_CDMANCIA || '$$' ||
															 V_DSMANUAL || '$$' ||
															 TO_CHAR(V_QTPAXREF)    || '$$' ||
															 V_VOO || '$$' ||
															 V_DATA
															 || 'APPERRMSGEND',
															 P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
									V_NRORDEMERROS := V_NRORDEMERROS + 1;
								END IF;
							END IF;
							IF CUR_SUBGRUPOS.IDPROPSUBSEMAM = '4' THEN
								IF CUR_SUBGRUPOS.QTPROPSUBSEMAM > 0 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;
							END IF;
							
							IF CUR_SUBGRUPOS.IDPROPSUBSEMAM = '5' THEN                        
								V_QTSUBGRUPO := NVL(CUR_SUBGRUPOS.QTPROPSUBSEMAM, 0);
							END IF;

							DETERMINA_TIPOPROD(P_CDFILIAL, V_CDCIA, V_CDMANCIA, V_NRSERVICOCIAFILI, V_CDCLASSE, V_CDSUBGRU, V_NRSEQSUBGRUSEMAM, P_NRORG, V_NRTIPOPROD);

							/*Se tipo de producao estiver vazio*/
							IF V_NRTIPOPROD IS NULL THEN
							  
							  /*Nao ha tipo de producao cadastrado para a unidade informada no ciclo [IDCICLO] do subgrupo [SUBGRUPO] do servico [SERVICO] da classe [CLASSE] do menu grid [CODMENU] - [MENU] da companhia [COMPANHIA] na data [DATA]*/
							  INSERE_LISTA_ERROS(P_CDFILIAL,
														'APPERRMSGSTR' || 'APP-00XXX' || '$$' ||														
														V_IDCICLO || '$$' ||
													   V_DSSUBGRU || '$$' ||
													   V_DSSERVICOCIAFILI || '$$' ||
													   V_SGCLASSE || '$$' ||
													   V_CDMANCIA || '$$' ||
													   V_DSMANUAL || '$$' ||
													   V_SGCIA    || '$$' ||
													   V_DATA
														|| 'APPERRMSGEND',
														P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
							  V_NRORDEMERROS := V_NRORDEMERROS + 1;
																  
							END IF;

							/*Somente insere os produtos dos subgrupos se a data de atendimento estiver no periodo*/
							IF V_DTDATA <= P_DATAFIN THEN							
								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 = V_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
									DBMS_OUTPUT.PUT_LINE('Produto: ' || CUR_PRODUTOS.CDPRODUTO);
									INSERE_INSUMOS_PREVCONSINF(V_NRPREVCONSINF, CUR_PRODUTOS.CDPRODUTO, CUR_PRODUTOS.QTPRODUTO,
																		V_DTDATA, V_DTDATA, P_CDFILIAL, V_CDCIA, V_NRVOO, V_CDTRECHO, V_NRSERVICOCIAFILIPRECO,
																		V_CDMANCIA, V_NRSERVICOCIAFILI, V_CDCLASSE, V_CDSUBGRU, V_NRSEQSUBGRUSEMAM,
																		V_CDCICLO, V_NRTIPOPROD, V_NRTIPONEGOCIOINF,
																		NULL, NULL, NULL,
																		NULL, NULL, NULL, NULL,
																		P_CDOPERADOR, P_NRORG);
								END LOOP;
							END IF;


							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 = V_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
								/*Classifica receita, valida inconsistencias, insere em checklists*/
								PROCESSA_RECEITA(CUR_RECEITAS.CDRECEITA, CUR_RECEITAS.QTRECEITA, 
													  NULL, NULL, NULL, NULL, NULL, 
													  NULL,
													  NULL, NULL, NULL, NULL);
							END LOOP;
						END LOOP; /*---Fim loop de subgrupos*/

						/*Se o item esta planejado mas nao possui subgrupos vinculados*/
						IF V_NUM_SUBGRUPOS = 0 THEN
							/*Item de Faturamento [DSSERVICOCIAFILI] da classe [SGCLASSE] DO ciclo [IDCICLO] do voo [VOO] na data [DATA] nao esta vinculado a subgrupos vigentes*/
							INSERE_LISTA_ERROS(P_CDFILIAL, 'APPERRMSGSTR' || 'APP-00146' || '$$' ||
																	  V_DSSERVICOCIAFILIPRECO || '$$' ||
																	  V_SGCLASSE || '$$' ||
																	  V_IDCICLO || '$$' ||
																	  V_VOO || '$$' ||
																	  V_DATA
																	  || 'APPERRMSGEND',
																	  P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
							V_NRORDEMERROS := V_NRORDEMERROS + 1;
						END IF;

					END LOOP; /*---Fim loop de itens de faturamento*/  
				END LOOP; /*---Fim loop de classes*/  
			END LOOP; /*---Fim loop de voos*/  
		END LOOP; /*---Fim loop de companhias*/      
	END LOOP; /*---Fim loop de data*/

	SELECT COUNT(1)
	  INTO V_EXISTE_INSUMO
	  FROM INSUMOPREVCONSINF
	 WHERE NRPREVCONSINF = V_NRPREVCONSINF;

	IF V_EXISTE_INSUMO = 0 THEN
	   /*Nao ha insumos planejados para o periodo informado.*/
		INSERE_LISTA_ERROS(P_CDFILIAL, 'APPERRMSGSTR' || 'APP-00178' || 'APPERRMSGEND',
							    P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);	   
	END IF;
END;
/