package com.ejie.ab63.util;

import java.math.BigInteger;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.ejie.ab63.comun.Constantes;
import com.ejie.ab63.model.Establecimiento;
import com.ejie.ab63.model.Habitacion;
import com.ejie.ab63.model.SalonComedor;
import com.ejie.ab63.model.Suite;
import com.ejie.ab63.model.TercerosEstablecimiento;

import s41.s41CensoIntegracion.RecursoCensoDocument;
import s41.s41CensoIntegracion.RecursoCensoDocument.RecursoCenso;
import s41.s41CensoIntegracion.RecursoCensoDocument.RecursoCenso.Alojamiento;
import s41.s41CensoIntegracion.RecursoCensoDocument.RecursoCenso.Alojamiento.Apartamentos;
import s41.s41CensoIntegracion.RecursoCensoDocument.RecursoCenso.Alojamiento.Categoria;
import s41.s41CensoIntegracion.RecursoCensoDocument.RecursoCenso.Alojamiento.Especialidad;
import s41.s41CensoIntegracion.RecursoCensoDocument.RecursoCenso.Alojamiento.Habitaciones;
import s41.s41CensoIntegracion.RecursoCensoDocument.RecursoCenso.Alojamiento.Modalidad;
import s41.s41CensoIntegracion.RecursoCensoDocument.RecursoCenso.AppOrigen;
import s41.s41CensoIntegracion.RecursoCensoDocument.RecursoCenso.DatosGenerales;
import s41.s41CensoIntegracion.RecursoCensoDocument.RecursoCenso.DatosGenerales.DatosContacto;
import s41.s41CensoIntegracion.RecursoCensoDocument.RecursoCenso.DatosGenerales.Localizacion;
import s41.s41CensoIntegracion.RecursoCensoDocument.RecursoCenso.Negocios;
import s41.s41CensoIntegracion.RecursoCensoDocument.RecursoCenso.Servicios;
import s41.s41CensoIntegracion.RecursoCensoDocument.RecursoCenso.Servicios.Servicio;

/***
 * GenerarPublicacion**
 * 
 */
public class GenerarPublicacion {

	private Establecimiento establecimiento = null;
	private Long idPortalS41 = null;
	private boolean isBaja = false;
	private String tipologia = null;
	private String evento = null;
	private RecursoCensoDocument recursoS41Doc = null;

	/**
	 * The Interface Y85sbITipoRecurso.
	 */
	private interface TipoRecurso {
		public static final String ALOJAMIENTOS = "A1";
		public static final String AGENCIAS_DE_VIAJE = "N3";
	}

	/**
	 * Constructor. Genera automatica el documento
	 *
	 * @param idPortalS41
	 *            Long
	 * @param _isBaja
	 *            boolean
	 * @param establecimientoET
	 *            InstalacionTURET
	 */

	public GenerarPublicacion(Long idPortalS41, boolean _isBaja, Establecimiento establecimiento) {
		this.idPortalS41 = idPortalS41;
		this.isBaja = _isBaja;
		this.establecimiento = establecimiento;
		this.generar();
	}

	/**
	 * Genera el documento
	 *
	 */

