package com.ejie.ad74a.control;

import java.io.IOException;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;

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

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
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 com.ejie.ad74a.exceptions.Ad74aWebserviceException;
import com.ejie.ad74a.exceptions.ManagerErrors;
import com.ejie.ad74a.model.Avisos;
import com.ejie.ad74a.model.Combo;
import com.ejie.ad74a.model.DocuAvisos;
import com.ejie.ad74a.model.Documento;
import com.ejie.ad74a.model.DocumentosBanTel;
import com.ejie.ad74a.model.Expedientes;
import com.ejie.ad74a.model.MaestroTiposDoc;
import com.ejie.ad74a.model.MotivosBaja;
import com.ejie.ad74a.model.Solicitantes;
import com.ejie.ad74a.model.ae01b.Liquidaciones;
import com.ejie.ad74a.model.ae01b.TiposIngreso;
import com.ejie.ad74a.service.AvisosService;
import com.ejie.ad74a.service.BandejaPapel0Service;
import com.ejie.ad74a.service.DocuAvisosService;
import com.ejie.ad74a.service.ExpedientesService;
import com.ejie.ad74a.service.InicioOficioService;
import com.ejie.ad74a.service.MaestroTiposDocService;
import com.ejie.ad74a.service.MotivosBajaService;
import com.ejie.ad74a.service.SolicitantesService;
import com.ejie.ad74a.service.ae01b.LiquidacionesService;
import com.ejie.ad74a.util.comun.UtilTokenXlnets;
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.MotivoBajaEnum;
import com.ejie.ad74a.util.constantes.ProcedimientosEnum;
import com.ejie.ad74a.util.constantes.TipoCanalOrigenEnum;
import com.ejie.ad74a.util.constantes.TipoIdentificadorEnum;
import com.ejie.ad74a.util.constantes.modelos.TipoExpedientes;
import com.ejie.ad74a.util.constantes.modelos.TipoSolicitantes;
import com.ejie.ad74a.util.pid.Ad74aPIDws;
import com.ejie.ad74a.util.pif.Ad74aPIFws;
import com.ejie.x38.control.bind.annotation.RequestJsonBody;
import com.ejie.x38.dto.TableRequestDto;
import com.ejie.x38.dto.TableResponseDto;

import v90.padoc.stub.W43DfDocument;

@Controller
@RequestMapping(value = "/inicioOficio")
public class InicioOficioController {

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

	@Autowired
	private MotivosBajaService motivosBajaService;

	@Autowired
	private BandejaPapel0Service bandejaPapel0Service;

	@Autowired
	private InicioOficioService inicioOficioService;

	@Autowired
	private SolicitantesService solicitantesService;

	@Autowired
	private AvisosService avisosService;

	@Autowired
	private DocuAvisosService docuAvisosService;

	@Autowired
	private ExpedientesService expedientesService;
	@Autowired
	private MaestroTiposDocService maestroTipoDocService;

	@Autowired
	private Ad74aPIDws pidWS;

	@Autowired
	private Properties appConfiguration;

	@Autowired
	private LiquidacionesService liquidacionesService;

