package com.ejie.ab61.service.expedientes;

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

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.ab61.clientesWS.X43ExpedienteElectronico.TAccount;
import com.ejie.ab61.clientesWS.X43ExpedienteElectronico.TBoolean;
import com.ejie.ab61.clientesWS.X43ExpedienteElectronico.TContact;
import com.ejie.ab61.clientesWS.X43ExpedienteElectronico.TContactList;
import com.ejie.ab61.clientesWS.X43ExpedienteElectronico.TContactType;
import com.ejie.ab61.clientesWS.X43ExpedienteElectronico.TFolder;
import com.ejie.ab61.clientesWS.X43ExpedienteElectronico.TFolderList;
import com.ejie.ab61.clientesWS.X43ExpedienteElectronico.TInterested;
import com.ejie.ab61.clientesWS.X43ExpedienteElectronico.TInterestedList;
import com.ejie.ab61.clientesWS.X43ExpedienteElectronico.TParticipantRRI;
import com.ejie.ab61.clientesWS.X43ExpedienteElectronico.TParticipantRRIList;
import com.ejie.ab61.clientesWS.X43ExpedienteElectronico.TRepresentative;
import com.ejie.ab61.comun.Constantes;
import com.ejie.ab61.dao.expedientes.RelExpTerDao;
import com.ejie.ab61.dao.terceros.CanalesAvisoDao;
import com.ejie.ab61.dao.terceros.DatosDireccionesDao;
import com.ejie.ab61.dao.terceros.DatosTercerosDao;
import com.ejie.ab61.dao.terceros.TiposDocumentoDao;
import com.ejie.ab61.dao.terceros.TiposTerceroDao;
import com.ejie.ab61.model.expedientes.RelExpTer;
import com.ejie.ab61.model.terceros.CanalesAviso;
import com.ejie.ab61.model.terceros.DatosTerceros;
import com.ejie.ab61.model.terceros.TiposCanalAviso;
import com.ejie.ab61.model.terceros.TiposDocumento;
import com.ejie.ab61.model.terceros.TiposTercero;
import com.ejie.ab61.model.terceros.VistaDatosExpediente;
import com.ejie.ab61.model.terceros.VistaTerceros;
import com.ejie.ab61.model.usuario.Usuario;
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 TiposDocumentoDao tiposDocumentoDao;
	@Autowired
	private DatosTercerosDao datosTercerosDao;
	@Autowired
	private CanalesAvisoDao canalesAvisoDao;
	@Autowired
	private DatosDireccionesDao datosDireccionesDao;
	@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 actulizarListParticipantesPorParticipacion(TFolderList resultado, Integer idExpediente,
			Usuario usuario) {

		Date fecha = new Date();
		RelExpTer relExpTerAux = new RelExpTer();

		TFolder folder = resultado.getFolder().get(0);
		TParticipantRRIList lista = folder.getParticipantRRIList();
		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 = new ArrayList<TInterested>();
			if (Interesados != null) {
				listaInteresados = Interesados.getInterested();
			}

			TRepresentative representante = participant.getRepresentative();
			/** Corrección tratamiento participantes searchForder **/
			// buscar los terceros de ese rol y participantId en mi bbdd
			List<RelExpTer> participantPersonEnBBDD = new ArrayList<RelExpTer>();
			// List<RelExpTer> valorParticipacionId =
			// relExpTerDao.findValorParticipant(idExpediente);
			// 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;
			// }
			List<RelExpTer> valorParticipacionId = relExpTerDao.findValorParticipant(idExpediente);
			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);
					}
				}
			}

			// sacamos el id del role de nuestra bbddd para insertarlo en la
			// relacion expediente tercero
			TiposTercero tipoTercero = tiposTerceroDao.findIdTipoTercero(participant.getRole().name());
			DatosTerceros datosTerceros;
			List<CanalesAviso> listaCanales;
			// Primero recorremos interestedLis si no hay null(parece ser que
			// siempre hay 1 )(x terceros)
			for (int j = 0; j < listaInteresados.size(); j++) {
				datosTerceros = new DatosTerceros();
				listaCanales = new ArrayList<CanalesAviso>();

				insertarUpdatearTitular(idExpediente, usuario, 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);
		boolean borrarRegistro = true;
		if (relExpTerList.size() > tParticipantes.size()) {
			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();
							if (Interesados != null) {
								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 insertarUpdatearRepresentante(Integer idExpediente, Usuario 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.setIdTipoDocumento(tiposDocumento.getIdTipoDocumento());
		}
		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 insertarUpdatearTitular(Integer idExpediente, Usuario usuario, 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.setIdTipoDocumento(tiposDocumento.getIdTipoDocumento());
		}
		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:
				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) {
					int idTercero = participantPersonEnBBDD.get(k).getDatosTerceros().getIdTercero();
					relExpTerDao.removeidTercero(idTercero);
					datosTercerosDao.remove(idTercero);
				}
			}
		}
	}

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

			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);
				}

			}
		}
		datosTerceros.setCanalesAvisos(listaCanales);
	}

	private void insertarUpadtearParticipante(Usuario 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);
			}
		}
	}

	/**
	 * Obtener lista de participaciones y direcciones del solicitante titular
	 * 
	 * 
	 * @param idExpediente
	 *            Integer
	 * 
	 */
	public List<VistaDatosExpediente> findParticipaciones(Integer idExpediente) {

		List<RelExpTer> listaParticipaciones = this.relExpTerDao.findParticipantes(idExpediente);
		// guardaremos parcipantes de una participacion
		List<DatosTerceros> listDatosTercero = new ArrayList<DatosTerceros>();
		VistaDatosExpediente vistaDatosExpedienteAux = new VistaDatosExpediente();
		List<VistaDatosExpediente> listaPersonas = new ArrayList<VistaDatosExpediente>();
		List<VistaTerceros> listaSearchFolder = new ArrayList<VistaTerceros>();
		VistaTerceros vistaTercerosAux = new VistaTerceros();
		String idParcipacion = "";
		for (RelExpTer participacionesN : listaParticipaciones) {

			// 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>();

			}

			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);
		listaSearchFolder.add(vistaTercerosAux);
		vistaDatosExpedienteAux = new VistaDatosExpediente();
		vistaDatosExpedienteAux.setVistaTercerosList(listaSearchFolder);

		listaPersonas.add(vistaDatosExpedienteAux);
		return listaPersonas;

	}

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

		datosTerceros.setIdTercero(idTercero);
		datosTerceros.setFechaUltmodificacion(fecha);
		datosTerceros.setUsuarioUltmodificacion(usuario.getNombreUsuario());
		datosTerceros.setFechaRegistro(fecha);
		datosTerceros.setUsuarioRegistro(usuario.getNombreUsuario());
		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.getNombreUsuario());
		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 para el Tercero: " + idTercero);
					} else {
						logger.info("Ayadimos canal de tipo de aviso en BBDD: para el Tercero: " + idTercero);
						canalesAvisoDao.addCanalesAviso(canalesAviso);
					}
				}

			}
		} else {
			resultado = canalesAvisoDao.findTodosLosCanalByIdTercero(idTercero);
			if (resultado > 0) {
				// borramos canales del titular
				canalesAvisoDao.removeCanalesTercero(idTercero);
			}
		}

		// 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(); t++) {
					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.getNombreUsuario());
			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.getNombreUsuario());
			logger.info("Updatear relacion expediente tercero: " + relExpTerAux.getParticipantId());
			this.relExpTerDao.updateByParticipantValue(relExpTerAux);
		}

	}

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

		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.getNombreUsuario());
		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());
					canalesAvisoDao.addCanalesAviso(canalesAviso);
					logger.info("Ayadimos canal de tipo de aviso en BBDD: "
							+ datosTerceros.getCanalesAvisos().get(i).getTiposCanalAviso() + "para el Tercero: "
							+ datosTercerosAUxId.getIdTercero());
				}
			}
		}
		relExpTerAux.setDatosTerceros(datosTercerosAUxId);
		relExpTerAux.setFechaRegistro(fecha);
		relExpTerAux.setUsuarioRegistro(usuario.getNombreUsuario());
		this.add(relExpTerAux);
	}

	/*
	 * 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;
	}

}
