package com.ejie.ad74a.tareas.service;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Properties;

import org.apache.commons.lang.exception.ExceptionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.stereotype.Service;

import com.ejie.ad74a.constantes.Constantes;
import com.ejie.ad74a.dao.DocTemporalesDao;
import com.ejie.ad74a.dao.DocumentosInformeDao;
import com.ejie.ad74a.dao.DocumentosTareaDao;
import com.ejie.ad74a.dao.ExpedientesDao;
import com.ejie.ad74a.dao.InformesDao;
import com.ejie.ad74a.dao.MaestroTiposDocDao;
import com.ejie.ad74a.dao.PreciosBeneficiarioDao;
import com.ejie.ad74a.dao.SolicitantesDao;
import com.ejie.ad74a.dao.TareasTramiteDao;
import com.ejie.ad74a.exceptions.Ad74aWebserviceException;
import com.ejie.ad74a.exceptions.ConstantesCodeError;
import com.ejie.ad74a.exceptions.ManagerErrors;
import com.ejie.ad74a.jms.util.ModelApplicationParser;
import com.ejie.ad74a.model.DocTemporales;
import com.ejie.ad74a.model.Documento;
import com.ejie.ad74a.model.DocumentosTarea;
import com.ejie.ad74a.model.ErroresTelevida;
import com.ejie.ad74a.model.Estados;
import com.ejie.ad74a.model.Expedientes;
import com.ejie.ad74a.model.Informes;
import com.ejie.ad74a.model.MaestroTiposDoc;
import com.ejie.ad74a.model.PreciosBeneficiario;
import com.ejie.ad74a.model.Solicitantes;
import com.ejie.ad74a.model.TareasTramite;
import com.ejie.ad74a.scheduler.JobSchedulerService;
import com.ejie.ad74a.scheduler.SchedulerJobType;
import com.ejie.ad74a.service.ErroresTelevidaService;
import com.ejie.ad74a.service.documentos.DocumentosService;
import com.ejie.ad74a.service.tramitacion.TramitacionService;
import com.ejie.ad74a.util.comun.UtilSeguridad;
import com.ejie.ad74a.util.comun.UtilTokenXlnets;
import com.ejie.ad74a.util.comun.Utilidades;
import com.ejie.ad74a.util.comun.UtilidadesFecha;
import com.ejie.ad74a.util.constantes.EstadoDocuEnum;
import com.ejie.ad74a.util.constantes.EstadoInformesEnum;
import com.ejie.ad74a.util.constantes.EstadoNotificacionEnum;
import com.ejie.ad74a.util.constantes.EstadosExpedienteEnum;
import com.ejie.ad74a.util.constantes.ProcedimientosEnum;
import com.ejie.ad74a.util.constantes.TareasEnum;
import com.ejie.ad74a.util.constantes.TiposDocumentoRoleEnum;
import com.ejie.ad74a.util.constantes.TramitesEnum;
import com.ejie.ad74a.util.pid.Ad74aPIDws;
import com.ejie.ad74a.util.pif.Ad74aPIFws;
import com.ejie.ad74a.ws.client.dokusi.model.documentT65B.T65BDocumentIDType;
import com.ejie.ad74a.ws.client.dokusi.service.DokusiService;
import com.ejie.ad74a.ws.client.platea.model.task.Document;
import com.ejie.ad74a.ws.client.platea.model.task.Task;
import com.ejie.ad74a.ws.client.platea.service.PlateaService;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TAttachDocType;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TDocFormatType;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TDocNatureType;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TLanguage;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TPersonIDName;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TStringI18N;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TStringList;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TTask;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TTaskAdjuntarDoc;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TTaskDocument;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TTaskInfoDocument;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TTaskInfoDocumentList;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TTaskType;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TTextI18N;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TWaitType;
import com.ejie.ad74a.ws.client.prestadorWS.data.TipoComunicacionEnum;
import com.ejie.ad74a.ws.client.prestadorWS.service.PrestadorWSService;
import com.ejie.x38.dto.TableRequestDto;

import v90.padoc.stub.W43DfDocument;

/**
 * Gestión de la Tarea de Aportar Documentación
 * 
 * @author IBERMATICA
 */

@Service(value = "tareaAportarDocumentacionService")
public class TareaAportarDocumentacionServiceImpl implements TareaAportarDocumentacionService {

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

	@Autowired
	private PlateaService plateaService;

	@Autowired
	private DocTemporalesDao docTemporalesDao;

	@Autowired
	private MaestroTiposDocDao maestroTiposDocDao;

	@Autowired
	private ExpedientesDao expedientesDao;

	@Autowired
	private SolicitantesDao solicitanteDao;

	@Autowired
	private DocumentosInformeDao documentosInformeDao;

	@Autowired
	private TramitacionService tramitacionService;

	@Autowired
	private DocumentosTareaDao documentosTareaDao;

	@Autowired
	private TareasTramiteDao tareasTramiteDao;

	@Autowired
	private DocumentosService documentosService;

	@Autowired
	private DokusiService dokusiService;

	@Autowired
	private InformesDao informesDao;

	@Autowired
	private Ad74aPIDws pidWS;

	@Autowired
	private Properties appConfiguration;

	@Autowired
	private PrestadorWSService prestadorWsService;

	@Autowired
	private PreciosBeneficiarioDao preciosBeneficiarioDao;

	@Autowired
	private ReloadableResourceBundleMessageSource appMessageSource;

	@Autowired
	private ErroresTelevidaService erroresTelevidaService;

	@Autowired
	private JobSchedulerService jobSchedulerService;

	private static final String LITERAL_INFORME_INTERVENCION = "informe.intervencion";