	/**
	 * Método de presentación del RUP_TABLE para el detalle del inicio de oficio
	 * 
	 * @param model Model
	 *
	 * @return String
	 */
	@RequestMapping(value = "/{idProcedimiento00}", method = RequestMethod.GET)
	public String inicioOficioDetail(@PathVariable String idProcedimiento00, Model model,
			@RequestParam(value = "avisos", required = false) Long idAviso,
			@RequestParam(value = "idLiquidacion", required = false) Long idLiquidacion,
			@RequestParam(value = "idSolicitante", required = false) Long idSolicitante) {
		InicioOficioController.logger.info("[GET - View] : inicioOficioDetail");
		Expedientes expediente = new Expedientes();
		expediente.setIdProcedimiento00(idProcedimiento00);
//		if (idLiquidacion != null && idSolicitante != null) {
//			model.addAttribute("idLiquidacion", idLiquidacion);
//			model.addAttribute("idSolicitante", idSolicitante);
//		}
		MotivosBaja motivosBaja = new MotivosBaja();
		motivosBaja.setBaja33(MotivoBajaEnum.BAJA_NO);
		List<MotivosBaja> motivosBajaList = this.motivosBajaService.findAll(motivosBaja, null);
		model.addAttribute("idMotivoBaja00List", motivosBajaList);
		List<Combo> tipoIdentificadorList = new ArrayList<>();
		for (TipoIdentificadorEnum enumeracion : TipoIdentificadorEnum.values()) {
			if (!enumeracion.getId().equals(Constantes.COD_CIF)) {
				tipoIdentificadorList.add(enumeracion.getCombo());
			}
		}
		if (idAviso != null) {
			Avisos aviso = new Avisos();
			aviso.setIdAviso20(idAviso);
			List<Avisos> avisos = this.avisosService.findAll(aviso, null);
			aviso = avisos.get(0);
			Solicitantes solicitante = new Solicitantes();
			solicitante.setIdSolicitante01(aviso.getIdSolicitante20());
			solicitante = this.solicitantesService.find(solicitante);
			expediente.setSolicitantes(solicitante);
			// Se ha creado un nuevo metodo para obtener el ultimo expediente sea cual sea
			Expedientes expedienteCanalAviso = this.bandejaPapel0Service
					.obtenerAvisoSolicitanteUltimoExp(Long.toString(solicitante.getIdSolicitante01()));
			// SE ESTÁ COMPROBANDO SI EL SOLICITANTE TIENE EXPEDIENTE ASOCIADO O EN EL CASO
			// DE NO TENERLO SE ASOCIAN DATOS
			// PARA QUE PUEDA ABRIR EL INICIO DE OFICIO IGUALMENTE CON LOS DATOS DEL
			// EXPEDIENTE (CANAL: TELEMATICA / CANAL DE AVISO: SMS /
			// TELÉFONO: 000000000 )
			expediente.setIdTipoNot00(null != expedienteCanalAviso && null != expedienteCanalAviso.getIdTipoNot00()
					? expedienteCanalAviso.getIdTipoNot00()
					: String.valueOf(TipoExpedientes.idTipoNot00.TELEMATICA.getId()));
			expediente.setCanalNot00(null != expedienteCanalAviso && null != expedienteCanalAviso.getCanalNot00()
					? expedienteCanalAviso.getCanalNot00()
					: String.valueOf(TipoExpedientes.canalNot00.SMS.getId()));

			if (null != expedienteCanalAviso && expedienteCanalAviso.getTfnoNot00() != null) {
				expediente.setTfnoNot00(expedienteCanalAviso.getTfnoNot00());
			} else if (expediente.getCanalNot00().equals(String.valueOf(TipoExpedientes.canalNot00.SMS.getId()))) {
				if (null != solicitante.getTlfnoMovil01()) {
					expediente.setTfnoNot00(solicitante.getTlfnoMovil01());
				} else {
					expediente.setTfnoNot00(Constantes.NUEVE_CEROS_STRING);
				}
			}

			if (null != expedienteCanalAviso && expedienteCanalAviso.getEmailNot00() != null) {
				expediente.setEmailNot00(expedienteCanalAviso.getEmailNot00());
			}

			expediente.setIdAviso00(idAviso);
			expediente.setObservaciones00(aviso.getObservaciones20());

			if (aviso.getAvisosBajaBenef() != null) {
				expediente.setIdMotivoBaja00(aviso.getAvisosBajaBenef().getIdMotivobaja());

				SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
				String fecha = formatter.format(aviso.getAvisosBajaBenef().getFecBaja());
				model.addAttribute("fBaja00Formatted", fecha);
			} else {
				model.addAttribute("fBaja00Formatted", new Date());
				expediente.setIdMotivoBaja00(new Long(0));
			}
			InicioOficioController.logger.info("AVISO ERRONEO: TERMINA DE FORMATEAR LA FECHA");
		}

		// else if
		else if (idLiquidacion != null) {
			Liquidaciones liquidaciones = new Liquidaciones();
			liquidaciones.setIdLiquidacion00(idLiquidacion);
			liquidaciones = this.liquidacionesService.find(liquidaciones);
			// model.addAttribute("liquidaciones", liquidaciones);

			// recuperamos datos del solicitante y su ultimo expediente
			if (idSolicitante != null) {
				Solicitantes solicitante = new Solicitantes();
				solicitante.setIdSolicitante01(idSolicitante);
				solicitante = this.solicitantesService.find(solicitante);
				expediente.setSolicitantes(solicitante);
				expediente = this.expedientesService.findBeneficiarioUltimoExp(expediente);
				expediente.setIdProcedimiento00(idProcedimiento00);
				expediente.setSolicitantes(solicitante);

			} else {
				Solicitantes solicitante = new Solicitantes();
				solicitante.setIdentificador01(liquidaciones.getTercero00());
				solicitante.setActivo(TipoSolicitantes.ACTIVO_SI);
				List<Solicitantes> listaSolicitantes = this.solicitantesService.findAllLikeBeneficiarios(solicitante,
						null, false);
				if (!listaSolicitantes.isEmpty() && listaSolicitantes.size() == 1) {
					solicitante = listaSolicitantes.get(0);
					expediente.setSolicitantes(solicitante);
					expediente = this.expedientesService.findBeneficiarioUltimoExp(expediente);
					expediente.setIdProcedimiento00(idProcedimiento00);
					expediente.setSolicitantes(solicitante);
				}
			}
			expediente.setLiquidaciones(liquidaciones);
		}

		List<Combo> tipoIdentificadorPersonaFisicaList = new ArrayList<>();
		for (TipoIdentificadorEnum enumeracion : TipoIdentificadorEnum
				.valuesByTipoPersona(Constantes.TIPO_PERSONA_FISICA_BBDD)) {
			tipoIdentificadorPersonaFisicaList.add(enumeracion.getCombo());
		}
		model.addAttribute("tipoIdentificadorPersonaFisicaList", tipoIdentificadorPersonaFisicaList);

		model.addAttribute("tipoIdentificadorList", tipoIdentificadorList);
		model.addAttribute("documentosbantel", new DocumentosBanTel());
		InicioOficioController.logger.info("AVISO ERRONEO: PONE EL EXPEDIENTE EN EL MODELO");
		model.addAttribute("expediente", expediente);
		model.addAttribute("Procedimientos", ProcedimientosEnum.values());
		List<Combo> tipoCanalOrigen = new ArrayList<>();
		if (Constantes.ID_PROCEDIMIENTO_NOTIFICACION_LIQUIDACION.equalsIgnoreCase(idProcedimiento00)) {

			tipoCanalOrigen.add(TipoCanalOrigenEnum.DIRECCION.getCombo());

		} else {

			for (TipoCanalOrigenEnum tipoOrigen : TipoCanalOrigenEnum.values()) {
				if (!tipoOrigen.getId().equals(Constantes.TIPO_ORIGEN_TELEFONO)
						&& idProcedimiento00.equals(Constantes.ID_PROCEDIMIENTO_BAJA)) {
					tipoCanalOrigen.add(tipoOrigen.getCombo());
				} else if (!idProcedimiento00.equals(Constantes.ID_PROCEDIMIENTO_BAJA)) {
					tipoCanalOrigen.add(tipoOrigen.getCombo());
				}
			}

		}
		InicioOficioController.logger.info("AVISO ERRONEO: TERMINA TODO EL PROCESO");
		model.addAttribute("tipoCanalOrigen", tipoCanalOrigen);

		return "inicioOficio";
	}