	public void generar() {
		this.recursoS41Doc = RecursoCensoDocument.Factory.newInstance();
		RecursoCenso recursoS41 = this.recursoS41Doc.addNewRecursoCenso();
		recursoS41.setAppOrigen(AppOrigen.NB_29);
		DatosGenerales datosGenerales = recursoS41.addNewDatosGenerales();

		String baja = null;
		if (null != establecimiento.getFechaBaja()) {
			baja = establecimiento.getFechaBaja().toString();
		}
		if (this.idPortalS41 == null || this.idPortalS41 == 0) {
			// Es un alta
			recursoS41.setAccion(Constantes.AccionS41.ACCION_ALTA);
			this.tipologia = Constantes.EventTipology.ALTA_RECURSO_TIPOLOGY;
			this.evento = Constantes.EventWhat.ALTA_RECURSO_WHAT;
			if (null != establecimiento.getNumInstalacionAnterior()) {
				datosGenerales.setSignaturaAnterior(establecimiento.getNumInstalacionAnterior());
			} // else {
				// datosGenerales.setSignaturaAnterior("");
				// }
		} else {
			datosGenerales.setCodigo(this.idPortalS41.longValue());
			// El establecimineto existe en S41, es una modificacion o
			// baja
			if ((null != baja && !"".equalsIgnoreCase(baja)) || this.isBaja) {
				// baja
				recursoS41.setAccion(Constantes.AccionS41.ACCION_BAJA);
				this.tipologia = Constantes.EventTipology.BAJA_RECURSO_TIPOLOGY;
				this.evento = Constantes.EventWhat.BAJA_RECURSO_WHAT;
				this.isBaja = true;
			} else {
				// modificación
				recursoS41.setAccion(Constantes.AccionS41.ACCION_MODIFICACION);
				this.tipologia = Constantes.EventTipology.MODIFICACION_RECURSO_TIPOLOGY;
				this.evento = Constantes.EventWhat.MODIFICACION_RECURSO_WHAT;
			}
		}
		datosGenerales.setSignatura(establecimiento.getIdentificadorEstablecimiento());
		String tipoEstablecimiento = establecimiento.getTipoEstablecimiento().getIdTipoEstablecimiento();
		if (Constantes.AGENCIA_VIAJE.equals(tipoEstablecimiento)) {
			datosGenerales.setTipoRecurso(TipoRecurso.AGENCIAS_DE_VIAJE);
		} else {
			datosGenerales.setTipoRecurso(TipoRecurso.ALOJAMIENTOS);
		}
		recursoS41.setFechaHora(UtilDate.formatDate(UtilDate.fechaHoy(), UtilDate.FORMATO_FECHA_HORA));
		if (!this.isBaja) {
			// Nombre
			datosGenerales.setNombre(establecimiento.getDescrNombre());
			// preparar los datos de contacto para generarubicacion y generar
			// contacto
			DatosContacto datosContacto = datosGenerales.addNewDatosContacto();
			// Anyadir la localizacion del establecimiento
			this.generarUbicacion(datosGenerales);
			// Anyadir los datos de contacto
			this.generarContacto(datosContacto);

			if (null != establecimiento.getFechaInicierretemp()) {
				datosGenerales.setFechaInicioCierreTemporal(dateToCalendar(establecimiento.getFechaInicierretemp()));
			} else {
				// datosGenerales.setFechaInicioCierreTemporal(null);
			}
			if (null != establecimiento.getFechaFincierretemp()) {
				datosGenerales.setFechaFinCierreTemporal(dateToCalendar(establecimiento.getFechaFincierretemp()));
			} else {
				// datosGenerales.setFechaFinCierreTemporal(null);
			}

			// Las agencias de viaje se tratan de diferente manera
			if (!Constantes.AGENCIA_VIAJE.equals(tipoEstablecimiento)) {

				recursoS41.setServicios(this.crearListaServicios());

				Alojamiento alojamiento = recursoS41.addNewAlojamiento();
				// alojamiento.setAnnoApertura(null);
				// alojamiento.setAnnoUltimaRenovTotal(null);
				alojamiento.setCapacidad("0");
				if (Constantes.ALBERGUE_TURISTICO.equals(tipoEstablecimiento)
						|| Constantes.HOTEL.equals(tipoEstablecimiento)
						|| Constantes.APARTAMENTO.equals(tipoEstablecimiento)) {
					// alojamiento.setEspecialidad(null);

				}
				String grupo = null;
				if (null != establecimiento.getGrupo()) {
					grupo = establecimiento.getGrupo().getIdGrupo();
				}
				String modalidadStr = null;
				// La modalidad no hay que enviar en el caso de tipo
				// establecimiento a Hotel o Apartamento
				if (null != establecimiento.getModalidad()) {
					modalidadStr = establecimiento.getModalidad().getIdModalidad();
					Modalidad.Enum modalidad = this.toModalidad(tipoEstablecimiento, modalidadStr);
					if (modalidad != null) {
						alojamiento.setModalidad(modalidad);
					}
				}
				// El subtipo Recurso es obligatorio
				Alojamiento.SubtipoRecurso.Enum tipoAlojamiento = this.toTipoAlojamiento(tipoEstablecimiento, grupo,
						modalidadStr);
				if (tipoAlojamiento != null) {
					alojamiento.setSubtipoRecurso(tipoAlojamiento);
				}
				if (null != establecimiento.getCategoria().getIdCategorias()) {
					Categoria.Enum categoria = this.toCategoria(tipoEstablecimiento,
							establecimiento.getCategoria().getIdCategorias(), modalidadStr);
					if (categoria != null) {
						alojamiento.setCategoria(categoria);
					}
				}
				if (alojamiento.getCategoria() == null) {
					alojamiento.setCategoria(Constantes.CategoriaS41.SIN_CATEGORIA);
				}
				if (null != establecimiento.getEspecialidad()) {
					Especialidad.Enum especialidad = this.toEspecialidad(tipoEstablecimiento,
							establecimiento.getEspecialidad().getIdEspecialidad());
					if (especialidad != null) {
						alojamiento.setEspecialidad(especialidad);
					}
				}
				String capacidad = String.valueOf(establecimiento.getEstablecimientoData().getNumPlazas());
				if (capacidad != null) {
					alojamiento.setCapacidad(capacidad);
				}
				if (!Constantes.TipoEstablecimiento.ESTABLECIMIENTO_CAMPING.equals(tipoEstablecimiento)
						&& !Constantes.TipoEstablecimiento.ESTABLECIMIENTO_APARTAMENTO.equals(tipoEstablecimiento)) {
					Habitaciones habitaciones = this.crearHabitaciones();
					if (habitaciones != null) {
						alojamiento.setHabitaciones(habitaciones);
					}
				}
				this.generarNombrePersonaContacto(alojamiento);
				if (null != establecimiento.getFechaApertura()) {
					alojamiento.setAnnoApertura(BigInteger.valueOf(this.getAnyos(establecimiento.getFechaApertura())));
				}
				if (null != establecimiento.getEstablecimientoData().getFechaAnoRenovacion()
						&& 0 != establecimiento.getEstablecimientoData().getFechaAnoRenovacion()) {
					alojamiento.setAnnoUltimaRenovTotal(
							BigInteger.valueOf(establecimiento.getEstablecimientoData().getFechaAnoRenovacion()));
				}
				Apartamentos apartamentos = this.crearApartamentos();
				if (apartamentos != null) {
					alojamiento.setApartamentos(apartamentos);
				}
				llenarNodosVaciosOpcionales(recursoS41, tipoEstablecimiento);
			} else {
				Negocios negocios = recursoS41.addNewNegocios();
				// la informacion tecnica es obligatoria

				if (null != establecimiento.getAgenciaData() && null != establecimiento.getAgenciaData().getNumCie()) {
					negocios.setCi(establecimiento.getAgenciaData().getNumCie());
				} else {
					// negocios.setCi("");
				}

				// El grupo es obligatorio

				Negocios.SubtipoRecurso.Enum subtipoRecursoAgencias = this
						.toSubtipoRecursoAgencias(establecimiento.getGrupo().getIdGrupo());
				if (subtipoRecursoAgencias != null) {
					negocios.setSubtipoRecurso(subtipoRecursoAgencias);
				}

				// La modalidad es obligatoria
				Negocios.Modalidad.Enum modalidadAgencias = this
						.toModalidadAgencias(establecimiento.getModalidad().getIdModalidad());
				if (modalidadAgencias != null) {
					negocios.setModalidad(modalidadAgencias);
				}
			}
		}
	}

