package com.ejie.ad74a.control;

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

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.lang.WordUtils;
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.beans.propertyeditors.CustomDateEditor;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.support.ByteArrayMultipartFileEditor;

import com.ejie.ad74a.jms.util.UtilJms;
import com.ejie.ad74a.model.Alarmas;
import com.ejie.ad74a.model.Avisos;
import com.ejie.ad74a.model.Ayuntamientos;
import com.ejie.ad74a.model.Combo;
import com.ejie.ad74a.model.Contactos;
import com.ejie.ad74a.model.Cuentas;
import com.ejie.ad74a.model.Dependencia;
import com.ejie.ad74a.model.Direcciones;
import com.ejie.ad74a.model.Discapacidad;
import com.ejie.ad74a.model.Dispositivos;
import com.ejie.ad74a.model.DispositivosSol;
import com.ejie.ad74a.model.DocumentosTarea;
import com.ejie.ad74a.model.Emergencias;
import com.ejie.ad74a.model.Expedientes;
import com.ejie.ad74a.model.Informes;
import com.ejie.ad74a.model.Intervenciones;
import com.ejie.ad74a.model.MaestroEmergencias;
import com.ejie.ad74a.model.MaestroIntervenciones;
import com.ejie.ad74a.model.MaestroNivSoporte;
import com.ejie.ad74a.model.MaestroTipoAlarma;
import com.ejie.ad74a.model.MaestroTipoLlamada;
import com.ejie.ad74a.model.MaestroTiposDoc;
import com.ejie.ad74a.model.MotivosBaja;
import com.ejie.ad74a.model.MovimientosDispositivos;
import com.ejie.ad74a.model.NotasSolicitante;
import com.ejie.ad74a.model.PagosBeneficiario;
import com.ejie.ad74a.model.PeticionesPs;
import com.ejie.ad74a.model.Protocolos;
import com.ejie.ad74a.model.Riesgos;
import com.ejie.ad74a.model.Solicitantes;
import com.ejie.ad74a.model.Soporte;
import com.ejie.ad74a.model.Terminales;
import com.ejie.ad74a.model.Valoraciones;
import com.ejie.ad74a.model.ae01b.Cobros;
import com.ejie.ad74a.service.AyuntamientosService;
import com.ejie.ad74a.service.CuentasService;
import com.ejie.ad74a.service.DependenciaService;
import com.ejie.ad74a.service.DiscapacidadService;
import com.ejie.ad74a.service.DispositivosService;
import com.ejie.ad74a.service.DispositivosSolService;
import com.ejie.ad74a.service.DocuCuentasService;
import com.ejie.ad74a.service.ExpedientesService;
import com.ejie.ad74a.service.GestionContableService;
import com.ejie.ad74a.service.InformesService;
import com.ejie.ad74a.service.MaestroEmergenciasService;
import com.ejie.ad74a.service.MaestroIntervencionesService;
import com.ejie.ad74a.service.MaestroNivSoporteService;
import com.ejie.ad74a.service.MaestroTipoAlarmaService;
import com.ejie.ad74a.service.MaestroTipoLlamadaService;
import com.ejie.ad74a.service.MaestroTiposDocService;
import com.ejie.ad74a.service.MotivosBajaService;
import com.ejie.ad74a.service.NotasSolicitanteService;
import com.ejie.ad74a.service.PeticionesPsService;
import com.ejie.ad74a.service.SolicitantesService;
import com.ejie.ad74a.service.SoporteService;
import com.ejie.ad74a.service.TerminalesService;
import com.ejie.ad74a.service.ae01b.CobrosService;
import com.ejie.ad74a.util.comun.UtilLiterales;
import com.ejie.ad74a.util.comun.UtilSeguridad;
import com.ejie.ad74a.util.comun.Utilidades;
import com.ejie.ad74a.util.constantes.ActoresEnum;
import com.ejie.ad74a.util.constantes.CanalComunicacionEnum;
import com.ejie.ad74a.util.constantes.Constantes;
import com.ejie.ad74a.util.constantes.EstadoDeLaQuejaEnum;
import com.ejie.ad74a.util.constantes.EstadoInformesEnum;
import com.ejie.ad74a.util.constantes.ModoValoracionEnum;
import com.ejie.ad74a.util.constantes.MotivoBajaEnum;
import com.ejie.ad74a.util.constantes.MotivosQuejasReclamaEnum;
import com.ejie.ad74a.util.constantes.OrigenAvisosEnum;
import com.ejie.ad74a.util.constantes.OrigenComunicacionEnum;
import com.ejie.ad74a.util.constantes.ProcedenteEnum;
import com.ejie.ad74a.util.constantes.ProcedimientosEnum;
import com.ejie.ad74a.util.constantes.TipoInformesEnum;
import com.ejie.ad74a.util.constantes.TipoMotivoRetrasoEnum;
import com.ejie.ad74a.util.constantes.TipoMovimientoDispositivoEnum;
import com.ejie.ad74a.util.constantes.TipoProtocoloEnum;
import com.ejie.ad74a.util.constantes.TipoResol24Enum;
import com.ejie.ad74a.util.constantes.TipoSentido29Enum;
import com.ejie.ad74a.util.constantes.TipoValoracionEnum;
import com.ejie.ad74a.util.constantes.TiposDocumentoRoleEnum;
import com.ejie.ad74a.util.constantes.modelos.TipoSolicitantes;
import com.ejie.x38.control.bind.annotation.RequestJsonBody;
import com.ejie.x38.dto.JerarquiaDto;
import com.ejie.x38.dto.TableRequestDto;
import com.ejie.x38.dto.TableResponseDto;
import com.ejie.x38.dto.TableRowDto;
import com.ejie.x38.util.DateTimeManager;

/**
 * SolicitantesController generated by UDA, 10-feb-2023 12:13:21.
 * 
 * @author UDA
 */

@Controller
@RequestMapping(value = "/solicitantes")

public class SolicitantesController {

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

	@Autowired
	private SolicitantesService solicitantesService;

	@Autowired
	private CuentasService cuentasService;

	@Autowired
	private ExpedientesService expedientesService;

	@Autowired
	private MotivosBajaService motivosBajaService;

	@Autowired
	private TerminalesService terminalesService;

	@Autowired
	private GestionContableService gestionContableService;

	@Autowired
	private SoporteService soporteService;

	@Autowired
	private DispositivosSolService dispositivosSolService;

	@Autowired
	private MaestroIntervencionesService maestroIntervencionesService;

	@Autowired
	private MaestroEmergenciasService maestroEmergenciasService;

	@Autowired
	private DispositivosService dispositivosService;

	@Autowired
	private InformesService informesService;

	@Autowired
	private AyuntamientosService ayuntamientosService;

	@Autowired
	private DependenciaService dependenciaService;

	@Autowired
	private DiscapacidadService discapacidadService;

	@Autowired
	private MaestroNivSoporteService maestroNivSoporteService;

	@Autowired
	private MaestroTipoAlarmaService maestroTipoAlarmaService;

	@Autowired
	private MaestroTipoLlamadaService maestroTipoLlamadaService;

	@Autowired
	private DocuCuentasService docuCuentasService;

	@Autowired
	private NotasSolicitanteService notasSolicitanteService;

	@Autowired
	private CobrosService cobrosService;

	@javax.annotation.Resource
	private ReloadableResourceBundleMessageSource appMessageSource;

	@Autowired
	private MaestroTiposDocService maestroTiposDocService;

	@Autowired
	private PeticionesPsService peticionesPsService;

	@InitBinder
	protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws ServletException {
		binder.registerCustomEditor(byte[].class, new ByteArrayMultipartFileEditor());
		binder.registerCustomEditor(Date.class,
				new CustomDateEditor(DateTimeManager.getDateTimeFormat(LocaleContextHolder.getLocale()), true));
	}

	private Object validarUsuarioAcceso(HttpServletRequest request) {
		Boolean tieneAcceso;

		String[] perfilesAcceso = { UtilSeguridad.Props.PERFIL_SEGURIDAD_ADMINISTRADOR.getValue(),
				UtilSeguridad.Props.PERFIL_SEGURIDAD_TECNICO_DSS.getValue(),
				UtilSeguridad.Props.PERFIL_SEGURIDAD_PRESTADOR_SERVICIO.getValue(),
				UtilSeguridad.Props.PERFIL_SEGURIDAD_DIRECTOR_DSS.getValue(),
				UtilSeguridad.Props.PERFIL_SEGURIDAD_SSB.getValue() };

		tieneAcceso = UtilSeguridad.tienePerfilSeguridad(perfilesAcceso);

		return tieneAcceso;
	}

