/*
* Copyright 2021 E.J.I.E., S.A.
*
* Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);
* Solo podrá usarse esta obra si se respeta la Licencia.
* Puede obtenerse una copia de la Licencia en
*
* http://ec.europa.eu/idabc/eupl.html
*
* Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,
* el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,
* SIN GARANT�?AS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.
* Véase la Licencia en el idioma concreto que rige los permisos y limitaciones
* que establece la Licencia.
*/
package com.ejie.ad74a.control;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

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

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.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.support.ByteArrayMultipartFileEditor;

import com.ejie.ad74a.exceptions.ManagerErrors;
import com.ejie.ad74a.model.BandejaPapel0;
import com.ejie.ad74a.model.Combo;
import com.ejie.ad74a.model.Contactos;
import com.ejie.ad74a.model.Dependencia;
import com.ejie.ad74a.model.Direcciones;
import com.ejie.ad74a.model.Discapacidad;
import com.ejie.ad74a.model.DocumentoPapel0;
import com.ejie.ad74a.model.Estados;
import com.ejie.ad74a.model.Expedientes;
import com.ejie.ad74a.model.Informes;
import com.ejie.ad74a.model.MotivosBaja;
import com.ejie.ad74a.model.PisosTutelados;
import com.ejie.ad74a.model.Solicitantes;
import com.ejie.ad74a.service.BandejaPapel0Service;
import com.ejie.ad74a.service.ContactosService;
import com.ejie.ad74a.service.DependenciaService;
import com.ejie.ad74a.service.DiscapacidadService;
import com.ejie.ad74a.service.DocumentoPapel0Service;
import com.ejie.ad74a.service.ExpedientesService;
import com.ejie.ad74a.service.PisosTuteladosService;
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.comun.UtilWeb;
import com.ejie.ad74a.util.comun.Utilidades;
import com.ejie.ad74a.util.comun.UtilidadesFecha;
import com.ejie.ad74a.util.constantes.Constantes;
import com.ejie.ad74a.util.constantes.Constantes.NoAceptada;
import com.ejie.ad74a.util.constantes.EstadoInformesEnum;
import com.ejie.ad74a.util.constantes.EstadosExpedienteEnum;
import com.ejie.ad74a.util.constantes.MotivoBajaEnum;
import com.ejie.ad74a.util.constantes.ProcedimientosEnum;
import com.ejie.ad74a.util.constantes.TipoAportacionEnum;
import com.ejie.ad74a.util.constantes.TipoIdentificadorEnum;
import com.ejie.ad74a.util.constantes.TipoInformesEnum;
import com.ejie.ad74a.util.constantes.TipoProcesoEnum;
import com.ejie.ad74a.util.constantes.modelos.TipoExpedientes;
import com.ejie.ad74a.util.pif.Ad74aPIFws;
import com.ejie.ad74a.ws.client.documentum.service.DocumentumService;
import com.ejie.ad74a.ws.client.dokusi.service.DokusiService;
import com.ejie.t65.jaxb.beans.fsd.T65DocumentType;
import com.ejie.x38.control.bind.annotation.RequestJsonBody;
import com.ejie.x38.dto.TableRequestDto;
import com.ejie.x38.dto.TableResponseDto;
import com.ejie.x38.dto.TableRowDto;
import com.ejie.x38.util.DateTimeManager;

/**
 * BandejaPapel0Controller generated by UDA, 19-abr-2023 10:08:16.
 * 
 * @author UDA
 */
@Controller
@RequestMapping(value = "/bandejapapel0")
public class BandejaPapel0Controller {
	private static final Logger logger = LoggerFactory.getLogger(BandejaPapel0Controller.class);

	@Autowired
	private BandejaPapel0Service bandejaPapel0Service;

	@Autowired
	private DocumentoPapel0Service documentoPapel0Service;

	@Autowired
	private DokusiService dokusiService;

	@Autowired
	private DocumentumService documentumService;

	@Autowired
	private ExpedientesService expedientesService;

	@Autowired
	private ContactosService contactosService;

	@Autowired
	private DependenciaService dependenciaService;

	@Autowired
	private DiscapacidadService discapacidadService;

	@Autowired
	private SolicitantesService solicitanteService;

	@Autowired
	private PisosTuteladosService pisosTuteladosService;

	@Autowired
	private ReloadableResourceBundleMessageSource appMessageSource;

	@InitBinder
	protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws ServletException {
		binder.registerCustomEditor(byte[].class, new ByteArrayMultipartFileEditor());
		// XXX [JBHG] Cuando se quiere utilizar campos <form:input> de tipo "DateTime"
		// (fecha con
		// hora) se debe utilizar la funcion de x38 getTimestampFormat para que devuelva
		// el formato
		// correcto incluyendo horas, minutos y segundos
		// binder.registerCustomEditor(Date.class,
		// new
		// CustomDateEditor(DateTimeManager.getDateTimeFormat(LocaleContextHolder.getLocale()),
		// true));
		binder.registerCustomEditor(Date.class,
				new CustomDateEditor(DateTimeManager.getTimestampFormat(LocaleContextHolder.getLocale()), true));
	}

	private Object validarUsuarioAcceso(HttpServletRequest request) {
		// TODO Auto-generated method stub
		return null;
	}

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

	/**
	 * Operación CRUD Read. Devuelve el bean correspondiente al identificador
	 * indicado.
	 * 
	 * @param idEntrada12 Long
	 *
	 * @return BandejaPapel0 Objeto correspondiente al identificador indicado.
	 */
	@RequestMapping(value = "/{idEntrada12}", method = RequestMethod.GET)
	public @ResponseBody BandejaPapel0 get(@PathVariable Long idEntrada12) {
		BandejaPapel0 bandejaPapel0 = new BandejaPapel0();
		bandejaPapel0.setIdEntrada12(idEntrada12);
		bandejaPapel0 = this.bandejaPapel0Service.find(bandejaPapel0);
		BandejaPapel0Controller.logger.info("[GET - findBy_PK] : Obtener BandejaPapel0 por PK");
		return bandejaPapel0;
	}

