package com.ejie.ab63.service.terceros;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.SessionAttributes;

import com.ejie.ab63.clientesWS.X43ExpedienteElectronico.TAccount;
import com.ejie.ab63.clientesWS.X43ExpedienteElectronico.TBoolean;
import com.ejie.ab63.clientesWS.X43ExpedienteElectronico.TContact;
import com.ejie.ab63.clientesWS.X43ExpedienteElectronico.TContactList;
import com.ejie.ab63.clientesWS.X43ExpedienteElectronico.TContactType;
import com.ejie.ab63.clientesWS.X43ExpedienteElectronico.TFolder;
import com.ejie.ab63.clientesWS.X43ExpedienteElectronico.TFolderList;
import com.ejie.ab63.clientesWS.X43ExpedienteElectronico.TInterested;
import com.ejie.ab63.clientesWS.X43ExpedienteElectronico.TInterestedList;
import com.ejie.ab63.clientesWS.X43ExpedienteElectronico.TParticipantRRI;
import com.ejie.ab63.clientesWS.X43ExpedienteElectronico.TParticipantRRIList;
import com.ejie.ab63.clientesWS.X43ExpedienteElectronico.TPostalAddress;
import com.ejie.ab63.clientesWS.X43ExpedienteElectronico.TRepresentative;
import com.ejie.ab63.comun.Constantes;
import com.ejie.ab63.dao.terceros.CanalesAvisoDao;
import com.ejie.ab63.dao.terceros.DatosDireccionesDao;
import com.ejie.ab63.dao.terceros.DatosTercerosDao;
import com.ejie.ab63.dao.terceros.RelExpTerDao;
import com.ejie.ab63.dao.terceros.TiposDocumentoDao;
import com.ejie.ab63.dao.terceros.TiposTerceroDao;
import com.ejie.ab63.model.inicio.InitForm;
import com.ejie.ab63.model.terceros.CanalesAviso;
import com.ejie.ab63.model.terceros.DatosDirecciones;
import com.ejie.ab63.model.terceros.DatosTerceros;
import com.ejie.ab63.model.terceros.RelExpTer;
import com.ejie.ab63.model.terceros.TiposCanalAviso;
import com.ejie.ab63.model.terceros.TiposDireccion;
import com.ejie.ab63.model.terceros.TiposDocumento;
import com.ejie.ab63.model.terceros.TiposTercero;
import com.ejie.ab63.model.terceros.VistaDatosExpediente;
import com.ejie.ab63.model.terceros.VistaTerceros;
import com.ejie.ab63.util.PermisosXLNETS;
import com.ejie.x38.dto.JQGridRequestDto;
import com.ejie.x38.dto.JQGridResponseDto;
import com.ejie.x38.dto.JerarquiaDto;
import com.ejie.x38.dto.TableRowDto;

/**
 * RelExpTerServiceImpl  
 * 
 *  
 */

@Service(value = "relExpTerService")
@SessionAttributes("usuario")
public class RelExpTerServiceImpl implements RelExpTerService {

	@Autowired
	private RelExpTerDao relExpTerDao;
	@Autowired
	private DatosDireccionesDao datosDireccionesDao;
	@Autowired
	private TiposDocumentoDao tiposDocumentoDao;
	@Autowired
	private DatosTercerosDao datosTercerosDao;
	@Autowired
	public CanalesAvisoDao canalesAvisoDao;
	@Autowired
	private TiposTerceroDao tiposTerceroDao;

	private static final Logger logger = LoggerFactory.getLogger(RelExpTerServiceImpl.class);

	/**
	 * Inserts a single row in the RelExpTer table.
	 *
	 * @param relExpTer
	 *            RelExpTer
	 * @return RelExpTer
	 */
	@Transactional(rollbackFor = Throwable.class)
	public RelExpTer add(RelExpTer relExpTer) {
		return this.relExpTerDao.add(relExpTer);
	}

	/**
	 * Updates a single row in the RelExpTer table.
	 *
	 * @param relExpTer
	 *            RelExpTer
	 * @return RelExpTer
	 */
	@Transactional(rollbackFor = Throwable.class)
	public RelExpTer update(RelExpTer relExpTer) {
		return this.relExpTerDao.update(relExpTer);
	}

	/**
	 * Finds a single row in the RelExpTer table.
	 *
	 * @param relExpTer
	 *            RelExpTer
	 * @return RelExpTer
	 */
	public RelExpTer find(RelExpTer relExpTer) {
		return (RelExpTer) this.relExpTerDao.find(relExpTer);
	}

	/**
	 * Deletes a single row in the RelExpTer table.
	 *
	 * @param relExpTer
	 *            RelExpTer
	 */
	@Transactional(rollbackFor = Throwable.class)
	public void remove(RelExpTer relExpTer) {
		this.relExpTerDao.remove(relExpTer);
	}

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

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

