package com.ejie.ab63.service;

import static com.ejie.ab63.util.CommonObjectUtils.isNotEquals;
import static com.ejie.ab63.util.CommonObjectUtils.isNotNull;
import static com.ejie.ab63.util.CommonObjectUtils.isNull;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.ejie.ab63.comun.Constantes;
import com.ejie.ab63.dao.AgenciaDataDao;
import com.ejie.ab63.dao.EstablecimientoDao;
import com.ejie.ab63.model.AgenciaData;
import com.ejie.ab63.model.DispensaEstablecimiento;
import com.ejie.ab63.model.Establecimiento;
import com.ejie.ab63.model.EstablecimientoData;
import com.ejie.ab63.model.TercerosEstablecimiento;
import com.ejie.ab63.model.TipoEstablecimiento;
import com.ejie.ab63.model.expedientes.Expedientes;
import com.ejie.ab63.model.inicio.InitForm;
import com.ejie.ab63.model.plantillas.ParametrosConfig;
import com.ejie.ab63.model.procedimientos.CompareExpedienteSection;
import com.ejie.ab63.model.procedimientos.FieldExpedienteCompare;
import com.ejie.ab63.model.terceros.DatosDirecciones;
import com.ejie.ab63.model.terceros.DatosTerceros;
import com.ejie.ab63.model.terceros.TiposDireccion;
import com.ejie.ab63.model.terceros.TiposTercero;
import com.ejie.ab63.model.util.ErrorResultAjaxOperation;
import com.ejie.ab63.model.util.ResultAjaxOperation;
import com.ejie.ab63.model.util.SuccessResultAjaxOperation;
import com.ejie.ab63.service.expedientes.ExpedientesService;
import com.ejie.ab63.service.generarPublicacion.GenerarPublicacionService;
import com.ejie.ab63.service.plantillas.ParametrosConfigService;
import com.ejie.ab63.service.terceros.DatosDireccionesService;
import com.ejie.ab63.service.terceros.DatosTercerosService;
import com.ejie.ab63.util.PermisosXLNETS;
import com.ejie.ab63.util.UtilDate;
import com.ejie.x38.dto.JQGridRequestDto;
import com.ejie.x38.dto.JQGridResponseDto;
import com.ejie.x38.dto.JerarquiaDto;
import com.ejie.x38.dto.TableRowDto;

/**
 * Ab6301s00ServiceImpl  
 * 
 *  
 */

@Service(value = "establecimientoService")
public class EstablecimientoServiceImpl implements EstablecimientoService {

	private static final Log logger = LogFactory.getLog(EstablecimientoServiceImpl.class);
	@Autowired
	private EstablecimientoDao establecimientoDao;

	@Autowired
	private EstablecimientoDataService establecimientoDataService;

	@Autowired
	private AgenciaDataService agenciaDataService;

	@Autowired
	private DatosDireccionesService datosDireccionesService;

	@Autowired
	private TercerosEstablecimientoService tercerosEstablecimientoService;

	@Autowired
	private DatosTercerosService datosTercerosService;

	@Autowired
	private ExpedientesService expedientesService;

	@Autowired
	private DispensaEstablecimientoService dispensasService;

	@Autowired
	private ReloadableResourceBundleMessageSource appMessageSource;

	@Autowired
	private AgenciaDataDao agenciaDataDao;

	@Autowired
	private GenerarPublicacionService generarPublicacionService;

	@Autowired
	private ParametrosConfigService parametrosConfigService;

	/**
	 * Inserts a single row in the Ab6301s00 table.
	 *
	 * @param ab6301s00
	 *            Ab6301s00
	 * @return Ab6301s00
	 */
	@Transactional(rollbackFor = Throwable.class)
	public Establecimiento add(Establecimiento ab6301s00) {
		return this.establecimientoDao.add(ab6301s00);
	}

	/**
	 * Updates a single row in the Ab6301s00 table.
	 *
	 * @param ab6301s00
	 *            Ab6301s00
	 * @return Ab6301s00
	 */
	@Transactional(rollbackFor = Throwable.class)
	public Establecimiento update(Establecimiento ab6301s00) {
		return this.establecimientoDao.update(ab6301s00);
	}

	@Transactional(rollbackFor = Throwable.class)
	public Establecimiento update(Establecimiento ab6301s00, String usuario) {
		ab6301s00.setUsuarioUltmodificacion(usuario);
		ab6301s00.setFechaUltmodificacion(new Date());
		return this.establecimientoDao.update(ab6301s00);
	}

	/**
	 * Finds a single row in the Ab6301s00 table.
	 *
	 * @param filter
	 *            Ab6301s00
	 * @return Ab6301s00
	 */
	public Establecimiento find(Establecimiento filter) {
		filter = this.establecimientoDao.find(filter);

		if (filter != null && filter.getEstablecimientoData() != null
				&& filter.getEstablecimientoData().getDispensaEstablecimiento() != null) {

			if (filter.getEstablecimientoData().getDispensaEstablecimiento().getIdDispensasEstab() > 0) {

				filter.getEstablecimientoData().getDispensaEstablecimiento().setHasDispensa(
						appMessageSource.getMessage("afirmativo", null, LocaleContextHolder.getLocale()));

			} else {
				filter.getEstablecimientoData().getDispensaEstablecimiento()
						.setHasDispensa(appMessageSource.getMessage("negativo", null, LocaleContextHolder.getLocale()));
			}
		}

		return filter;

	}

	/**
	 * Finds a single row in the Ab6301s00 table.
	 *
	 * @param filter
	 *            Ab6301s00
	 * @return Ab6301s00
	 */
	public Establecimiento findByIdenticadorEstablecimiento(Establecimiento filter) {
		return (Establecimiento) this.establecimientoDao.findByIdenticadorEstablecimiento(filter);
	}

	public Establecimiento findByIdenticadorEstablecimiento(String identificador) {
		Establecimiento filter = new Establecimiento();
		filter.setIdentificadorEstablecimiento(identificador);
		return (Establecimiento) this.establecimientoDao.findByIdenticadorEstablecimiento(filter);
	}

	/**
	 * Deletes a single row in the Ab6301s00 table.
	 *
	 * @param ab6301s00
	 *            Ab6301s00
	 */
	@Transactional(rollbackFor = Throwable.class)
	public void remove(Establecimiento ab6301s00) {
		this.establecimientoDao.remove(ab6301s00);
	}

	/**
	 * Finds a list of rows in the Ab6301s00 table.
	 *
	 * @param ab6301s00
	 *            Ab6301s00
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @return List<Ab6301s00>
	 */
	public List<Establecimiento> findAll(Establecimiento ab6301s00, JQGridRequestDto jqGridRequestDto) {
		return (List<Establecimiento>) this.establecimientoDao.findAll(ab6301s00, jqGridRequestDto);
	}

	/**
	 * Finds rows in the Ab6301s00 table using like.
	 *
	 * @param ab6301s00
	 *            Ab6301s00
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<Ab6301s00>
	 */
	public List<Establecimiento> findAllLike(Establecimiento ab6301s00, JQGridRequestDto jqGridRequestDto,
			Boolean startsWith) {
		return (List<Establecimiento>) this.establecimientoDao.findAllLike(ab6301s00, jqGridRequestDto, startsWith);
	}

	/*
	 * OPERACIONES RUP_TABLE
	 */

	/**
	 * Removes rows from the Ab6301s00 table.
	 *
	 * @param filterAb6301s00
	 *            Ab6301s00
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 */
	public void removeMultiple(Establecimiento filterAb6301s00, JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		this.establecimientoDao.removeMultiple(filterAb6301s00, jqGridRequestDto, startsWith);
	}

	/**
	 * Filter method in the Ab6301s00 table.
	 *
	 * @param filterAb6301s00
	 *            Ab6301s00
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return JQGridResponseDto<Ab6301s00>
	 */
	public JQGridResponseDto<Establecimiento> filter(Establecimiento filterAb6301s00, JQGridRequestDto jqGridRequestDto,
			Boolean startsWith) {
		List<Establecimiento> listaAb6301s00 = this.establecimientoDao.findAllLike(filterAb6301s00, jqGridRequestDto,
				false);
		Long recordNum = this.establecimientoDao
				.findAllLikeCount(isNotNull(filterAb6301s00) ? filterAb6301s00 : new Establecimiento(), false);
		if (isNotNull(jqGridRequestDto.getMultiselection().getSelectedIds())) {
			List<TableRowDto<Establecimiento>> reorderSelection = this.establecimientoDao
					.reorderSelection(filterAb6301s00, jqGridRequestDto, startsWith);
			return new JQGridResponseDto<Establecimiento>(jqGridRequestDto, recordNum, listaAb6301s00,
					reorderSelection);
		}

		if (isNotNull(listaAb6301s00) && !listaAb6301s00.isEmpty()) {

			for (Establecimiento establecimiento : listaAb6301s00) {

				if (establecimiento != null && establecimiento.getEstablecimientoData() != null
						&& establecimiento.getEstablecimientoData().getDispensaEstablecimiento() != null) {

					if (establecimiento.getEstablecimientoData().getDispensaEstablecimiento()
							.getIdDispensasEstab() > 0) {

						establecimiento.getEstablecimientoData().getDispensaEstablecimiento().setHasDispensa(
								appMessageSource.getMessage("afirmativo", null, LocaleContextHolder.getLocale()));

					} else {
						establecimiento.getEstablecimientoData().getDispensaEstablecimiento().setHasDispensa(
								appMessageSource.getMessage("negativo", null, LocaleContextHolder.getLocale()));
					}
				}
			}
		}

		return new JQGridResponseDto<Establecimiento>(jqGridRequestDto, recordNum, listaAb6301s00);
	}

	/**
	 * Searches rows in the Ab6301s00 table.
	 *
	 * @param filterAb6301s00
	 *            Ab6301s00
	 * @param searchAb6301s00
	 *            Ab6301s00
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<TableRowDto<Ab6301s00>>
	 */
	public List<TableRowDto<Establecimiento>> search(Establecimiento filterAb6301s00, Establecimiento searchAb6301s00,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		return this.establecimientoDao.search(filterAb6301s00, searchAb6301s00, jqGridRequestDto, startsWith);
	}

	/**
	 * Reorder the selection made in Ab6301s00 table.
	 *
	 * @param filterAb6301s00
	 *            Ab6301s00
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return Object
	 */
	public Object reorderSelection(Establecimiento filterAb6301s00, JQGridRequestDto jqGridRequestDto,
			Boolean startsWith) {
		return this.establecimientoDao.reorderSelection(filterAb6301s00, jqGridRequestDto, startsWith);
	}

	/*
	 * OPERACIONES RUP_TABLE JERARQUIA
	 */

	/**
	 * Finder method in the hierarchical the Ab6301s00 table.
	 *
	 * @param filterAb6301s00
	 *            Ab6301s00
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return JQGridResponseDto<JerarquiaDto<Ab6301s00>>
	 */
	public JQGridResponseDto<JerarquiaDto<Establecimiento>> jerarquia(Establecimiento filterAb6301s00,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		List<JerarquiaDto<Establecimiento>> listaAb6301s00 = this.establecimientoDao
				.findAllLikeJerarquia(filterAb6301s00, jqGridRequestDto);
		Long recordNum = this.establecimientoDao.findAllLikeCountJerarquia(filterAb6301s00, jqGridRequestDto);
		return new JQGridResponseDto<JerarquiaDto<Establecimiento>>(jqGridRequestDto, recordNum, listaAb6301s00);
	}

	/**
	 * Finder method for siblings rows in the hierarchical the Ab6301s00 table.
	 *
	 * @param filter
	 *            Ab6301s00
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @return JQGridResponseDto<JerarquiaDto<Ab6301s00>>
	 */
	public JQGridResponseDto<JerarquiaDto<Establecimiento>> jerarquiaChildren(Establecimiento filter,
			JQGridRequestDto jqGridRequestDto) {
		JQGridResponseDto<JerarquiaDto<Establecimiento>> jqGridResponseDto = new JQGridResponseDto<JerarquiaDto<Establecimiento>>();
		jqGridResponseDto.addAdditionalParam(JQGridResponseDto.CHILDREN,
				this.establecimientoDao.findAllChild(filter, jqGridRequestDto));
		return jqGridResponseDto;
	}

	@Transactional(rollbackFor = Throwable.class)
	public Boolean establecerFechaBaja(String identificador, Integer idExpediente, boolean isExpedienteOficio) {
		String userMod = PermisosXLNETS.getUserConnected();

		relacionarDirecionExpedienteOficio(identificador, idExpediente);
		return this.establecimientoDao.establecerFechaBaja(identificador, userMod);
	}

	@Transactional(rollbackFor = Throwable.class)
	public void relacionarExpedienteOficio(InitForm form) {
		this.relacionarDirecionExpedienteOficio(form.getIdentificadorEstablecimiento(), form.getIdExpediente());
		Expedientes expedientes = new Expedientes();
		expedientes.setIdExpediente(form.getIdExpediente());
		expedientes.setIdExpedienteOrigen(form.getIdExpedienteOrigen());
		this.expedientesService.updateOrigen(expedientes);
	}

	@Transactional(rollbackFor = Throwable.class)
	public void relacionarDirecionExpedienteOficio(String identificador, Integer idExpediente) {
		DatosDirecciones direccionEstablecimiento = datosDireccionesService.findEstablecimientoExpediente(idExpediente);
		direccionEstablecimiento.setIdentificadorEstablecimiento(identificador);
		datosDireccionesService.update(direccionEstablecimiento);
	}

	@Override
	public String getNewIntetificador(String tipoRegistro, String tipoEstablecimiento, InitForm initForm) {
		Integer idProvTTHH = initForm.getIdProvinciaEstablecimiento() != null
				? Integer.parseInt(initForm.getIdProvinciaEstablecimiento()) : 0;
		Long pais = initForm.getIdPais() != null ? Long.parseLong(initForm.getIdPais()) : Constantes.ID_NORA_ESP;
		String zona = String.format("%02d", idProvTTHH);
		ArrayList<String> zonesCPV = new ArrayList<String>();
		zonesCPV.add(Constantes.CODIGO_ARABA);
		zonesCPV.add(Constantes.CODIGO_BIZKAIA);
		zonesCPV.add(Constantes.CODIGO_GIPUZKOA);

		if (pais != Constantes.ID_NORA_ESP) {
			zona = Constantes.CODIGO_EXTRANJERO;
		} else if (!zonesCPV.contains(zona)) {
			zona = Constantes.CODIGO_ESPANA;
		}
		return this.establecimientoDao.getNewIntetificador(tipoRegistro, tipoEstablecimiento, zona);
	}

	private String getNewIntetificador(String tipoRegistro, String tipoEstablecimiento, String zona) {
		return this.establecimientoDao.getNewIntetificador(tipoRegistro, tipoEstablecimiento, zona);
	}

	/**
	 * 
	 * @param idExpediente
	 * @param establecimiento
	 * @return
	 * @throws Throwable
	 */
	@Override
	@Transactional(rollbackFor = Throwable.class)
	public Establecimiento registrarEstablecimientoCenso(Integer idExpediente, String tipoRegistro,
			String identificadorDefinitivo, Date fechaSugerida) {
		Establecimiento establecimiento = this.establecimientoDao.findEstablecimientoByIdExpediente(idExpediente);
		establecimiento.setIdentificadorEstablecimiento(identificadorDefinitivo);
		establecimiento.setTipoRegistro(tipoRegistro);
		if (Constantes.TIPO_REGISTRO_DEFINITIVO.equalsIgnoreCase(tipoRegistro)) {
			establecimiento.setFechaInscripcion(fechaSugerida);
			establecimiento.setIdExpediente(null);
		}

		return this.update(establecimiento);
	}

	@Override
	public Date calcFechaInscricion(Integer idExpediente) {
		Date fechaInscripcion = this.expedientesService.getMaxDateExpediente(idExpediente,
				Constantes.TIPO_FECHA_APORTACION_TELEMATICA, false);
		if (fechaInscripcion != null) {
			return fechaInscripcion;
		}
		fechaInscripcion = this.expedientesService.getMaxDateExpediente(idExpediente,
				Constantes.ETIQUETA_FECHA_EXP_APERTURA, true);
		if (fechaInscripcion != null) {
			return fechaInscripcion;
		}
		return new Date();
	}

	@Override
	public Establecimiento findEstablecimientoByIdExpediente(Integer idExpediente) {
		try {
			return establecimientoDao.findEstablecimientoByIdExpediente(idExpediente);
		} catch (Throwable e) {
			return new Establecimiento();
		}
	}

	@Override
	public List<CompareExpedienteSection> findDiffExpdienteSections(InitForm initForm) {
		ArrayList<CompareExpedienteSection> mapDiffSections = new ArrayList<CompareExpedienteSection>();
		Establecimiento filter = new Establecimiento();
		filter.setIdentificadorEstablecimiento(initForm.getIdentificadorEstablecimiento());
		filter.setTipoRegistro(Constantes.TIPO_REGISTRO_DEFINITIVO);
		Establecimiento definitivo = this.findByIdenticadorEstablecimiento(filter);

		Establecimiento modificaciones = establecimientoDao
				.findEstablecimientoByIdExpediente(initForm.getIdExpediente());

		mapDiffSections.addAll(findDiffTerceros(definitivo, modificaciones, Constantes.SECCION_PRIORITY_HIGH));
		mapDiffSections.add(findDiffDatosComunes(definitivo, modificaciones, Constantes.SECCION_PRIORITY_MEDIUM));
		mapDiffSections.addAll(findDiffDatosEspecificos(definitivo, modificaciones, Constantes.SECCION_PRIORITY_LOW));
		Collections.sort(mapDiffSections);
		return mapDiffSections;
	}