	/**
	 * Método que gestiona el evento de Tarea Sugerida
	 * 
	 */
	public void tareaSugerida(Task task, Boolean automatica) throws Throwable {
		TareaAportarDocumentacionServiceImpl.logger.info("TareaAportarDocumentacionServiceImpl.tareaSugerida -"
				+ task.getTaskID() + "-" + task.getMailboxTaskID() + "- inicio ");

		String numRegistro = ModelApplicationParser.getNumRegistryFromTask(task);

		Expedientes expediente = new Expedientes();
		expediente.setFolderId00(task.getFolderID());
		List<Expedientes> listaExpedientes = expedientesDao.findAll(expediente, null);

		if (null != listaExpedientes && listaExpedientes.size() > 0) {
			expediente = listaExpedientes.get(0);
		} else {
			ManagerErrors
					.manageError("Error al sugerir la tarea de aportacion: no se ha encontrado el expediente FolderId: "
							+ task.getFolderID());
		}

		if (Boolean.TRUE.equals(automatica)) {
			TareaAportarDocumentacionServiceImpl.logger
					.info("TareaAportarDocumentacionServiceImpl.tareaSugerida - Automatica ");
			// almacenamos el tramite y la tarea
			this.tramitacionService.tratamientoTramiteTareaAutomaticaSugerida(task, numRegistro, expediente);

		} else {
			TareaAportarDocumentacionServiceImpl.logger
					.info("TareaAportarDocumentacionServiceImpl.tareaSugerida - Manual ");
			// almacenamos el tramite y la tarea
			this.tramitacionService.tratamientoTramiteTareaSugerida(task, numRegistro, expediente);

		}

		String procedureId = task.getProcedureID();
		// ** En función del ID de la tarea se especifica la acción ** //
		switch (ProcedimientosEnum.getById(procedureId)) {

		case ALTA:
			TareaAportarDocumentacionServiceImpl.logger
					.info("TareaAportarDocumentacionServiceImpl.tareaSugerida - es procedimiento de ALTA");

			// ** En función del ID de la tarea se especifica la acción ** //
			switch ((TareasEnum.getEnumByTaskId(task.getTaskID()))) {

			case ADJUNTAR_DOCUMENTACION:
				// ** ADJUNTAR DOCUMENTACIÓN- EJECUCIÓN AUTOMÁTICA // **/
				this.ejecutarTareaAutomatica(task.getMailboxTaskID());
				break;
			case REQUERIMIENTO_SUBSANACION:
				// actualizamos el estado de la notificacion en el expediente a Pendiente

				expediente.setFolderId00(task.getFolderID());
				expediente.setEstadoNotificacion00(EstadoNotificacionEnum.PENDIENTE.getId());
				this.expedientesDao.updateEstadoNotificacion(expediente);

				// actualizamos a pend de requerimiento de subsanacion
				expediente.setEstados(new Estados(EstadosExpedienteEnum.PEND_LOCALIZAR_DOCUMENTO.getId()));
				this.expedientesDao.updateEstado(expediente);

				// TODO se hace la aportacion de documentacion

				TareasTramite tarea = new TareasTramite();
				tarea.setTaskguid11(task.getMailboxTaskID());
				tarea = this.tareasTramiteDao.findAll(tarea, null).get(0);
				TareaAportarDocumentacionServiceImpl.logger
						.info("TareaAportarDocumentacionServiceImpl.prepararDocumento ~~PROBLEMA DOC~ tarea : {}"
								+ tarea.toString());
				this.prepararDocumento(procedureId, tarea, expediente, task.getTaskID());

				break;
			case RESOL_DESISTIMIENTO:

				// ** Finalizamos esperas pendientes **/
				// DESISTIMIENTO
				this.tramitacionService.finalizarEspera(task.getFolderID(), TWaitType.DESISTIMIENTO,
						com.ejie.ad74a.util.constantes.Constantes.Esperas.EstadosFinalizacion.DESISTIMIENTO_PRESENTADO);
				// SUBSANACION
				this.tramitacionService.finalizarEspera(task.getFolderID(), TWaitType.APORTACION_DOCUMENTACION,
						com.ejie.ad74a.util.constantes.Constantes.Esperas.EstadosFinalizacion.DOCUMENTACION_NO_APORTADA);

				// actualizamos el estado del expediente a Pendiente de resolucion de
				// desistimiento
				expediente.setFolderId00(task.getFolderID());
				expediente.setEstados(new Estados(EstadosExpedienteEnum.PEND_RESOL_DES.getId()));
				this.expedientesDao.updateEstado(expediente);

				// actualizamos el estado de la notificacion en el expediente a Pendiente
				expediente.setEstadoNotificacion00(EstadoNotificacionEnum.PENDIENTE.getId());
				this.expedientesDao.updateEstadoNotificacion(expediente);

				// TODO se hace la aportacion de documentacion

				TareasTramite tareaDesis = new TareasTramite();
				tareaDesis.setTaskguid11(task.getMailboxTaskID());
				tareaDesis = this.tareasTramiteDao.findAll(tareaDesis, null).get(0);

				this.prepararDocumento(procedureId, tareaDesis, expediente, task.getTaskID());

				break;
			case RESOL_CONCESION:
				TareaAportarDocumentacionServiceImpl.logger
						.info("TareaAportarDocumentacionServiceImpl.tareaSugerida - RESOL_CONCESION . init IM");
				// ** Finalizamos esperas pendientes **/
				// SUBSANACION
				this.tramitacionService.finalizarEspera(task.getFolderID(), TWaitType.APORTACION_DOCUMENTACION,
						com.ejie.ad74a.util.constantes.Constantes.Esperas.EstadosFinalizacion.DOCUMENTACION_APORTADA);
				// DESISTIMIENTO
				this.tramitacionService.finalizarEspera(task.getFolderID(), TWaitType.DESISTIMIENTO,
						com.ejie.ad74a.util.constantes.Constantes.Esperas.EstadosFinalizacion.DESISTIMIENTO_NO_PRESENTADO);

				// CSI-IM-Problema TimeOut Tramitación. Se unifica las updates sobre el mismo
				// registro.
				// estado a pend de resolucion de concesion y estado notificacion a pendiente
				long init = System.currentTimeMillis();
				// actualizamos a pend de resolucion de concesion
				expediente.setEstados(new Estados(EstadosExpedienteEnum.PEND_LOCALIZAR_DOCUMENTO.getId()));
				// this.expedientesDao.updateEstado(expediente);

				// ** RESOLUCION DE CONCESION ** //
				// actualizamos el estado de la notificacion en el expediente a Pendiente
				expediente.setEstadoNotificacion00(EstadoNotificacionEnum.PENDIENTE.getId());
				// this.expedientesDao.updateEstadoNotificacion(expediente);
				this.expedientesDao.updateEstadoYEstadoNotificacion(expediente);
				long end = System.currentTimeMillis();

				TareaAportarDocumentacionServiceImpl.logger
						.info("updateEstadoYEstadoNotificacion::" + (end - init) / 1000 + " segundos");

				// TODO se hace la aportacion de documentacion
				TareasTramite tareaResol = new TareasTramite();
				tareaResol.setTaskguid11(task.getMailboxTaskID());
				// tareaResol = this.tareasTramiteDao.findAll(tareaResol, null).get(0);
				// CSI-IM-Problema TimeOut Tramitación. Solo se necesita el getIdTareaTram11
				// hacemos una sql customizada y evitamos findall
				TareaAportarDocumentacionServiceImpl.logger.info(
						"TareaAportarDocumentacionServiceImpl.prepararDocumento ~~PROBLEMA DOC~ task.getMailboxTaskID() : {}"
								+ task.getMailboxTaskID());
				tareaResol = this.tareasTramiteDao.findIdTareaByTaskguid11(tareaResol);
				TareaAportarDocumentacionServiceImpl.logger
						.info("TareaAportarDocumentacionServiceImpl.prepararDocumento ~~PROBLEMA DOC~ tarea : {}"
								+ tareaResol.toString());
				long end2 = System.currentTimeMillis();
				TareaAportarDocumentacionServiceImpl.logger
						.info("findIdTareaByTaskguid11::" + (end2 - end) / 1000 + " segundos");

				this.prepararDocumento(procedureId, tareaResol, expediente, task.getTaskID());
				break;
			case RESOL_DENEGACION:

				// ** Finalizamos esperas pendientes **/
				// SUBSANACION
				this.tramitacionService.finalizarEspera(task.getFolderID(), TWaitType.APORTACION_DOCUMENTACION,
						com.ejie.ad74a.util.constantes.Constantes.Esperas.EstadosFinalizacion.DOCUMENTACION_APORTADA);
				// DESISTIMIENTO
				this.tramitacionService.finalizarEspera(task.getFolderID(), TWaitType.DESISTIMIENTO,
						com.ejie.ad74a.util.constantes.Constantes.Esperas.EstadosFinalizacion.DESISTIMIENTO_NO_PRESENTADO);

				// actualizamos a pend de resolucion de denegacion
				expediente.setEstados(new Estados(EstadosExpedienteEnum.PEND_LOCALIZAR_DOCUMENTO.getId()));
				this.expedientesDao.updateEstado(expediente);

				// ** RESOLUCION DE CONCESION ** //
				// actualizamos el estado de la notificacion en el expediente a Pendiente
				expediente.setEstadoNotificacion00(EstadoNotificacionEnum.PENDIENTE.getId());
				this.expedientesDao.updateEstadoNotificacion(expediente);

				// TODO se hace la aportacion de documentacion
				TareasTramite tareaDen = new TareasTramite();
				tareaDen.setTaskguid11(task.getMailboxTaskID());
				tareaDen = this.tareasTramiteDao.findAll(tareaDen, null).get(0);

				this.prepararDocumento(procedureId, tareaDen, expediente, task.getTaskID());

				break;
			default:
				break;
			}
			break;
		case BAJA:
			/***************************/
			TareaAportarDocumentacionServiceImpl.logger
					.info("TareaAportarDocumentacionServiceImpl.tareaSugerida - es procedimiento de BAJA");

			// ** En función del ID de la tarea se especifica la acción ** //
			switch ((TareasEnum.getEnumByTaskId(task.getTaskID()))) {

			case ADJUNTAR_DOCUMENTACION:
				// ** ADJUNTAR DOCUMENTACIÓN- EJECUCIÓN AUTOMÁTICA // **/
				this.ejecutarTareaAutomatica(task.getMailboxTaskID());
				break;
			case RESOL_CONCESION:
				// ** Finalizamos esperas pendientes **/
				// SUBSANACION
				this.tramitacionService.finalizarEspera(task.getFolderID(), TWaitType.APORTACION_DOCUMENTACION,
						com.ejie.ad74a.util.constantes.Constantes.Esperas.EstadosFinalizacion.DOCUMENTACION_APORTADA);
				// DESISTIMIENTO
				this.tramitacionService.finalizarEspera(task.getFolderID(), TWaitType.DESISTIMIENTO,
						com.ejie.ad74a.util.constantes.Constantes.Esperas.EstadosFinalizacion.DESISTIMIENTO_NO_PRESENTADO);

				// CSI-IM-Problema TimeOut Tramitación. Se unifica las updates sobre el mismo
				// registro.
				// estado a pend de resolucion de concesion y estado notificacion a pendiente

				// actualizamos a pend de resolucion de concesion
				expediente.setEstados(new Estados(EstadosExpedienteEnum.PEND_LOCALIZAR_DOCUMENTO.getId()));
				// this.expedientesDao.updateEstado(expediente);

				// ** RESOLUCION DE CONCESION ** //
				// actualizamos el estado de la notificacion en el expediente a Pendiente
				expediente.setEstadoNotificacion00(EstadoNotificacionEnum.PENDIENTE.getId());
				// this.expedientesDao.updateEstadoNotificacion(expediente);
				this.expedientesDao.updateEstadoYEstadoNotificacion(expediente);

				// TODO se hace la aportacion de documentacion
				TareasTramite tareaResol = new TareasTramite();
				tareaResol.setTaskguid11(task.getMailboxTaskID());
				tareaResol = this.tareasTramiteDao.findAll(tareaResol, null).get(0);

				this.prepararDocumento(procedureId, tareaResol, expediente, task.getTaskID());
				break;
			case RESOL_DENEGACION:

				// ** Finalizamos esperas pendientes **/
				// SUBSANACION
				this.tramitacionService.finalizarEspera(task.getFolderID(), TWaitType.APORTACION_DOCUMENTACION,
						com.ejie.ad74a.util.constantes.Constantes.Esperas.EstadosFinalizacion.DOCUMENTACION_APORTADA);
				// DESISTIMIENTO
				this.tramitacionService.finalizarEspera(task.getFolderID(), TWaitType.DESISTIMIENTO,
						com.ejie.ad74a.util.constantes.Constantes.Esperas.EstadosFinalizacion.DESISTIMIENTO_NO_PRESENTADO);

				// actualizamos a pend de resolucion de denegacion
				expediente.setEstados(new Estados(EstadosExpedienteEnum.PEND_LOCALIZAR_DOCUMENTO.getId()));
				this.expedientesDao.updateEstado(expediente);

				// ** RESOLUCION DE CONCESION ** //
				// actualizamos el estado de la notificacion en el expediente a Pendiente
				expediente.setEstadoNotificacion00(EstadoNotificacionEnum.PENDIENTE.getId());
				this.expedientesDao.updateEstadoNotificacion(expediente);

				// se hace la aportacion de documentacion
				TareasTramite tareaDen = new TareasTramite();
				tareaDen.setTaskguid11(task.getMailboxTaskID());
				tareaDen = this.tareasTramiteDao.findAll(tareaDen, null).get(0);

				this.prepararDocumento(procedureId, tareaDen, expediente, task.getTaskID());

				break;
			case RESOL_DENEGACION_SERVICIO_AUDIENCIA:

				// ** Finalizamos esperas pendientes **/
				// SUBSANACION
				this.tramitacionService.finalizarEspera(task.getFolderID(), TWaitType.APORTACION_DOCUMENTACION,
						com.ejie.ad74a.util.constantes.Constantes.Esperas.EstadosFinalizacion.DOCUMENTACION_APORTADA);
				// DESISTIMIENTO
				this.tramitacionService.finalizarEspera(task.getFolderID(), TWaitType.DESISTIMIENTO,
						com.ejie.ad74a.util.constantes.Constantes.Esperas.EstadosFinalizacion.DESISTIMIENTO_NO_PRESENTADO);
				// DESISTIMIENTO
				this.tramitacionService.finalizarEspera(task.getFolderID(), TWaitType.ALEGACION,
						com.ejie.ad74a.util.constantes.Constantes.Esperas.EstadosFinalizacion.ALEGACIONES_NO_PRESENTADAS);

				// actualizamos a pend de resolucion de denegacion
				expediente.setEstados(new Estados(EstadosExpedienteEnum.PEND_LOCALIZAR_DOCUMENTO.getId()));
				this.expedientesDao.updateEstado(expediente);

				// ** RESOLUCION DE CONCESION ** //
				// actualizamos el estado de la notificacion en el expediente a Pendiente
				expediente.setEstadoNotificacion00(EstadoNotificacionEnum.PENDIENTE.getId());
				this.expedientesDao.updateEstadoNotificacion(expediente);

				// se hace la aportacion de documentacion
				TareasTramite tareaDenServAuc = new TareasTramite();
				tareaDenServAuc.setTaskguid11(task.getMailboxTaskID());
				tareaDenServAuc = this.tareasTramiteDao.findAll(tareaDenServAuc, null).get(0);

				Long idBeneficiario = solicitanteDao.findBeneficiarioPorIdSolicitante(expediente.getSolicitantes())
						.getIdSolicitante01();

				// actualizamos datos de baja del solicitante
				this.updateBajaConcesion(expediente, task.getMailboxTaskID(), task.getSenderID(), idBeneficiario);

				// Actualizamos el resultadoEstudio del solicitante (no hay beneficiario)
				Solicitantes solFilter = this.solicitanteDao.find(expediente.getSolicitantes());
				solFilter.setEsDenegacionServicio01(com.ejie.ad74a.util.constantes.Constantes.VAL_NUM_SI);
				this.solicitanteDao.updateDenegacionServicio(solFilter);

				this.prepararDocumento(procedureId, tareaDenServAuc, expediente, task.getTaskID());

				break;
			case RESOL_DESISTIMIENTO:

				// ** Finalizamos esperas pendientes **/
				// DESISTIMIENTO
				this.tramitacionService.finalizarEspera(task.getFolderID(), TWaitType.DESISTIMIENTO,
						com.ejie.ad74a.util.constantes.Constantes.Esperas.EstadosFinalizacion.DESISTIMIENTO_PRESENTADO);
				// SUBSANACION
				this.tramitacionService.finalizarEspera(task.getFolderID(), TWaitType.APORTACION_DOCUMENTACION,
						com.ejie.ad74a.util.constantes.Constantes.Esperas.EstadosFinalizacion.DOCUMENTACION_NO_APORTADA);

				// actualizamos el estado del expediente a Pendiente de resolucion de
				// desistimiento
				expediente.setFolderId00(task.getFolderID());
				expediente.setEstados(new Estados(EstadosExpedienteEnum.PEND_RESOL_DES.getId()));
				this.expedientesDao.updateEstado(expediente);

				// actualizamos el estado de la notificacion en el expediente a Pendiente
				expediente.setEstadoNotificacion00(EstadoNotificacionEnum.PENDIENTE.getId());
				this.expedientesDao.updateEstadoNotificacion(expediente);

				// TODO se hace la aportacion de documentacion
				TareasTramite tareaDesis = new TareasTramite();
				tareaDesis.setTaskguid11(task.getMailboxTaskID());
				tareaDesis = this.tareasTramiteDao.findAll(tareaDesis, null).get(0);

				this.prepararDocumento(procedureId, tareaDesis, expediente, task.getTaskID());

				break;
			case AUDIENCIA:
				// actualizamos a pend de resolucion de denegacion
				expediente.setEstados(new Estados(EstadosExpedienteEnum.PEND_LOCALIZAR_DOCUMENTO.getId()));
				this.expedientesDao.updateEstado(expediente);

				// ** RESOLUCION DE CONCESION ** //
				// actualizamos el estado de la notificacion en el expediente a Pendiente
				expediente.setEstadoNotificacion00(EstadoNotificacionEnum.PENDIENTE.getId());
				this.expedientesDao.updateEstadoNotificacion(expediente);

				// se hace la aportacion de documentacion
				TareasTramite tareaAud = new TareasTramite();
				tareaAud.setTaskguid11(task.getMailboxTaskID());
				tareaAud = this.tareasTramiteDao.findAll(tareaAud, null).get(0);

				this.prepararDocumento(procedureId, tareaAud, expediente, task.getTaskID());
				break;
			default:
				break;
			}

			break;
		case INFORME:
			/***************************/
			// ** En función del ID de la tarea se especifica la acción ** //
			switch ((TareasEnum.getEnumByTaskId(task.getTaskID()))) {

			case ADJUNTAR_DOCUMENTACION:
				// ** ADJUNTAR DOCUMENTACIÓN- EJECUCIÓN AUTOMÁTICA // **/

				this.ejecutarTareaAutomatica(task.getMailboxTaskID());
				break;
			case REQUERIMIENTO_SUBSANACION:
				// actualizamos el estado de la notificacion en el expediente a Pendiente

				expediente.setFolderId00(task.getFolderID());
				expediente.setEstadoNotificacion00(EstadoNotificacionEnum.PENDIENTE.getId());
				this.expedientesDao.updateEstadoNotificacion(expediente);

				// actualizamos a pend de requerimiento de subsanacion
				expediente.setEstados(new Estados(EstadosExpedienteEnum.PEND_LOCALIZAR_DOCUMENTO.getId()));
				this.expedientesDao.updateEstado(expediente);

				// TODO se hace la aportacion de documentacion
				TareasTramite tarea = new TareasTramite();
				tarea.setTaskguid11(task.getMailboxTaskID());
				tarea = this.tareasTramiteDao.findAll(tarea, null).get(0);

				this.prepararDocumento(procedureId, tarea, expediente, task.getTaskID());
			default:
				break;
			}
			break;
		case MODIFICACION:
			/***************************/
			// ** En función del ID de la tarea se especifica la acción ** //
			switch ((TareasEnum.getEnumByTaskId(task.getTaskID()))) {
			case ADJUNTAR_DOCUMENTACION:
				// ** ADJUNTAR DOCUMENTACIÓN- EJECUCIÓN AUTOMÁTICA // **/
				this.ejecutarTareaAutomatica(task.getMailboxTaskID());
				break;
			case REQUERIMIENTO_SUBSANACION:
				// actualizamos el estado de la notificacion en el expediente a Pendiente

				expediente.setFolderId00(task.getFolderID());
				expediente.setEstadoNotificacion00(EstadoNotificacionEnum.PENDIENTE.getId());
				this.expedientesDao.updateEstadoNotificacion(expediente);

				// actualizamos a pend de requerimiento de subsanacion
				expediente.setEstados(new Estados(EstadosExpedienteEnum.PEND_LOCALIZAR_DOCUMENTO.getId()));
				this.expedientesDao.updateEstado(expediente);

				// TODO se hace la aportacion de documentacion
				TareasTramite tarea = new TareasTramite();
				tarea.setTaskguid11(task.getMailboxTaskID());
				tarea = this.tareasTramiteDao.findAll(tarea, null).get(0);

				this.prepararDocumento(procedureId, tarea, expediente, task.getTaskID());
			default:
				break;
			}

			break;
		case REVISION_PRECIO:
			/***************************/
			// ** En función del ID de la tarea se especifica la acción ** //
			switch ((TareasEnum.getEnumByTaskId(task.getTaskID()))) {

			case ADJUNTAR_DOCUMENTACION:
				// ** ADJUNTAR DOCUMENTACIÓN- EJECUCIÓN AUTOMÁTICA // **/
				this.ejecutarTareaAutomatica(task.getMailboxTaskID());
				break;
			case REQUERIMIENTO_SUBSANACION:
				// actualizamos el estado de la notificacion en el expediente a Pendiente

				expediente.setFolderId00(task.getFolderID());
				expediente.setEstadoNotificacion00(EstadoNotificacionEnum.PENDIENTE.getId());
				this.expedientesDao.updateEstadoNotificacion(expediente);

				// actualizamos a pend de requerimiento de subsanacion
				expediente.setEstados(new Estados(EstadosExpedienteEnum.PEND_LOCALIZAR_DOCUMENTO.getId()));
				this.expedientesDao.updateEstado(expediente);

				// TODO se hace la aportacion de documentacion
				TareasTramite tarea = new TareasTramite();
				tarea.setTaskguid11(task.getMailboxTaskID());
				tarea = this.tareasTramiteDao.findAll(tarea, null).get(0);

				this.prepararDocumento(procedureId, tarea, expediente, task.getTaskID());
			case RESOL_DESISTIMIENTO:

				// ** Finalizamos esperas pendientes **/
				// DESISTIMIENTO
				this.tramitacionService.finalizarEspera(task.getFolderID(), TWaitType.DESISTIMIENTO,
						com.ejie.ad74a.util.constantes.Constantes.Esperas.EstadosFinalizacion.DESISTIMIENTO_PRESENTADO);
				// SUBSANACION
				this.tramitacionService.finalizarEspera(task.getFolderID(), TWaitType.APORTACION_DOCUMENTACION,
						com.ejie.ad74a.util.constantes.Constantes.Esperas.EstadosFinalizacion.DOCUMENTACION_NO_APORTADA);

				// actualizamos el estado del expediente a Pendiente de resolucion de
				// desistimiento
				expediente.setFolderId00(task.getFolderID());
				expediente.setEstados(new Estados(EstadosExpedienteEnum.PEND_RESOL_DES.getId()));
				this.expedientesDao.updateEstado(expediente);

				// actualizamos el estado de la notificacion en el expediente a Pendiente
				expediente.setEstadoNotificacion00(EstadoNotificacionEnum.PENDIENTE.getId());
				this.expedientesDao.updateEstadoNotificacion(expediente);

				// TODO se hace la aportacion de documentacion
				TareasTramite tareaDesis = new TareasTramite();
				tareaDesis.setTaskguid11(task.getMailboxTaskID());
				tareaDesis = this.tareasTramiteDao.findAll(tareaDesis, null).get(0);

				this.prepararDocumento(procedureId, tareaDesis, expediente, task.getTaskID());

				break;
			case RESOL_DENEGACION:

				// ** Finalizamos esperas pendientes **/
				// SUBSANACION
				this.tramitacionService.finalizarEspera(task.getFolderID(), TWaitType.APORTACION_DOCUMENTACION,
						com.ejie.ad74a.util.constantes.Constantes.Esperas.EstadosFinalizacion.DOCUMENTACION_APORTADA);
				// DESISTIMIENTO
				this.tramitacionService.finalizarEspera(task.getFolderID(), TWaitType.DESISTIMIENTO,
						com.ejie.ad74a.util.constantes.Constantes.Esperas.EstadosFinalizacion.DESISTIMIENTO_NO_PRESENTADO);

				// actualizamos a pend de resolucion de denegacion
				expediente.setEstados(new Estados(EstadosExpedienteEnum.PEND_LOCALIZAR_DOCUMENTO.getId()));
				this.expedientesDao.updateEstado(expediente);

				// ** RESOLUCION DE CONCESION ** //
				// actualizamos el estado de la notificacion en el expediente a Pendiente
				expediente.setEstadoNotificacion00(EstadoNotificacionEnum.PENDIENTE.getId());
				this.expedientesDao.updateEstadoNotificacion(expediente);

				// TODO se hace la aportacion de documentacion
				TareasTramite tareaDen = new TareasTramite();
				tareaDen.setTaskguid11(task.getMailboxTaskID());
				tareaDen = this.tareasTramiteDao.findAll(tareaDen, null).get(0);

				this.prepararDocumento(procedureId, tareaDen, expediente, task.getTaskID());

				break;
			case RESOL_CONCESION:

				// ** Finalizamos esperas pendientes **/
				// SUBSANACION
				this.tramitacionService.finalizarEspera(task.getFolderID(), TWaitType.APORTACION_DOCUMENTACION,
						com.ejie.ad74a.util.constantes.Constantes.Esperas.EstadosFinalizacion.DOCUMENTACION_APORTADA);
				// DESISTIMIENTO
				this.tramitacionService.finalizarEspera(task.getFolderID(), TWaitType.DESISTIMIENTO,
						com.ejie.ad74a.util.constantes.Constantes.Esperas.EstadosFinalizacion.DESISTIMIENTO_NO_PRESENTADO);

				// actualizamos a pend de resolucion de concesion
				expediente.setEstados(new Estados(EstadosExpedienteEnum.PEND_LOCALIZAR_DOCUMENTO.getId()));
				this.expedientesDao.updateEstado(expediente);

				// ** RESOLUCION DE CONCESION ** //
				// actualizamos el estado de la notificacion en el expediente a Pendiente
				expediente.setEstadoNotificacion00(EstadoNotificacionEnum.PENDIENTE.getId());
				this.expedientesDao.updateEstadoNotificacion(expediente);

				// TODO se hace la aportacion de documentacion
				TareasTramite tareaResol = new TareasTramite();
				tareaResol.setTaskguid11(task.getMailboxTaskID());
				tareaResol = this.tareasTramiteDao.findAll(tareaResol, null).get(0);

				this.prepararDocumento(procedureId, tareaResol, expediente, task.getTaskID());
				break;
			default:
				break;
			}
			break;
		case NOTIFICACION_LIQUIDACION:
			// ** En función del ID de la tarea se especifica la acción ** //
			switch ((TareasEnum.getEnumByTaskId(task.getTaskID()))) {
			case APOR_CARTA_LIQUID:
				TareaAportarDocumentacionServiceImpl.logger
						.info("TareaAportarDocumentacionServiceImpl.tareaSugerida - APOR_CARTA_LIQUID . init IM");
				// ** Finalizamos esperas pendientes **/
				// SUBSANACION
//							this.tramitacionService.finalizarEspera(task.getFolderID(), TWaitType.APORTACION_DOCUMENTACION,
//									com.ejie.ad74a.util.constantes.Constantes.Esperas.EstadosFinalizacion.DOCUMENTACION_APORTADA);
				// DESISTIMIENTO
//							this.tramitacionService.finalizarEspera(task.getFolderID(), TWaitType.DESISTIMIENTO,
//									com.ejie.ad74a.util.constantes.Constantes.Esperas.EstadosFinalizacion.DESISTIMIENTO_NO_PRESENTADO);

				// estado a pend de notificacion
				long init = System.currentTimeMillis();
				// actualizamos a pend de resolucion de concesion
				expediente.setEstados(new Estados(EstadosExpedienteEnum.PEND_CARTA_PAGO.getId()));
				// this.expedientesDao.updateEstado(expediente);

				// ** RESOLUCION DE CONCESION ** //
				// actualizamos el estado de la notificacion en el expediente a Pendiente
				expediente.setEstadoNotificacion00(EstadoNotificacionEnum.PENDIENTE.getId());
				// this.expedientesDao.updateEstadoNotificacion(expediente);
				this.expedientesDao.updateEstadoYEstadoNotificacion(expediente);
				long end = System.currentTimeMillis();

				TareaAportarDocumentacionServiceImpl.logger
						.info("updateEstadoYEstadoNotificacion::" + (end - init) / 1000 + " segundos");

				// TODO se hace la aportacion de documentacion
				TareasTramite tareaResol = new TareasTramite();
				tareaResol.setTaskguid11(task.getMailboxTaskID());
				// tareaResol = this.tareasTramiteDao.findAll(tareaResol, null).get(0);
				// CSI-IM-Problema TimeOut Tramitación. Solo se necesita el getIdTareaTram11
				// hacemos una sql customizada y evitamos findall
				TareaAportarDocumentacionServiceImpl.logger.info(
						"TareaAportarDocumentacionServiceImpl.prepararDocumento ~~PROBLEMA DOC~ task.getMailboxTaskID() : {}"
								+ task.getMailboxTaskID());
				tareaResol = this.tareasTramiteDao.findIdTareaByTaskguid11(tareaResol);
				TareaAportarDocumentacionServiceImpl.logger
						.info("TareaAportarDocumentacionServiceImpl.prepararDocumento ~~PROBLEMA DOC~ tarea : {}"
								+ tareaResol.toString());
				long end2 = System.currentTimeMillis();
				TareaAportarDocumentacionServiceImpl.logger
						.info("findIdTareaByTaskguid11::" + (end2 - end) / 1000 + " segundos");

				this.prepararDocumento(procedureId, tareaResol, expediente, task.getTaskID());
				break;
			default:
				break;
			}
		default:
			break;
		}

		TareaAportarDocumentacionServiceImpl.logger.info("TareaAportarDocumentacionServiceImpl.tareaSugerida -"
				+ task.getTaskID() + "-" + task.getMailboxTaskID() + "- fin ");
	}

