package com.ejie.ad74a.ws.server.televida.service;

import java.sql.Time;
import java.text.ParseException;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.ejie.ad74a.dao.AlarmasDao;
import com.ejie.ad74a.dao.AvisosDao;
import com.ejie.ad74a.dao.ContactosDao;
import com.ejie.ad74a.dao.DispValoracionesDao;
import com.ejie.ad74a.dao.DispositivosDao;
import com.ejie.ad74a.dao.DispositivosSolDao;
import com.ejie.ad74a.dao.EmergenciasDao;
import com.ejie.ad74a.dao.InformesDao;
import com.ejie.ad74a.dao.InstalacionesDao;
import com.ejie.ad74a.dao.IntervencionesDao;
import com.ejie.ad74a.dao.LlamadasDao;
import com.ejie.ad74a.dao.MaestroSubtpoLlamadaDao;
import com.ejie.ad74a.dao.MovimientosDispositivosDao;
import com.ejie.ad74a.dao.NotasSolicitanteDao;
import com.ejie.ad74a.dao.ProtocolosDao;
import com.ejie.ad74a.dao.RecMovilEmerDao;
import com.ejie.ad74a.dao.SolicitantesDao;
import com.ejie.ad74a.dao.TerminalesDao;
import com.ejie.ad74a.dao.ValoracionesDao;
import com.ejie.ad74a.exceptions.ManagerErrors;
import com.ejie.ad74a.model.Alarmas;
import com.ejie.ad74a.model.Avisos;
import com.ejie.ad74a.model.Contactos;
import com.ejie.ad74a.model.DispValoraciones;
import com.ejie.ad74a.model.Dispositivos;
import com.ejie.ad74a.model.DispositivosSol;
import com.ejie.ad74a.model.Emergencias;
import com.ejie.ad74a.model.Informes;
import com.ejie.ad74a.model.Instalaciones;
import com.ejie.ad74a.model.Intervenciones;
import com.ejie.ad74a.model.Llamadas;
import com.ejie.ad74a.model.MaestroActores;
import com.ejie.ad74a.model.MaestroEmergencias;
import com.ejie.ad74a.model.MaestroSubtiposAviso;
import com.ejie.ad74a.model.MaestroSubtpoLlamada;
import com.ejie.ad74a.model.MaestroTipoAlarma;
import com.ejie.ad74a.model.MaestroTipoLlamada;
import com.ejie.ad74a.model.MaestroTiposAviso;
import com.ejie.ad74a.model.MovimientosDispositivos;
import com.ejie.ad74a.model.NotasSolicitante;
import com.ejie.ad74a.model.Protocolos;
import com.ejie.ad74a.model.RecMovilEmer;
import com.ejie.ad74a.model.Riesgos;
import com.ejie.ad74a.model.Solicitantes;
import com.ejie.ad74a.model.Soporte;
import com.ejie.ad74a.model.Terminales;
import com.ejie.ad74a.model.Valoraciones;
import com.ejie.ad74a.model.avisos.AvisosBajaBenef;
import com.ejie.ad74a.model.avisos.AvisosQueja;
import com.ejie.ad74a.service.RiesgosService;
import com.ejie.ad74a.service.SoporteService;
import com.ejie.ad74a.service.ValoracionesService;
import com.ejie.ad74a.util.comun.Utilidades;
import com.ejie.ad74a.util.comun.UtilidadesFecha;
import com.ejie.ad74a.util.constantes.AccionesTelevidaEnum;
import com.ejie.ad74a.util.constantes.ActoresEnum;
import com.ejie.ad74a.util.constantes.CanalComunicacionEnum;
import com.ejie.ad74a.util.constantes.Constantes;
import com.ejie.ad74a.util.constantes.EstadoInformesEnum;
import com.ejie.ad74a.util.constantes.MotivoBajaEnum;
import com.ejie.ad74a.util.constantes.MotivosQuejasReclamaEnum;
import com.ejie.ad74a.util.constantes.OrigenAvisosEnum;
import com.ejie.ad74a.util.constantes.OrigenComunicacionEnum;
import com.ejie.ad74a.util.constantes.RespuestasTelevidaEnum;
import com.ejie.ad74a.util.constantes.SentidoEnum;
import com.ejie.ad74a.util.constantes.SubTipoAvisoEnum;
import com.ejie.ad74a.util.constantes.TipoAvisoEnum;
import com.ejie.ad74a.util.constantes.TipoInformesEnum;
import com.ejie.ad74a.util.constantes.TipoMovimientoDispositivoEnum;
import com.ejie.ad74a.ws.server.televida.model.AlarmaType;
import com.ejie.ad74a.ws.server.televida.model.Comunicacion;
import com.ejie.ad74a.ws.server.televida.model.ContactoType;
import com.ejie.ad74a.ws.server.televida.model.DatosInstalacionType.DispositivosList;
import com.ejie.ad74a.ws.server.televida.model.EmergenciaType.RecursosMovilizadosList;
import com.ejie.ad74a.ws.server.televida.model.EmergenciaType;
import com.ejie.ad74a.ws.server.televida.model.IntervencionType;
import com.ejie.ad74a.ws.server.televida.model.LlamadasRecibidasType;
import com.ejie.ad74a.ws.server.televida.model.ProtocoloType;
import com.ejie.ad74a.ws.server.televida.model.RecursosMovilizadosType;
import com.ejie.ad74a.ws.server.televida.model.Respuesta;
import com.ejie.ad74a.ws.server.televida.model.ValoracionType;
import com.ejie.ad74a.ws.server.televida.util.ModelApplicationParser;

@Component
public class ProcesarPrestador {

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

	private static final int TRANSACTION_TIMEOUT = 60;

	@Autowired
	private SolicitantesDao solicitantesDao;

	@Autowired
	private ContactosDao contactosDao;

	@Autowired
	private DispositivosSolDao dispositivosSolDao;

	@Autowired
	private DispositivosDao dispositivosDao;

	@Autowired
	private DispValoracionesDao dispValoracionesDao;

	@Autowired
	private ValoracionesService valoracionesService;

	@Autowired
	private EmergenciasDao emergenciasDao;

	@Autowired
	private TerminalesDao terminalesDao;

	@Autowired
	private AvisosDao avisosDao;

	@Autowired
	private InformesDao informesDao;

	@Autowired
	private ValoracionesDao valoracionesDao;

	@Autowired
	private SoporteService soporteService;

	@Autowired
	private RiesgosService riesgosService;

	@Autowired
	private RecMovilEmerDao recMovilEmerDao;

	@Autowired
	private IntervencionesDao intervencionesDao;

	@Autowired
	private ProtocolosDao protocolosDao;

	@Autowired
	private AlarmasDao alarmasDao;

	@Autowired
	private ValidacionesPrestador validacionesPrestador;

	@Autowired
	private MovimientosDispositivosDao movimientosDispositivosDao;

	@Autowired
	private InstalacionesDao instalacionesDao;

	@Autowired
	private NotasSolicitanteDao notasSolicitanteDao;

	@Autowired
	private LlamadasDao llamadasDao;

	@Autowired
	private MaestroSubtpoLlamadaDao maestroSubtpoLlamadaDao;