	private List<CompareExpedienteSection> findDiffTerceros(Establecimiento definitivo, Establecimiento modificaciones,
			Integer priority) {
		definitivo.setOnlyTerActivos(true);
		List<CompareExpedienteSection> compareExpedienteSections = new ArrayList<CompareExpedienteSection>();
		List<TercerosEstablecimiento> tercerosOld = tercerosEstablecimientoService.findAllByEstablecimiento(definitivo);
		List<TercerosEstablecimiento> tercerosNew = tercerosEstablecimientoService
				.findAllByEstablecimiento(modificaciones);

		// Se procesan los terceros del establecimiento censado
		for (int i = 0; i < tercerosOld.size(); i++) {
			TercerosEstablecimiento terceroOld = tercerosOld.get(i);
			TiposTercero tiposTerceroOld = terceroOld.getTiposTercero();
			TercerosEstablecimiento terceroNew = findTerceroInList(terceroOld, tercerosNew);

			if (tiposTerceroOld.getIdTipoTercero() == Constantes.TITULAR_ACTIVIDAD) {
				compareExpedienteSections.add(findDiffTitular(terceroOld, terceroNew, priority));
			}
			if (tiposTerceroOld.getIdTipoTercero() == Constantes.REPRESENTANTE_LEGAL) {
				compareExpedienteSections.add(findDiffRepresentante(terceroOld, terceroNew, priority));
			}
		}
		// Peticion 0139758:Ficha modificación: cambios pendientes en cambio de
		// titular
		/*
		 * for (int i = 0; i < tercerosOld.size(); i++) {
		 * TercerosEstablecimiento terceroOld = tercerosOld.get(i);
		 * TercerosEstablecimiento terceroNew = findTerceroInList(terceroOld,
		 * tercerosNew); if (terceroNew == null) { terceroNew = terceroOld; } if
		 * (terceroOld.getTiposTercero().getIdTipoTercero() ==
		 * Constantes.TITULAR_ACTIVIDAD ||
		 * terceroOld.getTiposTercero().getIdTipoTercero() ==
		 * Constantes.SOLICITANTE) {
		 * compareExpedienteSections.add(findDiffTitular(terceroOld,
		 * terceroNew)); } if (terceroOld.getTiposTercero().getIdTipoTercero()
		 * == Constantes.REPRESENTANTE_LEGAL) {
		 * compareExpedienteSections.add(findDiffRepresentante(terceroOld,
		 * terceroNew)); } }
		 */
		// se procesan los terceros que no estan en el listado del
		// establecimiento censado
		/*
		 * for (int i = 0; i < tercerosNew.size(); i++) {
		 * TercerosEstablecimiento terceroNew = tercerosNew.get(i);
		 * TercerosEstablecimiento terceroOld = findTerceroInList(terceroNew,
		 * tercerosOld);
		 * 
		 * if (terceroOld == null) { if
		 * (terceroNew.getTiposTercero().getIdTipoTercero() ==
		 * Constantes.TITULAR_ACTIVIDAD ||
		 * terceroNew.getTiposTercero().getIdTipoTercero() ==
		 * Constantes.SOLICITANTE) {
		 * compareExpedienteSections.add(findDiffTitular(terceroOld,
		 * terceroNew)); } if (terceroNew.getTiposTercero().getIdTipoTercero()
		 * == Constantes.REPRESENTANTE_LEGAL) {
		 * compareExpedienteSections.add(findDiffRepresentante(terceroOld,
		 * terceroNew)); } }
		 * 
		 * }
		 */

		return compareExpedienteSections;
	}

	private TercerosEstablecimiento findTerceroInList(TercerosEstablecimiento terceroBase,
			List<TercerosEstablecimiento> tercero) {
		for (Iterator<TercerosEstablecimiento> iterator = tercero.iterator(); iterator.hasNext();) {
			TercerosEstablecimiento tercerosEstablecimiento = iterator.next();
			if (hasSameTipoTercero(terceroBase, tercerosEstablecimiento)) {
				// && hasSameDocument(terceroBase, tercerosEstablecimiento)) {
				return tercerosEstablecimiento;
			}
		}
		return null;
	}

	private boolean hasSameDocument(TercerosEstablecimiento terceroNew,
			TercerosEstablecimiento tercerosEstablecimiento) {
		return isNotNull(tercerosEstablecimiento.getDatosTerceros()) && isNotNull(terceroNew.getDatosTerceros())
				&& tercerosEstablecimiento.getDatosTerceros().getDocumento()
						.equalsIgnoreCase(terceroNew.getDatosTerceros().getDocumento());
	}

	protected boolean hasSameTipoTercero(TercerosEstablecimiento terceroNew,
			TercerosEstablecimiento tercerosEstablecimiento) {
		return tercerosEstablecimiento.getTiposTercero().getIdTipoTercero()
				.equals(terceroNew.getTiposTercero().getIdTipoTercero());
	}

	private CompareExpedienteSection findDiffTitular(TercerosEstablecimiento terceroOld,
			TercerosEstablecimiento terceroNew, Integer priority) {
		CompareExpedienteSection section = new CompareExpedienteSection(Constantes.SECCION_TITULAR, priority);

		DatosTerceros oldData = isNull(terceroOld) ? new DatosTerceros() : terceroOld.getDatosTerceros();
		DatosTerceros newData = isNull(terceroNew) ? new DatosTerceros() : terceroNew.getDatosTerceros();
		if (isNull(oldData.getIdTercero()) || !hasSameDocument(terceroOld, terceroNew)) {
			section.setIdSection(newData.getIdTercero());
			section.setNewElement(true);
		} else {
			section.setIdSection(oldData.getIdTercero());
		}

		findDiffDatosTercerosComun(section, oldData, newData);

		String emailNew = isNotNull(newData.getEmail()) ? newData.getEmail() : "";
		String emailOld = isNotNull(oldData.getEmail()) ? oldData.getEmail() : "";

		String telefonoNew = isNotNull(newData.getTelefono()) && isNotEquals(newData.getTelefono(), 0)
				? String.valueOf(newData.getTelefono()) : "";
		String telefonoOld = isNotNull(oldData.getTelefono()) && isNotEquals(oldData.getTelefono(), 0)
				? String.valueOf(oldData.getTelefono()) : "";
		List<FieldExpedienteCompare> fields = section.getListFields();

		fields.add(new FieldExpedienteCompare("datosTerceros.email", emailOld, emailNew, FieldExpedienteCompare.TEXT));
		fields.add(new FieldExpedienteCompare("datosTerceros.telefono", telefonoOld, telefonoNew,
				FieldExpedienteCompare.TEXT));

		return section;
	}

	private CompareExpedienteSection findDiffRepresentante(TercerosEstablecimiento terceroOld,
			TercerosEstablecimiento terceroNew, Integer priority) {
		CompareExpedienteSection section = new CompareExpedienteSection(Constantes.SECCION_REPRESENTANTE, priority);

		DatosTerceros oldData = isNull(terceroOld) ? new DatosTerceros() : terceroOld.getDatosTerceros();
		DatosTerceros newData = isNull(terceroNew) ? new DatosTerceros() : terceroNew.getDatosTerceros();
		if (isNull(newData.getIdTercero())) {
			newData = oldData;
		}
		if (isNull(oldData.getIdTercero())) {
			section.setIdSection(newData.getIdTercero());
			section.setNewElement(true);
		} else {
			section.setIdSection(oldData.getIdTercero());
		}

		findDiffDatosTercerosComun(section, oldData, newData);
		return section;
	}

	private void findDiffDatosTercerosComun(CompareExpedienteSection section, DatosTerceros oldData,
			DatosTerceros newData) {
		Locale currentLocale = LocaleContextHolder.getLocale();
		String nombreNew = isNotNull(newData.getNombre()) ? newData.getNombre() : "";
		String nombreOld = isNotNull(oldData.getNombre()) ? oldData.getNombre() : "";

		String apellido1New = isNotNull(newData.getApellido1()) ? newData.getApellido1() : "";
		String apellido1Old = isNotNull(oldData.getApellido1()) ? oldData.getApellido1() : "";

		String apellido2New = isNotNull(newData.getApellido2()) ? newData.getApellido2() : "";
		String apellido2Old = isNotNull(oldData.getApellido2()) ? oldData.getApellido2() : "";

		String sexoNew = isNotNull(newData.getSexo()) && isNotNull(newData.getSexo().getIdSexo())
				&& isNotEquals(newData.getSexo().getIdSexo(), 0) ? String.valueOf(newData.getSexo().getIdSexo()) : "";
		String sexoDescNew = isNotNull(newData.getSexo())
				? currentLocale.getLanguage().equalsIgnoreCase(Constantes.EUSKERA)
						? newData.getSexo().getDescripcionEuskera() : newData.getSexo().getDescripcionCastellano()
				: "";
		String sexoOld = isNotNull(oldData.getSexo()) && isNotNull(oldData.getSexo().getIdSexo())
				&& isNotEquals(oldData.getSexo().getIdSexo(), 0) ? String.valueOf(oldData.getSexo().getIdSexo()) : "";
		String sexoDescOld = isNotNull(oldData.getSexo())
				? currentLocale.getLanguage().equalsIgnoreCase(Constantes.EUSKERA)
						? oldData.getSexo().getDescripcionEuskera() : oldData.getSexo().getDescripcionCastellano()
				: "";

		String tipoDocumentoNew = isNotNull(newData.getTiposDocumento())
				&& isNotNull(newData.getTiposDocumento().getIdTipoDocumento())
						? String.valueOf(newData.getTiposDocumento().getIdTipoDocumento()) : "";
		String tipoDocumentoDescNew = isNotNull(newData.getTiposDocumento())
				? currentLocale.getLanguage().equalsIgnoreCase(Constantes.EUSKERA)
						? newData.getTiposDocumento().getDescripcionEuskera()
						: newData.getTiposDocumento().getDescripcionCastellano()
				: "";
		String tipoDocumentoOld = isNotNull(oldData.getTiposDocumento())
				&& isNotNull(oldData.getTiposDocumento().getIdTipoDocumento())
						? String.valueOf(oldData.getTiposDocumento().getIdTipoDocumento()) : "";
		String tipoDocumentoDescOld = isNotNull(oldData.getTiposDocumento())
				? currentLocale.getLanguage().equalsIgnoreCase(Constantes.EUSKERA)
						? oldData.getTiposDocumento().getDescripcionEuskera()
						: oldData.getTiposDocumento().getDescripcionCastellano()
				: "";

		String documentoNew = isNotNull(newData.getDocumento()) ? newData.getDocumento() : "";
		String documentoOld = isNotNull(oldData.getDocumento()) ? oldData.getDocumento() : "";

		List<FieldExpedienteCompare> fields = section.getListFields();
		fields.add(
				new FieldExpedienteCompare("datosTerceros.nombre", nombreOld, nombreNew, FieldExpedienteCompare.TEXT));
		fields.add(new FieldExpedienteCompare("datosTerceros.apellido1", apellido1Old, apellido1New,
				FieldExpedienteCompare.TEXT));
		fields.add(new FieldExpedienteCompare("datosTerceros.apellido2", apellido2Old, apellido2New,
				FieldExpedienteCompare.TEXT));
		fields.add(new FieldExpedienteCompare("datosTerceros.sexo.idSexo", sexoOld, sexoNew,
				FieldExpedienteCompare.TEXT, sexoDescOld, sexoDescNew));
		fields.add(new FieldExpedienteCompare("datosTerceros.tipoDocumento.idTipoDocumento", tipoDocumentoOld,
				tipoDocumentoNew, FieldExpedienteCompare.TEXT, tipoDocumentoDescOld, tipoDocumentoDescNew));
		fields.add(new FieldExpedienteCompare("datosTerceros.documento", documentoOld, documentoNew,
				FieldExpedienteCompare.TEXT));

	}

	private CompareExpedienteSection findDiffDatosComunes(Establecimiento establecimientoOld,
			Establecimiento establecimientoNew, Integer priority) {
		CompareExpedienteSection section = new CompareExpedienteSection(Constantes.SECCION_DATOS_COMUNES, priority);
		section.setIdSection(establecimientoOld.getIdEstablecimiento());

		String nombreComercialNew = isNotNull(establecimientoNew.getDescrNombre()) ? establecimientoNew.getDescrNombre()
				: "";
		String nombreComercialOld = isNotNull(establecimientoOld.getDescrNombre()) ? establecimientoOld.getDescrNombre()
				: "";

		String webNew = isNotNull(establecimientoNew.getUrlweb()) ? establecimientoNew.getUrlweb() : "";
		String webOld = isNotNull(establecimientoOld.getUrlweb()) ? establecimientoOld.getUrlweb() : "";

		String telefonoPromocionalNew = isNotNull(establecimientoNew.getTelefonoPromo())
				? establecimientoNew.getTelefonoPromo() : "";
		String telefonoPromocionalOld = isNotNull(establecimientoOld.getTelefonoPromo())
				? establecimientoOld.getTelefonoPromo() : "";

		String emailPromocionalNew = isNotNull(establecimientoNew.getCorreoElectronico())
				? establecimientoNew.getCorreoElectronico() : "";
		String emailPromocionalOld = isNotNull(establecimientoOld.getCorreoElectronico())
				? establecimientoOld.getCorreoElectronico() : "";

		String telefonoContactoNew = isNotNull(establecimientoNew.getTelefono()) ? establecimientoNew.getTelefono()
				: "";
		String telefonoContactoOld = establecimientoOld.getTelefono() != null ? establecimientoOld.getTelefono() : "";

		String fechaInicioActividadNew = isNotNull(establecimientoNew.getFechaApertura())
				? UtilDate.convertirFechaEnString(establecimientoNew.getFechaApertura(), "dd/MM/yyyy", "yyyy/MM/dd")
				: "";
		String fechaInicioActividadOld = isNotNull(establecimientoOld.getFechaApertura())
				? UtilDate.convertirFechaEnString(establecimientoOld.getFechaApertura(), "dd/MM/yyyy", "yyyy/MM/dd")
				: "";

		String periodoPuentesNew = isNotNull(establecimientoNew.getPeriodoPuentes())
				? establecimientoNew.getPeriodoPuentes() : "0";
		String periodoPuentesOld = isNotNull(establecimientoOld.getPeriodoPuentes())
				? establecimientoOld.getPeriodoPuentes() : "0";

		String periodoVacacionesNew = isNotNull(establecimientoNew.getPeriodoVacaciones())
				? establecimientoNew.getPeriodoVacaciones() : "0";
		String periodoVacacionesOld = isNotNull(establecimientoOld.getPeriodoVacaciones())
				? establecimientoOld.getPeriodoVacaciones() : "0";

		String periodoVeranoNew = isNotNull(establecimientoNew.getPeriodoVerano())
				? establecimientoNew.getPeriodoVerano() : "0";
		String periodoVeranoOld = isNotNull(establecimientoOld.getPeriodoVerano())
				? establecimientoOld.getPeriodoVerano() : "0";

		String sinPeriodoPrefNew = isNotNull(establecimientoNew.getSinPeriodoPref())
				? establecimientoNew.getSinPeriodoPref() : "0";
		String sinPeriodoPrefOld = isNotNull(establecimientoOld.getSinPeriodoPref())
				? establecimientoOld.getSinPeriodoPref() : "0";

		List<FieldExpedienteCompare> fields = section.getListFields();

		fields.add(new FieldExpedienteCompare("establecimiento.descNombre", nombreComercialOld, nombreComercialNew,
				FieldExpedienteCompare.TEXT));
		fields.add(new FieldExpedienteCompare("establecimiento.urlweb", webOld, webNew, FieldExpedienteCompare.TEXT));
		fields.add(new FieldExpedienteCompare("establecimiento.telefonoPromo", telefonoPromocionalOld,
				telefonoPromocionalNew, FieldExpedienteCompare.TEXT));
		fields.add(new FieldExpedienteCompare("establecimiento.emailPormocional", emailPromocionalOld,
				emailPromocionalNew, FieldExpedienteCompare.TEXT));
		fields.add(new FieldExpedienteCompare("establecimiento.telefono", telefonoContactoOld, telefonoContactoNew,
				FieldExpedienteCompare.TEXT));
		fields.add(new FieldExpedienteCompare("establecimiento.fechaApertura", fechaInicioActividadOld,
				fechaInicioActividadNew, FieldExpedienteCompare.DATE));
		fields.add(new FieldExpedienteCompare("establecimiento.periodoPuentes", periodoPuentesOld, periodoPuentesNew,
				FieldExpedienteCompare.COMBO));
		fields.add(new FieldExpedienteCompare("establecimiento.periodoVacaciones", periodoVacacionesOld,
				periodoVacacionesNew, FieldExpedienteCompare.COMBO));
		fields.add(new FieldExpedienteCompare("establecimiento.periodoVerano", periodoVeranoOld, periodoVeranoNew,
				FieldExpedienteCompare.COMBO));
		fields.add(new FieldExpedienteCompare("establecimiento.sinPeriodoPref", sinPeriodoPrefOld, sinPeriodoPrefNew,
				FieldExpedienteCompare.COMBO));

		return section;
	}