	private void prepararDocumento(String procedureID, TareasTramite tarea, Expedientes expediente, String taskID)
			throws Exception {
		TareaAportarDocumentacionServiceImpl.logger
				.info("TareaAportarDocumentacionServiceImpl.prepararDocumento - INICIO ");
		// generamos documento

		DocumentosTarea doc = this.generarDocumentoResolucion(procedureID, tarea, expediente, taskID);

		// RoleId y RoleName
		MaestroTiposDoc tipoDoc = this.maestroTiposDocDao
				.find(new MaestroTiposDoc(doc.getMaestroTiposDoc().getIdTipoDoc36()));
		doc.setMaestroTiposDoc(tipoDoc);

		// subimos el documento a dokusi
		T65BDocumentIDType docIdType = this.dokusiService.almacenarDocumento(UtilSeguridad.getAuditUser(), doc,
				expediente);

		// Guardamos su OID
		doc.setOiddokusi18(docIdType.getId());

		// mandamos a localizar el documento
		String localizador = this.dokusiService.anadirLocalizadorQR(UtilSeguridad.getAuditUser(), doc.getOiddokusi18(),
				false, "true");
		doc.setLocalizador18(localizador);
		doc.setEstadoDoc18(EstadoDocuEnum.PENDIENTE_LOCALIZADOR.getId());

		this.documentosTareaDao.add(doc);

		TareaAportarDocumentacionServiceImpl.logger
				.info("TareaAportarDocumentacionServiceImpl.prepararDocumento - FIN ");
	}