	/**
	 * Llenar los nodos vacios, para el tratamiento por parte de S41 de la
	 * publicación
	 *
	 * @param RecursoCenso
	 *            recursoS41
	 */
	private void llenarNodosVaciosOpcionales(RecursoCenso recursoS41, String tipoEstablecimiento) {

		Alojamiento alojamiento = recursoS41.getAlojamiento();
		if (!Constantes.TipoEstablecimiento.ESTABLECIMIENTO_CAMPING.equals(tipoEstablecimiento)
				&& !Constantes.TipoEstablecimiento.ESTABLECIMIENTO_APARTAMENTO.equals(tipoEstablecimiento)) {
			Habitaciones habitacion = null;
			if (!alojamiento.isSetHabitaciones()) {
				habitacion = Habitaciones.Factory.newInstance();
			} else {
				habitacion = alojamiento.getHabitaciones();
			}
			if (!habitacion.isSetNumHabDobles()) {
				habitacion.setNumHabDobles(BigInteger.valueOf(0));
			}
			if (!habitacion.isSetNumHabIndividuales()) {
				habitacion.setNumHabIndividuales(BigInteger.valueOf(0));
			}
			if (!habitacion.isSetNumHabSalon()) {
				habitacion.setNumHabSalon(BigInteger.valueOf(0));
			}

			if (Constantes.TipoEstablecimiento.ESTABLECIMIENTO_HOTEL.equals(tipoEstablecimiento)) {
				if (!habitacion.isSetNumHabSuite()) {
					habitacion.setNumHabSuite(BigInteger.valueOf(0));
				}

			}
			if (Constantes.TipoEstablecimiento.ESTABLECIMIENTO_ALBERGUE.equals(tipoEstablecimiento)) {
				if (!habitacion.isSetNumHabHasta4Plazas()) {
					habitacion.setNumHabHasta4Plazas(BigInteger.valueOf(0));
				}

				if (!habitacion.isSetNumHabMas4Plazas()) {
					habitacion.setNumHabMas4Plazas(BigInteger.valueOf(0));
				}
			}

		}

		if (!Constantes.TipoEstablecimiento.ESTABLECIMIENTO_CAMPING.equals(tipoEstablecimiento)) {
			Apartamentos apartamento = null;
			if (!alojamiento.isSetApartamentos()) {
				apartamento = Apartamentos.Factory.newInstance();
			} else {
				apartamento = alojamiento.getApartamentos();
			}
			if (!apartamento.isSetNumApartamentos1Plaza()) {
				apartamento.setNumApartamentos1Plaza(BigInteger.valueOf(0));
			}
			if (!apartamento.isSetNumApartamentos2Plazas()) {
				apartamento.setNumApartamentos2Plazas(BigInteger.valueOf(0));
			}
			if (!apartamento.isSetNumApartamentos3Plazas()) {
				apartamento.setNumApartamentos3Plazas(BigInteger.valueOf(0));
			}
			if (!apartamento.isSetNumApartamentos4Plazas()) {
				apartamento.setNumApartamentos4Plazas(BigInteger.valueOf(0));
			}
			if (!apartamento.isSetNumApartamentos5Plazas()) {
				apartamento.setNumApartamentos5Plazas(BigInteger.valueOf(0));
			}
			if (!apartamento.isSetNumApartamentosMas5Plazas()) {
				apartamento.setNumApartamentosMas5Plazas(BigInteger.valueOf(0));
			}
		}
	}

	/**
	 * Crea la lista de servicios de albergues
	 *
	 * @param servicios
	 *            Servicios
	 */
	private void crearListaServiciosAL(Servicios servicios) {
		Servicio servicio = servicios.addNewServicio();
		servicio.setCodigo(Constantes.ServiciosS41.CAMINO_SANTIAGO);
		servicio.setValor(toServiciosValor(Constantes.NO_INT));
		if (null != establecimiento.getEspecialidad()
				&& null != establecimiento.getEspecialidad().getIdEspecialidad()) {
			String especialidad = establecimiento.getEspecialidad().getIdEspecialidad();
			if (Constantes.TiposEspecialidades.ALBERGUE_CAMINO_SANTIAGO.equals(especialidad)) {
				servicio.setValor(this.toServiciosValor(Constantes.SI_INT));
			}
		}
		this.crearServiciosEspecificos(servicios);

	}

	/**
	 * Crea la lista de servicios de Casas rurales y agruturismos
	 *
	 * @param servicios
	 *            Servicios
	 */

	private void crearListaServiciosCRAG(Servicios servicios) {
		if (null != establecimiento.getModalidad()) {
			String modalidad = establecimiento.getModalidad().getIdModalidad();
			Servicio servicio = servicios.addNewServicio();
			servicio.setCodigo(Constantes.ServiciosS41.ALQUILER_CASA_ENTERA);
			if (Constantes.Modalidades.HABITACIONES_DEPENDENCIAS_CEDIDAS.equals(modalidad)
					|| Constantes.Modalidades.DEPENDENCIAS_CEDIDAS.equals(modalidad)) {
				servicio.setValor(this.toServiciosValor(Constantes.SI_INT));
			} else {
				servicio.setValor(this.toServiciosValor(Constantes.SI_INT));
			}
		}

		this.crearServiciosEspecificos(servicios);
	}

	/**
	 * Crea la lista de servicios específicos
	 *
	 * @param servicios
	 *            Servicios
	 */
	private void crearServiciosEspecificos(Servicios servicios) {
		Servicio servicioCoc = servicios.addNewServicio();
		servicioCoc.setCodigo(Constantes.ServiciosS41.DERECHO_A_COCINA);
		Servicio servicioCom = servicios.addNewServicio();
		servicioCoc.setValor(this.toServiciosValor(Constantes.NO_INT));
		servicioCom.setCodigo(Constantes.ServiciosS41.SERVICIO_DE_COMEDOR);
		servicioCom.setValor(this.toServiciosValor(Constantes.NO_INT));
		Servicio servicioHis = servicios.addNewServicio();
		servicioHis.setCodigo(Constantes.ServiciosS41.EDIFICIO_HISTORICO);
		servicioHis.setValor(this.toServiciosValor(Constantes.NO_INT));
		if (null != establecimiento.getEstablecimientoData()) {
			Servicio.Valor.Enum valor = this
					.toServiciosValor(establecimiento.getEstablecimientoData().getDerechoCocina());
			if (valor != null) {
				servicioCoc.setValor(valor);
			}
			Servicio.Valor.Enum valorComedor = this
					.toServiciosValor(establecimiento.getEstablecimientoData().getServicioComedor());
			if (valor != null) {
				servicioCom.setValor(valorComedor);
			}
			Servicio.Valor.Enum valorCatalogado = this
					.toServiciosValor(establecimiento.getEstablecimientoData().getEdificioCatalogado());
			if (valor != null) {
				servicioHis.setValor(valorCatalogado);
			}
		}
	}

	/**
	 * Crea una lista de servicios para S41 a partir de los datos tecnicos del
	 * establecimiento
	 *
	 * Dentro de los datos de servicios, nodo servicio, se incluirán las
	 * siguientes opciones, por ser las únicas disponibles en NB29:
	 *
	 * c) Derecho a cocina (En las secciones correspondientes)
	 *
	 * d) Servicio de comedor (En las secciones correspondientes)
	 *
	 * @return Servicios
	 */