	private List<CompareExpedienteSection> findDiffDatosEspecificos(Establecimiento establecimientoOld,
			Establecimiento establecimientoNew, Integer priority) {
		List<CompareExpedienteSection> sections = new ArrayList<CompareExpedienteSection>();
		CompareExpedienteSection section = new CompareExpedienteSection(Constantes.SECCION_DATOS_ESPECIFICOS, priority);
		section.setIdSection(establecimientoOld.getIdEstablecimiento());
		sections.add(section);

		List<FieldExpedienteCompare> fields = section.getListFields();
		if (establecimientoOld.isType(Constantes.VIVIENDAS_TURISTICAS)) {
			findDiffViviendasTuristicas(establecimientoOld, establecimientoNew, fields);
		}
		if (establecimientoOld.isType(Constantes.HABITACIONES_CASAS_PARTICULARES)) {
			findDiffHabitacionesTuristicas(establecimientoOld, establecimientoNew, fields);
		}

		if (establecimientoNew.isType(Constantes.CASA_RURAL)) {
			findDiffCasasRurales(establecimientoNew, establecimientoOld, fields);
		}
		if (establecimientoNew.isType(Constantes.AGROTURISMO)) {
			findDiffAgroturismos(establecimientoNew, establecimientoOld, fields);
		}
		if (establecimientoNew.isType(Constantes.CAMPING)) {
			findDiffCamping(establecimientoNew, establecimientoOld, fields);
		}
		if (establecimientoNew.isType(Constantes.ALBERGUE_TURISTICO)) {
			findDiffAlberguesTuristicos(establecimientoNew, establecimientoOld, fields);
		}
		if (establecimientoNew.isType(Constantes.APARTAMENTO)) {
			findDiffApartamentosTuristicos(establecimientoNew, establecimientoOld, fields);
		}
		if (establecimientoNew.isType(Constantes.HOTEL)) {
			findDiffHoteles(establecimientoNew, establecimientoOld, fields);
		}

		if (establecimientoNew.isType(Constantes.AGENCIA_VIAJE)) {
			findDiffAgenciasViajes(establecimientoNew, establecimientoOld, fields);
			// Las agencias pueden cambiar la ubicacion del establecimiento
			CompareExpedienteSection sectionDireccion = new CompareExpedienteSection(
					Constantes.SECCION_DATOS_ESPECIFICOS_UBICACION, priority - 1);

			findDiffAgenciasViajesUbicacion(establecimientoNew, establecimientoOld, sectionDireccion.getListFields(),
					sectionDireccion, priority, Constantes.ID_DIRECCION_ACTIVIDAD);

			boolean isOficinaPrincipalExtrOld = isNotNull(establecimientoOld.getAgenciaData())
					&& Constantes.AGENCIA_ORIGEN_OFICINA_PRINCIPAL_EXTRANJERA
							.equalsIgnoreCase(establecimientoOld.getAgenciaData().getIdOrigenOfiPrincipal());
			boolean isOficinaPrincipalExtrNew = isNotNull(establecimientoNew.getAgenciaData())
					&& Constantes.AGENCIA_ORIGEN_OFICINA_PRINCIPAL_EXTRANJERA
							.equalsIgnoreCase(establecimientoNew.getAgenciaData().getIdOrigenOfiPrincipal());

			if (isOficinaPrincipalExtrNew || isOficinaPrincipalExtrOld) {
				CompareExpedienteSection sectionDireccionOficinaPrincipal = new CompareExpedienteSection(
						Constantes.SECCION_DATOS_ESPECIFICOS_UBICACION_OFICINA, priority + 1);
				if (isOficinaPrincipalExtrNew && !isOficinaPrincipalExtrOld) {
					sectionDireccionOficinaPrincipal.setNewElement(true);
				}

				findDiffAgenciasViajesUbicacion(establecimientoNew, establecimientoOld,
						sectionDireccionOficinaPrincipal.getListFields(), sectionDireccionOficinaPrincipal, priority,
						Constantes.ID_DIRECCION_OFICINA_PRINCIPAL);
				sections.add(sectionDireccionOficinaPrincipal);
			}
			sections.add(sectionDireccion);
		}

		return sections;
	}

	protected void findDiffHabitacionesTuristicas(Establecimiento establecimientoOld,
			Establecimiento establecimientoNew, List<FieldExpedienteCompare> fields) {
		Locale currentLocale = LocaleContextHolder.getLocale();

		EstablecimientoData dataOld = isNotNull(establecimientoOld.getEstablecimientoData())
				? establecimientoOld.getEstablecimientoData() : new EstablecimientoData();
		EstablecimientoData dataNew = isNotNull(establecimientoNew.getEstablecimientoData())
				? establecimientoNew.getEstablecimientoData() : new EstablecimientoData();

		String idModalidadNew = isNotNull(establecimientoNew.getModalidad())
				&& isNotNull(establecimientoNew.getModalidad().getIdModalidad())
						? String.valueOf(establecimientoNew.getModalidad().getIdModalidad()) : "";
		String modalidadDescNew = isNotNull(establecimientoNew.getModalidad())
				? currentLocale.getLanguage().equalsIgnoreCase(Constantes.EUSKERA)
						? establecimientoNew.getModalidad().getDescModalidadEu()
						: establecimientoNew.getModalidad().getDescModalidadEs()
				: "";

		String idModalidadOld = isNotNull(establecimientoOld.getModalidad())
				&& isNotNull(establecimientoNew.getModalidad().getIdModalidad())
						? String.valueOf(establecimientoOld.getModalidad().getIdModalidad()) : "";
		String modalidadDescOld = isNotNull(establecimientoOld.getModalidad())
				? currentLocale.getLanguage().equalsIgnoreCase(Constantes.EUSKERA)
						? establecimientoOld.getModalidad().getDescModalidadEu()
						: establecimientoOld.getModalidad().getDescModalidadEs()
				: "";

		String superficeTotalOld = isNotNull(dataOld.getSuperficieTotal()) ? dataOld.getSuperficieTotal().toString()
				: "";
		String superficeTotalNew = isNotNull(dataNew.getSuperficieTotal()) ? dataNew.getSuperficieTotal().toString()
				: "";

		String numPlazasOld = isNotNull(dataOld.getNumPlazas()) ? String.valueOf(dataOld.getNumPlazas()) : "";
		String numPlazasNew = isNotNull(dataNew.getNumPlazas()) ? String.valueOf(dataNew.getNumPlazas()) : "";

		String totalPersonasResidentesOld = isNotNull(dataOld.getNumResidentesPerm()) ? dataOld.getNumResidentesPerm()
				: "";
		String totalPersonasResidentesNew = isNotNull(dataNew.getNumResidentesPerm()) ? dataNew.getNumResidentesPerm()
				: "";

		String numDormitoriosUsuariosOld = isNotNull(dataOld.getNumDormitoriosUsuarios())
				? dataOld.getNumDormitoriosUsuarios() : "";
		String numDormitoriosUsuariosNew = isNotNull(dataNew.getNumDormitoriosUsuarios())
				? dataNew.getNumDormitoriosUsuarios() : "";

		String numDormitoriosResidentesOld = isNotNull(dataOld.getNumDormitoriosResidentes())
				? dataOld.getNumDormitoriosResidentes() : "";
		String numDormitoriosResidentesNew = isNotNull(dataNew.getNumDormitoriosResidentes())
				? dataNew.getNumDormitoriosResidentes() : "";

		String numBanosOld = isNotNull(dataOld.getNumBanosGenerales()) ? String.valueOf(dataOld.getNumBanosGenerales())
				: "";
		String numBanosNew = isNotNull(dataNew.getNumBanosGenerales()) ? String.valueOf(dataNew.getNumBanosGenerales())
				: "";
		fields.add(new FieldExpedienteCompare("establecimientoData.modalidad.idModalidad", idModalidadOld,
				idModalidadNew, FieldExpedienteCompare.TEXT, modalidadDescOld, modalidadDescNew));
		fields.add(new FieldExpedienteCompare("establecimientoData.numDormitoriosUsuarios", numDormitoriosUsuariosOld,
				numDormitoriosUsuariosNew, FieldExpedienteCompare.TEXT));
		fields.add(new FieldExpedienteCompare("establecimientoData.numDormitoriosResidentes",
				numDormitoriosResidentesOld, numDormitoriosResidentesNew, FieldExpedienteCompare.TEXT));
		fields.add(new FieldExpedienteCompare("establecimientoData.numResidentesPerm", totalPersonasResidentesOld,
				totalPersonasResidentesNew, FieldExpedienteCompare.TEXT));
		fields.add(new FieldExpedienteCompare("establecimientoData.numPlazas", numPlazasOld, numPlazasNew,
				FieldExpedienteCompare.TEXT));
		fields.add(new FieldExpedienteCompare("establecimientoData.numBanosGenerales", numBanosOld, numBanosNew,
				FieldExpedienteCompare.TEXT));
		fields.add(new FieldExpedienteCompare("establecimientoData.superficieTotal", superficeTotalOld,
				superficeTotalNew, FieldExpedienteCompare.TEXT));
	}

	protected void findDiffViviendasTuristicas(Establecimiento establecimientoOld, Establecimiento establecimientoNew,
			List<FieldExpedienteCompare> fields) {

		Locale currentLocale = LocaleContextHolder.getLocale();

		EstablecimientoData dataOld = isNotNull(establecimientoOld.getEstablecimientoData())
				? establecimientoOld.getEstablecimientoData() : new EstablecimientoData();
		EstablecimientoData dataNew = isNotNull(establecimientoNew.getEstablecimientoData())
				? establecimientoNew.getEstablecimientoData() : new EstablecimientoData();

		String idModalidadNew = isNotNull(establecimientoNew.getModalidad())
				&& isNotNull(establecimientoNew.getModalidad().getIdModalidad())
						? String.valueOf(establecimientoNew.getModalidad().getIdModalidad()) : "";
		String modalidadDescNew = isNotNull(establecimientoNew.getModalidad())
				? currentLocale.getLanguage().equalsIgnoreCase(Constantes.EUSKERA)
						? establecimientoNew.getModalidad().getDescModalidadEu()
						: establecimientoNew.getModalidad().getDescModalidadEs()
				: "";

		String idModalidadOld = isNotNull(establecimientoOld.getModalidad())
				&& isNotNull(establecimientoNew.getModalidad().getIdModalidad())
						? String.valueOf(establecimientoOld.getModalidad().getIdModalidad()) : "";
		String modalidadDescOld = isNotNull(establecimientoOld.getModalidad())
				? currentLocale.getLanguage().equalsIgnoreCase(Constantes.EUSKERA)
						? establecimientoOld.getModalidad().getDescModalidadEu()
						: establecimientoOld.getModalidad().getDescModalidadEs()
				: "";

		String numPlazasOld = isNotNull(dataOld.getNumPlazas()) ? String.valueOf(dataOld.getNumPlazas()) : "";
		String numPlazasNew = isNotNull(dataNew.getNumPlazas()) ? String.valueOf(dataNew.getNumPlazas()) : "";

		String numBanosOld = isNotNull(dataOld.getNumBanosGenerales()) ? String.valueOf(dataOld.getNumBanosGenerales())
				: "";
		String numBanosNew = isNotNull(dataNew.getNumBanosGenerales()) ? String.valueOf(dataNew.getNumBanosGenerales())
				: "";

		String superficeTotalOld = isNotNull(dataOld.getSuperficieTotal()) ? dataOld.getSuperficieTotal().toString()
				: "";
		String superficeTotalNew = isNotNull(dataNew.getSuperficieTotal()) ? dataNew.getSuperficieTotal().toString()
				: "";

		fields.add(new FieldExpedienteCompare("establecimientoData.modalidad.idModalidad", idModalidadOld,
				idModalidadNew, FieldExpedienteCompare.TEXT, modalidadDescOld, modalidadDescNew));
		fields.add(new FieldExpedienteCompare("establecimientoData.numPlazas", numPlazasOld, numPlazasNew,
				FieldExpedienteCompare.TEXT));
		fields.add(new FieldExpedienteCompare("establecimientoData.numBanosGenerales", numBanosOld, numBanosNew,
				FieldExpedienteCompare.TEXT));
		fields.add(new FieldExpedienteCompare("establecimientoData.superficieTotal", superficeTotalOld,
				superficeTotalNew, FieldExpedienteCompare.TEXT));
	}

	protected void findDiffCasasRurales(Establecimiento establecimientoNew, Establecimiento establecimientoOld,
			List<FieldExpedienteCompare> fields) {

		Locale currentLocale = LocaleContextHolder.getLocale();

		EstablecimientoData dataOld = isNotNull(establecimientoOld.getEstablecimientoData())
				? establecimientoOld.getEstablecimientoData() : new EstablecimientoData();
		EstablecimientoData dataNew = isNotNull(establecimientoNew.getEstablecimientoData())
				? establecimientoNew.getEstablecimientoData() : new EstablecimientoData();

		String idModalidadNew = isNotNull(establecimientoNew.getModalidad())
				&& isNotNull(establecimientoNew.getModalidad().getIdModalidad())
						? String.valueOf(establecimientoNew.getModalidad().getIdModalidad()) : "";
		String modalidadDescNew = isNotNull(establecimientoNew.getModalidad())
				? currentLocale.getLanguage().equalsIgnoreCase(Constantes.EUSKERA)
						? establecimientoNew.getModalidad().getDescModalidadEu()
						: establecimientoNew.getModalidad().getDescModalidadEs()
				: "";

		String idModalidadOld = isNotNull(establecimientoOld.getModalidad())
				&& isNotNull(establecimientoNew.getModalidad().getIdModalidad())
						? String.valueOf(establecimientoOld.getModalidad().getIdModalidad()) : "";
		String modalidadDescOld = isNotNull(establecimientoOld.getModalidad())
				? currentLocale.getLanguage().equalsIgnoreCase(Constantes.EUSKERA)
						? establecimientoOld.getModalidad().getDescModalidadEu()
						: establecimientoOld.getModalidad().getDescModalidadEs()
				: "";
		String servicioComedorOld = isNotNull(dataOld.getServicioComedor()) ? dataOld.getServicioComedor().toString()
				: "0";
		String servicioComedorNew = isNotNull(dataNew.getServicioComedor()) ? dataNew.getServicioComedor().toString()
				: "0";

		String derechoCocinaOld = isNotNull(dataOld.getDerechoCocina()) ? dataOld.getDerechoCocina().toString() : "0";
		String derechoCocinaNew = isNotNull(dataNew.getDerechoCocina()) ? dataNew.getDerechoCocina().toString() : "0";

		String totUnidAlojaOld = isNotNull(establecimientoOld.getNumUnidadesAlojamiento())
				? String.valueOf(establecimientoOld.getNumUnidadesAlojamiento()) : "";
		String totUnidAlojaNew = isNotNull(establecimientoNew.getNumUnidadesAlojamiento())
				? String.valueOf(establecimientoNew.getNumUnidadesAlojamiento()) : "";

		String totalPlazasOld = isNotNull(dataOld.getNumPlazas()) ? String.valueOf(dataOld.getNumPlazas()) : "";
		String totalPlazasNew = isNotNull(dataNew.getNumPlazas()) ? String.valueOf(dataNew.getNumPlazas()) : "";

		String supletoriaOld = isNotNull(dataOld.getNumMaximoSupletorias())
				? String.valueOf(dataOld.getNumMaximoSupletorias()) : "";
		String supletoriaNew = isNotNull(dataNew.getNumMaximoSupletorias())
				? String.valueOf(dataNew.getNumMaximoSupletorias()) : "";

		fields.add(new FieldExpedienteCompare("establecimientoData.modalidad.idModalidad", idModalidadOld,
				idModalidadNew, FieldExpedienteCompare.TEXT, modalidadDescOld, modalidadDescNew));
		fields.add(new FieldExpedienteCompare("establecimientoData.servicioComedor", servicioComedorOld,
				servicioComedorNew, FieldExpedienteCompare.COMBO));
		fields.add(new FieldExpedienteCompare("establecimientoData.derechoCocina", derechoCocinaOld, derechoCocinaNew,
				FieldExpedienteCompare.COMBO));
		fields.add(new FieldExpedienteCompare("establecimientoData.numUnidadesAlojamiento", totUnidAlojaOld,
				totUnidAlojaNew, FieldExpedienteCompare.TEXT));
		fields.add(new FieldExpedienteCompare("establecimientoData.numPlazas", totalPlazasOld, totalPlazasNew,
				FieldExpedienteCompare.TEXT));
		fields.add(new FieldExpedienteCompare("establecimientoData.numMaximoSupletorias", supletoriaOld, supletoriaNew,
				FieldExpedienteCompare.TEXT));

	}

