package com.ejie.ad74a.jms.service;

import java.util.List;
import java.util.Map;

import org.apache.commons.collections4.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.ejie.ad74a.async.NisaeAsyncProcessService;
import com.ejie.ad74a.dao.BandejaTelematicaDao;
import com.ejie.ad74a.dao.CuentasDao;
import com.ejie.ad74a.dao.DatosInteropDao;
import com.ejie.ad74a.dao.DireccionesDao;
import com.ejie.ad74a.dao.DocumentosBanTelDao;
import com.ejie.ad74a.dao.DocumentosTareaDao;
import com.ejie.ad74a.dao.ExpedientesDao;
import com.ejie.ad74a.dao.MaestroTiposDocDao;
import com.ejie.ad74a.dao.PerfilesDao;
import com.ejie.ad74a.dao.PisosTuteladosDao;
import com.ejie.ad74a.dao.SolicitantesDao;
import com.ejie.ad74a.dao.comun.NoraDao;
import com.ejie.ad74a.exceptions.ConstantesCodeError;
import com.ejie.ad74a.exceptions.ManagerErrors;
import com.ejie.ad74a.jms.util.MessageParser;
import com.ejie.ad74a.jms.util.ModelApplicationParser;
import com.ejie.ad74a.model.BandejaTelematica;
import com.ejie.ad74a.model.Contactos;
import com.ejie.ad74a.model.Cuentas;
import com.ejie.ad74a.model.DatosInterop;
import com.ejie.ad74a.model.Direcciones;
import com.ejie.ad74a.model.DocumentosBanTel;
import com.ejie.ad74a.model.DocumentosTarea;
import com.ejie.ad74a.model.Expedientes;
import com.ejie.ad74a.model.MaestroTiposDoc;
import com.ejie.ad74a.model.Perfiles;
import com.ejie.ad74a.model.PisosTutelados;
import com.ejie.ad74a.model.Solicitantes;
import com.ejie.ad74a.model.TramitesExpediente;
import com.ejie.ad74a.model.comun.Portal;
import com.ejie.ad74a.service.ContactosService;
import com.ejie.ad74a.service.DireccionesService;
import com.ejie.ad74a.service.tramitacion.TareaEntradaDocumentacionService;
import com.ejie.ad74a.service.tramitacion.TramitacionService;
import com.ejie.ad74a.util.comun.Utilidades;
import com.ejie.ad74a.util.comun.UtilidadesFecha;
import com.ejie.ad74a.util.comun.UtilidadesXML;
import com.ejie.ad74a.util.constantes.Constantes;
import com.ejie.ad74a.util.constantes.TareasEnum;
import com.ejie.ad74a.util.constantes.modelos.TipoExpedientes;
import com.ejie.ad74a.ws.client.platea.model.context.ContextSubmissionEvent;
import com.ejie.ad74a.ws.client.platea.model.context.DocumentEvent;
import com.ejie.ad74a.ws.client.platea.model.context.DocumentsEvent;
import com.ejie.ad74a.ws.client.platea.model.ejgvDocument.Ad74aEjgvDocument;
import com.ejie.ad74a.ws.client.platea.model.notification.NotificationBody;
import com.ejie.ad74a.ws.client.platea.service.PlateaService;

/**
 * EntidadesServiceImpl generated by UDA, 21-jul-2021 10:42:45.
 * 
 * @author UDA
 */

@Service(value = "requestJMSService")
public class RequestJMSServiceImpl implements RequestJMSService {

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

	private static final int TRANSACTION_TIMEOUT = 60;

	@Autowired
	private PlateaService plateaService;

	@Autowired
	private ExpedientesDao expedienteDao;

	@Autowired
	private SolicitantesDao solicitanteDao;

	@Autowired
	private CuentasDao cuentasDao;

	@Autowired
	private PerfilesDao perfilesDao;

	@Autowired
	private DireccionesDao direccionesDao;

	@Autowired
	private ContactosService contactosService;

	@Autowired
	private TramitacionService tramitacionService;

	@Autowired
	private BandejaTelematicaDao bandejaTelematicaDao;

	@Autowired
	private DocumentosBanTelDao documentosBanTelDao;

	@Autowired
	private DocumentosTareaDao documentosTareaDao;

	@Autowired
	private MaestroTiposDocDao maestroTiposDocDao;

	@Autowired
	private PisosTuteladosDao pisosTuteladosDao;

	@Autowired
	private DatosInteropDao datosInteropDao;

	@Autowired
	private NisaeAsyncProcessService nisaeAsyncProcessService;

	@Autowired
	private NoraDao noraDao;

	@Autowired
	private DireccionesService direccionesService;

	@Autowired
	private ParserJMSRequest parserRequest;

	@Autowired
	private TareaEntradaDocumentacionService tareaEntradaDocumentacionService;