	private Servicios crearListaServicios() {
		Servicios servicios = Servicios.Factory.newInstance();
		String tipoEstablecimiento = establecimiento.getTipoEstablecimiento().getIdTipoEstablecimiento();
		if (Constantes.ALBERGUE_TURISTICO.equals(tipoEstablecimiento)) {
			this.crearListaServiciosAL(servicios);
		} else if (Constantes.CASA_RURAL.equals(tipoEstablecimiento)
				|| Constantes.AGROTURISMO.equals(tipoEstablecimiento)) {
			this.crearListaServiciosCRAG(servicios);
		} else if (Constantes.HOTEL.equals(tipoEstablecimiento)) {
			this.crearListaServiciosHT(servicios);
		} else if (Constantes.APARTAMENTO.equals(tipoEstablecimiento)) {
			this.crearListaServiciosAS(servicios);
		} else if (Constantes.CAMPING.equals(tipoEstablecimiento)) {
			this.crearListaServiciosCP(servicios);
		}
		// COMUN PARA TODAS LAS TIPOLOGÍAS:
		// Si existe registro en tabla Y85BTURT27 con el campo TUR27_ID_TIPO=B ó
		if (!Constantes.AGENCIA_VIAJE.equals(tipoEstablecimiento)) {
			Servicio servicio = servicios.addNewServicio();
			servicio.setCodigo(Constantes.ServiciosS41.SALON_SOCIAL);
			servicio.setValor(this.toServiciosValor(Constantes.NO_INT));

			List<SalonComedor> listaSalonesComedor = establecimiento.getEstablecimientoData().getListSalonComedor();
			Map<String, Integer> numeroSalonesComedor = this.obtenerNumeroEspComunHM(listaSalonesComedor);
			int numSalonesComedor = numeroSalonesComedor.get(Constantes.TipoEspacio.SALON_COMEDOR).intValue()
					+ numeroSalonesComedor.get(Constantes.TipoEspacio.SALON).intValue();
			if (numSalonesComedor > 0) {
				servicio.setValor(this.toServiciosValor(Constantes.SI_INT));
			}
		}
		if (servicios.sizeOfServicioArray() == 0) {
			// Si no se creo ningun servicio, se retorna null
			servicios = null;
		}
		return servicios;
	}

	/**
	 * Genera los datos de la ubicacion para el evento de publicacion
	 *
	 * @param datosGenerales
	 *            DatosGenerales
	 */

	private void generarUbicacion(DatosGenerales datosGenerales) {

		if (establecimiento.getDatosDirecciones() != null) {
			Localizacion localizacion = datosGenerales.addNewLocalizacion();
			localizacion.setCodigoProvincia(establecimiento.getDatosDirecciones().getIdProvinciaPad());
			localizacion.setCodigoMunicipio(establecimiento.getDatosDirecciones().getIdMunicipioPad());

			if (null != establecimiento.getDatosDirecciones().getCodigoPostal()
					&& "".equalsIgnoreCase(establecimiento.getDatosDirecciones().getCodigoPostal())) {
				datosGenerales.getDatosContacto()
						.setCodigoPostal(establecimiento.getDatosDirecciones().getCodigoPostal());
			} else {
				// datosGenerales.getDatosContacto().setCodigoPostal("");
			}
			if (null != establecimiento.getDatosDirecciones().getDireccionCompuesta()
					&& !"".equalsIgnoreCase(establecimiento.getDatosDirecciones().getDireccionCompuesta())) {
				datosGenerales.getDatosContacto()
						.setDireccion(establecimiento.getDatosDirecciones().getDireccionCompuesta());
			}
		}
	}

	/**
	 * Genera los datos de contacto
	 *
	 * @param datosContacto
	 *            DatosContacto
	 */

	private void generarContacto(DatosContacto datosContacto) {

		// datosContacto.setNumeroFax("");
		// datosContacto.setNumeroTelefono("");
		// datosContacto.setNumeroTelefono2("");
		// datosContacto.setEmail("");
		// datosContacto.setPaginaWeb("");
		if (null != establecimiento.getDatosTerceros()) {
			if (null != establecimiento.getDatosTerceros().getTelefono()) {
				datosContacto.setNumeroTelefono(establecimiento.getDatosTerceros().getTelefono().toString());
			}
			if (null != establecimiento.getDatosTerceros().getEmail()
					&& !"".equalsIgnoreCase(establecimiento.getDatosTerceros().getEmail())) {
				datosContacto.setEmail(establecimiento.getDatosTerceros().getEmail());
			}
		}
		if (null != establecimiento.getUrlweb()) {
			datosContacto.setPaginaWeb(establecimiento.getUrlweb());
		}
	}

	/**
	 * Generar nombre persona contacto.
	 *
	 * @param alojamiento
	 *            the alojamiento
	 */
	private void generarNombrePersonaContacto(Alojamiento alojamiento) {
		TercerosEstablecimiento contacto = this.obtenerTipoInteresadoActual(
				establecimiento.getListTercerosEstablecimiento(), Constantes.TiposInteresado.PERSONA_CONTACTO);
		alojamiento.setNombrePersonaContacto("");
		if (contacto == null) {
			// si no tiene persona de contacto se utiliza el titular
			contacto = this.obtenerTipoInteresadoActual(establecimiento.getListTercerosEstablecimiento(),
					Constantes.TiposInteresado.TITULAR);
		}
		if (contacto != null) {
			alojamiento.setNombrePersonaContacto(contacto.getDatosTerceros().getNombreCompuesto());
		}
	}

	/**
	 * Crea los datos de los habitaciones para S41 a partir de los datos
	 * tecnicos del establecimiento
	 *
	 */

	private Habitaciones crearHabitaciones() {
		Habitaciones habitaciones = null;

		Map<String, Integer> mapNumeroHabitaciones = this.obtenerNumeroHabitacionesTipo(establecimiento);
		habitaciones = Habitaciones.Factory.newInstance();
		int numIndividuales = ((Integer) mapNumeroHabitaciones.get(Constantes.TiposHabitacion.INDIVIDUAL));
		habitaciones.setNumHabIndividuales(BigInteger.valueOf(numIndividuales));
		int numDobles = ((Integer) mapNumeroHabitaciones.get(Constantes.TiposHabitacion.DOBLE));
		habitaciones.setNumHabDobles(BigInteger.valueOf(numDobles));
		int numDoblesSalon = ((Integer) mapNumeroHabitaciones.get(Constantes.TiposHabitacion.DOBLE_SALON));
		habitaciones.setNumHabSalon(BigInteger.valueOf(numDoblesSalon));

		if (Constantes.TipoEstablecimiento.ESTABLECIMIENTO_HOTEL
				.equals(establecimiento.getTipoEstablecimiento().getIdTipoEstablecimiento())) {
			int numSuites = 0;
			List<Suite> listaSuites = establecimiento.getEstablecimientoData().getListSuite();
			for (Suite suite : listaSuites) {
				numSuites = (int) (numSuites + suite.getNumUnidades());
			}
			habitaciones.setNumHabSuite(BigInteger.valueOf(numSuites));
		} else if (Constantes.TipoEstablecimiento.ESTABLECIMIENTO_ALBERGUE
				.equals(establecimiento.getTipoEstablecimiento().getIdTipoEstablecimiento())) {
			Map<String, Integer> mapNumeroHabitacionesAL = this
					.obtenerHabMIM4(establecimiento.getEstablecimientoData().getListHabitacion());
			int numHabHasta4Plazas = mapNumeroHabitacionesAL.get(Constantes.HabitacionAL.MENOR4).intValue();
			habitaciones.setNumHabHasta4Plazas(BigInteger.valueOf(numHabHasta4Plazas));
			int numHabMas4Plazas = mapNumeroHabitacionesAL.get(Constantes.HabitacionAL.MAYOR3).intValue();
			habitaciones.setNumHabMas4Plazas(BigInteger.valueOf(numHabMas4Plazas));

		}
		return habitaciones;
	}