	protected void findDiffAgroturismos(Establecimiento establecimientoNew, Establecimiento establecimientoOld,
			List<FieldExpedienteCompare> fields) {

		Locale currentLocale = LocaleContextHolder.getLocale();

		EstablecimientoData dataOld = isNotNull(establecimientoOld.getEstablecimientoData())
				? establecimientoOld.getEstablecimientoData() : new EstablecimientoData();
		EstablecimientoData dataNew = isNotNull(establecimientoNew.getEstablecimientoData())
				? establecimientoNew.getEstablecimientoData() : new EstablecimientoData();

		String idModalidadNew = isNotNull(establecimientoNew.getModalidad())
				&& isNotNull(establecimientoNew.getModalidad().getIdModalidad())
						? String.valueOf(establecimientoNew.getModalidad().getIdModalidad()) : "";
		String modalidadDescNew = isNotNull(establecimientoNew.getModalidad())
				? currentLocale.getLanguage().equalsIgnoreCase(Constantes.EUSKERA)
						? establecimientoNew.getModalidad().getDescModalidadEu()
						: establecimientoNew.getModalidad().getDescModalidadEs()
				: "";

		String idModalidadOld = isNotNull(establecimientoOld.getModalidad())
				&& isNotNull(establecimientoNew.getModalidad().getIdModalidad())
						? String.valueOf(establecimientoOld.getModalidad().getIdModalidad()) : "";
		String modalidadDescOld = isNotNull(establecimientoOld.getModalidad())
				? currentLocale.getLanguage().equalsIgnoreCase(Constantes.EUSKERA)
						? establecimientoOld.getModalidad().getDescModalidadEu()
						: establecimientoOld.getModalidad().getDescModalidadEs()
				: "";

		String servicioComedorOld = isNotNull(dataOld.getServicioComedor()) ? dataOld.getServicioComedor().toString()
				: "0";
		String servicioComedorNew = isNotNull(dataNew.getServicioComedor()) ? dataNew.getServicioComedor().toString()
				: "0";

		String derechoCocinaOld = isNotNull(dataOld.getDerechoCocina()) ? dataOld.getDerechoCocina().toString() : "0";
		String derechoCocinaNew = isNotNull(dataNew.getDerechoCocina()) ? dataNew.getDerechoCocina().toString() : "0";

		String totUnidAlojaOld = isNotNull(establecimientoOld.getNumUnidadesAlojamiento())
				? String.valueOf(establecimientoOld.getNumUnidadesAlojamiento()) : "";
		String totUnidAlojaNew = isNotNull(establecimientoNew.getNumUnidadesAlojamiento())
				? String.valueOf(establecimientoNew.getNumUnidadesAlojamiento()) : "";

		String totalPlazasOld = isNotNull(dataOld.getNumPlazas()) ? String.valueOf(dataOld.getNumPlazas()) : "";
		String totalPlazasNew = isNotNull(dataNew.getNumPlazas()) ? String.valueOf(dataNew.getNumPlazas()) : "";

		String supletoriaOld = isNotNull(dataOld.getNumMaximoSupletorias())
				? String.valueOf(dataOld.getNumMaximoSupletorias()) : "";
		String supletoriaNew = isNotNull(dataNew.getNumMaximoSupletorias())
				? String.valueOf(dataNew.getNumMaximoSupletorias()) : "";

		fields.add(new FieldExpedienteCompare("establecimientoData.modalidad.idModalidad", idModalidadOld,
				idModalidadNew, FieldExpedienteCompare.TEXT, modalidadDescOld, modalidadDescNew));

		fields.add(new FieldExpedienteCompare("establecimientoData.servicioComedor", servicioComedorOld,
				servicioComedorNew, FieldExpedienteCompare.COMBO));
		fields.add(new FieldExpedienteCompare("establecimientoData.derechoCocina", derechoCocinaOld, derechoCocinaNew,
				FieldExpedienteCompare.COMBO));
		fields.add(new FieldExpedienteCompare("establecimientoData.numUnidadesAlojamiento", totUnidAlojaOld,
				totUnidAlojaNew, FieldExpedienteCompare.TEXT));
		fields.add(new FieldExpedienteCompare("establecimientoData.numPlazas", totalPlazasOld, totalPlazasNew,
				FieldExpedienteCompare.TEXT));
		fields.add(new FieldExpedienteCompare("establecimientoData.numMaximoSupletorias", supletoriaOld, supletoriaNew,
				FieldExpedienteCompare.TEXT));

	}

	protected void findDiffCamping(Establecimiento establecimientoNew, Establecimiento establecimientoOld,
			List<FieldExpedienteCompare> fields) {
		Locale currentLocale = LocaleContextHolder.getLocale();

		EstablecimientoData dataOld = isNotNull(establecimientoOld.getEstablecimientoData())
				? establecimientoOld.getEstablecimientoData() : new EstablecimientoData();
		EstablecimientoData dataNew = isNotNull(establecimientoNew.getEstablecimientoData())
				? establecimientoNew.getEstablecimientoData() : new EstablecimientoData();

		String idModalidadNew = isNotNull(establecimientoNew.getModalidad())
				&& isNotNull(establecimientoNew.getModalidad().getIdModalidad())
						? String.valueOf(establecimientoNew.getModalidad().getIdModalidad()) : "";
		String modalidadDescNew = isNotNull(establecimientoNew.getModalidad())
				? currentLocale.getLanguage().equalsIgnoreCase(Constantes.EUSKERA)
						? establecimientoNew.getModalidad().getDescModalidadEu()
						: establecimientoNew.getModalidad().getDescModalidadEs()
				: "";

		String idModalidadOld = isNotNull(establecimientoOld.getModalidad())
				&& isNotNull(establecimientoNew.getModalidad().getIdModalidad())
						? String.valueOf(establecimientoOld.getModalidad().getIdModalidad()) : "";
		String modalidadDescOld = isNotNull(establecimientoOld.getModalidad())
				? currentLocale.getLanguage().equalsIgnoreCase(Constantes.EUSKERA)
						? establecimientoOld.getModalidad().getDescModalidadEu()
						: establecimientoOld.getModalidad().getDescModalidadEs()
				: "";

		String idCategoriaNew = isNotNull(establecimientoNew.getCategoria())
				&& isNotNull(establecimientoNew.getCategoria().getIdCategorias())
						? String.valueOf(establecimientoNew.getCategoria().getIdCategorias()) : "";
		String categoriaDescNew = isNotNull(establecimientoNew.getCategoria())
				? currentLocale.getLanguage().equalsIgnoreCase(Constantes.EUSKERA)
						? establecimientoNew.getCategoria().getDescCategoriaEu()
						: establecimientoNew.getCategoria().getDescCategoriaEs()
				: "";

		String idCategoriaOld = isNotNull(establecimientoOld.getCategoria())
				&& isNotNull(establecimientoOld.getCategoria().getIdCategorias())
						? String.valueOf(establecimientoOld.getCategoria().getIdCategorias()) : "";
		String categoriaDescOld = isNotNull(establecimientoOld.getCategoria())
				? currentLocale.getLanguage().equalsIgnoreCase(Constantes.EUSKERA)
						? establecimientoOld.getCategoria().getDescCategoriaEu()
						: establecimientoOld.getCategoria().getDescCategoriaEs()
				: "";

		String totalParcelasOld = isNotNull(dataOld.getNumTotParcelas()) ? String.valueOf(dataOld.getNumTotParcelas())
				: "";
		String totalParcelasNew = isNotNull(dataNew.getNumTotParcelas()) ? String.valueOf(dataNew.getNumTotParcelas())
				: "";

		String totalPlazasOld = isNotNull(dataOld.getNumPlazas()) ? String.valueOf(dataOld.getNumPlazas()) : "";
		String totalPlazasNew = isNotNull(dataNew.getNumPlazas()) ? String.valueOf(dataNew.getNumPlazas()) : "";

		fields.add(new FieldExpedienteCompare("establecimientoData.modalidad.idModalidad", idModalidadOld,
				idModalidadNew, FieldExpedienteCompare.TEXT, modalidadDescOld, modalidadDescNew));
		fields.add(new FieldExpedienteCompare("establecimientoData.categoria", idCategoriaOld, idCategoriaNew,
				FieldExpedienteCompare.TEXT, categoriaDescOld, categoriaDescNew));
		fields.add(new FieldExpedienteCompare("establecimientoData.numParcelas", totalParcelasOld, totalParcelasNew,
				FieldExpedienteCompare.TEXT));
		fields.add(new FieldExpedienteCompare("establecimientoData.numPlazas", totalPlazasOld, totalPlazasNew,
				FieldExpedienteCompare.TEXT));

	}

	protected void findDiffAlberguesTuristicos(Establecimiento establecimientoNew, Establecimiento establecimientoOld,
			List<FieldExpedienteCompare> fields) {
		Locale currentLocale = LocaleContextHolder.getLocale();

		EstablecimientoData dataOld = isNotNull(establecimientoOld.getEstablecimientoData())
				? establecimientoOld.getEstablecimientoData() : new EstablecimientoData();
		EstablecimientoData dataNew = isNotNull(establecimientoNew.getEstablecimientoData())
				? establecimientoNew.getEstablecimientoData() : new EstablecimientoData();

		String idEspecialidadNew = isNotNull(establecimientoNew.getEspecialidad())
				&& isNotNull(establecimientoNew.getEspecialidad().getIdEspecialidad())
						? String.valueOf(establecimientoNew.getEspecialidad().getIdEspecialidad()) : "";
		String especialidadDescNew = isNotNull(establecimientoNew.getEspecialidad())
				? currentLocale.getLanguage().equalsIgnoreCase(Constantes.EUSKERA)
						? establecimientoNew.getEspecialidad().getDescCategoriaEu()
						: establecimientoNew.getEspecialidad().getDescCategoriaEs()
				: "";

		String idEspecialidadOld = isNotNull(establecimientoOld.getEspecialidad())
				&& isNotNull(establecimientoOld.getEspecialidad().getIdEspecialidad())
						? String.valueOf(establecimientoOld.getEspecialidad().getIdEspecialidad()) : "";
		String especialidadDescOld = isNotNull(establecimientoOld.getEspecialidad())
				? currentLocale.getLanguage().equalsIgnoreCase(Constantes.EUSKERA)
						? establecimientoOld.getEspecialidad().getDescCategoriaEu()
						: establecimientoOld.getEspecialidad().getDescCategoriaEs()
				: "";

		String servicioComedorOld = isNotNull(dataOld.getServicioComedor()) ? dataOld.getServicioComedor().toString()
				: "0";
		String servicioComedorNew = isNotNull(dataNew.getServicioComedor()) ? dataNew.getServicioComedor().toString()
				: "0";

		String derechoCocinaOld = isNotNull(dataOld.getDerechoCocina()) ? dataOld.getDerechoCocina().toString() : "0";
		String derechoCocinaNew = isNotNull(dataNew.getDerechoCocina()) ? dataNew.getDerechoCocina().toString() : "0";

		String totUnidAlojaOld = isNotNull(establecimientoOld.getNumUnidadesAlojamiento())
				? String.valueOf(establecimientoOld.getNumUnidadesAlojamiento()) : "";
		String totUnidAlojaNew = isNotNull(establecimientoNew.getNumUnidadesAlojamiento())
				? String.valueOf(establecimientoNew.getNumUnidadesAlojamiento()) : "";

		String totalPlazasOld = isNotNull(dataOld.getNumPlazas()) ? String.valueOf(dataOld.getNumPlazas()) : "";
		String totalPlazasNew = isNotNull(dataNew.getNumPlazas()) ? String.valueOf(dataNew.getNumPlazas()) : "";

		String supCocinaOld = isNotNull(dataOld.getNumSupCocina()) ? String.valueOf(dataOld.getNumSupCocina()) : "";
		String supCocinaNew = isNotNull(dataNew.getNumSupCocina()) ? String.valueOf(dataNew.getNumSupCocina()) : "";

		fields.add(new FieldExpedienteCompare("establecimientoData.especialidad", idEspecialidadOld, idEspecialidadNew,
				FieldExpedienteCompare.TEXT, especialidadDescOld, especialidadDescNew));
		fields.add(new FieldExpedienteCompare("establecimientoData.servicioComedor", servicioComedorOld,
				servicioComedorNew, FieldExpedienteCompare.COMBO));
		fields.add(new FieldExpedienteCompare("establecimientoData.derechoCocina", derechoCocinaOld, derechoCocinaNew,
				FieldExpedienteCompare.COMBO));
		fields.add(new FieldExpedienteCompare("establecimientoData.numUnidadesAlojamiento", totUnidAlojaOld,
				totUnidAlojaNew, FieldExpedienteCompare.TEXT));
		fields.add(new FieldExpedienteCompare("establecimientoData.numPlazas", totalPlazasOld, totalPlazasNew,
				FieldExpedienteCompare.TEXT));
		fields.add(new FieldExpedienteCompare("establecimientoData.numSupCocina", supCocinaOld, supCocinaNew,
				FieldExpedienteCompare.TEXT));

	}

	protected void findDiffApartamentosTuristicos(Establecimiento establecimientoNew,
			Establecimiento establecimientoOld, List<FieldExpedienteCompare> fields) {
		Locale currentLocale = LocaleContextHolder.getLocale();

		EstablecimientoData dataOld = isNotNull(establecimientoOld.getEstablecimientoData())
				? establecimientoOld.getEstablecimientoData() : new EstablecimientoData();
		EstablecimientoData dataNew = isNotNull(establecimientoNew.getEstablecimientoData())
				? establecimientoNew.getEstablecimientoData() : new EstablecimientoData();

		String idModalidadNew = isNotNull(establecimientoNew.getModalidad())
				&& isNotNull(establecimientoNew.getModalidad().getIdModalidad())
						? String.valueOf(establecimientoNew.getModalidad().getIdModalidad()) : "";
		String modalidadDescNew = isNotNull(establecimientoNew.getModalidad())
				? currentLocale.getLanguage().equalsIgnoreCase(Constantes.EUSKERA)
						? establecimientoNew.getModalidad().getDescModalidadEu()
						: establecimientoNew.getModalidad().getDescModalidadEs()
				: "";

		String idModalidadOld = isNotNull(establecimientoOld.getModalidad())
				&& isNotNull(establecimientoNew.getModalidad().getIdModalidad())
						? String.valueOf(establecimientoOld.getModalidad().getIdModalidad()) : "";
		String modalidadDescOld = isNotNull(establecimientoOld.getModalidad())
				? currentLocale.getLanguage().equalsIgnoreCase(Constantes.EUSKERA)
						? establecimientoOld.getModalidad().getDescModalidadEu()
						: establecimientoOld.getModalidad().getDescModalidadEs()
				: "";
		String idEspecialidadNew = isNotNull(establecimientoNew.getEspecialidad())
				&& isNotNull(establecimientoNew.getEspecialidad().getIdEspecialidad())
						? String.valueOf(establecimientoNew.getEspecialidad().getIdEspecialidad()) : "";
		String especialidadDescNew = isNotNull(establecimientoNew.getEspecialidad())
				? currentLocale.getLanguage().equalsIgnoreCase(Constantes.EUSKERA)
						? establecimientoNew.getEspecialidad().getDescCategoriaEu()
						: establecimientoNew.getEspecialidad().getDescCategoriaEs()
				: "";

		String idEspecialidadOld = isNotNull(establecimientoOld.getEspecialidad())
				&& isNotNull(establecimientoOld.getEspecialidad().getIdEspecialidad())
						? String.valueOf(establecimientoOld.getEspecialidad().getIdEspecialidad()) : "";
		String especialidadDescOld = isNotNull(establecimientoOld.getEspecialidad())
				? currentLocale.getLanguage().equalsIgnoreCase(Constantes.EUSKERA)
						? establecimientoOld.getEspecialidad().getDescCategoriaEu()
						: establecimientoOld.getEspecialidad().getDescCategoriaEs()
				: "";

		String idCategoriaNew = isNotNull(establecimientoNew.getCategoria())
				&& isNotNull(establecimientoNew.getCategoria().getIdCategorias())
						? String.valueOf(establecimientoNew.getCategoria().getIdCategorias()) : "";
		String categoriaDescNew = isNotNull(establecimientoNew.getCategoria())
				? currentLocale.getLanguage().equalsIgnoreCase(Constantes.EUSKERA)
						? establecimientoNew.getCategoria().getDescCategoriaEu()
						: establecimientoNew.getCategoria().getDescCategoriaEs()
				: "";

		String idCategoriaOld = isNotNull(establecimientoOld.getCategoria())
				&& isNotNull(establecimientoOld.getCategoria().getIdCategorias())
						? String.valueOf(establecimientoOld.getCategoria().getIdCategorias()) : "";
		String categoriaDescOld = isNotNull(establecimientoOld.getCategoria())
				? currentLocale.getLanguage().equalsIgnoreCase(Constantes.EUSKERA)
						? establecimientoOld.getCategoria().getDescCategoriaEu()
						: establecimientoOld.getCategoria().getDescCategoriaEs()
				: "";

		String totUnidAlojaOld = isNotNull(establecimientoOld.getNumUnidadesAlojamiento())
				? String.valueOf(establecimientoOld.getNumUnidadesAlojamiento()) : "";
		String totUnidAlojaNew = isNotNull(establecimientoNew.getNumUnidadesAlojamiento())
				? String.valueOf(establecimientoNew.getNumUnidadesAlojamiento()) : "";

		String totalPlazasOld = isNotNull(dataOld.getNumPlazas()) ? String.valueOf(dataOld.getNumPlazas()) : "";
		String totalPlazasNew = isNotNull(dataNew.getNumPlazas()) ? String.valueOf(dataNew.getNumPlazas()) : "";

		fields.add(new FieldExpedienteCompare("establecimientoData.modalidad.idModalidad", idModalidadOld,
				idModalidadNew, FieldExpedienteCompare.TEXT, modalidadDescOld, modalidadDescNew));
		fields.add(new FieldExpedienteCompare("establecimientoData.especialidad", idEspecialidadOld, idEspecialidadNew,
				FieldExpedienteCompare.TEXT, especialidadDescOld, especialidadDescNew));
		fields.add(new FieldExpedienteCompare("establecimientoData.categoria", idCategoriaOld, idCategoriaNew,
				FieldExpedienteCompare.TEXT, categoriaDescOld, categoriaDescNew));
		fields.add(new FieldExpedienteCompare("establecimientoData.numUnidadesAlojamiento", totUnidAlojaOld,
				totUnidAlojaNew, FieldExpedienteCompare.TEXT));
		fields.add(new FieldExpedienteCompare("establecimientoData.numPlazas", totalPlazasOld, totalPlazasNew,
				FieldExpedienteCompare.TEXT));

	}