	@RequestMapping(value = "/iniciarOficio", method = RequestMethod.POST)
	public @ResponseBody Expedientes inicioOficio(@RequestJsonBody(param = "expediente") Expedientes expediente,
			HttpServletRequest request, @RequestParam(value = "idaviso", required = false) Long idAviso,
			@RequestParam(value = "idLiquidaciones", required = false) Long idLiquidaciones) throws ParseException {

		InicioOficioController.logger.info("[PUT] : iniciarOficio Inicio");

		if (ProcedimientosEnum.NOTIFICACION_LIQUIDACION.getId().equalsIgnoreCase(expediente.getIdProcedimiento00())) {
			expediente.setOrigenOficio00(TipoCanalOrigenEnum.DIRECCION.getId());
		}

		// si tiene aviso, viene de un aviso y hay que ir a recuperar los documentos
		if (null != expediente.getIdAviso00()) {

		}

		HttpSession sesion = request.getSession();
		List<Documento> documentos = (List<Documento>) sesion.getAttribute(Constantes.VARCONTEXTO_OFICIO);
		ArrayList<String> listaDocBorrar = new ArrayList<String>();
		if (null != documentos && !documentos.isEmpty()) {
			// movemos el documento a una ruta nuestra
			for (Documento doc : documentos) {
				if (!Utilidades.esBlancoNulo(doc.getRutaPif())) {
					listaDocBorrar.add(doc.getRutaPif());
					doc.setRutaPif(Ad74aPIFws.copiarZonaPlatea(
							UtilTokenXlnets.getTokenDocumentXLNets(com.ejie.ad74a.constantes.Constantes.COD_APLICACION),
							doc.getRutaPif()));
				} else if (!Utilidades.esBlancoNulo(doc.getOidDocumento())) {
					StringBuilder rutaDestino = new StringBuilder();
					rutaDestino.append("/r02g/")
							.append(com.ejie.ad74a.constantes.Constantes.COD_APLICACION.toLowerCase()).append("/")
							.append(doc.getNombreDocumento());
					W43DfDocument w43DfDocument = pidWS.get(doc.getOidDocumento(), rutaDestino.toString());
					doc.setRutaPif(w43DfDocument.getContent().getPath());
				}
			}
		}

		this.inicioOficioService.inicioOficio(expediente,
				ProcedimientosEnum.getLabelDescEs(expediente.getIdProcedimiento00()), documentos);

		// si ha ido bien, borramos los documentos de la zona pif nuestra y si es de
		// aviso lo actualizamos
		if (idAviso != null) {
			Avisos aviso = new Avisos();
			aviso.setIdAviso20(idAviso);
			aviso = this.avisosService.find(aviso);
			aviso.setfProcesado20(new Date());
			this.avisosService.update(aviso);
		} else if (idLiquidaciones != null) {

			Liquidaciones liq = new Liquidaciones(idLiquidaciones);
			liq.setfInicioOficio00(UtilidadesFecha.getFechaSistema());
			this.liquidacionesService.notificadaPorInicioOficio(liq);

			expediente.setIdLiquidacion00(idLiquidaciones);
			this.expedientesService.updateIdLiquidacion(expediente);
		}

		if (!listaDocBorrar.isEmpty()) {
			for (String rutaBorrar : listaDocBorrar) {
				try {
					Ad74aPIFws.getInstance().deleteDocument(rutaBorrar);
				} catch (Ad74aWebserviceException e) {
					InicioOficioController.logger.error("Borrar documento de pif: " + rutaBorrar);
				}
			}

		}
		InicioOficioController.logger.info("[PUT] : BandejaPapel0 actualizado correctamente");
		return expediente;
	}