	private Boolean isSoloLecturaDatosBeneficiarios(Solicitantes sol) {
		Boolean isSoloLectura;

		String[] perfilesEdicion = { UtilSeguridad.Props.PERFIL_SEGURIDAD_ADMINISTRADOR.getValue(),
				UtilSeguridad.Props.PERFIL_SEGURIDAD_TECNICO_DSS.getValue() };

		isSoloLectura = !UtilSeguridad.tienePerfilSeguridad(perfilesEdicion)
				|| (sol.getExpSolicitud() != null && sol.getExpSolicitud().getfCierre00() == null)
				|| sol.getBeneficiario01().equals(Constantes.beneficiario01.SOLICITANTE.getId());

		return isSoloLectura;

	}

	private Boolean isEditableDatosBeneficiariosPS(Solicitantes sol) {
		Boolean isEditable;

		String[] perfilPS = { UtilSeguridad.Props.PERFIL_SEGURIDAD_PRESTADOR_SERVICIO.getValue() };

		isEditable = (UtilSeguridad.tienePerfilSeguridad(perfilPS)
				&& !((sol.getExpSolicitud() != null && sol.getExpSolicitud().getfCierre00() == null)
						|| sol.getBeneficiario01() == Constantes.beneficiario01.SOLICITANTE.getId()));

		return isEditable;

	}

	private Boolean isEditableDatosBancariosPS(Solicitantes sol) {
		Boolean isEditable;

		isEditable = gestionContableService.cuentaBancariaErronea(sol.getCuentas());

		return isEditable;

	}

	private Boolean isSoloLecturaPersonasContacto(Solicitantes sol) {
		Boolean isSoloLectura;

		String[] perfilesNoEdicion = { UtilSeguridad.Props.PERFIL_SEGURIDAD_SSB.getValue(),
				UtilSeguridad.Props.PERFIL_SEGURIDAD_DIRECTOR_DSS.getValue(),
				UtilSeguridad.Props.PERFIL_SEGURIDAD_TECNICO_DSS.getValue() };

		isSoloLectura = UtilSeguridad.tienePerfilSeguridad(perfilesNoEdicion)
				|| (sol.getExpSolicitud() != null && sol.getExpSolicitud().getfCierre00() == null);

		return isSoloLectura;

	}
	/*
	 * OPERACIONES CRUD (Create, Read, Update, Delete)
	 * 
	 */

	/**
	 * Operacion CRUD Read. Devuelve el bean correspondiente al identificador
	 * indicado.
	 * 
	 * @param idSolicitante01 Long
	 * @return Solicitantes Objeto correspondiente al identificador indicado.
	 */
	@RequestMapping(value = "/{idSolicitante01}", method = RequestMethod.GET)
	public @ResponseBody Solicitantes get(@PathVariable Long idSolicitante01) {
		Solicitantes solicitantes = new Solicitantes();
		solicitantes.setIdSolicitante01(idSolicitante01);
		solicitantes = this.solicitantesService.find(solicitantes);
		SolicitantesController.logger.info("[GET - findBy_PK] : Obtener Solicitantes por PK");
		return solicitantes;
	}

	/**
	 * Devuelve una lista de beans correspondientes a los valores de filtrados
	 * indicados en el objeto pasado como parametro.
	 *
	 * @param filterSolicitantes Solicitantes Objeto que contiene los parametros de
	 *                           filtrado utilizados en la busqueda.
	 * @return List<Solicitantes> Lista de objetos correspondientes a la busqueda
	 *         realizada.
	 */
	@RequestMapping(method = RequestMethod.GET)
	public @ResponseBody List<Solicitantes> getAll(@ModelAttribute Solicitantes filterSolicitantes) {
		SolicitantesController.logger.info("[GET - find_ALL] : Obtener Solicitantes por filtro");
		return this.solicitantesService.findAll(filterSolicitantes, null);
	}

	/**
	 * Operacion CRUD Edit. Modificacion del bean indicado.
	 *
	 * @param solicitantes Solicitantes Bean que contiene la informacion a
	 *                     modificar.
	 * @return Solicitantes Bean resultante de la modificacion.
	 */
	@RequestMapping(value = "/edit", method = RequestMethod.PUT)
	public @ResponseBody Solicitantes edit(@RequestBody Solicitantes solicitantes) {
		Solicitantes solBBDD = this.solicitantesService.find(solicitantes);
		/*
		 * if ( !solicitantes.getCuentas().equals(solBBDD.getCuentas())) {
		 * System.out.println("prueba"); }
		 */
		Solicitantes solicitantesAux = this.solicitantesService.update(solicitantes);
		SolicitantesController.logger.info("[PUT] : Solicitantes actualizado correctamente");
		return solicitantesAux;
	}

	/**
	 * Operacion CRUD Edit. Modificacion del bean indicado.
	 *
	 * @param solicitantes Solicitantes Bean que contiene la informacion a
	 *                     modificar.
	 * @return Solicitantes Bean resultante de la modificacion.
	 */
	@RequestMapping(value = "/editIdiomaServicio", method = RequestMethod.PUT)
	public @ResponseBody Solicitantes editIdiomaServicio(@RequestBody Solicitantes solicitantes) {
		Solicitantes solicitantesAux = this.solicitantesService.updateIdiomaServicio(solicitantes);
		SolicitantesController.logger.info("[PUT] : Solicitantes actualizado correctamente");
		return solicitantesAux;
	}

	/**
	 * Operacion CRUD Create. Creacion de un nuevo registro a partir del bean
	 * indicado.
	 *
	 * @param solicitantes Solicitantes Bean que contiene la informacion con la que
	 *                     se va a crear el nuevo registro.
	 * @return Solicitantes Bean resultante del proceso de creacion.
	 */
	@RequestMapping(value = "/add", method = RequestMethod.POST)
	public @ResponseBody Solicitantes add(@RequestBody Solicitantes solicitantes) {
		Solicitantes solicitantesAux = this.solicitantesService.add(solicitantes);
		SolicitantesController.logger.info("[POST] : Solicitantes insertado correctamente");
		return solicitantesAux;
	}

	/**
	 * Operacion CRUD Delete. Borrado del registro correspondiente al identificador
	 * especificado.
	 *
	 * @param idSolicitante01 Long Identificador del objeto que se desea eliminar.
	 * @return Solicitantes Bean eliminado.
	 */
	@RequestMapping(value = "/{idSolicitante01}", method = RequestMethod.DELETE)
	@ResponseStatus(value = HttpStatus.OK)
	public @ResponseBody Solicitantes remove(@PathVariable Long idSolicitante01) {
		Solicitantes solicitantes = new Solicitantes();
		solicitantes.setIdSolicitante01(idSolicitante01);
		this.solicitantesService.remove(solicitantes);
		SolicitantesController.logger.info("[DELETE] : Solicitantes borrado correctamente");
		return solicitantes;
	}

	/*
	 * METODOS COMPONENTE RUP_TABLE
	 * 
	 */

	/**
	 * Metodo de presentacion del RUP_TABLE.
	 * 
	 * @param model Model
	 * @return String
	 */
	@RequestMapping(value = "/maint", method = RequestMethod.GET)
	public String getFormEdit(Model model, HttpServletRequest request) {
		SolicitantesController.logger.info("[GET - View] : solicitantes");
		if (Boolean.FALSE.equals(this.validarUsuarioAcceso(request))) {
			return "accessDenied";
		}
		// Solo se muestran aquellos que sean beneficiario
		Solicitantes sol = new Solicitantes();
		sol.setBeneficiario01(Constantes.beneficiario01.BENEFICIARIO.getId());
		sol.setActivo(TipoSolicitantes.ACTIVO_SI);
		model.addAttribute("solicitantes", sol);

		MaestroNivSoporte maestroNivSoporteFilter = new MaestroNivSoporte();
		model.addAttribute("nivelesSoporte", this.maestroNivSoporteService.findAll(maestroNivSoporteFilter, null));

		List<Combo> tipoBeneficiarioList = new ArrayList<Combo>();
		for (TipoSolicitantes.TipoBeneficiario01 enumeracion : TipoSolicitantes.TipoBeneficiario01.values()) {
			tipoBeneficiarioList.add(enumeracion.getCombo());
		}
		model.addAttribute("tipoBeneficiarioList", tipoBeneficiarioList);

		model.addAttribute("title", UtilLiterales.getLiteralMessage(appMessageSource, "title.beneficiarios"));
//		List<Dispositivos> dispositivosAll = this.dispositivosService.findAll(new Dispositivos(), null);
//		model.addAttribute("dispositivosAll", dispositivosAll);

		return "solicitantes";
	}