	private DocumentosTarea generarDocumentoResolucion(String procedureID, TareasTramite tarea, Expedientes expediente,
			String taskID) throws Ad74aWebserviceException {

		DocumentosTarea doc = new DocumentosTarea();
		doc.setIdTareaTram18(tarea.getIdTareaTram11());
		// doc.setIdTipoDoc18(TiposDocumentoRoleEnum.RESOLUCION.getId());
		MaestroTiposDoc tipoDoc = new MaestroTiposDoc();

		switch ((TareasEnum.getEnumByTaskId(taskID))) {

		case RESOL_CONCESION:
			doc.setNombreDoc18("ResolucionConcesion");
			tipoDoc.setIdTipoDoc36(TiposDocumentoRoleEnum.RESOLUCION.getId());
			doc.setMaestroTiposDoc(tipoDoc);
			break;
		case RESOL_DENEGACION:
			doc.setNombreDoc18("ResolucionDenegacion");
			tipoDoc.setIdTipoDoc36(TiposDocumentoRoleEnum.RESOLUCION.getId());
			doc.setMaestroTiposDoc(tipoDoc);
			break;
		case REQUERIMIENTO_SUBSANACION:
			doc.setNombreDoc18("Requerimiento");
			tipoDoc.setIdTipoDoc36(TiposDocumentoRoleEnum.REQ_SUBSANACION.getId());
			doc.setMaestroTiposDoc(tipoDoc);

			// recuperamos la (ultima) tarea de estudio para obtener los motivos del
			// requerimiento
			expediente.setTareaEstudio(getLastStudyTask(expediente.getIdExpediente00()));
			break;
		case AUDIENCIA:
			doc.setNombreDoc18("Audiencia");
			tipoDoc.setIdTipoDoc36(TiposDocumentoRoleEnum.TRAMITE_AUDIENCIA.getId());
			doc.setMaestroTiposDoc(tipoDoc);

			// recuperamos la (ultima) tarea de estudio para obtener los motivos del
			// requerimiento
			expediente.setTareaEstudio(getLastStudyTask(expediente.getIdExpediente00()));
			break;
		case RESOL_DESISTIMIENTO:
			doc.setNombreDoc18("Desistimiento");
			tipoDoc.setIdTipoDoc36(TiposDocumentoRoleEnum.RESOLUCION.getId());
			doc.setMaestroTiposDoc(tipoDoc);

			// recuperamos la (ultima) tarea de estudio para obtener los motivos del
			// requerimiento
			expediente.setTareaEstudio(getLastStudyTask(expediente.getIdExpediente00()));
			break;
		case RESOL_DENEGACION_SERVICIO_AUDIENCIA:
			doc.setNombreDoc18("ResolucionDenegacionServicio");
			tipoDoc.setIdTipoDoc36(TiposDocumentoRoleEnum.RESOLUCION.getId());
			doc.setMaestroTiposDoc(tipoDoc);

			// recuperamos la (ultima) tarea de estudio para obtener los motivos del
			// requerimiento
			expediente.setTareaEstudio(getLastStudyTask(expediente.getIdExpediente00()));
			break;
		case APOR_CARTA_LIQUID:
			doc.setNombreDoc18("CartaPago");
			tipoDoc.setIdTipoDoc36(TiposDocumentoRoleEnum.CARTA_PAGO.getId());
			doc.setMaestroTiposDoc(tipoDoc);
			break;
		default:
			ManagerErrors.manageError("Tipo de tarea incorrecta para generar documentos");
		}

		HashMap<String, String> hashResultado = new HashMap<String, String>();
		hashResultado = this.documentosService.generarDocumentoResolucion(procedureID, expediente, taskID);

		String rutaPifDokusi = this.appConfiguration.getProperty("ruta.pif.dokusi");

		// dejamos el documento en la zona pif de dokusi
		String rutaDokusi = "";
		switch ((TareasEnum.getEnumByTaskId(taskID))) {
		case APOR_CARTA_LIQUID:
			rutaDokusi = Ad74aPIFws.getInstance().copyDocument(hashResultado.get("pathResultado"),
					rutaPifDokusi + "cartaPago.doc", false);
			break;
		default:
			rutaDokusi = Ad74aPIFws.getInstance().copyDocument(hashResultado.get("pathResultado"),
					rutaPifDokusi + "documentoResolucion.doc", false);

		}

		doc.setRutapif18(rutaDokusi);
		return doc;
	}

