package com.ejie.ad74a.ws.client.prestadorWS.service;

import java.io.InputStream;
import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import javax.xml.datatype.DatatypeConfigurationException;

import org.apache.commons.lang.exception.ExceptionUtils;
import org.joda.time.Instant;
import org.joda.time.Interval;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import com.ejie.ad74a.constantes.Constantes;
import com.ejie.ad74a.dao.ContactosDao;
import com.ejie.ad74a.dao.DocumentosInfSocialDao;
import com.ejie.ad74a.dao.DocumentosMedicosDao;
import com.ejie.ad74a.dao.ExpedientesDao;
import com.ejie.ad74a.dao.SolicitantesDao;
import com.ejie.ad74a.dao.comun.NoraDao;
import com.ejie.ad74a.exceptions.Ad74aWebserviceException;
import com.ejie.ad74a.model.Contactos;
import com.ejie.ad74a.model.DocumentosInfSocial;
import com.ejie.ad74a.model.DocumentosMedicos;
import com.ejie.ad74a.model.ErroresTelevida;
import com.ejie.ad74a.model.Expedientes;
import com.ejie.ad74a.model.Solicitantes;
import com.ejie.ad74a.model.comun.Calle;
import com.ejie.ad74a.scheduler.JobSchedulerService;
import com.ejie.ad74a.scheduler.SchedulerJobType;
import com.ejie.ad74a.service.ErroresTelevidaService;
import com.ejie.ad74a.util.comun.UtilidadesXML;
import com.ejie.ad74a.util.pif.Ad74aPIFws;
import com.ejie.ad74a.ws.client.dokusi.gestDocumental.T65Content;
import com.ejie.ad74a.ws.client.dokusi.service.DokusiService;
import com.ejie.ad74a.ws.client.prestadorWS.Comunicacion;
import com.ejie.ad74a.ws.client.prestadorWS.MiddlewareWebService;
import com.ejie.ad74a.ws.client.prestadorWS.data.ActualizacionDatosDss;
import com.ejie.ad74a.ws.client.prestadorWS.data.ActualizacionDatosDssResponse;
import com.ejie.ad74a.ws.client.prestadorWS.data.AltaPersonaBeneficiaria;
import com.ejie.ad74a.ws.client.prestadorWS.data.AltaPersonaBeneficiariaResponse;
import com.ejie.ad74a.ws.client.prestadorWS.data.BajaPersonaBeneficiaria;
import com.ejie.ad74a.ws.client.prestadorWS.data.BajaPersonaBeneficiariaResponse;
import com.ejie.ad74a.ws.client.prestadorWS.data.CabeceraType;
import com.ejie.ad74a.ws.client.prestadorWS.data.CambioDomicilio;
import com.ejie.ad74a.ws.client.prestadorWS.data.CambioDomicilioResponse;
import com.ejie.ad74a.ws.client.prestadorWS.data.DatosAltaType;
import com.ejie.ad74a.ws.client.prestadorWS.data.DatosBajaType;
import com.ejie.ad74a.ws.client.prestadorWS.data.DatosDomicilioType;
import com.ejie.ad74a.ws.client.prestadorWS.data.DatosModificacionType;
import com.ejie.ad74a.ws.client.prestadorWS.data.RecepcionPeticionAd74A;
import com.ejie.ad74a.ws.client.prestadorWS.data.RecepcionPeticionAd74AResponse;
import com.ejie.ad74a.ws.client.prestadorWS.data.RecepcionServicioAd74AType;
import com.ejie.ad74a.ws.client.prestadorWS.data.Respuesta;
import com.ejie.ad74a.ws.client.prestadorWS.data.TipoComunicacionEnum;
import com.ejie.ad74a.ws.client.prestadorWS.operaciones.OpActualizacionDatosDss;
import com.ejie.ad74a.ws.client.prestadorWS.operaciones.OpAltaPersonaBeneficiaria;
import com.ejie.ad74a.ws.client.prestadorWS.operaciones.OpBajaPersonaBeneficiaria;
import com.ejie.ad74a.ws.client.prestadorWS.operaciones.OpCambioDomicilio;
import com.ejie.ad74a.ws.client.prestadorWS.operaciones.OpComunes;
import com.ejie.ad74a.ws.client.prestadorWS.operaciones.OpRecepcionPeticionAd74A;

/**
 * TelevidaService. Cliente para el servicio web que expone el prestador del
 * servicio.
 * 
 * 
 * @author jbhg
 */

@Service(value = "prestadorWSService")
public class PrestadorWSServiceImpl implements PrestadorWSService {

	@Autowired
	private SolicitantesDao solicitantesDao;

	@Autowired
	private ExpedientesDao expedientesDao;

//	@Autowired
//	private DispositivosSolDao dispositivosSolDao;

	@Autowired
	private ContactosDao contactosDao;

//	@Autowired
//	private InformesDao informesDao;

	@Autowired
	private ErroresTelevidaService erroresTelevidaService;

	@Autowired
	private MiddlewareWebService middlewareWebService;

	@Autowired
	private DocumentosMedicosDao documentosMedicosDao;
	@Autowired
	private DocumentosInfSocialDao documentosInfSocialDao;
	@Autowired
	private DokusiService dokusiService;
	@Value("${" + Constantes.PRINCIPAL_INTER_X87B + "}")
	private String x87bPrincipal;
	@Value("${" + Constantes.CREDENCIAL_INTER_X87B + "}")
	private String x87bCredencial;
	@Value("${" + Constantes.RUTA_PIF_INTER_X87B + "}")
	private String x87bRutaPIF;
	@Value("${" + Constantes.RUTA_WSDL_INTER_X87B + "}")
	private String x87bRutaWSDL;

	@Autowired
	private NoraDao noraDao;

	@Autowired
	private JobSchedulerService jobSchedulerService;

	/**
	 * Final static logger.
	 */
	private static final Logger LOGGER = LoggerFactory.getLogger(PrestadorWSServiceImpl.class);

