class FaturamentoFatkInterfaceAacRN extends AbstractFatDebugLogEnableRN {

	@SuppressWarnings("PMD.ExcessiveMethodLength")
	public void atualizarFaturamentoProcedimentoConsulta(Integer conNumero, Integer phiSeq, Short quantidade, AacRetornos retorno, String nomeMicrocomputador, final Date dataFimVinculoServidor)
			throws BaseException {

		Boolean fatura = false;
		AacRetornos vRetorno = null;
		FatCompetencia competencia = null;
		IFaturamentoFacade faturamentoFacade = getFaturamentoFacade();

		List<FatCompetencia> listaCompetencias = getVerificacaoFaturamentoSusRN().obterCompetenciasAbertasNaoFaturadasPorModulo(
				MODULO_COMPETENCIA_AMB);

		if (!listaCompetencias.isEmpty()) {
			competencia = listaCompetencias.get(0);
		}

		if (retorno != null) {
			vRetorno = getAmbulatorioFacade().obterDescricaoRetornoPorCodigo(retorno.getSeq());
			if (vRetorno != null) {
				fatura = vRetorno.getFaturaSus();
			}
		} else {
			vRetorno = getAmbulatorioFacade().obterDescricaoRetornoPorCodigo(DominioSituacaoAtendimento.PACIENTE_ATENDIDO.getCodigo());
			if (vRetorno != null) {
				fatura = vRetorno.getFaturaSus();
			}
		}

		if (!fatura) {
			if (phiSeq == null) {
				FatProcedAmbRealizadoDAO fatProcedAmbRealizadoDAO = getFatProcedAmbRealizadoDAO();
				List<FatProcedAmbRealizado> listaProcedAmbRealizados = fatProcedAmbRealizadoDAO
						.listarProcedAmbRealizadoOrigemConsultaPorNumeroConsulta(conNumero);

				for (FatProcedAmbRealizado procedAmbRealizado : listaProcedAmbRealizados) {
					FatProcedAmbRealizado oldAmbRealizado = faturamentoFacade.clonarFatProcedAmbRealizado(procedAmbRealizado);

					procedAmbRealizado.setSituacao(DominioSituacaoProcedimentoAmbulatorio.CANCELADO);
					procedAmbRealizado.setAlteradoEm(new Date());
					faturamentoFacade.atualizarProcedimentosAmbulatoriaisRealizados(procedAmbRealizado, oldAmbRealizado, nomeMicrocomputador, dataFimVinculoServidor);
				}
			} else {
				FatProcedAmbRealizadoDAO fatProcedAmbRealizadoDAO = getFatProcedAmbRealizadoDAO();
				List<FatProcedAmbRealizado> listaProcedAmbRealizados = fatProcedAmbRealizadoDAO
						.listarProcedAmbRealizadoOrigemConsultaPorNumeroConsultaEPhiSeq(conNumero, phiSeq);

				for (FatProcedAmbRealizado procedAmbRealizado : listaProcedAmbRealizados) {
					FatProcedAmbRealizado oldAmbRealizado = faturamentoFacade.clonarFatProcedAmbRealizado(procedAmbRealizado);

					procedAmbRealizado.setSituacao(DominioSituacaoProcedimentoAmbulatorio.CANCELADO);
					procedAmbRealizado.setQuantidade(quantidade);
					procedAmbRealizado.setAlteradoEm(new Date());
					faturamentoFacade.atualizarProcedimentosAmbulatoriaisRealizados(procedAmbRealizado, oldAmbRealizado, nomeMicrocomputador, dataFimVinculoServidor);
				}
			}
		} else {
			if (phiSeq == null) {
				FatProcedAmbRealizadoDAO fatProcedAmbRealizadoDAO = getFatProcedAmbRealizadoDAO();
				List<FatProcedAmbRealizado> listaProcedAmbRealizados = fatProcedAmbRealizadoDAO
						.listarProcedAmbRealizadoOrigemConsultaPorNumeroConsulta(conNumero);

				for (FatProcedAmbRealizado procedAmbRealizado : listaProcedAmbRealizados) {
					FatProcedAmbRealizado oldAmbRealizado = faturamentoFacade.clonarFatProcedAmbRealizado(procedAmbRealizado);
					procedAmbRealizado.setSituacao(DominioSituacaoProcedimentoAmbulatorio.ABERTO);
					procedAmbRealizado.setFatCompetencia(competencia);
					procedAmbRealizado.setAlteradoEm(new Date());
					faturamentoFacade.atualizarProcedimentosAmbulatoriaisRealizados(procedAmbRealizado, oldAmbRealizado, nomeMicrocomputador, dataFimVinculoServidor);
				}
			} else {
				FatProcedAmbRealizadoDAO fatProcedAmbRealizadoDAO = getFatProcedAmbRealizadoDAO();
				Boolean existeProcedimentoConsultaFaturado = false;
				
				List<FatProcedAmbRealizado> listaProcedAmbRealizadosFatPhiSeq = fatProcedAmbRealizadoDAO
						.listarProcedAmbRealizadoOrigemConsultaPorNumeroConsultaEPhiSeq(conNumero, phiSeq);

				if (!listaProcedAmbRealizadosFatPhiSeq.isEmpty()) {
					existeProcedimentoConsultaFaturado = true;
				}

				if (!existeProcedimentoConsultaFaturado) {
					AacConsultas consulta = getAmbulatorioFacade().obterConsulta(conNumero);
					FatProcedHospInternos procedHospInterno = getFatProcedHospInternosDAO().obterPorChavePrimaria(phiSeq);
					AacConsultaProcedHospitalar consultaProcedHospitalar = new AacConsultaProcedHospitalar();
					AacConsultaProcedHospitalarId consultaProcedHospitalarId = new AacConsultaProcedHospitalarId();
					consultaProcedHospitalarId.setConNumero(conNumero);
					consultaProcedHospitalarId.setPhiSeq(phiSeq);
					consultaProcedHospitalar.setId(consultaProcedHospitalarId);
					consultaProcedHospitalar.setQuantidade(quantidade.byteValue());
					consultaProcedHospitalar.setConsultas(consulta);
					consultaProcedHospitalar.setProcedHospInterno(procedHospInterno);
					inserirFaturamentoProcedimentoConsulta(consultaProcedHospitalar, DateUtil.truncaData(new Date()), nomeMicrocomputador, dataFimVinculoServidor);
				}

				List<FatProcedAmbRealizado> listaProcedAmbRealizadosPrhPhiSeq = fatProcedAmbRealizadoDAO
						.listarProcedAmbRealizadoOrigemConsultaPorNumeroConsultaEPhiSeq(conNumero, phiSeq);

				for (FatProcedAmbRealizado procedAmbRealizado : listaProcedAmbRealizadosPrhPhiSeq) {
					FatProcedAmbRealizado oldAmbRealizado = faturamentoFacade.clonarFatProcedAmbRealizado(procedAmbRealizado);

					procedAmbRealizado.setSituacao(DominioSituacaoProcedimentoAmbulatorio.ABERTO);
					procedAmbRealizado.setQuantidade(quantidade);
					procedAmbRealizado.setFatCompetencia(competencia);
					procedAmbRealizado.setAlteradoEm(new Date());
					faturamentoFacade.atualizarProcedimentosAmbulatoriaisRealizados(procedAmbRealizado, oldAmbRealizado, nomeMicrocomputador, dataFimVinculoServidor);
				}
			}
		}
	}

}