	/**
	 * Método que gestiona el evento de Tarea Ejecutada
	 */
	public void tareaEjecutada(Task task, Boolean automatica) throws Throwable {
		TareaAportarDocumentacionServiceImpl.logger.info("TareaAportarDocumentacionServiceImpl.tareaEjecutada -"
				+ task.getTaskID() + "-" + task.getMailboxTaskID() + "- inicio ");

		Expedientes expediente = new Expedientes();
		expediente.setFolderId00(task.getFolderID());
		List<Expedientes> listaExpedientes = expedientesDao.findAll(expediente, null);

		if (null != listaExpedientes && listaExpedientes.size() > 0) {
			expediente = listaExpedientes.get(0);
			TareaAportarDocumentacionServiceImpl.logger
					.info("TareaAportarDocumentacionServiceImpl.tareaEjecutada expediente: IdExpediente00 -"
							+ expediente.getIdExpediente00() + ", fResolucion - " + expediente.getfResolucion00());
		} else {
			ManagerErrors
					.manageError("Error al sugerir la tarea de aportacion: no se ha encontrado el expediente FolderId: "
							+ task.getFolderID());
		}

		this.tramitacionService.tratamientoTramiteTareaEjecutada(task, automatica);

		String procedureId = task.getProcedureID();
		TareaAportarDocumentacionServiceImpl.logger.info(
				"TareaAportarDocumentacionServiceImpl.tareaEjecutada - ADJUNTAR_DOCUMENTACION  - inicio procedureId:"
						+ procedureId);

		// ** En función del ID de la tarea se especifica la acción ** //
		switch (ProcedimientosEnum.getById(procedureId)) {

		case ALTA:
			// ** En función del ID de la tarea se especifica la acción ** //
			switch ((TareasEnum.getEnumByTaskId(task.getTaskID()))) {

			case ADJUNTAR_DOCUMENTACION:
				// eliminamos el documento de la tabla temporal el primer documento asociado al
				// expediente

				String usuAportacion72 = this.borrarDocTemporal(task);

				// grabamos el oid del informe social si el documento adjuntado es de tipo
				// informe social

				this.updateInformeData(task, expediente, usuAportacion72);
				break;
			case REQUERIMIENTO_SUBSANACION:

				// actualizamos a pend de requerimiento de subsanacion
				expediente.setEstados(new Estados(EstadosExpedienteEnum.PEND_REQ_SUBSANACION.getId()));
				this.expedientesDao.updateEstado(expediente);

				// actualizamos el estado de la notificacion en el expediente a Pendiente de
				// Firma

				expediente.setFolderId00(task.getFolderID());
				expediente.setEstadoNotificacion00(EstadoNotificacionEnum.PENDIENTE_NOTIFICAR.getId());
				this.expedientesDao.updateEstadoNotificacion(expediente);
				break;
			case RESOL_DESISTIMIENTO:
				TareaAportarDocumentacionServiceImpl.logger.info(
						"TareaAportarDocumentacionServiceImpl.tareaEjecutada - ALTA - RESOL_DESISTIMIENTO  - inicio ");
				// actualizamos el estado de la notificacion en el expediente a Pendiente de
				// notificar
				expediente.setEstadoNotificacion00(EstadoNotificacionEnum.PENDIENTE_NOTIFICAR.getId());
				this.expedientesDao.updateEstadoNotificacion(expediente);

				// actualizamos a pend de resolucion de desistimiento
				expediente.setEstados(new Estados(EstadosExpedienteEnum.PEND_NOTIFICAR_RESOL_DESISTIMIENTO.getId()));
				this.expedientesDao.updateEstado(expediente);
				// alta
				TareaAportarDocumentacionServiceImpl.logger.info(
						"TareaAportarDocumentacionServiceImpl.tareaEjecutada - ALTA - RESOL_DESISTIMIENTO  - fin ");
				break;

			case RESOL_CONCESION:
				// actualizamos el estado de la notificacion en el expediente a Pendiente de
				// Firma
				expediente.setEstadoNotificacion00(EstadoNotificacionEnum.PENDIENTE_NOTIFICAR.getId());
				// this.expedientesDao.updateEstadoNotificacion(expediente);

				this.expedientesDao.updateEstadoNotificacion(expediente);

				Solicitantes solicitante = expediente.getSolicitantes();
				TareaAportarDocumentacionServiceImpl.logger
						.debug("TareaAportarDocumentacionServiceImpl.tareaEjecutada expediente: IdExpediente00 -"
								+ expediente.getIdExpediente00() + ", fResolucion - " + expediente.getfResolucion00());

				// tratarPrecio(expediente, expediente.getIdSolicitante00());

				solicitante.setfBeneficiario01(expediente.getfResolucion00());
				solicitante.setfAltaTeleasistencia01(expediente.getfResolucion00());
				solicitante.setBeneficiario01(
						com.ejie.ad74a.util.constantes.Constantes.beneficiario01.BENEFICIARIO.getId());
				if (null != expediente.getExencionRes00()) {
					solicitante.setExencion01(expediente.getExencionRes00());
				} else {
					solicitante.setExencion01(com.ejie.ad74a.util.constantes.Constantes.exencionPago.EXENCION_PAGO_NO);
				}
				solicitante.setUsuModif01(Constantes.COD_APLICACION);

				TareaAportarDocumentacionServiceImpl.logger
						.info("TareaAportarDocumentacionServiceImpl.tareaEjecutada Solicitantes: IdSolicitante01 -"
								+ solicitante.getIdSolicitante01() + ", fBeneficiario01 - "
								+ solicitante.getfBeneficiario01() + ", fAltaTeleasistencia01 - "
								+ solicitante.getfAltaTeleasistencia01());

				this.solicitanteDao.updateAltaBeneficiario(solicitante);

				long initPrestador = System.currentTimeMillis();
				try {
					this.prestadorWsService.enviarAlta(solicitante, expediente);
				} catch (Exception e) {
					e.printStackTrace();
					TareaAportarDocumentacionServiceImpl.logger.error(
							"TareaAportarDocumentacionServiceImpl.tareaEjecutada - ALTA - RESOL_CONCESION  - error al llamar al WS del prestador: "
									+ e.getMessage());
					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 {
						errorPS.setMensaje51("#".concat(solicitante.getIdSolicitante01().toString()).concat("#")
								.concat(expediente.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
						TareaAportarDocumentacionServiceImpl.logger
								.error("Error programando re-ejecución: " + ExceptionUtils.getStackTrace(e2));
					}
				}
				long endPrestador = System.currentTimeMillis();
				TareaAportarDocumentacionServiceImpl.logger
						.info("llamada al WS del prestador :" + (endPrestador - initPrestador) / 1000 + " segundos");

				break;
			case RESOL_DENEGACION:

				// actualizamos a pend de resolucion de denegacion
				expediente.setEstados(new Estados(EstadosExpedienteEnum.PEND_RESOLUCION_DENEGACION.getId()));
				this.expedientesDao.updateEstado(expediente);

				// actualizamos el estado de la notificacion en el expediente a Pendiente de
				// Firma
				expediente.setEstadoNotificacion00(EstadoNotificacionEnum.PENDIENTE_NOTIFICAR.getId());
				this.expedientesDao.updateEstadoNotificacion(expediente);

				expediente.setfResolucion00(UtilidadesFecha.parsearFechaPlatea(task.getDoTimestamp()));
				this.expedientesDao.updateFResolucion(expediente, task.getSenderID());

				break;
			// ** Especificar acciones propias en función del tipo de tarea ** //
			// *****************************************************
			default:
				break;
			}
			break;
		case BAJA:
			// ** En función del ID de la tarea se especifica la acción ** //
			switch ((TareasEnum.getEnumByTaskId(task.getTaskID()))) {

			case ADJUNTAR_DOCUMENTACION:
				// eliminamos el documento de la tabla temporal el primer documento asociado al
				// expediente
				String usuAportacion72 = this.borrarDocTemporal(task);

				// grabamos el oid del informe social si el documento adjuntado es de tipo
				// informe social

				this.updateInformeData(task, expediente, usuAportacion72);
				break;
			case RESOL_CONCESION:

				expediente.setfResolucion00(UtilidadesFecha.parsearFechaPlatea(task.getDoTimestamp()));
				this.expedientesDao.updateFResolucion(expediente, task.getSenderID());

				Solicitantes solicitante = expediente.getSolicitantes();

				long initPrestador = System.currentTimeMillis();
				try {
					this.prestadorWsService.enviarBaja(solicitante, expediente);

				} catch (Exception e) {
					e.printStackTrace();
					TareaAportarDocumentacionServiceImpl.logger.error(
							"TareaAportarDocumentacionServiceImpl.tareaEjecutada - BAJA - RESOL_CONCESION  - error al llamar al WS del prestador: "
									+ e.getMessage());
					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);
					errorPS.setError51("-1");
					try {
						errorPS.setMensaje51("#".concat(solicitante.getIdSolicitante01().toString()).concat("#")
								.concat(expediente.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
						TareaAportarDocumentacionServiceImpl.logger
								.error("Error programando re-ejecución: " + ExceptionUtils.getStackTrace(e2));
					}
				}
				long endPrestador = System.currentTimeMillis();
				TareaAportarDocumentacionServiceImpl.logger
						.info("llamada al WS del prestador :" + (endPrestador - initPrestador) / 1000 + " segundos");

				break;
			case RESOL_DENEGACION:
			case RESOL_DENEGACION_SERVICIO_AUDIENCIA:

				// actualizamos a pend de resolucion de denegacion
				expediente.setEstados(new Estados(EstadosExpedienteEnum.PEND_RESOLUCION_DENEGACION.getId()));
				this.expedientesDao.updateEstado(expediente);

				// actualizamos el estado de la notificacion en el expediente a Pendiente de
				// Firma
				expediente.setEstadoNotificacion00(EstadoNotificacionEnum.PENDIENTE_NOTIFICAR.getId());
				this.expedientesDao.updateEstadoNotificacion(expediente);

				expediente.setfResolucion00(UtilidadesFecha.parsearFechaPlatea(task.getDoTimestamp()));
				this.expedientesDao.updateFResolucion(expediente, task.getSenderID());

				break;

			case AUDIENCIA:
				// actualizamos a pend de resolucion de audiencia
				expediente.setEstados(new Estados(EstadosExpedienteEnum.PEND_NOTI_TRAMITE_AUDIENCIA.getId()));
				this.expedientesDao.updateEstado(expediente);

				// actualizamos el estado de la notificacion en el expediente a Pendiente de
				// Firma
				expediente.setEstadoNotificacion00(EstadoNotificacionEnum.PENDIENTE_NOTIFICAR.getId());
				this.expedientesDao.updateEstadoNotificacion(expediente);

				break;

			case RESOL_DESISTIMIENTO:
				TareaAportarDocumentacionServiceImpl.logger.info(
						"TareaAportarDocumentacionServiceImpl.tareaEjecutada - BAJA - RESOL_DESISTIMIENTO  - inicio ");
				// actualizamos el estado de la notificacion en el expediente a Pendiente de
				// notificar
				expediente.setEstadoNotificacion00(EstadoNotificacionEnum.PENDIENTE_NOTIFICAR.getId());
				this.expedientesDao.updateEstadoNotificacion(expediente);

				// actualizamos a pend de resolucion de desistimiento
				expediente.setEstados(new Estados(EstadosExpedienteEnum.PEND_RESOL_DES.getId()));
				this.expedientesDao.updateEstado(expediente);
				// baja
				TareaAportarDocumentacionServiceImpl.logger.info(
						"TareaAportarDocumentacionServiceImpl.tareaEjecutada - BAJA - RESOL_DESISTIMIENTO  - fin ");
				break;

			// ** Especificar acciones propias en función del tipo de tarea ** //
			// *****************************************************
			default:
				break;
			}

			break;
		case INFORME:
			// ** En función del ID de la tarea se especifica la acción ** //
			switch ((TareasEnum.getEnumByTaskId(task.getTaskID()))) {

			case ADJUNTAR_DOCUMENTACION:
				TareaAportarDocumentacionServiceImpl.logger.info(
						"TareaAportarDocumentacionServiceImpl.tareaEjecutada - ADJUNTAR_DOCUMENTACION  - inicio ");

				Documento doc = this.recuperarDocTemporal(task.getFolderID());

				DocumentosTarea docTarea = (DocumentosTarea) doc;

				expediente.setEstados(new Estados(EstadosExpedienteEnum.PEND_COMUNICAR.getId()));
				this.expedientesDao.updateEstado(expediente);

				// El documento temporal para los informes, se borra al ser ejecutada la tarea
				// de comunicación.
				if (docTarea.getMaestroTiposDoc() != null && TiposDocumentoRoleEnum.INFORME_INTERVENCION.getId()
						.equals(docTarea.getMaestroTiposDoc().getIdTipoDoc36())) {

					// Se sugiere la solicitud informe intervencion
					this.tramitacionService.sugerirTarea(task, TareasEnum.COMUNICACION_INFORME);

				} else {
					// eliminamos el documento de la tabla temporal el primer documento asociado al
					// expediente
					this.borrarDocTemporal(task);
				}

				// grabamos el oid del informe intervencion si el documento adjuntado es de tipo
				// informe intervencion

				this.updateInformeData(task, expediente, docTarea.getUsuAlta18());

				break;
			default:
				break;
			}

			TareaAportarDocumentacionServiceImpl.logger
					.info("TareaAportarDocumentacionServiceImpl.tareaEjecutada - ADJUNTAR_DOCUMENTACION  - fin ");

			break;
		case REVISION_PRECIO:
			// ** En función del ID de la tarea se especifica la acción ** //
			switch ((TareasEnum.getEnumByTaskId(task.getTaskID()))) {
			case RESOL_CONCESION:
				TareaAportarDocumentacionServiceImpl.logger.info(
						"TareaAportarDocumentacionServiceImpl.tareaEjecutada - REVISION_PRECIO - RESOL_CONCESION  - inicio ");

				// actualizamos el estado de la notificacion en el expediente a Pendiente de
				// Firma
				expediente.setEstadoNotificacion00(EstadoNotificacionEnum.PENDIENTE_NOTIFICAR.getId());
				this.expedientesDao.updateEstadoNotificacion(expediente);

				// actualizamos a pend de resolucion de concesion
				expediente.setEstados(new Estados(EstadosExpedienteEnum.PEND_RESOLUCION_CONCESION.getId()));
				this.expedientesDao.updateEstado(expediente);
				Long idBeneficiario = solicitanteDao.findBeneficiarioPorIdSolicitante(expediente.getSolicitantes())
						.getIdSolicitante01();
				tratarPrecio(expediente, idBeneficiario);

				TareaAportarDocumentacionServiceImpl.logger.info(
						"TareaAportarDocumentacionServiceImpl.tareaEjecutada -REVISION_PRECIO - RESOL_CONCESION  - fin ");

				break;

			case RESOL_DESISTIMIENTO:
				TareaAportarDocumentacionServiceImpl.logger.info(
						"TareaAportarDocumentacionServiceImpl.tareaEjecutada - REVISION_PRECIO - RESOL_DESISTIMIENTO  - inicio ");
				// actualizamos el estado de la notificacion en el expediente a Pendiente de
				// notificar
				expediente.setEstadoNotificacion00(EstadoNotificacionEnum.PENDIENTE_NOTIFICAR.getId());
				this.expedientesDao.updateEstadoNotificacion(expediente);

				// actualizamos a pend de resolucion de desistimiento
				expediente.setEstados(new Estados(EstadosExpedienteEnum.PEND_RESOL_DES.getId()));
				this.expedientesDao.updateEstado(expediente);
				// REVISION_PRECIO
				TareaAportarDocumentacionServiceImpl.logger.info(
						"TareaAportarDocumentacionServiceImpl.tareaEjecutada -REVISION_PRECIO - RESOL_DESISTIMIENTO  - fin ");
				break;
			default:
				break;
			}
		case NOTIFICACION_LIQUIDACION:
			switch ((TareasEnum.getEnumByTaskId(task.getTaskID()))) {
			case APOR_CARTA_LIQUID:
				TareaAportarDocumentacionServiceImpl.logger.info(
						"TareaAportarDocumentacionServiceImpl.tareaEjecutada - NOTIFICACION_LIQUIDACION - APOR_CARTA_LIQUID  - inicio ");

				// actualizamos a pend de notificar liquidacion
				expediente.setEstados(new Estados(EstadosExpedienteEnum.PEND_NOTIFICAR_LIQUIDACION.getId()));
				this.expedientesDao.updateEstado(expediente);

				TareaAportarDocumentacionServiceImpl.logger.info(
						"TareaAportarDocumentacionServiceImpl.tareaEjecutada -NOTIFICACION_LIQUIDACION - APOR_CARTA_LIQUID  - fin ");

				break;
			default:
				break;

			}
		default:
			break;
		}

		TareaAportarDocumentacionServiceImpl.logger.info("TareaAportarDocumentacionServiceImpl.tareaEjecutada -"
				+ task.getTaskID() + "-" + task.getMailboxTaskID() + "- fin ");

	}

	private void tratarPrecio(Expedientes expediente, Long idBeneficiario) {
		Solicitantes solicitante = this.solicitanteDao.find(new Solicitantes(idBeneficiario));

		if (null != expediente.getExencionRes00()) {
			solicitante.setExencion01(expediente.getExencionRes00());
		} else {
			solicitante.setExencion01(com.ejie.ad74a.util.constantes.Constantes.exencionPago.EXENCION_PAGO_NO);
		}
		this.solicitanteDao.updateExencion(solicitante);
	}

	/**
	 * Método que gestiona el evento de Tarea Cancelada
	 */
	public void tareaCancelada(Task task) throws Throwable {
		TareaAportarDocumentacionServiceImpl.logger.info("TareaAportarDocumentacionServiceImpl.tareaCancelada - "
				+ task.getTaskID() + "-" + task.getMailboxTaskID() + " - inicio ");

		// ** En función del ID de la tarea se especifica la acción ** //
		switch ((TareasEnum.getEnumByTaskId(task.getTaskID()))) {

		case REQUERIMIENTO_SUBSANACION:

			this.tramitacionService.sugerirTarea(task, TareasEnum.ESTUDIO);
			break;

		// ** Especificar acciones propias en función del tipo de tarea ** //
		// *****************************************************

		default:
			break;
		}

		TareaAportarDocumentacionServiceImpl.logger.info("TareaAportarDocumentacionServiceImpl.tareaCancelada - "
				+ task.getTaskID() + "-" + task.getMailboxTaskID() + " - fin ");

	}

	/**
	 * Método que gestiona el evento de Tarea Anulada
	 */
	public void tareaAnulada(Task task) throws Throwable {
		TareaAportarDocumentacionServiceImpl.logger.info("TareaAportarDocumentacionServiceImpl.tareaAnulada - "
				+ task.getTaskID() + "-" + task.getMailboxTaskID() + " - inicio ");

		// ** En función del ID de la tarea se especifica la acción ** //
		switch ((TareasEnum.getEnumByTaskId(task.getTaskID()))) {

		case REQUERIMIENTO_SUBSANACION:
			this.tramitacionService.sugerirTarea(task, TareasEnum.ESTUDIO);
			break;

		// ** Especificar acciones propias en función del tipo de tarea ** //
		// *****************************************************

		default:
			break;
		}

		TareaAportarDocumentacionServiceImpl.logger.info("TareaAportarDocumentacionServiceImpl.tareaAnulada - "
				+ task.getTaskID() + "-" + task.getMailboxTaskID() + " - fin ");

	}

	/**
	 * Preparación de la tarea
	 */
	public TTask prepararTarea(String taskGUID) throws Throwable {
		TareaAportarDocumentacionServiceImpl.logger
				.info("TareaAportarDocumentacionServiceImpl.prepararTarea -" + taskGUID + "- inicio ");
		// preparamos tarea de Platea

		TTask tTask = plateaService.prepareTask(taskGUID, TTaskType.APORDOCU);

		TareaAportarDocumentacionServiceImpl.logger.info(
				"TareaAportarDocumentacionServiceImpl.prepararTarea -" + tTask.getTaskID() + "-" + taskGUID + "- fin ");
		return tTask;

	}

	/**
	 * Ejecución de la tarea
	 */
	public TTask ejecutarTarea(TTask tTask, DocumentosTarea documentoTarea, String firmante, boolean crearLocalizador)
			throws Throwable {
		TareaAportarDocumentacionServiceImpl.logger.info("TareaAportarDocumentacionServiceImpl.ejecutarTarea -"
				+ tTask.getTaskID() + "-" + tTask.getMailboxTaskID() + "- Inicio");

		String oidPid = "";
		try {

			// ** Tarea de Aportar Documentacion**/
			TTaskAdjuntarDoc taskAdjuntar = new TTaskAdjuntarDoc();
			if (documentoTarea.isEsExterno()) {
				taskAdjuntar.setAttchDocType(TAttachDocType.EXTERNAL);
			} else {
				taskAdjuntar.setAttchDocType(TAttachDocType.INTERNAL);
			}

			taskAdjuntar.setStoreDate(UtilidadesFecha.getFechaSistema(Constantes.PLATEA_XML_EVENTS_DATE_FORMAT));

			TTaskDocument taskDocument = new TTaskDocument();

			// ** INFO Del Documento **/
			TTaskInfoDocument document = new TTaskInfoDocument();

			document.setNature(TDocNatureType.ELECTRONICO);
			document.setFormat(TDocFormatType.ELECTRONICO);
			document.setAuthor(Constantes.COD_APLICACION);
			document.setLanguage(TLanguage.ES);
			document.setDocumentPath(documentoTarea.getRutapif18());
			// si viene oidDokusi18, es porque es un informe social que esta en PID, hay que
			// descargarlo y dejarlo el pif

			if (!Utilidades.esBlancoNulo(documentoTarea.getOiddokusi18())) {
				// el oid no es de dokusi, es de pid
				oidPid = documentoTarea.getOiddokusi18();
				String rutaPifDokusi = this.appConfiguration.getProperty("informeSocial.pif.dir");

				W43DfDocument documentPid = this.pidWS.get(documentoTarea.getOiddokusi18(), rutaPifDokusi);
				document.setDocumentPath(
						Ad74aPIFws.copiarZonaPlatea(UtilTokenXlnets.getTokenDocumentXLNets(Constantes.COD_APLICACION),
								documentPid.getContent().getPath()));
				// document.setDokusiID(documentoTarea.getOiddokusi18());
				Ad74aPIFws.getInstance().deleteDocument(documentPid.getContent().getPath());

			}
			document.setSourceName(documentoTarea.getNombreDoc18());
			document.setExtension("pdf");
			document.setTitle(documentoTarea.getNombreDoc18());
			document.setDocumentRoleID(documentoTarea.getMaestroTiposDoc().getRoleid36());
			document.setDocumentRoleName(crearRoleName(documentoTarea.getMaestroTiposDoc()));
			Date fechaDoc = null;
			if (null != documentoTarea.getfModif18()) {
				fechaDoc = documentoTarea.getfModif18();
			} else if (null != documentoTarea.getfModif18()) {
				fechaDoc = documentoTarea.getfAlta18();
			} else {
				fechaDoc = UtilidadesFecha.getFechaSistema();
			}

			document.setDocumentDate(
					UtilidadesFecha.formatearDateToStringMasc(fechaDoc, Constantes.PLATEA_XML_EVENTS_DATE_FORMAT));
			document.setValidDate(
					UtilidadesFecha.formatearDateToStringMasc(fechaDoc, Constantes.PLATEA_XML_EVENTS_DATE_FORMAT));

			// Añadimos el documento
			TTaskInfoDocumentList listaDocumentos = new TTaskInfoDocumentList();
			listaDocumentos.getDocument().add(document);
			taskDocument.setDocumentList(listaDocumentos);

			taskAdjuntar.setTaskDocument(taskDocument);

			tTask.setTaskAdjuntarDoc(taskAdjuntar);

			tTask = plateaService.doTask(TareasEnum.getTaskType(tTask.getTaskID()), tTask);

		} catch (Throwable e) {
			ManagerErrors.manageException(e,
					ConstantesCodeError.MENSAJE_ERROR_EJECUTAR_TAREA + " "
							+ TareasEnum.getEnumByTaskId(tTask.getTaskID()).getTaskId(),
					null, ConstantesCodeError.CODE_ERROR_EJECUTAR_TAREA, null);
		}

		// ** Actualizar el oid del documento dokusi ** // me esta fallan
		documentoTarea.setOiddokusi18(
				tTask.getTaskAdjuntarDoc().getTaskDocument().getDocumentList().getDocument().get(0).getDokusiID());
		documentoTarea.setUsuModif18(Constantes.COD_APLICACION);

		TareaAportarDocumentacionServiceImpl.logger.info(
				"TareaAportarDocumentacionServiceImpl.ejecutarTarea - this.documentosTareaDao.find(documentoTarea) ## idDocTarea18 : {}",
				documentoTarea.getIdDocTarea18());
		DocumentosTarea docBBDD = this.documentosTareaDao.find(documentoTarea);
		if (docBBDD != null) {
			TareaAportarDocumentacionServiceImpl.logger.info(
					"TareaAportarDocumentacionServiceImpl.ejecutarTarea - this.documentosTareaDao.find(documentoTarea) ## docBBDD != null ##");
			this.documentosTareaDao.updateOid(documentoTarea);
		} else {
			TareaAportarDocumentacionServiceImpl.logger.info(
					"TareaAportarDocumentacionServiceImpl.ejecutarTarea - this.documentosTareaDao.find(documentoTarea) ## docBBDD == null ##");
			TareasTramite tarea = new TareasTramite();
			tarea.setTaskguid11(tTask.getMailboxTaskID());
			tarea = this.tareasTramiteDao.findAll(tarea, null).get(0);
			documentoTarea.setIdTareaTram18(tarea.getIdTareaTram11());
			this.documentosTareaDao.add(documentoTarea);
		}

		DocTemporales docTemporal = new DocTemporales();
		docTemporal.setFolderId72(tTask.getFolderID());

		List<DocTemporales> listaDocTemporales = this.docTemporalesDao.findAll(docTemporal, null);
		if (!listaDocTemporales.isEmpty()) {
			DocTemporales docTemp = listaDocTemporales.get(0);
			docTemp.setOidDokusi72(documentoTarea.getOiddokusi18());
			this.docTemporalesDao.update(docTemp);
		}

		// borramos el documento de pid
		this.pidWS.delete(oidPid);

		TareaAportarDocumentacionServiceImpl.logger.info("TareaAportarDocumentacionServiceImpl.ejecutarTarea -"
				+ tTask.getTaskID() + "-" + tTask.getMailboxTaskID() + "- fin ");

		return tTask;
	}

	/**
	 * Ejecución de las tareas de resolucion de concesion, denegacion y req de
	 * subsanacion
	 */
	public TTask ejecutarTareaResol(String taskGUID, Long idDocTarea) throws Throwable {
		TareaAportarDocumentacionServiceImpl.logger
				.info("TareaAportarDocumentacionServiceImpl.ejecutarTareaResol - taskGUID:" + taskGUID);

		TTask task = this.prepararTarea(taskGUID);

		try {

			// recuperamos el documento
			DocumentosTarea documentoTarea = this.documentosTareaDao.find(new DocumentosTarea(idDocTarea));

			// ** Tarea de Aportar Documentacion**/
			TTaskAdjuntarDoc taskAdjuntar = new TTaskAdjuntarDoc();
			taskAdjuntar.setAttchDocType(TAttachDocType.INTERNAL);

			taskAdjuntar.setStoreDate(UtilidadesFecha.getFechaSistema(Constantes.PLATEA_XML_EVENTS_DATE_FORMAT));

			TTaskDocument taskDocument = new TTaskDocument();

			// ** INFO Del Documento **/
			TTaskInfoDocument document = new TTaskInfoDocument();

			document.setNature(TDocNatureType.ELECTRONICO);
			document.setFormat(TDocFormatType.ELECTRONICO);
			document.setAuthor(Constantes.COD_APLICACION);
			document.setLanguage(TLanguage.ES);
			document.setDokusiID(documentoTarea.getOiddokusi18());
			document.setSourceName(documentoTarea.getNombreDoc18() + ".pdf");
			document.setExtension("pdf");
			document.setTitle(documentoTarea.getNombreDoc18());
			document.setDocumentRoleID(documentoTarea.getMaestroTiposDoc().getRoleid36());
			document.setDocumentRoleName(crearRoleName(documentoTarea.getMaestroTiposDoc()));
			document.setDocumentDate(UtilidadesFecha.formatearDateToStringMasc(documentoTarea.getfModif18(),
					Constantes.PLATEA_XML_EVENTS_DATE_FORMAT));
			document.setValidDate(UtilidadesFecha.formatearDateToStringMasc(documentoTarea.getfModif18(),
					Constantes.PLATEA_XML_EVENTS_DATE_FORMAT));

			TPersonIDName senderID = new TPersonIDName();

			TStringList mailboxes = new TStringList();

			Expedientes expediente = new Expedientes();
			expediente.setFolderId00(task.getFolderID());
			List<Expedientes> listaExpedientes = this.expedientesDao.findAll(expediente, null);

			senderID.setID(Constantes.COD_APLICACION);
			senderID.setName("Autom&aacute;tica");

			task.setSenderID(senderID);

			// Añadimos el documento
			TTaskInfoDocumentList listaDocumentos = new TTaskInfoDocumentList();
			listaDocumentos.getDocument().add(document);
			taskDocument.setDocumentList(listaDocumentos);

			taskAdjuntar.setTaskDocument(taskDocument);

			task.setTaskAdjuntarDoc(taskAdjuntar);

			task = plateaService.doTask(TareasEnum.getTaskType(task.getTaskID()), task);

		} catch (Throwable e) {
			ManagerErrors.manageException(e,
					ConstantesCodeError.MENSAJE_ERROR_EJECUTAR_TAREA + " " + TareasEnum.getEnumByTaskId(taskGUID), null,
					ConstantesCodeError.CODE_ERROR_EJECUTAR_TAREA, null);
		}

		// eliminamos documento de pif
//		if (!Utilidades.esBlancoNulo(documentoTarea.getRutapif18())) {
//			Ad74aPIFws.getInstance().deleteDocument(documentoTarea.getRutapif18());
//		}

		TareaAportarDocumentacionServiceImpl.logger.info("TareaAportarDocumentacionServiceImpl.ejecutarTareaResol -"
				+ task.getTaskID() + "-" + task.getMailboxTaskID() + "- fin ");

		return task;
	}

	/**
	 * Ejecución de la tarea de forma automática
	 */
	public TTask ejecutarTareaAutomatica(String taskGUID) throws Throwable {

		TareaAportarDocumentacionServiceImpl.logger
				.info("TareaAportarDocumentacionServiceImpl.ejecutarTareaAutomatica -" + taskGUID + "- inicio ");

		TTask tTask = this.prepararTarea(taskGUID);
		DocumentosTarea documento = new DocumentosTarea();
		String firmante = null;

		// ** En función del ID de la tarea se especifica la acción ** //
		switch ((TareasEnum.getEnumByTaskId(tTask.getTaskID()))) {

		// solo se ejcuta la tarea automatico si es tarea de aportar doc. Para las resol
		// y requerimiento, se ejecuta despues de localizar el documento
		case ADJUNTAR_DOCUMENTACION:
			// ** ADJUNTAR DOCUMENTACIÓN- Recuperar el documento Temporal// **/
			documento = this.recuperarDocTemporal(tTask.getFolderID());

			break;

		// ** Especificar acciones propias en función del tipo de tarea ** //
		// *****************************************************
		default:
			break;
		}

		// Automática
		TareaAportarDocumentacionServiceImpl.logger
				.info("TareaAportarDocumentacionServiceImpl.ejecutarTareaAutomatica - Cargamos el senderId");
		tTask.setSenderID(TareasUtils.getSenderIdAutomatico());
		TareaAportarDocumentacionServiceImpl.logger
				.info("TareaAportarDocumentacionServiceImpl.ejecutarTareaAutomatica - SenderId cargado");

		tTask = this.ejecutarTarea(tTask, documento, firmante, true);

		TareaAportarDocumentacionServiceImpl.logger
				.info("TareaAportarDocumentacionServiceImpl.ejecutarTareaAutomatica -" + tTask.getMailboxTaskID() + "-"
						+ taskGUID + "- fin ");

		return tTask;
	}

	/**
	 * REcupera el documento Temporal
	 * 
	 * @param tTask Task con los datos de la tarea
	 * @return DocumentoTarea a aportar
	 */
	private DocumentosTarea recuperarDocTemporal(String folderID) {
		TareaAportarDocumentacionServiceImpl.logger
				.info("TareaAportarDocumentacionServiceImpl.recuperarDocTemporal -" + folderID);
		DocumentosTarea documento = null;

		DocTemporales docTemporal = new DocTemporales();
		docTemporal.setFolderId72(folderID);

		List<DocTemporales> listaDocTemporales = this.docTemporalesDao.findAll(docTemporal, null);
		if (!listaDocTemporales.isEmpty()) {
			TareaAportarDocumentacionServiceImpl.logger
					.info("TareaAportarDocumentacionServiceImpl.recuperarDocTemporal - Hay documento temporal: "
							+ listaDocTemporales.get(0).getIdDocTemporal72());
			documento = new DocumentosTarea();
			documento.setRutapif18(listaDocTemporales.get(0).getRutapif72());
			// el oid realmente es de Pid
			documento.setOiddokusi18(listaDocTemporales.get(0).getOid72());
			documento.setNombreDoc18(listaDocTemporales.get(0).getNombreDoc72());

			// RoleId y RoleName
			MaestroTiposDoc tipoDoc = this.maestroTiposDocDao
					.find(new MaestroTiposDoc(listaDocTemporales.get(0).getIdTipoDoc72()));
			documento.setMaestroTiposDoc(tipoDoc);
			documento.setUsuAlta18(docTemporal.getUsuAportacion72());
			if (listaDocTemporales.get(0).getExterno72().compareTo(1) == 0) {
				TareaAportarDocumentacionServiceImpl.logger
						.info("TareaAportarDocumentacionServiceImpl.recuperarDocTemporal - Externo ");
				documento.setEsExterno(true);
			} else {
				TareaAportarDocumentacionServiceImpl.logger
						.info("TareaAportarDocumentacionServiceImpl.recuperarDocTemporal - Interno ");
				documento.setEsExterno(false);
			}
		}
		TareaAportarDocumentacionServiceImpl.logger
				.info("TareaAportarDocumentacionServiceImpl.recuperarDocTemporal FIN ");
		return documento;

	}

	/**
	 * Borrar el primer documento asociado al expediente de la tarea
	 * 
	 * @param task
	 */
	private String borrarDocTemporal(Task task) {
		TareaAportarDocumentacionServiceImpl.logger
				.info("TareaAportarDocumentacionServiceImpl.borrarDocTemporal -" + task.getFolderID());
		String usuAportacion72 = null;
		DocTemporales docTemporal = new DocTemporales();
		docTemporal.setFolderId72(task.getFolderID());
		TableRequestDto tableRequestDto = new TableRequestDto();
		tableRequestDto.setSidx("IDDOCTEMPORAL72");
		tableRequestDto.setSord("asc");
		docTemporal = this.docTemporalesDao.findAll(docTemporal, tableRequestDto).get(0);
		if (docTemporal != null) {

			usuAportacion72 = docTemporal.getUsuAportacion72();
		}
		this.docTemporalesDao.remove(docTemporal);
		TareaAportarDocumentacionServiceImpl.logger.info("TareaAportarDocumentacionServiceImpl.borrarDocTemporal FIN ");
		return usuAportacion72;
	}

	/**
	 * Actualizar datos del informe social. el oid y el estado
	 * 
	 * @param task
	 */
	private void updateInformeData(Task task, Expedientes expediente, String usuAportacion72) {
		TareaAportarDocumentacionServiceImpl.logger
				.info("TareaAportarDocumentacionServiceImpl.updateInformeData -" + task.getFolderID());
		// recogemos el oid
		if (null != task.getTaskInfo() && null != task.getTaskInfo().getStoredocumentTaskData()
				&& null != task.getTaskInfo().getStoredocumentTaskData().getDocuments()
				&& null != task.getTaskInfo().getStoredocumentTaskData().getDocuments().getDocument()
				&& task.getTaskInfo().getStoredocumentTaskData().getDocuments().getDocument().size() > 0) {
			for (Document doc : task.getTaskInfo().getStoredocumentTaskData().getDocuments().getDocument()) {
				if (doc.getRolID().equalsIgnoreCase(TiposDocumentoRoleEnum.INFORME_SOCIAL.getRoleID())
						|| doc.getRolID().equalsIgnoreCase(TiposDocumentoRoleEnum.INFORME_INTERVENCION.getRoleID())) {
					this.documentosInformeDao.updateOidDokusiByFolderId(task.getFolderID(), null, doc.getOid(),
							usuAportacion72);
					// actualizar el informe social a disponible
					Informes informe = new Informes();
					informe.setIdExpediente16(expediente.getIdExpediente00());
					List<Informes> listadoInforme = this.informesDao.findAll(informe, null);
					if (null != listadoInforme && !listadoInforme.isEmpty()) {
						informe = listadoInforme.get(0);
						informe.setEstado16(EstadoInformesEnum.DISPONIBLE.getId());
						informe.setUsuModif16(Constantes.COD_APLICACION);
						this.informesDao.updateEstado(informe);
					}
					break;
				}
			}
		}

		TareaAportarDocumentacionServiceImpl.logger.info("TareaAportarDocumentacionServiceImpl.updateInformeData FIN ");
	}

	private TareasTramite getLastStudyTask(Long idExpediente) {
		TareaAportarDocumentacionServiceImpl.logger
				.info("TareaAportarDocumentacionServiceImpl.getLastStudyTask - idExpediente: " + idExpediente);

		List<TareasTramite> listaTareas = this.tareasTramiteDao.getLastExecutedTask(idExpediente,
				TramitesEnum.ESTUDIO_DOCUMENTACION);
		if (null == listaTareas || listaTareas.isEmpty()) {
			ManagerErrors.manageError("No se ha encontrado una tarea de estudio");
		}

		TareaAportarDocumentacionServiceImpl.logger.info("TareaAportarDocumentacionServiceImpl.getLastStudyTask FIN ");
		return listaTareas.get(0);
	}

	/**
	 * Transformación de las descripciones del tipo de documento
	 * 
	 * @param documentoTarea Con los datos del documento
	 * @return TTextI18N
	 */
	private static TTextI18N crearRoleName(MaestroTiposDoc tipoDoc) {
		TTextI18N textI18N = new TTextI18N();
		TStringI18N stringI18N;

		if (tipoDoc.getDescEs36() != null) {
			stringI18N = new TStringI18N();
			stringI18N.setLocale(TLanguage.ES);
			stringI18N.setValue(tipoDoc.getDescEs36());
			textI18N.getText().add(stringI18N);
		}
		if (tipoDoc.getDescEu36() != null) {
			stringI18N = new TStringI18N();
			stringI18N.setLocale(TLanguage.EU);
			stringI18N.setValue(tipoDoc.getDescEu36());
			textI18N.getText().add(stringI18N);
		}
		return textI18N;
	}

	private void updateBajaConcesion(Expedientes expediente, String taskGUID, String senderID, Long idBeneficiario) {

		TareaAportarDocumentacionServiceImpl.logger
				.info("TareaAportarDocumentacionServiceImpl.updateBajaConcesion -" + taskGUID + "- Inicio");

		Solicitantes solicitanteBaja = expediente.getSolicitantes();
		solicitanteBaja.setfBaja01(expediente.getfBaja00());
		solicitanteBaja.setIdMotivoBaja01(expediente.getIdMotivoBaja00());
		this.solicitanteDao.updateBajaBeneficiario(solicitanteBaja);

		tratamientoPreciosBenficiarioHistorico(expediente, idBeneficiario, false, senderID);

		TareaAportarDocumentacionServiceImpl.logger
				.info("TareaAportarDocumentacionServiceImpl.updateBajaConcesion -" + taskGUID + "- Fin");

	}

	private void tratamientoPreciosBenficiarioHistorico(Expedientes expedienteOrigen, Long idBeneficiario,
			Boolean nuevoReg, String usuario) {

		TareaAportarDocumentacionServiceImpl.logger
				.info("TareaAportarDocumentacionServiceImpl.tratamientoPreciosBenficiarioHistorico - expedienteOrigen "
						+ expedienteOrigen.getIdExpediente00() + "- idBeneficiario" + idBeneficiario + " - nuevoReg "
						+ nuevoReg + " - inicio ");

		if (expedienteOrigen != null) {
			PreciosBeneficiario preciosBeneficiarioFilter = new PreciosBeneficiario();
			preciosBeneficiarioFilter.setIdSolicitante91(idBeneficiario);
			PreciosBeneficiario pisosSolicitantesActivo = this.preciosBeneficiarioDao
					.findBySolActivo(preciosBeneficiarioFilter);
			if (null != pisosSolicitantesActivo) {
				TareaAportarDocumentacionServiceImpl.logger.debug(
						"TareaAportarDocumentacionServiceImpl.tratamientoPreciosBenficiarioHistorico - PrecioBeneficiarioActivo "
								+ pisosSolicitantesActivo.getIdPrecioBeneficiario91());

				pisosSolicitantesActivo.setFechaFin91(expedienteOrigen.getfResolucion00());
				this.preciosBeneficiarioDao.update(pisosSolicitantesActivo);
			}

		}
		TareaAportarDocumentacionServiceImpl.logger
				.info("TareaAportarDocumentacionServiceImpl.tratamientoPreciosBenficiarioHistorico - expedienteOrigen "
						+ expedienteOrigen.getIdExpediente00() + "- idBeneficiario" + idBeneficiario + " - nuevoReg "
						+ nuevoReg + "- fin ");
	}

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

}