	protected void findDiffHoteles(Establecimiento establecimientoNew, Establecimiento establecimientoOld,
			List<FieldExpedienteCompare> fields) {
		Locale currentLocale = LocaleContextHolder.getLocale();

		EstablecimientoData dataOld = isNotNull(establecimientoOld.getEstablecimientoData())
				? establecimientoOld.getEstablecimientoData() : new EstablecimientoData();
		EstablecimientoData dataNew = isNotNull(establecimientoNew.getEstablecimientoData())
				? establecimientoNew.getEstablecimientoData() : new EstablecimientoData();

		String idModalidadNew = isNotNull(establecimientoNew.getModalidad())
				&& isNotNull(establecimientoNew.getModalidad().getIdModalidad())
						? String.valueOf(establecimientoNew.getModalidad().getIdModalidad()) : "";
		String modalidadDescNew = isNotNull(establecimientoNew.getModalidad())
				? currentLocale.getLanguage().equalsIgnoreCase(Constantes.EUSKERA)
						? establecimientoNew.getModalidad().getDescModalidadEu()
						: establecimientoNew.getModalidad().getDescModalidadEs()
				: "";

		String idModalidadOld = isNotNull(establecimientoOld.getModalidad())
				&& isNotNull(establecimientoOld.getModalidad().getIdModalidad())
						? String.valueOf(establecimientoOld.getModalidad().getIdModalidad()) : "";
		String modalidadDescOld = isNotNull(establecimientoOld.getModalidad())
				? currentLocale.getLanguage().equalsIgnoreCase(Constantes.EUSKERA)
						? establecimientoOld.getModalidad().getDescModalidadEu()
						: establecimientoOld.getModalidad().getDescModalidadEs()
				: "";
		String idEspecialidadNew = isNotNull(establecimientoNew.getEspecialidad())
				&& isNotNull(establecimientoNew.getEspecialidad().getIdEspecialidad())
						? String.valueOf(establecimientoNew.getEspecialidad().getIdEspecialidad()) : "";
		String especialidadDescNew = isNotNull(establecimientoNew.getEspecialidad())
				? currentLocale.getLanguage().equalsIgnoreCase(Constantes.EUSKERA)
						? establecimientoNew.getEspecialidad().getDescCategoriaEu()
						: establecimientoNew.getEspecialidad().getDescCategoriaEs()
				: "";

		String idEspecialidadOld = isNotNull(establecimientoOld.getEspecialidad())
				&& isNotNull(establecimientoOld.getEspecialidad().getIdEspecialidad())
						? String.valueOf(establecimientoOld.getEspecialidad().getIdEspecialidad()) : "";
		String especialidadDescOld = isNotNull(establecimientoOld.getEspecialidad())
				? currentLocale.getLanguage().equalsIgnoreCase(Constantes.EUSKERA)
						? establecimientoOld.getEspecialidad().getDescCategoriaEu()
						: establecimientoOld.getEspecialidad().getDescCategoriaEs()
				: "";

		String idCategoriaNew = isNotNull(establecimientoNew.getCategoria())
				&& isNotNull(establecimientoNew.getCategoria().getIdCategorias())
						? String.valueOf(establecimientoNew.getCategoria().getIdCategorias()) : "";
		String categoriaDescNew = isNotNull(establecimientoNew.getCategoria())
				? currentLocale.getLanguage().equalsIgnoreCase(Constantes.EUSKERA)
						? establecimientoNew.getCategoria().getDescCategoriaEu()
						: establecimientoNew.getCategoria().getDescCategoriaEs()
				: "";

		String idCategoriaOld = isNotNull(establecimientoOld.getCategoria())
				&& isNotNull(establecimientoOld.getCategoria().getIdCategorias())
						? String.valueOf(establecimientoOld.getCategoria().getIdCategorias()) : "";
		String categoriaDescOld = isNotNull(establecimientoOld.getCategoria())
				? currentLocale.getLanguage().equalsIgnoreCase(Constantes.EUSKERA)
						? establecimientoOld.getCategoria().getDescCategoriaEu()
						: establecimientoOld.getCategoria().getDescCategoriaEs()
				: "";

		String idGrupoNew = isNotNull(establecimientoNew.getGrupo())
				&& isNotNull(establecimientoNew.getGrupo().getIdGrupo())
						? String.valueOf(establecimientoNew.getGrupo().getIdGrupo()) : "";
		String grupoDescNew = isNotNull(establecimientoNew.getGrupo())
				? currentLocale.getLanguage().equalsIgnoreCase(Constantes.EUSKERA)
						? establecimientoNew.getGrupo().getDescGrupoEu()
						: establecimientoNew.getGrupo().getDescGrupoEs()
				: "";

		String idGrupoOld = isNotNull(establecimientoOld.getGrupo())
				&& isNotNull(establecimientoOld.getGrupo().getIdGrupo())
						? String.valueOf(establecimientoOld.getGrupo().getIdGrupo()) : "";
		String grupoDescOld = isNotNull(establecimientoOld.getGrupo())
				? currentLocale.getLanguage().equalsIgnoreCase(Constantes.EUSKERA)
						? establecimientoOld.getGrupo().getDescGrupoEu()
						: establecimientoOld.getGrupo().getDescGrupoEs()
				: "";

		String servicioComedorOld = isNotNull(dataOld.getServicioComedor()) ? dataOld.getServicioComedor().toString()
				: "0";
		String servicioComedorNew = isNotNull(dataNew.getServicioComedor()) ? dataNew.getServicioComedor().toString()
				: "0";

		String totUnidAlojaOld = isNotNull(establecimientoOld.getNumUnidadesAlojamiento())
				? String.valueOf(establecimientoOld.getNumUnidadesAlojamiento()) : "";
		String totUnidAlojaNew = isNotNull(establecimientoNew.getNumUnidadesAlojamiento())
				? String.valueOf(establecimientoNew.getNumUnidadesAlojamiento()) : "";

		String totalPlazasOld = isNotNull(dataOld.getNumPlazas()) ? String.valueOf(dataOld.getNumPlazas()) : "";
		String totalPlazasNew = isNotNull(dataNew.getNumPlazas()) ? String.valueOf(dataNew.getNumPlazas()) : "";

		fields.add(new FieldExpedienteCompare("establecimientoData.grupo", idGrupoOld, idGrupoNew,
				FieldExpedienteCompare.TEXT, grupoDescOld, grupoDescNew));
		fields.add(new FieldExpedienteCompare("establecimientoData.modalidad.idModalidad", idModalidadOld,
				idModalidadNew, FieldExpedienteCompare.TEXT, modalidadDescOld, modalidadDescNew));
		fields.add(new FieldExpedienteCompare("establecimientoData.especialidad", idEspecialidadOld, idEspecialidadNew,
				FieldExpedienteCompare.TEXT, especialidadDescOld, especialidadDescNew));
		fields.add(new FieldExpedienteCompare("establecimientoData.categoria", idCategoriaOld, idCategoriaNew,
				FieldExpedienteCompare.TEXT, categoriaDescOld, categoriaDescNew));
		fields.add(new FieldExpedienteCompare("establecimientoData.servicioComedor", servicioComedorOld,
				servicioComedorNew, FieldExpedienteCompare.COMBO));
		fields.add(new FieldExpedienteCompare("establecimientoData.numUnidadesAlojamiento", totUnidAlojaOld,
				totUnidAlojaNew, FieldExpedienteCompare.TEXT));
		fields.add(new FieldExpedienteCompare("establecimientoData.numPlazas", totalPlazasOld, totalPlazasNew,
				FieldExpedienteCompare.TEXT));

	}

	protected void findDiffAgenciasViajes(Establecimiento establecimientoNew, Establecimiento establecimientoOld,
			List<FieldExpedienteCompare> fields) {
		Locale currentLocale = LocaleContextHolder.getLocale();
		String modalidadNew = isNotNull(establecimientoNew.getModalidad())
				? establecimientoNew.getModalidad().getIdModalidad() : "";
		String modalidadDescNew = isNotNull(establecimientoNew.getModalidad())
				? currentLocale.getLanguage().equalsIgnoreCase(Constantes.EUSKERA)
						? establecimientoNew.getModalidad().getDescModalidadEu()
						: establecimientoNew.getModalidad().getDescModalidadEs()
				: "";
		String modalidadOld = isNotNull(establecimientoOld.getModalidad())
				? establecimientoOld.getModalidad().getIdModalidad() : "";
		String modalidadDescOld = isNotNull(establecimientoOld.getModalidad())
				? currentLocale.getLanguage().equalsIgnoreCase(Constantes.EUSKERA)
						? establecimientoOld.getModalidad().getDescModalidadEu()
						: establecimientoOld.getModalidad().getDescModalidadEs()
				: "";
		String grupoNew = isNotNull(establecimientoNew.getGrupo()) ? establecimientoNew.getGrupo().getIdGrupo() : "";
		String grupoDescNew = isNotNull(establecimientoNew.getGrupo())
				? currentLocale.getLanguage().equalsIgnoreCase(Constantes.EUSKERA)
						? establecimientoNew.getGrupo().getDescGrupoEu()
						: establecimientoNew.getGrupo().getDescGrupoEs()
				: "";
		String grupoOld = isNotNull(establecimientoOld.getGrupo()) ? establecimientoOld.getGrupo().getIdGrupo() : "";
		String grupoDescOld = isNotNull(establecimientoOld.getGrupo())
				? currentLocale.getLanguage().equalsIgnoreCase(Constantes.EUSKERA)
						? establecimientoOld.getGrupo().getDescGrupoEu()
						: establecimientoOld.getGrupo().getDescGrupoEs()
				: "";

		AgenciaData dataOld = isNotNull(establecimientoOld.getAgenciaData()) ? establecimientoOld.getAgenciaData()
				: new AgenciaData();
		AgenciaData dataNew = isNotNull(establecimientoNew.getAgenciaData()) ? establecimientoNew.getAgenciaData()
				: new AgenciaData();

		String numCieNew = isNotNull(dataNew.getNumCie()) ? dataNew.getNumCie() : "";
		String numCieOld = isNotNull(dataOld.getNumCie()) ? dataOld.getNumCie() : "";

		boolean isCAPV = "C".equalsIgnoreCase(dataNew.getIdOrigenOfiPrincipal());
		boolean isNacional = "E".equalsIgnoreCase(dataNew.getIdOrigenOfiPrincipal());
		boolean isEstranjera = "X".equalsIgnoreCase(dataNew.getIdOrigenOfiPrincipal());
		String descCAPV = appMessageSource.getMessage("formDatosEspecificos.capv", null,
				LocaleContextHolder.getLocale());
		String descNacional = appMessageSource.getMessage("formDatosEspecificos.nacional", null,
				LocaleContextHolder.getLocale());
		String descEstranjero = appMessageSource.getMessage("formDatosEspecificos.extranjera", null,
				LocaleContextHolder.getLocale());

		String origenOficinaNew = isNotNull(dataNew.getIdOrigenOfiPrincipal()) ? dataNew.getIdOrigenOfiPrincipal() : "";
		String origenOficinaDescNew = isNotNull(dataNew.getIdOrigenOfiPrincipal())
				? (isCAPV) ? descCAPV : (isNacional) ? descNacional : (isEstranjera) ? descEstranjero : "" : "";

		isCAPV = "C".equalsIgnoreCase(dataOld.getIdOrigenOfiPrincipal());
		isNacional = "E".equalsIgnoreCase(dataOld.getIdOrigenOfiPrincipal());
		isEstranjera = "X".equalsIgnoreCase(dataOld.getIdOrigenOfiPrincipal());

		String origenOficinaOld = isNotNull(dataOld.getIdOrigenOfiPrincipal()) ? dataOld.getIdOrigenOfiPrincipal() : "";
		String origenOficinaDescOld = isNotNull(dataOld.getIdOrigenOfiPrincipal())
				? (isCAPV) ? descCAPV : (isNacional) ? descNacional : (isEstranjera) ? descEstranjero : "" : "";

		appMessageSource.getMessage("formDatosEspecificos.nacional", null, LocaleContextHolder.getLocale());
		appMessageSource.getMessage("formDatosEspecificos.extranjero", null, LocaleContextHolder.getLocale());
		fields.add(new FieldExpedienteCompare("establecimientoData.modalidad.idModalidad", modalidadOld, modalidadNew,
				FieldExpedienteCompare.TEXT, modalidadDescOld, modalidadDescNew));
		fields.add(new FieldExpedienteCompare("establecimientoData.grupo", grupoOld, grupoNew,
				FieldExpedienteCompare.TEXT, grupoDescOld, grupoDescNew));

		fields.add(new FieldExpedienteCompare("agenciaData.numCie", numCieOld, numCieNew, FieldExpedienteCompare.TEXT));
		fields.add(new FieldExpedienteCompare("agenciaData.origenOficina", origenOficinaOld, origenOficinaNew,
				FieldExpedienteCompare.TEXT, origenOficinaDescOld, origenOficinaDescNew));
		// fields.add(new FieldExpedienteCompare("agenciaData.numCie", "old",
		// "new", FieldExpedienteCompare.TEXT));

	}