	@RequestMapping(value = "/addDocumentoOficio", method = RequestMethod.POST)
	public @ResponseBody List<Documento> addDocumentoOficio(@RequestBody MultipartFile documento,
			@RequestParam(value = "tipificar", required = false) String tipificar, String nombreTipificar,
			HttpServletRequest request) {
		// Tenemos que guardarlo en la sesión
//			convivientesInfSoci.setIdInfSocial82(idInfSocial82);
//			convivientesInfSociAux = this.convivientesInfSociService.add(convivientesInfSoci);
		// Lo primero que haremos sera subir el documento a pf
		String rutaPif = this.inicioOficioService.aportar(documento);

		HttpSession sesion = request.getSession();
		List<Documento> documentos = new ArrayList<Documento>();
		if (sesion.getAttribute(Constantes.VARCONTEXTO_OFICIO) != null) {
			documentos = (List<Documento>) sesion.getAttribute(Constantes.VARCONTEXTO_OFICIO);
		}

		// Creamos un id temporal para el conviviente
		Documento documentoAnadir = new Documento();
		documentoAnadir.setNombreDocumento(documento.getOriginalFilename());
		documentoAnadir.setIdDocumento(documentos.size() + 1);
		documentoAnadir.setRutaPif(rutaPif);
		documentoAnadir.setTipoDocumento(tipificar);
		documentoAnadir.setRoleID(tipificar.replaceAll("\"", ""));
		documentoAnadir.setTipoDocumentoDescEs(nombreTipificar.replaceAll("\"", ""));
		documentoAnadir.setTipoDocumentoDescEu(nombreTipificar.replaceAll("\"", ""));
		documentos.add(documentoAnadir);
		sesion.setAttribute(Constantes.VARCONTEXTO_OFICIO, documentos);
		InicioOficioController.logger.info("[POST] : ConvivientesInfSoci insertado correctamente en sesión");
		return documentos;

	}

