class FaturamentoFatkAmbRN extends AbstractFatDebugLogEnableRN {

	@SuppressWarnings("PMD.ExcessiveMethodLength")
	@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
	public void rnFatpEncAmbNew(Boolean pPrevia, Date pCpeDtFim, final AghJobDetail log, String nomeMicrocomputador, final Date dataFimVinculoServidor) throws BaseException {
		
		//-- DAOs 
		FatCompetenciaDAO competenciaDAO = getFatCompetenciaDAO();
		FatEspelhoProcedAmbDAO espelhoProcedAmbDAO = getFatEspelhoProcedAmbDAO();
		FatArqEspelhoProcedAmbDAO arqEspelhoProcedAmbDAO = getFatArqEspelhoProcedAmbDAO();
		
		List<FatCompetencia> listaCompetencias = competenciaDAO.obterCompetenciasPorModuloESituacoes(
				DominioModuloCompetencia.AMB, DominioSituacaoCompetencia.A);
		
		if (listaCompetencias.isEmpty()) {
			throw new ApplicationBusinessException(FaturamentoFatkAmbRNExceptionCode.MSG_NAO_ENCONTROU_COMPETENCIA);
		}
		
		FatCompetencia competenciaAmb = listaCompetencias.get(0);
		
	
	   /* TODO APAC FORA DO ESCOPO
	    * 
	    * listaCompetencias = competenciaDAO.obterCompetenciasPorModuloESituacoes(
				DominioModuloCompetencia.APAC, DominioSituacaoCompetencia.A);
		
		if (listaCompetencias.isEmpty()) {
			throw new ApplicationBusinessException(FaturamentoFatkAmbRNExceptionCode.MSG_NAO_ENCONTROU_COMPETENCIA);
		}
		
		FatCompetencia competenciaApac = listaCompetencias.get(0);*/
	
	
		//aghp_grava_mensagem ('Início Processo Enc/Prévia BPA/BPI'
        //,'fat_log_enc_previa.txt','N');
		//logar("Início Processo Enc/Prévia BPA/BPI, fat_log_enc_previa.txt, N");
		
		arqEspelhoProcedAmbDAO.removeArqEspelhoProcedAmb(competenciaAmb.getId().getDtHrInicio(), 
				competenciaAmb.getId().getAno(), competenciaAmb.getId().getMes(), DominioModuloCompetencia.AMB, null);
		
		espelhoProcedAmbDAO.removeEspelhoProcedAmb(competenciaAmb.getId().getDtHrInicio(), 
				competenciaAmb.getId().getAno(), competenciaAmb.getId().getMes(), DominioModuloCompetencia.AMB, null);
		
		//  -- executa carga do banco de sangue
		fatpCargaAbsAmb(pCpeDtFim, nomeMicrocomputador, dataFimVinculoServidor); //--JRS(13/11/2000)
		getSchedulerFacade().adicionarLog(log, "##### AGHU - Execução do processo de carga ABS OK!");
		logDebug("Chamando Clear carga ABS");
		getFaturamentoFacade().clear();
		logDebug("Fim Clear carga ABS");

		//-- executa carga triagens
		fatpCargaTriagens(pCpeDtFim, nomeMicrocomputador, dataFimVinculoServidor);
		getSchedulerFacade().adicionarLog(log, "##### AGHU - Execução do processo de carga Triagens OK!");
		logDebug("Chamando Clear carga Triagens");
		getFaturamentoFacade().clear();
		logDebug("Fim Clear carga Triagens");
		
		//-- executa carga dos procedimentos oriundos das triagens emergência
		fatpCargaProcTrg(pCpeDtFim, nomeMicrocomputador, dataFimVinculoServidor);
		getSchedulerFacade().adicionarLog(log, "##### AGHU - Execução carga procedimentos Triagens Emrg. OK!");
		logDebug("Chamando Clear carga Triagens Emrg.");
		getFaturamentoFacade().clear();
		logDebug("Fim Clear carga Triagens Emrg.");
		
		//-- executa carga coleta de redome -- Milena outubro/2006
		fatpCargaColetaRD(pCpeDtFim, nomeMicrocomputador, dataFimVinculoServidor);
		getSchedulerFacade().adicionarLog(log, "##### AGHU - Execução carga coleta de redome OK!");
		logDebug("Chamando Clear carga redome");
		getFaturamentoFacade().clear();
		logDebug("Fim Clear carga redome");
		
		//-- Alterado para gerar journal quando rotina de apac somente nas prévias
		//-- de final de semana e no encerramento. Milena agosto/2003
//		atribuirContextoSessao(FATK_PMR_RN_V_PMR_JOURNAL, Boolean.TRUE);
		
//		LocalDateTime dt = new LocalDateTime(new Date());
		
//		if (pPrevia && 
//			dt.dayOfWeek().get() != DateTimeConstants.SUNDAY   &&
//			dt.dayOfWeek().get() != DateTimeConstants.SATURDAY &&
//			dt.dayOfWeek().get() != DateTimeConstants.MONDAY) {
//			atribuirContextoSessao(FATK_PMR_RN_V_PMR_JOURNAL, Boolean.FALSE);
//		}
		
		/** 
		 *  TODO APAC está fora do escopo de desenvolvimento em 27/12/2011, ao se desenvolver tal escopo, descomentar tal código
		 */ 
		/*
		if (!pPrevia) {
			//-- -------------------------------------------------------------
			//-- Não encerrar BPA se apap, apan e APAC não estiver encerrada
			//-- -------------------------------------------------------------
			

			FatCompetencia competenciaApap = competenciaDAO.obterCompetenciaModuloMesAno(
					DominioModuloCompetencia.APAP, competenciaAmb.getId().getMes(), competenciaAmb.getId().getAno());
			
			if (competenciaApap == null) {
				throw new ApplicationBusinessException(FaturamentoFatkAmbRNExceptionCode.MSG_NAO_ENCONTROU_COMPETENCIA);
			}
			
			FatCompetencia competenciaApac2 = competenciaDAO.obterCompetenciaModuloMesAno(
					DominioModuloCompetencia.APAC, competenciaAmb.getId().getMes(), competenciaAmb.getId().getAno());
			
			if (competenciaApac2 == null) {
				throw new ApplicationBusinessException(FaturamentoFatkAmbRNExceptionCode.MSG_NAO_ENCONTROU_COMPETENCIA);
			}
			
			FatCompetencia competenciaApan = competenciaDAO.obterCompetenciaModuloMesAno(
					DominioModuloCompetencia.APAN, competenciaAmb.getId().getMes(), competenciaAmb.getId().getAno());
			
			if (competenciaApan == null) {
				throw new ApplicationBusinessException(FaturamentoFatkAmbRNExceptionCode.MSG_NAO_ENCONTROU_COMPETENCIA);
			}
			
			//-- IF reg_comp_apap.ind_situacao = 'A' THEN
			//-- Milena maio/2004 - não pode testar 'A', porque no início do processamento é
			//-- alterada para 'M' e se houver cancelamento, fica 'M'. Se término OK, fica 'P'
			
			if (!competenciaApap.getIndSituacao().equals(DominioSituacaoCompetencia.P)) {
				logar("Execução do processo de encerramento/prévia BPA CANCELADO! APAP AINDA NÃO FOI ENCERRADA, fat_log_enc_previa.txt");
				throw new ApplicationBusinessException(FaturamentoFatkAmbRNExceptionCode.MSG_MODULO_AMB_ENCERRADO_ANTES_APAP);
			}

			if (!competenciaApac2.getIndSituacao().equals(DominioSituacaoCompetencia.P)) {
				logar("Execução do processo de encerramento/prévia BPA CANCELADO! APAC AINDA NÃO FOI ENCERRADA, fat_log_enc_previa.txt");
				throw new ApplicationBusinessException(FaturamentoFatkAmbRNExceptionCode.MSG_MODULO_AMB_ENCERRADO_ANTES_APAC);
			}
			
			if (!competenciaApan.getIndSituacao().equals(DominioSituacaoCompetencia.P)) {
				logar("Execução do processo de encerramento/prévia BPA CANCELADO! APAN AINDA NÃO FOI ENCERRADA, fat_log_enc_previa.txt");
				throw new ApplicationBusinessException(FaturamentoFatkAmbRNExceptionCode.MSG_MODULO_AMB_ENCERRADO_ANTES_APAN);
			}
		}
		*/
		
		//ALTERAÇÃO REALIZADA PARA MELHORAR A PERFORMANCE DO AGENDAMENTO DO ENCERRAMENTO DO FATURAMENTO DE AMBULATÓRIO
		//SEGUNDO A MILENA A GRAVAÇÃO DA JOURNAL NÃO PRECISA ACONTECER DURANTE O PROCESSAMENTO DO BPA/BPI, 
		//atribuirContextoSessao(VariaveisSessaoEnum.FATK_PMR_RN_V_PMR_JOURNAL,Boolean.FALSE);
		
		// Ney 18/02/2013 
		// Atualiza exames de pré transplantes para serem cobrados dentro de um único código de procedimentos.
		getFaturamentoAtualizaExamesPreTransplantesRN().atualizaPmrKitsPre(competenciaAmb, nomeMicrocomputador, dataFimVinculoServidor);
		
		
		getFaturamentoFatkPmrRN().geraEspelhoFaturamentoAmbulatorio(competenciaAmb, pCpeDtFim, pPrevia, log, nomeMicrocomputador, dataFimVinculoServidor);
		logar("Execução dos processos de encerramento/prévia BPA OK!, fat_log_enc_previa.txt");
		
		// executa encerramento de ambulatorio
		
		//-- CFV(02/04/2001) - Atualiza competencia para faturada e apresentada(amb)

		if (!pPrevia) {
			/**
			 * TODO APAC fora do escopo
			 */
			//-- altera pmr para situacao 'P' a partir da fat_itens_conta_apac - Milena set/2002
			/*getFaturamentoFatkPmrRN().rnPmrpAtuEncPmr(DominioModuloFatContaApac.APAC, 
					competenciaApac.getId().getDtHrInicio(), 
					competenciaApac.getId().getMes().byteValue(),
					competenciaApac.getId().getAno().shortValue(), 
					pPrevia);*/
			listaCompetencias = competenciaDAO.obterCompetenciasPorModuloESituacoes(
					DominioModuloCompetencia.AMB, DominioSituacaoCompetencia.M);
			
			if (listaCompetencias.isEmpty()) {
				throw new ApplicationBusinessException(FaturamentoFatkAmbRNExceptionCode.MSG_NAO_ENCONTROU_COMPETENCIA);
			}
			
			competenciaAmb = listaCompetencias.get(0);
			
			//UserTransaction userTransaction = obterUserTransaction(null);
			if (!getFaturamentoFatkCpeRN().rnCpecAtuFaturado(competenciaAmb)) { //--se erro na funcao
				logar("Nao atualizou comp AMB p/ faturada e apres. ! fat_log_enc_previa.txt");
			}
			//commitUserTransaction(userTransaction);			
		}
	}

}