	protected void findDiffAgenciasViajesUbicacion(Establecimiento establecimientoNew,
			Establecimiento establecimientoOld, List<FieldExpedienteCompare> fields,
			CompareExpedienteSection sectionDireccion, Integer priority, Long isTipoDireccion) {
		DatosDirecciones direccionOld = this.datosDireccionesService.findDireccionEstablecimiento(establecimientoOld,
				isTipoDireccion);
		DatosDirecciones direccionNew = this.datosDireccionesService.findDireccionEstablecimiento(establecimientoNew,
				isTipoDireccion);

		if (isNull(direccionOld) && isNotNull(direccionNew) && direccionNew.getIdDireccion() > 0) {
			sectionDireccion.setIdSection(direccionNew.getIdDireccion());
			sectionDireccion.setNewElement(true);
		} else {
			sectionDireccion.setIdSection(direccionOld.getIdDireccion());
		}

		String paisOld = (isNotNull(direccionOld) && isNotNull(direccionOld.getIdDireccion())
				&& isNotNull(direccionOld.getIdPais())) ? direccionOld.getIdPaisPad() : "";
		String descPaisOld = (isNotNull(direccionOld) && isNotNull(direccionOld.getIdDireccion())
				&& isNotNull(direccionOld.getIdPais())) ? direccionOld.getPaisdso() : "";

		String paisNew = (isNotNull(direccionNew) && isNotNull(direccionNew.getIdDireccion())
				&& isNotNull(direccionNew.getIdPais())) ? direccionNew.getIdPaisPad() : "";
		String descPaisNew = (isNotNull(direccionNew) && isNotNull(direccionNew.getIdDireccion())
				&& isNotNull(direccionNew.getIdPais())) ? direccionNew.getPaisdso() : "";

		String provOld = (isNotNull(direccionOld) && isNotNull(direccionOld.getIdDireccion())
				&& isNotNull(direccionOld.getIdProvincia())) ? direccionOld.getIdProvinciaPad() : "";
		String descProvOld = (isNotNull(direccionOld) && isNotNull(direccionOld.getIdDireccion())
				&& isNotNull(direccionOld.getIdProvincia())) ? direccionOld.getProvinciadso() : "";

		String provNew = (isNotNull(direccionNew) && isNotNull(direccionNew.getIdDireccion())
				&& isNotNull(direccionNew.getIdProvincia())) ? direccionNew.getIdProvinciaPad() : "";
		String descProvNew = (isNotNull(direccionNew) && isNotNull(direccionNew.getIdDireccion())
				&& isNotNull(direccionNew.getIdProvincia())) ? direccionNew.getProvinciadso() : "";

		String muniOld = (isNotNull(direccionOld) && isNotNull(direccionOld.getIdDireccion())
				&& isNotNull(direccionOld.getIdMunicipio())) ? direccionOld.getIdMunicipioPad() : "";
		String descMuniOld = (isNotNull(direccionOld) && isNotNull(direccionOld.getIdDireccion())
				&& isNotNull(direccionOld.getIdMunicipio())) ? direccionOld.getMunicipiodso() : "";

		String muniNew = (isNotNull(direccionNew) && isNotNull(direccionNew.getIdDireccion())
				&& isNotNull(direccionNew.getIdMunicipio())) ? direccionNew.getIdMunicipioPad() : "";
		String descMuniNew = (isNotNull(direccionNew) && isNotNull(direccionNew.getIdDireccion())
				&& isNotNull(direccionNew.getIdMunicipio())) ? direccionNew.getMunicipiodso() : "";

		String localidadOld = (isNotNull(direccionOld) && isNotNull(direccionOld.getIdDireccion())
				&& isNotNull(direccionOld.getIdLocalidad())) ? direccionOld.getIdLocalidadPad() : "";
		String descLocalidadOld = (isNotNull(direccionOld) && isNotNull(direccionOld.getIdDireccion())
				&& isNotNull(direccionOld.getIdLocalidad())) ? direccionOld.getLocalidaddso() : "";

		String localidadNew = (isNotNull(direccionNew) && isNotNull(direccionNew.getIdDireccion())
				&& isNotNull(direccionNew.getIdLocalidad())) ? direccionNew.getIdLocalidadPad() : "";
		String descLocalidadNew = (isNotNull(direccionNew) && isNotNull(direccionNew.getIdDireccion())
				&& isNotNull(direccionNew.getIdLocalidad())) ? direccionNew.getLocalidaddso() : "";

		String direccionEstOld = (isNotNull(direccionOld) && isNotNull(direccionOld.getIdDireccion())
				&& isNotNull(direccionOld.getDireccion())) ? direccionOld.getDireccion() : "";
		String direccionEstNew = (isNotNull(direccionNew) && isNotNull(direccionNew.getIdDireccion())
				&& isNotNull(direccionNew.getDireccion())) ? direccionNew.getDireccion() : "";

		String numeroOld = (isNotNull(direccionOld) && isNotNull(direccionOld.getIdDireccion())
				&& isNotNull(direccionOld.getNumero())) ? direccionOld.getNumero() : "";
		String numeroNew = (isNotNull(direccionNew) && isNotNull(direccionNew.getIdDireccion())
				&& isNotNull(direccionNew.getNumero())) ? direccionNew.getNumero() : "";

		String pisoOld = (isNotNull(direccionOld) && isNotNull(direccionOld.getIdDireccion())
				&& isNotNull(direccionOld.getPiso())) ? direccionOld.getPiso() : "";
		String pisoNew = (isNotNull(direccionNew) && isNotNull(direccionNew.getIdDireccion())
				&& isNotNull(direccionNew.getPiso())) ? direccionNew.getPiso() : "";

		String letraOld = (isNotNull(direccionOld) && isNotNull(direccionOld.getIdDireccion())
				&& isNotNull(direccionOld.getLetra())) ? direccionOld.getLetra() : "";
		String letraNew = (isNotNull(direccionNew) && isNotNull(direccionNew.getIdDireccion())
				&& isNotNull(direccionNew.getLetra())) ? direccionNew.getLetra() : "";

		String escaleraOld = (isNotNull(direccionOld) && isNotNull(direccionOld.getIdDireccion())
				&& isNotNull(direccionOld.getEscalera())) ? direccionOld.getEscalera() : "";
		String escaleraNew = (isNotNull(direccionNew) && isNotNull(direccionNew.getIdDireccion())
				&& isNotNull(direccionNew.getEscalera())) ? direccionNew.getEscalera() : "";

		String codPostalOld = (isNotNull(direccionOld) && isNotNull(direccionOld.getIdDireccion())
				&& isNotNull(direccionOld.getCodigoPostal())) ? direccionOld.getCodigoPostal() : "";
		String codPostalNew = (isNotNull(direccionNew) && isNotNull(direccionNew.getIdDireccion())
				&& isNotNull(direccionNew.getCodigoPostal())) ? direccionNew.getCodigoPostal() : "";

		fields.add(new FieldExpedienteCompare("agenciaData.pais", paisOld, paisNew, FieldExpedienteCompare.TEXT,
				descPaisOld, descPaisNew));
		fields.add(new FieldExpedienteCompare("agenciaData.provincia", provOld, provNew, FieldExpedienteCompare.TEXT,
				descProvOld, descProvNew));
		fields.add(new FieldExpedienteCompare("agenciaData.municipio", muniOld, muniNew, FieldExpedienteCompare.TEXT,
				descMuniOld, descMuniNew));
		fields.add(new FieldExpedienteCompare("agenciaData.localidad", localidadOld, localidadNew,
				FieldExpedienteCompare.TEXT, descLocalidadOld, descLocalidadNew));
		fields.add(new FieldExpedienteCompare("agenciaData.direccion", direccionEstOld, direccionEstNew,
				FieldExpedienteCompare.TEXT));
		fields.add(new FieldExpedienteCompare("agenciaData.numero", numeroOld, numeroNew, FieldExpedienteCompare.TEXT));
		fields.add(new FieldExpedienteCompare("agenciaData.piso", pisoOld, pisoNew, FieldExpedienteCompare.TEXT));
		fields.add(new FieldExpedienteCompare("agenciaData.letra", letraOld, letraNew, FieldExpedienteCompare.TEXT));
		fields.add(new FieldExpedienteCompare("agenciaData.escalera", escaleraOld, escaleraNew,
				FieldExpedienteCompare.TEXT));
		fields.add(new FieldExpedienteCompare("agenciaData.codPostal", codPostalOld, codPostalNew,
				FieldExpedienteCompare.TEXT));
	}

	@Override
	@Transactional(rollbackFor = Throwable.class)
	public Establecimiento updateDatosEspecificos(Establecimiento establecimiento) throws Exception {

		if (Constantes.AGENCIA_VIAJE.equals(establecimiento.getTipoEstablecimiento().getIdTipoEstablecimiento())) {

			establecimiento = this.establecimientoDao.updateDatosEspecificosEstablecimientoFranquicia(establecimiento);

		} else if (Constantes.CAMPING.equals(establecimiento.getTipoEstablecimiento().getIdTipoEstablecimiento())) {

			establecimiento = this.establecimientoDao.updateDatosEspecificosEstablecimientoDataCamping(establecimiento);
			// establecimiento =
			// this.establecimientoDao.updateDatosEspecificosEstablecimientoCamping(establecimiento);
			establecimiento = this.establecimientoDao.updateDatosEspecificosDispensasEstablecimiento(establecimiento);

		} else if (Constantes.HOTEL.equals(establecimiento.getTipoEstablecimiento().getIdTipoEstablecimiento())) {

			establecimiento = this.establecimientoDao.updateDatosEspecificosEstablecimientoDataHotel(establecimiento);
			establecimiento = this.establecimientoDao.updateDatosEspecificosEstablecimientoHotel(establecimiento);

		} else if (Constantes.APARTAMENTO.equals(establecimiento.getTipoEstablecimiento().getIdTipoEstablecimiento())) {

			establecimiento = this.establecimientoDao.updateDatosEspecificosEstablecimientoDataApto(establecimiento);
			// sirve mismo metodo que para Hoteles
			establecimiento = this.establecimientoDao.updateDatosEspecificosEstablecimientoHotel(establecimiento);

		} else if (Constantes.ALBERGUE_TURISTICO
				.equals(establecimiento.getTipoEstablecimiento().getIdTipoEstablecimiento())) {
			establecimiento = this.establecimientoDao
					.updateDatosEspecificosEstablecimientoDataAlbergue(establecimiento);
			// sirve mismo metodo que para Hoteles
			establecimiento = this.establecimientoDao.updateDatosEspecificosEstablecimientoHotel(establecimiento);

		} else if (Constantes.CASA_RURAL.equals(establecimiento.getTipoEstablecimiento().getIdTipoEstablecimiento())) {
			establecimiento = this.establecimientoDao
					.updateDatosEspecificosEstablecimientoDataCasaRural(establecimiento);
			// sirve mismo metodo que para Hoteles
			establecimiento = this.establecimientoDao.updateDatosEspecificosEstablecimientoHotel(establecimiento);

		} else if (Constantes.AGROTURISMO.equals(establecimiento.getTipoEstablecimiento().getIdTipoEstablecimiento())) {
			establecimiento = this.establecimientoDao
					.updateDatosEspecificosEstablecimientoDataCasaRural(establecimiento);
			// sirve mismo metodo que para Hoteles
			establecimiento = this.establecimientoDao.updateDatosEspecificosEstablecimientoHotel(establecimiento);

		} else {
			establecimiento = this.establecimientoDao.updateDatosEspecificosEstablecimiento(establecimiento);
			establecimiento = this.establecimientoDao.updateDatosEspecificosEstablecimientoData(establecimiento);
			establecimiento = this.establecimientoDao.updateDatosEspecificosDispensasEstablecimiento(establecimiento);
		}

		return establecimiento;
	}

	@Override
	@Transactional(rollbackFor = Throwable.class)
	public Establecimiento updateDatosEmpresa(Establecimiento establecimiento) throws Exception {

		if (establecimiento.getTipoEstablecimiento() != null
				&& establecimiento.getTipoEstablecimiento().getIdTipoEstablecimiento() != null
				&& Constantes.AGENCIA_VIAJE
						.equalsIgnoreCase(establecimiento.getTipoEstablecimiento().getIdTipoEstablecimiento())) {

			establecimiento.setTemporada("0");

			if (Constantes.ModalidadFijos.AAVV_SUCURSAL.equals(establecimiento.getModalidad().getIdModalidad())
					|| Constantes.ModalidadFijos.AAVV_PUNTO_VENTA
							.equals(establecimiento.getModalidad().getIdModalidad())) {

				// Comprobacion CIE correcto
				Establecimiento est = this.establecimientoDao
						.getDatosOficinaPpalAAVV(establecimiento.getAgenciaData().getNumCie());

				if (null == est || null == est.getIdEstablecimiento()) {
					throw new Exception(Constantes.ERROR_CIE_INEXISTENTE);
				}

				String origenOficinaPrincipal = this.agenciaDataDao
						.getOrigenOficinaPpal(establecimiento.getAgenciaData().getIdInstalOfiPrincipal());

				if (!establecimiento.getAgenciaData().getIdOrigenOfiPrincipal().equals(origenOficinaPrincipal)) {
					throw new Exception(Constantes.ERROR_ORIGEN_OFICINA_SUCURSALPV_NO_COINCIDE_PPAL);
				}

			}

			// Tabla 35
			establecimiento = this.establecimientoDao.updateDatosEstablecimientoAgencia(establecimiento);

			if (null != establecimiento.getAgenciaData()
					&& null != establecimiento.getAgenciaData().getDireccionOficinaPpalExtranjera()) {

				if (null != establecimiento.getAgenciaData().getDireccionOficinaPpalExtranjera().getIdDireccion()
						&& establecimiento.getAgenciaData().getDireccionOficinaPpalExtranjera().getIdDireccion() > 0) {

					establecimiento = this.agenciaDataDao
							.updateDatosEmpresaDireccionExtranjeraOficinaPpalAAVV(establecimiento);

				} else {
					establecimiento = this.agenciaDataDao
							.addDatosEmpresaDireccionExtranjeraOficinaPpalAAVV(establecimiento);
				}

			}

		}

		// Tabla 01
		establecimiento = this.establecimientoDao.updateDatosEmpresaEstablecimiento(establecimiento);

		// Tabla 21
		if (!Constantes.AGENCIA_VIAJE.equals(establecimiento.getTipoEstablecimiento().getIdTipoEstablecimiento())) {
			establecimiento = this.establecimientoDao.updateDatosEmpresaEstablecimientoData(establecimiento);
		}

		if (establecimiento.getDatosDirecciones() == null
				|| (establecimiento.getDatosDirecciones().getIdDireccion() == null
						|| establecimiento.getDatosDirecciones().getIdDireccion() == 0)) {

			establecimiento.getDatosDirecciones().setDatosTerceros(establecimiento.getDatosTerceros());
			establecimiento = this.establecimientoDao.addDatosEmpresaDireccion(establecimiento);

		} else {

			establecimiento = this.establecimientoDao.updateDatosEmpresaDireccion(establecimiento);
		}

		return establecimiento;
	}

	@Override
	public List<Establecimiento> findAllLikeExcelBusqREATE(Establecimiento filterAb6301s00,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith) {

		List<Establecimiento> establecimientos = this.establecimientoDao.findAllLike(filterAb6301s00, jqGridRequestDto,
				false);
		return establecimientos;
	}

	@Override
	@Transactional(rollbackFor = Throwable.class)
	public Boolean updateChangesExpediente(InitForm form) {
		Establecimiento filter = new Establecimiento();
		filter.setIdentificadorEstablecimiento(form.getIdentificadorEstablecimiento());
		filter.setTipoRegistro(Constantes.TIPO_REGISTRO_DEFINITIVO);
		Establecimiento establecimientoCensado = this.findByIdenticadorEstablecimiento(filter);
		Establecimiento establecimientoExpediente = this.findEstablecimientoByIdExpediente(form.getIdExpediente());

		List<CompareExpedienteSection> mapDiffSections = new ArrayList<CompareExpedienteSection>();
		mapDiffSections.addAll(
				findDiffTerceros(establecimientoCensado, establecimientoExpediente, Constantes.SECCION_PRIORITY_HIGH));
		mapDiffSections.add(findDiffDatosComunes(establecimientoCensado, establecimientoExpediente,
				Constantes.SECCION_PRIORITY_MEDIUM));
		mapDiffSections.addAll(findDiffDatosEspecificos(establecimientoCensado, establecimientoExpediente,
				Constantes.SECCION_PRIORITY_LOW));

		for (Iterator<CompareExpedienteSection> iterator = mapDiffSections.iterator(); iterator.hasNext();) {
			CompareExpedienteSection compareExpedienteSection = iterator.next();
			if (compareExpedienteSection.isHasChanges()) {
				saveSectionModified(compareExpedienteSection, establecimientoCensado, establecimientoExpediente);
			}
		}

		DatosDirecciones direcciones = datosDireccionesService.findEstablecimientoExpediente(form.getIdExpediente());
		if (direcciones.getIdentificadorEstablecimiento() == null
				|| "".equals(direcciones.getIdentificadorEstablecimiento())) {
			direcciones.setIdentificadorEstablecimiento(establecimientoCensado.getIdentificadorEstablecimiento());
			direcciones.setEstablecimiento(establecimientoCensado.getDescrNombre());
			datosDireccionesService.update(direcciones);
		}
		DatosDirecciones direccionesEstablecimientoCensado = datosDireccionesService
				.findDireccionEstablecimiento(establecimientoCensado, Constantes.ID_DIRECCION_ACTIVIDAD);
		direccionesEstablecimientoCensado.setEstablecimiento(establecimientoCensado.getDescrNombre());
		datosDireccionesService.update(direccionesEstablecimientoCensado);

		establecimientoExpediente.setFechaBaja(new Date());
		form.setIdProvinciaEstablecimiento(direccionesEstablecimientoCensado.getIdProvinciaPad());
		this.establecimientoDao.update(establecimientoExpediente);
		this.establecimientoDao.disableChangeIdentifiadorExp(form.getIdExpediente());
		return true;
	}

	@Override
	@Transactional(rollbackFor = Throwable.class)
	public ResultAjaxOperation updateChangesSection(InitForm form, Integer idElement, String sectionType) {
		Establecimiento filter = new Establecimiento();
		filter.setIdentificadorEstablecimiento(form.getIdentificadorEstablecimiento());
		filter.setTipoRegistro(Constantes.TIPO_REGISTRO_DEFINITIVO);
		Establecimiento establecimientoCensado = this.findByIdenticadorEstablecimiento(filter);
		Establecimiento establecimientoExpediente = this.findEstablecimientoByIdExpediente(form.getIdExpediente());

		List<CompareExpedienteSection> mapDiffSections = new ArrayList<CompareExpedienteSection>();
		mapDiffSections.addAll(
				findDiffTerceros(establecimientoCensado, establecimientoExpediente, Constantes.SECCION_PRIORITY_HIGH));
		mapDiffSections.add(findDiffDatosComunes(establecimientoCensado, establecimientoExpediente,
				Constantes.SECCION_PRIORITY_MEDIUM));
		mapDiffSections.addAll(findDiffDatosEspecificos(establecimientoCensado, establecimientoExpediente,
				Constantes.SECCION_PRIORITY_LOW));
		Boolean isAnyUpdate = false;
		for (Iterator<CompareExpedienteSection> iterator = mapDiffSections.iterator(); iterator.hasNext();) {
			CompareExpedienteSection compareExpedienteSection = iterator.next();
			if (compareExpedienteSection.isHasChanges() && sectionType.equals(compareExpedienteSection.getTipoSection())
					&& idElement.equals(compareExpedienteSection.getIdSection())) {
				saveSectionModified(compareExpedienteSection, establecimientoCensado, establecimientoExpediente);
				isAnyUpdate = true;
			}
		}
		if (isAnyUpdate) {
			DatosDirecciones direcciones = datosDireccionesService
					.findEstablecimientoExpediente(form.getIdExpediente());

			direcciones.setIdentificadorEstablecimiento(establecimientoCensado.getIdentificadorEstablecimiento());
			if (Constantes.SECCION_DATOS_COMUNES.equals(sectionType)) {
				direcciones.setEstablecimiento(establecimientoCensado.getDescrNombre());
			}
			datosDireccionesService.update(direcciones);

			DatosDirecciones direccionesEstablecimientoCensado = datosDireccionesService
					.findDireccionEstablecimiento(establecimientoCensado, Constantes.ID_DIRECCION_ACTIVIDAD);
			direccionesEstablecimientoCensado.setEstablecimiento(establecimientoCensado.getDescrNombre());
			datosDireccionesService.update(direccionesEstablecimientoCensado);
			SuccessResultAjaxOperation success = new SuccessResultAjaxOperation("datos_guardados_OK");
			success.setCallback("successUpdateEst");
			success.getData().put("section", sectionType);
			success.getData().put("idSection", String.valueOf(idElement));
			form.setIdProvinciaEstablecimiento(direccionesEstablecimientoCensado.getIdProvinciaPad());
			this.establecimientoDao.disableChangeIdentifiadorExp(form.getIdExpediente());

			ParametrosConfig parametrosConfigFind = new ParametrosConfig();
			parametrosConfigFind.setDescripcion(Constantes.ACTIVADA_PUBLICACION_AA80T);
			ParametrosConfig parametrosConfig = this.parametrosConfigService.find(parametrosConfigFind);

			if (parametrosConfig.getValor() == 1) {
				try {
					generarPublicacionService.generarPublicacion(establecimientoCensado.getIdEstablecimiento());
				} catch (Exception e) {
					EstablecimientoServiceImpl.logger.error("Error en el proceso de modificacion del establecimiento "
							+ establecimientoCensado.getIdEstablecimiento());
					return new ErrorResultAjaxOperation("errorGenerico");
				}
			}
			return success;
		}

		return new ErrorResultAjaxOperation("errorGenerico");
	}