	/**
	 * Crea los datos de los apartamentos para S41 a partir de los datos
	 * tecnicos del establecimiento
	 *
	 * @return Apartamentos
	 */

	private Apartamentos crearApartamentos() {
		Apartamentos apartamentos = null;
		String tipoEstablecimiento = establecimiento.getTipoEstablecimiento().getIdTipoEstablecimiento();
		List<com.ejie.ab63.model.Alojamiento> listaAlojamientos = establecimiento.getEstablecimientoData()
				.getListAlojamiento();
		if (!listaAlojamientos.isEmpty()) {
			apartamentos = Apartamentos.Factory.newInstance();
			int numApartamentos1 = 0;
			int numApartamentos2 = 0;
			int numApartamentos3 = 0;
			int numApartamentos4 = 0;
			int numApartamentos5 = 0;
			int numApartamentosMas5Plazas = 0;
			for (com.ejie.ab63.model.Alojamiento alojamiento : listaAlojamientos) {
				int total;
				if (Constantes.TipoEstablecimiento.ESTABLECIMIENTO_APARTAMENTO.equals(tipoEstablecimiento)) {
					total = (int) (alojamiento.getNumPlazasDormitorio() + alojamiento.getNumPlazasConvertibles());
				} else {
					total = alojamiento.getNumPlazasDormitorio().intValue();
				}
				if (total == 1) {
					numApartamentos1 += alojamiento.getNumUnidades();
				} else if (total == 2) {
					numApartamentos2 += alojamiento.getNumUnidades();
				} else if (total == 3) {
					numApartamentos3 += alojamiento.getNumUnidades();
				} else if (total == 4) {
					numApartamentos4 += alojamiento.getNumUnidades();
				} else if (total == 5) {
					numApartamentos5 += alojamiento.getNumUnidades();
				} else if (total > 5) {
					numApartamentosMas5Plazas += alojamiento.getNumUnidades();
				}
			}
			apartamentos.setNumApartamentos1Plaza(BigInteger.valueOf(numApartamentos1));
			apartamentos.setNumApartamentos2Plazas(BigInteger.valueOf(numApartamentos2));
			apartamentos.setNumApartamentos3Plazas(BigInteger.valueOf(numApartamentos3));
			apartamentos.setNumApartamentos4Plazas(BigInteger.valueOf(numApartamentos4));
			apartamentos.setNumApartamentos5Plazas(BigInteger.valueOf(numApartamentos5));
			apartamentos.setNumApartamentosMas5Plazas(BigInteger.valueOf(numApartamentosMas5Plazas));
		}
		return apartamentos;
	}

	/**
	 * Sólo puede devolver éstos códigos. No puede devolver más códigos que
	 * estos. El Enum del xsd tiene algún código más así que de esta manera nos
	 * aseguramos que sólo devolvemos éstos.
	 *
	 * @param tipoEstablecimiento
	 *            String
	 * @param categoria
	 *            String
	 * @param modalidad
	 *            String
	 * @return Enum
	 */

	private Categoria.Enum toCategoria(String tipoEstablecimiento, String categoria, String modalidad) {
		Categoria.Enum categoriaValor = null;
		if (Constantes.TipoEstablecimiento.ESTABLECIMIENTO_HOTEL.equals(tipoEstablecimiento)) {
			if (Constantes.CategoriaFijos.HOTEL_1_ESTRELLA.equals(categoria)) {
				categoriaValor = Constantes.CategoriaS41.HOTEL_1_ESTRELLA;
			} else if (Constantes.CategoriaFijos.HOTEL_2_ESTRELLAS.equals(categoria)) {
				categoriaValor = Constantes.CategoriaS41.HOTEL_2_ESTRELLAS;
			} else if (Constantes.CategoriaFijos.HOTEL_3_ESTRELLAS.equals(categoria)) {
				categoriaValor = Constantes.CategoriaS41.HOTEL_3_ESTRELLAS;
			} else if (Constantes.CategoriaFijos.HOTEL_4_ESTRELLAS.equals(categoria)) {
				categoriaValor = Constantes.CategoriaS41.HOTEL_4_ESTRELLAS;
			} else if (Constantes.CategoriaFijos.HOTEL_5_ESTRELLAS.equals(categoria)) {
				categoriaValor = Constantes.CategoriaS41.HOTEL_5_ESTRELLAS;
			}
		} else if (Constantes.TipoEstablecimiento.ESTABLECIMIENTO_CAMPING.equals(tipoEstablecimiento)) {
			if (Constantes.ModalidadFijos.CAMPING.equals(modalidad)) {
				if (Constantes.CategoriaFijos.CAMPING_PRIMERA.equals(categoria)) {
					categoriaValor = Constantes.CategoriaS41.CAMPING_PRIMERA;
				} else if (Constantes.CategoriaFijos.CAMPING_SEGUNDA.equals(categoria)) {
					categoriaValor = Constantes.CategoriaS41.CAMPING_SEGUNDA;
				} else if (Constantes.CategoriaFijos.CAMPING_TERCERA.equals(categoria)) {
					categoriaValor = Constantes.CategoriaS41.CAMPING_TERCERA;
				} else if (Constantes.CategoriaFijos.CAMPING_LUJO.equals(categoria)) {
					categoriaValor = Constantes.CategoriaS41.CAMPING_LUJO;
				}
			}
		} else if (Constantes.TipoEstablecimiento.ESTABLECIMIENTO_APARTAMENTO.equals(tipoEstablecimiento)) {
			if (Constantes.CategoriaFijos.APARTAMENTO_LUJO_4_LLAVES.equals(categoria)) {
				categoriaValor = Constantes.CategoriaS41.APARTAMENTO_LUJO_4_LLAVES;
			} else if (Constantes.CategoriaFijos.APARTAMENTO_PRIMERA_3_LLAVES.equals(categoria)) {
				categoriaValor = Constantes.CategoriaS41.APARTAMENTO_PRIMERA_3_LLAVES;
			} else if (Constantes.CategoriaFijos.APARTAMENTO_SEGUNDA_2_LLAVES.equals(categoria)) {
				categoriaValor = Constantes.CategoriaS41.APARTAMENTO_SEGUNDA_2_LLAVES;
			} else if (Constantes.CategoriaFijos.APARTAMENTO_TERCERA_1_LLAVE.equals(categoria)) {
				categoriaValor = Constantes.CategoriaS41.APARTAMENTO_TERCERA_1_LLAVE;
			}
		}
		return categoriaValor;
	}