	@RequestMapping(value = "/documentosOficio/{idAviso}/filter", method = RequestMethod.POST)
	public @ResponseBody TableResponseDto<Documento> documentosOficioFilter(HttpServletRequest request,
			@RequestJsonBody TableRequestDto tableRequestDto, @PathVariable Long idAviso) {
		// Tenemos que guardarlo en la sesión
//			convivientesInfSoci.setIdInfSocial82(idInfSocial82);
//			convivientesInfSociAux = this.convivientesInfSociService.add(convivientesInfSoci);

		HttpSession sesion = request.getSession();
		List<Documento> documentos = new ArrayList<Documento>();
		if (sesion.getAttribute(Constantes.VARCONTEXTO_OFICIO) != null) {
			documentos = (List<Documento>) sesion.getAttribute(Constantes.VARCONTEXTO_OFICIO);
		}
		if (idAviso != null && idAviso.compareTo(0L) != 0 && documentos.size() == 0) {
			List<DocuAvisos> DocuAvisos = new ArrayList<DocuAvisos>();
			DocuAvisos docuAviso = new DocuAvisos();
			docuAviso.setIdAviso70(idAviso);
			DocuAvisos = this.docuAvisosService.findAll(docuAviso, tableRequestDto);
			if (DocuAvisos.size() != 0) {
				for (int i = 0; i < DocuAvisos.size(); i++) {
					Documento docu = new Documento();
					MaestroTiposDoc tipodoc = new MaestroTiposDoc();
					tipodoc.setIdTipoDoc36(DocuAvisos.get(i).getIdTipoDoc70());
					tipodoc = this.maestroTipoDocService.find(tipodoc);
					docu.setIdDocumento(DocuAvisos.get(i).getIdDocAviso70().intValue());
					docu.setTipoDocumentoDescEs(DocuAvisos.get(i).getTipoDocumentoEs());
					docu.setTipoDocumentoDescEu(DocuAvisos.get(i).getTipoDocumentoEu());
					docu.setOidDocumento(DocuAvisos.get(i).getRuta70());
					docu.setRoleID(tipodoc.getRoleid36());
					docu.setVieneAvisos(true);
					docu.setNombreDocumento(DocuAvisos.get(i).getNombreDoc70());
					docu.setExtension(DocuAvisos.get(i).getExtension70());
					documentos.add(docu);
				}
			}
		}
		InicioOficioController.logger.info("[POST] : ConvivientesInfSoci insertado correctamente en sesión");
		Long recordNum = Long.valueOf(documentos.size());

		TableResponseDto<Documento> tableResponseDto = new TableResponseDto<Documento>(tableRequestDto, recordNum,
				documentos);

		return tableResponseDto;

	}