	@Transactional(rollbackFor = Throwable.class)
	void saveSectionModified(CompareExpedienteSection compareExpedienteSection, Establecimiento establecimientoCensado,
			Establecimiento establecimientoExpediente) {

		if (Constantes.SECCION_DATOS_COMUNES.equalsIgnoreCase(compareExpedienteSection.getTipoSection())) {
			updateSectionDatosComunes(establecimientoCensado, establecimientoExpediente);
		}
		if (Constantes.SECCION_DATOS_ESPECIFICOS.equalsIgnoreCase(compareExpedienteSection.getTipoSection())) {
			updateSectionDatosEspecificos(establecimientoCensado, establecimientoExpediente);
		}
		if (Constantes.SECCION_TITULAR.equalsIgnoreCase(compareExpedienteSection.getTipoSection())
				|| Constantes.SECCION_REPRESENTANTE.equalsIgnoreCase(compareExpedienteSection.getTipoSection())) {
			if (compareExpedienteSection.isNewElement()) {
				insertNewTercero(establecimientoCensado, compareExpedienteSection.getIdSection(),
						Constantes.SECCION_TITULAR.equalsIgnoreCase(compareExpedienteSection.getTipoSection()));
			} else {
				updateTercero(establecimientoCensado, establecimientoExpediente,
						compareExpedienteSection.getIdSection());
			}
		}
		if (Constantes.SECCION_DATOS_ESPECIFICOS_UBICACION
				.equalsIgnoreCase(compareExpedienteSection.getTipoSection())) {
			if (compareExpedienteSection.isNewElement()) {
				insertDireccion(establecimientoCensado, compareExpedienteSection.getIdSection());
			} else {
				updateDireccion(establecimientoExpediente, compareExpedienteSection.getIdSection(),
						Constantes.ID_DIRECCION_ACTIVIDAD);
			}
		}
		if (Constantes.SECCION_DATOS_ESPECIFICOS_UBICACION_OFICINA
				.equalsIgnoreCase(compareExpedienteSection.getTipoSection())) {
			if (compareExpedienteSection.isNewElement()) {
				insertDireccion(establecimientoCensado, compareExpedienteSection.getIdSection());
			} else {
				updateDireccion(establecimientoExpediente, compareExpedienteSection.getIdSection(),
						Constantes.ID_DIRECCION_OFICINA_PRINCIPAL);
			}
		}
	}

	private void insertDireccion(Establecimiento establecimientoCensado, Integer idDireccion) {
		DatosDirecciones direccionCensado = this.datosDireccionesService
				.findDireccionEstablecimiento(establecimientoCensado, Constantes.ID_DIRECCION_ACTIVIDAD);
		DatosDirecciones direccionExpediente = this.datosDireccionesService.find(new DatosDirecciones(idDireccion));

		direccionExpediente.setDatosTerceros(direccionCensado.getDatosTerceros());

		this.datosDireccionesService.add(direccionExpediente);
	}

	private void updateDireccion(Establecimiento establecimientoExpediente, Integer idDireccion, long idTipoDireccion) {
		DatosDirecciones direccionExpediente = this.datosDireccionesService
				.findDireccionEstablecimiento(establecimientoExpediente, idTipoDireccion);
		DatosDirecciones direccionCensado = this.datosDireccionesService.find(new DatosDirecciones(idDireccion));

		direccionExpediente.setIdDireccion(direccionCensado.getIdDireccion());
		direccionExpediente.setDatosTerceros(direccionCensado.getDatosTerceros());

		this.datosDireccionesService.update(direccionExpediente);
	}

	@Transactional(rollbackFor = Throwable.class)
	private void updateSectionDatosComunes(Establecimiento establecimientoCensado,
			Establecimiento establecimientoExpediente) {

		establecimientoCensado.setDescrNombre(establecimientoExpediente.getDescrNombre());
		establecimientoCensado.setUrlweb(establecimientoExpediente.getUrlweb());
		establecimientoCensado.setTelefonoPromo(establecimientoExpediente.getTelefonoPromo());
		establecimientoCensado.setCorreoElectronico(establecimientoExpediente.getCorreoElectronico());
		establecimientoCensado.setTelefono(establecimientoExpediente.getTelefono());
		establecimientoCensado.setFechaApertura(establecimientoExpediente.getFechaApertura());
		establecimientoCensado.setPeriodoPuentes(establecimientoExpediente.getPeriodoPuentes());
		establecimientoCensado.setPeriodoVacaciones(establecimientoExpediente.getPeriodoVacaciones());
		establecimientoCensado.setPeriodoVerano(establecimientoExpediente.getPeriodoVerano());
		establecimientoCensado.setSinPeriodoPref(establecimientoExpediente.getSinPeriodoPref());

		this.establecimientoDao.update(establecimientoCensado);
	}

	@Transactional(rollbackFor = Throwable.class)
	private void updateSectionDatosEspecificos(Establecimiento establecimientoSolicitud,
			Establecimiento establecimientoCambios) {
		if (establecimientoSolicitud.isType(Constantes.VIVIENDAS_TURISTICAS)) {
			updateSecionViviendasTuristicas(establecimientoSolicitud, establecimientoCambios);
		}
		if (establecimientoSolicitud.isType(Constantes.HABITACIONES_CASAS_PARTICULARES)) {
			updateSectionHabitacionesTuristicas(establecimientoSolicitud, establecimientoCambios);
		}
		if (establecimientoSolicitud.isType(Constantes.CASA_RURAL)) {
			updateSectionCasasRurales(establecimientoSolicitud, establecimientoCambios);
		}
		if (establecimientoSolicitud.isType(Constantes.AGROTURISMO)) {
			updateSectionAgroturismos(establecimientoSolicitud, establecimientoCambios);
		}
		if (establecimientoSolicitud.isType(Constantes.CAMPING)) {
			updateSectionCamping(establecimientoSolicitud, establecimientoCambios);
		}
		if (establecimientoSolicitud.isType(Constantes.ALBERGUE_TURISTICO)) {
			updateSectionAlberguesTuristicos(establecimientoSolicitud, establecimientoCambios);
		}
		if (establecimientoSolicitud.isType(Constantes.APARTAMENTO)) {
			updateSectionApartamentosTuristicos(establecimientoSolicitud, establecimientoCambios);
		}
		if (establecimientoSolicitud.isType(Constantes.HOTEL)) {
			updateSectionHoteles(establecimientoSolicitud, establecimientoCambios);
		}
		if (establecimientoSolicitud.isType(Constantes.AGENCIA_VIAJE)) {
			updateSectionAgenciasViajes(establecimientoSolicitud, establecimientoCambios);
		}
	}

	@Transactional(rollbackFor = Throwable.class)
	private void updateSecionViviendasTuristicas(Establecimiento establecimientoSolicitud,
			Establecimiento establecimientoCambios) {

		EstablecimientoData establecimientoDataSolicitud = establecimientoSolicitud.getEstablecimientoData();
		EstablecimientoData establecimientoDataCambios = establecimientoCambios.getEstablecimientoData();

		establecimientoSolicitud.getModalidad().setIdModalidad(establecimientoCambios.getModalidad().getIdModalidad());

		establecimientoDataSolicitud.setNumPlazas(establecimientoDataCambios.getNumPlazas());
		establecimientoDataSolicitud.setNumBanosGenerales(establecimientoDataCambios.getNumBanosGenerales());
		establecimientoDataSolicitud.setSuperficieTotal(establecimientoDataCambios.getSuperficieTotal());

		this.establecimientoDataService.update(establecimientoDataSolicitud);
		this.establecimientoDao.update(establecimientoSolicitud);
	}

	@Transactional(rollbackFor = Throwable.class)
	private void updateSectionHabitacionesTuristicas(Establecimiento establecimientoSolicitud,
			Establecimiento establecimientoCambios) {
		EstablecimientoData establecimientoDataSolicitud = establecimientoSolicitud.getEstablecimientoData();
		EstablecimientoData establecimientoDataCambios = establecimientoCambios.getEstablecimientoData();

		establecimientoSolicitud.getModalidad().setIdModalidad(establecimientoCambios.getModalidad().getIdModalidad());

		establecimientoDataSolicitud.setNumDormitoriosUsuarios(establecimientoDataCambios.getNumDormitoriosUsuarios());
		establecimientoDataSolicitud
				.setNumDormitoriosResidentes(establecimientoDataCambios.getNumDormitoriosResidentes());
		establecimientoDataSolicitud.setNumResidentesPerm(establecimientoDataCambios.getNumResidentesPerm());
		establecimientoDataSolicitud.setNumPlazas(establecimientoDataCambios.getNumPlazas());
		establecimientoDataSolicitud.setNumBanosGenerales(establecimientoDataCambios.getNumBanosGenerales());
		establecimientoDataSolicitud.setSuperficieTotal(establecimientoDataCambios.getSuperficieTotal());

		this.establecimientoDataService.update(establecimientoDataSolicitud);
		this.establecimientoDao.update(establecimientoSolicitud);
	}

	@Transactional(rollbackFor = Throwable.class)
	private void updateSectionCasasRurales(Establecimiento establecimientoSolicitud,
			Establecimiento establecimientoCambios) {

		EstablecimientoData establecimientoDataSolicitud = establecimientoSolicitud.getEstablecimientoData();
		EstablecimientoData establecimientoDataCambios = establecimientoCambios.getEstablecimientoData();

		establecimientoSolicitud.getModalidad().setIdModalidad(establecimientoCambios.getModalidad().getIdModalidad());

		establecimientoDataSolicitud.setServicioComedor(establecimientoDataCambios.getServicioComedor());
		establecimientoDataSolicitud.setDerechoCocina(establecimientoDataCambios.getDerechoCocina());
		establecimientoSolicitud.setNumUnidadesAlojamiento(establecimientoCambios.getNumUnidadesAlojamiento());
		establecimientoDataSolicitud.setNumPlazas(establecimientoDataCambios.getNumPlazas());
		establecimientoDataSolicitud.setNumMaximoSupletorias(establecimientoDataCambios.getNumMaximoSupletorias());

		this.establecimientoDataService.update(establecimientoDataSolicitud);
		this.establecimientoDao.update(establecimientoSolicitud);
	}

	@Transactional(rollbackFor = Throwable.class)
	private void updateSectionAgroturismos(Establecimiento establecimientoSolicitud,
			Establecimiento establecimientoCambios) {
		EstablecimientoData establecimientoDataSolicitud = establecimientoSolicitud.getEstablecimientoData();
		EstablecimientoData establecimientoDataCambios = establecimientoCambios.getEstablecimientoData();

		establecimientoSolicitud.getModalidad().setIdModalidad(establecimientoCambios.getModalidad().getIdModalidad());

		establecimientoDataSolicitud.setServicioComedor(establecimientoDataCambios.getServicioComedor());
		establecimientoDataSolicitud.setDerechoCocina(establecimientoDataCambios.getDerechoCocina());
		establecimientoSolicitud.setNumUnidadesAlojamiento(establecimientoCambios.getNumUnidadesAlojamiento());
		establecimientoDataSolicitud.setNumPlazas(establecimientoDataCambios.getNumPlazas());
		establecimientoDataSolicitud.setNumMaximoSupletorias(establecimientoDataCambios.getNumMaximoSupletorias());

		this.establecimientoDataService.update(establecimientoDataSolicitud);
		this.establecimientoDao.update(establecimientoSolicitud);
	}

	@Transactional(rollbackFor = Throwable.class)
	private void updateSectionCamping(Establecimiento establecimientoSolicitud,
			Establecimiento establecimientoCambios) {
		EstablecimientoData establecimientoDataSolicitud = establecimientoSolicitud.getEstablecimientoData();
		EstablecimientoData establecimientoDataCambios = establecimientoCambios.getEstablecimientoData();

		establecimientoSolicitud.getModalidad().setIdModalidad(establecimientoCambios.getModalidad().getIdModalidad());
		establecimientoSolicitud.getCategoria()
				.setIdCategorias(establecimientoCambios.getCategoria().getIdCategorias());
		establecimientoDataSolicitud.setNumTotParcelas(establecimientoDataCambios.getNumTotParcelas());
		establecimientoDataSolicitud.setNumPlazas(establecimientoDataCambios.getNumPlazas());

		this.establecimientoDataService.update(establecimientoDataSolicitud);
		this.establecimientoDao.update(establecimientoSolicitud);
	}

	@Transactional(rollbackFor = Throwable.class)
	private void updateSectionApartamentosTuristicos(Establecimiento establecimientoSolicitud,
			Establecimiento establecimientoCambios) {
		EstablecimientoData establecimientoDataSolicitud = establecimientoSolicitud.getEstablecimientoData();
		EstablecimientoData establecimientoDataCambios = establecimientoCambios.getEstablecimientoData();

		establecimientoSolicitud.getModalidad().setIdModalidad(establecimientoCambios.getModalidad().getIdModalidad());
		establecimientoSolicitud.getCategoria()
				.setIdCategorias(establecimientoCambios.getCategoria().getIdCategorias());
		establecimientoSolicitud.getEspecialidad()
				.setIdEspecialidad(establecimientoCambios.getEspecialidad().getIdEspecialidad());

		establecimientoSolicitud.setNumUnidadesAlojamiento(establecimientoCambios.getNumUnidadesAlojamiento());
		establecimientoDataSolicitud.setNumPlazas(establecimientoDataCambios.getNumPlazas());

		this.establecimientoDataService.update(establecimientoDataSolicitud);
		this.establecimientoDao.update(establecimientoSolicitud);
	}

	@Transactional(rollbackFor = Throwable.class)
	private void updateSectionAlberguesTuristicos(Establecimiento establecimientoSolicitud,
			Establecimiento establecimientoCambios) {
		EstablecimientoData establecimientoDataSolicitud = establecimientoSolicitud.getEstablecimientoData();
		EstablecimientoData establecimientoDataCambios = establecimientoCambios.getEstablecimientoData();

		establecimientoSolicitud.getEspecialidad()
				.setIdEspecialidad(establecimientoCambios.getEspecialidad().getIdEspecialidad());

		establecimientoDataSolicitud.setServicioComedor(establecimientoDataCambios.getServicioComedor());
		establecimientoDataSolicitud.setDerechoCocina(establecimientoDataCambios.getDerechoCocina());
		establecimientoSolicitud.setNumUnidadesAlojamiento(establecimientoCambios.getNumUnidadesAlojamiento());
		establecimientoDataSolicitud.setNumPlazas(establecimientoDataCambios.getNumPlazas());
		establecimientoDataSolicitud.setNumSupCocina(establecimientoDataCambios.getNumSupCocina());

		this.establecimientoDataService.update(establecimientoDataSolicitud);
		this.establecimientoDao.update(establecimientoSolicitud);

	}

	@Transactional(rollbackFor = Throwable.class)
	private void updateSectionHoteles(Establecimiento establecimientoSolicitud,
			Establecimiento establecimientoCambios) {
		EstablecimientoData establecimientoDataSolicitud = establecimientoSolicitud.getEstablecimientoData();
		EstablecimientoData establecimientoDataCambios = establecimientoCambios.getEstablecimientoData();

		establecimientoSolicitud.getModalidad().setIdModalidad(establecimientoCambios.getModalidad().getIdModalidad());
		establecimientoSolicitud.getCategoria()
				.setIdCategorias(establecimientoCambios.getCategoria().getIdCategorias());
		establecimientoSolicitud.getEspecialidad()
				.setIdEspecialidad(establecimientoCambios.getEspecialidad().getIdEspecialidad());
		establecimientoSolicitud.getGrupo().setIdGrupo(establecimientoCambios.getGrupo().getIdGrupo());
		establecimientoDataSolicitud.setServicioComedor(establecimientoDataCambios.getServicioComedor());
		establecimientoDataSolicitud.setDerechoCocina(establecimientoDataCambios.getDerechoCocina());
		establecimientoSolicitud.setNumUnidadesAlojamiento(establecimientoCambios.getNumUnidadesAlojamiento());
		establecimientoDataSolicitud.setNumPlazas(establecimientoDataCambios.getNumPlazas());
		establecimientoDataSolicitud.setNumSupCocina(establecimientoDataCambios.getNumSupCocina());

		this.establecimientoDataService.update(establecimientoDataSolicitud);
		this.establecimientoDao.update(establecimientoSolicitud);

	}

