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.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.transaction.annotation.Transactional;
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.PostMapping;
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.exceptions.ErrorField;
import com.ejie.ad74a.exceptions.ValidatorException;
import com.ejie.ad74a.model.Avisos;
import com.ejie.ad74a.model.Direcciones;
import com.ejie.ad74a.model.DocuAvisos;
import com.ejie.ad74a.model.Expedientes;
import com.ejie.ad74a.model.MaestroMotQueja;
import com.ejie.ad74a.model.MaestroSubtiposAviso;
import com.ejie.ad74a.model.MaestroTiposAviso;
import com.ejie.ad74a.model.MaestroTiposDoc;
import com.ejie.ad74a.model.MotivosBaja;
import com.ejie.ad74a.model.QuejasReclamaciones;
import com.ejie.ad74a.model.Solicitantes;
import com.ejie.ad74a.service.AvisosService;
import com.ejie.ad74a.service.DocuAvisosService;
import com.ejie.ad74a.service.ExpedientesService;
import com.ejie.ad74a.service.MaestroMotQuejaService;
import com.ejie.ad74a.service.MaestroTiposAvisoService;
import com.ejie.ad74a.service.MaestroTiposDocService;
import com.ejie.ad74a.service.MotivosBajaService;
import com.ejie.ad74a.service.QuejasReclamacionesService;
import com.ejie.ad74a.service.SolicitantesService;
import com.ejie.ad74a.util.comun.UtilLiterales;
import com.ejie.ad74a.util.comun.UtilSeguridad;
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.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.TiposDocumentoRoleEnum;
import com.ejie.ad74a.validacion.AvisosValidator;
import com.ejie.ad74a.validacion.DocuAvisosValidator;
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;

/**
 * AvisosController generated by UDA, 12-may-2023 11:16:41.
 * 
 * @author UDA
 */

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

public class AvisosController {

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

	@Autowired
	private AvisosService avisosService;

	@Autowired
	private SolicitantesService solicitantesService;

	@Autowired
	private MaestroTiposAvisoService maestroTiposAvisoService;

	@Autowired
	private ExpedientesService expedientesService;

	@Autowired
	private QuejasReclamacionesService quejasReclamacionesService;

	@Autowired
	private DocuAvisosService docuAviseService;

	@Autowired
	private MaestroTiposDocService maestroTiposDocService;

	@Autowired
	private MotivosBajaService motivosBajaService;

	@Autowired
	private MaestroMotQuejaService maestroMotQuejaService;

	@Autowired
	private DocuAvisosValidator docuAvisosValidator;

	@Autowired
	private AvisosValidator avisosValidator;

	@javax.annotation.Resource
	private ReloadableResourceBundleMessageSource appMessageSource;