	@RequestMapping(value = "/documentosOficio/clear", method = RequestMethod.GET)
	public @ResponseBody ArrayList<Documento> documentosOficioFilter(HttpServletRequest request) {
		// limpiamos la sesion
		InicioOficioController.logger.info("[GET - View] : clear session");
		HttpSession sesion = request.getSession();
		sesion.setAttribute(Constantes.VARCONTEXTO_OFICIO, new ArrayList<Documento>());
		return new ArrayList<Documento>();

	}

	@RequestMapping(value = "/eliminarDocumento/{idDocumento}", method = RequestMethod.DELETE)
	@ResponseStatus(value = HttpStatus.OK)
	public @ResponseBody List<Documento> customDelete(@PathVariable int idDocumento, HttpServletRequest request) {

		// Tenemos que borrarlo de la sesión

		HttpSession sesion = request.getSession();
		List<Documento> documentos = new ArrayList<Documento>();
		if (sesion.getAttribute(Constantes.VARCONTEXTO_OFICIO) != null) {
			documentos = (List<Documento>) sesion.getAttribute(Constantes.VARCONTEXTO_OFICIO);
		}

		// Buscar el conviviente a borrar
		for (int i = 0; i < documentos.size(); i++) {

			if (documentos.get(i).getIdDocumento() == idDocumento) {
				documentos.remove(i);
				break;
			}
		}

		sesion.setAttribute(Constantes.VARCONTEXTO_CONVIVIENTES, documentos);
		InicioOficioController.logger.info("[POST] : ConvivientesInfSoci borrado correctamente de sesión");

		return documentos;
	}

	@RequestMapping(value = "/obtenerDatosBeneficiario/{dni}", method = RequestMethod.POST)
	public @ResponseBody Solicitantes obtenerDatosBeneficiario(@PathVariable String dni) {
		Solicitantes solicitantes = new Solicitantes();
		solicitantes.setIdentificador01(dni);
		solicitantes.setExpSolicitud(new Expedientes());
		solicitantes.getExpSolicitud().setIdProcedimiento00(ProcedimientosEnum.ALTA.getId());
		TableRequestDto tableRequestDto = new TableRequestDto();
		tableRequestDto.setSidx("BENEFICIARIO01 , FBAJA01");
		tableRequestDto.setSord("DESC NULLS LAST , DESC");
		List<Solicitantes> listaSolicitantes = this.solicitantesService.obtenerDatosBeneficiario(solicitantes,
				tableRequestDto, false);

		// TODO: obtener los datos del último expediente
		// Puede existir un dni con 2 entradas en solicitantes que hayan sido
		// beneficiarios si uno de ellos está de baja
//		if (!listaSolicitantes.isEmpty() && listaSolicitantes.size() == 1) {
		if (!listaSolicitantes.isEmpty()) {
			solicitantes = listaSolicitantes.get(0);
			Expedientes expediente = new Expedientes();
			expediente.setSolicitantes(solicitantes);
			expediente = this.expedientesService.findBeneficiarioUltimoExp(expediente);
			solicitantes.setUltimoExpediente(expediente);
			return solicitantes;
		}

		return new Solicitantes();

//		return !listaSolicitantes.isEmpty() && listaSolicitantes.size() == 1 ? listaSolicitantes.get(0)
//				: new Solicitantes();

	}

	@RequestMapping(value = "/downloadDocumento", method = RequestMethod.GET)
	public void downloadDocument(@RequestParam(required = true) boolean esOid,
			@RequestParam(required = true) String enlaceCodigo, @RequestParam(required = true) String nombreDoc,
			HttpServletResponse response) throws IOException, Ad74aWebserviceException {
		String rutaPif = "";
		String contentType = "";
		if (esOid) {
			try {

				rutaPif = this.appConfiguration.getProperty("webservice.dokusi.pif.dir");
				W43DfDocument docPid = pidWS.get(enlaceCodigo, rutaPif);
				rutaPif = docPid.getContent().getPath();
				contentType = docPid.getContent().getFormat().getMimeType();
			} catch (Exception e) {
				ManagerErrors.manageException(e, "Error al descargar el documento");
			}
		} else if (Utilidades.esBlancoNulo(enlaceCodigo)) {
			ManagerErrors.manageError("No se puede descargar el documento");
		} else {
			rutaPif = enlaceCodigo;
		}
		InicioOficioController.logger.info(
				"InicioOficioController.downloadDocument - Ad74aPIFws.getInstance().downloadDocument path = {}",
				rutaPif);
		InputStream inputStream = Ad74aPIFws.getInstance().downloadDocument(rutaPif);
		UtilWeb.downloadFile(nombreDoc, contentType, 0, inputStream, response, "");

	}