	@Override
	public AltaPersonaBeneficiariaResponse enviarAlta(Solicitantes solicitantes, Expedientes expedientes)
			throws Exception {

		PrestadorWSServiceImpl.LOGGER.info("PrestadorWSServiceImpl.enviarAlta - Inicio");

		Comunicacion comunicacion = this.crearComunicacionAlta(solicitantes, expedientes);

		try {
			AltaPersonaBeneficiaria altaPersonaBeneficiaria = new AltaPersonaBeneficiaria();
			altaPersonaBeneficiaria.setDatosAltaType(comunicacion.getDatosAlta());
			altaPersonaBeneficiaria.setCabeceraType(comunicacion.getCabecera());
			AltaPersonaBeneficiariaResponse respuesta = middlewareWebService
					.altaPersonaBeneficiaria(altaPersonaBeneficiaria, x87bPrincipal, x87bCredencial);

			Respuesta respData = respuesta.getRespuesta();
			if (!respData.getCodError().equals("00")) {
				ErroresTelevida errorPS = new ErroresTelevida();
				errorPS.setErrormsg51(getErrorMessage(respData.getDescError()));
				errorPS.setEstado51(com.ejie.ad74a.util.constantes.Constantes.EstadoErrores.ESTADO_ERRONEO);
				errorPS.setFecrecep51(new Date());
				errorPS.setTipomensaje51(TipoComunicacionEnum.ALTA.value());
				errorPS.setError51(respData.getCodError());
				errorPS.setSentido51(Constantes.UNO);
				try {
					// Guardamos el idSolicitante01 y el del expediente para poder relanzar su alta
					errorPS.setMensaje51(UtilidadesXML.marshalObjectWS(comunicacion));
				} catch (Exception e2) {
					e2.printStackTrace();
				}
				errorPS = erroresTelevidaService.add(errorPS);

				try {
					// ** Programar RE-Ejecución en diferido ** //
					HashMap<String, String> params = new HashMap<String, String>();
					params.put("id", errorPS.getIdError51().toString());
					this.jobSchedulerService.programarEjecucion(SchedulerJobType.ERROR_TELEVIDA, params);
				} catch (Exception e2) {
					// Solo para que no haga rollback
					PrestadorWSServiceImpl.LOGGER
							.error("Error programando re-ejecución: " + ExceptionUtils.getStackTrace(e2));
				}
			}
		} catch (Exception e) {
			ErroresTelevida errorPS = new ErroresTelevida();
			errorPS.setErrormsg51(getErrorMessage(ExceptionUtils.getStackTrace(e)));
			errorPS.setEstado51(com.ejie.ad74a.util.constantes.Constantes.EstadoErrores.ESTADO_ERRONEO);
			errorPS.setFecrecep51(new Date());
			errorPS.setTipomensaje51(TipoComunicacionEnum.ALTA.value());
			errorPS.setSentido51(Constantes.UNO);
			try {
				// Guardamos el idSolicitante01 y el del expediente para poder relanzar su alta
				errorPS.setMensaje51("#".concat(solicitantes.getIdSolicitante01().toString()).concat("#")
						.concat(expedientes.getIdExpediente00().toString()));
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			errorPS = erroresTelevidaService.add(errorPS);

			try {
				// ** Programar RE-Ejecución en diferido ** //
				HashMap<String, String> params = new HashMap<String, String>();
				params.put("id", errorPS.getIdError51().toString());
				this.jobSchedulerService.programarEjecucion(SchedulerJobType.ERROR_TELEVIDA, params);
			} catch (Exception e2) {
				// Solo para que no haga rollback
				PrestadorWSServiceImpl.LOGGER
						.error("Error programando re-ejecución: " + ExceptionUtils.getStackTrace(e2));
			}
		}

		PrestadorWSServiceImpl.LOGGER.info("PrestadorWSServiceImpl.enviarAlta - Fin");

		return null;

	}

	@Override
	public AltaPersonaBeneficiariaResponse relanzarEnviarAlta(Comunicacion comunicacion) throws Exception {

		PrestadorWSServiceImpl.LOGGER.info("PrestadorWSServiceImpl.relanzarEnviarAlta - Inicio");

		try {
			AltaPersonaBeneficiaria altaPersonaBeneficiaria = new AltaPersonaBeneficiaria();
			altaPersonaBeneficiaria.setDatosAltaType(comunicacion.getDatosAlta());
			altaPersonaBeneficiaria.setCabeceraType(comunicacion.getCabecera());
			AltaPersonaBeneficiariaResponse respuesta = middlewareWebService
					.altaPersonaBeneficiaria(altaPersonaBeneficiaria, x87bPrincipal, x87bCredencial);

			Respuesta respData = respuesta.getRespuesta();
			if (!respData.getCodError().equals("00")) {
				ErroresTelevida errorPS = new ErroresTelevida();
				errorPS.setErrormsg51(getErrorMessage(respData.getDescError()));
				errorPS.setEstado51(com.ejie.ad74a.util.constantes.Constantes.EstadoErrores.ESTADO_ERRONEO);
				errorPS.setFecrecep51(new Date());
				errorPS.setTipomensaje51(TipoComunicacionEnum.ALTA.value());
				errorPS.setError51(respData.getCodError());
				errorPS.setSentido51(Constantes.UNO);
				try {
					// Guardamos el idSolicitante01 y el del expediente para poder relanzar su alta
					errorPS.setMensaje51(UtilidadesXML.marshalObjectWS(comunicacion));
				} catch (Exception e2) {
					e2.printStackTrace();
				}
				errorPS = erroresTelevidaService.add(errorPS);

				try {
					// ** Programar RE-Ejecución en diferido ** //
					HashMap<String, String> params = new HashMap<String, String>();
					params.put("id", errorPS.getIdError51().toString());
					this.jobSchedulerService.programarEjecucion(SchedulerJobType.ERROR_TELEVIDA, params);
				} catch (Exception e2) {
					// Solo para que no haga rollback
					PrestadorWSServiceImpl.LOGGER
							.error("Error programando re-ejecución: " + ExceptionUtils.getStackTrace(e2));
				}
			}
		} catch (Exception e) {
			ErroresTelevida errorPS = new ErroresTelevida();
			errorPS.setErrormsg51(getErrorMessage(ExceptionUtils.getStackTrace(e)));
			errorPS.setEstado51(com.ejie.ad74a.util.constantes.Constantes.EstadoErrores.ESTADO_ERRONEO);
			errorPS.setFecrecep51(new Date());
			errorPS.setTipomensaje51(TipoComunicacionEnum.ALTA.value());
			errorPS.setSentido51(Constantes.UNO);
			try {
				// Guardamos el idSolicitante01 y el del expediente para poder relanzar su alta
				errorPS.setMensaje51(UtilidadesXML.marshalObjectWS(comunicacion));
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			erroresTelevidaService.add(errorPS);
		}

		PrestadorWSServiceImpl.LOGGER.info("PrestadorWSServiceImpl.relanzarEnviarAlta - Fin");

		return null;

	}

	@Override
	public BajaPersonaBeneficiariaResponse enviarBaja(Solicitantes solicitantes, Expedientes expedientes)
			throws Exception {

		PrestadorWSServiceImpl.LOGGER.info("PrestadorWSServiceImpl.enviarBaja - Inicio");

		Comunicacion comunicacion = this.crearComunicacionBaja(solicitantes, expedientes);

		BajaPersonaBeneficiaria bajaPersonaBeneficiaria = new BajaPersonaBeneficiaria();

		bajaPersonaBeneficiaria.setDatosBajaType(comunicacion.getDatosBaja());
		bajaPersonaBeneficiaria.setCabeceraType(comunicacion.getCabecera());

		try {
			BajaPersonaBeneficiariaResponse respuesta = middlewareWebService
					.bajaPersonaBeneficiaria(bajaPersonaBeneficiaria, x87bPrincipal, x87bCredencial);
			Respuesta respData = respuesta.getRespuesta();
			if (!respData.getCodError().equalsIgnoreCase(OpComunes.RESULTADO_OK)) {
				ErroresTelevida errorPS = new ErroresTelevida();
				errorPS.setErrormsg51(getErrorMessage(respData.getDescError()));
				errorPS.setEstado51(com.ejie.ad74a.util.constantes.Constantes.EstadoErrores.ESTADO_ERRONEO);
				errorPS.setFecrecep51(new Date());
				errorPS.setTipomensaje51(TipoComunicacionEnum.BAJA.value());
				errorPS.setError51(respData.getCodError());
				errorPS.setSentido51(Constantes.UNO);
				try {
					errorPS.setMensaje51(UtilidadesXML.marshalObjectWS(comunicacion));
				} catch (Exception e2) {
					e2.printStackTrace();
				}
				errorPS = erroresTelevidaService.add(errorPS);

				try {
					// ** Programar RE-Ejecución en diferido ** //
					HashMap<String, String> params = new HashMap<String, String>();
					params.put("id", errorPS.getIdError51().toString());
					this.jobSchedulerService.programarEjecucion(SchedulerJobType.ERROR_TELEVIDA, params);
				} catch (Exception e2) {
					// Solo para que no haga rollback
					PrestadorWSServiceImpl.LOGGER
							.error("Error programando re-ejecución: " + ExceptionUtils.getStackTrace(e2));
				}
			}

			// Actualizar la columna F_BAJA_PS_01 si la respuesta es OK
			if (respuesta.getRespuesta().getCodError().equalsIgnoreCase(OpComunes.RESULTADO_OK)) {
				Solicitantes solBaja = this.solicitantesDao.getFechaBaja(solicitantes);
				solicitantes.setfBaja01(solBaja.getfBaja01());
				this.solicitantesDao.updateBajaPSBeneficiario(solicitantes);
			}

			return respuesta;
		} catch (Exception e) {
			ErroresTelevida errorPS = new ErroresTelevida();
			errorPS.setErrormsg51(getErrorMessage(ExceptionUtils.getStackTrace(e)));
			errorPS.setEstado51(com.ejie.ad74a.util.constantes.Constantes.EstadoErrores.ESTADO_ERRONEO);
			errorPS.setFecrecep51(new Date());
			errorPS.setTipomensaje51(TipoComunicacionEnum.BAJA.value());
			errorPS.setSentido51(Constantes.UNO);
			try {
				// Guardamos el idSolicitante01 y el del expediente para poder relanzar su alta
				errorPS.setMensaje51("#".concat(solicitantes.getIdSolicitante01().toString()).concat("#")
						.concat(expedientes.getIdExpediente00().toString()));
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			errorPS = erroresTelevidaService.add(errorPS);

			try {
				// ** Programar RE-Ejecución en diferido ** //
				HashMap<String, String> params = new HashMap<String, String>();
				params.put("id", errorPS.getIdError51().toString());
				this.jobSchedulerService.programarEjecucion(SchedulerJobType.ERROR_TELEVIDA, params);
			} catch (Exception e2) {
				// Solo para que no haga rollback
				PrestadorWSServiceImpl.LOGGER
						.error("Error programando re-ejecución: " + ExceptionUtils.getStackTrace(e2));
			}
		}

		PrestadorWSServiceImpl.LOGGER.info("PrestadorWSServiceImpl.enviarBaja - Fin");

		return null;
	}

	@Override
	public BajaPersonaBeneficiariaResponse relanzarEnviarBaja(Comunicacion comunicacion) throws Exception {

		PrestadorWSServiceImpl.LOGGER.info("PrestadorWSServiceImpl.relanzarEnviarBaja - Inicio");

		BajaPersonaBeneficiaria bajaPersonaBeneficiaria = new BajaPersonaBeneficiaria();

		bajaPersonaBeneficiaria.setDatosBajaType(comunicacion.getDatosBaja());
		bajaPersonaBeneficiaria.setCabeceraType(comunicacion.getCabecera());

		try {

			BajaPersonaBeneficiariaResponse respuesta = middlewareWebService
					.bajaPersonaBeneficiaria(bajaPersonaBeneficiaria, x87bPrincipal, x87bCredencial);

			Respuesta respData = respuesta.getRespuesta();
			if (!respuesta.getRespuesta().getCodError().equalsIgnoreCase(OpComunes.RESULTADO_OK)) {
				ErroresTelevida errorPS = new ErroresTelevida();
				errorPS.setErrormsg51(getErrorMessage(respData.getDescError()));
				errorPS.setEstado51(com.ejie.ad74a.util.constantes.Constantes.EstadoErrores.ESTADO_ERRONEO);
				errorPS.setFecrecep51(new Date());
				errorPS.setTipomensaje51(TipoComunicacionEnum.BAJA.value());
				errorPS.setError51(respData.getCodError());
				errorPS.setSentido51(Constantes.UNO);
				try {
					// Guardamos el idSolicitante01 y el del expediente para poder relanzar su alta
					errorPS.setMensaje51(UtilidadesXML.marshalObjectWS(comunicacion));
				} catch (Exception e2) {
					e2.printStackTrace();
				}
				erroresTelevidaService.add(errorPS);
			}

			// Actualizar la columna F_BAJA_PS_01 si la respuesta es OK
			if (respuesta.getRespuesta().getCodError().equalsIgnoreCase(OpComunes.RESULTADO_OK)) {
				// Obtener el beneficiario
				Solicitantes solicitante = new Solicitantes();
				solicitante.setNumAbonado01(comunicacion.getCabecera().getBeneficiarioType().getNumAbonado());
				List<Solicitantes> listSolicitantes = solicitantesDao.findAll(solicitante, null);
				if (!listSolicitantes.isEmpty()) {
					solicitante = listSolicitantes.get(0);
					this.solicitantesDao.updateBajaPSBeneficiario(solicitante);
				}
			}

			return respuesta;
		} catch (Exception e) {
			ErroresTelevida errorPS = new ErroresTelevida();
			errorPS.setErrormsg51(getErrorMessage(ExceptionUtils.getStackTrace(e)));
			errorPS.setEstado51(com.ejie.ad74a.util.constantes.Constantes.EstadoErrores.ESTADO_ERRONEO);
			errorPS.setFecrecep51(new Date());
			errorPS.setTipomensaje51(TipoComunicacionEnum.BAJA.value());
			errorPS.setSentido51(Constantes.UNO);
			try {
				// Guardamos el idSolicitante01 y el del expediente para poder relanzar su alta
				errorPS.setMensaje51(UtilidadesXML.marshalObjectWS(comunicacion));
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			erroresTelevidaService.add(errorPS);
		}

		PrestadorWSServiceImpl.LOGGER.info("PrestadorWSServiceImpl.relanzarEnviarBaja - Fin");

		return null;
	}

	@Override
	public ActualizacionDatosDssResponse enviarModificacion(Solicitantes solicitantes, Expedientes expedientes)
			throws Exception {

		PrestadorWSServiceImpl.LOGGER.info("PrestadorWSServiceImpl.enviarModificacion - Inicio");

		Comunicacion comunicacion = this.crearComunicacionModificacion(solicitantes, expedientes);

		try {

			ActualizacionDatosDss actualizacionDatosDss = new ActualizacionDatosDss();

			actualizacionDatosDss.setDatosModificacionType(comunicacion.getDatosModificacion());
			actualizacionDatosDss.setCabeceraType(comunicacion.getCabecera());
			ActualizacionDatosDssResponse respuesta = middlewareWebService.actualizacionDatosDss(actualizacionDatosDss,
					x87bPrincipal, x87bCredencial);

			Respuesta respData = respuesta.getRespuesta();
			if (!respData.getCodError().equals("00")) {
				ErroresTelevida errorPS = new ErroresTelevida();
				errorPS.setErrormsg51(getErrorMessage(respData.getDescError()));
				errorPS.setEstado51(com.ejie.ad74a.util.constantes.Constantes.EstadoErrores.ESTADO_ERRONEO);
				errorPS.setFecrecep51(new Date());
				errorPS.setTipomensaje51(TipoComunicacionEnum.UPDATE.value());
				errorPS.setError51(respData.getCodError());
				errorPS.setSentido51(Constantes.UNO);
				try {
					// Guardamos la comunicación para pode rrelanzar
					errorPS.setMensaje51(UtilidadesXML.marshalObjectWS(comunicacion));
				} catch (Exception e2) {
					e2.printStackTrace();
				}
				errorPS = erroresTelevidaService.add(errorPS);

				try {
					// ** Programar RE-Ejecución en diferido ** //
					HashMap<String, String> params = new HashMap<String, String>();
					params.put("id", errorPS.getIdError51().toString());
					this.jobSchedulerService.programarEjecucion(SchedulerJobType.ERROR_TELEVIDA, params);
				} catch (Exception e2) {
					// Solo para que no haga rollback
					PrestadorWSServiceImpl.LOGGER
							.error("Error programando re-ejecución: " + ExceptionUtils.getStackTrace(e2));
				}
			}
		} catch (Exception e) {
			ErroresTelevida errorPS = new ErroresTelevida();
			errorPS.setErrormsg51(getErrorMessage(ExceptionUtils.getStackTrace(e)));
			errorPS.setEstado51(com.ejie.ad74a.util.constantes.Constantes.EstadoErrores.ESTADO_ERRONEO);
			errorPS.setFecrecep51(new Date());
			errorPS.setTipomensaje51(TipoComunicacionEnum.UPDATE.value());
			errorPS.setSentido51(Constantes.UNO);
			try {
				// Guardamos la comunicación para pode rrelanzar
				errorPS.setMensaje51(UtilidadesXML.marshalObjectWS(comunicacion));
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			errorPS = erroresTelevidaService.add(errorPS);

			try {
				// ** Programar RE-Ejecución en diferido ** //
				HashMap<String, String> params = new HashMap<String, String>();
				params.put("id", errorPS.getIdError51().toString());
				this.jobSchedulerService.programarEjecucion(SchedulerJobType.ERROR_TELEVIDA, params);
			} catch (Exception e2) {
				// Solo para que no haga rollback
				PrestadorWSServiceImpl.LOGGER
						.error("Error programando re-ejecución: " + ExceptionUtils.getStackTrace(e2));
			}
		}

		PrestadorWSServiceImpl.LOGGER.info("PrestadorWSServiceImpl.enviarModificacion - Fin");

		return null;
	}

	@Override
	public ActualizacionDatosDssResponse relanzarEnviarModificacion(Comunicacion comunicacion) throws Exception {

		PrestadorWSServiceImpl.LOGGER.info("PrestadorWSServiceImpl.relanzarEnviarModificacion - Inicio");

		try {

			ActualizacionDatosDss actualizacionDatosDss = new ActualizacionDatosDss();

			actualizacionDatosDss.setDatosModificacionType(comunicacion.getDatosModificacion());
			actualizacionDatosDss.setCabeceraType(comunicacion.getCabecera());
			ActualizacionDatosDssResponse respuesta = middlewareWebService.actualizacionDatosDss(actualizacionDatosDss,
					x87bPrincipal, x87bCredencial);

			Respuesta respData = respuesta.getRespuesta();
			if (!respData.getCodError().equals("00")) {
				ErroresTelevida errorPS = new ErroresTelevida();
				errorPS.setErrormsg51(getErrorMessage(respData.getDescError()));
				errorPS.setEstado51(com.ejie.ad74a.util.constantes.Constantes.EstadoErrores.ESTADO_ERRONEO);
				errorPS.setFecrecep51(new Date());
				errorPS.setTipomensaje51(TipoComunicacionEnum.UPDATE.value());
				errorPS.setError51(respData.getCodError());
				errorPS.setSentido51(Constantes.UNO);
				try {
					// Guardamos el idSolicitante01 y el del expediente para poder relanzar su alta
					errorPS.setMensaje51(UtilidadesXML.marshalObjectWS(comunicacion));
				} catch (Exception e2) {
					e2.printStackTrace();
				}
				erroresTelevidaService.add(errorPS);
			}
		} catch (Exception e) {
			ErroresTelevida errorPS = new ErroresTelevida();
			errorPS.setErrormsg51(getErrorMessage(ExceptionUtils.getStackTrace(e)));
			errorPS.setEstado51(com.ejie.ad74a.util.constantes.Constantes.EstadoErrores.ESTADO_ERRONEO);
			errorPS.setFecrecep51(new Date());
			errorPS.setTipomensaje51(TipoComunicacionEnum.UPDATE.value());
			errorPS.setSentido51(Constantes.UNO);
			try {
				// Guardamos el idSolicitante01 y el del expediente para poder relanzar su alta
				errorPS.setMensaje51(UtilidadesXML.marshalObjectWS(comunicacion));
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			erroresTelevidaService.add(errorPS);
		}

		PrestadorWSServiceImpl.LOGGER.info("PrestadorWSServiceImpl.relanzarEnviarModificacion - Fin");

		return null;
	}

	@Override
	public CambioDomicilioResponse enviarCambioDomicilio(Solicitantes solicitantes, Expedientes expedientes)
			throws Exception {
		PrestadorWSServiceImpl.LOGGER.info("PrestadorWSServiceImpl.enviarCambioDomicilio - Inicio");

		Comunicacion comunicacion = this.crearComunicacionCambioDomicilio(solicitantes, expedientes);

		try {
			CambioDomicilio cambioDomicilio = new CambioDomicilio();
			cambioDomicilio.setDatosDomicilioType(comunicacion.getDatosDomicilio());
			cambioDomicilio.setCabeceraType(comunicacion.getCabecera());
			CambioDomicilioResponse respuesta = middlewareWebService.cambioDomicilio(cambioDomicilio, x87bPrincipal,
					x87bCredencial);

			Respuesta respData = respuesta.getRespuesta();
			if (!respData.getCodError().equals("00")) {
				ErroresTelevida errorPS = new ErroresTelevida();
				errorPS.setErrormsg51(getErrorMessage(respData.getDescError()));
				errorPS.setEstado51(com.ejie.ad74a.util.constantes.Constantes.EstadoErrores.ESTADO_ERRONEO);
				errorPS.setFecrecep51(new Date());
				errorPS.setTipomensaje51(TipoComunicacionEnum.DOMICILIO.value());
				errorPS.setError51(respData.getCodError());
				errorPS.setSentido51(Constantes.UNO);
				try {
					// Guardamos el idSolicitante01 y el del expediente para poder relanzar su alta
					errorPS.setMensaje51(UtilidadesXML.marshalObjectWS(comunicacion));
				} catch (Exception e2) {
					e2.printStackTrace();
				}
				errorPS = erroresTelevidaService.add(errorPS);

				try {
					// ** Programar RE-Ejecución en diferido ** //
					HashMap<String, String> params = new HashMap<String, String>();
					params.put("id", errorPS.getIdError51().toString());
					this.jobSchedulerService.programarEjecucion(SchedulerJobType.ERROR_TELEVIDA, params);
				} catch (Exception e2) {
					// Solo para que no haga rollback
					PrestadorWSServiceImpl.LOGGER
							.error("Error programando re-ejecución: " + ExceptionUtils.getStackTrace(e2));
				}
			}
		} catch (Exception e) {
			ErroresTelevida errorPS = new ErroresTelevida();
			errorPS.setErrormsg51(getErrorMessage(ExceptionUtils.getStackTrace(e)));
			errorPS.setEstado51(com.ejie.ad74a.util.constantes.Constantes.EstadoErrores.ESTADO_ERRONEO);
			errorPS.setFecrecep51(new Date());
			errorPS.setTipomensaje51(TipoComunicacionEnum.DOMICILIO.value());
			errorPS.setSentido51(Constantes.UNO);
			try {
				// Guardamos el idSolicitante01 y el del expediente para poder relanzar su alta
				errorPS.setMensaje51("#".concat(solicitantes.getIdSolicitante01().toString()).concat("#")
						.concat(expedientes.getIdExpediente00().toString()));
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			errorPS = erroresTelevidaService.add(errorPS);

			try {
				// ** Programar RE-Ejecución en diferido ** //
				HashMap<String, String> params = new HashMap<String, String>();
				params.put("id", errorPS.getIdError51().toString());
				this.jobSchedulerService.programarEjecucion(SchedulerJobType.ERROR_TELEVIDA, params);
			} catch (Exception e2) {
				// Solo para que no haga rollback
				PrestadorWSServiceImpl.LOGGER
						.error("Error programando re-ejecución: " + ExceptionUtils.getStackTrace(e2));
			}
		}

		PrestadorWSServiceImpl.LOGGER.info("PrestadorWSServiceImpl.enviarCambioDomicilio - Fin");

		return null;
	}

	@Override
	public CambioDomicilioResponse relanzarEnviarCambioDomicilio(Comunicacion comunicacion) throws Exception {
		PrestadorWSServiceImpl.LOGGER.info("PrestadorWSServiceImpl.relanzarEnviarCambioDomicilio - Inicio");

		try {
			CambioDomicilio cambioDomicilio = new CambioDomicilio();
			cambioDomicilio.setDatosDomicilioType(comunicacion.getDatosDomicilio());
			cambioDomicilio.setCabeceraType(comunicacion.getCabecera());
			CambioDomicilioResponse respuesta = middlewareWebService.cambioDomicilio(cambioDomicilio, x87bPrincipal,
					x87bCredencial);

			Respuesta respData = respuesta.getRespuesta();
			if (!respData.getCodError().equals("00")) {
				ErroresTelevida errorPS = new ErroresTelevida();
				errorPS.setErrormsg51(getErrorMessage(respData.getDescError()));
				errorPS.setEstado51(com.ejie.ad74a.util.constantes.Constantes.EstadoErrores.ESTADO_ERRONEO);
				errorPS.setFecrecep51(new Date());
				errorPS.setTipomensaje51(TipoComunicacionEnum.DOMICILIO.value());
				errorPS.setError51(respData.getCodError());
				errorPS.setSentido51(Constantes.UNO);
				try {
					// Guardamos el idSolicitante01 y el del expediente para poder relanzar su alta
					errorPS.setMensaje51(UtilidadesXML.marshalObjectWS(comunicacion));
				} catch (Exception e2) {
					e2.printStackTrace();
				}
				erroresTelevidaService.add(errorPS);
			}
		} catch (Exception e) {
			ErroresTelevida errorPS = new ErroresTelevida();
			errorPS.setErrormsg51(getErrorMessage(ExceptionUtils.getStackTrace(e)));
			errorPS.setEstado51(com.ejie.ad74a.util.constantes.Constantes.EstadoErrores.ESTADO_ERRONEO);
			errorPS.setFecrecep51(new Date());
			errorPS.setTipomensaje51(TipoComunicacionEnum.DOMICILIO.value());
			errorPS.setSentido51(Constantes.UNO);
			try {
				// Guardamos el idSolicitante01 y el del expediente para poder relanzar su alta
				errorPS.setMensaje51(UtilidadesXML.marshalObjectWS(comunicacion));
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			erroresTelevidaService.add(errorPS);
		}

		PrestadorWSServiceImpl.LOGGER.info("PrestadorWSServiceImpl.relanzarEnviarCambioDomicilio - Fin");

		return null;
	}

	@Override
	public RecepcionPeticionAd74AResponse enviarRecepcionPeticionAd74A(BigDecimal idPeticion, BigDecimal codEstado)
			throws Exception {

		// Revisar pq creo que no envía toda la información necesaria. PS solo recibe
		// estos datos y no entiendo pq no la fecha y el mensaje
		PrestadorWSServiceImpl.LOGGER.info("PrestadorWSServiceImpl.enviarRecepcionPeticionAd74A - Inicio ");
		RecepcionServicioAd74AType recepcionServicioAd74AType = OpRecepcionPeticionAd74A
				.getRecepcionServicioAd74AType(idPeticion, codEstado);
		RecepcionPeticionAd74A recepcionServicioAd74A = new RecepcionPeticionAd74A();
		recepcionServicioAd74A.setRecepcionServicioAd74AType(recepcionServicioAd74AType);
		RecepcionPeticionAd74AResponse respuesta = middlewareWebService.recepcionPeticionAd74A(recepcionServicioAd74A,
				x87bPrincipal, x87bCredencial);
		PrestadorWSServiceImpl.LOGGER.info("PrestadorWSServiceImpl.enviarRecepcionPeticionAd74A - Fin");
		return respuesta;
	}

	private Solicitantes rellenarCalleDireccion(Solicitantes sol) {
		Instant inst1 = new Instant();
		if (sol.getDirecciones() != null && sol.getDirecciones().getCalleNORA() != null
				&& sol.getDirecciones().getCalleNORA().getCodCalle() != null) {
			PrestadorWSServiceImpl.LOGGER.info(
					"PrestadorWSServiceImpl.rellenarCalleDireccion #Dt14#  -{}- ms  buscar calle",
					new Interval(inst1, new Instant()).toDurationMillis());
			List<Calle> listaCalles = noraDao.findAllCalles(sol.getDirecciones().getCalleNORA());
			if (listaCalles != null && !listaCalles.isEmpty()) {
				PrestadorWSServiceImpl.LOGGER.info(
						"PrestadorWSServiceImpl.rellenarCalleDireccion #Dt2#  -{}- ms  hay calle {}",
						new Interval(inst1, new Instant()).toDurationMillis(), listaCalles.get(0).getDescripcion());
				sol.getDirecciones().setCalle06(listaCalles.get(0).getDescripcion());
			}
		}
		return sol;
	}

	private Comunicacion crearComunicacionAlta(Solicitantes solicitante, Expedientes expediente)
			throws DatatypeConfigurationException, Ad74aWebserviceException, Exception {

		Instant inst1 = new Instant();
		PrestadorWSServiceImpl.LOGGER.info("PrestadorWSServiceImpl.crearComunicacionAlta #t0# ");

		DatosAltaType datosAlta = new DatosAltaType();
		Comunicacion comunicacion = new Comunicacion();
		CabeceraType cabecera = new CabeceraType();
		Expedientes expedientesSol = this.expedientesDao.find(expediente);

		PrestadorWSServiceImpl.LOGGER.info("PrestadorWSServiceImpl.crearComunicacionAlta #Dt1#  -{}- ms  ",
				new Interval(inst1, new Instant()).toDurationMillis());
		List<Solicitantes> listSolicitantes = solicitantesDao
				.findAll(solicitante == null || solicitante.getIdSolicitante01() == null
						? new Solicitantes(expedientesSol.getSolicitantes().getIdSolicitante01())
						: new Solicitantes(solicitante.getIdSolicitante01()), null);

		PrestadorWSServiceImpl.LOGGER.info("PrestadorWSServiceImpl.crearComunicacionAlta #Dt2#  -{}- ms  ",
				new Interval(inst1, new Instant()).toDurationMillis());
		if (listSolicitantes != null && !listSolicitantes.isEmpty()) {
			PrestadorWSServiceImpl.LOGGER.info("PrestadorWSServiceImpl.crearComunicacionAlta #Dt3#  -{}- ms  ",
					new Interval(inst1, new Instant()).toDurationMillis());
			Solicitantes sol = listSolicitantes.get(0);

			// obtener descripción de calle de la direccion
			sol = rellenarCalleDireccion(sol);

			// CabeceraType
			cabecera = OpAltaPersonaBeneficiaria.getCabeceraType(sol, TipoComunicacionEnum.ALTA);
			// DatosAltaType
			// solicitante,expediente,contactos,informes social, informes medicos

			// obtenemos los contactos
			Contactos contacto = new Contactos();
			contacto.setIdSolicitante03(sol.getIdSolicitante01());
			List<Contactos> listaContactos = contactosDao.findAll(contacto, null);

			// obtenemos el informe social
			DocumentosInfSocial documentosInfSocial = new DocumentosInfSocial(expedientesSol.getIdExpediente00());
			documentosInfSocial = documentosInfSocialDao.find(documentosInfSocial);
			if (documentosInfSocial != null) {
				// DOKUSI
				T65Content t65Content = this.dokusiService
						.retrieveDocumentOrSuperLocator(documentosInfSocial.getOiddokusi18());
				// nombre documento
				String rutaDondeMover = ParseUtils.crearPathDesdeRutaPif(x87bRutaPIF,
						documentosInfSocial.getIdExpediente00().toString(), documentosInfSocial.getNombreDoc18());

//				documentosInfSocial
//						.setRutaPif(Ad74aPIFws.getInstance().moveDocument(t65Content.getPifId(), rutaDondeMover));
				documentosInfSocial.setRutaPif(this.copiarDocumento(t65Content.getPifId(), rutaDondeMover));
			}

			// obtenemos el informe de tipo medico
			String rutaPIFInformeMedico = new String();
			DocumentosMedicos documentosMedicos = new DocumentosMedicos(expedientesSol.getIdExpediente00());
			documentosMedicos = documentosMedicosDao.find(documentosMedicos);
			// DOKUSI
			T65Content t65Content = this.dokusiService
					.retrieveDocumentOrSuperLocator(documentosMedicos.getOiddokusi18());
			// nombre documento
			String rutaDondeMover = ParseUtils.crearPathDesdeRutaPif(x87bRutaPIF,
					documentosMedicos.getIdExpediente00().toString(), documentosMedicos.getNombreDoc18());
//			rutaPIFInformeMedico = Ad74aPIFws.getInstance().moveDocument(t65Content.getPifId(), rutaDondeMover);

			rutaPIFInformeMedico = this.copiarDocumento(t65Content.getPifId(), rutaDondeMover);

			datosAlta = OpAltaPersonaBeneficiaria.getDatosAltaType(sol, expedientesSol, listaContactos,
					documentosInfSocial, rutaPIFInformeMedico);

			comunicacion.setCabecera(cabecera);
			comunicacion.setDatosAlta(datosAlta);

			PrestadorWSServiceImpl.LOGGER.info("PrestadorWSServiceImpl.crearComunicacionAlta #Dt9#  -{}- ms  ",
					new Interval(inst1, new Instant()).toDurationMillis());
			// Recuperamos la lista de dispositivos instalados
//			List<DispositivosSol> listaInstalados = getDispositivosBeneficiario(solicitante.getIdSolicitante01());
//			if (listaInstalados != null) {
//				PrestadorWSServiceImpl.LOGGER.info("Dispositivos Instalados");
//			}

			PrestadorWSServiceImpl.LOGGER.info("PrestadorWSServiceImpl.crearComunicacionAlta #Dt10#  -{}- ms  ",
					new Interval(inst1, new Instant()).toDurationMillis());

		}
		return comunicacion;
	}

	private String copiarDocumento(String rutaOrigen, String rutaDestino) throws Exception {
		String rutaPif = "";
		InputStream inputStream = Ad74aPIFws.getInstance().downloadDocument(rutaOrigen);
		rutaPif = Ad74aPIFws.getInstance().uploadDocument(inputStream, rutaDestino, true);

		return rutaPif;
	}

	private Comunicacion crearComunicacionBaja(Solicitantes solicitante, Expedientes expediente)
			throws DatatypeConfigurationException {
		Instant inst1 = new Instant();
		PrestadorWSServiceImpl.LOGGER.info("PrestadorWSServiceImpl.crearComunicacionBaja #t0# ");
		DatosBajaType datosBaja = new DatosBajaType();
		Comunicacion comunicacion = new Comunicacion();
		CabeceraType cabecera = new CabeceraType();
		Expedientes expedientesSol = this.expedientesDao.find(expediente);

		PrestadorWSServiceImpl.LOGGER.info("PrestadorWSServiceImpl.crearComunicacionBaja #Dt1#  -{}- ms  ",
				new Interval(inst1, new Instant()).toDurationMillis());
		List<Solicitantes> listSolicitantes = solicitantesDao
				.findAll(solicitante == null || solicitante.getIdSolicitante01() == null
						? new Solicitantes(expedientesSol.getSolicitantes().getIdSolicitante01())
						: new Solicitantes(solicitante.getIdSolicitante01()), null);
		if (listSolicitantes != null && !listSolicitantes.isEmpty()) {
			PrestadorWSServiceImpl.LOGGER.info("PrestadorWSServiceImpl.crearComunicacionBaja #Dt3#  -{}- ms  ",
					new Interval(inst1, new Instant()).toDurationMillis());
			Solicitantes sol = listSolicitantes.get(0);

			// CabeceraType
			cabecera = OpBajaPersonaBeneficiaria.getCabeceraType(sol, TipoComunicacionEnum.BAJA);
			datosBaja = OpBajaPersonaBeneficiaria.getDatosBajaType(sol, expedientesSol.getIdMotivoBaja00().intValue(),
					expedientesSol.getObservaciones00());

			comunicacion.setCabecera(cabecera);
			comunicacion.setDatosBaja(datosBaja);

			PrestadorWSServiceImpl.LOGGER.info("PrestadorWSServiceImpl.crearComunicacionBaja #Dt9#  -{}- ms  ",
					new Interval(inst1, new Instant()).toDurationMillis());
		}
		return comunicacion;
	}

	private Comunicacion crearComunicacionModificacion(Solicitantes solicitante, Expedientes expediente)
			throws DatatypeConfigurationException, Ad74aWebserviceException {

		Instant inst1 = new Instant();
		PrestadorWSServiceImpl.LOGGER.info("PrestadorWSServiceImpl.crearComunicacionModificacion #t0# ");

		DatosModificacionType datosModificacion = new DatosModificacionType();
		Comunicacion comunicacion = new Comunicacion();
		CabeceraType cabecera = new CabeceraType();
//		Expedientes expedientesSol = this.expedientesDao.find(expediente);
//
//		PrestadorWSServiceImpl.LOGGER.info("PrestadorWSServiceImpl.crearComunicacionModificacion #Dt1#  -{}- ms  ",
//				new Interval(inst1, new Instant()).toDurationMillis());
//		List<Solicitantes> listSolicitantes = solicitantesDao
//				.findAll(solicitante == null || solicitante.getIdSolicitante01() == null
//						? new Solicitantes(expedientesSol.getSolicitantes().getIdSolicitante01())
//						: new Solicitantes(solicitante.getIdSolicitante01()), null);
		List<Solicitantes> listSolicitantes = solicitantesDao
				.findAll(new Solicitantes(solicitante.getIdSolicitante01()), null);
		PrestadorWSServiceImpl.LOGGER.info("PrestadorWSServiceImpl.crearComunicacionModificacion #Dt2#  -{}- ms  ",
				new Interval(inst1, new Instant()).toDurationMillis());
		if (listSolicitantes != null && !listSolicitantes.isEmpty()) {
			PrestadorWSServiceImpl.LOGGER.info("PrestadorWSServiceImpl.crearComunicacionModificacion #Dt3#  -{}- ms  ",
					new Interval(inst1, new Instant()).toDurationMillis());
			Solicitantes sol = listSolicitantes.get(0);

			// CabeceraType
			cabecera = OpActualizacionDatosDss.getCabeceraType(sol, TipoComunicacionEnum.UPDATE);
			// DatosModificacionType
			// solicitante,expediente, informes medicos

			// obtenemos el informe social
			// De momento no se va a informar
//			DocumentosInfSocial documentosInfSocial = new DocumentosInfSocial(expedientesSol.getIdExpediente00());
//			documentosInfSocial = documentosInfSocialDao.find(documentosInfSocial);
//			if (documentosInfSocial != null) {
//				// DOKUSI
//				T65Content t65Content = this.dokusiService
//						.retrieveDocumentOrSuperLocator(documentosInfSocial.getOiddokusi18());
//				// nombre documento
//				String rutaDondeMover = ParseUtils.crearPathDesdeRutaPif(x87bRutaPIF,
//						documentosInfSocial.getIdExpediente00().toString(), documentosInfSocial.getNombreDoc18());
//
//				//documentosInfSocial.setRutaPif(Ad74aPIFws.getInstance().moveDocument(t65Content.getPifId(), rutaDondeMover));
//				documentosInfSocial
//						.setRutaPif(this.copiarDocumento(t65Content.getPifId(), rutaDondeMover));
//			}

			// obtenemos el informe de tipo medico
			String rutaPIFInformeMedico = new String();

			// De momento no se va a informar
//			DocumentosMedicos documentosMedicos = new DocumentosMedicos(expedientesSol.getIdExpediente00());
//			documentosMedicos = documentosMedicosDao.find(documentosMedicos);
//			// DOKUSI
//			T65Content t65Content = this.dokusiService
//					.retrieveDocumentOrSuperLocator(documentosMedicos.getOiddokusi18());
//			// nombre documento
//			String rutaDondeMover = ParseUtils.crearPathDesdeRutaPif(x87bRutaPIF,
//					documentosMedicos.getIdExpediente00().toString(), documentosMedicos.getNombreDoc18());
//
//			//rutaPIFInformeMedico = Ad74aPIFws.getInstance().moveDocument(t65Content.getPifId(), rutaDondeMover);
//			rutaPIFInformeMedico = this.copiarDocumento(t65Content.getPifId(), rutaDondeMover);

			DocumentosInfSocial documentosInfSocial = new DocumentosInfSocial();

			datosModificacion = OpActualizacionDatosDss.getDatosModificacionType(sol, new Expedientes(),
					documentosInfSocial, rutaPIFInformeMedico);

			comunicacion.setCabecera(cabecera);
			comunicacion.setDatosModificacion(datosModificacion);

			PrestadorWSServiceImpl.LOGGER.info("PrestadorWSServiceImpl.crearComunicacionModificacion #Dt9#  -{}- ms  ",
					new Interval(inst1, new Instant()).toDurationMillis());
			// Recuperamos la lista de dispositivos instalados
//			List<DispositivosSol> listaInstalados = getDispositivosBeneficiario(solicitante.getIdSolicitante01());
//			if (listaInstalados != null) {
//				PrestadorWSServiceImpl.LOGGER.info("Dispositivos Instalados");
//			}

			PrestadorWSServiceImpl.LOGGER.info("PrestadorWSServiceImpl.crearComunicacionModificacion #Dt10#  -{}- ms  ",
					new Interval(inst1, new Instant()).toDurationMillis());

		}
		return comunicacion;
	}

	private Comunicacion crearComunicacionCambioDomicilio(Solicitantes solicitante, Expedientes expediente)
			throws DatatypeConfigurationException, Ad74aWebserviceException, Exception {

		PrestadorWSServiceImpl.LOGGER.info("PrestadorWSServiceImpl.crearComunicacionCambioDomicilio - INICIO ");

		DatosDomicilioType datosCambioDomicilioType = new DatosDomicilioType();
		Comunicacion comunicacion = new Comunicacion();

		Expedientes expedientesSol = this.expedientesDao.find(expediente);

		List<Solicitantes> listSolicitantes = solicitantesDao
				.findAll(solicitante == null || solicitante.getIdSolicitante01() == null
						? new Solicitantes(expedientesSol.getSolicitantes().getIdSolicitante01())
						: new Solicitantes(solicitante.getIdSolicitante01()), null);

		if (listSolicitantes != null && !listSolicitantes.isEmpty()) {

			Solicitantes sol = listSolicitantes.get(0);

			// El telefono de servicio no está en el procedimiento de modificación de datos
			// de la dirección. Lo recuperamos del beneficiario para reenviarlo a la
			// presetadora
			sol.setTlfnoServicio01(solicitantesDao.findBeneficiarioPorIdSolicitante(sol).getTlfnoServicio01());

			// obtener descripción de calle de la direccion
			sol = rellenarCalleDireccion(sol);
			// CabeceraType
			CabeceraType cabecera = OpCambioDomicilio.getCabeceraType(sol, TipoComunicacionEnum.DOMICILIO);
			// DatosDomicilioType
			// solicitante,expediente, informes medicos

			// obtenemos el informe social
			DocumentosInfSocial documentosInfSocial = new DocumentosInfSocial(expedientesSol.getIdExpediente00());
			documentosInfSocial = documentosInfSocialDao.find(documentosInfSocial);
			if (documentosInfSocial != null) {
				// DOKUSI
				T65Content t65Content = this.dokusiService
						.retrieveDocumentOrSuperLocator(documentosInfSocial.getOiddokusi18());
				// nombre documento
				String rutaDondeMover = ParseUtils.crearPathDesdeRutaPif(x87bRutaPIF,
						documentosInfSocial.getIdExpediente00().toString(), documentosInfSocial.getNombreDoc18());

//				documentosInfSocial
//						.setRutaPif(Ad74aPIFws.getInstance().moveDocument(t65Content.getPifId(), rutaDondeMover));
				documentosInfSocial.setRutaPif(this.copiarDocumento(t65Content.getPifId(), rutaDondeMover));

			}

			datosCambioDomicilioType = OpCambioDomicilio.getDatosDomicilioType(sol, documentosInfSocial);

			comunicacion.setCabecera(cabecera);
			comunicacion.setDatosDomicilio(datosCambioDomicilioType);

			PrestadorWSServiceImpl.LOGGER.info("PrestadorWSServiceImpl.crearComunicacionCambioDomicilio - FIN ");

		}
		return comunicacion;
	}

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

//	private List<DispositivosSol> getDispositivosBeneficiario(Long idSolicitante) {
//		DispositivosSol disFind = new DispositivosSol();
//		disFind.setIdSolicitante23(idSolicitante);
//		return this.dispositivosSolDao.findAll(disFind, null);
//	}
}