	@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED, rollbackFor = Throwable.class, timeout = ProcesarPrestador.TRANSACTION_TIMEOUT)
	public Respuesta proccesComunication(Comunicacion comunicacion) throws Throwable {
		ProcesarPrestador.logger.info("ProcesarPrestador.proccesComunication - Inicio");
		Respuesta result = null;

		String accion = comunicacion.getCabecera().getTipoComunicacion().value();

		/*
		 * Generan aviso: BAJA_BENEFICIARIO QUEJAS_RECLAMACIONES
		 */

		if (accion.equalsIgnoreCase(AccionesTelevidaEnum.ALTA.getLabelDesc())) {
			result = this.proccesAltaInstalacion(comunicacion);
		} else if (accion.equalsIgnoreCase(AccionesTelevidaEnum.UPDATE.getLabelDesc())) {
			result = this.proccesUpdate(comunicacion);
		} else if (accion.equalsIgnoreCase(AccionesTelevidaEnum.BAJA_BENEFICIARIO.getLabelDesc())) {
			result = this.proccesBajaBeneficiario(comunicacion);
		} else if (accion.equalsIgnoreCase(AccionesTelevidaEnum.BAJA_INSTALACION.getLabelDesc())) {
			result = this.proccesBajaInstalacion(comunicacion);
		} else if (accion.equalsIgnoreCase(AccionesTelevidaEnum.PRESTACION.getLabelDesc())) {
			result = this.proccesPrestacion(comunicacion);
		} else if (accion.equalsIgnoreCase(AccionesTelevidaEnum.QUEJAS_RECLAMACIONES.getLabelDesc())) {
			result = this.proccesQuejas(comunicacion);
		} else if (accion.equalsIgnoreCase(AccionesTelevidaEnum.VALORACION.getLabelDesc())) {
			result = this.proccesValoracion(comunicacion);
		} else if (accion.equalsIgnoreCase(AccionesTelevidaEnum.CAMBIO_DOMICILIO.getLabelDesc())) {
			result = this.proccesCambioDomicilio(comunicacion);
		} else {
			result = RespuestasTelevidaEnum.ERROR_GENERICO.getRespuesta();
			ManagerErrors.manageError("Accion no existente - accion: " + accion);
		}

		ProcesarPrestador.logger.info("ProcesarPrestador.proccesComunication - Fin");
		return result;
	}

	private Respuesta proccesAltaInstalacion(Comunicacion comunicacion) throws Throwable {
		ProcesarPrestador.logger.info("ProcesarPrestador.proccesAltaInstalacion - Inicio");
		Respuesta respuesta = this.validacionesPrestador.validarProccesAltaInst(comunicacion);

		if (respuesta.getCodRespuesta().equalsIgnoreCase(RespuestasTelevidaEnum.OK.getCodRespuesta())) {
			// recuperamos beneficiario
			Solicitantes solicitante = recuperarBeneficiario(comunicacion.getCabecera().getNumAbonado());

			if (null == solicitante) {
				return RespuestasTelevidaEnum.BENEFICIARIO_NO_EXISTE.getRespuesta();
			}
			// Actualizar los datos del beneficiario (AD74A01T00):
			// marcamos si la instalacion esta instalada en el beneficiarioy la fecha de
			// inicio en el beneficario solo si es la primera
			if (solicitante.getfInicio01() == null) {
				solicitante.setInstalado01(Constantes.UNO);
				solicitante.setUsuModif01(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
//				solicitante.setfInicio01(UtilidadesFecha.parsearFechaTelevida(
//						comunicacion.getDatosAltaInstalacion().getDatosInstalacion().getFInstalacion()));
				solicitante.setfInicio01(UtilidadesFecha.formatearStringToDateFormato(
						comunicacion.getDatosAltaInstalacion().getDatosInstalacion().getFInstalacion(),
						Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT));

				this.solicitantesDao.updateAltaInstalacionPS(solicitante);
			}

			// Insertar los datos de la nueva instalación en la tabla de instalaciones y el
			// resto de instalaciones pasarlas a histórico
			Instalaciones instalacionFilter = new Instalaciones();
			instalacionFilter.setIdSolicitante52(solicitante.getIdSolicitante01());
			List<Instalaciones> listaInstalaciones = this.instalacionesDao.findAll(instalacionFilter, null);
			for (Instalaciones instalacion : listaInstalaciones) {
				if (instalacion.getfHistorico52() == null) {
					instalacion.setUsuHistorico52(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
					this.instalacionesDao.updateHistorico(instalacion);
				}
			}

			Instalaciones instalacion = new Instalaciones();
			instalacion.setUsuAlta52(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
			instalacion.setIdSolicitante52(solicitante.getIdSolicitante01());
			instalacion.setMotivInstFueraPlazo52(
					comunicacion.getDatosAltaInstalacion().getDatosInstalacion().getMotInstFueraPlazo());
//			instalacion.setfInstalacion52(UtilidadesFecha.parsearFechaTelevida(
//					comunicacion.getDatosAltaInstalacion().getDatosInstalacion().getFInstalacion()));
			instalacion.setfInstalacion52(UtilidadesFecha.formatearStringToDateFormato(
					comunicacion.getDatosAltaInstalacion().getDatosInstalacion().getFInstalacion(),
					Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT));
			this.instalacionesDao.add(instalacion);

			// En FASE I del intercambio con PS no se reciben datos de terminales ni
			// dispositivos
			// Se comenta todo lo relacionado co nellos
//			// Damos de baja todos los dispositivos y terminales instalados actualmente
//			List<DispositivosSol> listaInstalados = getDispositivosBeneficiario(solicitante.getIdSolicitante01());
//			for (DispositivosSol dispositivo : listaInstalados) {
//				if (dispositivo.getfBaja23() == null) {
//					dispositivo.setUsuBaja23(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
//					dispositivo.setfBaja23(new java.util.Date());
//					this.dispositivosSolDao.updateBajaDispositivo(dispositivo);
//				}
//			}

//			// Insertar el nuevo terminal y crear un movimiento de alta asociado
//			DispositivosSol terminal = new DispositivosSol();
//			terminal.setUsuAlta23(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
////			terminal.setfInstalacion23(UtilidadesFecha.parsearFechaTelevida(
////					comunicacion.getDatosAltaInstalacion().getDatosInstalacion().getFInstalacion()));
//			terminal.setfInstalacion23(UtilidadesFecha.formatearStringToDateFormato(
//					comunicacion.getDatosAltaInstalacion().getDatosInstalacion().getFInstalacion(),
//					Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT));
//			terminal.setIdSolicitante23(solicitante.getIdSolicitante01());
//			terminal.setIdTerminal23(
//					Long.valueOf(comunicacion.getDatosAltaInstalacion().getDatosInstalacion().getTipoTerminal()));
//			this.dispositivosSolDao.add(terminal);
//
//			MovimientosDispositivos movimientoTerminal = new MovimientosDispositivos();
//			movimientoTerminal.setIdTerminal94(terminal.getIdTerminal23());
////			movimientoTerminal.setFecMovimiento94(UtilidadesFecha.parsearFechaTelevida(
////					comunicacion.getDatosAltaInstalacion().getDatosInstalacion().getFInstalacion()));
//			movimientoTerminal.setFecMovimiento94(UtilidadesFecha.formatearStringToDateFormato(
//					comunicacion.getDatosAltaInstalacion().getDatosInstalacion().getFInstalacion(),
//					Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT));
////			movimientoTerminal.setFecAlta94(UtilidadesFecha.parsearFechaTelevida(
////					comunicacion.getDatosAltaInstalacion().getDatosInstalacion().getFInstalacion()));
//			movimientoTerminal.setFecAlta94(UtilidadesFecha.formatearStringToDateFormato(
//					comunicacion.getDatosAltaInstalacion().getDatosInstalacion().getFInstalacion(),
//					Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT));
//			movimientoTerminal.setUsuAlta94(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
//			movimientoTerminal.setTipoMovimiento94(Integer.valueOf(TipoMovimientoDispositivoEnum.ALTA.getId()));
//			movimientoTerminal.setIdSolicitante94(solicitante.getIdSolicitante01());
//			this.movimientosDispositivosDao.add(movimientoTerminal);

//			// Insertamos los dispositivos nuevos y creamos un movimiento de alta asociado a
//			// cada uno
//			List<DispositivosSol> listDispositivos = ModelApplicationParser.getDispositivosInstAlta(
//					comunicacion.getDatosAltaInstalacion().getDatosInstalacion(), solicitante.getIdSolicitante01());
//			for (DispositivosSol dispositivo : listDispositivos) {
//				dispositivo.setUsuAlta23(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
////				dispositivo.setfInstalacion23(UtilidadesFecha.parsearFechaTelevida(
////						comunicacion.getDatosAltaInstalacion().getDatosInstalacion().getFInstalacion()));
//				dispositivo.setfInstalacion23(UtilidadesFecha.formatearStringToDateFormato(
//						comunicacion.getDatosAltaInstalacion().getDatosInstalacion().getFInstalacion(),
//						Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT));
//				dispositivo.setIdSolicitante23(solicitante.getIdSolicitante01());
//				dispositivosSolDao.add(dispositivo);
//
//				MovimientosDispositivos movimientoDisp = new MovimientosDispositivos();
//				movimientoDisp.setIdDispositivo94(dispositivo.getIdDispositivo23());
////				movimientoDisp.setFecMovimiento94(UtilidadesFecha.parsearFechaTelevida(
////						comunicacion.getDatosAltaInstalacion().getDatosInstalacion().getFInstalacion()));
////				movimientoDisp.setFecAlta94(UtilidadesFecha.parsearFechaTelevida(
////						comunicacion.getDatosAltaInstalacion().getDatosInstalacion().getFInstalacion()));
//				movimientoDisp.setFecMovimiento94(UtilidadesFecha.formatearStringToDateFormato(
//						comunicacion.getDatosAltaInstalacion().getDatosInstalacion().getFInstalacion(),
//						Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT));
//				movimientoDisp.setFecAlta94(UtilidadesFecha.formatearStringToDateFormato(
//						comunicacion.getDatosAltaInstalacion().getDatosInstalacion().getFInstalacion(),
//						Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT));
//				movimientoDisp.setUsuAlta94(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
//				movimientoDisp.setTipoMovimiento94(Integer.valueOf(TipoMovimientoDispositivoEnum.ALTA.getId()));
//				movimientoDisp.setIdSolicitante94(solicitante.getIdSolicitante01());
//				this.movimientosDispositivosDao.add(movimientoDisp);
//		}

		}

		ProcesarPrestador.logger.info("ProcesarPrestador.proccesAltaInstalacion - Fin");
		return respuesta;

	}

	private DispositivosSol getDispositivoExist(List<DispositivosSol> listaInstalados, DispositivosSol disNuevo) {

		for (DispositivosSol dInstalado : listaInstalados) {
			if (null != disNuevo.getIdDispositivo23() && null != dInstalado.getIdDispositivo23()
					&& disNuevo.getIdDispositivo23().equals(dInstalado.getIdDispositivo23())) {
				return dInstalado;
			} else if (null != disNuevo.getIdTerminal23() && null != dInstalado.getIdTerminal23()
					&& disNuevo.getIdTerminal23().equals(dInstalado.getIdTerminal23())) {
				return dInstalado;
			}
		}
		return null;
	}

	/**
	 * Obtiene la lista de dispositivos y terminales del beneficiario que no está
	 * ndados de baja
	 * 
	 * @param idSolicitante
	 * @return
	 */
	private List<DispositivosSol> getDispositivosBeneficiario(Long idSolicitante) {
		DispositivosSol disFind = new DispositivosSol();
		disFind.setIdSolicitante23(idSolicitante);
		disFind.setSoloAlta(true);
		List<DispositivosSol> listaDispositivos = this.dispositivosSolDao.findAll(disFind, null);
		List<DispositivosSol> listaTerminales = this.dispositivosSolDao.findTerminal(disFind, null);
		if (!listaTerminales.isEmpty()) {
			listaDispositivos.addAll(listaTerminales);
		}

		return listaDispositivos;
	}

	private Respuesta validarProccesCambioDomicilio(Comunicacion comunicacion) throws Throwable {
//			motInstFueraPlazo: 1, 2, 3, 4, 5, 6 ó 7
//			tipoTerminal: obligatorio. 1, 2, 3, 4 ó 5 (contra maestro AD74A34T00)
//			dispositivosList:
//		o	cada valor: 1, 2, 3, 4, 5, 6, 7 ó 8 (contra maestro AD74A35T00)
//			idiomaPrestacionServicio: obligatorio. 0 ó 1
//			controlar formato fecha

		ProcesarPrestador.logger.info("ProcesarPrestador.validarProccesAltaInst - Inicio");
		Respuesta respuesta = RespuestasTelevidaEnum.OK.getRespuesta();
		// validamos la fecha de instalacion
		try {
//			UtilidadesFecha.parsearFechaTelevida(
//					comunicacion.getDatosCambioDomicilio().getDatosInstalacion().getFInstalacion());
			UtilidadesFecha.formatearStringToDateFormato(
					comunicacion.getDatosCambioDomicilio().getDatosInstalacion().getFInstalacion(),
					Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT);
		} catch (Exception e) {
			respuesta = RespuestasTelevidaEnum.FECHA_ALTA_INSTALACION_INCORRECTA.getRespuesta();
			return respuesta;
		}

		// motInstFueraPlazo
		if (!Utilidades.validarRango(Constantes.UNO, Constantes.SIETE,
				comunicacion.getDatosCambioDomicilio().getDatosInstalacion().getMotInstFueraPlazo())) {
			respuesta = RespuestasTelevidaEnum.MOTIVO_RETRASO_VALORACION_INCORRECTO.getRespuesta();
			return respuesta;
		}
		// Terminal contra maestro AD74A34T00
		// En FASE I del intercambio con PS este dato no se recibirá.
		// Comentamos su validación al procesar
//		if (null != comunicacion.getDatosCambioDomicilio().getDatosInstalacion()) {
//			Integer terminal = comunicacion.getDatosCambioDomicilio().getDatosInstalacion().getTipoTerminal();
//			Terminales terminales = this.terminalesDao.find(new Terminales(terminal.longValue()));
//			if (null == terminales || null == terminales.getIdTerminal34()) {
//				respuesta = RespuestasTelevidaEnum.TERMINAL_INCORRECTO.getRespuesta();
//				return respuesta;
//			}
//		}

		// Dispositivos
		// En FASE I del intercambio con PS este dato no se recibirá.
		// Comentamos su validación al procesar
//		if (comunicacion.getDatosCambioDomicilio() != null
//				&& comunicacion.getDatosCambioDomicilio().getDatosInstalacion().getDispositivosList() != null) {
//			DispositivosList dispList = comunicacion.getDatosCambioDomicilio().getDatosInstalacion()
//					.getDispositivosList();
//			for (Integer idDisp : dispList.getDispositivo()) {
//				Dispositivos dispositivos = this.dispositivosDao.find(new Dispositivos(idDisp.longValue()));
//				if (null == dispositivos || null == dispositivos.getIdDispositivo35()) {
//					respuesta = RespuestasTelevidaEnum.DISPOSITIVO_INCORRECTO.getRespuesta();
//					return respuesta;
//				}
//			}
//		}

		ProcesarPrestador.logger.info("ProcesarPrestador.validarProccesAltaInst - Fin");
		return respuesta;
	}

	private Respuesta proccesUpdate(Comunicacion comunicacion) throws Throwable {
		ProcesarPrestador.logger.info("ProcesarPrestador.proccesUpdate - Inicio");

		Respuesta respuesta = RespuestasTelevidaEnum.OK.getRespuesta();

		Solicitantes solicitante = recuperarBeneficiario(comunicacion.getCabecera().getNumAbonado());
		if (null == solicitante) {
			return RespuestasTelevidaEnum.BENEFICIARIO_NO_EXISTE.getRespuesta();
		}

		// datosBenedficiario
		// En FASE I del intercambio con PS este dato no se recibirá.
		// De momento actualizamos con los calores que ya tiene
//		solicitante.setTipoBeneficiario01(
//				comunicacion.getDatosModificacion().getDatosBeneficiario().getTipoBeneficiario());
//		solicitante.setIdiomaServicio01(
//				comunicacion.getDatosModificacion().getDatosBeneficiario().getIdiomaPrestServicio());
		if (comunicacion.getDatosModificacion().getDatosBeneficiario() != null) {
			solicitante.setTipoBeneficiario01(solicitante.getTipoBeneficiario01());
			solicitante.setIdiomaServicio01(solicitante.getIdiomaServicio01());

			solicitante.setTlfnoServicio01(
					comunicacion.getDatosModificacion().getDatosBeneficiario().getTelefonoServicio());
			solicitante.setTlfnoMovil01(comunicacion.getDatosModificacion().getDatosBeneficiario().getMovil());
			solicitante.setEmail01(comunicacion.getDatosModificacion().getDatosBeneficiario().getEmail());
			solicitante.setUsuModif01(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
			this.solicitantesDao.updateFromWSUpdate(solicitante);
		}

		// datos de contactos
		if (comunicacion.getDatosModificacion().getContactosList() != null) {
			// Pasamos a histórico los que no lo estén todavía
			Contactos contactoFilter = new Contactos();
			contactoFilter.setIdSolicitante03(solicitante.getIdSolicitante01());
			List<Contactos> listContactosSol = contactosDao.findAll(contactoFilter, null);
			for (Contactos contacto : listContactosSol) {
				contacto.setUsuHistorico03(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
				contactosDao.pasarHistorico(contacto);
			}

			// Añadimos los contactos nuevos
			int cont = 1;
			for (ContactoType contacto : comunicacion.getDatosModificacion().getContactosList().getContacto()) {

				Contactos newContacto = ModelApplicationParser.getContactoUpdate(contacto,
						solicitante.getIdSolicitante01());
				newContacto.setOrden03(cont);
				contactosDao.add(newContacto);
				cont++;
			}
		}

		ProcesarPrestador.logger.info("ProcesarPrestador.proccesUpdate - Fin ");
		return respuesta;
	}

	private Respuesta proccesBajaInstalacion(Comunicacion comunicacion) throws Throwable {
		ProcesarPrestador.logger.info("ProcesarPrestador.proccesBajaInstalacion - Inicio");

		Respuesta respuesta = RespuestasTelevidaEnum.OK.getRespuesta();

		Solicitantes solicitante = recuperarBeneficiario(comunicacion.getCabecera().getNumAbonado());
		if (null == solicitante) {
			return RespuestasTelevidaEnum.BENEFICIARIO_NO_EXISTE.getRespuesta();
		}

//		solicitante.setfRetirada01(
//				UtilidadesFecha.parsearFechaTelevida(comunicacion.getDatosBajaInstalacion().getFBajaInstalacion()));
		solicitante.setfRetirada01(UtilidadesFecha.formatearStringToDateFormato(
				comunicacion.getDatosBajaInstalacion().getFBajaInstalacion(),
				Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT));
		this.solicitantesDao.updateFromWSBajaInstalacion(solicitante);

		// Damos de baja todos los dispositivos y terminales instalados actualmente
		List<DispositivosSol> listaInstalados = getDispositivosBeneficiario(solicitante.getIdSolicitante01());
		for (DispositivosSol dispositivo : listaInstalados) {
			if (dispositivo.getfBaja23() == null) {
				dispositivo.setUsuBaja23(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
//				dispositivo.setfBaja23(UtilidadesFecha
//						.parsearFechaTelevida(comunicacion.getDatosBajaInstalacion().getFBajaInstalacion()));
				dispositivo.setfBaja23(UtilidadesFecha.formatearStringToDateFormato(
						comunicacion.getDatosBajaInstalacion().getFBajaInstalacion(),
						Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT));
				this.dispositivosSolDao.updateBajaDispositivo(dispositivo);

				// Creamos un movimiento de baja para los dispositivos
				MovimientosDispositivos movimientoDisp = new MovimientosDispositivos();
				movimientoDisp.setIdDispositivo94(dispositivo.getIdDispositivo23());
				movimientoDisp.setIdTerminal94(dispositivo.getIdTerminal23());
//				movimientoDisp.setFecMovimiento94(UtilidadesFecha
//						.parsearFechaTelevida(comunicacion.getDatosBajaInstalacion().getFBajaInstalacion()));
				movimientoDisp.setFecMovimiento94(UtilidadesFecha.formatearStringToDateFormato(
						comunicacion.getDatosBajaInstalacion().getFBajaInstalacion(),
						Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT));
				movimientoDisp.setUsuAlta94(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
				movimientoDisp.setTipoMovimiento94(Integer.valueOf(TipoMovimientoDispositivoEnum.BAJA.getId()));
				movimientoDisp.setIdSolicitante94(solicitante.getIdSolicitante01());
				this.movimientosDispositivosDao.add(movimientoDisp);
			}
		}

		// Se crea aviso del tipo Actualizacion y subtipo Baja
		// Se comenta pq no está claro si se ha de enviar este aviso (n oestá en el CRU)
//		Avisos aviso = ModelApplicationParser.getAvisoBajaInst(solicitante,
//				comunicacion.getDatosBajaInstalacion().getObservaciones());
//		aviso = this.avisosDao.add(aviso);
//		this.avisosAsyncProcessService.procesarAvisoAutomatico(aviso.getIdAviso20());

		// Se añade una nueva nota al beneficiario con las observaciones
		NotasSolicitante nota = new NotasSolicitante();
		nota.setIdSolicitante53(solicitante.getIdSolicitante01());
		StringBuilder textoSB = new StringBuilder();
		textoSB.append("Baja instalación:\n\r").append(comunicacion.getDatosBajaInstalacion().getObservaciones());
		if (textoSB.length() > 1750) {
			nota.setTxtNota53(textoSB.substring(0, 1750));
		} else {
			nota.setTxtNota53(textoSB.toString());
		}
		nota.setUsuAlta53(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
//		nota.setFecAlta53(
//				UtilidadesFecha.parsearFechaTelevida(comunicacion.getDatosBajaInstalacion().getFBajaInstalacion()));
		nota.setFecAlta53(UtilidadesFecha.formatearStringToDateFormato(
				comunicacion.getDatosBajaInstalacion().getFBajaInstalacion(),
				Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT));
		this.notasSolicitanteDao.add(nota);

		ProcesarPrestador.logger.info("ProcesarPrestador.proccesBajaInstalacion - Fin");
		return respuesta;
	}

	private Respuesta proccesPrestacion(Comunicacion comunicacion) throws Throwable {
		ProcesarPrestador.logger.info("ProcesarPrestador.proccesPrestacion - Inicio");
		Respuesta respuesta = this.validacionesPrestador.validarProccesPrestacion(comunicacion);

		if (respuesta.getCodRespuesta().equalsIgnoreCase(RespuestasTelevidaEnum.OK.getCodRespuesta())) {
			Solicitantes solicitante = recuperarBeneficiario(comunicacion.getCabecera().getNumAbonado());
			if (null == solicitante) {
				return RespuestasTelevidaEnum.BENEFICIARIO_NO_EXISTE.getRespuesta();
			}

			// En FASE I del intercambio con PS este dato no se recibirá.
			// Comentamos su procesamiento
			// 1.- Revalorizaciones
//			if (comunicacion.getDatosPrestServicio().getRevalorizacionesList() != null) {
//				for (ValoracionType revalorizacion : comunicacion.getDatosPrestServicio().getRevalorizacionesList()
//						.getRevalorizacion()) {
//					this.tratarValoracion(revalorizacion, null, solicitante, false);
//				}
//			}

			// 2.- Emergencias
			if (comunicacion.getDatosPrestServicio().getEmergenciasList() != null) {
				for (EmergenciaType emergencias : comunicacion.getDatosPrestServicio().getEmergenciasList()
						.getEmergencia()) {
					Emergencias emergencia = new Emergencias();
					emergencia.setSolicitante(solicitante);
					MaestroEmergencias maestroEmergencias = new MaestroEmergencias();

					maestroEmergencias.setIdTipoEmergencia46(emergencias.getTipoEmergencia().longValue());
//					maestroEmergencias.setIdTipoEmergencia46(Long.valueOf(Constantes.SIETE));
					emergencia.setMaestroEmergencias(maestroEmergencias);

					emergencia.setfEmergencia27(UtilidadesFecha.formatearStringToDateFormato(
							emergencias.getFEmergencia(), Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT));
//					Calendar today = Calendar.getInstance();
//					today.add(Calendar.DATE, -1);
//					emergencia.setfEmergencia27(today.getTime());

					emergencia.setSolicitante(solicitante);
					emergencia.setUsuAlta27(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
					emergencia.setfAlta27(UtilidadesFecha.getFechaSistema());
					Emergencias nuevaEmergencia = emergenciasDao.add(emergencia);
					// con el id de la creacion RecursoMovilizado insertar en la tabla AD74A28T00:
					RecursosMovilizadosList recursosMovilizadosList = emergencias.getRecursosMovilizadosList();
					if (recursosMovilizadosList != null) {
						for (RecursosMovilizadosType recursosMovilizados : recursosMovilizadosList
								.getRecursosMovilizados()) {
							RecMovilEmer recMovilEmer = new RecMovilEmer();
							recMovilEmer.setEmergencias(nuevaEmergencia);
							recMovilEmer.setRecursoMovilizado28(recursosMovilizados.getTiposRecursoMovilizados());
							// TODO hay que cambiar el tipo en la bbdd a HH:mm:ss
							// recMovilEmer.setTiempoLlegada28(Long.valueOf(recursosMovilizados.getTiempoLlegada().toString()));
							if (recursosMovilizados.getTiempoLlegada() != null) {
								try {
									DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
									String tiempoLlegada = recursosMovilizados.getTiempoLlegada().toString();
									LocalTime localTime = LocalTime.parse(tiempoLlegada, formatter);
									Time time = Time.valueOf(localTime);
									recMovilEmer.setTiempoLlegada28(time);
								} catch (Exception e) {

								}
							}
							recMovilEmer.setUsuAlta28(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
							recMovilEmer.setfAlta28(UtilidadesFecha.getFechaSistema());
							recMovilEmerDao.add(recMovilEmer);
						}
					}
				}
			}

			// 3.- Alarmas
			if (comunicacion.getDatosPrestServicio().getAlarmasList() != null) {
				this.tratarAlarmas(comunicacion.getDatosPrestServicio().getAlarmasList().getAlarma(), solicitante);
			}

			// 4.- Intervenciones
			if (comunicacion.getDatosPrestServicio().getIntervencionesList() != null) {
				for (IntervencionType intervenciones : comunicacion.getDatosPrestServicio().getIntervencionesList()
						.getIntervencion()) {
					Intervenciones intervencion = new Intervenciones();
					intervencion.setSolicitantes(solicitante);
					intervencion.setIdTipoIntervencion25(Long.valueOf(intervenciones.getTipoIntervencion()));
//					intervencion.setfIntervencion25(
//							UtilidadesFecha.parsearFechaTelevida(intervenciones.getFIntervencion()));
					intervencion.setfIntervencion25(UtilidadesFecha.formatearStringToDateFormato(
							intervenciones.getFIntervencion(), Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT));
					intervencion.setPendiente25(Constantes.CERO); // No llega desde WS. Es necesario este dato
																	// ahora?
					intervencion.setBaja25(Constantes.CERO); // No llega desde WS. Es necesario este dato ahora?
					intervencion.setUsuAlta25(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
					intervencion.setfAlta25(UtilidadesFecha.getFechaSistema());
					intervencionesDao.add(intervencion);
				}
			}

			// En FASE I del intercambio con PS este dato no se recibirá.
			// Comentamos su procesamiento
			// 5.- Protocolos
			if (comunicacion.getDatosPrestServicio().getProtocolosList() != null) {
				for (ProtocoloType protocolos : comunicacion.getDatosPrestServicio().getProtocolosList()
						.getProtocolo()) {
					Protocolos protocolo = new Protocolos();
					protocolo.setIdTipoProtocolo26(protocolos.getTipoProtocolo());
					protocolo.setSolicitante(solicitante);
//					protocolo.setfEntrada26(UtilidadesFecha.parsearFechaTelevida(protocolos.getFEntrada()));
//					protocolo.setfSalida26(UtilidadesFecha.parsearFechaTelevida(protocolos.getFSalida()));
					protocolo.setfEntrada26(UtilidadesFecha.formatearStringToDateFormato(protocolos.getFEntrada(),
							Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT));
					protocolo.setfSalida26(UtilidadesFecha.formatearStringToDateFormato(protocolos.getFSalida(),
							Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT));
					protocolo.setUsuAlta26(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
					protocolo.setfAlta26(UtilidadesFecha.getFechaSistema());
					protocolosDao.add(protocolo);
				}
			}
		}

		// TODO: faltan el procesar la lista de dispositivos

		ProcesarPrestador.logger.info("ProcesarPrestador.proccesPrestacion - Fin");
		return respuesta;
	}

	private void tratarAlarmas(List<AlarmaType> alarmasList, Solicitantes solicitante) {

		for (AlarmaType alarma : alarmasList) {

			Alarmas newAlarma = new Alarmas();
			MaestroTipoAlarma tipoAlarma = new MaestroTipoAlarma();
			tipoAlarma.setIdTipoAlarma48(Long.valueOf(alarma.getTipoAlarma().getTipoAlarma()));
			newAlarma.setMaestroTipoAlarma(tipoAlarma);

//			newAlarma.setfAlarma24(UtilidadesFecha.parsearFechaTelevida(alarma.getFecha()));
			try {
				newAlarma.setfAlarma24(UtilidadesFecha.formatearStringToDateFormato(alarma.getFecha(),
						Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT));
			} catch (ParseException e) {
			}
			newAlarma.setIdSolicitante24(solicitante.getIdSolicitante01());
			newAlarma.setUsuAlta24(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
			newAlarma.setFAlta24(UtilidadesFecha.getFechaSistema());

			// tipo 3: seguridad
			if (Constantes.TRES == alarma.getTipoAlarma().getTipoAlarma()) {
				// Estos datos no nos los informan en Fase I así que no lo tratamos
//				newAlarma.setIdDispositivo24(Long.valueOf(alarma.getTipoAlarma().getTipoDispositivoSeguridad()));
			}

			// tipo 1: funcional
			if (Constantes.UNO == alarma.getTipoAlarma().getTipoAlarma()) {
				// Estos datos no nos los informan en Fase I así que no lo tratamos
//				newAlarma.setIdDispositivo24(Long.valueOf(alarma.getTipoAlarma().getTipoDispositivoFuncional()));
			}

			// tipo 2: llamada
			// Estos datos no nos los informan en Fase I así que no lo tratamos
			if (Constantes.DOS == alarma.getTipoAlarma().getTipoAlarma()) {

				Llamadas llamada = new Llamadas();
//
//				if (alarma.getTipoAlarma().getLlamada().getDuracion() >= 0) {
//					llamada.setDuracion29(Long.valueOf(alarma.getTipoAlarma().getLlamada().getDuracion()));
//				}
//				if (alarma.getTipoAlarma().getLlamada().getTiempoRespuesta() >= 0) {
//					llamada.setTiempoRespuesta29(
//							Long.valueOf(alarma.getTipoAlarma().getLlamada().getTiempoRespuesta()));
//				}
//				if (alarma.getTipoAlarma().getLlamada().getIdLlamada() != null) {
//					llamada.setIdLlamadaPs29(Long.valueOf(alarma.getTipoAlarma().getLlamada().getIdLlamada()));
//				}
//				if (alarma.getTipoAlarma().getLlamada().getRespuesta() >= 0) {
//					llamada.setRespuesta29(alarma.getTipoAlarma().getLlamada().getRespuesta());
//				}
//
//				if (alarma.getTiposResolAlarma() >= 0) {
//					newAlarma.setIdTipoResol24(alarma.getTiposResolAlarma());
//				}
//
//				// Llamadas emitidas
//				if (alarma.getTipoAlarma().getLlamada().getLlamadasEmitidas() != null) {
//
//					MaestroTipoLlamada maestroTipoLlamada = new MaestroTipoLlamada(Long.valueOf(Constantes.CUATRO));
//					MaestroSubtpoLlamada maestroSubTipoLlamada = new MaestroSubtpoLlamada();
//					maestroSubTipoLlamada.setIdSubtipoLlamada56(
//							Long.valueOf(alarma.getTipoAlarma().getLlamada().getLlamadasEmitidas()));
//					maestroSubTipoLlamada.setMaestroTipoLlamada(maestroTipoLlamada);
//					llamada.setMaestroTipoLlamada(maestroTipoLlamada);
//					llamada.setMaestroSubtpoLlamada(maestroSubTipoLlamada);
//					llamada.setSentido29(Integer.valueOf(SentidoEnum.EMITIDA.getId()));
//				}
//
//				// Llamadas recibidas
//				if (alarma.getTipoAlarma().getLlamada().getLlamadasRecibidas() != null) {
//
//					LlamadasRecibidasType llamadasRecibidas = alarma.getTipoAlarma().getLlamada()
//							.getLlamadasRecibidas();
//
//					MaestroTipoLlamada maestroTipoLlamada = new MaestroTipoLlamada(
//							Long.valueOf(llamadasRecibidas.getTipoLlamadaRecibida()));
//					MaestroSubtpoLlamada maestroSubTipoLlamada = new MaestroSubtpoLlamada();
//					maestroSubTipoLlamada
//							.setIdSubtipoLlamada56(Long.valueOf(llamadasRecibidas.getSubTipoLlamadaRecibida()));
//					maestroSubTipoLlamada.setMaestroTipoLlamada(maestroTipoLlamada);
//					llamada.setMaestroTipoLlamada(maestroTipoLlamada);
//					llamada.setMaestroSubtpoLlamada(maestroSubTipoLlamada);
//					llamada.setSentido29(Integer.valueOf(SentidoEnum.RECIBIDA.getId()));
//				}

				// Por defecto ponemos "Sin especificar"
				MaestroTipoLlamada maestroTipoLlamada = new MaestroTipoLlamada(Long.valueOf(Constantes.CINCO));
				MaestroSubtpoLlamada maestroSubTipoLlamada = new MaestroSubtpoLlamada();
				List<MaestroSubtpoLlamada> maestroSubTipoLlamadaList = this.maestroSubtpoLlamadaDao
						.findAllLike(maestroSubTipoLlamada, null, false);
				if (!maestroSubTipoLlamadaList.isEmpty()) {
					maestroSubTipoLlamada
							.setIdSubtipoLlamada56(maestroSubTipoLlamadaList.get(0).getIdSubtipoLlamada56());
				}

				maestroSubTipoLlamada.setMaestroTipoLlamada(maestroTipoLlamada);
				llamada.setMaestroTipoLlamada(maestroTipoLlamada);
				llamada.setMaestroSubtpoLlamada(maestroSubTipoLlamada);

				// Mirar que pasa si ponemos nullable en BBDD
				// llamada.setSentido29(Integer.valueOf(SentidoEnum.EMITIDA.getId()));

				llamada.setUsuAlta29(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
				llamada.setfAlta29(UtilidadesFecha.getFechaSistema());
				llamada = this.llamadasDao.add(llamada);

				newAlarma.setLlamadas(llamada);
			}

			this.alarmasDao.add(newAlarma);

		}
	}

	private Respuesta proccesQuejas(Comunicacion comunicacion) throws Throwable {
		ProcesarPrestador.logger.info("ProcesarPrestador.proccesQuejas - Inicio");

		Respuesta respuesta = RespuestasTelevidaEnum.OK.getRespuesta();

		Solicitantes solicitante = recuperarBeneficiario(comunicacion.getCabecera().getNumAbonado());
		if (null == solicitante) {
			return RespuestasTelevidaEnum.BENEFICIARIO_NO_EXISTE.getRespuesta();
		}

		AvisosQueja avisosQueja = new AvisosQueja();
		avisosQueja.setEstadoQueja(comunicacion.getDatosQuejasReclamaciones().getEstado());
		avisosQueja.setFechaQueja(
				UtilidadesFecha.parsearFechaPlatea(comunicacion.getDatosQuejasReclamaciones().getFQuejaReclamacion()));
		avisosQueja.setProcedente(comunicacion.getDatosQuejasReclamaciones().getProcedente());
		avisosQueja.setTiempoResolucion(
				Integer.valueOf(comunicacion.getDatosQuejasReclamaciones().getTiempoResolucion().toString()));
		avisosQueja.setMotivoQueja(comunicacion.getDatosQuejasReclamaciones().getMotivosQuejasReclama());

		Avisos aviso = new Avisos();

		MaestroActores origen = new MaestroActores();
		origen.setIdActor42(Long.valueOf(OrigenAvisosEnum.PS.getId()));
		aviso.setMaestroActoresByOrigen20(origen);

		MaestroActores destino = new MaestroActores();
		destino.setIdActor42(Long.valueOf(OrigenAvisosEnum.DSS.getId()));
		aviso.setMaestroActoresByDestino20(destino);

		MaestroTiposAviso tipoAviso = new MaestroTiposAviso();
		tipoAviso.setIdTipoAviso40(TipoAvisoEnum.QUEJREC.getIdLongValue());
		aviso.setMaestroTiposAviso(tipoAviso);

		MaestroSubtiposAviso subtipoAviso = new MaestroSubtiposAviso();
		Long motivoQueja = Long.valueOf(comunicacion.getDatosQuejasReclamaciones().getMotivosQuejasReclama());
		if (MotivosQuejasReclamaEnum.TECNOLOGIADEFECTUOSA.getIdLongValue().compareTo(motivoQueja) == 0) {
			subtipoAviso.setIdSubTipoAviso41(SubTipoAvisoEnum.INSTALPS.getIdLongValue());
		} else if (MotivosQuejasReclamaEnum.OTROS.getIdLongValue().compareTo(motivoQueja) == 0) {
			subtipoAviso.setIdSubTipoAviso41(SubTipoAvisoEnum.OTRASQUEJPS.getIdLongValue());
		} else {
			subtipoAviso.setIdSubTipoAviso41(SubTipoAvisoEnum.SERVPS.getIdLongValue());
		}
		aviso.setMaestroSubtiposAviso(subtipoAviso);

		aviso.setIdSolicitante20(solicitante.getIdSolicitante01());
		aviso.setObservaciones20(comunicacion.getDatosQuejasReclamaciones().getObservaciones());
		aviso.setUsuAlta20(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
		aviso.setAvisosQueja(avisosQueja);
		this.avisosDao.add(aviso);

		ProcesarPrestador.logger.info("ProcesarPrestador.proccesQuejas - Fin");
		return respuesta;
	}

	private Respuesta proccesValoracion(Comunicacion comunicacion) throws Throwable {
		ProcesarPrestador.logger.info("ProcesarPrestador.proccesValoracion - Inicio");

		Respuesta respuesta = this.validacionesPrestador
				.validarProccesValoracion(comunicacion.getDatosValoracionInicial().getDatosValoracion());

		if (respuesta.getCodRespuesta().equalsIgnoreCase(RespuestasTelevidaEnum.OK.getCodRespuesta())) {
			Solicitantes solicitante = recuperarBeneficiario(comunicacion.getCabecera().getNumAbonado());
			if (null == solicitante) {
				return RespuestasTelevidaEnum.BENEFICIARIO_NO_EXISTE.getRespuesta();
			}

			Map<String, Object> datosBeneficiario = new HashMap<String, Object>();
			datosBeneficiario.put("tipoBeneficiario",
					comunicacion.getDatosValoracionInicial().getDatosBeneficiario().getTipoBeneficiario());
			datosBeneficiario.put("idiomaPrestServicio",
					comunicacion.getDatosValoracionInicial().getDatosBeneficiario().getIdiomaPrestServicio());
			datosBeneficiario.put("movil", comunicacion.getDatosValoracionInicial().getDatosBeneficiario().getMovil());
			datosBeneficiario.put("email", comunicacion.getDatosValoracionInicial().getDatosBeneficiario().getEmail());
			datosBeneficiario.put("telefonoServicio",
					comunicacion.getDatosValoracionInicial().getDatosBeneficiario().getTelefonoServicio());

			this.tratarValoracion(comunicacion.getDatosValoracionInicial().getDatosValoracion(), datosBeneficiario,
					solicitante, true);

		}

		ProcesarPrestador.logger.info("ProcesarPrestador.proccesValoracion - Fin");
		return respuesta;

	}

	private void tratarValoracion(ValoracionType valoracionType, Map<String, Object> datosBeneficiario,
			Solicitantes solicitante, boolean esInicial) {

		// Obtener la última valoración para pasarla a histórico si fuera necesario
		Valoraciones currentValoracion = new Valoraciones();
		currentValoracion.setIdSolicitante08(solicitante.getIdSolicitante01());
		currentValoracion = this.valoracionesService.getSolCurrentValoracion(currentValoracion);

		Soporte currentSoporte = this.soporteService.findActivoBySolicitante(solicitante);
		Riesgos currentRiesgo = this.riesgosService.findActivoBySolicitante(solicitante);

		// subir el documento a PID
		String oidDocumento = putDocumentPid(valoracionType);
		// actualizar oid en valoracion

		// grabamos la valoracion
		Valoraciones valoracion = this.valoracionesService.addNewValoracion(
				ModelApplicationParser.getValoracion(valoracionType, solicitante.getIdSolicitante01(), oidDocumento),
				com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);

		// relacionamos el solicitante con la valoracion
		solicitante.setValoraciones(new Valoraciones(valoracion.getIdValoracion08()));
		this.solicitantesDao.updateValoracion(solicitante);

		// si se identifica que el beneficiario pasa a Alto riesgo de suicidio o
		// maltrato se tiene que crear una aviso para la DSS y un informe de suicidio
		this.crearAvisoValoracionAltoRiesgo(valoracion, solicitante.getIdSolicitante01());

		// Grabamos los dispositivos
		if (valoracionType.getDispositivosPropuestos() != null) {

			List<DispValoraciones> listaDispositivosVal = ModelApplicationParser.getDispositivosValoracion(
					valoracionType.getDispositivosPropuestos().getDispositivoPropuesto(), valoracion);
			// validamos que existen los dispositivos
			for (DispValoraciones dispositivo : listaDispositivosVal) {
				if (null != this.dispositivosDao
						.find(new Dispositivos(dispositivo.getDispositivos().getIdDispositivo35()))) {
					this.dispValoracionesDao.add(dispositivo);
				} else {
					ManagerErrors.manageError("Unos de los dispositivos no existe o no esta tipificado correctamente");
				}
			}
		}
		solicitante.setValoraciones(valoracion);

		// solo en la valoración inicial se establece la fecha de la primera visita
		if (esInicial) {
			solicitante.setfPrimeraVisita01(valoracion.getfValoracion08());
		}

		// idioma solicitante
		if (String.valueOf(Constantes.CERO).equals(valoracionType.getIdiomaSolicitante())
				|| String.valueOf(Constantes.UNO).equals(valoracionType.getIdiomaSolicitante())) {
			solicitante.setIdiomaSolicitante01(Integer.valueOf(valoracionType.getIdiomaSolicitante()));
			solicitante.setIdiomaServicio01(solicitante.getIdiomaSolicitante01());
			solicitante.setOtroIdioma01(null);
		} else {
			solicitante.setIdiomaSolicitante01(Constantes.DOS);
			solicitante.setIdiomaServicio01(solicitante.getIdiomaSolicitante01());
			solicitante.setOtroIdioma01(valoracionType.getIdiomaSolicitante());
		}

		// Datos del beneficiario
		if (datosBeneficiario != null) {
			// obligatorio
			solicitante.setTipoBeneficiario01((int) datosBeneficiario.get("tipoBeneficiario"));

			// idioma prestación servicio
			int idiomaPrestServicio = (int) datosBeneficiario.get("idiomaPrestServicio");
			if (idiomaPrestServicio == Constantes.CERO || idiomaPrestServicio == Constantes.UNO) {
				solicitante.setIdiomaServicio01(Integer.valueOf(idiomaPrestServicio));
			} else if (idiomaPrestServicio != Constantes.CERO || idiomaPrestServicio != Constantes.UNO) {
				solicitante.setIdiomaServicio01(Constantes.DOS);
			}

			// opcionales
			if ((String) datosBeneficiario.get("email") != null) {
				solicitante.setEmail01((String) datosBeneficiario.get("email"));
			}
			if ((String) datosBeneficiario.get("movil") != null) {
				solicitante.setTlfnoMovil01((String) datosBeneficiario.get("movil"));
			}
			if ((String) datosBeneficiario.get("telefonoServicio") != null) {
				solicitante.setTlfnoServicio01((String) datosBeneficiario.get("telefonoServicio"));
			}

			this.solicitantesDao.updateFromValoracion(solicitante);
		}

		// Paso a histórico si es necesario
		// Es una valoración inicial y no debería haber ninguna, pero por si acaso lo
		// aceptamos y pasamos la anterior a histórico
		if (currentValoracion != null) {
			// Pasar la valoración, los riesgos y el soporte a histórico
			// Valoración actual a histórico
			currentValoracion.setUsuHistorico08(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
			currentValoracion = this.valoracionesDao.updateHistorico(currentValoracion);
		}

		// Soporte a histórico
		boolean addSoporte = false;
		if (currentSoporte != null
				&& currentSoporte.getIdNivelSoporte22().compareTo(valoracion.getIdNivelSoporte08()) != 0) {
			currentSoporte.setUsuHistorico22(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
			this.soporteService.updateHistorico(currentSoporte);
			addSoporte = true;
		}

		// Riesgo a histórico
		boolean addRiesgo = false;
		if (currentRiesgo != null && ((currentValoracion.getAltoRiesgo08() != null
				&& currentValoracion.getAltoRiesgo08().compareTo(valoracion.getAltoRiesgo08()) != 0)
				|| (currentValoracion.getNivelMaltrato08() != null
						&& currentValoracion.getNivelMaltrato08().compareTo(valoracion.getNivelMaltrato08()) != 0)
				|| (currentValoracion.getNivelSuicidio08() != null
						&& currentValoracion.getNivelSuicidio08().compareTo(valoracion.getNivelSuicidio08()) != 0))) {
			currentRiesgo.setUsuHistorico21(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
			this.riesgosService.updateHistorico(currentRiesgo);
			addRiesgo = true;
		}

		// Insertar nuevo soporte si:
		// No hay valoraciones o con la nueva valoración cambia el novel de soporte
		if (currentSoporte == null || addSoporte) {
			Soporte newSoporte = new Soporte();
			newSoporte.setIdValoracion22(valoracion.getIdValoracion08());
			newSoporte.setIdSolicitante22(solicitante.getIdSolicitante01());
			newSoporte.setIdNivelSoporte22(valoracion.getIdNivelSoporte08());
			newSoporte.setUsuAlta22(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
			this.soporteService.add(newSoporte);
		}

		// Insertar nuevo riesgo si:
		// No hay valoraciones o con la nueva valoración cambia algú ndato del riesgo
		if (currentRiesgo == null || addRiesgo) {
			Riesgos newRiesgo = new Riesgos();
			newRiesgo.setIdValoracion21(valoracion.getIdValoracion08());
			newRiesgo.setIdSolicitante21(solicitante.getIdSolicitante01());
			newRiesgo.setAltoRiesgo21(valoracion.getAltoRiesgo08());
			newRiesgo.setNivelMaltrato21(valoracion.getNivelMaltrato08());
			newRiesgo.setNivelSuicidio21(valoracion.getNivelSuicidio08());
			newRiesgo.setUsuAlta21(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
			this.riesgosService.add(newRiesgo);
		}

	}

	private void crearAvisoValoracionAltoRiesgo(Valoraciones valoracion, Long idSolicitante) {
		if (null != valoracion.getAltoRiesgo08()
				&& valoracion.getAltoRiesgo08().equals(Constantes.AltoRiesgo.ALTO_RIESGO_SI)) {

			// Buscamos el último riesgo para saber su valor
			Riesgos riesgoFind = new Riesgos();
			riesgoFind.setIdSolicitante21(idSolicitante);
			List<Riesgos> riesgosList = this.riesgosService.findAll(riesgoFind, null);

			for (Riesgos riesgo : riesgosList) {
				if (null == riesgo.getfHistorico21() && riesgo.getAltoRiesgo21() == 0) {
					// generar el informe de suicidio y malos tratos
					Informes informes = new Informes();
					informes.setTipoInforme16(TipoInformesEnum.INFSUM.getId());
					Solicitantes solicitante = new Solicitantes();
					solicitante.setIdSolicitante01(idSolicitante);
					informes.setSolicitantes(solicitante);
					informes.setfAlta16(UtilidadesFecha.getFechaSistema());
					informes.setUsuAlta16(com.ejie.ad74a.constantes.Constantes.USER_PROCESADO_AUTOMATICO);
					informes.setEstado16(EstadoInformesEnum.PENDIENTE_APORTAR.getId());
					informes = this.informesDao.add(informes);

					Avisos aviso = new Avisos();
					aviso.setMaestroTiposAviso(new MaestroTiposAviso(TipoAvisoEnum.OTROS.getIdLongValue()));
					aviso.setMaestroSubtiposAviso(new MaestroSubtiposAviso(SubTipoAvisoEnum.ALTRIES.getIdLongValue()));
					aviso.setIdSolicitante20(idSolicitante);
					aviso.setUrgencia20(Constantes.Urgencia_Avisos.URGENTE);
					aviso.setIdInforme20(informes.getIdInforme16());
					aviso.setMaestroActoresByOrigen20(new MaestroActores(ActoresEnum.PS.getId()));
					aviso.setMaestroActoresByDestino20(new MaestroActores(ActoresEnum.DSS.getId()));
					aviso.setUsuAlta20(com.ejie.ad74a.constantes.Constantes.COD_APLICACION);
					this.avisosDao.add(aviso);
					break;
				}
			}

		}
	}

	private String putDocumentPid(ValoracionType valoracion) {
		String oid = null;
//		if (null != datosValoracion.getDatosValoracion().getContratoActuacion()
//				&& null != datosValoracion.getDatosValoracion().getContratoActuacion().getEnlaceDocumento()) {
//			String enlaceDocumento = datosValoracion.getDatosValoracion().getContratoActuacion().getEnlaceDocumento();
//			String nombreDocumento = UtilTelevida.getNameRutaPif(enlaceDocumento);
//			// copiamos el documento a la zona de pid
//			String pathDestino = com.ejie.ad74a.constantes.Constantes.RUTA_PID.concat(nombreDocumento);
//			try {
//				pathDestino = Ad74aPIFws.getInstance().copyDocument(enlaceDocumento, pathDestino, false);
//			} catch (Ad74aWebserviceException e1) {
//				ManagerErrors.manageError("Error al copiar el documento a la zona PIF de PID");
//			}
//
//			oid = ad74aPIDws.put(com.ejie.ad74a.constantes.Constantes.COD_APLICACION, nombreDocumento, pathDestino,
//					com.ejie.ad74a.constantes.Constantes.COD_APLICACION);
//
//			// borramos el documento de pif
//			try {
//				Ad74aPIFws.getInstance().deleteDocument(enlaceDocumento);
//			} catch (Ad74aWebserviceException e) {
//				ProcesarPrestador.logger.info(
//						"ProcesarPrestador.putDocumentPid - Error al borrar el documento de pif: " + enlaceDocumento);
//			}
//		}
		return oid;
	}

	private Respuesta proccesCambioDomicilio(Comunicacion comunicacion) throws Throwable {
		ProcesarPrestador.logger.info("ProcesarPrestador.proccesCambioDomicilio - Inicio");
		Respuesta respuesta = RespuestasTelevidaEnum.OK.getRespuesta();

		// En FASE I del intercambio con PS este dato no se recibirá.
		// Comentamos su validación al procesar
//		Respuesta respuesta = this.validacionesPrestador
//				.validarProccesValoracion(comunicacion.getDatosCambioDomicilio().getDatosValoracion());

		// datos de la la instalación
		if (respuesta.getCodRespuesta().equalsIgnoreCase(RespuestasTelevidaEnum.OK.getCodRespuesta())) {
			respuesta = this.validacionesPrestador
					.validarProccesCambioDomicilio(comunicacion.getDatosCambioDomicilio().getDatosInstalacion());
		}

		if (respuesta.getCodRespuesta().equalsIgnoreCase(RespuestasTelevidaEnum.OK.getCodRespuesta())) {
			// recuperamos beneficiario
			Solicitantes solicitante = recuperarBeneficiario(comunicacion.getCabecera().getNumAbonado());

			if (null == solicitante) {
				return RespuestasTelevidaEnum.BENEFICIARIO_NO_EXISTE.getRespuesta();
			}

			Map<String, Object> datosBeneficiario = new HashMap<String, Object>();
			if (comunicacion.getDatosCambioDomicilio().getDatosBeneficiario() != null) {
				datosBeneficiario.put("tipoBeneficiario",
						comunicacion.getDatosCambioDomicilio().getDatosBeneficiario().getTipoBeneficiario());
				datosBeneficiario.put("idiomaPrestServicio",
						comunicacion.getDatosCambioDomicilio().getDatosBeneficiario().getIdiomaPrestServicio());

				datosBeneficiario.put("movil",
						comunicacion.getDatosCambioDomicilio().getDatosBeneficiario().getMovil());
				datosBeneficiario.put("email",
						comunicacion.getDatosCambioDomicilio().getDatosBeneficiario().getEmail());
				datosBeneficiario.put("telefonoServicio",
						comunicacion.getDatosCambioDomicilio().getDatosBeneficiario().getTelefonoServicio());
			}

			// En FASE I del intercambio con PS este dato no se recibirá.
			// De momento comentamos su procesamiento
//			this.tratarValoracion(comunicacion.getDatosCambioDomicilio().getDatosValoracion(), datosBeneficiario,
//					solicitante, false);

			// 2.- datosInstalacion
			// Insertar los datos de la nueva instalación en la tabla de instalaciones y el
			// resto de instalaciones pasarlas a histórico
			Instalaciones instalacionFilter = new Instalaciones();
			instalacionFilter.setIdSolicitante52(solicitante.getIdSolicitante01());
			List<Instalaciones> listaInstalaciones = this.instalacionesDao.findAll(instalacionFilter, null);
			for (Instalaciones instalacion : listaInstalaciones) {
				if (instalacion.getfHistorico52() == null) {
					instalacion.setUsuHistorico52(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
					this.instalacionesDao.updateHistorico(instalacion);
				}
			}

			Instalaciones instalacion = new Instalaciones();
			instalacion.setUsuAlta52(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
			instalacion.setIdSolicitante52(solicitante.getIdSolicitante01());
			instalacion.setMotivInstFueraPlazo52(
					comunicacion.getDatosCambioDomicilio().getDatosInstalacion().getMotInstFueraPlazo());
//			instalacion.setfInstalacion52(UtilidadesFecha.parsearFechaTelevida(
//					comunicacion.getDatosCambioDomicilio().getDatosInstalacion().getFInstalacion()));
			instalacion.setfInstalacion52(UtilidadesFecha.formatearStringToDateFormato(
					comunicacion.getDatosCambioDomicilio().getDatosInstalacion().getFInstalacion(),
					Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT));
			this.instalacionesDao.add(instalacion);

			// En FASE I del intercambio con PS no se reciben datos de terminales ni
			// dispositivos
			// Se comenta todo lo relacionado con ellos
//			// Damos de baja todos los dispositivos y terminales instalados actualmente
//			List<DispositivosSol> listaInstalados = getDispositivosBeneficiario(solicitante.getIdSolicitante01());
//			for (DispositivosSol dispositivo : listaInstalados) {
//				if (dispositivo.getfBaja23() == null) {
//					dispositivo.setUsuBaja23(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
//					dispositivo.setfBaja23(new java.util.Date());
//					this.dispositivosSolDao.updateBajaDispositivo(dispositivo);
//				}
//			}
//
//			// Insertar el nuevo terminal y crear un movimiento de alta asociado
//			DispositivosSol terminal = new DispositivosSol();
//			terminal.setUsuAlta23(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
////			terminal.setfInstalacion23(UtilidadesFecha.parsearFechaTelevida(
////					comunicacion.getDatosCambioDomicilio().getDatosInstalacion().getFInstalacion()));
//			terminal.setfInstalacion23(UtilidadesFecha.formatearStringToDateFormato(
//					comunicacion.getDatosCambioDomicilio().getDatosInstalacion().getFInstalacion(),
//					Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT));
//			terminal.setIdSolicitante23(solicitante.getIdSolicitante01());
//			terminal.setIdTerminal23(
//					Long.valueOf(comunicacion.getDatosCambioDomicilio().getDatosInstalacion().getTipoTerminal()));
//			this.dispositivosSolDao.add(terminal);
//
//			MovimientosDispositivos movimientoTerminal = new MovimientosDispositivos();
//			movimientoTerminal.setIdTerminal94(terminal.getIdTerminal23());
////			movimientoTerminal.setFecMovimiento94(UtilidadesFecha.parsearFechaTelevida(
////					comunicacion.getDatosCambioDomicilio().getDatosInstalacion().getFInstalacion()));
////			movimientoTerminal.setFecAlta94(UtilidadesFecha.parsearFechaTelevida(
////					comunicacion.getDatosCambioDomicilio().getDatosInstalacion().getFInstalacion()));
//			movimientoTerminal.setFecMovimiento94(UtilidadesFecha.formatearStringToDateFormato(
//					comunicacion.getDatosCambioDomicilio().getDatosInstalacion().getFInstalacion(),
//					Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT));
//			movimientoTerminal.setFecAlta94(UtilidadesFecha.formatearStringToDateFormato(
//					comunicacion.getDatosCambioDomicilio().getDatosInstalacion().getFInstalacion(),
//					Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT));
//			movimientoTerminal.setUsuAlta94(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
//			movimientoTerminal.setTipoMovimiento94(Integer.valueOf(TipoMovimientoDispositivoEnum.ALTA.getId()));
//			movimientoTerminal.setIdSolicitante94(solicitante.getIdSolicitante01());
//			this.movimientosDispositivosDao.add(movimientoTerminal);
//
//			// Insertamos los dispositivos nuevos y creamos un movimiento de alta asociado a
//			// cada uno
//			List<DispositivosSol> listDispositivos = ModelApplicationParser.getDispositivosInstAlta(
//					comunicacion.getDatosCambioDomicilio().getDatosInstalacion(), solicitante.getIdSolicitante01());
//			for (DispositivosSol dispositivo : listDispositivos) {
//				dispositivo.setUsuAlta23(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
////				dispositivo.setfInstalacion23(UtilidadesFecha.parsearFechaTelevida(
////						comunicacion.getDatosCambioDomicilio().getDatosInstalacion().getFInstalacion()));
//				dispositivo.setfInstalacion23(UtilidadesFecha.formatearStringToDateFormato(
//						comunicacion.getDatosCambioDomicilio().getDatosInstalacion().getFInstalacion(),
//						Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT));
//				dispositivo.setIdSolicitante23(solicitante.getIdSolicitante01());
//				dispositivosSolDao.add(dispositivo);
//
//				MovimientosDispositivos movimientoDisp = new MovimientosDispositivos();
//				movimientoDisp.setIdDispositivo94(dispositivo.getIdDispositivo23());
////				movimientoDisp.setFecMovimiento94(UtilidadesFecha.parsearFechaTelevida(
////						comunicacion.getDatosCambioDomicilio().getDatosInstalacion().getFInstalacion()));
////				movimientoDisp.setFecAlta94(UtilidadesFecha.parsearFechaTelevida(
////						comunicacion.getDatosCambioDomicilio().getDatosInstalacion().getFInstalacion()));
//				movimientoDisp.setFecMovimiento94(UtilidadesFecha.formatearStringToDateFormato(
//						comunicacion.getDatosCambioDomicilio().getDatosInstalacion().getFInstalacion(),
//						Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT));
//				movimientoDisp.setFecAlta94(UtilidadesFecha.formatearStringToDateFormato(
//						comunicacion.getDatosCambioDomicilio().getDatosInstalacion().getFInstalacion(),
//						Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT));
//				movimientoDisp.setUsuAlta94(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
//				movimientoDisp.setTipoMovimiento94(Integer.valueOf(TipoMovimientoDispositivoEnum.ALTA.getId()));
//				movimientoDisp.setIdSolicitante94(solicitante.getIdSolicitante01());
//				this.movimientosDispositivosDao.add(movimientoDisp);
//			}

			// 3.- datosBeneficiario
			// En FASE I del intercambio con PS este dato no se recibirá.
			// De momento actualizamos con los calores que ya tiene
//			solicitante.setTipoBeneficiario01(
//					comunicacion.getDatosCambioDomicilio().getDatosBeneficiario().getTipoBeneficiario());
//			solicitante.setIdiomaServicio01(
//					comunicacion.getDatosCambioDomicilio().getDatosBeneficiario().getIdiomaPrestServicio());
			if (comunicacion.getDatosCambioDomicilio().getDatosBeneficiario() != null) {
				solicitante.setTipoBeneficiario01(solicitante.getTipoBeneficiario01());
				solicitante.setIdiomaServicio01(solicitante.getIdiomaServicio01());

				solicitante.setTlfnoServicio01(
						comunicacion.getDatosCambioDomicilio().getDatosBeneficiario().getTelefonoServicio());
				solicitante.setTlfnoMovil01(comunicacion.getDatosCambioDomicilio().getDatosBeneficiario().getMovil());
				solicitante.setEmail01(comunicacion.getDatosCambioDomicilio().getDatosBeneficiario().getEmail());
				solicitante.setUsuModif01(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
				this.solicitantesDao.updateFromWSUpdate(solicitante);
			}

		}

		ProcesarPrestador.logger.info("ProcesarPrestador.proccesCambioDomicilio - Fin");
		return respuesta;
	}

	private Respuesta proccesBajaBeneficiario(Comunicacion comunicacion) throws Throwable {
		ProcesarPrestador.logger.info("ProcesarPrestador.proccesBajaBeneficiario - Inicio");
		Respuesta respuesta = this.validacionesPrestador.validarProccesBajaBeneficiario(comunicacion);

		if (respuesta.getCodRespuesta().equalsIgnoreCase(RespuestasTelevidaEnum.OK.getCodRespuesta())) {
			// recuperamos beneficiario
			Solicitantes solicitante = recuperarBeneficiario(comunicacion.getCabecera().getNumAbonado());

			if (null == solicitante) {
				return RespuestasTelevidaEnum.BENEFICIARIO_NO_EXISTE.getRespuesta();
			}

			// En FASE I del intercambio con PS no se recibirán los siguientes datos:
			// - Motivo de la baja
			// - Canal de comunicación
			// - Mantener instalación
			// - Origen de a comunicación
			// Se pondrán de momento valores por defecto
			// Comentamos su validación
			AvisosBajaBenef avisoBajaBenef = new AvisosBajaBenef();
//			avisoBajaBenef.setCanalComunicacion(comunicacion.getDatosBajaBeneficiario().getCanalComunicacion());
//			avisoBajaBenef.setIdMotivobaja(Long.valueOf(comunicacion.getDatosBajaBeneficiario().getMotivoBaja()));
//			avisoBajaBenef.setMantenerInst(comunicacion.getDatosBajaBeneficiario().getMantenerInst());
//			avisoBajaBenef.setOrigenComunicacion(comunicacion.getDatosBajaBeneficiario().getOrigenComunicacion());
			avisoBajaBenef.setCanalComunicacion(Integer.valueOf(CanalComunicacionEnum.LLAMADA.getId()));
			avisoBajaBenef.setIdMotivobaja(MotivoBajaEnum.OTROSMOTIVOS.getId());
			avisoBajaBenef.setMantenerInst(comunicacion.getDatosBajaBeneficiario().getMantenerInst());
			avisoBajaBenef.setOrigenComunicacion(Integer.valueOf(OrigenComunicacionEnum.PS.getId()));

			avisoBajaBenef.setFecBaja(
					UtilidadesFecha.parsearFechaPlatea(comunicacion.getDatosBajaBeneficiario().getFBajaBeneficiario()));
			avisoBajaBenef.setIdLlamada(comunicacion.getDatosBajaBeneficiario().getIdLlamada());
			avisoBajaBenef.setObservaciones(comunicacion.getDatosBajaBeneficiario().getObservaciones());

			// TODO AVISO BAJA BENEFICIARIO
			Avisos aviso = new Avisos();

			MaestroActores origen = new MaestroActores();
			origen.setIdActor42(Long.valueOf(OrigenAvisosEnum.PS.getId()));
			aviso.setMaestroActoresByOrigen20(origen);

			MaestroActores destino = new MaestroActores();
			destino.setIdActor42(Long.valueOf(OrigenAvisosEnum.DSS.getId()));
			aviso.setMaestroActoresByDestino20(destino);

			MaestroTiposAviso tipoAviso = new MaestroTiposAviso();
			tipoAviso.setIdTipoAviso40(TipoAvisoEnum.ACTUAL.getIdLongValue());
			aviso.setMaestroTiposAviso(tipoAviso);

			MaestroSubtiposAviso subtipoAviso = new MaestroSubtiposAviso();
			subtipoAviso.setIdSubTipoAviso41(SubTipoAvisoEnum.BAJA.getIdLongValue());
			aviso.setMaestroSubtiposAviso(subtipoAviso);

			aviso.setObservaciones20(comunicacion.getDatosBajaBeneficiario().getObservaciones());
			aviso.setIdSolicitante20(solicitante.getIdSolicitante01());
			aviso.setUsuAlta20(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
			aviso.setAvisosBajaBenef(avisoBajaBenef);
			aviso = this.avisosDao.add(aviso);

		}

		ProcesarPrestador.logger.info("ProcesarPrestador.proccesBajaBeneficiario - Fin");
		return respuesta;
	}

	private Solicitantes recuperarBeneficiario(String numAbonado) {
		Solicitantes solicitante = new Solicitantes();
		solicitante.setNumAbonado01(numAbonado);
		List<Solicitantes> listSolicitantes = solicitantesDao.findAll(solicitante, null);
		if (null == listSolicitantes || listSolicitantes.size() < 1) {
			return null;
		}

		return listSolicitantes.get(0);
	}

	private String getErrorMessage(String error) {
		if (null != error && error.length() > 800) {
			error = error.substring(0, 799);
		}
		return error;
	}

}