	@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED, rollbackFor = Throwable.class, timeout = RequestJMSServiceImpl.TRANSACTION_TIMEOUT)
	public void proccesRequest(NotificationBody notificationBody, Map<String, Object> mapaMensaje) throws Throwable {
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesRequest - Inicio");
		// leemos el Platea Type
		String strPlateaType = (String) mapaMensaje.get(Constantes.EVENTO_PLATEA_TYPE);

		if (strPlateaType.equalsIgnoreCase(Constantes.TIPO_SOLICITUD_PLATEA_TELEMATICA)) {
			this.proccesTelematicApplication(notificationBody, mapaMensaje);
		} else if (strPlateaType.equalsIgnoreCase(Constantes.TIPO_SOLICITUD_PLATEA_PRESENCIAL)) {
			this.proccesPresencialApplication(notificationBody, mapaMensaje);
		} else if (strPlateaType.equalsIgnoreCase(Constantes.TIPO_SOLICITUD_PLATEA_INICIO_OFICIO)) {
			this.proccesInicioOficioApplication(notificationBody, mapaMensaje);
			RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesRequest - Inicio de oficio");
		} else if (strPlateaType.equalsIgnoreCase(Constantes.TIPO_SOLICITUD_PLATEA_APORTACION_PRESENCIAL_OFICIO)) {
			this.processAportOficioActions(notificationBody, mapaMensaje);
			RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesRequest - Aportacion de oficio");
		} else {
			RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.tratamientoRequest - Se registra en la bandeja");
			this.processRestActions(notificationBody, mapaMensaje);
		}
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesRequest - Fin");
	}

	private void proccesInicioOficioApplication(NotificationBody notificationBody, Map<String, Object> mapaMensaje)
			throws Throwable {
		// leemos el procedimiento
		String strProcedure = (String) mapaMensaje.get(Constantes.EVENTO_PLATEA_PROCEDURE);

		com.ejie.ad74a.ws.client.platea.model.contextOficio.ContextSubmissionEvent contextSubmissionEvent = this
				.getContextSubmissionInicioOficio(notificationBody);
		switch (strProcedure) {
		case Constantes.Procedimientos.ALTA:
			this.proccesAdminApplicationRegistry(contextSubmissionEvent, mapaMensaje);
			break;
		case Constantes.Procedimientos.BAJA:
			this.proccesAdminApplicantUnsubscribe(contextSubmissionEvent, mapaMensaje);
			break;
		case Constantes.Procedimientos.MODIFICACION:
			this.proccesAdminApplicationModify(contextSubmissionEvent, mapaMensaje);
			break;
		case Constantes.Procedimientos.INFORME_INTERVENCION:
			this.proccesAdminApplicationInterReport(contextSubmissionEvent, mapaMensaje);
			break;
		case Constantes.Procedimientos.NOTIFICACION_LIQUIDACION:
			this.proccesAdminApplicationLiqNot(contextSubmissionEvent, mapaMensaje);
			break;
		case Constantes.Procedimientos.REVISION_PRECIO:
			this.proccesAdminApplicationRevision(contextSubmissionEvent, mapaMensaje);
			break;

		default:
			ManagerErrors.manageError("Procedimiento no existente - strProcedure: " + strProcedure);
		}
	}

	private void proccesAdminApplicationLiqNot(
			com.ejie.ad74a.ws.client.platea.model.contextOficio.ContextSubmissionEvent contextSubmissionEvent,
			Map<String, Object> mapaMensaje) throws Throwable {
		String folderId = contextSubmissionEvent.getFolderID();
		Expedientes expedienteFilter = new Expedientes();
		expedienteFilter.setFolderId00(folderId);

		List<Expedientes> listaExpedientes = expedienteDao.findExpedienteByFolderId(expedienteFilter);
		if (null != listaExpedientes && !listaExpedientes.isEmpty()) {
			Expedientes expediente = listaExpedientes.get(0);
			TramitesExpediente tramiteExp = this.tramitacionService.createNoPlateaTramite(expediente,
					Constantes.PLATEA_TASK_ID_RECEP_SOLICITUD, TareasEnum.APERTURA,
					Constantes.EstadoTramitacion.ESTADO_TRAMITE_PENDIENTE,
					Constantes.EstadoTramitacion.ESTADO_TAREA_FINALIZADA, expediente.getNumRegistro00(),
					expediente.getfRegistro00());

			// tratamos los documentos
			this.proccesDocuments(contextSubmissionEvent, expediente.getIdExpediente00(),
					tramiteExp.getTareasTramites().get(0).getIdTareaTram11().toString());

			// actualizarDatosInteresadosRepresentante(contextSubmissionEvent, expediente);
		} else {
			// Se puede dar el caso de que platea mande el request antes de que nos de
			// tiempo a actualizar el folderID despues del addAdminAdpplication
			ManagerErrors.manageError("El expediente no existe al recibir la request de un inicio de oficio");

		}

	}

	private void proccesAdminApplicationInterReport(
			com.ejie.ad74a.ws.client.platea.model.contextOficio.ContextSubmissionEvent contextSubmissionEvent,
			Map<String, Object> mapaMensaje) throws Throwable {

		String folderId = contextSubmissionEvent.getFolderID();
		Expedientes expedienteFilter = new Expedientes();
		expedienteFilter.setFolderId00(folderId);

		List<Expedientes> listaExpedientes = expedienteDao.findExpedienteByFolderId(expedienteFilter);
		if (null != listaExpedientes && !listaExpedientes.isEmpty()) {
			Expedientes expediente = listaExpedientes.get(0);
			TramitesExpediente tramiteExp = this.tramitacionService.createNoPlateaTramite(expediente,
					Constantes.PLATEA_TASK_ID_RECEP_SOLICITUD, TareasEnum.APERTURA,
					Constantes.EstadoTramitacion.ESTADO_TRAMITE_PENDIENTE,
					Constantes.EstadoTramitacion.ESTADO_TAREA_FINALIZADA, expediente.getNumRegistro00(),
					expediente.getfRegistro00());

			// tratamos los documentos
			this.proccesDocuments(contextSubmissionEvent, expediente.getIdExpediente00(),
					tramiteExp.getTareasTramites().get(0).getIdTareaTram11().toString());

			// actualizarDatosInteresadosRepresentante(contextSubmissionEvent, expediente);
		} else {
			// Se puede dar el caso de que platea mande el request antes de que nos de
			// tiempo a actualizar el folderID despues del addAdminAdpplication
			ManagerErrors.manageError("El expediente no existe al recibir la request de un inicio de oficio");

		}

	}

	private void proccesAdminApplicationModify(
			com.ejie.ad74a.ws.client.platea.model.contextOficio.ContextSubmissionEvent contextSubmissionEvent,
			Map<String, Object> mapaMensaje) throws Throwable {

		String folderId = contextSubmissionEvent.getFolderID();
		Expedientes expedienteFilter = new Expedientes();
		expedienteFilter.setFolderId00(folderId);

		List<Expedientes> listaExpedientes = expedienteDao.findExpedienteByFolderId(expedienteFilter);
		if (null != listaExpedientes && !listaExpedientes.isEmpty()) {
			Expedientes expediente = listaExpedientes.get(0);
			TramitesExpediente tramiteExp = this.tramitacionService.createNoPlateaTramite(expediente,
					Constantes.PLATEA_TASK_ID_RECEP_SOLICITUD, TareasEnum.APERTURA,
					Constantes.EstadoTramitacion.ESTADO_TRAMITE_PENDIENTE,
					Constantes.EstadoTramitacion.ESTADO_TAREA_FINALIZADA, expediente.getNumRegistro00(),
					expediente.getfRegistro00());

			// tratamos los documentos
			this.proccesDocuments(contextSubmissionEvent, expediente.getIdExpediente00(),
					tramiteExp.getTareasTramites().get(0).getIdTareaTram11().toString());

			// actualizarDatosInteresadosRepresentante(contextSubmissionEvent, expediente);
		} else {
			// Se puede dar el caso de que platea mande el request antes de que nos de
			// tiempo a actualizar el folderID despues del addAdminAdpplication
			ManagerErrors.manageError("El expediente no existe al recibir la request de un inicio de oficio");

		}

	}

	private void proccesAdminApplicationRegistry(
			com.ejie.ad74a.ws.client.platea.model.contextOficio.ContextSubmissionEvent contextSubmissionEvent,
			Map<String, Object> mapaMensaje) throws Throwable {
		String folderId = contextSubmissionEvent.getFolderID();
		Expedientes expedienteFilter = new Expedientes();
		expedienteFilter.setFolderId00(folderId);

		List<Expedientes> listaExpedientes = expedienteDao.findExpedienteByFolderId(expedienteFilter);
		if (null != listaExpedientes && !listaExpedientes.isEmpty()) {
			Expedientes expediente = listaExpedientes.get(0);
			TramitesExpediente tramiteExp = this.tramitacionService.createNoPlateaTramite(expediente,
					Constantes.PLATEA_TASK_ID_RECEP_SOLICITUD, TareasEnum.APERTURA,
					Constantes.EstadoTramitacion.ESTADO_TRAMITE_PENDIENTE,
					Constantes.EstadoTramitacion.ESTADO_TAREA_FINALIZADA, expediente.getNumRegistro00(),
					expediente.getfRegistro00());

			// tratamos los documentos
			this.proccesDocuments(contextSubmissionEvent, expediente.getIdExpediente00(),
					tramiteExp.getTareasTramites().get(0).getIdTareaTram11().toString());

			// actualizarDatosInteresadosRepresentante(contextSubmissionEvent, expediente);

		} else {
			// Se puede dar el caso de que platea mande el request antes de que nos de
			// tiempo a actualizar el folderID despues del addAdminAdpplication
			ManagerErrors.manageError("El expediente no existe al recibir la request de un inicio de oficio");

		}

	}

	private void proccesAdminApplicantUnsubscribe(
			com.ejie.ad74a.ws.client.platea.model.contextOficio.ContextSubmissionEvent contextSubmissionEvent,
			Map<String, Object> mapaMensaje) throws Throwable {

		String folderId = contextSubmissionEvent.getFolderID();
		Expedientes expedienteFilter = new Expedientes();
		expedienteFilter.setFolderId00(folderId);

		List<Expedientes> listaExpedientes = expedienteDao.findExpedienteByFolderId(expedienteFilter);
		if (null != listaExpedientes && !listaExpedientes.isEmpty()) {
			Expedientes expediente = listaExpedientes.get(0);
			Solicitantes solicitante = this.solicitanteDao.find(new Solicitantes(expediente.getIdSolicitante00()));
			this.proccesApplicantUnsubscribe(solicitante);

			// generamos el tramite/tarea

			TramitesExpediente tramiteExp = this.tramitacionService.createNoPlateaTramite(expediente,
					Constantes.PLATEA_TASK_ID_RECEP_SOLICITUD, TareasEnum.APERTURA,
					Constantes.EstadoTramitacion.ESTADO_TRAMITE_PENDIENTE,
					Constantes.EstadoTramitacion.ESTADO_TAREA_FINALIZADA, null, null);

			// tratamos los documentos
			this.proccesDocuments(contextSubmissionEvent, expediente.getIdExpediente00(),
					tramiteExp.getTareasTramites().get(0).getIdTareaTram11().toString());

			// actualizarDatosInteresadosRepresentante(contextSubmissionEvent, expediente);

			// tratamos los documentos
//			this.proccesDocuments(contextSubmissionEvent, expediente.getIdExpediente00(),
//					tramiteExp.getTareasTramites().get(0).getIdTareaTram11().toString());

		} else {
			// Se puede dar el caso de que platea mande el request antes de que nos de
			// tiempo a actualizar el folderID despues del addAdminAdpplication
			ManagerErrors.manageError("El expediente no existe al recibir la request de un inicio de oficio");

		}

	}

	private void proccesAdminApplicationRevision(
			com.ejie.ad74a.ws.client.platea.model.contextOficio.ContextSubmissionEvent contextSubmissionEvent,
			Map<String, Object> mapaMensaje) throws Throwable {
		// Lanzamos la interoperabilidad del conyuge.
		String folderId = contextSubmissionEvent.getFolderID();
		Expedientes expedienteFilter = new Expedientes();
		expedienteFilter.setFolderId00(folderId);

		List<Expedientes> listaExpedientes = expedienteDao.findExpedienteByFolderId(expedienteFilter);
		if (null != listaExpedientes && !listaExpedientes.isEmpty()) {
			Expedientes expediente = listaExpedientes.get(0);
			this.consultaInteropConyuge(expediente);

			TramitesExpediente tramiteExp = this.tramitacionService.createNoPlateaTramite(expediente,
					Constantes.PLATEA_TASK_ID_RECEP_SOLICITUD, TareasEnum.APERTURA,
					Constantes.EstadoTramitacion.ESTADO_TRAMITE_PENDIENTE,
					Constantes.EstadoTramitacion.ESTADO_TAREA_FINALIZADA, expediente.getNumRegistro00(),
					expediente.getfRegistro00());

			// tratamos los documentos
			this.proccesDocuments(contextSubmissionEvent, expediente.getIdExpediente00(),
					tramiteExp.getTareasTramites().get(0).getIdTareaTram11().toString());

			// actualizarDatosInteresadosRepresentante(contextSubmissionEvent, expediente);

		} else {
			// Se puede dar el caso de que platea mande el request antes de que nos de
			// tiempo a actualizar el folderID despues del addAdminAdpplication
			ManagerErrors.manageError("El expediente no existe al recibir la request de un inicio de oficio");

		}

	}

	/**
	 * Procesa la solicitud segun el tipo
	 * 
	 * - 0087002: Alta
	 * 
	 * - 0087003: Baja
	 * 
	 * - 0087004: Modificacion
	 * 
	 * - 0087005: Revision precion publico
	 * 
	 * - 0087006: Informe de intervencion
	 * 
	 * @param notificationBody NotificationBody
	 * @param mapaMensaje      Map<String, Object>
	 * @throws Throwable Exception
	 */
	private void proccesTelematicApplication(NotificationBody notificationBody, Map<String, Object> mapaMensaje)
			throws Throwable {

		// leemos el procedimiento
		String strProcedure = (String) mapaMensaje.get(Constantes.EVENTO_PLATEA_PROCEDURE);

		ContextSubmissionEvent contextSubmissionEvent = this.getContextSubmission(notificationBody);

		switch (strProcedure) {

		case Constantes.Procedimientos.ALTA:
			this.proccesApplicationRegistry(contextSubmissionEvent, mapaMensaje);
			break;

		case Constantes.Procedimientos.BAJA:
			this.proccesApplicationUnsubscribe(contextSubmissionEvent, mapaMensaje);
			break;

		case Constantes.Procedimientos.MODIFICACION:
			this.proccesApplicationModify(contextSubmissionEvent, mapaMensaje);
			break;

		case Constantes.Procedimientos.REVISION_PRECIO:
			this.proccesApplicationRevision(contextSubmissionEvent, mapaMensaje);
			break;

		case Constantes.Procedimientos.INFORME_INTERVENCION:
			this.proccesApplicationInterReport(contextSubmissionEvent, mapaMensaje);
			break;
		default:
			ManagerErrors.manageError("Procedimiento no existente - strProcedure: " + strProcedure);
		}

	}

	/**
	 * Procesa la solicitud presencial segun el tipo
	 * 
	 * - 0087002: Alta
	 * 
	 * - 0087003: Baja
	 * 
	 * - 0087004: Modificacion
	 * 
	 * - 0087005: Revision precion publico
	 * 
	 * - 0087006: Informe de intervencion
	 * 
	 * @param notificationBody NotificationBody
	 * @param mapaMensaje      Map<String, Object>
	 * @throws Throwable Exception
	 */
	private void proccesPresencialApplication(NotificationBody notificationBody, Map<String, Object> mapaMensaje)
			throws Throwable {

		// leemos el procedimiento
		String strProcedure = (String) mapaMensaje.get(Constantes.EVENTO_PLATEA_PROCEDURE);

		ContextSubmissionEvent contextSubmissionEvent = this.getContextSubmission(notificationBody);

		// las solicitudes de papel 0 no hay que tratarlas como las normales
		// grabamos los datos de registros
		switch (strProcedure) {

		case Constantes.Procedimientos.ALTA:
			this.proccesApplicationRegistryPresencial(contextSubmissionEvent, mapaMensaje);
			break;
		case Constantes.Procedimientos.BAJA:
			this.proccesApplicationUnsubscribePresencial(contextSubmissionEvent, mapaMensaje);
			break;
		case Constantes.Procedimientos.MODIFICACION:
			this.proccesApplicationModifyPresencial(contextSubmissionEvent, mapaMensaje);
			break;
		case Constantes.Procedimientos.REVISION_PRECIO:
			this.proccesApplicationRevisionPresencial(contextSubmissionEvent, mapaMensaje);
			break;
		case Constantes.Procedimientos.INFORME_INTERVENCION:
			this.proccesApplicationInterReportPresencial(contextSubmissionEvent, mapaMensaje);
			break;
		default:
			ManagerErrors.manageError("Procedimiento no existente - strProcedure: " + strProcedure);
		}

	}

	/**
	 * Procesa los datos de la solicitud.
	 * 
	 * - Guarda en BBDD los datos de la persona solicitante
	 * 
	 * - Guarda en BBDD los datos de los contactos
	 * 
	 * - Guarda en BBDD los datos del expediente
	 * 
	 * @param notificationBody NotificationBody
	 * @param mapaMensaje      Map<String, Object>
	 * @throws Throwable Exception
	 */
	private void proccesApplicationRegistry(ContextSubmissionEvent contextSubmissionEvent,
			Map<String, Object> mapaMensaje) throws Throwable {
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesApplicationRegistry - Inicio");

		// ContextSubmissionEvent contextSubmissionEvent =
		// this.getContextSubmission(notificationBody);

		Ad74aEjgvDocument ejgvDocument = this.getEJGVDocument(contextSubmissionEvent);

		// tratamos los datos de la cuenta
		Cuentas cuenta = this.proccesBankAccount(ejgvDocument);

		// tratamos los datos de la direccion
		Direcciones direccion = this.proccesAddress(ejgvDocument);

		// tratamos los datos del perfil
		Perfiles perfil = this.proccesProfile(ejgvDocument, direccion);

		// tratamos los datos del solicitante
		int codErrorExpediente = Constantes.ErroresExpediente.SIN_ERRORES;
		if (existApplicant(ejgvDocument.getBody().getApplicantInfoRRI().getInterestedListRRI().get(0).getInterestedRRI()
				.getID())) {
			codErrorExpediente = Constantes.ErroresExpediente.SOLICITANTE_YA_EXISTE_ALTA;
		}

		Solicitantes solicitante = this.proccesApplicant(ejgvDocument, cuenta, perfil, direccion);

		// tratamos los datos de la direccion de notificacion
		Direcciones direccionNotif = this.proccesAddressNotif(ejgvDocument);

		// tratamos los datos del expediente
		Expedientes expediente = this.proccesProceeding(ejgvDocument, contextSubmissionEvent, solicitante, cuenta,
				perfil, direccion, null != direccionNotif ? direccionNotif.getIdDireccion06() : null,
				codErrorExpediente);

		// tratamos los datos de los contactos
		List<Contactos> listaContactos = this.proccesContacts(ejgvDocument, solicitante.getIdSolicitante01(),
				expediente.getIdExpediente00());

		// Almacenamos los datos de la request en la bandeja telematica
		this.tratamientoBandejaTelematica(contextSubmissionEvent);

		// generamos el tramite/tarea
		String numRegistro = contextSubmissionEvent.getRegistryNumber();
		String fechaRegistro = contextSubmissionEvent.getRegistryTimestamp();
		TramitesExpediente tramiteExp = this.tramitacionService.createNoPlateaTramite(expediente,
				Constantes.PLATEA_TASK_ID_RECEP_SOLICITUD, TareasEnum.APERTURA,
				Constantes.EstadoTramitacion.ESTADO_TRAMITE_PENDIENTE,
				Constantes.EstadoTramitacion.ESTADO_TAREA_FINALIZADA, numRegistro,
				UtilidadesFecha.parsearFechaPlatea(fechaRegistro));

		// tratamos los documentos
		this.proccesDocuments(contextSubmissionEvent, expediente.getIdExpediente00(),
				tramiteExp.getTareasTramites().get(0).getIdTareaTram11().toString());

		this.invokeInteroperabilidades(expediente, perfil);

		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesApplicationRegistry - Fin");
	}

	/**
	 * Procesa los datos de la solicitud de baja.
	 * 
	 * 
	 * @param notificationBody NotificationBody
	 * @param mapaMensaje      Map<String, Object>
	 * @throws Throwable Exception
	 */
	private void proccesApplicationUnsubscribe(ContextSubmissionEvent contextSubmissionEvent,
			Map<String, Object> mapaMensaje) throws Throwable {
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesApplicationUnsubscribe - Inicio");
		// ContextSubmissionEvent contextSubmissionEvent =
		// this.getContextSubmission(notificationBody);
		String folderId = contextSubmissionEvent.getFolderID();

		Ad74aEjgvDocument ejgvDocument = this.getEJGVDocument(contextSubmissionEvent);

		// tratamos los datos del solicitante
		String dniSolicitante = ejgvDocument.getBody().getApplicantInfoRRI().getInterestedListRRI().get(0)
				.getInterestedRRI().getID();
		Solicitantes solicitante = getApplicant(dniSolicitante);
		Direcciones direccion = null;
		Perfiles perfil = null;
		Cuentas cuenta = null;

		int codErrorExpediente = Constantes.ErroresExpediente.SIN_ERRORES;
		if (null != solicitante) {
			direccion = solicitante.getDirecciones();
			perfil = solicitante.getPerfiles();
			cuenta = solicitante.getCuentas();

			// tratamos los datos del solicitante
			this.proccesApplicantUnsubscribe(solicitante);

			// hay que mirar si hay algun otro expediente de baja par ese solicitante
			if (yaExisteProcedimientoEnRegistro(dniSolicitante,
					ejgvDocument.getBody().getBasicInfo().getProcedureID())) {
				codErrorExpediente = Constantes.ErroresExpediente.YA_EXISTE_EXPEDIENTE_PENDIENTE;
			}
		} else {
			RequestJMSServiceImpl.logger.debug(
					"RequestJMSServiceImpl.proccesApplicationUnsubscribe - No existe el solicitante para el expediente de baja folderId: "
							+ folderId);
			codErrorExpediente = Constantes.ErroresExpediente.SOLICITANTE_NO_EXISTE;
			// tratamos los datos del solicitante
			solicitante = this.proccesApplicant(ejgvDocument, cuenta, perfil, direccion);

		}

		// tratamos los datos de la direccion de notificacion
		Direcciones direccionNotif = this.proccesAddressNotif(ejgvDocument);

		// tratamos los datos del expediente
		Expedientes expediente = this.proccesProceeding(ejgvDocument, contextSubmissionEvent, solicitante, cuenta,
				perfil, direccion, null != direccionNotif ? direccionNotif.getIdDireccion06() : null,
				codErrorExpediente);

		// tratamos los datos de los contactos
		List<Contactos> listaContactos = this.proccesContacts(ejgvDocument, solicitante.getIdSolicitante01(),
				expediente.getIdExpediente00());

		// Almacenamos los datos de la request en la bandeja telematica
		this.tratamientoBandejaTelematica(contextSubmissionEvent);

		// generamos el tramite/tarea
		String numRegistro = contextSubmissionEvent.getRegistryNumber();
		String fechaRegistro = contextSubmissionEvent.getRegistryTimestamp();
		TramitesExpediente tramiteExp = this.tramitacionService.createNoPlateaTramite(expediente,
				Constantes.PLATEA_TASK_ID_RECEP_SOLICITUD_BAJA, TareasEnum.APERTURA,
				Constantes.EstadoTramitacion.ESTADO_TRAMITE_PENDIENTE,
				Constantes.EstadoTramitacion.ESTADO_TAREA_FINALIZADA, numRegistro,
				UtilidadesFecha.parsearFechaPlatea(fechaRegistro));

		// tratamos los documentos
		this.proccesDocuments(contextSubmissionEvent, expediente.getIdExpediente00(),
				tramiteExp.getTareasTramites().get(0).getIdTareaTram11().toString());

		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesApplicationUnsubscribe - Fin");
	}

	/**
	 * Procesa los datos de la solicitud de modificacion.
	 * 
	 * 
	 * @param notificationBody NotificationBody
	 * @param mapaMensaje      Map<String, Object>
	 * @throws Throwable Exception
	 */
	private void proccesApplicationModify(ContextSubmissionEvent contextSubmissionEvent,
			Map<String, Object> mapaMensaje) throws Throwable {
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesApplicationModify - Inicio");

		Ad74aEjgvDocument ejgvDocument = this.getEJGVDocument(contextSubmissionEvent);

		// tratamos los datos del solicitante
		String dniSolicitante = ejgvDocument.getBody().getApplicantInfoRRI().getInterestedListRRI().get(0)
				.getInterestedRRI().getID();
		// Solicitantes solicitante = getApplicant(dniSolicitante);

		Perfiles perfil = null;
		Cuentas cuenta = null;
		try {
			// Intentamos recuperar el perfil del beneficiario para no perder datos al
			// actualizar al resolver.
			Solicitantes beneficiarioFilter = new Solicitantes();
			beneficiarioFilter.setIdentificador01(ejgvDocument.getBody().getApplicantInfoRRI().getInterestedListRRI()
					.get(0).getInterestedRRI().getID());
			Solicitantes beneficiario = this.solicitanteDao.findPorDni(beneficiarioFilter);
			if (beneficiario != null) {
				perfil = this.perfilesDao.find(beneficiario.getPerfiles());
				perfil.setIdPerfil07(null);
			}
		} catch (Exception e) {
			RequestJMSServiceImpl.logger.error(
					"RequestJMSServiceImpl.proccesApplicationModify - Error al recuperar el perfil del beneficiario");
		}

		// tratamos los datos de la direccion
		Direcciones direccion = this.proccesAddress(ejgvDocument);

		// tratamos los datos del piso tutelado
		perfil = this.asignarPisoTutelado(direccion, perfil);
		perfil = this.perfilesDao.add(perfil);

		int codErrorExpediente = Constantes.ErroresExpediente.SIN_ERRORES;
		if (yaExisteProcedimientoEnRegistro(dniSolicitante, ejgvDocument.getBody().getBasicInfo().getProcedureID())) {
			codErrorExpediente = Constantes.ErroresExpediente.YA_EXISTE_EXPEDIENTE_PENDIENTE;
		}
//			if (null != solicitante) {
//			perfil = solicitante.getPerfiles();
//			cuenta = solicitante.getCuentas();
//
//			// hay que mirar si hay algun otro expediente de baja par ese solicitante
//			if (yaExisteProcedimientoEnRegistro(dniSolicitante,
//					ejgvDocument.getBody().getBasicInfo().getProcedureID())) {
//				codErrorExpediente = Constantes.ErroresExpediente.YA_EXISTE_EXPEDIENTE_PENDIENTE;
//			}
//		} else {
//			RequestJMSServiceImpl.logger.debug(
//					"RequestJMSServiceImpl.proccesApplicationModify - No existe el solicitante para el expediente de baja folderId: "
//							+ folderId);
//			codErrorExpediente = Constantes.ErroresExpediente.SOLICITANTE_NO_EXISTE;
//
//			// tratamos los datos del solicitante
//			solicitante = this.proccesApplicant(ejgvDocument, cuenta, perfil, direccion);
//		}
		Solicitantes solicitante = this.proccesApplicant(ejgvDocument, cuenta, perfil, direccion);

		// tratamos los datos de la direccion de notificacion
		Direcciones direccionNotif = this.proccesAddressNotif(ejgvDocument);

		// tratamos los datos del expediente
		Expedientes expediente = this.proccesProceeding(ejgvDocument, contextSubmissionEvent, solicitante, cuenta,
				perfil, direccion, null != direccionNotif ? direccionNotif.getIdDireccion06() : null,
				codErrorExpediente);

		// tratamos los datos de los contactos
//		List<Contactos> listaContactos = this.proccesContacts(ejgvDocument, solicitante.getIdSolicitante01(),
//				expediente.getIdExpediente00());

		// Almacenamos los datos de la request en la bandeja telematica
		this.tratamientoBandejaTelematica(contextSubmissionEvent);

		// generamos el tramite/tarea
		String numRegistro = contextSubmissionEvent.getRegistryNumber();
		String fechaRegistro = contextSubmissionEvent.getRegistryTimestamp();
		TramitesExpediente tramiteExp = this.tramitacionService.createNoPlateaTramite(expediente,
				Constantes.PLATEA_TASK_ID_RECEP_SOLICITUD_MODIF, TareasEnum.APERTURA,
				Constantes.EstadoTramitacion.ESTADO_TRAMITE_PENDIENTE,
				Constantes.EstadoTramitacion.ESTADO_TAREA_FINALIZADA, numRegistro,
				UtilidadesFecha.parsearFechaPlatea(fechaRegistro));

		// tratamos los documentos
		this.proccesDocuments(contextSubmissionEvent, expediente.getIdExpediente00(),
				tramiteExp.getTareasTramites().get(0).getIdTareaTram11().toString());

		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesApplicationModify - Fin");
	}

	/**
	 * Procesa los datos de la solicitud de revision del precio.
	 * 
	 * 
	 * @param notificationBody NotificationBody
	 * @param mapaMensaje      Map<String, Object>
	 * @throws Throwable Exception
	 */
	private void proccesApplicationRevision(ContextSubmissionEvent contextSubmissionEvent,
			Map<String, Object> mapaMensaje) throws Throwable {
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesApplicationRevision - Inicio");

		// ContextSubmissionEvent contextSubmissionEvent =
		// this.getContextSubmission(notificationBody);
		String folderId = contextSubmissionEvent.getFolderID();

		Ad74aEjgvDocument ejgvDocument = this.getEJGVDocument(contextSubmissionEvent);

		// tratamos los datos del solicitante
		String dniSolicitante = ejgvDocument.getBody().getApplicantInfoRRI().getInterestedListRRI().get(0)
				.getInterestedRRI().getID();
		Solicitantes solicitante = getApplicant(dniSolicitante);
		Perfiles perfil = null;
		Cuentas cuenta = null;
		Direcciones direccion = null;
		int codErrorExpediente = Constantes.ErroresExpediente.SIN_ERRORES;
		if (null != solicitante) {
			perfil = solicitante.getPerfiles();
			cuenta = solicitante.getCuentas();
			direccion = solicitante.getDirecciones();

			// hay que mirar si hay algun otro expediente de baja par ese solicitante
			if (yaExisteProcedimientoEnRegistro(dniSolicitante,
					ejgvDocument.getBody().getBasicInfo().getProcedureID())) {
				codErrorExpediente = Constantes.ErroresExpediente.YA_EXISTE_EXPEDIENTE_PENDIENTE;
			}
		} else {
			RequestJMSServiceImpl.logger.debug(
					"RequestJMSServiceImpl.proccesApplicationRevision - No existe el solicitante para el expediente de revision de precio publico folderId: "
							+ folderId);
			codErrorExpediente = Constantes.ErroresExpediente.SOLICITANTE_NO_EXISTE;
			// tratamos los datos del solicitante
			solicitante = this.proccesApplicant(ejgvDocument, cuenta, perfil, direccion);
		}

		// tratamos los datos de la direccion de notificacion
		Direcciones direccionNotif = this.proccesAddressNotif(ejgvDocument);

		// tratamos los datos del expediente
		Expedientes expediente = this.proccesProceeding(ejgvDocument, contextSubmissionEvent, solicitante, cuenta,
				perfil, direccion, null != direccionNotif ? direccionNotif.getIdDireccion06() : null,
				codErrorExpediente);

		// tratamos los datos de los contactos
		List<Contactos> listaContactos = this.proccesContacts(ejgvDocument, solicitante.getIdSolicitante01(),
				expediente.getIdExpediente00());

		// Almacenamos los datos de la request en la bandeja telematica
		this.tratamientoBandejaTelematica(contextSubmissionEvent);

		// generamos el tramite/tarea
		String numRegistro = contextSubmissionEvent.getRegistryNumber();
		String fechaRegistro = contextSubmissionEvent.getRegistryTimestamp();
		TramitesExpediente tramiteExp = this.tramitacionService.createNoPlateaTramite(expediente,
				Constantes.PLATEA_TASK_ID_RECEP_SOLICITUD_REVISION, TareasEnum.APERTURA,
				Constantes.EstadoTramitacion.ESTADO_TRAMITE_PENDIENTE,
				Constantes.EstadoTramitacion.ESTADO_TAREA_FINALIZADA, numRegistro,
				UtilidadesFecha.parsearFechaPlatea(fechaRegistro));

		// tratamos los documentos
		this.proccesDocuments(contextSubmissionEvent, expediente.getIdExpediente00(),
				tramiteExp.getTareasTramites().get(0).getIdTareaTram11().toString());

		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesApplicationRevision - Fin");
	}

	/**
	 * Procesa los datos de la solicitud de informe de intervencion.
	 * 
	 * 
	 * @param notificationBody NotificationBody
	 * @param mapaMensaje      Map<String, Object>
	 * @throws Throwable Exception
	 */
	private void proccesApplicationInterReport(ContextSubmissionEvent contextSubmissionEvent,
			Map<String, Object> mapaMensaje) throws Throwable {
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesApplicationInterReport - Inicio");

		// ContextSubmissionEvent contextSubmissionEvent =
		// this.getContextSubmission(notificationBody);
		String folderId = contextSubmissionEvent.getFolderID();

		Ad74aEjgvDocument ejgvDocument = this.getEJGVDocument(contextSubmissionEvent);

		// tratamos los datos del solicitante
		String dniSolicitante = ejgvDocument.getBody().getApplicantInfoRRI().getInterestedListRRI().get(0)
				.getInterestedRRI().getID();
		Solicitantes solicitante = getApplicant(dniSolicitante);
		Perfiles perfil = null;
		Cuentas cuenta = null;
		Direcciones direccion = null;
		int codErrorExpediente = Constantes.ErroresExpediente.SIN_ERRORES;
		if (null != solicitante) {
			perfil = solicitante.getPerfiles();
			cuenta = solicitante.getCuentas();
			direccion = solicitante.getDirecciones();

			// hay que mirar si hay algun otro expediente de baja par ese solicitante
			if (yaExisteProcedimientoEnRegistro(dniSolicitante,
					ejgvDocument.getBody().getBasicInfo().getProcedureID())) {
				codErrorExpediente = Constantes.ErroresExpediente.YA_EXISTE_EXPEDIENTE_PENDIENTE;
			}
		} else {
			RequestJMSServiceImpl.logger.debug(
					"RequestJMSServiceImpl.proccesApplicationInterReport - No existe el solicitante para el expediente de informe de intervención folderId: "
							+ folderId);
			codErrorExpediente = Constantes.ErroresExpediente.SOLICITANTE_NO_EXISTE;
			// tratamos los datos del solicitante
			solicitante = this.proccesApplicant(ejgvDocument, cuenta, perfil, direccion);
		}

		// tratamos los datos de la direccion de notificacion
		Direcciones direccionNotif = this.proccesAddressNotif(ejgvDocument);

		// tratamos los datos del expediente
		Expedientes expediente = this.proccesProceeding(ejgvDocument, contextSubmissionEvent, solicitante, cuenta,
				perfil, direccion, null != direccionNotif ? direccionNotif.getIdDireccion06() : null,
				codErrorExpediente);

		// tratamos los datos de los contactos
		List<Contactos> listaContactos = this.proccesContacts(ejgvDocument, solicitante.getIdSolicitante01(),
				expediente.getIdExpediente00());

		// Almacenamos los datos de la request en la bandeja telematica
		this.tratamientoBandejaTelematica(contextSubmissionEvent);

		// generamos el tramite/tarea
		String numRegistro = contextSubmissionEvent.getRegistryNumber();
		String fechaRegistro = contextSubmissionEvent.getRegistryTimestamp();
		TramitesExpediente tramiteExp = this.tramitacionService.createNoPlateaTramite(expediente,
				Constantes.PLATEA_TASK_ID_RECEP_SOLICITUD_INF_INTERVENCION, TareasEnum.APERTURA,
				Constantes.EstadoTramitacion.ESTADO_TRAMITE_PENDIENTE,
				Constantes.EstadoTramitacion.ESTADO_TAREA_FINALIZADA, numRegistro,
				UtilidadesFecha.parsearFechaPlatea(fechaRegistro));

		// tratamos los documentos
		this.proccesDocuments(contextSubmissionEvent, expediente.getIdExpediente00(),
				tramiteExp.getTareasTramites().get(0).getIdTareaTram11().toString());

		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesApplicationInterReport - Fin");
	}

	private void tratamientoBandejaTelematica(ContextSubmissionEvent contextSubmissionEvent) throws Throwable {
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.tratamientoBandejaTelematica - Inicio");
		try {
			BandejaTelematica bandeja = this.parserRequest.getBandejaTelematicaEjgv(contextSubmissionEvent);
			bandeja = this.bandejaTelematicaDao.add(bandeja);

			// Guardar los documentos en la BBDD
			DocumentosBanTel docEntrada;
			for (DocumentEvent documento : contextSubmissionEvent.getDocumentsEvent().getDocumentEvent()) {
				if (!Utilidades.esBlancoNulo(documento.getOid())) {
					docEntrada = this.parserRequest.getDocumentoBandejaFromDocumentEvent(documento, bandeja);
					this.documentosBanTelDao.add(docEntrada);
				}
			}

		} catch (Exception e) {
			RequestJMSServiceImpl.logger.error("Error al grabar la bandeja");
			ManagerErrors.manageException(e, ConstantesCodeError.MENSAJE_ERROR_GRABAR_BANDEJA, null,
					ConstantesCodeError.CODE_ERROR_GRABAR_BANDEJA, null);
		}

		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.tratamientoBandejaTelematica - Fin");

	}

	/**
	 * Procesa los datos propios del expediente
	 * 
	 * @param ejgvDocument           Ad74aEjgvDocument
	 * @param contextSubmissionEvent ContextSubmissionEvent
	 * @param solicitante            Solicitantes
	 * @param listaContactos         List<Contactos>
	 * @param cuenta                 Cuentas
	 * @param perfil                 Perfiles
	 * @param erroresExpediente      Si el expediente viene con errores de las bajas
	 *                               o modificaciones
	 * @return Expedientes
	 * @throws Throwable Exception
	 */
	private Expedientes proccesProceeding(Ad74aEjgvDocument ejgvDocument, ContextSubmissionEvent contextSubmissionEvent,
			Solicitantes solicitante, Cuentas cuenta, Perfiles perfil, Direcciones direccion, Long idDireccionNotif,
			Integer erroresExpediente) throws Throwable {
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesProceeding - Inicio");

		String folderId = contextSubmissionEvent.getFolderID();

		Expedientes expediente = new Expedientes();
		expediente.setFolderId00(folderId);

		List<Expedientes> listaExpedientes = expedienteDao.findExpedienteByFolderId(expediente);
		if (null != listaExpedientes && !listaExpedientes.isEmpty()) {
			logger.info("El expediente existe");
			expediente = listaExpedientes.get(0);
			ManagerErrors.manageError("El expediente ya existe");
			// expedientesService.update(expediente);
		} else {
			expediente = ModelApplicationParser.getProceedingFromEjgv(ejgvDocument, contextSubmissionEvent);
			// cargamos las FK
			expediente.setSolicitantes(new Solicitantes(solicitante.getIdSolicitante01()));
			if (null != cuenta) {
				expediente.setCuentas(cuenta);
			}
			if (null != perfil) {
				expediente.setPerfiles(perfil);
			}
			if (null != direccion) {
				expediente.setDirecciones(direccion);
			}

			expediente.setErrorExpediente00(erroresExpediente);

			// recuperamos los documentos aportados
			DocumentsEvent listaDocumentos = contextSubmissionEvent.getDocumentsEvent();
			// si tiene documento de urgencia, el expediente es urgente
			for (DocumentEvent docEvent : listaDocumentos.getDocumentEvent()) {
				if (docEvent.getRoleId().equalsIgnoreCase(Constantes.RolesIDDocumentos.DOC_URGENCIA)) {
					if (!Utilidades.esBlancoNulo(docEvent.getOid())) {
						expediente.setUrgencia00(TipoExpedientes.urgencia00.SI.getId());
					}
					break;
				}
			}

			// direccion de notificacion
			expediente.setIdDireccionNotif00(idDireccionNotif);

			// cargamos si el expediente es con representante o no
			if (!Utilidades.esBlancoNulo(contextSubmissionEvent.getSenderType()) && contextSubmissionEvent
					.getSenderType().equalsIgnoreCase(Constantes.PresentaSolicitud.PLATEA_CON_REPRESENTANTE)) {
				expediente.setPresentaSol00(Constantes.PresentaSolicitud.REPRESENTANTE);
			} else {
				expediente.setPresentaSol00(Constantes.PresentaSolicitud.INTERESADO);
			}
			// [jbhg] por defecto no se opone a la interoperabilidad
			expediente.setSeOpone00(Constantes.OponerDssRecabarinfo.NO_SE_OPONE);

			logger.info("El expediente no existe, procedemos a grabarlo");
			try {
				expediente = expedienteDao.add(expediente);
			} catch (Exception e) {
				RequestJMSServiceImpl.logger.error("Error al grabar el expediente");
				ManagerErrors.manageException(e, ConstantesCodeError.MENSAJE_ERROR_GRABAR_EXPEDIENTE, null,
						ConstantesCodeError.CODE_ERROR_GRABAR_EXPEDIENTE, null);
			}
		}
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesProceeding - Fin");
		return expediente;
	}

	/**
	 * Procesa los datos del solicitante
	 * 
	 * @param ejgvDocument Ad74aEjgvDocument
	 * @return Solicitantes
	 * @throws Throwable Exception
	 */
	private Solicitantes proccesApplicant(Ad74aEjgvDocument ejgvDocument, Cuentas cuenta, Perfiles perfil,
			Direcciones direccion) throws Throwable {
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesApplicant - Inicio");

		Solicitantes solicitante = new Solicitantes();

		// la damos de alta
		solicitante = ModelApplicationParser.getApplicantFromEjgv(ejgvDocument);
		// cargamos las FK
		solicitante.setCuentas(cuenta);
		solicitante.setPerfiles(perfil);
		solicitante.setDirecciones(direccion);

		// entidad.setUsuAlta21(UtilSeguridad.getUsuarioConectvado().getUserName());
		try {
			solicitante = this.solicitanteDao.add(solicitante);
		} catch (Exception e) {
			RequestJMSServiceImpl.logger.error("Error al dar de alta el solicitante: " + e.getMessage());
			ManagerErrors.manageException(e, ConstantesCodeError.MENSAJE_ERROR_GRABAR_SOLICITANTE, null,
					ConstantesCodeError.CODE_ERROR_GRABAR_SOLICITANTE, null);
		}

		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesApplicant - Fin");
		return solicitante;
	}

	/**
	 * Se trata el solicitante para el procedimiento de baja
	 * 
	 * - Si existe otro beneficiario al recepcionar la solicitud, se marcara el
	 * campo mantenerInstalacion
	 * 
	 * @param ejgvDocument
	 * @return
	 * @throws Throwable
	 */
	private Solicitantes proccesApplicantUnsubscribe(Solicitantes solicitante) throws Throwable {
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesApplicantUnsubscribe - Inicio");

		// hay que buscar Un beneficiario en la misma casa que siga dado de alta

		if (Constantes.beneficiario01.BENEFICIARIO.getId().equals(solicitante.getBeneficiario01())) {

			List<Solicitantes> listSolicitantes = null;
			solicitante.setDirecciones(this.direccionesService.find(solicitante.getDirecciones()));
			if (solicitante.getDirecciones() != null && solicitante.getDirecciones().getIdPortal06() != null) {
				Portal port = new Portal();
				port.setCodPortal(solicitante.getDirecciones().getIdPortal06());
				port = this.noraDao.findPortal(port);
				solicitante.getDirecciones().setPortal06(port.getPortal());
			}
			try {
				listSolicitantes = this.solicitanteDao.findSameDirectionBenefActivo(solicitante.getDirecciones(),
						solicitante.getIdentificador01(), solicitante.getTlfnoServicio01(), null);
			} catch (Exception e) {
				RequestJMSServiceImpl.logger.error(
						"RequestJMSServiceImpl.proccesApplicantUnsubscribe - No se ha podido encontrar instalación al beneficiario - No se mantendra instalación");
			}
			if (null != listSolicitantes && !listSolicitantes.isEmpty()) {

				solicitante.setMantenerInst01(Constantes.MantenerInstalacion.MANTENER_SI);
				solicitante.setUsuModif01(com.ejie.ad74a.constantes.Constantes.COD_APLICACION);
				this.solicitanteDao.updateMantInst(solicitante);
			}
		}
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesApplicantUnsubscribe - Fin");
		return solicitante;
	}

	/**
	 * Procesa los datos de los contactos
	 * 
	 * - Se recupera el representante si lo hay
	 * 
	 * - Se recuperan el resto de contactos
	 * 
	 * @param ejgvDocument Ad74aEjgvDocument
	 * @param solicitante  Solicitantes
	 * @return listaContactos List<Contactos>
	 * @throws Throwable Exception
	 */
	private List<Contactos> proccesContacts(Ad74aEjgvDocument ejgvDocument, Long idSolicitante, Long idExpediente)
			throws Throwable {
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesContacts - Inicio");

		List<Contactos> listaContactos = ModelApplicationParser.getContactsFromEjgv(ejgvDocument);
		if (null != listaContactos && listaContactos.size() > 0) {
			for (Contactos contacto : listaContactos) {
				this.contactosService.add(contacto, idSolicitante, idExpediente);
			}
		}
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesContacts - Fin");
		return listaContactos;
	}

	/**
	 * Procesa los datos de la cuenta bancaria
	 * 
	 * @param ejgvDocument Ad74aEjgvDocument
	 * @return cuenta
	 * @throws Throwable Exception
	 */
	private Cuentas proccesBankAccount(Ad74aEjgvDocument ejgvDocument) throws Throwable {
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesBankAccount - Inicio");

		Cuentas cuenta = ModelApplicationParser.getBankAccount(ejgvDocument);
		cuenta = this.cuentasDao.add(cuenta);
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesBankAccount - Fin");
		return cuenta;
	}

	/**
	 * Procesa los datos del perfil
	 * 
	 * @param ejgvDocument Ad74aEjgvDocument
	 * @return Perfiles
	 * @throws Throwable Exception
	 */
	private Perfiles proccesProfile(Ad74aEjgvDocument ejgvDocument, Direcciones direccion) throws Throwable {
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesProfile - Inicio");

		Perfiles perfil = ModelApplicationParser.getProfile(ejgvDocument);

		asignarPisoTutelado(direccion, perfil);

		perfil = this.perfilesDao.add(perfil);
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesProfile - Fin");
		return perfil;
	}

	private Perfiles asignarPisoTutelado(Direcciones direccion, Perfiles perfil) {
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.asignarPisoTutelado - Inicio");
		// mirar si es piso tutelado
		if (perfil == null) {
			perfil = new Perfiles();
		}
		perfil.setPisoTutelado07(Constantes.PisoTutelado.NO_ESTA);
		if (null != direccion) {
			PisosTutelados pisoTu = isPisoTutelado(direccion);
			if (null != pisoTu) {
				perfil.setPisoTutelado07(Constantes.PisoTutelado.ESTA);
				perfil.setPisosTutelados(pisoTu);
			}
		}
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.asignarPisoTutelado - Fin");
		return perfil;

	}

	/**
	 * Procesa los datos de direccion
	 * 
	 * @param ejgvDocument Ad74aEjgvDocument
	 * @return Direcciones
	 * @throws Throwable Exception
	 */
	private Direcciones proccesAddress(Ad74aEjgvDocument ejgvDocument) throws Throwable {
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesAddress - Inicio");

		Direcciones direccion = ModelApplicationParser.getAddress(ejgvDocument);

		direccion = this.direccionesDao.add(direccion);
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesAddress - Fin");
		return direccion;
	}

	/**
	 * Procesa los datos de direccion de notificacion
	 * 
	 * @param ejgvDocument Ad74aEjgvDocument
	 * @return Direcciones
	 * @throws Throwable Exception
	 */
	private Direcciones proccesAddressNotif(Ad74aEjgvDocument ejgvDocument) throws Throwable {
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesAddressNotif - Inicio");

		Direcciones direccion = ModelApplicationParser.getAddressNotification(ejgvDocument);
		if (null != direccion) {
			RequestJMSServiceImpl.logger
					.info("RequestJMSServiceImpl.proccesAddressNotif - Con direccion de notificacion");
			direccion = this.direccionesDao.add(direccion);
		}

		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesAddressNotif - Fin");
		return direccion;
	}

	/**
	 * Procesa los documentos
	 * 
	 * @param contextSubmissionEvent Ad74aEjgvDocument
	 * @param codExpediente          Long
	 * @param idTarea                String
	 * @throws Throwable Exception
	 */
	public void proccesDocuments(ContextSubmissionEvent contextSubmissionEvent, Long codExpediente, String idTarea)
			throws Throwable {
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesDocuments - Inicio");

		/**
		 * - PRE: Documento de la solicitud electrónica; el ejgvDocument firmado.
		 * 
		 * - PNS: Documento de solicitud electrónica sin firma.
		 * 
		 * - DAD: Documento adjuntado por la ciudadanía y almacenado en dokusi. En este
		 * caso viene un oid de Dokusi.
		 * 
		 * - DOC: Documento a compartir. (dokusiID). No admite formato (format) papel.
		 * Documento previamente adjuntado por la ciudadanía y almacenado en dokusi. En
		 * este caso viene un oid de Dokusi. Este documento se compartirá y se generará
		 * un nuevo oid relacionado con el oid pasado como parámetro.
		 * 
		 * - DOT: Documento a asociar con el expediente (dokusiID). Documento adjuntado
		 * por el ciudadano y NO almacenado en Dokusi.. En este caso viene una ruta PIF
		 * y es la PPS la que se encarga de subir el documento a Dokusi
		 * 
		 * - TRA: Autorización sustitutiva de documento (traza) (dokusiID). Traza
		 * administrativa del documento • DCA: Documento digitalizado copia autentica
		 * (dokusiID).
		 * 
		 * - DDC: Documento digitalizado compulsado (dokusiID).
		 * 
		 * - PAP: Documento en papel, por homogeneizar. Documento de la solicitud en
		 * papel (sólo para las solicitudes y aportaciones presenciales). [El Toolkit
		 * nunca va a generar un documento de tipo PAP: Existe para el escenario por
		 * compatibilidad hacia atrás]
		 * 
		 * - DEA: Documento entregado por el ciudadano anteriormente en un órgano y
		 * fecha determinada
		 * 
		 * - CDAR: Documento proveniente del Componente de Distribución de Asientos
		 * Registrales.
		 * 
		 */

		// recuperamos los documentos de la entrada
		DocumentsEvent listaDocumentos = contextSubmissionEvent.getDocumentsEvent();

		DocumentosTarea docTarea = null;
		MaestroTiposDoc tiposDoc = new MaestroTiposDoc();
		for (DocumentEvent docEvent : listaDocumentos.getDocumentEvent()) {
			if (!Utilidades.esBlancoNulo(docEvent.getOid())) {
				docTarea = new DocumentosTarea();

				tiposDoc.setRoleid36(docEvent.getRoleId());
				List<MaestroTiposDoc> listaTipos = this.maestroTiposDocDao.findAll(tiposDoc, null);

				if (null != listaTipos && listaTipos.size() > 0) {
					docTarea.setMaestroTiposDoc(listaTipos.get(0));

					docTarea.setIdTareaTram18(new Long(idTarea));
					docTarea.setNombreDoc18(docEvent.getSourceName());
					docTarea.setOiddokusi18(docEvent.getOid());
					docTarea.setTipoAdjunto18(docEvent.getDocumentType());

					if (!Utilidades.esBlancoNulo(docEvent.getFechaEntregado())) {
						docTarea.setfEntrega18(UtilidadesFecha.parsearFechaPlatea(docEvent.getFechaEntregado()));
						docTarea.setDepEntrega18(docEvent.getOrganoEntregado());
						if (!Utilidades.esBlancoNulo(docEvent.getDocumentoEntregado())) {
							docTarea.setNombreDoc18(docEvent.getDocumentoEntregado());
						}
					}

					this.documentosTareaDao.add(docTarea);
				} else {
					ManagerErrors.manageError("Hay documentos no tipificados roleID:" + docEvent.getRoleId());
				}
			}

		}

		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesDocuments - Fin");

	}

	/**
	 * Procesa los documentos
	 * 
	 * @param contextSubmissionEvent Ad74aEjgvDocument
	 * @param codExpediente          Long
	 * @param idTarea                String
	 * @throws Throwable Exception
	 */
	public void proccesDocuments(
			com.ejie.ad74a.ws.client.platea.model.contextOficio.ContextSubmissionEvent contextSubmissionEvent,
			Long codExpediente, String idTarea) throws Throwable {
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesDocuments - Inicio");

		/**
		 * - PRE: Documento de la solicitud electrónica; el ejgvDocument firmado.
		 * 
		 * - PNS: Documento de solicitud electrónica sin firma.
		 * 
		 * - DAD: Documento adjuntado por la ciudadanía y almacenado en dokusi. En este
		 * caso viene un oid de Dokusi.
		 * 
		 * - DOC: Documento a compartir. (dokusiID). No admite formato (format) papel.
		 * Documento previamente adjuntado por la ciudadanía y almacenado en dokusi. En
		 * este caso viene un oid de Dokusi. Este documento se compartirá y se generará
		 * un nuevo oid relacionado con el oid pasado como parámetro.
		 * 
		 * - DOT: Documento a asociar con el expediente (dokusiID). Documento adjuntado
		 * por el ciudadano y NO almacenado en Dokusi.. En este caso viene una ruta PIF
		 * y es la PPS la que se encarga de subir el documento a Dokusi
		 * 
		 * - TRA: Autorización sustitutiva de documento (traza) (dokusiID). Traza
		 * administrativa del documento • DCA: Documento digitalizado copia autentica
		 * (dokusiID).
		 * 
		 * - DDC: Documento digitalizado compulsado (dokusiID).
		 * 
		 * - PAP: Documento en papel, por homogeneizar. Documento de la solicitud en
		 * papel (sólo para las solicitudes y aportaciones presenciales). [El Toolkit
		 * nunca va a generar un documento de tipo PAP: Existe para el escenario por
		 * compatibilidad hacia atrás]
		 * 
		 * - DEA: Documento entregado por el ciudadano anteriormente en un órgano y
		 * fecha determinada
		 * 
		 * - CDAR: Documento proveniente del Componente de Distribución de Asientos
		 * Registrales.
		 * 
		 */

		// recuperamos los documentos de la entrada
		com.ejie.ad74a.ws.client.platea.model.contextOficio.DocumentsEvent listaDocumentos = contextSubmissionEvent
				.getDocumentsEvent();

		DocumentosTarea docTarea = null;
		MaestroTiposDoc tiposDoc = new MaestroTiposDoc();
		if (listaDocumentos != null) {
			for (com.ejie.ad74a.ws.client.platea.model.contextOficio.DocumentEvent docEvent : listaDocumentos
					.getDocumentEvent()) {
				if (!Utilidades.esBlancoNulo(docEvent.getOid())) {
					docTarea = new DocumentosTarea();

					tiposDoc.setRoleid36(docEvent.getRoleId());
					List<MaestroTiposDoc> listaTipos = this.maestroTiposDocDao.findAll(tiposDoc, null);

					if (null != listaTipos && listaTipos.size() > 0) {
						docTarea.setMaestroTiposDoc(listaTipos.get(0));

						docTarea.setIdTareaTram18(new Long(idTarea));
						docTarea.setNombreDoc18(docEvent.getSourceName());
						docTarea.setOiddokusi18(docEvent.getOid());
						// docTarea.setTipoAdjunto18(docEvent.getDocumentType()); Esta llegando el RolID
						// en los inicios de oficio en vez de lo que aparece en el comentario de arriba.

						if (!Utilidades.esBlancoNulo(docEvent.getFechaEntregado())) {
							docTarea.setfEntrega18(UtilidadesFecha.parsearFechaPlatea(docEvent.getFechaEntregado()));
							docTarea.setDepEntrega18(docEvent.getOrganoEntregado());
							if (!Utilidades.esBlancoNulo(docEvent.getDocumentoEntregado())) {
								docTarea.setNombreDoc18(docEvent.getDocumentoEntregado());
							}
						}

						this.documentosTareaDao.add(docTarea);
					} else {
						ManagerErrors.manageError("Hay documentos no tipificados roleID:" + docEvent.getRoleId());
					}
				}

			}
		}

		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesDocuments - Fin");

	}

	/**
	 * Procesa los datos del resto de Request que no son solicitud. Aportacion,
	 * requerimiento etc
	 * 
	 * - Guarda los datos en la bandeja correspondiente para ser procesados más
	 * tarde
	 * 
	 * @param notificationBody NotificationBody
	 * @param mapaMensaje      Map<String, Object>
	 * @throws Throwable Exception
	 */
	private void processAportOficioActions(NotificationBody notificationBody, Map<String, Object> mapaMensaje)
			throws Throwable {
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.processAportOficioActions - Inicio");
//		// recogemos el contextSubmission
//		MessageParser<com.ejie.ad74a.ws.client.platea.model.contextOficio.ContextSubmissionEvent> parserContext = new MessageParser<com.ejie.ad74a.ws.client.platea.model.contextOficio.ContextSubmissionEvent>(
//				com.ejie.ad74a.ws.client.platea.model.contextOficio.ContextSubmissionEvent.class.getPackage()
//						.getName());
//		com.ejie.ad74a.ws.client.platea.model.contextOficio.ContextSubmissionEvent contextSubmissionEvent = parserContext
//				.parse(notificationBody.getXmlValue().get(0));

		// recogemos el contextSubmission
		MessageParser<ContextSubmissionEvent> parserContext = new MessageParser<ContextSubmissionEvent>(
				ContextSubmissionEvent.class.getPackage().getName());
		ContextSubmissionEvent contextSubmissionEvent = parserContext.parse(notificationBody.getXmlValue().get(0));

		// TODO: procesar directamente sin meter en la bandeja telemática
		this.tratamientoAportOficio(contextSubmissionEvent);

		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.processAportOficioActions - Fin");
	}

	private void tratamientoAportOficio(ContextSubmissionEvent contextSubmissionEvent) {

		// Procesamos la entrada de documentación
		this.tareaEntradaDocumentacionService.procesarEntradaDocumentacionPapel0(contextSubmissionEvent);

	}

	/**
	 * Procesa los datos del resto de Request que no son solicitud. Aportacion,
	 * requerimiento etc
	 * 
	 * - Guarda los datos en la bandeja correspondiente para ser procesados más
	 * tarde
	 * 
	 * @param notificationBody NotificationBody
	 * @param mapaMensaje      Map<String, Object>
	 * @throws Throwable Exception
	 */
	private void processRestActions(NotificationBody notificationBody, Map<String, Object> mapaMensaje)
			throws Throwable {
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.processRestActions - Inicio");
		// recogemos el contextSubmission
		MessageParser<ContextSubmissionEvent> parserContext = new MessageParser<ContextSubmissionEvent>(
				ContextSubmissionEvent.class.getPackage().getName());
		ContextSubmissionEvent contextSubmissionEvent = parserContext.parse(notificationBody.getXmlValue().get(0));

		this.tratamientoBandejaTelematica(contextSubmissionEvent);

		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.processRestActions - Fin");
	}

	/**
	 * Procesa las solicitudes presenciales de alta. Se divide en presenciales de la
	 * ciudadania o papel 0
	 * 
	 * @param contextSubmissionEvent
	 * @param mapaMensaje
	 * @throws Throwable
	 */
	private void proccesApplicationRegistryPresencial(ContextSubmissionEvent contextSubmissionEvent,
			Map<String, Object> mapaMensaje) throws Throwable {
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesApplicationRegistryPresencial - Inicio");
		Expedientes expediente = new Expedientes();
		expediente.setFolderId00(contextSubmissionEvent.getFolderID());
		List<Expedientes> listaExpedientes = expedienteDao.findExpedienteByFolderId(expediente);
		// si el expediente ya esta grabado, es papel 0
		// ademas para los papel 0 no viene idSolicitud
		String idSolicitud = contextSubmissionEvent.getSolicitudID();
		if (null != listaExpedientes && !listaExpedientes.isEmpty() && Utilidades.esBlancoNulo(idSolicitud)) {
			RequestJMSServiceImpl.logger
					.info("RequestJMSServiceImpl.proccesApplicationRegistryPresencial - Es papel 0: "
							+ contextSubmissionEvent.getFolderID());
			this.proccesApplicationPapel0(contextSubmissionEvent, mapaMensaje);
		} else if (!Utilidades.esBlancoNulo(idSolicitud)) {
			// sino esta grabado, presencial de la ciudadania, se tramita como una
			// telematica normal
			RequestJMSServiceImpl.logger.info(
					"RequestJMSServiceImpl.proccesApplicationRegistryPresencial - Es presencial de la ciudadania: "
							+ contextSubmissionEvent.getFolderID());
			this.proccesApplicationRegistry(contextSubmissionEvent, mapaMensaje);

		} else {
			ManagerErrors.manageError("Tipo de solicitud desconocida. No papel 0, no presencial de la ciudadania");
		}
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesApplicationRegistryPresencial - Fin");
	}

	/**
	 * Procesa las solicitudes presenciales de baja. Se divide en presenciales de la
	 * ciudadania o papel 0
	 * 
	 * @param contextSubmissionEvent
	 * @param mapaMensaje
	 * @throws Throwable
	 */
	private void proccesApplicationUnsubscribePresencial(ContextSubmissionEvent contextSubmissionEvent,
			Map<String, Object> mapaMensaje) throws Throwable {
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesApplicationUnsubscribePresencial - Inicio");
		Expedientes expediente = new Expedientes();
		expediente.setFolderId00(contextSubmissionEvent.getFolderID());
		List<Expedientes> listaExpedientes = expedienteDao.findExpedienteByFolderId(expediente);
		// si el expediente ya esta grabado, es papel 0
		if (null != listaExpedientes && !listaExpedientes.isEmpty()) {
			RequestJMSServiceImpl.logger
					.info("RequestJMSServiceImpl.proccesApplicationUnsubscribePresencial - Es papel 0: "
							+ contextSubmissionEvent.getFolderID());
			this.proccesApplicationPapel0(contextSubmissionEvent, mapaMensaje);
		} else {
			// sino esta grabado, presencial de la ciudadania, se tramita como una
			// telematica normal
			RequestJMSServiceImpl.logger.info(
					"RequestJMSServiceImpl.proccesApplicationUnsubscribePresencial - Es presencial de la ciudadania: "
							+ contextSubmissionEvent.getFolderID());
			this.proccesApplicationUnsubscribe(contextSubmissionEvent, mapaMensaje);

		}
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesApplicationUnsubscribePresencial - Fin");
	}

	/**
	 * Procesa las solicitudes presenciales de modificacion. Se divide en
	 * presenciales de la ciudadania o papel 0
	 * 
	 * @param contextSubmissionEvent
	 * @param mapaMensaje
	 * @throws Throwable
	 */
	private void proccesApplicationModifyPresencial(ContextSubmissionEvent contextSubmissionEvent,
			Map<String, Object> mapaMensaje) throws Throwable {
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesApplicationModifyPresencial - Inicio");
		Expedientes expediente = new Expedientes();
		expediente.setFolderId00(contextSubmissionEvent.getFolderID());
		List<Expedientes> listaExpedientes = expedienteDao.findExpedienteByFolderId(expediente);
		// si el expediente ya esta grabado, es papel 0
		if (null != listaExpedientes && !listaExpedientes.isEmpty()) {
			RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesApplicationModifyPresencial - Es papel 0: "
					+ contextSubmissionEvent.getFolderID());
			this.proccesApplicationPapel0(contextSubmissionEvent, mapaMensaje);
		} else {
			// sino esta grabado, presencial de la ciudadania, se tramita como una
			// telematica normal
			RequestJMSServiceImpl.logger
					.info("RequestJMSServiceImpl.proccesApplicationModifyPresencial - Es presencial de la ciudadania: "
							+ contextSubmissionEvent.getFolderID());
			this.proccesApplicationModify(contextSubmissionEvent, mapaMensaje);

		}
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesApplicationModifyPresencial - Fin");
	}

	/**
	 * Procesa las solicitudes presenciales de revision de precio. Se divide en
	 * presenciales de la ciudadania o papel 0
	 * 
	 * @param contextSubmissionEvent
	 * @param mapaMensaje
	 * @throws Throwable
	 */
	private void proccesApplicationRevisionPresencial(ContextSubmissionEvent contextSubmissionEvent,
			Map<String, Object> mapaMensaje) throws Throwable {
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesApplicationRevisionPresencial - Inicio");
		Expedientes expediente = new Expedientes();
		expediente.setFolderId00(contextSubmissionEvent.getFolderID());
		List<Expedientes> listaExpedientes = expedienteDao.findExpedienteByFolderId(expediente);
		// si el expediente ya esta grabado, es papel 0
		if (null != listaExpedientes && !listaExpedientes.isEmpty()) {
			RequestJMSServiceImpl.logger
					.info("RequestJMSServiceImpl.proccesApplicationRevisionPresencial - Es papel 0: "
							+ contextSubmissionEvent.getFolderID());
			this.proccesApplicationPapel0(contextSubmissionEvent, mapaMensaje);
		} else {
			// sino esta grabado, presencial de la ciudadania, se tramita como una
			// telematica normal
			RequestJMSServiceImpl.logger.info(
					"RequestJMSServiceImpl.proccesApplicationRevisionPresencial - Es presencial de la ciudadania: "
							+ contextSubmissionEvent.getFolderID());
			this.proccesApplicationRevision(contextSubmissionEvent, mapaMensaje);
		}
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesApplicationRevisionPresencial - Fin");
	}

	/**
	 * Procesa las solicitudes presenciales de intervencion. Se divide en
	 * presenciales de la ciudadania o papel 0
	 * 
	 * @param contextSubmissionEvent
	 * @param mapaMensaje
	 * @throws Throwable
	 */
	private void proccesApplicationInterReportPresencial(ContextSubmissionEvent contextSubmissionEvent,
			Map<String, Object> mapaMensaje) throws Throwable {
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesApplicationInterReportPresencial - Inicio");
		Expedientes expediente = new Expedientes();
		expediente.setFolderId00(contextSubmissionEvent.getFolderID());
		List<Expedientes> listaExpedientes = expedienteDao.findExpedienteByFolderId(expediente);
		// si el expediente ya esta grabado, es papel 0
		if (null != listaExpedientes && !listaExpedientes.isEmpty()) {
			RequestJMSServiceImpl.logger
					.info("RequestJMSServiceImpl.proccesApplicationInterReportPresencial - Es papel 0: "
							+ contextSubmissionEvent.getFolderID());
			this.proccesApplicationPapel0(contextSubmissionEvent, mapaMensaje);
		} else {
			// sino esta grabado, presencial de la ciudadania, se tramita como una
			// telematica normal
			RequestJMSServiceImpl.logger.info(
					"RequestJMSServiceImpl.proccesApplicationInterReportPresencial - Es presencial de la ciudadania: "
							+ contextSubmissionEvent.getFolderID());
			this.proccesApplicationInterReport(contextSubmissionEvent, mapaMensaje);
		}
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesApplicationInterReportPresencial - Fin");
	}

	/**
	 * Procesa los datos de la solicitud presencial papel 0
	 * 
	 * - Actualiza los datos de registro
	 * 
	 * @param notificationBody NotificationBody
	 * @param mapaMensaje      Map<String, Object>
	 * @throws Throwable Exception
	 */
	private void proccesApplicationPapel0(ContextSubmissionEvent contextSubmissionEvent,
			Map<String, Object> mapaMensaje) throws Throwable {
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesApplicationPapel0 - Inicio");
		Expedientes expediente = new Expedientes();
		// ContextSubmissionEvent contextSubmissionEvent =
		// this.getContextSubmission(notificationBody);
		expediente.setFolderId00(contextSubmissionEvent.getFolderID());
		List<Expedientes> listaExpedientes = expedienteDao.findExpedienteByFolderId(expediente);
		// si el expediente ya esta grabado, es papel 0

		if (CollectionUtils.isNotEmpty(listaExpedientes)) {
			expediente = listaExpedientes.get(0);
			if (!contextSubmissionEvent.getRegistrySubmissionNumber()
					.equalsIgnoreCase(contextSubmissionEvent.getRegistryNumber())) {
				// Sólo actualizamos la fecha de registroOtro, cuando los numeros de registro y
				// numero de registroOtro no sean iguales (Platea manda el mismo número en los 2
				// campos si sólo hay un número de registro)
				expediente.setNumRegistroOtro00(contextSubmissionEvent.getRegistrySubmissionNumber());
				expediente.setfRegistroOtro00(
						UtilidadesFecha.parsearFechaPlatea(contextSubmissionEvent.getRegistrySubmissionTimestamp()));
				this.expedienteDao.updateOtherRegistryData(expediente);

			}

			// actualizarDatosInteresadosRepresentante(contextSubmissionEvent, expediente);

			expediente = this.expedienteDao.find(expediente);
			this.invokeInteroperabilidades(expediente, expediente.getPerfiles());

		} else {

			ManagerErrors.manageError(
					"No se pueden actualizar los datos de registro en papel 0 porque no existe el expediente: "
							+ contextSubmissionEvent.getFolderID());

		}
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.proccesApplicationPapel0 - Fin");
	}