	/**
	 * Obtener lista de participantes de la participacion
	 *
	 * @param resultado
	 *            TFolderList
	 * @param datosTramitagune
	 *            InitForm
	 * @param usuario
	 *            Usuario
	 */
	public void actualizarListParticipantesPorParticipacion(TFolderList resultado, Integer idExpediente, String usuario,
			InitForm datosTramitagune) {
		Date fecha = new Date();
		RelExpTer relExpTerAux = new RelExpTer();
		TFolder folder = resultado.getFolder().get(0);
		TParticipantRRIList lista = folder.getParticipantRRIList();

		if (lista != null) {

			List<TParticipantRRI> tParticipantes = lista.getParticipantList();
			logger.info("Tamayo de lista de participaciones de searchFolder " + tParticipantes.size());
			for (int i = 0; i < tParticipantes.size(); i++) {
				TParticipantRRI participant = tParticipantes.get(i);
				String participantId = participant.getParticipantID();

				TInterestedList interesados = participant.getInterestedList();
				List<TInterested> listaInteresados = interesados.getInterested();

				TRepresentative representante = participant.getRepresentative();
				// buscar los terceros de ese rol y participantId en mi bbdd
				List<RelExpTer> participantPersonEnBBDD = new ArrayList<RelExpTer>();
				// TODO: Arreglado por SERIKAT
				List<RelExpTer> valorParticipacionId = relExpTerDao.findValorParticipant(idExpediente);
				// FIXME: ESTO ESTA MAL programado
				// Por cada interesado buscamos si esta entre los interesado
				for (RelExpTer relExpTer : valorParticipacionId) {
					for (TInterested tInterested : listaInteresados) {
						String documento = tInterested.getPersonID().getID();
						if (documento.equalsIgnoreCase(relExpTer.getDatosTerceros().getDocumento())) {
							RelExpTer expTer = this.relExpTerDao.find(relExpTer);
							participantPersonEnBBDD.add(expTer);
						} else if (representante != null
								&& representante.getPersonID().getID()
										.equals(relExpTer.getDatosTerceros().getDocumento())
								&& ("0".equals(relExpTer.getParticipantId())
										|| participantId.equals(relExpTer.getParticipantId()))) {
							RelExpTer expTer = this.relExpTerDao.find(relExpTer);
							participantPersonEnBBDD.add(expTer);
						}
					}
				}
				//
				// for (int w = 0; w < valorParticipacionId.size();) {
				//
				// if
				// ("0".equalsIgnoreCase(valorParticipacionId.get(w).getParticipantId()))
				// {
				// participantPersonEnBBDD =
				// relExpTerDao.findIdTerceros(idExpediente);
				// logger.info("participantPersonEnBBDD " +
				// participantPersonEnBBDD.toString());
				// } else {
				// participantPersonEnBBDD =
				// relExpTerDao.findIdTerceros(idExpediente, participantId);
				// logger.info("participantPersonEnBBDD " +
				// participantPersonEnBBDD.toString());
				// }
				// break;
				// }

				// sacamos el id del role de nuestra bbddd para insertarlo en la
				// relacion expediente tercero
				TiposTercero tipoTercero = tiposTerceroDao.findIdTipoTercero(participant.getRole().name());
				// Primero recorremos interestedLis si no hay null(parece ser
				// que siempre hay 1 )(x terceros)
				// TODO: Arreglado por SERIKAT
				DatosTerceros datosTerceros;
				List<CanalesAviso> listaCanales;
				for (int j = 0; j < listaInteresados.size(); j++) {
					datosTerceros = new DatosTerceros();
					listaCanales = new ArrayList<CanalesAviso>();
					insertarUpdatearTitular(idExpediente, usuario, datosTramitagune, fecha, relExpTerAux, datosTerceros,
							tParticipantes, i, participantId, listaInteresados, participantPersonEnBBDD, tipoTercero,
							listaCanales, j);
				}
				if (null != representante) {
					datosTerceros = new DatosTerceros();
					listaCanales = new ArrayList<CanalesAviso>();
					insertarUpdatearRepresentante(idExpediente, usuario, fecha, relExpTerAux, datosTerceros,
							tParticipantes, i, participantId, representante, participantPersonEnBBDD, tipoTercero,
							listaCanales);
				}
			}
			// ACTUALIZAMOS mi bbdd por si se ha borrado desde tramigune una
			// participacion
			List<RelExpTer> relExpTerList = relExpTerDao.findParticipantId(idExpediente);
			if (relExpTerList.size() > tParticipantes.size()) {
				boolean borrarRegistro;
				for (int k = 0; k < relExpTerList.size(); k++) {
					borrarRegistro = true;
					for (TParticipantRRI participantes : tParticipantes) {
						if (participantes.getParticipantID()
								.equalsIgnoreCase(relExpTerList.get(k).getParticipantId())) {
							if (Constantes.PARTICIPANTE_TITULAR == relExpTerList.get(k).getDatosTerceros()
									.getTipoParticipante()) {
								TInterestedList interesados = participantes.getInterestedList();
								List<TInterested> listaInteresados = interesados.getInterested();
								for (TInterested interesado : listaInteresados) {
									if (relExpTerList.get(k).getDatosTerceros().getDocumento()
											.equalsIgnoreCase(interesado.getPersonID().getID())) {
										borrarRegistro = false;
									}
								}
							} else {
								TRepresentative representante = participantes.getRepresentative();
								if (representante != null && relExpTerList.get(k).getDatosTerceros().getDocumento()
										.equalsIgnoreCase(representante.getPersonID().getID())) {
									borrarRegistro = false;
								}
							}
						}
					}

					if (borrarRegistro) {
						Integer idTercero = relExpTerList.get(k).getDatosTerceros().getIdTercero();
						relExpTerDao.removeidTercero(idTercero);
						canalesAvisoDao.removeCanalesTercero(idTercero);
						datosDireccionesDao.removeDireccionesTercero(idTercero);
						datosTercerosDao.remove(idTercero);
					}
				}
			}

		}
	}

	private void insertarUpdatearTitular(Integer idExpediente, String usuario, InitForm datosTramitagune, Date fecha,
			RelExpTer relExpTerAux, DatosTerceros datosTerceros, List<TParticipantRRI> tParticipantes, int i,
			String participantId, List<TInterested> listaInteresados, List<RelExpTer> participantPersonEnBBDD,
			TiposTercero tipoTercero, List<CanalesAviso> listaCanales, int j) {
		TiposDocumento tiposDocumento;
		Integer idTipoParticipante;

		// segundo recorremos el represtenate sino es null (1 tercero)
		String documento = listaInteresados.get(j).getPersonID().getID();
		if (listaInteresados.get(j).getInterestedInLaw() == TBoolean.TRUE) {
			idTipoParticipante = Constantes.PARTICIPANTE_TITULAR;
			TAccount account = listaInteresados.get(j).getAccount();
			buscarCanalesDeAviso(datosTerceros, listaCanales, account);
		} else {
			// este no tiene calanes de aviso
			// listaCanales.clear();
			datosTerceros.setCanalesAvisos(listaCanales);
			idTipoParticipante = Constantes.PARTICIPANTE_OTRO_AFECTADO;
		}
		String tipodocumento = listaInteresados.get(j).getPersonID().getType().name();
		String nombre = listaInteresados.get(j).getPersonID().getName();
		String apellido1 = listaInteresados.get(j).getPersonID().getFirstLastName();
		String apellido2 = listaInteresados.get(j).getPersonID().getSecondLastName();

		Integer idioma = listaInteresados.get(j).getLanguage().ordinal();

		// SACAMOS EL ID DEL DOCUEMNTO (pq queremos el de nuestra
		// bbdd)
		tiposDocumento = tiposDocumentoDao.findIdTipoDocumento(tipodocumento);
		datosTerceros.setNombre(nombre);
		datosTerceros.setDocumento(documento);
		if (null != tiposDocumento) {
			datosTerceros.setTiposDocumento(tiposDocumento);
		} else {
			datosTerceros.setTiposDocumento(new TiposDocumento());
		}
		datosTerceros.setApellido1(apellido1);
		datosTerceros.setApellido2(apellido2);
		datosTerceros.setTipoParticipante(idTipoParticipante);
		datosTerceros.setIdioma(idioma);

		relExpTerAux.setIdExpediente(idExpediente);
		relExpTerAux.setTiposTercero(tipoTercero);
		relExpTerAux.setParticipantId(participantId);
		if (participantPersonEnBBDD.isEmpty()) {
			// buscarCanlesDeAviso(datosTerceros, participant);
			insertarParticipante(usuario, fecha, relExpTerAux, datosTerceros);
		} else {
			int idTercero = 0;
			int cont = 0;
			String participacion = "";
			int valorCambioRole = 1;
			switch (idTipoParticipante) {
			case 0:
				for (int k = 0; k < participantPersonEnBBDD.size(); k++) {
					if (null != participantPersonEnBBDD.get(k).getTiposTercero().getRole()) {
						if (participantPersonEnBBDD.get(k).getTiposTercero().getRole()
								.equalsIgnoreCase(tParticipantes.get(i).getRole().value())) {
							valorCambioRole = 0;

						}
					}
					if (participantPersonEnBBDD.get(k).getDatosTerceros()
							.getTipoParticipante() == Constantes.PARTICIPANTE_TITULAR) {
						idTercero = participantPersonEnBBDD.get(k).getDatosTerceros().getIdTercero();
						logger.info("IdTercero para inserta en mi BBDD" + idTercero);
						if (null != participantPersonEnBBDD.get(k).getParticipantId()) {
							participacion = participantPersonEnBBDD.get(k).getParticipantId();
						} else {
							participacion = Constantes.PARTICIPACIONID_NULA;
						}
						cont = 1;
						break;
					}
				}
				break;
			case 2:
				// System.out.println("entro caso 2");
				for (int k = 0; k < participantPersonEnBBDD.size(); k++) {
					if (null != participantPersonEnBBDD.get(k).getTiposTercero().getRole()) {
						if (participantPersonEnBBDD.get(k).getTiposTercero().getRole()
								.equalsIgnoreCase(tParticipantes.get(i).getRole().value())) {
							valorCambioRole = 0;
						}
					}
					if (participantPersonEnBBDD.get(k).getDatosTerceros()
							.getTipoParticipante() == Constantes.PARTICIPANTE_OTRO_AFECTADO) {
						idTercero = participantPersonEnBBDD.get(k).getDatosTerceros().getIdTercero();
						logger.info("borrar todo los personas tipo participante = 2 " + idTercero);
						relExpTerDao.removeidTercero(idTercero);
						canalesAvisoDao.removeCanalesTercero(idTercero);
						datosDireccionesDao.removeDireccionesTercero(idTercero);
						datosTercerosDao.remove(idTercero);

						if (null != participantPersonEnBBDD.get(k).getParticipantId()) {
							participacion = participantPersonEnBBDD.get(k).getParticipantId();
						} else {
							participacion = Constantes.PARTICIPACIONID_NULA;
						}

					}

				}
				break;
			default:
				break;
			}
			insertarUpadtearParticipante(usuario, fecha, relExpTerAux, datosTerceros, idTipoParticipante, nombre,
					idTercero, cont, participacion, valorCambioRole);
		}
		// Hay un representante en bbdd que en searchfolder no esta
		if (participantPersonEnBBDD.size() > listaInteresados.size()) {
			for (int k = 0; k < participantPersonEnBBDD.size(); k++) {
				if (participantPersonEnBBDD.get(k).getDatosTerceros()
						.getTipoParticipante() == Constantes.PARTICIPANTE_OTRO_AFECTADO) {
					// System.out.println("entro en territorio desconocido");
					int idTercero = participantPersonEnBBDD.get(k).getDatosTerceros().getIdTercero();
					relExpTerDao.removeidTercero(idTercero);
					datosDireccionesDao.removeDireccionesTercero(idTercero);
					datosTercerosDao.remove(idTercero);
				}
			}
		}
	}