	/**
	 * Devuelve una lista de beans correspondientes a los valores de filtrados
	 * indicados en el objeto pasado como parámetro.
	 *
	 * @param filterBandejaPapel0 Objeto BandejaPapel0 que contiene los parámetros
	 *                            de filtrado utilizados en la búsqueda.
	 *
	 * @return List<BandejaPapel0> Lista de objetos correspondientes a la búsqueda
	 *         realizada.
	 */
	@RequestMapping(method = RequestMethod.GET)
	public @ResponseBody List<BandejaPapel0> getAll(@ModelAttribute BandejaPapel0 filterBandejaPapel0) {
		BandejaPapel0Controller.logger.info("[GET - find_ALL] : Obtener BandejaPapel0 por filtro");
		return this.bandejaPapel0Service.findAll(filterBandejaPapel0, null);
	}

	/**
	 * Operación CRUD Edit. Modificacion del bean indicado.
	 *
	 * @param bandejaPapel0 Bean BandejaPapel0 que contiene la informacion a
	 *                      modificar.
	 *
	 * @return BandejaPapel0 Bean resultante de la modificacion.
	 */
	@RequestMapping(value = "/edit", method = RequestMethod.PUT)
	public @ResponseBody BandejaPapel0 edit(@RequestBody BandejaPapel0 bandejaPapel0) {
		BandejaPapel0 bandejaPapel0Aux = this.bandejaPapel0Service.update(bandejaPapel0);
		BandejaPapel0Controller.logger.info("[PUT] : BandejaPapel0 actualizado correctamente");
		return bandejaPapel0Aux;
	}

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

	/**
	 * Operación CRUD Delete. Borrado del registro correspondiente a partir del
	 * identificador especificado.
	 *
	 * @param idEntrada12 Long Identificador del objeto que se desea eliminar.
	 *
	 * @return BandejaPapel0 Bean eliminado.
	 */
	@RequestMapping(value = "/{idEntrada12}", method = RequestMethod.DELETE)
	@ResponseStatus(value = HttpStatus.OK)
	public @ResponseBody BandejaPapel0 delete(@PathVariable Long idEntrada12) {
		BandejaPapel0 bandejaPapel0 = new BandejaPapel0();
		bandejaPapel0.setIdEntrada12(idEntrada12);
		this.bandejaPapel0Service.remove(bandejaPapel0);
		BandejaPapel0Controller.logger.info("[DELETE] : BandejaPapel0 borrado correctamente");
		return bandejaPapel0;
	}

	/*
	 * MÉTODOS COMPONENTE RUP_TABLE
	 */

	/**
	 * Método de presentación del RUP_TABLE.
	 * 
	 * @param model Model
	 *
	 * @return String
	 */
	@RequestMapping(value = "/maint", method = RequestMethod.GET)
	public String getMaint(Model model) {
		BandejaPapel0Controller.logger.info("[GET - View] : bandejapapel0");
		model.addAttribute("bandejapapel0", new BandejaPapel0());
		model.addAttribute("documentoPapel0", new DocumentoPapel0());
		model.addAttribute("TiposAportacion", TipoAportacionEnum.values());
		model.addAttribute("Procedimientos", ProcedimientosEnum.values());
		model.addAttribute("userName", UtilSeguridad.getUsuarioConectado().getUserName());

		return "bandejapapel0";
	}

	/**
	 * Obtener el formulario de edición.
	 * 
	 * @param actionType   String
	 * @param fixedMessage String
	 * @param model        Model
	 *
	 * @return String
	 */

	@RequestMapping(value = "/editForm", method = RequestMethod.POST)
	public String getEditForm(@RequestParam(required = true) String actionType,
			@RequestParam(required = false) String fixedMessage, Model model) {
		BandejaPapel0Controller.logger.info("[POST - editForm] : bandejapapel0");

		model.addAttribute("bandejapapel0", new BandejaPapel0());
		model.addAttribute("actionType", actionType);

		if (fixedMessage != null) {
			model.addAttribute("fixedMessage", fixedMessage);
		}

		return "bandejapapel0EditForm";
	}

	/**
	 * Obtener el formulario necesario para permitir el uso de la edición en línea.
	 * 
	 * @param actionType String
	 * @param tableID    String
	 * @param mapping    String
	 * @param model      Model
	 *
	 * @return String
	 */
	@RequestMapping(value = "/inlineEdit", method = RequestMethod.POST)
	public String getInlineEditForm(@RequestParam(required = true) String actionType,
			@RequestParam(required = true) String tableID, @RequestParam(required = false) String mapping,
			Model model) {
		BandejaPapel0Controller.logger.info("[POST - inlineEditForm] : bandejapapel0");

		model.addAttribute("entity", new BandejaPapel0());
		model.addAttribute("actionType", actionType);
		model.addAttribute("tableID", tableID);

		// Controlar que el mapping siempre se añada al modelo de la manera esperada
		if (mapping == null || mapping.isEmpty()) {
			mapping = "/bandejapapel0";
		} else if (mapping.endsWith("/")) {
			mapping = mapping.substring(0, mapping.length() - 1);
		}
		model.addAttribute("mapping", mapping);

		return "bandejapapel0InlineEditAuxForm";
	}

	/**
	 * Operación de filtrado del componente RUP_TABLE.
	 * 
	 * @param filterBandejaPapel0 Bean BandejaPapel0 que contiene los parámetros de
	 *                            filtrado a emplear.
	 * @param tableRequestDto     Dto que contiene los parámetros de configuración
	 *                            propios del RUP_TABLE a aplicar en el filtrado.
	 *
	 * @return TableResourceResponseDto<BandejaPapel0> Dto que contiene el resultado
	 *         del filtrado realizado por el componente RUP_TABLE.
	 */
	@RequestMapping(value = "/filter", method = RequestMethod.POST)
	public @ResponseBody TableResponseDto<BandejaPapel0> filter(
			@RequestJsonBody(param = "filter") BandejaPapel0 filterBandejaPapel0,
			@RequestJsonBody TableRequestDto tableRequestDto) {
		BandejaPapel0Controller.logger.info("[POST - filter] : Obtener BandejaPapel0s");

		filterBandejaPapel0.setEstado12(Constantes.EstadosBandejaPapel0.PENDIENTE);
		return this.bandejaPapel0Service.filter(filterBandejaPapel0, tableRequestDto, false);
	}