	@RequestMapping(value = "/obtenerDatosLiquidacion/{referencia}", method = RequestMethod.POST)
	public @ResponseBody Liquidaciones obtenerDatosLiquidacion(@PathVariable String referencia) {

		Liquidaciones liquidaciones = new Liquidaciones();
		liquidaciones.setReferenciaLiq00(referencia);
		List<Liquidaciones> listaLiquidaciones = this.liquidacionesService.findAllLike(liquidaciones, null, false);

		return !listaLiquidaciones.isEmpty() && listaLiquidaciones.size() == 1 ? listaLiquidaciones.get(0)
				: new Liquidaciones();
	}

	@RequestMapping(value = "/obtenerLiquidacionesSolicitante/{dni}", method = RequestMethod.POST)
	public @ResponseBody List<Liquidaciones> obtenerLiquidacionesTercero(HttpServletRequest request,
			@PathVariable String dni) {

		Liquidaciones liquidaciones = new Liquidaciones();
		liquidaciones.setTercero00(dni);
		liquidaciones.setEstadoLiq00(new Long(1));// PENDIENTE_COBRO
		liquidaciones.setTiposIngreso(new TiposIngreso(new Long(1)));// EN_FIRME
		liquidaciones.setfInicioOficio00(null);// Sin fecha de inicio de oficio
		List<Liquidaciones> listaLiquidaciones = this.liquidacionesService.findAll(liquidaciones, null);
		HttpSession sesion = request.getSession();
		sesion.setAttribute("DNI_liquidaciones", dni);
		return listaLiquidaciones;
	}

	@RequestMapping(value = "/liquidaciones/filter", method = RequestMethod.POST)
	public @ResponseBody TableResponseDto<Liquidaciones> liquidacionesFilter(HttpServletRequest request,
			@RequestJsonBody TableRequestDto tableRequestDto) {

		Liquidaciones liquidaciones = new Liquidaciones();
		List<Liquidaciones> listaLiquidaciones = new ArrayList<Liquidaciones>();

		HttpSession sesion = request.getSession();
		String dni = (String) sesion.getAttribute("DNI_liquidaciones");
		if (dni != null)
			liquidaciones.setTercero00(dni);
		System.out.println("DNI_liquidaciones::" + dni);
		liquidaciones.setEstadoLiq00(new Long(1));// PENDIENTE_COBRO
		liquidaciones.setTiposIngreso(new TiposIngreso(new Long(1)));// EN_FIRME
		liquidaciones.setfInicioOficio00(null);// Sin fecha de inicio de oficio
		listaLiquidaciones = this.liquidacionesService.findAll(liquidaciones, tableRequestDto);

		Long recordNum = Long.valueOf(listaLiquidaciones.size());
		TableResponseDto<Liquidaciones> tableResponseDto = new TableResponseDto<Liquidaciones>(tableRequestDto,
				recordNum, listaLiquidaciones);

		// return tableResponseDto;
		return this.liquidacionesService.filter(liquidaciones, tableRequestDto, false);
	}

	@RequestMapping(value = "/liquidaciones/clear", method = RequestMethod.GET)
	public @ResponseBody ArrayList<Liquidaciones> liquidaciones(HttpServletRequest request) {
		// limpiamos la sesion
		InicioOficioController.logger.info("[GET - View] : clear session");
		HttpSession sesion = request.getSession();
		sesion.setAttribute(Constantes.VARCONTEXTO_OFICIO, new ArrayList<Liquidaciones>());
		return new ArrayList<Liquidaciones>();

	}
}