	/**
	 * To especialidad.
	 *
	 * @param tipoEstablecimiento
	 *            the tipo establecimiento
	 * @param especialidad
	 *            the especialidad
	 * @return the especialidad. enum
	 */
	private Especialidad.Enum toEspecialidad(String tipoEstablecimiento, String especialidad) {
		Especialidad.Enum especialidadValor = null;
		if (Constantes.TipoEstablecimiento.ESTABLECIMIENTO_ALBERGUE.equals(tipoEstablecimiento)) {
			if (Constantes.EspecialidadFijos.ALBERGUE_CAMINO_SANTIAGO.equals(especialidad)) {
				especialidadValor = Constantes.EspecialidadS41.ALBERGUE_CAMINO_SANTIAGO;
			} else if (Constantes.EspecialidadFijos.ALBERGUE_RURAL.equals(especialidad)) {
				especialidadValor = Constantes.EspecialidadS41.ALBERGUE_RURAL;
			}
		} else if (Constantes.TipoEstablecimiento.ESTABLECIMIENTO_APARTAMENTO.equals(tipoEstablecimiento)) {
			if (Constantes.EspecialidadFijos.APARTAMENTO.equals(especialidad)) {
				especialidadValor = Constantes.EspecialidadS41.APARTAMENTO;
			}
		} else if (Constantes.TipoEstablecimiento.ESTABLECIMIENTO_HOTEL.equals(tipoEstablecimiento)) {
			if (Constantes.EspecialidadFijos.HOTEL_RURAL.equals(especialidad)) {
				especialidadValor = Constantes.EspecialidadS41.HOTEL_RURAL;
			} else if (Constantes.EspecialidadFijos.HOTEL_BALNEARIO.equals(especialidad)) {
				especialidadValor = Constantes.EspecialidadS41.HOTEL_BALNEARIO;
			} else if (Constantes.EspecialidadFijos.HOTEL_DE_CARRETERA.equals(especialidad)) {
				especialidadValor = Constantes.EspecialidadS41.HOTEL_DE_CARRETERA;
			} else if (Constantes.EspecialidadFijos.HOTEL_VALOR_ARQUITECTONICO.equals(especialidad)) {
				especialidadValor = Constantes.EspecialidadS41.HOTEL_VALOR_ARQUITECTONICO;
			} else if (Constantes.EspecialidadFijos.HOTEL_DE_PLAYA.equals(especialidad)) {
				especialidadValor = Constantes.EspecialidadS41.HOTEL_DE_PLAYA;
			}
		}
		return especialidadValor;
	}

	/**
	 * To subtipo recurso agencias.
	 *
	 * @param grupo
	 *            the grupo
	 * @return the negocios. subtipo recurso. enum
	 */
	private Negocios.SubtipoRecurso.Enum toSubtipoRecursoAgencias(String grupo) {
		Negocios.SubtipoRecurso.Enum subtipoRecursoValor = null;
		if (Constantes.GrupoFijos.MINORISTA.equals(grupo)) {
			subtipoRecursoValor = Constantes.GrupoS41.MINORISTA;
		} else if (Constantes.GrupoFijos.MAYORISTA.equals(grupo)) {
			subtipoRecursoValor = Constantes.GrupoS41.MAYORISTA;
		} else if (Constantes.GrupoFijos.MAYORISTA_MINORISTA.equals(grupo)) {
			subtipoRecursoValor = Constantes.GrupoS41.MAYORISTA_MINORISTA;
		}
		return subtipoRecursoValor;
	}

	/**
	 * To modalidad agencias.
	 *
	 * @param modalidad
	 *            the modalidad
	 * @return the negocios. modalidad. enum
	 */
	private Negocios.Modalidad.Enum toModalidadAgencias(String modalidad) {
		Negocios.Modalidad.Enum modalidadValor = null;
		if (Constantes.ModalidadFijos.AAVV_PRINCIPAL.equals(modalidad)) {
			modalidadValor = Constantes.ModalidadS41.AAVV_PRINCIPAL;
		} else if (Constantes.ModalidadFijos.AAVV_SUCURSAL.equals(modalidad)) {
			modalidadValor = Constantes.ModalidadS41.AAVV_SUCURSAL;
		} else if (Constantes.ModalidadFijos.AAVV_PUNTO_VENTA.equals(modalidad)) {
			modalidadValor = Constantes.ModalidadS41.AAVV_PUNTO_VENTA;
		}
		return modalidadValor;
	}

	/**
	 * obtiene el numero de espacios comunes dada una listaSalonesComedor
	 *
	 * @param listaSalonesComedor
	 * @return HashMap HashMap<String, Integer>
	 */
	private Map<String, Integer> obtenerNumeroEspComunHM(List<SalonComedor> listaSalonesComedor) {
		Map<String, Integer> mapaNumEspComun = new HashMap<String, Integer>();
		int numSalones = 0;
		int numSalonesComedor = 0;
		int numComedores = 0;
		if (null != listaSalonesComedor && !listaSalonesComedor.isEmpty()) {
			for (SalonComedor salonComedor : listaSalonesComedor) {
				if (Constantes.TipoEspacio.SALON_COMEDOR.equals(salonComedor.getIdTipo())) {
					numSalonesComedor++;
				} else if (Constantes.TipoEspacio.SALON.equals(salonComedor.getIdTipo())) {
					numSalones++;
				} else if (Constantes.TipoEspacio.COMEDOR.equals(salonComedor.getIdTipo())) {
					numComedores++;
				}
			}
		}
		mapaNumEspComun.put(Constantes.TipoEspacio.SALON, numSalones);
		mapaNumEspComun.put(Constantes.TipoEspacio.SALON_COMEDOR, numSalonesComedor);
		mapaNumEspComun.put(Constantes.TipoEspacio.COMEDOR, numComedores);
		return mapaNumEspComun;
	}

	/**
	 * Sólo puede devolver éstos códigos. No puede devolver más códigos que
	 * estos. El Enum del xsd tiene algún código más así que de esta manera nos
	 * aseguramos que sólo devolvemos éstos.
	 *
	 * @param tipoEstablecimiento
	 *            String
	 * @param modalidad
	 *            String
	 * @return Enum
	 */