	private void insertarUpdatearRepresentante(Integer idExpediente, String usuario, Date fecha, RelExpTer relExpTerAux,
			DatosTerceros datosTerceros, List<TParticipantRRI> tParticipantes, int i, String participantId,
			TRepresentative representante, List<RelExpTer> participantPersonEnBBDD, TiposTercero tipoTercero,
			List<CanalesAviso> listaCanales) {
		TiposDocumento tiposDocumento;
		String documento = representante.getPersonID().getID();
		String tipodocumento = representante.getPersonID().getType().name();
		String nombre = representante.getPersonID().getName();
		String apellido1 = representante.getPersonID().getFirstLastName();
		String apellido2 = representante.getPersonID().getSecondLastName();
		Integer idioma = representante.getLanguage().ordinal();

		TAccount account = representante.getAccount();
		buscarCanalesDeAviso(datosTerceros, listaCanales, account);

		// SACAMOS EL ID DEL DOCUEMNTO (parece ser que siempre viene en
		// castellano y que DNI= NIF)
		tiposDocumento = tiposDocumentoDao.findIdTipoDocumento(tipodocumento);
		datosTerceros.setNombre(nombre);
		datosTerceros.setDocumento(documento);
		if (null != tiposDocumento) {
			datosTerceros.setTiposDocumento(tiposDocumento);
		}
		datosTerceros.setApellido1(apellido1);
		datosTerceros.setApellido2(apellido2);
		datosTerceros.setTipoParticipante(Constantes.PARTICIPANTE_REPRESENTANTE);
		datosTerceros.setIdioma(idioma);

		relExpTerAux.setIdExpediente(idExpediente);
		relExpTerAux.setTiposTercero(tipoTercero);
		relExpTerAux.setParticipantId(participantId);

		if (participantPersonEnBBDD.isEmpty()) {
			insertarParticipante(usuario, fecha, relExpTerAux, datosTerceros);
		} else {

			int idTercero = 0;
			String participacion = "";
			int valorCambioRole = 1;
			int cont = 0;
			Integer idTipoParticipante = Constantes.PARTICIPANTE_REPRESENTANTE;
			for (int k = 0; k < participantPersonEnBBDD.size(); k++) {
				if (null != participantPersonEnBBDD.get(k).getTiposTercero().getRole()) {
					if (participantPersonEnBBDD.get(k).getTiposTercero().getRole()
							.equalsIgnoreCase(tParticipantes.get(i).getRole().value())) {
						valorCambioRole = 0;
					}
				}
				if (participantPersonEnBBDD.get(k).getDatosTerceros()
						.getTipoParticipante() == Constantes.PARTICIPANTE_REPRESENTANTE) {
					idTercero = participantPersonEnBBDD.get(k).getDatosTerceros().getIdTercero();
					logger.info("IdTercero para inserta en mi BBDD" + idTercero);
					if (null != participantPersonEnBBDD.get(k).getParticipantId()) {
						participacion = participantPersonEnBBDD.get(k).getParticipantId();
					} else {
						participacion = Constantes.PARTICIPACIONID_NULA;
					}

					cont = 1;
					break;
				}

			}

			insertarUpadtearParticipante(usuario, fecha, relExpTerAux, datosTerceros, idTipoParticipante, nombre,
					idTercero, cont, participacion, valorCambioRole);
		}
	}

	private void buscarCanalesDeAviso(DatosTerceros datosTerceros, List<CanalesAviso> listaCanales, TAccount account) {
		// listaCanales.clear();
		TContactList contactList = account.getContactList();
		if (null != contactList) {
			// listaCanales.clear();
			List<TContact> contact = contactList.getContact();

			// aqui metemos el tema de canales de aviso
			if (null != account.getContactList() && contactList.getContact().size() > 0) {
				for (int s = 0; s < contact.size(); s++) {
					TContact aviso = contact.get(s);
					TContactType canal = aviso.getChannelType();

					CanalesAviso canalAviso = new CanalesAviso();
					TiposCanalAviso tipoCanalAviso = new TiposCanalAviso();
					if ("SMS".equalsIgnoreCase(canal.value())) {
						tipoCanalAviso.setIdTipoCanalAviso(Constantes.TIPO_CANAL_AVISO_SMS);
						canalAviso.setCanalAviso(aviso.getSms());
					} else if ("EMAIL".equalsIgnoreCase(canal.value())) {
						tipoCanalAviso.setIdTipoCanalAviso(Constantes.TIPO_CANAL_AVISO_EMAIL);
						canalAviso.setCanalAviso(aviso.getEmail());
					}
					logger.info("tipoCanalAviso: getIdTipoCanalAviso(): " + tipoCanalAviso.getIdTipoCanalAviso());
					canalAviso.setTiposCanalAviso(tipoCanalAviso);
					listaCanales.add(canalAviso);
				}

			}
		}
		// Se comprueba si el interesado tiene direccion postal
		if (account.getNotify() != null && account.getNotify().getPostal() != null) {
			DatosDirecciones direcciones = new DatosDirecciones();

			TPostalAddress address = account.getNotify().getPostal();
			if (address.getCodPais() != null && !"".equals(address.getCodPais())) {
				direcciones.setIdPais(Long.parseLong(address.getCodPais()));
			}
			if (direcciones.getIdPais() == null || Constantes.ID_NORA_ESP == direcciones.getIdPais()) {
				if (address.getCodProvincia() != null && !"".equals(address.getCodProvincia())) {
					direcciones.setIdProvincia(Long.parseLong(address.getCodProvincia()));
				}
				if (address.getCodMunicipio() != null && !"".equals(address.getCodMunicipio())) {
					direcciones.setIdMunicipio(Long.parseLong(address.getCodMunicipio()));
				}
				if (address.getCodLocalidad() != null && !"".equals(address.getCodLocalidad())) {
					direcciones.setIdLocalidad(Long.parseLong(address.getCodLocalidad()));
				}
			} else {
				// direcciones.setDescProvinciaExtranjera(address.getProvincia().getText().get(0));

			}
			direcciones.setTiposDireccion(new TiposDireccion(Constantes.ID_DIRECCION_NOTIF_POSTAL));
			direcciones.setDireccion(address.getDireccion());
			direcciones.setCodigoPostal(address.getCp());
			direcciones.setEscalera(address.getEscalera());
			direcciones.setNumero(address.getPortal());
			direcciones.setPiso(address.getPiso());
			direcciones.setLetra(address.getLetra());
			List<DatosDirecciones> listDirecciones = new ArrayList<DatosDirecciones>();
			listDirecciones.add(direcciones);
			datosTerceros.setListDatosDirecciones(listDirecciones);
		}

		datosTerceros.setCanalesAvisos(listaCanales);
	}