	/**
	 * Operacion de filtrado del componente RUP_TABLE.
	 * 
	 * @param filterSolicitantes Solicitantes Bean que contiene los parametros de
	 *                           filtrado a emplear.
	 * @param tableRequestDto    Dto que contiene los parametros de configuracion
	 *                           propios del RUP_TABLE a aplicar en el filtrado.
	 * @return TableResponseDto<Solicitantes> Dto que contiene el resultado del
	 *         filtrado realizado por el componente RUP_TABLE.
	 */
	@RequestMapping(value = "/filter", method = RequestMethod.POST)
	public @ResponseBody TableResponseDto<Solicitantes> filter(
			@RequestJsonBody(param = "filter") Solicitantes filterSolicitantes,
			@RequestJsonBody TableRequestDto tableRequestDto, HttpServletRequest request) {
		SolicitantesController.logger.info("[POST - filter] : Obtener Solicitantess");
		Boolean isSSB = UtilSeguridad.isSSB(request);
		HttpSession sesion = request.getSession();
		Long ayuntamientoSeleccionado = (Long) sesion.getAttribute(Constantes.VARCONTEXTO_AYUNTAMIENTO_SELECCIONADO);
		Ayuntamientos ayuntamiento = this.ayuntamientosService.find(new Ayuntamientos(ayuntamientoSeleccionado));
		return this.solicitantesService.filter(filterSolicitantes, tableRequestDto, false, isSSB, ayuntamiento);
	}

	@RequestMapping(value = "/sameDirectionBenefActivo/filter", method = RequestMethod.POST)
	public @ResponseBody TableResponseDto<Solicitantes> filterSameDirectionBenefActivo(
			@RequestJsonBody(param = "filter") Solicitantes filterSolicitantes,
			@RequestJsonBody TableRequestDto tableRequestDto) {
		SolicitantesController.logger.info("[POST - filter] : Obtener Solicitantess");
		return this.solicitantesService.filterSameDirectionBenefActivo(filterSolicitantes, tableRequestDto, false);
	}

	@RequestMapping(value = "/tieneAsociados/{idSolicitante01}", method = RequestMethod.GET)
	public @ResponseBody boolean tieneAsociados(@PathVariable Long idSolicitante01) {
		SolicitantesController.logger.info("[POST - filter] : Obtener Solicitantess");
		Solicitantes filtroSolicitante = new Solicitantes();
		filtroSolicitante.setIdSolicitante01(idSolicitante01);
		List<Solicitantes> solicitantes = this.solicitantesService.tieneAsociados(filtroSolicitante);
		return solicitantes != null && !solicitantes.isEmpty();
	}

	/**
	 * Operacion de busqueda del componente RUP_TABLE.
	 * 
	 * @param filterSolicitantes Solicitantes Bean que contiene los parametros de
	 *                           filtrado a emplear.
	 * @param searchSolicitantes Solicitantes Bean que contiene los parametros de
	 *                           busqueda a emplear.
	 * @param tableRequestDto    Dto que contiene los parametros de configuracion
	 *                           propios del RUP_TABLE a aplicar en la búsqueda.
	 * @return TableRowDto<Solicitantes> Dto que contiene el resultado de la
	 *         busqueda realizada por el componente RUP_TABLE.
	 */
	@RequestMapping(value = "/search", method = RequestMethod.POST)
	public @ResponseBody List<TableRowDto<Solicitantes>> search(
			@RequestJsonBody(param = "filter") Solicitantes filterSolicitantes,
			@RequestJsonBody(param = "search") Solicitantes searchSolicitantes,
			@RequestJsonBody TableRequestDto tableRequestDto) {
		SolicitantesController.logger.info("[POST - search] : Buscar Solicitantess");
		return this.solicitantesService.search(filterSolicitantes, searchSolicitantes, tableRequestDto, false);
	}

	/**
	 * Borrado multiple de registros
	 * 
	 * @param filterSolicitantes Solicitantes Bean que contiene los parametros de
	 *                           filtrado a emplear.
	 * @param tableRequestDto    Dto que contiene los parametros de configuracion
	 *                           propios del RUP_TABLE a aplicar en la busqueda.
	 * @return List<String> Lista de los identificadores de los registros
	 *         eliminados.
	 * 
	 */
	@RequestMapping(value = "/deleteAll", method = RequestMethod.POST)
	@ResponseStatus(value = HttpStatus.OK)
	public @ResponseBody List<String> removeMultiple(@RequestJsonBody TableRequestDto tableRequestDto) {
		SolicitantesController.logger.info("[POST - removeMultiple] : Eliminar multiples Solicitantess");
		this.solicitantesService.removeMultiple(tableRequestDto);
		SolicitantesController.logger.info("All entities correctly deleted!");

		return tableRequestDto.getMultiselection().getSelectedIds();
	}

	/*
	 * METODOS COMPONENTE RUP_TABLE - JERARQUIA
	 */

	/**
	 * Operacion de filtrado del componente RUP_TABLE para presentar los registros
	 * mediante visualizacion jerarquica.
	 * 
	 * @param filterSolicitantes Solicitantes Bean que contiene los parametros de
	 *                           filtrado a emplear.
	 * @param tableRequestDto    Dto que contiene los parametros de configuracion
	 *                           propios del RUP_TABLE a aplicar en el filtrado.
	 * @return TableResponseDto<JerarquiaDto<Solicitantes>> Dto que contiene el
	 *         resultado del filtrado realizado por el componente RUP_TABLE.
	 */
	@RequestMapping(value = "/jerarquia/filter", method = RequestMethod.POST)
	public @ResponseBody TableResponseDto<JerarquiaDto<Solicitantes>> jerarquia(
			@RequestJsonBody(param = "filter") Solicitantes filterSolicitantes,
			@RequestJsonBody TableRequestDto tableRequestDto) {
		SolicitantesController.logger.info("[POST - jerarquia] : Obtener Solicitantess jerarquia");
		return this.solicitantesService.jerarquia(filterSolicitantes, tableRequestDto, false);
	}

	/**
	 * Recupera los hijos de los registros desplegados en la visualizacion
	 * jerarquica.
	 * 
	 * @param filterSolicitantes Solicitantes Bean que contiene los parametros de
	 *                           filtrado a emplear.
	 * @param tableRequestDto    Dto que contiene los parametros de configuracion
	 *                           propios del RUP_TABLE a aplicar en el filtrado.
	 * @return TableResponseDto<JerarquiaDto<Solicitantes>> Dto que contiene el
	 *         resultado del filtrado realizado por el componente RUP_TABLE.
	 */
	@RequestMapping(value = "/jerarquiaChildren", method = RequestMethod.POST)
	public @ResponseBody TableResponseDto<JerarquiaDto<Solicitantes>> jerarquiaChildren(
			@RequestJsonBody(param = "filter") Solicitantes filterSolicitantes,
			@RequestJsonBody TableRequestDto tableRequestDto) {
		SolicitantesController.logger.info("[POST - jerarquia] : Obtener Solicitantess jerarquia - Hijos");
		return this.solicitantesService.jerarquiaChildren(filterSolicitantes, tableRequestDto);
	}

	/**
	 * EXPORTERS
	 */
	/**
	 * Devuelve los datos exportados de la tabla y los copia al Portapapeles.
	 *
	 * @param filterSolicitantes Solicitantes
	 * @param tableRequestDto    TableRequestDto
	 */
	@RequestMapping(value = "/clipboardReport", method = RequestMethod.POST)
	protected @ResponseBody List<Solicitantes> getClipboardReport(
			@RequestJsonBody(param = "filter") Solicitantes filterSolicitantes,
			@RequestJsonBody TableRequestDto tableRequestDto) {
		SolicitantesController.logger.info("[POST - clipboardReport] : : Copiar en Portapapeles");
		return this.solicitantesService.getMultiple(filterSolicitantes, tableRequestDto, false);
	}