	/**
	 * Operación de búsqueda del componente RUP_TABLE.
	 * 
	 * @param filterBandejaPapel0 Bean BandejaPapel0 que contiene los parámetros de
	 *                            filtrado a emplear.
	 * @param searchBandejaPapel0 Bean BandejaPapel0 que contiene los parámetros de
	 *                            búsqueda a emplear.
	 * @param tableRequestDto     Dto que contiene los parámetros de configuración
	 *                            propios del RUP_TABLE a aplicar en la búsqueda.
	 *
	 * @return TableRowDto<BandejaPapel0> Dto que contiene el resultado de la
	 *         búsqueda realizada por el componente RUP_TABLE.
	 */
	@RequestMapping(value = "/search", method = RequestMethod.POST)
	public @ResponseBody List<TableRowDto<BandejaPapel0>> search(
			@RequestJsonBody(param = "filter") BandejaPapel0 filterBandejaPapel0,
			@RequestJsonBody(param = "search") BandejaPapel0 searchBandejaPapel0,
			@RequestJsonBody TableRequestDto tableRequestDto) {
		BandejaPapel0Controller.logger.info("[POST - search] : Buscar BandejaPapel0s");
		return this.bandejaPapel0Service.search(filterBandejaPapel0, searchBandejaPapel0, tableRequestDto, false);
	}

	/**
	 * Borrado múltiple de registros
	 * 
	 * @param filterBandejaPapel0 Bean BandejaPapel0 que contiene los parámetros de
	 *                            filtrado a emplear.
	 * @param tableRequestDto     Dto que contiene los parámetros de configuración
	 *                            propios del RUP_TABLE a aplicar en la búsqueda.
	 *
	 * @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> deleteMultiple(TableRequestDto tableRequestDto) {
		BandejaPapel0Controller.logger.info("[POST - deleteMultiple] : Eliminar multiples BandejaPapel0s");
		this.bandejaPapel0Service.removeMultiple(tableRequestDto);
		BandejaPapel0Controller.logger.info("All entities correctly deleted!");

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

	/**
	 * EXPORTERS
	 */

	/**
	 * Devuelve los datos exportados de la tabla y los copia al portapapeles.
	 *
	 * @param filterBandejaPapel0 BandejaPapel0
	 * @param columns             String[]
	 * @param columnsName         String[]
	 * @param reportsParams       ArrayList<?>
	 * @param tableRequestDto     TableRequestDto
	 */
	@RequestMapping(value = "/clipboardReport", method = RequestMethod.POST)
	public @ResponseBody List<BandejaPapel0> getClipboardReport(
			@RequestJsonBody(param = "filter") BandejaPapel0 filterBandejaPapel0,
			@RequestParam(required = false) String[] columns, @RequestParam(required = false) String[] columnsName,
			@RequestParam(required = false) ArrayList<?> reportsParams,
			@RequestJsonBody TableRequestDto tableRequestDto) {
		BandejaPapel0Controller.logger.info("[POST - clipboardReport] : : Copiar en Portapapeles");
		return this.bandejaPapel0Service.getDataForReports(filterBandejaPapel0, tableRequestDto);
	}