	private void insertarUpadtearParticipante(String usuario, Date fecha, RelExpTer relExpTerAux,
			DatosTerceros datosTerceros, Integer idTipoParticipante, String nombre, int idTercero, int cont,
			String participacion, int valorCambioRole) {
		if (idTipoParticipante == Constantes.PARTICIPANTE_TITULAR
				|| idTipoParticipante == Constantes.PARTICIPANTE_OTRO_AFECTADO
				|| idTipoParticipante == Constantes.PARTICIPANTE_REPRESENTANTE) {
			if (cont == 1) {
				updatearParticipante(usuario, fecha, datosTerceros, idTercero, relExpTerAux, nombre, valorCambioRole,
						participacion);

			} else {
				insertarParticipante(usuario, fecha, relExpTerAux, datosTerceros);
			}
		}
	}

	public List<RelExpTer> findParticipaciones(Integer idExpediente) {

		RelExpTer filter = new RelExpTer();
		filter.setIdExpediente(idExpediente);
		List<RelExpTer> listaParticipaciones = this.relExpTerDao.findParticipacionesAgrupadas(filter);
		// Se buscan todas la participaciones
		for (Iterator<RelExpTer> iterator = listaParticipaciones.iterator(); iterator.hasNext();) {
			RelExpTer participacion = iterator.next();
			List<DatosTerceros> tercerosParticipacion = this.relExpTerDao.findTerceros(idExpediente,
					participacion.getParticipantId());

			// Por cada paticipacion se recuperan los terceros y sus direcciones
			for (Iterator<DatosTerceros> itDatosTercero = tercerosParticipacion.iterator(); itDatosTercero.hasNext();) {
				DatosTerceros datosTerceros = itDatosTercero.next();
				DatosTerceros datosTercerosFound = this.datosTercerosDao.findById(datosTerceros.getIdTercero());
				datosTerceros.setNombre(datosTercerosFound.getNombre());
				datosTerceros.setApellido1(datosTercerosFound.getApellido1());
				datosTerceros.setApellido2(datosTercerosFound.getApellido2());
				datosTerceros.setDocumento(datosTercerosFound.getDocumento());
				List<DatosDirecciones> datosDirecciones = this.datosDireccionesDao
						.findUbicacionTerceroId(datosTerceros.getIdTercero());
				datosTercerosFound.setListDatosDirecciones(datosDirecciones);

			}
			participacion.setDatosTercerosList(tercerosParticipacion);
		}
		listaParticipaciones = reduceListaParticipaciones(listaParticipaciones);
		return listaParticipaciones;
	}

	private List<RelExpTer> reduceListaParticipaciones(List<RelExpTer> listaParticipaciones) {
		List<RelExpTer> listaParticipacionesReduced = new ArrayList<RelExpTer>();
		String participationId;
		String terceroId;
		Boolean participacionRepited;
		for (Iterator<RelExpTer> iterator = listaParticipaciones.iterator(); iterator.hasNext();) {
			RelExpTer participacion = iterator.next();
			participacionRepited = false;
			for (Iterator<RelExpTer> iteratorReducer = listaParticipacionesReduced.iterator(); iteratorReducer
					.hasNext();) {
				RelExpTer participacionReduce = iteratorReducer.next();

				boolean participacionIsNull = participacion.getParticipantId() == null;
				boolean participacionReduceIsNull = participacionReduce.getParticipantId() == null;
				boolean equalsParticipationId = (participacionIsNull && participacionReduceIsNull)
						|| (!participacionIsNull
								&& participacion.getParticipantId().equals(participacionReduce.getParticipantId()))
						|| (!participacionReduceIsNull
								&& participacionReduce.getParticipantId().equals(participacion.getParticipantId()));
				boolean tipoTerceroIsNull = participacion.getTiposTercero().getIdTipoTercero() == null;
				boolean tipoTerceroReducedIsNull = participacionReduce.getTiposTercero().getIdTipoTercero() == null;
				boolean equaslTipoTercero = (tipoTerceroIsNull && tipoTerceroReducedIsNull)
						|| participacion.getTiposTercero().getIdTipoTercero()
								.equals(participacionReduce.getTiposTercero().getIdTipoTercero());
				participacionRepited = equalsParticipationId && equaslTipoTercero;
			}
			if (!participacionRepited) {
				listaParticipacionesReduced.add(participacion);
			}

		}
		return listaParticipacionesReduced;
	}