	private Modalidad.Enum toModalidad(String tipoEstablecimiento, String modalidad) {
		Modalidad.Enum modalidadValor = null;
		if (Constantes.TipoEstablecimiento.ESTABLECIMIENTO_AGROTURISMO.equals(tipoEstablecimiento)) {
			if (Constantes.ModalidadFijos.AGROTURISMO_ALOJAMIENTO_DEPENDENCIA.equals(modalidad)) {
				modalidadValor = Constantes.ModalidadS41.AGROTURISMO_ALOJAMIENTO_DEPENDENCIA;
			} else if (Constantes.ModalidadFijos.AGROTURISMO_ALOJAMIENTO.equals(modalidad)) {
				modalidadValor = Constantes.ModalidadS41.AGROTURISMO_ALOJAMIENTO;
			} else if (Constantes.ModalidadFijos.AGROTURISMO_DEPENDENCIA.equals(modalidad)) {
				modalidadValor = Constantes.ModalidadS41.AGROTURISMO_DEPENDENCIA;
			}
		} else if (Constantes.TipoEstablecimiento.ESTABLECIMIENTO_CASA_RURAL.equals(tipoEstablecimiento)) {
			if (Constantes.ModalidadFijos.CASA_RURAL_ALOJAMIENTO_DEPENDENCIA.equals(modalidad)) {
				modalidadValor = Constantes.ModalidadS41.CASA_RURAL_ALOJAMIENTO_DEPENDENCIA;
			} else if (Constantes.ModalidadFijos.CASA_RURAL_ALOJAMIENTO.equals(modalidad)) {
				modalidadValor = Constantes.ModalidadS41.CASA_RURAL_ALOJAMIENTO;
			} else if (Constantes.ModalidadFijos.CASA_RURAL_DEPENDENCIA.equals(modalidad)) {
				modalidadValor = Constantes.ModalidadS41.CASA_RURAL_DEPENDENCIA;
			}
		} else if (Constantes.TipoEstablecimiento.ESTABLECIMIENTO_CAMPING.equals(tipoEstablecimiento)) {
			if (Constantes.ModalidadFijos.CAMPING.equals(modalidad)) {
				modalidadValor = Constantes.ModalidadS41.CAMPING;
			} else if (Constantes.ModalidadFijos.CAMPING_AREA_NATURAL_ACAMPADA.equals(modalidad)) {
				modalidadValor = Constantes.ModalidadS41.CAMPING_AREA_NATURAL_ACAMPADA;
			} else if (Constantes.ModalidadFijos.CAMPING_AREA_AUTOCARAVANAS.equals(modalidad)) {
				modalidadValor = Constantes.ModalidadS41.CAMPING_AREA_AUTOCARAVANAS;
			}
		}
		return modalidadValor;
	}

	/**
	 * Genera un enum para los valores de servicios de S41 a partir de un
	 * integer
	 *
	 * @param valor
	 *            int
	 * @return Enum
	 */

	private Servicio.Valor.Enum toServiciosValor(int valor) {
		Servicio.Valor.Enum servicio = null;
		servicio = Servicio.Valor.Enum.forString(String.valueOf(valor));
		return servicio;
	}

	/**
	 * Genera un enum para los valores de idioma de S41 a partir de un string
	 *
	 * @param tipoEstablecimiento
	 *            String
	 * @param grupo
	 *            String
	 * @param modalidad
	 *            String
	 * @return CodTipo.Enum
	 */

	private Alojamiento.SubtipoRecurso.Enum toTipoAlojamiento(String tipoEstablecimiento, String grupo,
			String modalidad) {
		Alojamiento.SubtipoRecurso.Enum tipoAlojamiento = null;
		if (Constantes.TipoEstablecimiento.ESTABLECIMIENTO_HOTEL.equals(tipoEstablecimiento)) {
			tipoAlojamiento = Constantes.TiposAlojamientoS41.HOTEL;
			if (Constantes.GrupoFijos.GRUPO_HOTEL_PENSION.equals(grupo)) {
				tipoAlojamiento = Constantes.TiposAlojamientoS41.PENSION;
			} else if (Constantes.Modalidad.HOTEL_APARTAMENTO.equals(modalidad)) {
				tipoAlojamiento = Constantes.TiposAlojamientoS41.HOTEL_APARTAMENTO;
			}
		} else if (Constantes.TipoEstablecimiento.ESTABLECIMIENTO_APARTAMENTO.equals(tipoEstablecimiento)) {
			tipoAlojamiento = Constantes.TiposAlojamientoS41.APARTAMENTO;
		} else if (Constantes.TipoEstablecimiento.ESTABLECIMIENTO_CASA_RURAL.equals(tipoEstablecimiento)) {
			tipoAlojamiento = Constantes.TiposAlojamientoS41.CASA_RURAL;
		} else if (Constantes.TipoEstablecimiento.ESTABLECIMIENTO_AGROTURISMO.equals(tipoEstablecimiento)) {
			tipoAlojamiento = Constantes.TiposAlojamientoS41.AGROTURISMO;
		} else if (Constantes.TipoEstablecimiento.ESTABLECIMIENTO_CAMPING.equals(tipoEstablecimiento)) {
			tipoAlojamiento = Constantes.TiposAlojamientoS41.CAMPING;
		} else if (Constantes.TipoEstablecimiento.ESTABLECIMIENTO_ALBERGUE.equals(tipoEstablecimiento)) {
			tipoAlojamiento = Constantes.TiposAlojamientoS41.ALBERGUE;
		}
		return tipoAlojamiento;
	}

	/**
	 * Crea la lista de servicios de Hoteles
	 *
	 * @param servicios
	 *            Servicios
	 */

	private void crearListaServiciosHT(Servicios servicios) {
		Servicio servicioCom = servicios.addNewServicio();
		servicioCom.setCodigo(Constantes.ServiciosS41.SERVICIO_DE_COMEDOR);
		servicioCom.setValor(toServiciosValor(Constantes.NO_INT));
		Servicio servicioEdif = servicios.addNewServicio();
		servicioEdif.setCodigo(Constantes.ServiciosS41.EDIFICIO_HISTORICO);
		servicioEdif.setValor(this.toServiciosValor(Constantes.NO_INT));
		if (null != establecimiento.getEstablecimientoData().getServicioComedor()) {
			Servicio.Valor.Enum valor = this
					.toServiciosValor(establecimiento.getEstablecimientoData().getServicioComedor());
			if (valor != null) {
				servicioCom.setValor(valor);
			}
		}
		if (null != establecimiento.getEstablecimientoData().getEdificioCatalogado()) {
			Servicio.Valor.Enum valor = this
					.toServiciosValor(establecimiento.getEstablecimientoData().getEdificioCatalogado());
			if (valor != null) {
				servicioEdif.setValor(valor);
			}
		}
	}