	/**
	 * Devuelve un fichero excel que contiene los datos exportados de la tabla.
	 *
	 * @param filter          BandejaPapel0
	 * @param columns         String[]
	 * @param fileName        String
	 * @param sheetTitle      String
	 * @param reportsParams   ArrayList<?>
	 * @param tableRequestDto TableRequestDto
	 * @param request         HttpServletRequest
	 * @param response        HttpServletResponse
	 */
	@RequestMapping(value = { "/xlsReport",
			"/xlsxReport" }, method = RequestMethod.POST, produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
	public @ResponseBody void generateExcelReport(
			@RequestJsonBody(param = "filter", required = false) BandejaPapel0 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(param = "reportsParams", required = false) ArrayList<?> reportsParams,
			@RequestJsonBody TableRequestDto tableRequestDto, HttpServletRequest request, HttpServletResponse response)
			throws ServletException {
		BandejaPapel0Controller.logger.info("[POST - generateExcelReport] : Devuelve un fichero excel");
		this.bandejaPapel0Service.generateReport(filter, columns, columnsName, fileName, sheetTitle, reportsParams,
				tableRequestDto, request, response);
	}

	/**
	 * Devuelve un fichero pdf que contiene los datos exportados de la tabla.
	 *
	 * @param filter          BandejaPapel0
	 * @param columns         String[]
	 * @param fileName        String
	 * @param sheetTitle      String
	 * @param reportsParams   ArrayList<?>
	 * @param tableRequestDto TableRequestDto
	 * @param request         HttpServletRequest
	 * @param response        HttpServletResponse
	 */
	@RequestMapping(value = "pdfReport", method = RequestMethod.POST, produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
	public @ResponseBody void generatePDFReport(
			@RequestJsonBody(param = "filter", required = false) BandejaPapel0 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(param = "reportsParams", required = false) ArrayList<?> reportsParams,
			@RequestJsonBody TableRequestDto tableRequestDto, HttpServletRequest request,
			HttpServletResponse response) {
		BandejaPapel0Controller.logger.info("[POST - generatePDFReport] : Devuelve un fichero pdf");
		this.bandejaPapel0Service.generateReport(filter, columns, columnsName, fileName, sheetTitle, reportsParams,
				tableRequestDto, request, response);
	}

	/**
	 * Devuelve un fichero ods que contiene los datos exportados de la tabla.
	 *
	 * @param filter          BandejaPapel0
	 * @param columns         String[]
	 * @param fileName        String
	 * @param sheetTitle      String
	 * @param reportsParams   ArrayList<?>
	 * @param tableRequestDto TableRequestDto
	 * @param request         HttpServletRequest
	 * @param response        HttpServletResponse
	 */
	@RequestMapping(value = "odsReport", method = RequestMethod.POST, produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
	public @ResponseBody void generateODSReport(
			@RequestJsonBody(param = "filter", required = false) BandejaPapel0 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(param = "reportsParams", required = false) ArrayList<?> reportsParams,
			@RequestJsonBody TableRequestDto tableRequestDto, HttpServletRequest request,
			HttpServletResponse response) {
		BandejaPapel0Controller.logger.info("[POST - generateODSReport] : Devuelve un fichero ods");
		this.bandejaPapel0Service.generateReport(filter, columns, columnsName, fileName, sheetTitle, reportsParams,
				tableRequestDto, request, response);
	}

	/**
	 * Devuelve un fichero csv que contiene los datos exportados de la tabla.
	 *
	 * @param filter          BandejaPapel0
	 * @param columns         String[]
	 * @param fileName        String
	 * @param sheetTitle      String
	 * @param reportsParams   ArrayList<?>
	 * @param tableRequestDto TableRequestDto
	 * @param request         HttpServletRequest
	 * @param response        HttpServletResponse
	 */
	@RequestMapping(value = "csvReport", method = RequestMethod.POST, produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
	public @ResponseBody void generateCSVReport(
			@RequestJsonBody(param = "filter", required = false) BandejaPapel0 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(param = "reportsParams", required = false) ArrayList<?> reportsParams,
			@RequestJsonBody TableRequestDto tableRequestDto, HttpServletRequest request,
			HttpServletResponse response) {
		BandejaPapel0Controller.logger.info("[POST - generateCSVReport] : Devuelve un fichero csv");
		this.bandejaPapel0Service.generateReport(filter, columns, columnsName, fileName, sheetTitle, reportsParams,
				tableRequestDto, request, response);
	}

	/**
	 * Búsqueda en bandeja papel 0 join con expedientes
	 * 
	 * @param filterBandejaPapel0
	 * @return
	 */
	@PostMapping(value = "/detail")
	public @ResponseBody BandejaPapel0 getDetail(
			@RequestJsonBody(param = "bandejaPapel0") BandejaPapel0 bandejaPapel0) {

		BandejaPapel0Controller.logger.info("[GET - detail] : bandejaPapel0");

		// Bloquear la entrada
		bandejaPapel0.setBloqueo12(Constantes.VAL_NUM_SI);
		bandejaPapel0.setUsuResponsable12(UtilSeguridad.getUsuarioConectado().getUserName());
		this.bandejaPapel0Service.updateBloqueo(bandejaPapel0);

		// Solo necesitamos el id de la entrada
		List<BandejaPapel0> listBandejaEntrada = this.bandejaPapel0Service
				.getBandejaPapel0Complete(new BandejaPapel0(bandejaPapel0.getIdEntrada12()));

		return !listBandejaEntrada.isEmpty() && listBandejaEntrada.size() == 1 ? listBandejaEntrada.get(0)
				: new BandejaPapel0();

	}

	/**
	 * Procesar una entrada
	 * 
	 */
	@RequestMapping(value = "/tiposProcesos", method = RequestMethod.POST)
	public @ResponseBody List<Combo> getTiposProcesos(@RequestBody BandejaPapel0 bandejaPapel0) {
		BandejaPapel0Controller.logger.info("[POST - tiposprocesos] : bandejapapel0");

		List<Combo> returnList = new ArrayList<Combo>();

		ArrayList<TipoProcesoEnum> listaTipos = new ArrayList<TipoProcesoEnum>();
		for (int i = 0; i < listaTipos.size(); i++) {
			returnList.add(listaTipos.get(i).getCombo());
		}

		for (TipoProcesoEnum tipoProceso : TipoProcesoEnum.values()) {
			returnList.add(tipoProceso.getCombo());
		}

		return returnList;

	}

	@RequestMapping(value = "/openOrDownloadDocument/{oid}", method = RequestMethod.GET)
	public void openOrDownloadDocument(@PathVariable String oid, @RequestParam(required = false) String nombreDoc,
			HttpServletResponse response) throws IOException, Exception {

		String rutaPif = "";
		if (!Utilidades.esBlancoNulo(oid)) {
			try {

				DocumentoPapel0 doc = new DocumentoPapel0();
				doc.setOidDocumento13(oid);
				doc = this.documentoPapel0Service.findAll(doc, null).get(0);
				T65DocumentType documentType = null;
				if (!Utilidades.esNulo(doc.getIdTipoDoc13())) {
					documentType = this.dokusiService.descargarDocumentoDokusi(doc);

				} else {
					documentType = this.documentumService.descargarDocumentoDocumentum(doc);
				}

				// hay que almacenar la extension del documento
				String extension = documentType.getContent().getFormat().getExtension();
				doc.setExtension13(extension);
				this.documentoPapel0Service.updateExtension(doc);

				rutaPif = documentType.getContent().getPifId();
				BandejaPapel0Controller.logger.info(
						"BandejaPapel0Controller.openOrDownloadDocument - Ad74aPIFws.getInstance().downloadDocument path = {}",
						rutaPif);
				InputStream inputStream = Ad74aPIFws.getInstance().downloadDocument(rutaPif);
				UtilWeb.downloadFile(nombreDoc == null ? oid : nombreDoc,
						documentType.getContent().getFormat().getMimeType(), 0, inputStream, response, "");
			} catch (Exception e) {
				ManagerErrors.manageException(e, "Error al descargar el documento");
			} finally {
				Ad74aPIFws.getInstance().deleteDocument(rutaPif);
			}
		}

	}

	/**
	 * Procesar una entrada
	 * 
	 */
	@RequestMapping(value = "/process", method = RequestMethod.POST)
	public @ResponseBody BandejaPapel0 process(@RequestJsonBody(param = "bandejaPapel0") BandejaPapel0 bandejaPapel0) {

		BandejaPapel0Controller.logger.info("[POST - process] : bandejaPapel0");

		// TODO: revisar qué usuarios van a tener permisos para procesar las entradas:
		// Administrador y técnico
		// if (Boolean.FALSE.equals(this.validarUsuario())) {
		// throw new Ad74aException(UtilLiterales.getLiteralMessage(appMessageSource,
		// com.ejie.ad74a.util.constantes.Constantes.ERROR_ACCESO_DENEGADO));
		// }

		bandejaPapel0 = this.bandejaPapel0Service.procesarEntrada(bandejaPapel0);
		return bandejaPapel0;
	}

	/**
	 * Búsqueda en bandeja papel 0 join con expedientes
	 * 
	 * @param filterBandejaPapel0
	 * @return
	 */
	@PostMapping(value = "/mostrarOcultar")
	public @ResponseBody String mostrarOcultar(@RequestJsonBody(param = "bandejaPapel0") BandejaPapel0 bandejaPapel0) {

		BandejaPapel0Controller.logger.info("[POST - mostrarOcultar] : bandejaPapel0");

		// Solo necesitamos el id de la entrada
		List<BandejaPapel0> listBandejaEntrada = this.bandejaPapel0Service
				.getBandejaPapel0Complete(new BandejaPapel0(bandejaPapel0.getIdEntrada12()));

		if (!listBandejaEntrada.isEmpty()) {

			BandejaPapel0 bandejaPapel0Aux = listBandejaEntrada.get(0);
			if (bandejaPapel0Aux.getEstado12() != null
					&& bandejaPapel0Aux.getEstado12().equals(Constantes.EstadosBandejaPapel0.OCULTO)) {
				bandejaPapel0.setEstado12(Constantes.EstadosBandejaPapel0.PENDIENTE);
				bandejaPapel0.setMotivoOcultar12(null);
			} else if (bandejaPapel0Aux.getEstado12() != null
					&& bandejaPapel0Aux.getEstado12().equals(Constantes.EstadosBandejaPapel0.PENDIENTE)) {
				bandejaPapel0.setEstado12(Constantes.EstadosBandejaPapel0.OCULTO);
			} else if (bandejaPapel0Aux.getEstado12() != null
					&& bandejaPapel0Aux.getEstado12().equals(Constantes.EstadosBandejaPapel0.EN_CURSO_OCULTO)) {
				bandejaPapel0.setEstado12(Constantes.EstadosBandejaPapel0.EN_CURSO);
			} else if (bandejaPapel0Aux.getEstado12() != null
					&& bandejaPapel0Aux.getEstado12().equals(Constantes.EstadosBandejaPapel0.EN_CURSO)) {
				bandejaPapel0.setEstado12(Constantes.EstadosBandejaPapel0.EN_CURSO_OCULTO);
			}

			bandejaPapel0.setIdEntrada12(bandejaPapel0Aux.getIdEntrada12());
			bandejaPapel0.setUsuModif12(UtilSeguridad.getUsuarioConectado().getUserName());

			this.bandejaPapel0Service.updateOculto(bandejaPapel0);
		}

		return String.valueOf(false);

	}

	/**
	 * Búsqueda en bandeja papel 0 join con expedientes
	 * 
	 * @param filterBandejaPapel0
	 * @return
	 */
	@PostMapping(value = "/rechazar")
	public @ResponseBody String rechazar(@RequestJsonBody(param = "bandejaPapel0") BandejaPapel0 bandejaPapel0) {

		BandejaPapel0Controller.logger.info("[POST - rechazar] : bandejaPapel0");

		// Solo necesitamos el id de la entrada
		List<BandejaPapel0> listBandejaEntrada = this.bandejaPapel0Service
				.getBandejaPapel0Complete(new BandejaPapel0(bandejaPapel0.getIdEntrada12()));

		if (!listBandejaEntrada.isEmpty()) {

			bandejaPapel0 = listBandejaEntrada.get(0);
			this.bandejaPapel0Service.rechazarEntrada(bandejaPapel0, true);
		}

		return String.valueOf(false);

	}

	/**
	 * Búsqueda en bandeja papel 0 join con expedientes
	 * 
	 * @param filterBandejaPapel0
	 * @return
	 */
	@PostMapping(value = "/guardar")
	public @ResponseBody String guardar(@RequestJsonBody(param = "bandejaPapel0") BandejaPapel0 bandejaPapel0) {

		BandejaPapel0Controller.logger.info("[POST - guardar] : bandejaPapel0");

		// Solo necesitamos el id de la entrada
		List<BandejaPapel0> listBandejaEntrada = this.bandejaPapel0Service
				.getBandejaPapel0Complete(new BandejaPapel0(bandejaPapel0.getIdEntrada12()));

		if (!listBandejaEntrada.isEmpty()) {

			this.bandejaPapel0Service.guardarEntrada(bandejaPapel0);
		}

		return String.valueOf(false);

	}

	/**
	 * Método de presentación del RUP_TABLE para la búsqueda de expedientes
	 * 
	 * @param model Model
	 *
	 * @return String
	 */
	@RequestMapping(value = "/buscarExpediente", method = RequestMethod.GET)
	public String buscarExpediente(Model model) {
		BandejaPapel0Controller.logger.info("[GET - View] : buscarExpediente");
		model.addAttribute("expediente", new Expedientes());
		model.addAttribute("Procedimientos", ProcedimientosEnum.values());

		return "bp0buscarexpediente";
	}

	/***
	 * 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) {
		BandejaPapel0Controller.logger.info("[POST - filter] : Obtener Expedientess");
		return this.expedientesService.findPapel0(filterExpedientes, tableRequestDto, false);
	}

	@RequestMapping(value = "/expedientesBandeja/filter", method = RequestMethod.POST)
	public @ResponseBody TableResponseDto<Expedientes> filterBanedeja(
			@RequestJsonBody(param = "filter") Expedientes filterExpedientes,
			@RequestJsonBody TableRequestDto tableRequestDto) {
		BandejaPapel0Controller.logger.info("[POST - filter] : Obtener Expedientess");
		return this.expedientesService.filterBanedeja(filterExpedientes, tableRequestDto, false);
	}

	/**
	 * Entrar al detalle de la solicitud a completar
	 * 
	 * @param idExpediente Long
	 * 
	 * @return String
	 */
	@RequestMapping(value = "/solicitud/{idExpediente00}", method = RequestMethod.GET)
	public String solicitud(@PathVariable Long idExpediente00, Model model) {
		Expedientes expediente = new Expedientes();
		expediente.setIdExpediente00(idExpediente00);
		expediente.setEstados(new Estados(EstadosExpedienteEnum.PEND_COMPLETAR.getId()));
		List<Expedientes> expedientes = this.expedientesService.findAllLikeBandejaPapel0(expediente, null, false);
		if (expedientes.isEmpty()) {
			// throw new Ad74aException(UtilLiterales.getLiteralMessage(appMessageSource,
			// com.ejie.ad74a.util.constantes.Constantes.ERROR_ACCESO_DENEGADO));
			model.addAttribute("msg", "No se ha encontrado la solicitud. Compruebe que no haya sido finalizada");
			return "accessDenied";
		}

		expediente = expedientes.get(0);
		// Por defecto que estén el si seleccionado
		if (expediente.getAutorizaConsulta00() == null) {
			expediente.setAutorizaConsulta00(Constantes.UNO);
		}
		if (expediente.getAutorizaDarInfo00() == null) {
			expediente.setAutorizaDarInfo00(Constantes.UNO);
		}
		model.addAttribute("expediente", expediente);

		model.addAttribute("origenCabecera", TipoExpedientes.idTipoEntrada00.PAPEL0.getLabelDesc());
		try {
			model.addAttribute("fregistroCabecera",
					UtilidadesFecha.formatearDateToStringFormatoTimeSeconds(expediente.getfRegistro00(), null));
		} catch (Exception e) {
		}
		model.addAttribute("nregistroCabecera", expediente.getNumRegistro00());
		model.addAttribute("fregistroOrigenCabecera", expediente.getfRegistroOtro00());
		model.addAttribute("nregistroOrigenCabecera", expediente.getNumRegistroOtro00());

		model.addAttribute("userName", UtilSeguridad.getUsuarioConectado().getUserName());
		model.addAttribute("menu", false);
		String[] paramTitle = { ProcedimientosEnum.getDesc(expediente.getIdProcedimiento00()) };
		model.addAttribute("title",
				UtilLiterales.getLiteralMessageWithParams(appMessageSource, "title.solicitudPapel0", paramTitle));

		BandejaPapel0Controller.logger.info("[GET - solicitud] : Obtener solicitud de papel0");
		return "solicitudpapel0";
	}

	@RequestMapping(value = "/tabSolicitud/{idExpediente00}", method = RequestMethod.GET)
	public String getTabSolicitud(Model model, @PathVariable Long idExpediente00,
			@RequestParam(value = "idEntrada", required = false) Long idEntrada, HttpServletRequest request) {

		if (Boolean.FALSE.equals(this.validarUsuarioAcceso(request))) {
			model.addAttribute("msg", UtilLiterales.getLiteralMessage(appMessageSource,
					com.ejie.ad74a.util.constantes.Constantes.ERROR_ACCESO_DENEGADO));
			return "accessDeniedIntegrado";
		}

		Expedientes expediente = this.expedientesService.find(new Expedientes(idExpediente00));
		if (expediente.getEstados().getIdEstado30().compareTo(EstadosExpedienteEnum.PEND_COMPLETAR.getId()) != 0) {
			model.addAttribute("msg", "No se ha encontrado la solicitud. Compruebe que no haya sido finalizada");
			return "accessDeniedIntegrado";
		}

		Dependencia dependencia = new Dependencia();
		dependencia.setIdExpediente04(expediente.getIdExpediente00());
		expediente.setDependencia(this.dependenciaService.findByIdExp(dependencia));

		Discapacidad discapacidad = new Discapacidad();
		discapacidad.setIdExpediente71(expediente.getIdExpediente00());
		expediente.setDiscapacidad(this.discapacidadService.findByIdExp(discapacidad));

		model.addAttribute("expediente", expediente);

		BandejaPapel0 bandejaPapel0 = new BandejaPapel0();
		bandejaPapel0.setNumRegistro12(expediente.getNumRegistro00());
		bandejaPapel0.setNoAceptada(NoAceptada.NO_ACEPTADA);
		List<BandejaPapel0> listaBP0 = this.bandejaPapel0Service.findAllLike(bandejaPapel0, null, false);
		if (listaBP0.isEmpty()) {
			model.addAttribute("msg",
					"No se ha encontrado la entrada en la bandeja de papel0 correspondiente a la solicitud");
			return "accessDeniedIntegrado";
		}
		bandejaPapel0 = listaBP0.get(0);
		model.addAttribute("bandejaPapel0", bandejaPapel0);

		List<Combo> tipoIdentificadorList = new ArrayList<>();
		for (TipoIdentificadorEnum enumeracion : TipoIdentificadorEnum.values()) {
			tipoIdentificadorList.add(enumeracion.getCombo());
		}
		List<Combo> tipoIdentificadorPersonaFisicaList = new ArrayList<>();
		for (TipoIdentificadorEnum enumeracion : TipoIdentificadorEnum
				.valuesByTipoPersona(Constantes.TIPO_PERSONA_FISICA_BBDD)) {
			tipoIdentificadorPersonaFisicaList.add(enumeracion.getCombo());
		}
//		model.addAttribute("origenCabecera", "Papel0");
//		model.addAttribute("fregistroCabecera", expediente.getfRegistro00());
//		model.addAttribute("nregistroCabecera", expediente.getNumRegistro00());
//		model.addAttribute("fregistroOrigenCabecera", expediente.getfRegistroOtro00());
//		model.addAttribute("nregistroOrigenCabecera", expediente.getNumRegistroOtro00());

		List<Combo> listaNivelesUrgencia = new ArrayList<Combo>();
		listaNivelesUrgencia.add(new Combo("", "---", "---"));
		for (Constantes.NivelUrgenciaEnum nivel : Constantes.NivelUrgenciaEnum.values()) {
			listaNivelesUrgencia.add(nivel.getCombo());
		}
		model.addAttribute("nivelesUrgencia", listaNivelesUrgencia);
		if (ProcedimientosEnum.ALTA.getId().equalsIgnoreCase(expediente.getIdProcedimiento00())) {
			PisosTutelados pisos = new PisosTutelados();
			// pisos.setDirecciones(expediente.getDirecciones());
			List<PisosTutelados> pisosTuteladosList = this.pisosTuteladosService.findAll(pisos, null);
			model.addAttribute("pisosTuteladosList", pisosTuteladosList);
			model.addAttribute("tipoIdentificadorList", tipoIdentificadorList);
			model.addAttribute("tipoIdentificadorPersonaFisicaList", tipoIdentificadorPersonaFisicaList);
			model.addAttribute("identrada12", idEntrada);
			return "tabSolicitudAltaPapel0";
		} else if (ProcedimientosEnum.BAJA.getId().equalsIgnoreCase(expediente.getIdProcedimiento00())) {
			model.addAttribute("tipoIdentificadorList", tipoIdentificadorList);
			model.addAttribute("tipoIdentificadorPersonaFisicaList", tipoIdentificadorPersonaFisicaList);
			List<MotivosBaja> motivosBajaList = MotivoBajaEnum.valuesMotivosBaja33(expediente.getDeOficio00(),
					MotivoBajaEnum.BAJA_NO);

			model.addAttribute("idMotivoBaja00List", motivosBajaList);
			model.addAttribute("identrada12", idEntrada);
			return "tabSolicitudBajaPapel0";
		} else if (ProcedimientosEnum.MODIFICACION.getId().equalsIgnoreCase(expediente.getIdProcedimiento00())) {
			List<PisosTutelados> pisosTuteladosList = this.pisosTuteladosService.findAll(new PisosTutelados(), null);
			model.addAttribute("pisosTuteladosList", pisosTuteladosList);
			model.addAttribute("tipoIdentificadorList", tipoIdentificadorList);
			model.addAttribute("tipoIdentificadorPersonaFisicaList", tipoIdentificadorPersonaFisicaList);
			model.addAttribute("identrada12", idEntrada);
			return "tabSolicitudModifPapel0";
		} else if (ProcedimientosEnum.INFORME.getId().equalsIgnoreCase(expediente.getIdProcedimiento00())) {
			model.addAttribute("tipoIdentificadorList", tipoIdentificadorList);
			model.addAttribute("tipoIdentificadorPersonaFisicaList", tipoIdentificadorPersonaFisicaList);
			model.addAttribute("identrada12", idEntrada);
			return "tabSolicitudInformePapel0";
		} else if (ProcedimientosEnum.REVISION_PRECIO.getId().equalsIgnoreCase(expediente.getIdProcedimiento00())) {
			model.addAttribute("tipoIdentificadorList", tipoIdentificadorList);
			model.addAttribute("tipoIdentificadorPersonaFisicaList", tipoIdentificadorPersonaFisicaList);
			model.addAttribute("identrada12", idEntrada);
			return "tabSolicitudRevisionPapel0";
		}
		return "error";

	}

	@RequestMapping(value = "/tabPrestacionServicio/{idExpediente00}", method = RequestMethod.GET)
	public String getTabPrestacionServicio(Model model, @PathVariable Long idExpediente00, HttpServletRequest request) {

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

		Expedientes expediente = this.expedientesService.find(new Expedientes(idExpediente00));
		if (expediente.getEstados().getIdEstado30().compareTo(EstadosExpedienteEnum.PEND_COMPLETAR.getId()) != 0) {
			return "error";
		}

		model.addAttribute("expediente", expediente);
		model.addAttribute("contactos", new Contactos());

		return "tabPrestacionServicioPapel0";

	}

	/**
	 * Metodo filter para obtener los contactos del expediente.
	 * 
	 * @param filterContactos Contactos 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<Contactos> Dto que contiene el resultado del
	 *         filtrado realizado por el componente RUP_TABLE.
	 */
	@RequestMapping(value = "/tabPrestacionServicio/contactos/{idExpediente00}/filter", method = RequestMethod.POST)
	public @ResponseBody TableResponseDto<Contactos> filterContactosExpediente(
			@RequestJsonBody(param = "filter") Contactos filterContactos,
			@RequestJsonBody TableRequestDto tableRequestDto, @PathVariable Long idExpediente00) {
		BandejaPapel0Controller.logger.info("[POST - filter] : Obtener Contactos");

		filterContactos.setIdExpediente03(idExpediente00);
		return this.contactosService.filter(filterContactos, tableRequestDto, false);
	}

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

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

		Expedientes expediente = this.expedientesService.find(new Expedientes(idExpediente00));
		if (expediente.getEstados().getIdEstado30().compareTo(EstadosExpedienteEnum.PEND_COMPLETAR.getId()) != 0) {
			return "error";
		}

		model.addAttribute("expediente", expediente);
		Informes informe = new Informes();
		informe.setExpedientes(expediente);

		// List<Informes> informesEncontrados = this.informeService.findAllLike(informe,
		// null, false);

		// InformeSocial informeSocial = this.informeSocialService.find();

		model.addAttribute("informes", new Informes());
		model.addAttribute("TipoEstado", EstadoInformesEnum.values());
		model.addAttribute("TipoInformes", TipoInformesEnum.values());

		return "tabInformeSocialPapel0";
	}

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

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

		Expedientes expediente = this.expedientesService.find(new Expedientes(idExpediente00));
		if (expediente.getEstados().getIdEstado30().compareTo(EstadosExpedienteEnum.PEND_COMPLETAR.getId()) != 0) {
			return "error";
		}

		BandejaPapel0 bandejaPapel0 = new BandejaPapel0();
		bandejaPapel0.setNumRegistro12(expediente.getNumRegistro00());
		bandejaPapel0.setNoAceptada(NoAceptada.NO_ACEPTADA);
		List<BandejaPapel0> listaBP0 = this.bandejaPapel0Service.findAllLike(bandejaPapel0, null, false);
		if (listaBP0.isEmpty()) {
			model.addAttribute("msg",
					"No se ha encontrado la entrada en la bandeja de papel0 correspondiente a la solicitud");
			return "accessDeniedIntegrado";
		}
		bandejaPapel0 = listaBP0.get(0);

		DocumentoPapel0 documentoPapel0 = new DocumentoPapel0();
		documentoPapel0.setBandejaPapel0(bandejaPapel0);

		model.addAttribute("documentoPapel0", documentoPapel0);
		model.addAttribute("expediente", expediente);

		return "tabDocumentosPapel0";

	}

	/**
	 * Guardar los datos de la solicitud de Papel0 y en caso de venir con el boton
	 * finalizar pulsado ejecutara la accion de finalizarSolicitud
	 *
	 * @param expediente Expedientes
	 *
	 * @return Expedientes
	 */
	@RequestMapping(value = "/tabSolicitud/edit", method = RequestMethod.PUT)
	public @ResponseBody Expedientes editTabSolicitud(@RequestJsonBody(param = "expediente") Expedientes expediente,
			@RequestJsonBody(param = "finalizar") boolean finalizar) {

		// TODO: validar los datos de expediente y solicitante
		this.bandejaPapel0Service.updateTabSolicitudPapel0(expediente, finalizar);
		if (finalizar) {
			Expedientes expedienteFinalizar = new Expedientes(expediente.getIdExpediente00());
			expedienteFinalizar.setIdProcedimiento00(expediente.getIdProcedimiento00());
			expedienteFinalizar.setSolicitantes(expediente.getSolicitantes());
			expedienteFinalizar.setIdEntrada(expediente.getIdEntrada());
			expediente = this.bandejaPapel0Service.finalizarSolicitud(expedienteFinalizar);
		}
		BandejaPapel0Controller.logger.info("[PUT] : BandejaPapel0 actualizado correctamente");

		return expediente;
	}

	// TODO: resto de pestañas

	/**
	 * Dar por finalizada la solicitud y crear el expediente en PLATEA
	 *
	 * @param idExpediente00
	 *
	 * @return Expedientes
	 */
	/*
	 * @RequestMapping(value = "/solicitud/finalizar/{idExpediente00}", method =
	 * RequestMethod.GET) public @ResponseBody Expedientes
	 * finalizarSolicitud(@PathVariable Long idExpediente00) {
	 * 
	 * Expedientes expediente = this.bandejaPapel0Service.finalizarSolicitud(new
	 * Expedientes(idExpediente00));
	 * 
	 * BandejaPapel0Controller.logger.
	 * info("[POST] : BandejaPapel0 solicitud finalizada correctamente");
	 * 
	 * return expediente; }
	 */

	@RequestMapping(value = "/existeSolicitante/{identificadorSolicitante}/{idProcedimiento}", method = RequestMethod.POST)
	public @ResponseBody Integer encontrarSolicitante(@PathVariable String identificadorSolicitante,
			@PathVariable String idProcedimiento) {
		BandejaPapel0Controller.logger.info("[POST] : BandejaPapel0 comprobamos el solicitante");
		Solicitantes solicitante = new Solicitantes();
		solicitante.setIdentificador01(identificadorSolicitante);
		solicitante.setBeneficiario01(Constantes.VAL_NUM_SI);
		List<Solicitantes> listaSolicitantes = this.solicitanteService.findAll(solicitante, null);
		if (listaSolicitantes.isEmpty()) {
			return 0;
		} else {
			for (int i = 0; listaSolicitantes.size() > i; i++) {
				if (listaSolicitantes.get(i).getfBaja01() == null) {
					Expedientes exp = new Expedientes();
					Solicitantes soli = new Solicitantes();
					soli.setIdentificador01(listaSolicitantes.get(i).getIdentificador01());
					exp.setSolicitantes(soli);
					exp.setNoCerrado(true);
					exp.setIdProcedimiento00(idProcedimiento);
					List<Expedientes> listaExpedientes = this.expedientesService.findAll(exp, null);
					if (listaExpedientes.isEmpty()) {
						return 1;
					} else {
						return 2;
					}
				}
			}
			return 3;
		}
	}

	@RequestMapping(value = "/existeSolicitanteOficios/{identificadorSolicitante}", method = RequestMethod.POST)
	public @ResponseBody Solicitantes encontrarSolicitanteOficios(@PathVariable String identificadorSolicitante) {
		BandejaPapel0Controller.logger.info("[POST] : BandejaPapel0 comprobamos el solicitante");
		TableRequestDto tableRequestDTO = new TableRequestDto();
		tableRequestDTO.setSidx("BENEFICIARIO01 , FBAJA01");
		tableRequestDTO.setSord("DESC NULLS LAST , DESC");
		Solicitantes solicitante = new Solicitantes();
		solicitante.setIdentificador01(identificadorSolicitante);
		List<Solicitantes> solicitanteRecibido = this.solicitanteService.findAll(solicitante, null);
		if (solicitanteRecibido.isEmpty()) {
			return null;
		} else {
			return solicitanteRecibido.get(0);
		}
	}

	@RequestMapping(value = "/verificarPisoTutelado", method = RequestMethod.POST)
	public @ResponseBody boolean comprobarPisoTutelado(@RequestJsonBody(param = "calle") Long calle,
			@RequestJsonBody(param = "letra") String letra, @RequestJsonBody(param = "portal") Long portal,
			@RequestJsonBody(param = "piso") String piso, @RequestJsonBody(param = "idPiso32") Long idPiso32) {
		Direcciones direccion = new Direcciones();
		// Calle calleNora = new Calle();
		// direccion.setCalleNORA(calleNora);
		direccion.setIdCalle06(calle);
		direccion.setIdPortal06(portal);
		direccion.setPiso06(piso);
		direccion.setLetra06(letra);
		return this.pisosTuteladosService.comprobarPisoTutelado(direccion, idPiso32);
	}

	@RequestMapping(value = "/obtenerDireccionPisoTutelado", method = RequestMethod.POST)
	public @ResponseBody String obtenerDireccionPisoTutelado(@RequestJsonBody(param = "idPiso32") Long idPiso32) {
		PisosTutelados piso = new PisosTutelados();
		piso.setIdPiso32(idPiso32);
		piso = this.pisosTuteladosService.find(piso);
		String direccion = piso.getDirecciones().getDireccionCompletaProvincia();

		return direccion;
	}
}