	/**
	 * Obtener lista de participaciones y direcciones del solicitante titular
	 * 
	 * 
	 * @param idExpediente
	 *            Integer
	 * 
	 */
	public List<VistaDatosExpediente> findParticipaciones2(Integer idExpediente, Long tipoParticipantePrincipal) {
		List<RelExpTer> listaParticipaciones = this.relExpTerDao.findParticipantes(idExpediente);
		// guardaremos parcipantes de una participacion
		List<DatosTerceros> listDatosTercero = new ArrayList<DatosTerceros>();

		VistaDatosExpediente vistaDatosExpedienteAux = new VistaDatosExpediente();
		VistaDatosExpediente vistaDatosExpedienteAuxBBDD = new VistaDatosExpediente();
		VistaDatosExpediente vistaDatosExpedienteDirecciones = new VistaDatosExpediente();
		List<VistaDatosExpediente> listaPersonas = new ArrayList<VistaDatosExpediente>();

		List<VistaTerceros> listaSearchFolder = new ArrayList<VistaTerceros>();

		VistaTerceros vistaTercerosAux = new VistaTerceros();
		VistaTerceros vistaTercerosAuxDireccion = new VistaTerceros();

		List<VistaTerceros> listafinalBBDD = new ArrayList<VistaTerceros>();

		List<VistaTerceros> listaDireccionesAux = new ArrayList<VistaTerceros>();

		List<DatosDirecciones> listaDirecciones = new ArrayList<DatosDirecciones>();

		String idParcipacion = "";
		Long idTipoPersona = 12345678910L;
		for (RelExpTer participacionesN : listaParticipaciones) {

			int result = participacionesN.getTiposTercero().getIdTipoTercero().compareTo(tipoParticipantePrincipal);
			if (participacionesN.getDatosTerceros().getTipoParticipante().intValue() == Constantes.PARTICIPANTE_TITULAR
					&& result == 0) {
				listaDirecciones = datosDireccionesDao
						.findUbicacionTerceroId(participacionesN.getDatosTerceros().getIdTercero());
				vistaTercerosAuxDireccion.setListaDirecciones(listaDirecciones);
				listaDireccionesAux.add(vistaTercerosAuxDireccion);
				vistaDatosExpedienteDirecciones = new VistaDatosExpediente();
				vistaDatosExpedienteDirecciones.setVistaTercerosList(listaDireccionesAux);
			}

			if (idParcipacion != null) {
				// cambio de partcipacion
				if (!idParcipacion.equalsIgnoreCase(participacionesN.getParticipantId())) {
					// para saber que no es el primero
					if (org.apache.commons.lang.StringUtils.isNotBlank(idParcipacion)) {
						vistaTercerosAux.setDatosTercerosList(listDatosTercero);
						listaSearchFolder.add(vistaTercerosAux);
						vistaDatosExpedienteAux = new VistaDatosExpediente();
						vistaDatosExpedienteAux.setVistaTercerosList(listaSearchFolder);
						vistaTercerosAux = new VistaTerceros();
					}

					idParcipacion = participacionesN.getParticipantId();
					vistaTercerosAux.setOrden(participacionesN.getOrden());
					vistaTercerosAux.setIdTipoTercero(participacionesN.getTiposTercero().getIdTipoTercero());
					vistaTercerosAux
							.setTipoTerceroDesCas(participacionesN.getTiposTercero().getDescripcionCastellano());
					vistaTercerosAux.setTipoTerceroDesEus(participacionesN.getTiposTercero().getDescripcionEuskera());
					vistaTercerosAux.setParticipantId(idParcipacion);
					listDatosTercero = new ArrayList<DatosTerceros>();
					idTipoPersona = participacionesN.getTiposTercero().getIdTipoTercero();
				}
			} else {
				if (idTipoPersona != participacionesN.getTiposTercero().getIdTipoTercero()) {
					if (idTipoPersona != 12345678910L) {
						vistaTercerosAux.setDatosTercerosList(listDatosTercero);
						listafinalBBDD.add(vistaTercerosAux);
						vistaDatosExpedienteAuxBBDD = new VistaDatosExpediente();
						vistaDatosExpedienteAuxBBDD.setVistaTercerosList(listafinalBBDD);
						vistaTercerosAux = new VistaTerceros();
					}
					idParcipacion = participacionesN.getParticipantId();
					idTipoPersona = participacionesN.getTiposTercero().getIdTipoTercero();
					vistaTercerosAux = new VistaTerceros();
					vistaTercerosAux.setIdTipoTercero(participacionesN.getTiposTercero().getIdTipoTercero());
					vistaTercerosAux
							.setTipoTerceroDesCas(participacionesN.getTiposTercero().getDescripcionCastellano());
					vistaTercerosAux.setTipoTerceroDesEus(participacionesN.getTiposTercero().getDescripcionEuskera());
					vistaTercerosAux.setDatosTercerosList(listDatosTercero);
					vistaTercerosAux.setParticipantId(idParcipacion);
					listDatosTercero = new ArrayList<DatosTerceros>();

				}
			}

			DatosTerceros datosTerceros = new DatosTerceros();
			datosTerceros.setNombre(participacionesN.getDatosTerceros().getNombre());
			datosTerceros.setDocumento(participacionesN.getDatosTerceros().getDocumento());
			datosTerceros.setIdTercero(participacionesN.getDatosTerceros().getIdTercero());
			datosTerceros.setApellido1(participacionesN.getDatosTerceros().getApellido1());
			datosTerceros.setApellido2(participacionesN.getDatosTerceros().getApellido2());
			datosTerceros.setTipoParticipante(participacionesN.getDatosTerceros().getTipoParticipante());
			listDatosTercero.add(datosTerceros);

		}

		vistaTercerosAux.setDatosTercerosList(listDatosTercero);
		if (idParcipacion != null && idTipoPersona == 12345678910L) {
			listaSearchFolder.add(vistaTercerosAux);
			vistaDatosExpedienteAux = new VistaDatosExpediente();
			vistaDatosExpedienteAux.setVistaTercerosList(listaSearchFolder);

		} else {
			if (idParcipacion == null && (idTipoPersona == Constantes.REPRESENTANTE_LEGAL
					|| idTipoPersona == Constantes.PERSONA_CONTACTO)) {
				listafinalBBDD.add(vistaTercerosAux);
				vistaDatosExpedienteAuxBBDD = new VistaDatosExpediente();
				vistaDatosExpedienteAuxBBDD.setVistaTercerosList(listafinalBBDD);
			} else {
				listaSearchFolder.add(vistaTercerosAux);
				vistaDatosExpedienteAux = new VistaDatosExpediente();
				vistaDatosExpedienteAux.setVistaTercerosList(listaSearchFolder);
			}

		}

		listaPersonas.add(vistaDatosExpedienteAux);
		listaPersonas.add(vistaDatosExpedienteDirecciones);
		listaPersonas.add(vistaDatosExpedienteAuxBBDD);
		return listaPersonas;

	}