	@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));
	}

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

	/**
	 * Operacion CRUD Read. Devuelve el bean correspondiente al identificador
	 * indicado.
	 * 
	 * @param idAviso20 Long
	 * @return Avisos Objeto correspondiente al identificador indicado.
	 */
	@RequestMapping(value = { "/{idAviso20}", "/avisosBeneficiario/{idAviso20}" }, method = RequestMethod.GET)
	public @ResponseBody Avisos get(@PathVariable Long idAviso20) {
		Avisos avisos = new Avisos();
		avisos.setIdAviso20(idAviso20);
		avisos = this.avisosService.find(avisos);
		AvisosController.logger.info("[GET - findBy_PK] : Obtener Avisos por PK");
		return avisos;
	}

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

	/**
	 * Operacion CRUD Edit. Modificacion del bean indicado.
	 *
	 * @param avisos Avisos Bean que contiene la informacion a modificar.
	 * @return Avisos Bean resultante de la modificacion.
	 */
	@RequestMapping(value = { "/edit", "/avisosBeneficiario/edit" }, method = RequestMethod.PUT)
	public @ResponseBody Avisos edit(@RequestBody Avisos avisos) {
		Avisos avisosAux = this.avisosService.update(avisos);
		AvisosController.logger.info("[PUT] : Avisos actualizado correctamente");
		return avisosAux;
	}

	/**
	 * Operacion CRUD Create. Creacion de un nuevo registro a partir del bean
	 * indicado.
	 *
	 * @param avisos Avisos Bean que contiene la informacion con la que se va a
	 *               crear el nuevo registro.
	 * @return Avisos Bean resultante del proceso de creacion.
	 */

	@RequestMapping(value = { "/add", "/avisosBeneficiario/add" }, method = RequestMethod.POST)
	public @ResponseBody Avisos add(@RequestBody Avisos avisos) {
		Avisos avisosAux = this.avisosService.add(avisos);
		AvisosController.logger.info("[POST] : Avisos insertado correctamente");
		return avisosAux;
	}

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

	/*
	 * 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) {
		AvisosController.logger.info("[GET - View] : avisos");
		model.addAttribute("avisos", new Avisos());
		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("NameUsuarioConectado", UtilSeguridad.getNameUsuarioConectado());
		model.addAttribute("nombreUsuarioConectado", UtilSeguridad.getAuditUser());
		model.addAttribute("isDSS", UtilSeguridad.isDSS(request));
		model.addAttribute("isAdmin", UtilSeguridad.isAdmin(request));
		model.addAttribute("isSSB", UtilSeguridad.isSSB(request));
		model.addAttribute("isPS", UtilSeguridad.isPS(request));
		model.addAttribute("isDirector", UtilSeguridad.isDirector(request));
		model.addAttribute("locale", WordUtils.capitalize(LocaleContextHolder.getLocale().toString()));

		List<MaestroTiposAviso> tipoAvisoAll = this.maestroTiposAvisoService.findAll(new MaestroTiposAviso(), null);
		model.addAttribute("tipoAvisoAll", tipoAvisoAll);

		model.addAttribute("title", UtilLiterales.getLiteralMessage(appMessageSource, "title.avisos"));

		return "avisos";
	}

	@GetMapping(value = "/tipoAvisoAll")
	public @ResponseBody List<MaestroTiposAviso> tipoAvisoAll() {
		AvisosController.logger.info("[POST - filter] : Obtener Avisoss");
		return this.maestroTiposAvisoService.findManuales(new MaestroTiposAviso(), null);
	}

	/**
	 * Operacion de filtrado del componente RUP_TABLE.
	 * 
	 * @param filterAvisos    Avisos 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<Avisos> Dto que contiene el resultado del filtrado
	 *         realizado por el componente RUP_TABLE.
	 */
	@RequestMapping(value = "/filter", method = RequestMethod.POST)
	public @ResponseBody TableResponseDto<Avisos> filter(@RequestJsonBody(param = "filter") Avisos filterAvisos,
			@RequestJsonBody TableRequestDto tableRequestDto, HttpServletRequest request) {
		AvisosController.logger.info("[POST - filter] : Obtener Avisoss");
		Integer usuario = null;
		if (UtilSeguridad.isDSS(request) || UtilSeguridad.isDirector(request) || UtilSeguridad.isAdmin(request)) {
			if (UtilSeguridad.isDSS(request) && filterAvisos.getDssPrimeraVez() == 1) {
				MaestroTiposAviso tipo = new MaestroTiposAviso();
				tipo.setIdTipoAviso40(1L);
				MaestroSubtiposAviso subTipo = new MaestroSubtiposAviso();
				subTipo.setIdSubTipoAviso41(2L);
				filterAvisos.setMaestroTiposAviso(tipo);
				filterAvisos.setMaestroSubtiposAviso(subTipo);
			}
			usuario = ActoresEnum.DSS.getId().intValue();
		} else if (UtilSeguridad.isPS(request)) {
			usuario = ActoresEnum.PS.getId().intValue();
		} else if (UtilSeguridad.isSSB(request)) {
			usuario = ActoresEnum.SSB.getId().intValue();
		}
		return this.avisosService.filter(filterAvisos, tableRequestDto, false, usuario);
	}

	/**
	 * Operacion de filtrado del componente RUP_TABLE.
	 * 
	 * @param filterAvisos    Avisos 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<Avisos> Dto que contiene el resultado del filtrado
	 *         realizado por el componente RUP_TABLE.
	 */
	@RequestMapping(value = "/avisosBeneficiario/filter", method = RequestMethod.POST)
	public @ResponseBody TableResponseDto<Avisos> getAvisosBeneficiario(
			@RequestJsonBody(param = "filter") Avisos filterAvisos, @RequestJsonBody TableRequestDto tableRequestDto,
			HttpServletRequest request) {
		AvisosController.logger.info("[POST - filter] : Obtener Avisoss");
		Integer usuario = null;

		return this.avisosService.filter(filterAvisos, tableRequestDto, false, usuario);
	}

	/**
	 * Operacion de busqueda del componente RUP_TABLE.
	 * 
	 * @param filterAvisos    Avisos Bean que contiene los parametros de filtrado a
	 *                        emplear.
	 * @param searchAvisos    Avisos 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<Avisos> Dto que contiene el resultado de la busqueda
	 *         realizada por el componente RUP_TABLE.
	 */
	@RequestMapping(value = "/search", method = RequestMethod.POST)
	public @ResponseBody List<TableRowDto<Avisos>> search(@RequestJsonBody(param = "filter") Avisos filterAvisos,
			@RequestJsonBody(param = "search") Avisos searchAvisos, @RequestJsonBody TableRequestDto tableRequestDto) {
		AvisosController.logger.info("[POST - search] : Buscar Avisoss");
		return this.avisosService.search(filterAvisos, searchAvisos, tableRequestDto, false);
	}

	/**
	 * Borrado multiple de registros
	 * 
	 * @param filterAvisos    Avisos 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) {
		AvisosController.logger.info("[POST - removeMultiple] : Eliminar multiples Avisoss");
		this.avisosService.removeMultiple(tableRequestDto);
		AvisosController.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 filterAvisos    Avisos 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<Avisos>> Dto que contiene el resultado
	 *         del filtrado realizado por el componente RUP_TABLE.
	 */
	@RequestMapping(value = "/jerarquia/filter", method = RequestMethod.POST)
	public @ResponseBody TableResponseDto<JerarquiaDto<Avisos>> jerarquia(
			@RequestJsonBody(param = "filter") Avisos filterAvisos, @RequestJsonBody TableRequestDto tableRequestDto) {
		AvisosController.logger.info("[POST - jerarquia] : Obtener Avisoss jerarquia");
		return this.avisosService.jerarquia(filterAvisos, tableRequestDto, false);
	}

	/**
	 * Recupera los hijos de los registros desplegados en la visualizacion
	 * jerarquica.
	 * 
	 * @param filterAvisos    Avisos 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<Avisos>> Dto que contiene el resultado
	 *         del filtrado realizado por el componente RUP_TABLE.
	 */
	@RequestMapping(value = "/jerarquiaChildren", method = RequestMethod.POST)
	public @ResponseBody TableResponseDto<JerarquiaDto<Avisos>> jerarquiaChildren(
			@RequestJsonBody(param = "filter") Avisos filterAvisos, @RequestJsonBody TableRequestDto tableRequestDto) {
		AvisosController.logger.info("[POST - jerarquia] : Obtener Avisoss jerarquia - Hijos");
		return this.avisosService.jerarquiaChildren(filterAvisos, tableRequestDto);
	}

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

	/**
	 * Devuelve un fichero excel que contiene los datos exportados de la tabla.
	 *
	 * @param filter          Avisos
	 * @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) Avisos 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 {
		AvisosController.logger.info("[POST - generateExcelReport] : Devuelve un fichero excel");

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

	/**
	 * Devuelve un fichero pdf que contiene los datos exportados de la tabla.
	 *
	 * @param filter          Avisos
	 * @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) Avisos 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) {
		AvisosController.logger.info("[POST - generatePDFReport] : Devuelve un fichero pdf");

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

	/**
	 * Devuelve un fichero ods que contiene los datos exportados de la tabla.
	 *
	 * @param filter          Avisos
	 * @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) Avisos 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) {
		AvisosController.logger.info("[POST - generateODSReport] : Devuelve un fichero ods");

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

	/**
	 * Devuelve un fichero csv que contiene los datos exportados de la tabla.
	 *
	 * @param filter          Avisos
	 * @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) Avisos 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) {
		AvisosController.logger.info("[POST - generateCSVReport] : Devuelve un fichero csv");

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

	@RequestMapping(value = "/detail/{idAviso20}", method = RequestMethod.POST)
	public @ResponseBody Avisos getDetail(@PathVariable Long idAviso20) {
		Avisos avisos = new Avisos();
		avisos.setIdAviso20(idAviso20);
		List<Avisos> listaAvisos = this.avisosService.avisosComplete(new Avisos(idAviso20), null);
		return !listaAvisos.isEmpty() && listaAvisos.size() == 1 ? listaAvisos.get(0) : new Avisos();
	}

	@RequestMapping(value = "/procesarAvisos/{idAviso20}", method = RequestMethod.POST)
	public @ResponseBody Avisos procesarAvisos(@PathVariable Long idAviso20) {
		Avisos avisos = new Avisos();
		avisos.setIdAviso20(idAviso20);
		avisos = avisosService.find(avisos);

		return this.avisosService.procesarAvisos(avisos);
	}

	@PostMapping(value = "/procesarAviso")
	public @ResponseBody String procesarAviso(@RequestJsonBody Avisos aviso) {
		List<ErrorField> errores = new ArrayList<ErrorField>();
		this.avisosValidator.validate(errores, aviso);

		if (errores.size() != com.ejie.ad74a.constantes.Constantes.CERO) {
			throw new ValidatorException(errores);
		}
		this.avisosService.updateAvisos(aviso);
		return "ok";
	}

	@PostMapping(value = "/updateAvisos")
	public @ResponseBody String updateAvisos(@RequestJsonBody Avisos aviso) {
		List<ErrorField> errores = new ArrayList<ErrorField>();
		this.avisosValidator.validate(errores, aviso);

		if (errores.size() != com.ejie.ad74a.constantes.Constantes.CERO) {
			throw new ValidatorException(errores);
		}
		this.avisosService.updateAvisos(aviso);
		return "ok";
	}

	@Transactional(rollbackFor = Throwable.class)
	@PostMapping(value = "/insertAvisos")
	public @ResponseBody String insertAvisos(@RequestJsonBody Avisos aviso, HttpServletRequest request) {
		List<ErrorField> errores = new ArrayList<ErrorField>();
		this.avisosValidator.validate(errores, aviso);

		if (errores.size() != com.ejie.ad74a.constantes.Constantes.CERO) {
			throw new ValidatorException(errores);
		}
		Avisos avisoAux;
		// Tenemos que guardarlo en la sesión
		HttpSession sesion = request.getSession();
		List<DocuAvisos> docuAvisosList = new ArrayList<DocuAvisos>();
		if (sesion.getAttribute(Constantes.VARCONTEXTO_DOCUAVISOS) != null) {
			docuAvisosList = (List<DocuAvisos>) sesion.getAttribute(Constantes.VARCONTEXTO_DOCUAVISOS);
		}
		aviso.setUsuAlta20(UtilSeguridad.getNameUsuarioConectado());
		avisoAux = this.avisosService.insertAvisos(aviso);
		for (DocuAvisos docu : docuAvisosList) {
			docu.setIdAviso70(avisoAux.getIdAviso20());

			this.docuAviseService.add(docu);
		}
		return "ok";
	}

	@PostMapping(value = "/actualizacionBaja")
	public @ResponseBody String actualizacionBaja(@RequestJsonBody(param = "avisos") Avisos aviso) {

		return "ok";

	}

	@PostMapping(value = "/actualizacionBajaAlta")
	public @ResponseBody String actualizacionBajaAlta(@RequestJsonBody(param = "avisos") Avisos aviso) {

		return "ok";

	}

	@PostMapping(value = "/correoSSB")
	public @ResponseBody String correoSSB(@RequestJsonBody(param = "avisos") Avisos aviso) {
		this.avisosService.correoSSB(aviso);
		return "ok";

	}

	@PostMapping(value = "/aportarExpediente")
	public @ResponseBody String aportarExpediente(@RequestJsonBody(param = "avisos") Avisos aviso) {
		this.avisosService.aportarExpediente(aviso);
		return "ok";

	}

	@Transactional(rollbackFor = Throwable.class)
	@PostMapping(value = "/crearQueja")
	public @ResponseBody String crearQueja(@RequestJsonBody(param = "avisos") Avisos aviso) {
		QuejasReclamaciones quejasReclamaciones = new QuejasReclamaciones();
		quejasReclamaciones.setIdSolicitante84(aviso.getIdSolicitante20());
		quejasReclamaciones.setIdAviso84(aviso.getIdAviso20());
		quejasReclamaciones.setFecQueja84(aviso.getAvisosQueja().getFechaQueja());
		quejasReclamaciones.setProcedente84(aviso.getAvisosQueja().getProcedente());
		quejasReclamaciones.setEstado84(aviso.getAvisosQueja().getEstadoQueja());
		quejasReclamaciones.setTiempoResolucion84(aviso.getAvisosQueja().getTiempoResolucion());
		quejasReclamaciones.setObservaciones84(aviso.getObservaciones20());
		quejasReclamaciones.setUsuAlta84(UtilSeguridad.getNameUsuarioConectado());
		quejasReclamaciones
				.setMaestroMotQueja(new MaestroMotQueja(aviso.getAvisosQueja().getMotivoQueja().longValue()));
		this.quejasReclamacionesService.add(quejasReclamaciones);
		this.avisosService.procesarAvisos(aviso);

		return "ok";

	}

	@RequestMapping(value = "/obtenerDatosBeneficiario/{dni}", method = RequestMethod.POST)
	public @ResponseBody Solicitantes obtenerDatosBeneficiario(@PathVariable String dni) {
		Solicitantes solicitantes = new Solicitantes();
		solicitantes.setIdentificador01(dni);
		Solicitantes listaSolicitantes = this.solicitantesService.findPorDni(solicitantes);
		return listaSolicitantes != null ? listaSolicitantes : new Solicitantes();

	}

	@RequestMapping(value = "/obtenerDatosBeneficiarioPorId/{idSolicitante01}", method = RequestMethod.POST)
	public @ResponseBody Solicitantes obtenerDatosBeneficiario(@PathVariable Long idSolicitante01) {
		Solicitantes solicitantes = new Solicitantes();
		solicitantes.setIdSolicitante01(idSolicitante01);
		Solicitantes listaSolicitantes = this.solicitantesService.find(solicitantes);
		return listaSolicitantes != null ? listaSolicitantes : new Solicitantes();

	}

	@RequestMapping(value = "/buscarExpediente", method = RequestMethod.GET)
	public String buscarExpediente(Model model) {
		AvisosController.logger.info("[GET - View] : buscarExpediente");
		model.addAttribute("expediente", new Expedientes());
		model.addAttribute("Procedimientos", ProcedimientosEnum.values());

		return "avisosbuscarexpediente";
	}

	@RequestMapping(value = "/aportar/{idAviso20}/{idTipoDoc36}", method = RequestMethod.POST)
	public @ResponseBody Avisos aportar(@PathVariable Long idAviso20, @PathVariable Long idTipoDoc36,
			@RequestParam(value = "documento", required = false) MultipartFile documento,
			@RequestParam(value = "id", required = false) String id, HttpServletRequest request) throws Throwable {
		List<ErrorField> errores = new ArrayList<ErrorField>();
		this.docuAvisosValidator.validate(errores, documento);
		if (errores.size() != com.ejie.ad74a.constantes.Constantes.CERO) {
			throw new ValidatorException(errores);
		}
		DocuAvisos docuAvisos = new DocuAvisos();
		if (idAviso20 != null && idAviso20.compareTo(0L) == 0) {
			HttpSession sesion = request.getSession();
			List<DocuAvisos> docuAvisosList = new ArrayList<DocuAvisos>();
			if (sesion.getAttribute(Constantes.VARCONTEXTO_DOCUAVISOS) != null) {
				docuAvisosList = (List<DocuAvisos>) sesion.getAttribute(Constantes.VARCONTEXTO_DOCUAVISOS);
			}
			docuAvisos = this.avisosService.subirDocumentoAPif(docuAvisos, documento);
			docuAvisos.setIdTipoDoc70(idTipoDoc36);
			docuAvisos.setTipoDocumentoEs(TiposDocumentoRoleEnum.OTROS.getLabelDesc());
			docuAvisos.setTipoDocumentoEu(TiposDocumentoRoleEnum.OTROS.getLabelDesc());
			docuAvisosList.add(docuAvisos);
			sesion.setAttribute(Constantes.VARCONTEXTO_DOCUAVISOS, docuAvisosList);
			return new Avisos();
		} else {
			return this.avisosService.aportar(new Avisos(idAviso20), documento, idTipoDoc36);
		}
	}

	@RequestMapping(value = "/aportarDocumento", method = RequestMethod.POST)
	public @ResponseBody Avisos aportarDocumento(
			@RequestParam(value = "documento", required = false) MultipartFile documento) throws Throwable {
		return this.avisosService.aportarDocumento(documento);
	}

	/***
	 * Hacer la búsuqeda de expedientes
	 * 
	 * @param filterExpedientes
	 * @param tableRequestDto
	 * @return
	 */
	@RequestMapping(value = "/expedientes/filter", method = RequestMethod.POST)
	public @ResponseBody TableResponseDto<Expedientes> filterExpedientes(
			@RequestJsonBody(param = "filter") Expedientes filterExpedientes,
			@RequestJsonBody TableRequestDto tableRequestDto) {
		AvisosController.logger.info("[POST - filter] : Obtener Expedientess");
		return this.expedientesService.findPapel0(filterExpedientes, tableRequestDto, false);
	}

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

	@GetMapping(value = "/motivosBaja")
	public @ResponseBody List<MotivosBaja> motivosBaja(HttpServletRequest request) {
		MotivosBaja motivosBaja = new MotivosBaja();
		motivosBaja.setBaja33("0");

		return this.motivosBajaService.findAll(motivosBaja, null);
	}

	@GetMapping(value = "/motivosBajaAll")
	public @ResponseBody List<MotivosBaja> motivosBajaAll(HttpServletRequest request) {
		MotivosBaja motivosBaja = new MotivosBaja();

		return this.motivosBajaService.findAll(motivosBaja, null);
	}

	@GetMapping(value = "/motivosQuejaAll")
	public @ResponseBody List<MaestroMotQueja> motivosQuejaAll(HttpServletRequest request) {

		return this.maestroMotQuejaService.findAll(new MaestroMotQueja(), null);
	}

	@Transactional(rollbackFor = Throwable.class)
	@RequestMapping(value = "/getDireccionDesdeXML", method = RequestMethod.POST)
	public @ResponseBody Direcciones getDireccionDesdeXML(@RequestJsonBody Direcciones direcciones) {
		AvisosController.logger.info("[POST - filter] : Obtener Direcciones");
		return this.avisosService.getDireccionDesdeXML(direcciones);
	}

}