	/**
	 * Devuelve un fichero excel que contiene los datos exportados de la tabla.
	 *
	 * @param filter          Solicitantes
	 * @param columns         String[]
	 * @param fileName        String
	 * @param sheetTitle      String
	 * @param tableRequestDto TableRequestDto
	 * @param request         HttpServletRequest
	 * @param response        HttpServletResponse
	 */
	@RequestMapping(value = { "/xlsReport",
			"/xlsxReport" }, method = RequestMethod.POST, produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
	protected @ResponseBody void generateExcelReport(
			@RequestJsonBody(param = "filter", required = false) Solicitantes filter,
			@RequestJsonBody(param = "columns", required = false) String[] columns,
			@RequestJsonBody(param = "columnsName", required = false) String[] columnsName,
			@RequestJsonBody(param = "fileName", required = false) String fileName,
			@RequestJsonBody(param = "sheetTitle", required = false) String sheetTitle,
			@RequestJsonBody TableRequestDto tableRequestDto, HttpServletRequest request, HttpServletResponse response)
			throws ServletException {
		SolicitantesController.logger.info("[POST - generateExcelReport] : Devuelve un fichero excel");

		this.solicitantesService.generateReport(filter, columns, columnsName, fileName, sheetTitle, tableRequestDto,
				request, response);
	}

	@RequestMapping(value = { "/sameDirectionBenefActivo/xlsReport",
			"/sameDirectionBenefActivo/xlsxReport" }, method = RequestMethod.POST, produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
	public @ResponseBody void sameDirectionBenefActivoGenerateExcelReport(
			@RequestJsonBody(param = "filter", required = false) Solicitantes filter,
			@RequestJsonBody(param = "columns", required = false) String[] columns,
			@RequestJsonBody(param = "columnsName", required = false) String[] columnsName,
			@RequestJsonBody(param = "fileName", required = false) String fileName,
			@RequestJsonBody(param = "sheetTitle", required = false) String sheetTitle,
			@RequestJsonBody TableRequestDto tableRequestDto, HttpServletRequest request,
			HttpServletResponse response) {
		SolicitantesController.logger.info("[POST - filter] : Obtener Solicitantess");
		this.solicitantesService.generateReport(filter, columns, columnsName, fileName, sheetTitle, tableRequestDto,
				request, response);
	}

	/**
	 * Devuelve un fichero pdf que contiene los datos exportados de la tabla.
	 *
	 * @param filter          Solicitantes
	 * @param columns         String[]
	 * @param fileName        String
	 * @param sheetTitle      String
	 * @param tableRequestDto TableRequestDto
	 * @param request         HttpServletRequest
	 * @param response        HttpServletResponse
	 */
	@RequestMapping(value = "pdfReport", method = RequestMethod.POST, produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
	protected @ResponseBody void generatePDFReport(
			@RequestJsonBody(param = "filter", required = false) Solicitantes filter,
			@RequestJsonBody(param = "columns", required = false) String[] columns,
			@RequestJsonBody(param = "columnsName", required = false) String[] columnsName,
			@RequestJsonBody(param = "fileName", required = false) String fileName,
			@RequestJsonBody(param = "sheetTitle", required = false) String sheetTitle,
			@RequestJsonBody TableRequestDto tableRequestDto, HttpServletRequest request,
			HttpServletResponse response) {
		SolicitantesController.logger.info("[POST - generatePDFReport] : Devuelve un fichero pdf");

		this.solicitantesService.generateReport(filter, columns, columnsName, fileName, sheetTitle, tableRequestDto,
				request, response);
	}

	/**
	 * Devuelve un fichero ods que contiene los datos exportados de la tabla.
	 *
	 * @param filter          Solicitantes
	 * @param columns         String[]
	 * @param fileName        String
	 * @param sheetTitle      String
	 * @param tableRequestDto TableRequestDto
	 * @param request         HttpServletRequest
	 * @param response        HttpServletResponse
	 */
	@RequestMapping(value = "odsReport", method = RequestMethod.POST, produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
	protected @ResponseBody void generateODSReport(
			@RequestJsonBody(param = "filter", required = false) Solicitantes filter,
			@RequestJsonBody(param = "columns", required = false) String[] columns,
			@RequestJsonBody(param = "columnsName", required = false) String[] columnsName,
			@RequestJsonBody(param = "fileName", required = false) String fileName,
			@RequestJsonBody(param = "sheetTitle", required = false) String sheetTitle,
			@RequestJsonBody TableRequestDto tableRequestDto, HttpServletRequest request,
			HttpServletResponse response) {
		SolicitantesController.logger.info("[POST - generateODSReport] : Devuelve un fichero ods");

		this.solicitantesService.generateReport(filter, columns, columnsName, fileName, sheetTitle, tableRequestDto,
				request, response);
	}

	/**
	 * Devuelve un fichero csv que contiene los datos exportados de la tabla.
	 *
	 * @param filter          Solicitantes
	 * @param columns         String[]
	 * @param fileName        String
	 * @param sheetTitle      String
	 * @param tableRequestDto TableRequestDto
	 * @param request         HttpServletRequest
	 * @param response        HttpServletResponse
	 */
	@RequestMapping(value = "csvReport", method = RequestMethod.POST, produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
	protected @ResponseBody void generateCSVReport(
			@RequestJsonBody(param = "filter", required = false) Solicitantes filter,
			@RequestJsonBody(param = "columns", required = false) String[] columns,
			@RequestJsonBody(param = "columnsName", required = false) String[] columnsName,
			@RequestJsonBody(param = "fileName", required = false) String fileName,
			@RequestJsonBody(param = "sheetTitle", required = false) String sheetTitle,
			@RequestJsonBody TableRequestDto tableRequestDto, HttpServletRequest request,
			HttpServletResponse response) {
		SolicitantesController.logger.info("[POST - generateCSVReport] : Devuelve un fichero csv");

		this.solicitantesService.generateReport(filter, columns, columnsName, fileName, sheetTitle, tableRequestDto,
				request, response);
	}

	/**
	 * Detalle de un solicitante
	 * 
	 * @param actionType   String
	 * @param fixedMessage String
	 * @param model        Model
	 *
	 * @return String tiles del detalle de un expediente
	 */

	@GetMapping(value = "/detail/{idSolicitante01}")
	public String getDetail(@PathVariable Long idSolicitante01, Model model, HttpServletRequest request) {
		SolicitantesController.logger.info("[POST - detail] : solicitantes");

		if (Boolean.FALSE.equals(this.validarUsuarioAcceso(request))) {
			return "accessDenied";
		}
		// Recuperamos los datos del solicitante
		Solicitantes sol = this.solicitantesService.find(new Solicitantes(idSolicitante01));
		if (null == sol) {
			model.addAttribute("exception_message",
					Utilidades.getLabelFromResource(Constantes.BASENAME_RESOURCE_AD74A_I18N,
							com.ejie.ad74a.constantes.Constantes.ERROR_NOEXISTESOL_MESSAGE,
							LocaleContextHolder.getLocale()));
			model.addAttribute("exception_name",
					Utilidades.getLabelFromResource(Constantes.BASENAME_RESOURCE_AD74A_I18N,
							com.ejie.ad74a.constantes.Constantes.ERROR_NOEXISTESOL_NAME,
							LocaleContextHolder.getLocale()));
			return "error";
		}

		// Controlar que en beneficiario
		if (sol.getBeneficiario01() == null || sol.getBeneficiario01() == 0) {
			model.addAttribute("msg", "El solicitante no es beneficiario de Teleasistencia");
			return "accessDeniedIntegrado";
		}

		Dependencia dependencia = new Dependencia();
		dependencia.setIdSolicitante04(idSolicitante01);
		sol.setDependencia(this.dependenciaService.findByIdSol(dependencia));

		Discapacidad discapacidad = new Discapacidad();
		discapacidad.setIdSolicitante71(idSolicitante01);
		sol.setDiscapacidad(this.discapacidadService.findByIdSol(discapacidad));

		model.addAttribute("solicitante", sol);
		Informes infomeSocialFilter = new Informes();
		infomeSocialFilter.setIdBeneficiario16(idSolicitante01);
		infomeSocialFilter.setTipoInforme16(TipoInformesEnum.INFSOC.getId());
		infomeSocialFilter.setEstado16(EstadoInformesEnum.DISPONIBLE.getId());

		Dependencia depFilter = new Dependencia();
		depFilter.setIdSolicitante04(sol.getIdSolicitante01());
		model.addAttribute("dependencia", this.dependenciaService.findByIdSol(depFilter));

		NotasSolicitante notasSol = new NotasSolicitante();
		notasSol.setIdSolicitante53(idSolicitante01);
		Long tieneNotas = this.notasSolicitanteService.findAllLikeCount(notasSol, null, null);

		TableRequestDto tableRequestDtoSocial = new TableRequestDto();
		tableRequestDtoSocial.setSidx("FFIN16");
		tableRequestDtoSocial.setSord("desc");
		Integer usuario = null;
		if (UtilSeguridad.isDSS(request) || UtilSeguridad.isDirector(request)) {
			usuario = 1;
		} else if (UtilSeguridad.isPS(request)) {
			usuario = 2;
		} else if (UtilSeguridad.isSSB(request)) {
			usuario = 3;
		} else if (UtilSeguridad.isAdmin(request)) {
			usuario = 4;
		}
//		List<Informes> informeSocialList = this.informesDao.findAll(infomeSocialFilter, tableRequestDtoSocial);
		List<Informes> informeSocialList = this.informesService.findAllLikePorUsuario(infomeSocialFilter,
				tableRequestDtoSocial, false, usuario);

		if (informeSocialList.size() > 0) {
			model.addAttribute("informes", informeSocialList.get(0));
			model.addAttribute("tieneInfSocial", true);
		} else {
			model.addAttribute("informes", null);
			model.addAttribute("tieneInfSocial", false);
		}
		// TODO: control estado
		model.addAttribute("isSoloLecturaDatosBeneficiarios", this.isSoloLecturaDatosBeneficiarios(sol));
		model.addAttribute("isAdmin", UtilSeguridad.isAdmin(request));
		model.addAttribute("isPS", UtilSeguridad.isPS(request));
		model.addAttribute("isDSS", UtilSeguridad.isDSS(request));
		model.addAttribute("isSSB", UtilSeguridad.isSSB(request));
		model.addAttribute("isTecnicoDSS", UtilSeguridad.isTecnicoDSS(request));
		model.addAttribute("isDirector", UtilSeguridad.isDirector(request));
		model.addAttribute("usuarioConectado", UtilSeguridad.getUsuarioConectado().getUserName());

		// Todo revisar obtener valoracion inicial
		model.addAttribute("valoracionInicial", false);

		// Historicos
		model.addAttribute("valoraciones", new Valoraciones());
		model.addAttribute("soporte", new Soporte());
		model.addAttribute("dependencia", new Dependencia());
		model.addAttribute("direcciones", new Direcciones());
		model.addAttribute("riesgos", new Riesgos());
		model.addAttribute("cuentas", new Cuentas());
		model.addAttribute("tieneExpIniciado", this.solicitantesService.tieneExpedienteIniciado(idSolicitante01));
		model.addAttribute("esBajaSolicitante", sol.getfBaja01() != null);
		model.addAttribute("menu", false);
//		model.addAttribute("title", UtilLiterales.getLiteralMessage(appMessageSource, "title.beneficiarios"));
		String[] paramTittle = { sol.getIdentificador01(), sol.getNombreCompleto() };
		model.addAttribute("title",
				UtilLiterales.getLiteralMessageWithParams(appMessageSource, "title.beneficiario", paramTittle));
		model.addAttribute("esBaja", (sol.getfBaja01() != null && sol.getfRetirada01() == null));
		model.addAttribute("numNotas", tieneNotas);

		return "beneficiarioDetail";
	}

	/**
	 * Metodo que recupera el jsp con la cabecera del expediente con los datos en
	 * BBDD
	 * 
	 * @param idSolicitante01
	 * @param model
	 * @param request
	 * @return
	 */

	@GetMapping(value = "/obtenerCabeceraBeneficiario")
	public String obtenerCabeceraBeneficiario(
			@RequestParam(value = "idSolicitante01", required = true) Long idSolicitante01, Model model,
			HttpServletRequest request) {

		if (Boolean.FALSE.equals(this.validarUsuarioAcceso(request))) {
			return "accessDenied";
		}

		// Recuperamos los datos del solicitante
		Solicitantes sol = this.solicitantesService.find(new Solicitantes(idSolicitante01));
		Expedientes expFiltro = new Expedientes();
		expFiltro.setSolicitantes(sol);
		sol.setExpSolicitud(this.expedientesService.findExpBySolProc(expFiltro, ProcedimientosEnum.ALTA,
				ProcedimientosEnum.X87_TEA_1));

		sol.setSoporte(this.soporteService.findActivoBySolicitante(sol));

		model.addAttribute("solicitante", sol);

		Dependencia depFilter = new Dependencia();
		depFilter.setIdSolicitante04(sol.getIdSolicitante01());
		model.addAttribute("dependencia", this.dependenciaService.findByIdSol(depFilter));

		// La persona con perfil ‘Director’ podrá acceder a toda la información del
		// expediente en modo consulta.
		/*
		 * model.addAttribute("isPerfilAdmin", UtilSeguridad.isAdmin());
		 * model.addAttribute("isPerfilModificacion",
		 * this.validarUsuarioModificacion(request));
		 * model.addAttribute("mostrarDatosCabecera",
		 * this.getMostrarDatosCabecera(fechasExp, request));
		 * model.addAttribute("isSoloConsulta", this.getIsSoloConsulta(expedientes,
		 * request)); model.addAttribute("isExpedienteCerrado",
		 * this.getIsExpedienteCerradoMigrado(expedientes));
		 */
		return "solicitantesDetailCabecera";
	}

	@RequestMapping(value = "/tabDatosBeneficiarios/{idSolicitante01}", method = RequestMethod.GET)
	public String getTabDatosBeneficiarios(Model model, @PathVariable Long idSolicitante01,
			HttpServletRequest request) {

		if (Boolean.FALSE.equals(this.validarUsuarioAcceso(request))) {
			return "accessDenied";
		}

		Solicitantes solicitantes = this.solicitantesService.find(new Solicitantes(idSolicitante01));

		// Dependencia y discapacidad

		Dependencia depenFilter = new Dependencia();
		depenFilter.setIdSolicitante04(solicitantes.getIdSolicitante01());
		solicitantes.setDependencia(this.dependenciaService.findByIdSol(depenFilter));
		Discapacidad discaFilter = new Discapacidad();
		discaFilter.setIdSolicitante71(solicitantes.getIdSolicitante01());
		solicitantes.setDiscapacidad(this.discapacidadService.findByIdSol(discaFilter));

		if (solicitantes.getDependencia() != null && (solicitantes.getDependencia().getUsuAlta04() == null
				|| (!solicitantes.getDependencia().getUsuAlta04().equals("MIGRADO")))) {
			solicitantes.getDependencia().setDescOtraDependencia04(null);
		}

		Expedientes expFiltro = new Expedientes();
		expFiltro.setSolicitantes(solicitantes);
		solicitantes.setExpSolicitud(this.expedientesService.findExpBySolProc(expFiltro, ProcedimientosEnum.ALTA,
				ProcedimientosEnum.X87_TEA_1));

		model.addAttribute("solicitantes", solicitantes);

		model.addAttribute("isSoloLecturaDatosBeneficiarios", this.isSoloLecturaDatosBeneficiarios(solicitantes));
		model.addAttribute("isEditableDatosBeneficiariosPS", this.isEditableDatosBeneficiariosPS(solicitantes));
		model.addAttribute("isEditableDatosBancariosPS", this.isEditableDatosBancariosPS(solicitantes));

		return "tabDatosBeneficiarios";

	}

	@RequestMapping(value = "/tabPersonasContacto/{idSolicitante01}", method = RequestMethod.GET)
	public String getTabPersonasContacto(Model model, @PathVariable Long idSolicitante01, HttpServletRequest request) {

		if (Boolean.FALSE.equals(this.validarUsuarioAcceso(request))) {
			return "accessDenied";
		}
		Solicitantes solicitantes = this.solicitantesService.find(new Solicitantes(idSolicitante01));
		model.addAttribute("isSoloLecturaPersonasContacto", this.isSoloLecturaPersonasContacto(solicitantes));
		Contactos cont = new Contactos();
		cont.setIdSolicitante03(idSolicitante01);
		model.addAttribute("contactossolicitante", cont);
		return "tabPersonasContacto";

	}

	@RequestMapping(value = "/tabPrestacionServicios/{idSolicitante01}", method = RequestMethod.GET)
	public String getTabPrestacionServicios(Model model, @PathVariable Long idSolicitante01,
			HttpServletRequest request) {

		if (Boolean.FALSE.equals(this.validarUsuarioAcceso(request))) {
			return "accessDenied";
		}
		// Modelos
		Solicitantes solicitantes = this.solicitantesService.findPrestacionServicio(new Solicitantes(idSolicitante01));

		model.addAttribute("solicitantes", solicitantes);
		model.addAttribute("isEditableDatosBeneficiariosPS", this.isEditableDatosBeneficiariosPS(solicitantes));

		Protocolos protocolos = new Protocolos();
		protocolos.setIdSolicitante26(idSolicitante01);
		model.addAttribute("protocolos", protocolos);

		Intervenciones intervenciones = new Intervenciones();
		intervenciones.setSolicitantes(new Solicitantes(idSolicitante01));
		model.addAttribute("intervenciones", intervenciones);

		Valoraciones valoraciones = new Valoraciones();
		valoraciones.setIdSolicitante08(idSolicitante01);
		model.addAttribute("valoraciones", valoraciones);

		Emergencias emergencias = new Emergencias();
		emergencias.setIdSolicitante27(idSolicitante01);
		model.addAttribute("emergencias", emergencias);

		Alarmas alarmas = new Alarmas();
		alarmas.setIdSolicitante24(idSolicitante01);
		model.addAttribute("alarmas", alarmas);

		// Cargar COMBOS
		List<MaestroNivSoporte> nivelesSoporteList = this.maestroNivSoporteService.findAll(new MaestroNivSoporte(),
				null);
		List<Combo> listaNivelesSoporte = new ArrayList<>();
		listaNivelesSoporte.add(new Combo("", "----", "----"));
		for (MaestroNivSoporte nivel : nivelesSoporteList) {
			listaNivelesSoporte
					.add(new Combo(nivel.getIdNivelSoporte58().toString(), nivel.getDescEs58(), nivel.getDescEu58()));
		}
		model.addAttribute("nivelesSoporteList", listaNivelesSoporte);

		List<Combo> listaNivelSuicidio = new ArrayList<>();
		listaNivelSuicidio.add(new Combo("", "----", "----"));
		for (Constantes.NivelSuicidioEnum enumeracion : Constantes.NivelSuicidioEnum.values()) {
			listaNivelSuicidio.add(enumeracion.getCombo());
		}
		model.addAttribute("listaNivelSuicidio", listaNivelSuicidio);

		List<Combo> listaNivelMaltrato = new ArrayList<>();
		listaNivelMaltrato.add(new Combo("", "----", "----"));
		for (Constantes.NivelMaltratoEnum enumeracion : Constantes.NivelMaltratoEnum.values()) {
			listaNivelMaltrato.add(enumeracion.getCombo());
		}
		model.addAttribute("listaNivelMaltrato", listaNivelMaltrato);

		List<MotivosBaja> motivoBajaList = this.motivosBajaService.findAll(new MotivosBaja(), null);
		List<Combo> listaMotivoBaja = new ArrayList<>();
		listaMotivoBaja.add(new Combo("", "----", "----"));
		for (MotivosBaja motivo : motivoBajaList) {
			listaMotivoBaja
					.add(new Combo(motivo.getIdMotivoBaja33().toString(), motivo.getDescEs33(), motivo.getDescEu33()));
		}
		model.addAttribute("listaMotivoBaja", listaMotivoBaja);

		List<MaestroIntervenciones> idTipoIntervencionList = this.maestroIntervencionesService
				.findAll(new MaestroIntervenciones(), null);
		model.addAttribute("idTipoIntervencionList", idTipoIntervencionList);

		List<MaestroEmergencias> idTipoEmergenciaList = this.maestroEmergenciasService.findAll(new MaestroEmergencias(),
				null);
		model.addAttribute("idTipoEmergenciaList", idTipoEmergenciaList);

		List<Combo> tipoValoracionList = new ArrayList<>();
		tipoValoracionList.add(new Combo("", "----", "----"));
		for (TipoValoracionEnum enumeracion : TipoValoracionEnum.values()) {
			tipoValoracionList.add(enumeracion.getCombo());
		}
		model.addAttribute("tipoValoracionList", tipoValoracionList);

		List<Combo> modoValoracionList = new ArrayList<>();
		modoValoracionList.add(new Combo("", "----", "----"));
		for (ModoValoracionEnum enumeracion : ModoValoracionEnum.values()) {
			modoValoracionList.add(enumeracion.getCombo());
		}
		model.addAttribute("modoValoracionList", modoValoracionList);

//		List<Combo> tipoNivelSoporteList = new ArrayList<>();
//		tipoNivelSoporteList.add(new Combo(null, "----", "----"));
//		for (TipoNivelSoporteEnum enumeracion : TipoNivelSoporteEnum.values()) {
//			tipoNivelSoporteList.add(enumeracion.getCombo());
//		}
		model.addAttribute("tipoNivelSoporteList", listaNivelesSoporte);

		List<Combo> listaMotivoRetraso = new ArrayList<>();
		listaMotivoRetraso.add(new Combo("", "----", "----"));
		for (TipoMotivoRetrasoEnum enumeracion : TipoMotivoRetrasoEnum.values()) {
			listaMotivoRetraso.add(enumeracion.getCombo());
		}
		model.addAttribute("listaMotivoRetraso", listaMotivoRetraso);

		List<Combo> sentidoList = new ArrayList<>();
		// sentidoList.add(new Combo("", "----", "----"));
		for (TipoSentido29Enum enumeracion : TipoSentido29Enum.values()) {
			sentidoList.add(enumeracion.getCombo());
		}
		model.addAttribute("sentidoList", sentidoList);

		List<Combo> idTipoResol24List = new ArrayList<>();
		for (TipoResol24Enum enumeracion : TipoResol24Enum.values()) {
			idTipoResol24List.add(enumeracion.getCombo());
		}
		model.addAttribute("idTipoResol24List", idTipoResol24List);

		List<MaestroTipoAlarma> tipoAlarmasAll = this.maestroTipoAlarmaService.findAll(new MaestroTipoAlarma(), null);
		model.addAttribute("tipoAlarmasAll", tipoAlarmasAll);

		List<MaestroTipoLlamada> tipoLlamadasAll = this.maestroTipoLlamadaService.findAll(new MaestroTipoLlamada(),
				null);
		model.addAttribute("tipoLlamadasAll", tipoLlamadasAll);

		List<Combo> tiposProtocoloList = new ArrayList<>();
		for (TipoProtocoloEnum enumeracion : TipoProtocoloEnum.values()) {
			tiposProtocoloList.add(enumeracion.getCombo());
		}
		model.addAttribute("tiposProtocoloList", tiposProtocoloList);

		return "tabPrestacionServicios";

	}

	@RequestMapping(value = "/tabAvisos/{idSolicitante01}", method = RequestMethod.GET)
	public String getTabAvisos(Model model, @PathVariable Long idSolicitante01, HttpServletRequest request) {

		if (Boolean.FALSE.equals(this.validarUsuarioAcceso(request))) {
			return "accessDenied";
		}

		Solicitantes solicitantes = this.solicitantesService.find(new Solicitantes(idSolicitante01));
		model.addAttribute("solicitantes", solicitantes);
		Avisos aviso = new Avisos();
		aviso.setIdSolicitante20(solicitantes.getIdSolicitante01());
		model.addAttribute("avisos", aviso);
		model.addAttribute("OrigenAvisos", OrigenAvisosEnum.values());
		model.addAttribute("MotivoBaja", MotivoBajaEnum.values());
		model.addAttribute("CanalComunicacion", CanalComunicacionEnum.values());
		model.addAttribute("OrigenComunicacion", OrigenComunicacionEnum.values());
		model.addAttribute("Procedente", ProcedenteEnum.values());
		model.addAttribute("EstadoDeLaQueja", EstadoDeLaQuejaEnum.values());
		model.addAttribute("MotivosQuejasReclama", MotivosQuejasReclamaEnum.values());
		model.addAttribute("ActoresEnum", ActoresEnum.values());
		model.addAttribute("locale", WordUtils.capitalize(LocaleContextHolder.getLocale().toString()));
		return "tabAvisos";

	}

	@RequestMapping(value = "/tabDispositivos/{idSolicitante01}", method = RequestMethod.GET)
	public String getTabDispositivos(Model model, @PathVariable Long idSolicitante01, HttpServletRequest request) {

		if (Boolean.FALSE.equals(this.validarUsuarioAcceso(request))) {
			return "accessDenied";
		}
		DispositivosSol dispositivosSolFitler = new DispositivosSol();
		dispositivosSolFitler.setIdSolicitante23(idSolicitante01);
		dispositivosSolFitler.setSoloAlta(true);

		MovimientosDispositivos movimientosdispositivosFilter = new MovimientosDispositivos();
		movimientosdispositivosFilter.setIdSolicitante94(idSolicitante01);
		List<DispositivosSol> dispositivosSolModelList = this.dispositivosSolService.findAll(dispositivosSolFitler,
				null);
		DispositivosSol dispositivosSolModel = null;
		if (dispositivosSolModelList != null && dispositivosSolModelList.size() > 0) {
			dispositivosSolModel = dispositivosSolModelList.get(0);
		}

		DispositivosSol dispositivosSolFitlerTerminal = new DispositivosSol();
		dispositivosSolFitlerTerminal.setIdSolicitante23(idSolicitante01);
		List<DispositivosSol> dispositivosSolModelListTerminal = this.dispositivosSolService
				.findTerminal(dispositivosSolFitlerTerminal, null);
		DispositivosSol dispositivosSolModelTerminal = null;
		if (dispositivosSolModelListTerminal != null && dispositivosSolModelListTerminal.size() > 0) {
			dispositivosSolModelTerminal = dispositivosSolModelListTerminal.get(0);
		}

		model.addAttribute("dispositivossol",
				dispositivosSolModel != null ? dispositivosSolModel : dispositivosSolFitler);

		model.addAttribute("dispositivossolTerminal",
				dispositivosSolModelTerminal != null ? dispositivosSolModelTerminal : dispositivosSolFitlerTerminal);

		List<Terminales> terminalesList = this.terminalesService.findAll(new Terminales(), null);
		model.addAttribute("terminalesList", terminalesList);

		List<Dispositivos> idDispositivo35List = this.dispositivosService.findAll(new Dispositivos(), null);
		model.addAttribute("idDispositivo35List", idDispositivo35List);

		model.addAttribute("movimientosdispositivos", movimientosdispositivosFilter);

		List<Dispositivos> dispositivosAll = this.dispositivosService.findAll(new Dispositivos(), null);
		model.addAttribute("dispositivosAll", dispositivosAll);

		model.addAttribute("TipoMovimientoDispositivoAll", TipoMovimientoDispositivoEnum.values());

		return "tabDispositivos";

	}

	@RequestMapping(value = "/tabAsociados/{idSolicitante01}", method = RequestMethod.GET)
	public String getTabAsociados(Model model, @PathVariable Long idSolicitante01, HttpServletRequest request) {

		if (Boolean.FALSE.equals(this.validarUsuarioAcceso(request))) {
			return "accessDenied";
		}

		Solicitantes solicitantes = this.solicitantesService.find(new Solicitantes(idSolicitante01));
		model.addAttribute("solicitantes", solicitantes);
		Solicitantes solicitantesAsociados = new Solicitantes(solicitantes.getIdSolicitante01());
		if (solicitantes.getDirecciones() != null) {
			solicitantesAsociados.setDirecciones(new Direcciones(solicitantes.getDirecciones().getIdDireccion06()));
		}
		model.addAttribute("solicitantesAsociados", solicitantesAsociados);
		return "tabAsociados";

	}

	@RequestMapping(value = "/tabDocumentos/{idSolicitante01}", method = RequestMethod.GET)
	public String getTabDocumentos(Model model, @PathVariable Long idSolicitante01, HttpServletRequest request) {

		if (Boolean.FALSE.equals(this.validarUsuarioAcceso(request))) {
			return "accessDenied";
		}

		model.addAttribute("documentoApor", new DocumentosTarea());
		model.addAttribute("documentoCons", new DocumentosTarea());
		model.addAttribute("documentoGen", new DocumentosTarea());
		model.addAttribute("documentoNoAsociado", new Solicitantes());

		Solicitantes solicitantes = this.solicitantesService.find(new Solicitantes(idSolicitante01));
		model.addAttribute("solicitantes", solicitantes);

		return "tabDocumentosBenefi";

	}

	@RequestMapping(value = "/tabExpedientes/{idSolicitante01}", method = RequestMethod.GET)
	public String getTabExpedientes(Model model, @PathVariable Long idSolicitante01, HttpServletRequest request) {

		if (Boolean.FALSE.equals(this.validarUsuarioAcceso(request))) {
			return "accessDenied";
		}
		Expedientes expedientes = new Expedientes();
		expedientes.setSolicitantes(new Solicitantes(idSolicitante01));

		model.addAttribute("expedientes", expedientes);

		return "tabExpedientes";

	}

	@RequestMapping(value = "/tabInformeSocial/{idSolicitante01}", method = RequestMethod.GET)
	public String getTabInformeSocial(Model model, @PathVariable Long idSolicitante01, HttpServletRequest request) {

		if (Boolean.FALSE.equals(this.validarUsuarioAcceso(request))) {
			return "accessDenied";
		}
		Expedientes expedientes = new Expedientes();
		expedientes.setSolicitantes(new Solicitantes(idSolicitante01));
		model.addAttribute("expedientes", expedientes);

		Informes infomeSocialFilter = new Informes();
		infomeSocialFilter.setIdBeneficiario16(idSolicitante01);
		infomeSocialFilter.setTipoInforme16(TipoInformesEnum.INFSOC.getId());
		infomeSocialFilter.setEstado16(EstadoInformesEnum.DISPONIBLE.getId());
		TableRequestDto tableRequestDtoSocial = new TableRequestDto();
		tableRequestDtoSocial.setSidx("FFIN16");
		tableRequestDtoSocial.setSord("desc");
		List<Informes> informeSocialList = this.informesService.findAll(infomeSocialFilter, tableRequestDtoSocial);

		if (informeSocialList.size() > 0) {
			model.addAttribute("informes", informeSocialList.get(0));
			model.addAttribute("tieneInfSocial", true);
		} else {
			model.addAttribute("informes", null);
			model.addAttribute("tieneInfSocial", false);
		}

		model.addAttribute("TipoEstado", EstadoInformesEnum.values());
		model.addAttribute("TipoInformes", TipoInformesEnum.values());
		return "tabInformeSocial";

	}

	@RequestMapping(value = "/tabCobros/{idSolicitante01}", method = RequestMethod.GET)
	public String getTabCobros(Model model, @PathVariable Long idSolicitante01, HttpServletRequest request) {

		if (Boolean.FALSE.equals(this.validarUsuarioAcceso(request))) {
			return "accessDenied";
		}

		Solicitantes sol = this.solicitantesService.find(new Solicitantes(idSolicitante01));
		Cobros cobro = new Cobros();
		cobro.setIdSolicitante(idSolicitante01);
		Solicitantes solicitante = new Solicitantes();
		solicitante.setNoReintentar01(1);
		solicitante.setfExoneracion01(sol.getfExoneracion01());
		solicitante.setMotivoExoneracion01(sol.getMotivoExoneracion01());
		cobro.setSolicitante(solicitante);

		model.addAttribute("cobros", cobro);

		return "tabCobros";

	}

	@RequestMapping(value = "/tabNotas/{idSolicitante01}", method = RequestMethod.GET)
	public String gettabNotas(Model model, @PathVariable Long idSolicitante01, HttpServletRequest request) {

		if (Boolean.FALSE.equals(this.validarUsuarioAcceso(request))) {
			return "accessDenied";
		}

		NotasSolicitante notasSolicitante = new NotasSolicitante();
		notasSolicitante.setIdSolicitante53(idSolicitante01);
		model.addAttribute("notasSolicitante", notasSolicitante);

		return "tabNotasSolicitante";

	}

	@RequestMapping(value = "/tabPagosBeneficiarios/{idSolicitante01}", method = RequestMethod.GET)
	public String getTabPagosBeneficiarios(Model model, @PathVariable Long idSolicitante01,
			HttpServletRequest request) {

		if (Boolean.FALSE.equals(this.validarUsuarioAcceso(request))) {
			return "accessDenied";
		}

		// Solicitantes solicitantes = this.solicitantesService.find(new
		// Solicitantes(idSolicitante01));
		// darle una vuelta ya que el solicitante tiene que venir en la liquidacion
//		PagosBeneficiario pagosBeneficiario = new PagosBeneficiario();
//		pagosBeneficiario.setSolicitantes(new Solicitantes(idSolicitante01));
//		model.addAttribute("pagosBeneficiario", pagosBeneficiario);

		Solicitantes solicitantes = this.solicitantesService.find(new Solicitantes(idSolicitante01));
		model.addAttribute("solicitantes", solicitantes);
		PagosBeneficiario pagosBeneficiario = new PagosBeneficiario();
		pagosBeneficiario.setSolicitantes(solicitantes);
		model.addAttribute("pagosbeneficiario", pagosBeneficiario);

		return "tabPagosbeneficiario";

	}

	@RequestMapping(value = "/cambioCuentasBeneficiario", method = RequestMethod.PUT)
	public @ResponseBody Cuentas cambioCuentasBeneficiario(
			@RequestJsonBody(param = "nombreTitCuenta05") String nombreTitCuenta05,
			@RequestJsonBody(param = "apellido1TitCuenta05") String apellido1TitCuenta05,
			@RequestJsonBody(param = "apellido2TitCuenta05") String apellido2TitCuenta05,
			@RequestJsonBody(param = "codTipoIdenTitular") String codTipoIdenTitular,
			@RequestJsonBody(param = "identidadTitular") String identidadTitular,
			@RequestJsonBody(param = "numCuenta") String numCuenta,
			@RequestJsonBody(param = "motivoCambio") String motivoCambio,
			@RequestJsonBody(param = "idSolicitante") String idSolicitante,
			@RequestJsonBody(param = "idCuenta") Long idCuenta, HttpServletRequest req) {

		Cuentas cuenta = new Cuentas();
		cuenta.setCodTipoIdenTitular05(codTipoIdenTitular);
		cuenta.setNombreTitCuenta05(nombreTitCuenta05);
		cuenta.setApellido1TitCuenta05(apellido1TitCuenta05);
		cuenta.setApellido2TitCuenta05(apellido2TitCuenta05);
		cuenta.setIdenTitular05(identidadTitular);
		cuenta.setMotivo05(motivoCambio);
		cuenta.setNumCuenta05(numCuenta);
		cuenta.setIdCuenta05(idCuenta);
		this.docuCuentasService.sesionToBBDD(cuenta, req);
		Cuentas cuentaNueva = this.cuentasService.cambioCuentasBeneficiario(cuenta, idSolicitante);
		return cuentaNueva;

	}

	/**
	 * Operacion para modificar la persona interesada. Llama a platea.
	 * 
	 * @param solicitantesSolicitantes Bean que contiene la informacion a modificar.
	 * @return Solicitantes Bean resultante de la modificacion.
	 */
	@RequestMapping(value = "/cambiarPersonaInteresada", method = RequestMethod.POST)
	public @ResponseBody Solicitantes cambiarPersonaInteresada(
			@RequestJsonBody(param = "solicitantes") Solicitantes solicitantes,
			@RequestJsonBody(param = "representante", required = false) Solicitantes representante,
			@RequestJsonBody(param = "idExpediente", required = false) String idExpediente) {
		Solicitantes solicitantesAux = this.solicitantesService.updatePersonaInteresada(solicitantes, representante,
				idExpediente);
		SolicitantesController.logger.info("[PUT] : Solicitantes cambiarPersonaInteresada correctamente");
		return solicitantesAux;
	}

	@RequestMapping(value = "detail/aportar/{idCuenta05}", method = RequestMethod.POST)
	public @ResponseBody Solicitantes aportar(@PathVariable Long idCuenta05,
			@RequestParam(value = "tipificar", required = false) String tipificar,
			@RequestParam(value = "documento_cuenta", required = false) MultipartFile documento,
			@RequestParam(value = "id", required = false) String id, HttpServletRequest request) throws Throwable {
		Solicitantes solicitantes = new Solicitantes();
		solicitantes.setIdCuenta01(idCuenta05);
		return this.solicitantesService.aportar(solicitantes, documento, tipificar, request);

	}

	@GetMapping(value = "/tipoDocCuentas")
	public @ResponseBody List<MaestroTiposDoc> tipoDocAvisos(HttpServletRequest request) {
		MaestroTiposDoc maestroTiposDoc = new MaestroTiposDoc();
		maestroTiposDoc.setIdTipoDoc36(TiposDocumentoRoleEnum.OTROS.getId());
		return this.maestroTiposDocService.findAllLike(maestroTiposDoc, null, false);
	}

	@RequestMapping(value = "/updateNoReintentar/{idSolicitante01}", method = RequestMethod.POST)
	public @ResponseBody Solicitantes updateNoReintentar(@RequestJsonBody(param = "noReintentar01") int noReintentar01,
			@RequestJsonBody(param = "motivoExoneracion01") String motivoExoneracion01,
			@PathVariable Long idSolicitante01) {
		Solicitantes sol = new Solicitantes(idSolicitante01);
		sol.setNoReintentar01(noReintentar01);
		sol.setMotivoExoneracion01(motivoExoneracion01);
		return this.solicitantesService.updateNoReintentar(sol);
	}

//	@RequestMapping(value = "/anularBaja", method = RequestMethod.POST)
//	public @ResponseBody Solicitantes anularBaja(@RequestParam(value = "idSolicitante") Long idSolicitante,
//			@RequestParam(value = "observaciones") String observaciones) {
//		System.out.println("asdf: " + idSolicitante);
//		System.out.println(observaciones);
//		return new Solicitantes();
//	}

	@RequestMapping(value = "/anularBaja/{idSolicitante01}", method = RequestMethod.POST)
	public @ResponseBody Solicitantes anularBaja(@PathVariable Long idSolicitante01,
			@RequestJsonBody(param = "notassolicitante") NotasSolicitante notassolicitante) {
		NotasSolicitante notasSolicitante2 = new NotasSolicitante();
		notasSolicitante2.setTxtNota53(notassolicitante.getTxtNota53());
		notasSolicitante2.setIdSolicitante53(idSolicitante01);
		notasSolicitante2.setFecAlta53(new Date());
		notasSolicitante2.setUsuAlta53(UtilSeguridad.getUsuarioConectado().getUserName());
		this.notasSolicitanteService.add(notasSolicitante2);
		return this.solicitantesService.anularBaja(new Solicitantes(idSolicitante01));
	}

	@RequestMapping(value = "/anyadirBaja/{idSolicitante01}", method = RequestMethod.POST)
	public @ResponseBody NotasSolicitante anyadirBaja(@PathVariable Long idSolicitante01,
			@RequestJsonBody(param = "notassolicitante") NotasSolicitante notassolicitante) {
		NotasSolicitante notasSolicitante2 = new NotasSolicitante();
		notasSolicitante2.setTxtNota53(notassolicitante.getTxtNota53());
		notasSolicitante2.setIdSolicitante53(idSolicitante01);
		notasSolicitante2.setFecAlta53(new Date());
		notasSolicitante2.setUsuAlta53(UtilSeguridad.getUsuarioConectado().getUserName());
		return this.notasSolicitanteService.add(notasSolicitante2);
	}

//	// BORRAR
//	@Autowired
//	private LiquidacionesService liquidacionesService;
//
//	@RequestMapping(value = "/emitirLiquidacion", method = RequestMethod.GET)
//	public String testEmitirBeneficiario(Model model) {
//		RespuestaType respuesta = new RespuestaType();
//		try {
//			CabeceraType cabecera = new CabeceraType();
//			cabecera.setTipoOperacion(TipoOperacionEnum.EMITIR);
//			cabecera.setFComunicacion(UtilidadesFecha.formatearDateToString(UtilidadesFecha.getFechaSistema(),
//					com.ejie.ad74a.constantes.Constantes.ES_DATE_MASK));
//			cabecera.setUsuario(com.ejie.ad74a.constantes.Constantes.COD_APLICACION);
//
//			DatosEmisionType datosEmision = new DatosEmisionType();
//			datosEmision.setTipoIngreso("TLIMP");
//
//			ConceptoType conceptoType = new ConceptoType();
////			conceptoType.setIdConcepto(2);
//			conceptoType.setImporte(400);
//			Conceptos conceptos = new Conceptos();
//			conceptos.getConcepto().add(conceptoType);
//			datosEmision.setConceptos(conceptos);
//
//			datosEmision.setOrigen("7654321");
//			// datosEmision.setImporte
//
////			datosEmision.setFLimitePago("24/09/2024");
//			datosEmision.setExpediente("TLA_01001_2024_02");
//			datosEmision.setConcepto("Teleasistencia test AD74A");
//			datosEmision.setTerritorio(1);
//
//			DatosIdentificacionType datosIdentificacionType = new DatosIdentificacionType();
//			datosIdentificacionType.setTipoIdentificador(2);
//			datosIdentificacionType.setIdentificador("96131011G");
//			datosIdentificacionType.setNombre("ALBERTO");
//			datosIdentificacionType.setApellido1("PRUEBA");
//			datosIdentificacionType.setApellido2("PRUEBA");
//			datosEmision.setDatosIdentificacion(datosIdentificacionType);
//
//			DatosDireccionType datosDireccionType = new DatosDireccionType();
//			datosDireccionType.setResidente(1);
//			datosDireccionType.setProvincia("01");
//			datosDireccionType.setMunicipio("051");
//			datosDireccionType.setCodLocalidad(Long.valueOf("10105100000073"));
//			datosDireccionType.setLocalidad("Agurain - Salvatierra");
//			datosDireccionType.setTipoVia("CL");
//			datosDireccionType.setCalle("Alangua");
//			datosDireccionType.setPortal("1");
//			datosDireccionType.setLetra("C");
//			datosDireccionType.setPiso("2");
//			datosDireccionType.setCodigoPostal("01200");
//			datosEmision.setDatosDireccion(datosDireccionType);
//
//			DatosBancariosType datosBancarios = new DatosBancariosType();
//			datosBancarios.setDomiciliacion(0);
//			datosEmision.setDatosBancarios(datosBancarios);
//
//			respuesta = this.liquidacionesService.emitirLiquidacion(cabecera, datosEmision);
//			System.out.println("Liquidación emitida correctamente");
//		} catch (Throwable e) {
//			e.printStackTrace();
//			System.out.println("Error al emitir la liquidación: " + e.getMessage());
//		}
//
//		StringBuilder respuestaStr = new StringBuilder();
//		respuestaStr.append("codRespuesta: " + respuesta.getCodRespuesta());
//		respuestaStr.append("mensaje: " + respuesta.getMensaje());
//		respuestaStr.append("idLiquidacion: " + respuesta.getIdLiquidacion());
//		respuestaStr.append("fecha: " + respuesta.getFRespuesta());
//		model.addAttribute("msg", respuestaStr.toString());
//		return "accessDeniedIntegrado";
//
//	}

	@RequestMapping(value = "/encolarRespuestaPS", method = RequestMethod.GET)
	public String testEncolarRespuestaPS(Model model) {

		// Añadir a la cola de respuestas todas las pendientes
		// Long idPeticion = 34609L;
		PeticionesPs peticion = new PeticionesPs();
		peticion.setCola99("R");
		peticion.setProcesado99(0);
		List<PeticionesPs> peticionesList = this.peticionesPsService.findAllLike(peticion, null, false);
		for (PeticionesPs pet : peticionesList) {
			try {
				UtilJms.enviarJMS(pet.getIdPeticion99(),
						com.ejie.ad74a.constantes.Constantes.CONNECTION_FACTORY_JNDI_NAME,
						com.ejie.ad74a.constantes.Constantes.RESPUESTA_PRESTADOR_DESTINATION_JNDI_NAME, null, null);
				StringBuilder respuestaStr = new StringBuilder();
				respuestaStr.append("Respuesta encolada con éxito");
				model.addAttribute("msg", respuestaStr.toString());
			} catch (Exception e) {
				ExceptionUtils.getStackTrace(e);
				e.printStackTrace();
				StringBuilder respuestaStr = new StringBuilder();
				respuestaStr
						.append("Se ha producido un error al encolarla repsuesta: " + ExceptionUtils.getStackTrace(e));
				model.addAttribute("msg", respuestaStr.toString());
			}
		}

		return "accessDeniedIntegrado";
	}

}