	private void updatearParticipante(String usuario, Date fecha, DatosTerceros datosTerceros, int idTercero,
			RelExpTer relExpTerAux, String nombre, int valorCambioRole, String participacion) {

		datosTerceros.setIdTercero(idTercero);
		datosTerceros.setFechaUltmodificacion(fecha);
		datosTerceros.setUsuarioUltmodificacion(usuario);
		datosTerceros.setFechaRegistro(fecha);
		datosTerceros.setUsuarioRegistro(usuario);

		logger.info("Nombre de la persona Representante de la participacion: " + nombre + "idTercero: " + idTercero);
		datosTercerosDao.updateTerceroSearchfolder(datosTerceros);

		CanalesAviso canalesAviso = new CanalesAviso();
		canalesAviso.setDatosTerceros(datosTerceros);
		canalesAviso.setUsuarioRegistro(usuario);
		canalesAviso.setFechaRegistro(fecha);
		int resultado = 0;
		// Buscamos si tenemos canales de aviso para este titular
		// tema de canales de aviso del titular
		if (datosTerceros.getCanalesAvisos().size() > 0) {
			for (int i = 0; i < datosTerceros.getCanalesAvisos().size(); i++) {
				canalesAviso.setTiposCanalAviso(datosTerceros.getCanalesAvisos().get(i).getTiposCanalAviso());
				canalesAviso.setCanalAviso(datosTerceros.getCanalesAvisos().get(i).getCanalAviso());
				// busca canal de aviso por id de tercero si no esta insert sino
				// esta update
				resultado = canalesAvisoDao.findCanalByIdTercero(canalesAviso);
				if (null != datosTerceros.getCanalesAvisos().get(i).getCanalAviso()) {
					if (resultado >= 1) {

						canalesAvisoDao.updateCanalAviso(canalesAviso);
						logger.info("Updateamos canal de tipo de aviso en BBDD: "
								+ datosTerceros.getCanalesAvisos().get(i).getTiposCanalAviso() + "para el Tercero: "
								+ idTercero);
					} else {
						logger.info("Ayadimos canal de tipo de aviso en BBDD: "
								+ datosTerceros.getCanalesAvisos().get(i).getTiposCanalAviso() + "para el Tercero: "
								+ idTercero);
						if (null != datosTerceros.getCanalesAvisos().get(i).getTiposCanalAviso()
								.getIdTipoCanalAviso()) {
							canalesAvisoDao.addCanalesAviso(canalesAviso);
						}
					}
				}
			}
		} else {
			resultado = canalesAvisoDao.findTodosLosCanalByIdTercero(idTercero);
			if (resultado > 0) {
				// borramos canales del titular
				canalesAvisoDao.removeCanalesTercero(idTercero);
			}
		}

		DatosTerceros datosTercerosId = new DatosTerceros(idTercero);
		DatosDirecciones filter = new DatosDirecciones();
		filter = datosDireccionesDao.findPostalTerceroId(idTercero);
		boolean hasPostal = filter != null && filter.getIdDireccion() != null && filter.getIdDireccion() > 0;
		boolean notHasPostalPlatea = datosTerceros.getListDatosDirecciones() != null
				&& datosTerceros.getListDatosDirecciones().isEmpty();
		boolean hasPostalPlatea = datosTerceros.getListDatosDirecciones() != null
				&& !datosTerceros.getListDatosDirecciones().isEmpty();
		// Check if exists postal and not in platea, delete else register change
		if (hasPostal && notHasPostalPlatea) {
			datosDireccionesDao.remove(filter);
		} else {
			if (hasPostalPlatea) {
				List<DatosDirecciones> direccionesPostalesPlatea = datosTerceros.getListDatosDirecciones();
				DatosDirecciones direccionPlatea = direccionesPostalesPlatea.get(0);
				if (hasPostal) {
					direccionPlatea.setIdDireccion(filter.getIdDireccion());
					direccionPlatea.setDatosTerceros(datosTercerosId);
					datosDireccionesDao.update(direccionPlatea);
				} else {
					direccionPlatea.setDatosTerceros(datosTercerosId);
					datosDireccionesDao.add(direccionPlatea);
				}
			}
		}
		// ACTUALIZAMOS mi bbdd por si se ha borrado desde tramigune una
		// tipo de canal de aviso
		List<CanalesAviso> resultadoList = canalesAvisoDao.findCanalesAvisoByIdTercero(idTercero);
		if (resultadoList.size() > datosTerceros.getCanalesAvisos().size()) {
			for (int k = 0; k < resultadoList.size(); k++) {
				for (int t = 0; t < datosTerceros.getCanalesAvisos().size();) {
					if (null != datosTerceros.getCanalesAvisos().get(t).getTiposCanalAviso()) {
						if (!resultadoList.get(k).getTiposCanalAviso().getIdTipoCanalAviso().equals(
								datosTerceros.getCanalesAvisos().get(t).getTiposCanalAviso().getIdTipoCanalAviso())) {
							CanalesAviso canalesAvisoAux = new CanalesAviso();
							TiposCanalAviso tiposCanalAviso = new TiposCanalAviso();
							tiposCanalAviso.setIdTipoCanalAviso(
									resultadoList.get(k).getTiposCanalAviso().getIdTipoCanalAviso());
							canalesAvisoAux.setTiposCanalAviso(tiposCanalAviso);
							canalesAvisoAux.setDatosTerceros(datosTerceros);
							canalesAvisoDao.removeCanalesByIdTercero(canalesAvisoAux);
						}
					}
				}
			}

		}
		if (valorCambioRole == 1) {
			relExpTerAux.setDatosTerceros(datosTerceros);
			relExpTerAux.setFechaUltmodificacion(fecha);
			relExpTerAux.setUsuarioUltmodificacion(usuario);
			logger.info("Updatear relacion expediente tercero: " + relExpTerAux.getParticipantId());
			this.relExpTerDao.updateByParticipantId(relExpTerAux);
		}
		if (participacion.equalsIgnoreCase("0")) {
			relExpTerAux.setDatosTerceros(datosTerceros);
			relExpTerAux.setFechaUltmodificacion(fecha);
			relExpTerAux.setUsuarioUltmodificacion(usuario);
			logger.info("Updatear relacion expediente tercero: " + relExpTerAux.getParticipantId());
			this.relExpTerDao.updateByParticipantValue(relExpTerAux);
		}
	}

	private void insertarParticipante(String usuario, Date fecha, RelExpTer relExpTerAux, DatosTerceros datosTerceros) {
		datosTerceros.setFechaRegistro(fecha);
		datosTerceros.setUsuarioRegistro(usuario);

		logger.info("Nombre de la persona Representante NUEVO de la participacion");
		datosTercerosDao.addTerceroSearchFolder(datosTerceros);
		DatosTerceros datosTercerosAUxId = datosTercerosDao.findUltimoId();

		CanalesAviso canalesAviso = new CanalesAviso();
		canalesAviso.setDatosTerceros(datosTercerosAUxId);
		canalesAviso.setUsuarioRegistro(usuario);
		canalesAviso.setFechaRegistro(fecha);
		canalesAviso.setDatosTerceros(datosTercerosAUxId);
		// Solo inserto del titular pq desde el search folder solo me trae ese
		if (datosTerceros.getCanalesAvisos().size() > 0) {
			for (int i = 0; i < datosTerceros.getCanalesAvisos().size(); i++) {
				if (null != datosTerceros.getCanalesAvisos().get(i).getCanalAviso()) {
					canalesAviso.setTiposCanalAviso(datosTerceros.getCanalesAvisos().get(i).getTiposCanalAviso());
					canalesAviso.setCanalAviso(datosTerceros.getCanalesAvisos().get(i).getCanalAviso());
					if (null != datosTerceros.getCanalesAvisos().get(i).getTiposCanalAviso().getIdTipoCanalAviso()) {
						canalesAvisoDao.addCanalesAviso(canalesAviso);
					}
					logger.info("Ayadimos canal de tipo de aviso en BBDD: "
							+ datosTerceros.getCanalesAvisos().get(i).getTiposCanalAviso() + "para el Tercero: "
							+ datosTercerosAUxId.getIdTercero());
				}
			}
		}
		if (datosTerceros.getListDatosDirecciones() != null && !datosTerceros.getListDatosDirecciones().isEmpty()) {
			for (Iterator<DatosDirecciones> iterator = datosTerceros.getListDatosDirecciones().iterator(); iterator
					.hasNext();) {
				DatosDirecciones datosDirecciones = iterator.next();
				datosDirecciones.setDatosTerceros(datosTercerosAUxId);
				datosDireccionesDao.add(datosDirecciones);
				logger.info("Ayadimos direcciones en BBDD: " + datosDirecciones.getTiposDireccion().getIdTipoDireccion()
						+ "para el Tercero: " + datosTercerosAUxId.getIdTercero());
			}
		}
		relExpTerAux.setDatosTerceros(datosTercerosAUxId);
		relExpTerAux.setFechaRegistro(fecha);
		relExpTerAux.setUsuarioRegistro(usuario);
		this.add(relExpTerAux);
	}