	/**
	 * Crea la lista de servicios de Apartamentos
	 *
	 * @param servicios
	 *            Servicios
	 */

	private void crearListaServiciosAS(Servicios servicios) {
		Servicio servicio = servicios.addNewServicio();
		servicio.setCodigo(Constantes.ServiciosS41.EDIFICIO_HISTORICO);
		servicio.setValor(this.toServiciosValor(Constantes.NO_INT));

		if (null != establecimiento.getEstablecimientoData().getEdificioCatalogado()) {
			Servicio.Valor.Enum valor = this
					.toServiciosValor(establecimiento.getEstablecimientoData().getEdificioCatalogado());
			if (valor != null) {
				servicio.setValor(valor);
			}
		}
	}

	/**
	 * Crea la lista de servicios de Campings
	 *
	 * @param servicios
	 *            Servicios
	 */

	private void crearListaServiciosCP(Servicios servicios) {
		Servicio servicioBar = servicios.addNewServicio();
		servicioBar.setCodigo(Constantes.ServiciosS41.CAFETERIA_BAR);
		servicioBar.setValor(this.toServiciosValor(Constantes.NO_INT));
		Servicio servicioRes = servicios.addNewServicio();
		servicioRes.setCodigo(Constantes.ServiciosS41.RESTAURANTE);
		servicioRes.setValor(this.toServiciosValor(Constantes.NO_INT));
		Servicio servicioPis = servicios.addNewServicio();
		servicioPis.setCodigo(Constantes.ServiciosS41.PISCINA_AIRE_LIBRE);
		servicioPis.setValor(this.toServiciosValor(Constantes.NO_INT));
		if (null != establecimiento.getEstablecimientoData().getBar()) {
			Servicio.Valor.Enum valor = this.toServiciosValor(establecimiento.getEstablecimientoData().getBar());
			if (valor != null) {
				servicioBar.setValor(valor);
			}
		}
		if (null != establecimiento.getEstablecimientoData().getRestaurante()) {
			Servicio.Valor.Enum valor = this
					.toServiciosValor(establecimiento.getEstablecimientoData().getRestaurante());
			if (valor != null) {
				servicioRes.setValor(valor);
			}
		}
		if (null != establecimiento.getEstablecimientoData().getPiscina()) {
			Servicio.Valor.Enum valor = this.toServiciosValor(establecimiento.getEstablecimientoData().getPiscina());
			if (valor != null) {
				servicioPis.setValor(valor);
			}
		}

	}

	/**
	 * @return the tipologia
	 */
	public final String getTipologia() {
		return this.tipologia;
	}

	/**
	 * @return the evento
	 */
	public final String getEvento() {
		return this.evento;
	}

	/**
	 * @return the recursoS41Doc
	 */
	public final String getRecursoS41Doc() {
		return this.recursoS41Doc.xmlText();
	}

	private Calendar dateToCalendar(Date date) {

		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		return calendar;

	}

	private Map<String, Integer> obtenerNumeroHabitacionesTipo(Establecimiento establecimiento) {
		Map<String, Integer> mapaNumHab = null;
		int numHabDob = 0;
		int numHabInd = 0;
		int numHabDobSalon = 0;
		mapaNumHab = new HashMap<String, Integer>();
		if (null != establecimiento.getEstablecimientoData().getListHabitacion()
				&& !establecimiento.getEstablecimientoData().getListHabitacion().isEmpty()) {
			for (Habitacion habitacion : establecimiento.getEstablecimientoData().getListHabitacion()) {
				if (Constantes.TiposHabitacion.DOBLE.equals(habitacion.getTipoHabitacion().getIdTipoHabitacion())) {
					numHabDob = (int) (numHabDob + habitacion.getNumUnidades());
				} else if (Constantes.TiposHabitacion.INDIVIDUAL
						.equals(habitacion.getTipoHabitacion().getIdTipoHabitacion())) {
					numHabInd = (int) (numHabInd + habitacion.getNumUnidades());
				} else if (Constantes.TiposHabitacion.DOBLE_SALON
						.equals(habitacion.getTipoHabitacion().getIdTipoHabitacion())) {
					numHabDobSalon = (int) (numHabDobSalon + habitacion.getNumUnidades());
				}
			}
		}
		mapaNumHab.put(Constantes.TiposHabitacion.DOBLE, numHabDob);
		mapaNumHab.put(Constantes.TiposHabitacion.INDIVIDUAL, numHabInd);
		mapaNumHab.put(Constantes.TiposHabitacion.DOBLE_SALON, numHabDobSalon);
		return mapaNumHab;
	}

	private Map<String, Integer> obtenerHabMIM4(List<Habitacion> listaHabitaciones) {
		Map<String, Integer> mapaNumHab = null;
		int numMayorIgual4 = 0;
		int numMenor4 = 0;
		mapaNumHab = new HashMap<String, Integer>();
		if (null != listaHabitaciones && !listaHabitaciones.isEmpty()) {
			for (Habitacion habitacion : listaHabitaciones) {
				if (habitacion.getNumPlazas() > 3) {
					numMayorIgual4 = (int) (numMayorIgual4 + habitacion.getNumUnidades());
				} else {
					numMenor4 = (int) (numMenor4 + habitacion.getNumUnidades());
				}
			}
		}
		mapaNumHab.put(Constantes.HabitacionAL.MAYOR3, numMayorIgual4);
		mapaNumHab.put(Constantes.HabitacionAL.MENOR4, numMenor4);
		return mapaNumHab;
	}

	private TercerosEstablecimiento obtenerTipoInteresadoActual(
			List<TercerosEstablecimiento> listaTercerosEstablecimiento, String tipoInteresado) {
		TercerosEstablecimiento tercerosEstablecimiento = null;
		if (null != listaTercerosEstablecimiento && !listaTercerosEstablecimiento.isEmpty()) {
			for (TercerosEstablecimiento tercerosEstablecimientoAux : listaTercerosEstablecimiento) {
				if (tipoInteresado.equals(String.valueOf(tercerosEstablecimientoAux.getIdTercerosEstab()))) {
					tercerosEstablecimiento = tercerosEstablecimientoAux;
					break;
				}
			}
		}
		return tercerosEstablecimiento;
	}

	private int getAnyos(Date date) {
		Calendar fecha = Calendar.getInstance();
		fecha.setTime(date);
		return fecha.get(Calendar.YEAR);
	}

}