//	private void actualizarDatosInteresadosRepresentante(
//			com.ejie.ad74a.ws.client.platea.model.contextOficio.ContextSubmissionEvent contextSubmissionEvent,
//			Expedientes expediente) {
//		// Actualizamos los datos de los interesados que están en platea en nuestra
//		// aplicación
//		// Sólo esperamos un solicitante y un representante
//		PersonEvent solicitantePlatea = contextSubmissionEvent.getApplicantsInfoEvent().getApplicantInfoEvent()
//				.getPersonsEvent().getPersonEvent();
//		Solicitantes solBBDD = expediente.getSolicitantes();
//		String indentificador = solicitantePlatea.getId();
//		solBBDD.setIdentificador01(indentificador);
//
//		String nameSolicitante = solicitantePlatea.getName();
//		solBBDD.setNombre01(nameSolicitante);
//
//		String ape1Solicitante = solicitantePlatea.getLastname1();
//		solBBDD.setApellido101(ape1Solicitante);
//
//		String ape2Solicitante = solicitantePlatea.getLastname2();
//		solBBDD.setApellido201(ape2Solicitante);
//
//		solBBDD.setTipoIdentificador01(String.valueOf(solicitantePlatea.getPersonType()));
//
//		this.solicitanteDao.updatePersonaInteresadaSinFNacYSex(solBBDD);
//
//	}
//
//	private void actualizarDatosInteresadosRepresentante(ContextSubmissionEvent contextSubmissionEvent,
//			Expedientes expediente) {
//		// Actualizamos los datos de los interesados que están en platea en nuestra
//		// aplicación
//		// Sólo esperamos un solicitante y un representante
//		InterestedEventRRI solicitantePlatea = contextSubmissionEvent.getApplicantInfoEventRRI()
//				.getInterestedListEventRRI().getInterestedEventRRI().get(0);
//		Solicitantes solBBDD = expediente.getSolicitantes();
//		String indentificador = solicitantePlatea.getID();
//		solBBDD.setIdentificador01(indentificador);
//
//		String nameSolicitante = solicitantePlatea.getName();
//		solBBDD.setNombre01(nameSolicitante);
//
//		String ape1Solicitante = solicitantePlatea.getApe1();
//		solBBDD.setApellido101(ape1Solicitante);
//
//		String ape2Solicitante = solicitantePlatea.getApe2();
//		solBBDD.setApellido201(ape2Solicitante);
//
//		solBBDD.setTipoIdentificador01(solicitantePlatea.getPersonType());
//
//		solBBDD.setSexo01(UtilParseToolkit.codeSex(solicitantePlatea.getSexo()));
//
//		this.solicitanteDao.updatePersonaInteresadaSinFNac(solBBDD);
//
//		PersonInfoEventRRI representantePlatea = contextSubmissionEvent.getApplicantInfoEventRRI()
//				.getRepresentativeEventRRI();
//		// Si tiene representante
//		if (null != representantePlatea) {
//			expediente.setTipoIdentificadorRep00(representantePlatea.getPersonType());
//			expediente.setIdentificadorRep00(representantePlatea.getID());
//			expediente.setContactoInstRep00(0);
//
//			// si es una persona fisica
//			if (null != representantePlatea.getPersonType()
//					&& representantePlatea.getPersonType().equalsIgnoreCase(TipoIdentificadorEnum.DNI.getId())) {
//				expediente.setNombreRep00(representantePlatea.getName());
//				expediente.setApellido1Rep00(representantePlatea.getApe1());
//				expediente.setApellido2Rep00(representantePlatea.getApe2());
//				expediente.setSexoRep00(UtilParseToolkit.codeSex(representantePlatea.getSexo()));
//				expediente.setTipoRep00(Constantes.TIPO_PERSONA_FISICA_BBDD);
//			} else {
//				// es una persona juridica
//				expediente.setRazonSocialRep00(representantePlatea.getName());
//				expediente.setTipoRep00(Constantes.TIPO_PERSONA_JURIDICA_BBDD);
//			}
//
//			this.expedienteDao.updateRepresentante(expediente);
//		}
//	}

	private ContextSubmissionEvent getContextSubmission(NotificationBody notificationBody) throws Throwable {
		RequestJMSServiceImpl.logger.debug("RequestJMSServiceImpl.getContextSubmission - Inicio ");
		// recogemos el contextSubmission
		MessageParser<ContextSubmissionEvent> parserContext = new MessageParser<ContextSubmissionEvent>(
				ContextSubmissionEvent.class.getPackage().getName());
		ContextSubmissionEvent contextSubmissionEvent = parserContext.parse(notificationBody.getXmlValue().get(0));
		RequestJMSServiceImpl.logger.debug("RequestJMSServiceImpl.getContextSubmission - Fin ");
		return contextSubmissionEvent;

	}

	private com.ejie.ad74a.ws.client.platea.model.contextOficio.ContextSubmissionEvent getContextSubmissionInicioOficio(
			NotificationBody notificationBody) throws Throwable {
		RequestJMSServiceImpl.logger.debug("RequestJMSServiceImpl.getContextSubmission - Inicio ");
		// recogemos el contextSubmission
		MessageParser<com.ejie.ad74a.ws.client.platea.model.contextOficio.ContextSubmissionEvent> parserContext = new MessageParser<com.ejie.ad74a.ws.client.platea.model.contextOficio.ContextSubmissionEvent>(
				com.ejie.ad74a.ws.client.platea.model.contextOficio.ContextSubmissionEvent.class.getPackage()
						.getName());
		com.ejie.ad74a.ws.client.platea.model.contextOficio.ContextSubmissionEvent contextSubmissionEvent = parserContext
				.parse(notificationBody.getXmlValue().get(0));
		RequestJMSServiceImpl.logger.debug("RequestJMSServiceImpl.getContextSubmission - Fin ");
		return contextSubmissionEvent;

	}

	private Ad74aEjgvDocument getEJGVDocument(ContextSubmissionEvent contextSubmissionEvent) throws Throwable {
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.getEJGVDocument - Inicio ");

		String idSolicitud = contextSubmissionEvent.getSolicitudID(); // IDJMS_01
		String folderId = contextSubmissionEvent.getFolderID();
		RequestJMSServiceImpl.logger.debug("RequestJMSServiceImpl.getEJGVDocument - recuperamos EJGV idSolicitud: "
				+ idSolicitud + " - folderID: " + folderId);
		String ejgvString = this.plateaService.getRequestInformation(idSolicitud, folderId);
		RequestJMSServiceImpl.logger.debug("RequestJMSServiceImpl.getEJGVDocument - ejgvString: " + ejgvString);

		Ad74aEjgvDocument ejgvDocument = (Ad74aEjgvDocument) UtilidadesXML.unmarshallerObject(ejgvString,
				Ad74aEjgvDocument.class);

		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.getEJGVDocument - Fin ");
		return ejgvDocument;

	}

	private boolean existApplicant(String dniSolicitante) {
		Solicitantes sol = new Solicitantes();
		sol.setIdentificador01(dniSolicitante);
		return solicitanteDao.isSolAlta(sol);
	}

	private Solicitantes getApplicant(String dniSolicitante) {
		List<Solicitantes> solicitantesRes = null;
		Solicitantes solicitanteFind = new Solicitantes();
		solicitanteFind.setIdentificador01(dniSolicitante);
		solicitanteFind.setBeneficiario01(Constantes.TipoSolicitante.ES_BENEFICIARIO);
		solicitantesRes = solicitanteDao.findAll(solicitanteFind, null);
		if (null != solicitantesRes && solicitantesRes.size() > 0) {
			return solicitantesRes.get(0);
		}
		return null;
	}

	/**
	 * Invocamos manualmente al serivio de interoperabilidad de la renta para el
	 * conyuge y de la discapacidad
	 * 
	 * @param expediente
	 */
	private void invokeInteroperabilidades(Expedientes expediente, Perfiles perfil) {
		RequestJMSServiceImpl.logger
				.info("RequestJMSServiceImpl.invokeInteroperabilidades - folderID: " + expediente.getFolderId00());

		// damos de alta el registro
		DatosInterop interop = new DatosInterop();
		interop.setIdExpediente19(expediente.getIdExpediente00());
		this.datosInteropDao.add(interop);

		this.consultaInteropConyuge(expediente);

		// la de discapacidad solo si se ha seleccionado checks referentes a
		// discapacidad. 3 4 5
//		if ((null != perfil.getDisFisica07() && perfil.getDisFisica07().compareTo(1) == 0)
//				|| (null != perfil.getDisIntelectual07() && perfil.getDisIntelectual07().compareTo(1) == 0)
//				|| (null != perfil.getDisSensorial07() && perfil.getDisSensorial07().compareTo(1) == 0)) {
//			this.nisaeAsyncProcessService.consultInteroperabilityDiscapacidad(expediente.getIdExpediente00());
//		}

		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.invokeInteroperabilidades Salir ");
	}

	private void consultaInteropConyuge(Expedientes expediente) {
		if (Constantes.ConyugeAutorizacion.AUTORIZA.equals(expediente.getAutorizacionCon00())) {
			this.nisaeAsyncProcessService.consultInteroperabilityConyuge(expediente.getIdExpediente00());
		}
	}

	private PisosTutelados isPisoTutelado(Direcciones direccion) {
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.isPisoTutelado Inicio ");
		List<PisosTutelados> listPisos = this.pisosTuteladosDao.isPisoTutelado(direccion);
		if (null != listPisos && listPisos.size() > 0) {
			RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.isPisoTutelado piso encontrado ");
			return listPisos.get(0);
		}
		RequestJMSServiceImpl.logger.info("RequestJMSServiceImpl.isPisoTutelado Fin ");
		return null;
	}

	private boolean yaExisteProcedimientoEnRegistro(String dni, String procedureId) {

		Long result = this.expedienteDao.findCurrentExpSolProc(dni, procedureId);
		if (result > 0) {
			return true;
		}
		return false;
	}

}