	/**
	 * Guardar ubicacion y direccion del solicitante y si es bec tambien la
	 * puntacuion
	 *
	 * @param relExpTerEmp
	 *            RelExpTerEmp Bean que contiene la informacion con la que se va
	 *            a crear el nuevo registro.
	 * @return RelExpTerEmp Bean resultante del proceso de creacion.
	 */
	public void registerDomicilioUbicacionSolicitante(HttpServletRequest request, Integer idTercero,
			InitForm initForm) {
		RelExpTerServiceImpl.logger.info("Incio guardar Solicitante Ubicacion y/o Solicitante direccion");

		List<DatosDirecciones> datosDirecciones = this.datosDireccionesDao.findUbicacionTerceroId(idTercero);
		DatosDirecciones dirTercero = null;
		DatosDirecciones dirEstablecimiento = null;
		for (DatosDirecciones direccion : datosDirecciones) {
			if (Constantes.ID_DIRECCION_ACTIVIDAD == direccion.getTiposDireccion().getIdTipoDireccion()) {
				dirEstablecimiento = direccion;
			} else if (Constantes.ID_DIRECCION_NOTIF_POSTAL == direccion.getTiposDireccion().getIdTipoDireccion()) {
				dirTercero = direccion;
			}
		}

		if (dirTercero == null) {
			dirTercero = new DatosDirecciones();
		}
		if (dirEstablecimiento == null) {
			dirEstablecimiento = new DatosDirecciones();
		}

		Date fecha = new Date();

		Long idPaisSolicitante;

		Long idProvinciaSolicitante;
		Long idMunicipioSolicitante;
		Long idLocalidadSolicitante;

		Long idPaisActividad;
		Long idProvinciaUbicacion;
		Long idMunicipioUbicacion;
		Long idLocalidadUbicacion;

		if (null != request.getParameter("idTipoDireccionSolicitante")
				&& !"".equalsIgnoreCase(request.getParameter("idTipoDireccionSolicitante"))) {

			String direccionSolicitante = null;
			String numeroSolicitante = null;
			String pisoSolicitante = null;
			String letraSolicitante = null;
			String escaleraSolicitante = null;
			String codigoPostalSolicitante = null;
			String descProvinciaExt = null;
			String descCiudadExt = null;

			if (request.getParameter("postalType") != null && "1".equals(request.getParameter("postalType"))) {
				idPaisSolicitante = Long.parseLong(request.getParameter("idPaisOtrosSolicitante"));
				descProvinciaExt = request.getParameter("provinciaExtrSolicitante");
				descCiudadExt = request.getParameter("ciudadExtrSolicitante");
				direccionSolicitante = request.getParameter("direccionExtrSolicitante");
				codigoPostalSolicitante = request.getParameter("codigoPostalExtrSolicitante");
			} else {
				idPaisSolicitante = Constantes.ID_NORA_ESP;
				direccionSolicitante = request.getParameter("direccionSolicitante");
				numeroSolicitante = request.getParameter("numeroSolicitante");
				pisoSolicitante = request.getParameter("pisoSolicitante");
				letraSolicitante = request.getParameter("letraSolicitante");
				escaleraSolicitante = request.getParameter("escaleraSolicitante");
				codigoPostalSolicitante = request.getParameter("codigoPostalSolicitante");
			}

			if (null != request.getParameter("idProvinciaSolicitante")
					&& !"".equalsIgnoreCase(request.getParameter("idProvinciaSolicitante"))) {
				idProvinciaSolicitante = Long.parseLong(request.getParameter("idProvinciaSolicitante"));
				RelExpTerServiceImpl.logger.info("idProvinciaSolicitante = " + idProvinciaSolicitante);
				dirTercero.setIdProvincia(idProvinciaSolicitante);
			}

			if (null != request.getParameter("idMunicipioSolicitante")
					&& !"".equalsIgnoreCase(request.getParameter("idMunicipioSolicitante"))) {
				idMunicipioSolicitante = Long.parseLong(request.getParameter("idMunicipioSolicitante"));
				RelExpTerServiceImpl.logger.info("idMunicipioSolicitante = " + idMunicipioSolicitante);
				dirTercero.setIdMunicipio(idMunicipioSolicitante);
			}

			if (null != request.getParameter("idLocalidadSolicitante")
					&& !"".equalsIgnoreCase(request.getParameter("idLocalidadSolicitante"))) {
				idLocalidadSolicitante = Long.parseLong(request.getParameter("idLocalidadSolicitante"));
				RelExpTerServiceImpl.logger.info("idLocalidadSolicitante = " + idLocalidadSolicitante);
				dirTercero.setIdLocalidad(idLocalidadSolicitante);
			}
			Long idTipoDireccionSolicitante = 4L;
			if (null == request.getParameter("idTipoDireccionSolicitante")) {
				idTipoDireccionSolicitante = Constantes.ID_DIRECCION_NOTIF_POSTAL;
			} else {
				idTipoDireccionSolicitante = Long.parseLong(request.getParameter("idTipoDireccionSolicitante"));
			}

			DatosTerceros datosTercerosSolicitante = new DatosTerceros();
			datosTercerosSolicitante.setIdTercero(idTercero);
			TiposDireccion tiposDireccion = new TiposDireccion();
			tiposDireccion.setIdTipoDireccion(idTipoDireccionSolicitante);

			dirTercero.setTiposDireccion(tiposDireccion);
			dirTercero.setDatosTerceros(datosTercerosSolicitante);

			dirTercero.setIdPais(idPaisSolicitante);
			dirTercero.setCodigoPostal(codigoPostalSolicitante);
			dirTercero.setDireccion(direccionSolicitante);
			dirTercero.setEscalera(escaleraSolicitante);
			dirTercero.setLetra(letraSolicitante);
			dirTercero.setNumero(numeroSolicitante);
			dirTercero.setPiso(pisoSolicitante);
			dirTercero.setDescProvinciaExtranjera(descProvinciaExt);
			dirTercero.setDescCiudadExtranjera(descCiudadExt);
			dirTercero.setFechaRegistro(fecha);
			dirTercero.setFechaUltmodificacion(fecha);
			dirTercero.setUsuarioRegistro(PermisosXLNETS.getUserConnected());
			dirTercero.setUsuarioUltmodificacion(PermisosXLNETS.getUserConnected());
			RelExpTerServiceImpl.logger.info("Datos Solicitante = " + dirTercero);
			// DatosDirecciones dirTerceroAux = new
			// DatosDirecciones();
			if (dirTercero.getIdDireccion() == null || dirTercero.getIdDireccion() == 0) {
				this.datosDireccionesDao.add(dirTercero);
			} else if (initForm.isEnableUpdateDirecciones()) {
				this.datosDireccionesDao.update(dirTercero);
			}

		}

		if (null != request.getParameter("idTipoDireccionUbicacion")
				&& !"".equalsIgnoreCase(request.getParameter("idTipoDireccionUbicacion"))) {

			Long idTipoDireccionUbicacion = Constantes.ID_DIRECCION_ACTIVIDAD;

			String direccionActividad = null;
			String numeroActividad = null;
			String pisoActividad = null;
			String letraActividad = null;
			String escaleraActividad = null;
			String codigoPostalActividad = null;
			String descProvinciaExt = null;
			String descCiudadExt = null;

			String establecimiento = request.getParameter("establecimiento");
			String identidicadorEstablecimiento = request.getParameter("identidicadorEstablecimiento");

			if (request.getParameter("postalEstType") != null && "1".equals(request.getParameter("postalEstType"))) {
				idPaisActividad = Long.parseLong(request.getParameter("idPaisOtrosActividad"));
				descProvinciaExt = request.getParameter("descProvinciaExtranjera");
				descCiudadExt = request.getParameter("descCiudadExtranjera");
				direccionActividad = request.getParameter("direccionExt");
				codigoPostalActividad = request.getParameter("codigoPostalExt");
			} else {
				idPaisActividad = Constantes.ID_NORA_ESP;
				direccionActividad = request.getParameter("direccionUbicacion");
				numeroActividad = request.getParameter("numeroUbicacion");
				pisoActividad = request.getParameter("pisoUbicacion");
				letraActividad = request.getParameter("letraUbicacion");
				escaleraActividad = request.getParameter("escaleraUbicacion");
				codigoPostalActividad = request.getParameter("codigoPostalUbicacion");
			}

			if (null != request.getParameter("idProvinciaUbicacion")
					&& !"".equalsIgnoreCase(request.getParameter("idProvinciaUbicacion"))) {
				idProvinciaUbicacion = Long.parseLong(request.getParameter("idProvinciaUbicacion"));
				RelExpTerServiceImpl.logger.info("idProvinciaUbicacion = " + idProvinciaUbicacion);
				dirEstablecimiento.setIdProvincia(idProvinciaUbicacion);
			}

			if (null != request.getParameter("idMunicipioUbicacion")
					&& !"".equalsIgnoreCase(request.getParameter("idMunicipioUbicacion"))) {
				idMunicipioUbicacion = Long.parseLong(request.getParameter("idMunicipioUbicacion"));
				RelExpTerServiceImpl.logger.info("idMunicipioUbicacion = " + idMunicipioUbicacion);
				dirEstablecimiento.setIdMunicipio(idMunicipioUbicacion);
			}

			if (null != request.getParameter("idLocalidadUbicacion")
					&& !"".equalsIgnoreCase(request.getParameter("idLocalidadUbicacion"))) {
				idLocalidadUbicacion = Long.parseLong(request.getParameter("idLocalidadUbicacion"));
				RelExpTerServiceImpl.logger.info("idLocalidadUbicacion = " + idLocalidadUbicacion);
				dirEstablecimiento.setIdLocalidad(idLocalidadUbicacion);
			}

			TiposDireccion tiposDireccionUbicacion = new TiposDireccion();
			tiposDireccionUbicacion.setIdTipoDireccion(idTipoDireccionUbicacion);

			DatosTerceros datosTercerosUbicacion = new DatosTerceros();
			datosTercerosUbicacion.setIdTercero(idTercero);
			dirEstablecimiento.setIdPais(idPaisActividad);
			dirEstablecimiento.setTiposDireccion(tiposDireccionUbicacion);
			dirEstablecimiento.setIdentificadorEstablecimiento(identidicadorEstablecimiento);
			dirEstablecimiento.setDatosTerceros(datosTercerosUbicacion);
			dirEstablecimiento.setCodigoPostal(codigoPostalActividad);
			dirEstablecimiento.setDireccion(direccionActividad);
			dirEstablecimiento.setEscalera(escaleraActividad);
			dirEstablecimiento.setEstablecimiento(establecimiento);
			dirEstablecimiento.setLetra(letraActividad);
			dirEstablecimiento.setNumero(numeroActividad);
			dirEstablecimiento.setPiso(pisoActividad);
			dirEstablecimiento.setDescProvinciaExtranjera(descProvinciaExt);
			dirEstablecimiento.setDescCiudadExtranjera(descCiudadExt);
			dirEstablecimiento.setFechaRegistro(fecha);
			dirEstablecimiento.setFechaUltmodificacion(fecha);
			dirEstablecimiento.setUsuarioRegistro(PermisosXLNETS.getUserConnected());
			dirEstablecimiento.setUsuarioUltmodificacion(PermisosXLNETS.getUserConnected());

			RelExpTerServiceImpl.logger.info("Ubicacion Solicitante = " + dirEstablecimiento);
			// DatosDirecciones datosDireccionesUbicacionAux = new
			// DatosDirecciones();
			if (dirEstablecimiento.getIdDireccion() == null || dirEstablecimiento.getIdDireccion() == 0) {
				this.datosDireccionesDao.add(dirEstablecimiento);
			} else if (initForm.isEnableUpdateDirecciones()) {
				this.datosDireccionesDao.update(dirEstablecimiento);
			}
		}

	}