	@Transactional(rollbackFor = Throwable.class)
	private void updateSectionAgenciasViajes(Establecimiento establecimientoSolicitud,
			Establecimiento establecimientoCambios) {
		establecimientoSolicitud.setModalidad(establecimientoCambios.getModalidad());
		establecimientoSolicitud.setGrupo(establecimientoCambios.getGrupo());

		AgenciaData agenciaDataSolicitud = establecimientoSolicitud.getAgenciaData();
		AgenciaData agenciaDataCambios = establecimientoCambios.getAgenciaData();

		agenciaDataSolicitud.setNumCie(agenciaDataCambios.getNumCie());
		agenciaDataSolicitud.setIdOrigenOfiPrincipal(agenciaDataCambios.getIdOrigenOfiPrincipal());

		this.establecimientoDao.update(establecimientoSolicitud);
		this.agenciaDataService.update(agenciaDataSolicitud);

	}

	@Transactional(rollbackFor = Throwable.class)
	private void insertNewTercero(Establecimiento establecimientoSolicitud, Integer idTercero, boolean isTitular) {
		DatosTerceros datosTerceros = datosTercerosService.find(idTercero);

		this.tercerosEstablecimientoService.insertNewTerceroFromTemp(datosTerceros, establecimientoSolicitud, isTitular
				? new TiposTercero(Constantes.TITULAR_ACTIVIDAD) : new TiposTercero(Constantes.REPRESENTANTE_LEGAL));
	}

	@Transactional(rollbackFor = Throwable.class)
	private void updateTercero(Establecimiento establecimientoCensado, Establecimiento establecimientoCambios,
			Integer idTercero) {
		DatosTerceros datosTercerosSolicitante = datosTercerosService.find(idTercero);
		DatosTerceros datosTercerosCambios = datosTercerosService.findByEstablecimiento(establecimientoCambios,
				idTercero);
		if (isNotNull(datosTercerosCambios) && isNotNull(datosTercerosCambios.getIdTercero())) {
			TercerosEstablecimiento tercerosEstablecimientoSolicitante = tercerosEstablecimientoService
					.findTerceroCensado(new TercerosEstablecimiento(idTercero));
			datosTercerosSolicitante.setNombre(datosTercerosCambios.getNombre());
			datosTercerosSolicitante.setApellido1(datosTercerosCambios.getApellido1());
			datosTercerosSolicitante.setApellido2(datosTercerosCambios.getApellido2());
			datosTercerosSolicitante.setSexo(datosTercerosCambios.getSexo());
			datosTercerosSolicitante.setTiposDocumento(datosTercerosCambios.getTiposDocumento());
			datosTercerosSolicitante.setDocumento(datosTercerosCambios.getDocumento());

			if (tercerosEstablecimientoSolicitante.getTiposTercero()
					.getIdTipoTercero() == Constantes.TITULAR_ACTIVIDAD) {
				datosTercerosSolicitante.setEmail(datosTercerosCambios.getEmail());
				datosTercerosSolicitante.setTelefono(datosTercerosCambios.getTelefono());

				Boolean populateChangueTitular = Constantes.AGENCIA_VIAJE
						.equalsIgnoreCase(establecimientoCensado.getTipoEstablecimiento().getIdTipoEstablecimiento())
						&& establecimientoCensado.getModalidad() != null && Constantes.ModalidadFijos.AAVV_PRINCIPAL
								.equalsIgnoreCase(establecimientoCensado.getModalidad().getIdModalidad());
				if (populateChangueTitular) {
					tercerosEstablecimientoSolicitante.setDatosTerceros(datosTercerosSolicitante);
					tercerosEstablecimientoService.tratarInteresadosAgencias(tercerosEstablecimientoSolicitante, false);
				}

			}

			this.datosTercerosService.update(datosTercerosSolicitante);
		}
	}

	@Override
	public Boolean isEsencialChange(InitForm initForm) {
		return this.establecimientoDao.isEsencialChange(initForm);
	}

	@Override
	@Transactional(rollbackFor = Throwable.class)
	public void reasingExpediente(InitForm initForm) {
		// Recuperar establecimiento censado
		Establecimiento filter = new Establecimiento();
		filter.setIdentificadorEstablecimiento(initForm.getIdentificadorEstablecimiento());
		filter.setTipoRegistro(Constantes.TIPO_REGISTRO_DEFINITIVO);
		Establecimiento establecimientoCensado = this.findByIdenticadorEstablecimiento(filter);

		if (establecimientoCensado != null && establecimientoCensado.getIdEstablecimiento() != null) {

			// Recuperar establecimiento temporal del expediente
			Establecimiento establecimientoExpediente = this
					.findEstablecimientoByIdExpediente(initForm.getIdExpediente());

			// Cambiar el identificador del establecimiento del expediente por
			// el censado
			establecimientoExpediente
					.setIdentificadorSolicitud(establecimientoCensado.getIdentificadorEstablecimiento());
			establecimientoExpediente
					.setIdEstablecimientoPadre(String.valueOf(establecimientoCensado.getIdEstablecimiento()));

			DatosDirecciones direccionesCenso = this.datosDireccionesService
					.findDireccionEstablecimiento(establecimientoCensado, Constantes.ID_DIRECCION_ACTIVIDAD);

			DatosDirecciones direccionesExp = this.datosDireccionesService
					.findEstablecimientoExpediente(initForm.getIdExpediente());
			direccionesCenso.setIdDireccion(direccionesExp.getIdDireccion());
			direccionesCenso.setDatosTerceros(direccionesExp.getDatosTerceros());
			direccionesCenso.setIdentificadorEstablecimiento(establecimientoCensado.getIdentificadorEstablecimiento());

			this.datosDireccionesService.update(direccionesCenso);
			this.establecimientoDao.update(establecimientoExpediente);

			Map<String, String> data = new HashMap<String, String>();
			data.put(Constantes.KEY_IDENTIFICADOR_DEFINITIVO, establecimientoCensado.getIdentificadorEstablecimiento());
			initForm.setIdentificadorEstablecimiento(establecimientoCensado.getIdentificadorEstablecimiento());
			initForm.setIdProvinciaEstablecimiento(direccionesCenso.getIdProvinciaPad());
		}
	}

	@Override
	public Long checkRefCatastral(Establecimiento establecimiento) {
		return this.establecimientoDao.checkRefCatastral(establecimiento);
	}

	@Override
	@Transactional(rollbackFor = Throwable.class)
	public void createDispensa(InitForm initForm, Map<String, String> data) {
		Establecimiento establecimiento = findByIdenticadorEstablecimiento(
				data.get(Constantes.KEY_IDENTIFICADOR_DEFINITIVO));
		if (establecimiento != null && establecimiento.getIdEstablecimiento() != null) {
			DispensaEstablecimiento dispensa = new DispensaEstablecimiento();
			dispensa.setEstablecimiento(establecimiento);

			if (initForm.getObservaciones() != null && !"".equals(initForm.getObservaciones())) {
				String descES = initForm.getObservaciones().substring(0, initForm.getObservaciones().indexOf("###"));
				String descEU = initForm.getObservaciones().substring(initForm.getObservaciones().indexOf("###"));
				dispensa.setObservacionesDescEs(descES);
				dispensa.setObservacionesDescEu(descEU.replace("###", ""));
			}

			dispensa.setFechaDispensa(new Date());
			dispensa.setFolderId(initForm.getFolderId());
			dispensa.setFolderNumber(initForm.getFolderNumber());
			dispensa.setUsuarioRegistro(PermisosXLNETS.getUserConnected());
			dispensa.setFechaRegistro(new Date());
			dispensa.setDispensado(initForm.getDispensado());
			dispensasService.add(dispensa);
			establecimientoDao.disableChangeIdentifiadorExp(initForm.getIdExpediente());
		}
	}

	@Override
	@Transactional(rollbackFor = Throwable.class)
	public void updateDispensa(InitForm initForm, Map<String, String> data) {
		DispensaEstablecimiento dispensa = new DispensaEstablecimiento();
		dispensa.setFolderId(initForm.getFolderId());
		dispensa = dispensasService.findByExpediente(dispensa);

		if (initForm.getObservaciones() != null && !"".equals(initForm.getObservaciones())) {
			String descES = initForm.getObservaciones().substring(0, initForm.getObservaciones().indexOf("###"));
			String descEU = initForm.getObservaciones().substring(initForm.getObservaciones().indexOf("###"));
			dispensa.setObservacionesDescEs(descES);
			dispensa.setObservacionesDescEu(descEU.replace("###", ""));
		}

		dispensa.setFechaDispensa(new Date());
		dispensa.setFolderId(initForm.getFolderId());
		dispensa.setFolderNumber(initForm.getFolderNumber());
		dispensa.setUsuarioRegistro(PermisosXLNETS.getUserConnected());
		dispensa.setFechaRegistro(new Date());
		dispensa.setDispensado(initForm.getDispensado());
		dispensasService.update(dispensa);
	}

	@Override
	@Transactional(rollbackFor = Throwable.class)
	public Boolean canChangeIdentifiadorExp(Integer idExpediente, Integer idTercero) {
		DatosDirecciones datosDirecciones = datosDireccionesService.findEstablecimientoExpediente(idExpediente);
		if (datosDirecciones == null || datosDirecciones.getIdDireccion() == null
				|| datosDirecciones.getIdDireccion() == 0) {
			datosDirecciones = new DatosDirecciones();
			datosDirecciones.setDatosTerceros(new DatosTerceros(idTercero));
			datosDirecciones.setTiposDireccion(new TiposDireccion(Constantes.ID_DIRECCION_ACTIVIDAD));
			datosDireccionesService.add(datosDirecciones);
		}

		return this.establecimientoDao.canChangeIdentifiadorExp(idExpediente);
	}

	@Override
	public boolean existsDispensaForExp(String folderId) {
		return dispensasService.existsDispensaForExp(folderId);
	}

	@Override
	public Establecimiento updateEstablecimientoDescNombre(Establecimiento establecimiento) {
		return this.establecimientoDao.updateEstablecimientoDescNombre(establecimiento);
	}

	@Override
	public JQGridResponseDto<Establecimiento> findEstablecimientoByOfiPpal(Establecimiento ab6301s00,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith, Boolean notPrincipalesFilter) {
		List<Establecimiento> listaAb6301s00 = this.establecimientoDao.findEstablecimientoByOfiPpal(ab6301s00,
				jqGridRequestDto, false, false);

		for (Establecimiento establecimiento : listaAb6301s00) {
			if (null != establecimiento.getAgenciaData()) {
				if (StringUtils.isNotBlank(establecimiento.getAgenciaData().getIdPrimeraSucursal())) {
					if ("S".equals(establecimiento.getAgenciaData().getIdPrimeraSucursal())) {
						establecimiento.getAgenciaData().setDescIdPrimeraSucursal(
								appMessageSource.getMessage("afirmativo", null, LocaleContextHolder.getLocale()));
					} else {
						establecimiento.getAgenciaData().setDescIdPrimeraSucursal(
								appMessageSource.getMessage("negativo", null, LocaleContextHolder.getLocale()));
					}
				}
			}
		}

		Long recordNum = this.establecimientoDao
				.findEstablecimientoByOfiPpalCount(ab6301s00 != null ? ab6301s00 : new Establecimiento(), false, false);
		if (jqGridRequestDto.getMultiselection().getSelectedIds() != null) {
			List<TableRowDto<Establecimiento>> reorderSelection = this.establecimientoDao.reorderSelection(ab6301s00,
					jqGridRequestDto, startsWith);
			return new JQGridResponseDto<Establecimiento>(jqGridRequestDto, recordNum, listaAb6301s00,
					reorderSelection);
		}

		return new JQGridResponseDto<Establecimiento>(jqGridRequestDto, recordNum, listaAb6301s00);
	}

	@Override
	public Long findEstablecimientoByOfiPpalCount(Establecimiento ab6301s00, Boolean startsWith,
			Boolean flagSucursalesPvBaja) {
		return this.establecimientoDao.findEstablecimientoByOfiPpalCount(ab6301s00, startsWith, flagSucursalesPvBaja);
	}

	@Override
	public List<Establecimiento> findEstablecimientoByOfiPpalInteresados(Establecimiento establecimiento) {
		List<Establecimiento> establecimientos = this.establecimientoDao.findEstablecimientoByOfiPpal(establecimiento,
				null, false, true);
		return establecimientos;
	}

	@Transactional(rollbackFor = Throwable.class)
	@Override
	public Map<String, String> getDatosOficinaPpalAAVV(String numCie) {

		Map<String, String> resultado = new HashMap<String, String>();

		Establecimiento establecimiento = this.establecimientoDao.getDatosOficinaPpalAAVV(numCie);

		if (establecimiento != null && establecimiento.getIdEstablecimiento() != null) {

			resultado.put("idEstablecimiento", String.valueOf(establecimiento.getIdEstablecimiento()));
			resultado.put("signatura", establecimiento.getIdentificadorEstablecimiento());
			resultado.put("nombre", establecimiento.getDescrNombre());

			if (establecimiento.getDatosDirecciones() != null) {
				resultado.put("direccion", establecimiento.getDatosDirecciones().getDireccionCompuesta());
			}

		}

		return resultado;
	}

	@Override
	@Transactional(rollbackFor = Throwable.class)
	public Establecimiento add(String tipoEstablecimientoAnyadir, String zonaEstablecimientoAnyadir) {
		// Calculamos el identificador del establecimiento
		String identificadorEstablecimiento = this.getNewIntetificador(Constantes.TIPO_REGISTRO_DEFINITIVO,
				tipoEstablecimientoAnyadir, zonaEstablecimientoAnyadir);
		Establecimiento establecimiento = new Establecimiento();
		establecimiento.setIdentificadorEstablecimiento(identificadorEstablecimiento);
		establecimiento.setTipoEstablecimiento(new TipoEstablecimiento(tipoEstablecimientoAnyadir));
		establecimiento.setTipoRegistro(String.valueOf(Constantes.TIPO_REGISTRO_DEFINITIVO));
		establecimiento.setEliminado("0");
		establecimiento.setVisibleweb("0");
		establecimiento.setTemporada("0");
		establecimiento.setExpedienteb29("0");
		establecimiento.setCanModIdestabSolic("1");
		// Anyadimos el establecimiento
		establecimiento = this.establecimientoDao.add(establecimiento);

		if (!tipoEstablecimientoAnyadir.equalsIgnoreCase(Constantes.AGENCIA_VIAJE)) {
			// Anyadimos los datos técnicos del establecimiento
			EstablecimientoData establecimientoData = new EstablecimientoData(establecimiento.getIdEstablecimiento());
			establecimientoData.setEdificioCatalogado(0);
			establecimiento.setEstablecimientoData(establecimientoDataService.add(establecimientoData));
		} else {
			AgenciaData agenciaData = new AgenciaData(establecimiento.getIdEstablecimiento());
			agenciaData = agenciaDataService.add(agenciaData);
			establecimiento.setAgenciaData(agenciaData);
		}
		// Anyadimos los terceros
		TercerosEstablecimiento terceroEstablecimiento = new TercerosEstablecimiento();
		terceroEstablecimiento.setEstablecimiento(establecimiento);
		terceroEstablecimiento.getEstablecimiento().setDatosTerceros(new DatosTerceros());
		terceroEstablecimiento.setTiposTercero(new TiposTercero(Constantes.TITULAR_ACTIVIDAD));
		tercerosEstablecimientoService.add(terceroEstablecimiento);
		return establecimiento;
	}

	@Override
	public Map<String, String> getDireccionExtranjeraOficinaPpalAAVV(Integer idTercero) {
		Map<String, String> resultado = new HashMap<String, String>();
		DatosDirecciones datosDirecciones = this.agenciaDataDao.getDireccionExtranjeraOficinaPpalAAVV(idTercero);

		if (null != datosDirecciones) {

			resultado.put("id", datosDirecciones.getIdDireccion().toString());
			resultado.put("calle", datosDirecciones.getDireccion());
			resultado.put("numero", datosDirecciones.getNumero());
			resultado.put("piso", datosDirecciones.getPiso());
			resultado.put("letra", datosDirecciones.getLetra());
			resultado.put("codigoPostal", datosDirecciones.getCodigoPostal());
			resultado.put("descripcionCiudad", datosDirecciones.getDescCiudadExtranjera());
			resultado.put("descripcionProvincia", datosDirecciones.getDescProvinciaExtranjera());
			resultado.put("idPais", datosDirecciones.getIdPais().toString());

		}
		return resultado;
	}

	@Override
	public Integer deleteDireccionExtranjeraOfiPpal(Integer idDireccionExt) {
		return this.agenciaDataDao.deleteDireccionExtranjeraOfiPpal(idDireccionExt);
	}

	@Override
	public List<Establecimiento> findSucursalesOficinaPrincipal(Integer idEstablecimiento) {
		List<Establecimiento> sucursalesCompletas = new ArrayList<Establecimiento>();
		List<Establecimiento> sucursales = this.establecimientoDao.findSucursalesOficinaPrincipal(idEstablecimiento);
		for (Establecimiento sucursal : sucursales) {
			Establecimiento establecimientoFind = new Establecimiento(sucursal.getIdEstablecimiento());
			Establecimiento establecimiento = this.find(establecimientoFind);
			establecimientoDataService.completeEstablecimientoData(establecimiento, Constantes.TIPO_REGISTRO_DETALLE);
			sucursalesCompletas.add(establecimiento);
		}
		return sucursalesCompletas;
	}

	@Override
	public void updateCamposS41(Establecimiento establecimiento) {
		this.establecimientoDao.updateCamposS41(establecimiento);
	}
}