	/*
	 * OPERACIONES RUP_TABLE
	 */

	/**
	 * Removes rows from the RelExpTer table.
	 *
	 * @param filterRelExpTer
	 *            RelExpTer
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 */
	public void removeMultiple(RelExpTer filterRelExpTer, JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		this.relExpTerDao.removeMultiple(filterRelExpTer, jqGridRequestDto, startsWith);
	}

	/**
	 * Filter method in the RelExpTer table.
	 *
	 * @param filterRelExpTer
	 *            RelExpTer
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return JQGridResponseDto<RelExpTer>
	 */
	public JQGridResponseDto<RelExpTer> filter(RelExpTer filterRelExpTer, JQGridRequestDto jqGridRequestDto,
			Boolean startsWith) {
		List<RelExpTer> listaRelExpTer = this.relExpTerDao.findAllLike(filterRelExpTer, jqGridRequestDto, false);
		Long recordNum = this.relExpTerDao.findAllLikeCount(filterRelExpTer != null ? filterRelExpTer : new RelExpTer(),
				false);
		if (jqGridRequestDto.getMultiselection().getSelectedIds() != null) {
			List<TableRowDto<RelExpTer>> reorderSelection = this.relExpTerDao.reorderSelection(filterRelExpTer,
					jqGridRequestDto, startsWith);
			return new JQGridResponseDto<RelExpTer>(jqGridRequestDto, recordNum, listaRelExpTer, reorderSelection);
		}
		return new JQGridResponseDto<RelExpTer>(jqGridRequestDto, recordNum, listaRelExpTer);
	}

	/**
	 * Searches rows in the RelExpTer table.
	 *
	 * @param filterRelExpTer
	 *            RelExpTer
	 * @param searchRelExpTer
	 *            RelExpTer
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<TableRowDto<RelExpTer>>
	 */
	public List<TableRowDto<RelExpTer>> search(RelExpTer filterRelExpTer, RelExpTer searchRelExpTer,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		return this.relExpTerDao.search(filterRelExpTer, searchRelExpTer, jqGridRequestDto, startsWith);
	}

	/**
	 * Reorder the selection made in RelExpTer table.
	 *
	 * @param filterRelExpTer
	 *            RelExpTer
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return Object
	 */
	public Object reorderSelection(RelExpTer filterRelExpTer, JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		return this.relExpTerDao.reorderSelection(filterRelExpTer, jqGridRequestDto, startsWith);
	}

	/*
	 * OPERACIONES RUP_TABLE JERARQUIA
	 */

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

	public Integer findFirstTerceroWhitoutEstablecimiento(Integer idExpediente) {
		return this.relExpTerDao.findFirstTerceroWhitoutEstablecimiento(idExpediente);
	}

}
