package com.ejie.ab79.control.propuestaSancion;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import javax.servlet.http.HttpServletResponse;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.SessionAttributes;

import com.ejie.ab79.clientesWS.ab59WebService.Ab59Exception;
import com.ejie.ab79.clientesWS.ab59WebService.ArticuloInfringidoWS;
import com.ejie.ab79.clientesWS.ab59WebService.DerechosInfringidosWS;
import com.ejie.ab79.clientesWS.ab59WebService.DocumentosWS;
import com.ejie.ab79.clientesWS.ab59WebService.PropuestaSancionIdentificadoresWS;
import com.ejie.ab79.clientesWS.ab59WebService.PropuestaSancionWS;
import com.ejie.ab79.clientesWS.ab61WebService.Usuario;
import com.ejie.ab79.comun.Constantes;
import com.ejie.ab79.model.DatosEstablecimiento;
import com.ejie.ab79.model.RelEstIns;
import com.ejie.ab79.model.expedientes.Expedientes;
import com.ejie.ab79.model.inspecciones.Inspecciones;
import com.ejie.ab79.model.procedimientos.Aplicaciones;
import com.ejie.ab79.model.procedimientos.Procedimientos;
import com.ejie.ab79.model.propuestaSancion.Derechos;
import com.ejie.ab79.model.propuestaSancion.DerechosPropuesta;
import com.ejie.ab79.model.propuestaSancion.DocumentosInspeccion;
import com.ejie.ab79.model.propuestaSancion.DocumentosPropuesta;
import com.ejie.ab79.model.propuestaSancion.EstadosProSan;
import com.ejie.ab79.model.propuestaSancion.Infracciones;
import com.ejie.ab79.model.propuestaSancion.InfraccionesPropuesta;
import com.ejie.ab79.model.propuestaSancion.PropuestaSancion;
import com.ejie.ab79.service.DatosEstablecimientoService;
import com.ejie.ab79.service.DocumentosInspeccionService;
import com.ejie.ab79.service.RelEstInsService;
import com.ejie.ab79.service.expedientes.ExpedientesService;
import com.ejie.ab79.service.inspecciones.InspeccionesService;
import com.ejie.ab79.service.procedimientos.ProcedimientosService;
import com.ejie.ab79.service.propuestaSancion.DerechosService;
import com.ejie.ab79.service.propuestaSancion.InfraccionesService;
import com.ejie.ab79.service.propuestaSancion.PropuestaSancionService;
import com.ejie.ab79.webservice.adaptadores.PIFAdaptador;
import com.ejie.ab79.webservice.adaptadores.ab59WebServiceAdaptador;
import com.ejie.ab79.webservice.adaptadores.ab61WebServiceAdaptador;

/**
 * 
 * PropuestaSancionController
 * 
 *  
 *
 */

@Controller
@SessionAttributes("usuario")
@RequestMapping(value = "propuestaSancion")
public class PropuestaSancionController {

	private static final Logger logger = LoggerFactory.getLogger(PropuestaSancionController.class);
	@Autowired
	private ExpedientesService expedientesService;
	@Autowired
	private InspeccionesService inspeccionesService;
	@Autowired
	private PropuestaSancionService propuestaService;
	@Autowired
	private InfraccionesService infraccionesService;
	@Autowired
	private DerechosService derechosService;
	@Autowired
	private DatosEstablecimientoService datosEstablecimientoService;
	@Autowired
	private PropuestaSancionInfraccionesController propuestaInfraccionesController;
	@Autowired
	private PropuestaSancionDerechosController propuestaDerechosController;
	@Autowired
	private PropuestaSancionDocumentosController propuestaDocumentosController;
	@Autowired
	private ab59WebServiceAdaptador ab59WebServiceAdaptadorService;
	@Autowired
	private RelEstInsService relEstInsService;
	@Autowired
	private ProcedimientosService procedimientosService;
	@Autowired
	private DocumentosInspeccionService documentosInspeccionService;
	@Autowired
	private ab61WebServiceAdaptador ab61WebServiceAdaptadorService;
	@Autowired
	private PIFAdaptador pifAdapterService;

	/**
	 * Metodo que devuelve la vista modal para crear una propuesta de sancion
	 * desde AB79
	 * 
	 * @param idExpediente
	 *            int
	 * @param conExpediente
	 *            String
	 * @param idInspeccion
	 *            int
	 * @param model
	 *            Model
	 * 
	 * @return String
	 */
	@RequestMapping(value = "/generarPropuestaSancion/{idExpediente}/{idInspeccion}", method = RequestMethod.GET)
	public String generarPropuestaSancion(@PathVariable int idExpediente, String conExpediente,
			@PathVariable int idInspeccion, Model model, @ModelAttribute(value = "usuario") Usuario usuario) {
		PropuestaSancionController.logger.info("GET - View : generarPropuestaSancion");
		Expedientes expedientes = new Expedientes();

		if (String.valueOf(idExpediente) != null && String.valueOf(idExpediente) != "") {
			expedientes.setIdExpediente(idExpediente);
			expedientes = expedientesService.find(expedientes);
		}
		PropuestaSancion propuestaInsertada = this.insertarPropuesta(idInspeccion, usuario);

		model.addAttribute("titulo", expedientes.getTitulo());
		model.addAttribute("folderNumber", expedientes.getFolderNumber());
		model.addAttribute("idPropuestaGenerada", propuestaInsertada.getIdPropuestaSancion());
		return "propuestaSancion";
	}// generarPropuesta

	/**
	 * 
	 * @param idInspeccion
	 *            int
	 * @param model
	 *            Model
	 * 
	 * @return String
	 */
	@RequestMapping(value = "/generarPropuestaSancionSinExpediente/{idInspeccion}", method = RequestMethod.GET)
	public String generarPropuestaSancionSinExpediente(@PathVariable int idInspeccion, Model model,
			@ModelAttribute(value = "usuario") Usuario usuario) {

		PropuestaSancionController.logger.info("GET - View : generarPropuestaSancion");
		PropuestaSancion propuestaInsertada = this.insertarPropuesta(idInspeccion, usuario);
		Inspecciones inspecciones = new Inspecciones();
		inspecciones.setIdInspeccion(idInspeccion);
		inspecciones = inspeccionesService.find(inspecciones);

		RelEstIns relEstIns = this.relEstInsService.findByInspeccion(inspecciones);

		model.addAttribute("titulo", relEstIns.getTitulo());
		model.addAttribute("inspeccion", inspecciones.getIdentificadorInspeccion());
		model.addAttribute("idPropuestaGenerada", propuestaInsertada.getIdPropuestaSancion());
		return "propuestaSancion";

	}// generarPropuesta sin expediente

	/**
	 * 
	 * @param idPropuesta
	 *            int
	 * @param idInspeccion
	 *            int
	 * @param model
	 *            Model
	 * 
	 * @return String
	 */
	@RequestMapping(value = "/editarPropuesta/{idPropuesta}/{idInspeccion}", method = RequestMethod.GET)
	public String editarPropuesta(@PathVariable int idPropuesta, @PathVariable int idInspeccion, Model model) {

		Inspecciones inspecciones = new Inspecciones();
		inspecciones.setIdInspeccion(idInspeccion);
		inspecciones = inspeccionesService.find(inspecciones);
		String titulo = "";

		Expedientes expediente = this.expedientesService.find(inspecciones.getExpediente());
		if (expediente != null) {
			titulo = expediente.getTitulo();
			model.addAttribute("folderNumber", expediente.getFolderNumber());
		} else {
			RelEstIns relEstIns = this.relEstInsService.findByInspeccion(inspecciones);
			titulo = relEstIns.getTitulo();
			model.addAttribute("inspeccion", inspecciones.getIdentificadorInspeccion());
		}

		PropuestaSancion propuestaFilter = new PropuestaSancion();
		propuestaFilter.setIdPropuestaSancion(idPropuesta);
		PropuestaSancion propuestaReturn = this.propuestaService.find(propuestaFilter);

		EstadosProSan estadoPropuesta = this.propuestaService
				.findEstadoPropuesta(propuestaReturn.getIdPropuestaSancionRemoto());

		model.addAttribute("titulo", titulo);
		model.addAttribute("notas", propuestaReturn.getNotas());
		if (estadoPropuesta != null) {
			model.addAttribute("descEstadoPropuesta", estadoPropuesta.getDescripcion());
		}

		model.addAttribute("idPropuestaSancion", propuestaReturn.getIdentificadorProSanDesc());

		return "propuestaSancion";
	}

	/**
	 * 
	 * @param notas
	 *            String
	 * @param idInspeccion
	 *            int
	 * @param docSelected
	 *            String[]
	 * 
	 * @throws Ab59Exception
	 * @throws DatatypeConfigurationException
	 */
	@RequestMapping(value = "/modificarPropuesta/{idInspeccion}", method = RequestMethod.POST)
	public @ResponseBody PropuestaSancion actualizarPropuesta(@PathVariable int idInspeccion,
			@RequestBody PropuestaSancion propuestaSancion, @ModelAttribute("usuario") Usuario usuario)
			throws Ab59Exception, DatatypeConfigurationException {

		PropuestaSancion propuesta = new PropuestaSancion();
		Integer idTercero = null;
		Integer idDireccion = null;

		try {

			propuesta.setIdPropuestaSancion(this.getIdPropuesta(idInspeccion));

			Inspecciones inspeccion = new Inspecciones();
			inspeccion.setIdInspeccion(idInspeccion);
			inspeccion = this.inspeccionesService.find(inspeccion);

			propuesta = this.propuestaService.find(propuesta);

			if (Constantes.NULL_STRING.equals(propuestaSancion.getNotas())) {
				propuesta.setNotas(null);
			} else {
				propuesta.setNotas(propuestaSancion.getNotas());
			}

			Expedientes expediente = this.getExpedienteByInspeccion(inspeccion);
			// actualizamos la base de datos de ab79
			this.propuestaService.modificarPropuesta(propuesta);

			// cuando modificamos le pasamos el id de propuesta remoto para que
			// lo
			// actualice el webservice en ab59
			PropuestaSancionWS propuestaWS = this.rellenarPropuestaWs(propuesta, inspeccion, expediente,
					propuestaSancion.getDocumentos(), propuestaSancion.getDocumentosInspeccion());

			if (null == expediente) {
				RelEstIns relEstIns = this.relEstInsService.findByInspeccion(inspeccion);
				idTercero = relEstIns.getIdTercero();
				idDireccion = relEstIns.getIdDireccion();
			}

			this.ab59WebServiceAdaptadorService.modificarPropuestaSancion(propuestaWS, usuario.getUsuario(), idTercero,
					idDireccion);
			this.propuestaDocumentosController.updateEnviados(propuestaSancion.getDocumentos(), idInspeccion);
			this.documentosInspeccionService.removeByIdInspeccion(idInspeccion);
			for (DocumentosInspeccion documentoInspeccion : propuestaSancion.getDocumentosInspeccion()) {
				documentoInspeccion.setIdInspeccion(idInspeccion);
				documentoInspeccion.setUsuarioRegistro(usuario.getUsuario());
				this.documentosInspeccionService.add(documentoInspeccion);
			}

		} catch (Exception e) {
			PropuestaSancionController.logger.error(e.getMessage(), e);
			propuesta = null;
		}

		return propuesta;

	}

	/**
	 * 
	 * @param notas
	 *            String
	 * @param idInspeccion
	 *            int
	 * @param docSelected
	 *            String[]
	 * 
	 * @return PropuestaSancion
	 * 
	 * @throws Ab59Exception
	 * @throws DatatypeConfigurationException
	 */
	@RequestMapping(value = "/enviarPropuesta/{idInspeccion}", method = RequestMethod.POST)
	public @ResponseBody PropuestaSancion enviarPropuesta(@PathVariable int idInspeccion,
			@RequestBody PropuestaSancion propuestaSancion, @ModelAttribute("usuario") Usuario usuario)
			throws Ab59Exception, DatatypeConfigurationException {

		PropuestaSancion propuesta = new PropuestaSancion();
		Integer idTercero = null;
		Integer idDireccion = null;

		try {
			Inspecciones inspecciones = new Inspecciones();
			inspecciones.setIdInspeccion(idInspeccion);
			inspecciones = inspeccionesService.find(inspecciones);

			Expedientes expedientes = this.getExpedienteByInspeccion(inspecciones);

			int idPropuesta = this.getIdPropuesta(idInspeccion);

			propuesta.setIdPropuestaSancion(idPropuesta);
			propuesta = propuestaService.find(propuesta);

			if (Constantes.NULL_STRING.equals(propuestaSancion.getNotas())) {
				propuesta.setNotas(null);
			} else {
				propuesta.setNotas(propuestaSancion.getNotas());
			}

			PropuestaSancionWS propuestaWS = rellenarPropuestaWs(propuesta, inspecciones, expedientes,
					propuestaSancion.getDocumentos(), propuestaSancion.getDocumentosInspeccion());

			if (null == expedientes) {
				RelEstIns relEstIns = this.relEstInsService.findByInspeccion(inspecciones);
				idTercero = relEstIns.getIdTercero();
				idDireccion = relEstIns.getIdDireccion();
			}

			// Introducimos la propuesta en ab59 y recuperamos el id de la
			// propuesta en ab59
			PropuestaSancionIdentificadoresWS identificadores = ab59WebServiceAdaptadorService.crearPropuestaSancion(
					propuestaWS, usuario.getUsuario(), inspecciones.getIdOrigenInspeccion(), idTercero, idDireccion);
			propuesta.setIdPropuestaSancionRemoto(identificadores.getIdPropuestaSancion());
			propuesta.setIdentificadorProSanDesc(identificadores.getIdentificadorProSan());

			// modificamos los datos en ab79
			this.propuestaService.modificarPropuesta(propuesta);
			this.propuestaDocumentosController.updateEnviados(propuestaSancion.getDocumentos(), idInspeccion);
			for (DocumentosInspeccion documentoInspeccion : propuestaSancion.getDocumentosInspeccion()) {
				documentoInspeccion.setIdInspeccion(idInspeccion);
				documentoInspeccion.setUsuarioRegistro(usuario.getUsuario());
				this.documentosInspeccionService.add(documentoInspeccion);
			}

		} catch (Exception e) {
			PropuestaSancionController.logger.error(e.getMessage(), e);
			propuesta = null;
		}
		return propuesta;
	}

	@RequestMapping(value = "/guardarPropuesta/{notas}/{idInspeccion}", method = RequestMethod.GET)
	public @ResponseBody PropuestaSancion guardarPropuesta(@PathVariable String notas, @PathVariable int idInspeccion,
			@ModelAttribute("usuario") Usuario usuario) throws Ab59Exception, DatatypeConfigurationException {

		PropuestaSancion propuestaSancion = new PropuestaSancion();

		try {
			int idPropuesta = this.getIdPropuesta(idInspeccion);

			propuestaSancion.setIdPropuestaSancion(idPropuesta);
			propuestaSancion = propuestaService.find(propuestaSancion);

			if (Constantes.NULL_STRING.equals(notas)) {
				propuestaSancion.setNotas(null);
			} else {
				propuestaSancion.setNotas(notas);
			}

			propuestaSancion.setUsuarioUltmodificacion(usuario.getUsuario());
			// modificamos los datos en ab79
			this.propuestaService.modificarPropuesta(propuestaSancion);
		} catch (Exception e) {
			PropuestaSancionController.logger.error(e.getMessage(), e);
			propuestaSancion = null;
		}
		return propuestaSancion;
	}

	/**
	 * 
	 * @param idInspeccion
	 *            int
	 * 
	 * @return int
	 */
	@RequestMapping(value = "/obtenerIdPropuesta/{idInspeccion}", method = RequestMethod.GET)
	public int obtenerPropuesta(@PathVariable int idInspeccion) {
		return this.getIdPropuesta(idInspeccion);
	}

	/**
	 * 
	 * @param idPropuesta
	 *            int
	 * 
	 */
	@RequestMapping(value = "/cancelarPropuesta/{idInspeccion}", method = RequestMethod.GET)
	public @ResponseBody void cancelarPropuesta(@PathVariable int idInspeccion,
			@ModelAttribute(value = "usuario") Usuario usuario) {

		PropuestaSancion propuesta = new PropuestaSancion();
		propuesta.setIdPropuestaSancion(this.getIdPropuesta(idInspeccion));
		propuesta.setUsuarioRegistro(usuario.getUsuario());

		this.propuestaService.deletePropuesta(propuesta);

	}

	@RequestMapping(value = "/obtenerDireccion/{idExpediente}", method = RequestMethod.GET)
	public @ResponseBody Integer obtenerDireccion(@PathVariable int idExpediente) {

		Expedientes expediente = new Expedientes();
		expediente.setIdExpediente(idExpediente);
		expediente = this.expedientesService.findByExpedienteIdExpediente(expediente);

		return expediente.getProcedimientos().getDirecciones().getIdDireccion();
	}

	/**
	 * 
	 * @param filterInfracciones
	 *            Infracciones
	 * 
	 * @return List<Infracciones>
	 */
	@RequestMapping(value = "/cargaComboProcedimientos", method = RequestMethod.GET)
	public @ResponseBody List<Procedimientos> cargaComboProcedimientos(
			@ModelAttribute Procedimientos filterProcedimientos) {
		PropuestaSancionController.logger.info("GET - find_ALL] : Obtener Procedimientos por filtro");

		Aplicaciones aplicacion = new Aplicaciones();
		aplicacion.setCodAplicacion(Constantes.AB79);
		filterProcedimientos.setAplicacion(aplicacion);

		return this.procedimientosService.findAll(filterProcedimientos, null);

	}

	@RequestMapping(value = "/cargaComboInfraccion", method = RequestMethod.GET)
	public @ResponseBody List<Infracciones> cargaComboInfraccion(@ModelAttribute Infracciones filterInfracciones) {
		String codProcedureId;
		if (Constantes.ID_TURISMO_DIRECCION == filterInfracciones.getIdDireccion()) {
			codProcedureId = Constantes.PROCEDURE_ID_SANCIONES_TURISMO;
		} else {
			codProcedureId = Constantes.PROCEDURE_ID_SANCIONES_COMERCIO;
		}
		Procedimientos procedimiento = this.procedimientosService.findByProcedureId(codProcedureId);
		filterInfracciones.setProcedimiento(procedimiento);
		PropuestaSancionController.logger.info("GET - find_ALL] : Obtener Infracciones por filtro");
		return this.infraccionesService.cargarCombo(filterInfracciones);
	}

	/**
	 * 
	 * @param filterInfracciones
	 *            Infracciones
	 * 
	 * @return List<Infracciones>
	 */
	@RequestMapping(value = "/cargaComboInfraccionSinExpediente", method = RequestMethod.GET)
	public @ResponseBody List<Infracciones> cargaComboInfraccionSinExpediente(Integer idProcedimiento) {
		Procedimientos procedimiento = new Procedimientos(idProcedimiento);
		Infracciones filterInfracciones = new Infracciones();
		filterInfracciones.setProcedimiento(procedimiento);
		PropuestaSancionController.logger.info("GET - find_ALL] : Obtener Infracciones por filtro");
		return this.infraccionesService.cargarCombo(filterInfracciones);
	}

	/**
	 * 
	 * @param idInfraccion
	 *            Integer
	 * 
	 * @return List<Derechos>
	 */
	@RequestMapping(value = "/cargaComboDerechos", method = RequestMethod.GET)
	public @ResponseBody List<Derechos> cargaComboDerechos(Integer idInfraccion) {

		Infracciones infracciones = new Infracciones();
		infracciones.setIdInfraccion(idInfraccion);
		Derechos filterDerechos = new Derechos();
		filterDerechos.setInfraccion(infracciones);

		PropuestaSancionController.logger.info("GET - find_ALL] : Obtener Derechos por filtro");
		return this.derechosService.cargarCombo(filterDerechos);
	}

	/**
	 * 
	 * @param idInspeccion
	 *            int
	 * 
	 * @return int
	 */
	@RequestMapping(value = "/comprobarInspeccion/{idInspeccion}", method = RequestMethod.GET)
	public @ResponseBody int comprobarInspeccion(@PathVariable int idInspeccion) {
		int idPropuesta = -1;
		PropuestaSancion filterPropuesta = new PropuestaSancion();
		filterPropuesta.setIdInspeccion(idInspeccion);

		List<PropuestaSancion> propuestaAux = this.propuestaService.findAll(filterPropuesta);
		if (propuestaAux.size() == 1) {
			idPropuesta = propuestaAux.get(0).getIdPropuestaSancion();
		}
		return idPropuesta;
	}

	/**
	 * 
	 * @param idInspeccion
	 *            int
	 * 
	 * @return int
	 */
	@RequestMapping(value = "/comprobarPropuestaSancionRemoto/{idInspeccion}", method = RequestMethod.GET)
	public @ResponseBody int comprobarPropuestaSancionRemoto(@PathVariable int idInspeccion) {
		int idPropuestaSancionRemoto = -1;
		PropuestaSancion filterPropuesta = new PropuestaSancion();
		filterPropuesta.setIdInspeccion(idInspeccion);

		List<PropuestaSancion> propuestaAux = this.propuestaService.findAll(filterPropuesta);
		if (propuestaAux.size() == 1) {
			idPropuestaSancionRemoto = propuestaAux.get(0).getIdPropuestaSancionRemoto();
		}
		return idPropuestaSancionRemoto;
	}

	/**
	 * 
	 * @param propuestaSancion
	 *            PropuestaSancion
	 * @param inspecciones
	 * @param expedientes
	 *            Expedientes
	 * @param docSelected
	 *            String[]
	 * 
	 * @return PropuestaSancionWS
	 * 
	 * @throws DatatypeConfigurationException
	 */
	private PropuestaSancionWS rellenarPropuestaWs(PropuestaSancion propuestaSancion, Inspecciones inspecciones,
			Expedientes expedientes, int[] docSelected, List<DocumentosInspeccion> documentosInspeccion)
			throws DatatypeConfigurationException {

		DatosEstablecimiento establecimiento = this.datosEstablecimientoService.findByInspeccion(inspecciones);

		PropuestaSancionWS propuestaWS = new PropuestaSancionWS();
		InfraccionesPropuesta filterInfracciones = new InfraccionesPropuesta();
		DerechosPropuesta filterDerecho = new DerechosPropuesta();

		filterInfracciones.setIdPropuestaSancion(propuestaSancion.getIdPropuestaSancion());
		List<InfraccionesPropuesta> listaInfracciones = propuestaInfraccionesController.getAll(filterInfracciones,
				null);
		List<ArticuloInfringidoWS> listaArticulos = new ArrayList<ArticuloInfringidoWS>();

		for (InfraccionesPropuesta infraccion : listaInfracciones) {
			ArticuloInfringidoWS articuloAux = new ArticuloInfringidoWS();
			articuloAux.setDescripcionHecho(infraccion.getDescripcionHecho());
			articuloAux.setFechaHecho(this.convertirFecha(infraccion.getFechaHecho()));
			articuloAux.setIdTipoInfraccion(infraccion.getIdInfraccion());
			articuloAux.setNotasArticulo(infraccion.getNotas());
			filterDerecho.setIdDerInfraccion(infraccion.getIdRelArtInfProSan());
			List<DerechosInfringidosWS> listaDerechosWS = new ArrayList<DerechosInfringidosWS>();
			List<DerechosPropuesta> listaDerechos = propuestaDerechosController.getAll(filterDerecho, null);
			for (DerechosPropuesta derechos : listaDerechos) {
				DerechosInfringidosWS derechoWS = new DerechosInfringidosWS();
				derechoWS.setIdDerechoInfringido(derechos.getIdDerecho());
				listaDerechosWS.add(derechoWS);

			}
			for (int i = 0; i < listaDerechosWS.size(); i++) {

				articuloAux.getDerechosInfringidosWS().add(listaDerechosWS.get(i));
			}
			listaArticulos.add(articuloAux);
		}

		List<DocumentosWS> listaDocumentosWS = new ArrayList<DocumentosWS>();
		DocumentosPropuesta filterDocumentos = new DocumentosPropuesta();
		filterDocumentos.setIdInspeccion(inspecciones.getIdInspeccion());

		if (docSelected != null) {
			List<DocumentosPropuesta> listaDocumentosPropuesta = propuestaDocumentosController.getAll(filterDocumentos);
			for (DocumentosPropuesta documento : listaDocumentosPropuesta) {
				// comprobamos que el documento esta seleccionado
				if (ArrayUtils.contains(docSelected, documento.getIdRelActDoc())) {
					DocumentosWS documentoWS = new DocumentosWS();
					documentoWS.setNombreDocumento(documento.getNombreDocumento());
					documentoWS.setOidDokusi(documento.getDokusi());
					documentoWS.setOidPID(documento.getPid());
					documentoWS.setTipoDocumento(documento.getPlantilla().getIdPlantilla());
					listaDocumentosWS.add(documentoWS);
				}
			}
		}

		if (documentosInspeccion != null) {
			for (DocumentosInspeccion documentoInspeccion : documentosInspeccion) {
				DocumentosWS documentoWS = new DocumentosWS();
				documentoWS.setNombreDocumento(documentoInspeccion.getNombreDocumento());
				documentoWS.setOidDokusi(documentoInspeccion.getOidDokusi());
				documentoWS.setDescTipoDocumento(documentoInspeccion.getTipoDocumento());
				listaDocumentosWS.add(documentoWS);
			}
		}
		propuestaWS.setIdPropuestaSancion(propuestaSancion.getIdPropuestaSancionRemoto());
		if (null != expedientes) {
			propuestaWS.setFolderId(expedientes.getFolderId());
		}

		propuestaWS.setIdentificadorInspeccion(inspecciones.getIdentificadorInspeccion());
		propuestaWS.setNotasResponsableOficina(propuestaSancion.getNotas());
		propuestaWS.setIdTipoActividad(establecimiento.getIdTipoEstablecimiento());// id_tipo_establecimiento

		for (int i = 0; i < listaArticulos.size(); i++) {
			propuestaWS.getArticulosInfringidosWS().add(listaArticulos.get(i));
		}
		for (int i = 0; i < listaDocumentosWS.size(); i++) {
			propuestaWS.getDocumentosWS().add(listaDocumentosWS.get(i));
		}
		return propuestaWS;
	}

	/**
	 * 
	 * @param inspeccion
	 *            Inspecciones
	 * 
	 * @return Expedientes
	 */
	private Expedientes getExpedienteByInspeccion(Inspecciones inspeccion) {
		Expedientes expedientes = new Expedientes();
		expedientes.setInspeccion(inspeccion);
		return expedientesService.findByIdInspeccion(expedientes);

	}

	/**
	 * 
	 * @param idInspeccion
	 *            int
	 * 
	 * @return int
	 */
	private int getIdPropuesta(int idInspeccion) {
		int id = -1;
		PropuestaSancion propuestaAux = new PropuestaSancion();
		propuestaAux.setIdInspeccion(idInspeccion);
		List<PropuestaSancion> listaPropuestaSancion = this.propuestaService.findAll(propuestaAux);
		if (listaPropuestaSancion.size() == 1) {
			id = listaPropuestaSancion.get(0).getIdPropuestaSancion();
		}
		return id;
	}

	/**
	 * convierte una fecha en formato Date a XMLGregorianCalendar para el
	 * webservice
	 * 
	 * @param fecha
	 * @throws DatatypeConfigurationException
	 */
	private XMLGregorianCalendar convertirFecha(Date fecha) throws DatatypeConfigurationException {
		GregorianCalendar calendar = new GregorianCalendar();
		calendar.setTime(fecha);
		return DatatypeFactory.newInstance().newXMLGregorianCalendar(calendar);

	}

	/**
	 * Inserta la propuesta en ab79
	 * 
	 * @param idInspeccion
	 *            Integer
	 * 
	 * @return PropuestaSancion
	 */
	private PropuestaSancion insertarPropuesta(Integer idInspeccion, Usuario usuario) {
		PropuestaSancion propuestaSancion = new PropuestaSancion();
		propuestaSancion.setIdInspeccion(idInspeccion);
		propuestaSancion.setUsuarioRegistro(usuario.getUsuario());

		return this.propuestaService.addPropuesta(propuestaSancion);
	}

	/**
	 * 
	 * @param idPropuesta
	 *            Integer
	 * 
	 * @return boolean
	 * 
	 * @throws Ab59Exception
	 */
	@RequestMapping(value = "/eliminarPropuesta/{idPropuesta}", method = RequestMethod.GET)
	public void eliminarPropuesta(@PathVariable Integer idPropuesta, @ModelAttribute(value = "usuario") Usuario usuario)
			throws Ab59Exception, Exception {

		PropuestaSancion propuestaSancion = new PropuestaSancion();
		propuestaSancion.setIdPropuestaSancion(idPropuesta);
		propuestaSancion = this.propuestaService.find(propuestaSancion);
		if (propuestaSancion.getIdPropuestaSancionRemoto() > 0) {
			ab59WebServiceAdaptadorService.eliminarPropuestaSancion(propuestaSancion.getIdPropuestaSancionRemoto(),
					usuario.getUsuario());
		}
		int[] docSelected = {};

		this.propuestaDocumentosController.updateEnviados(docSelected, propuestaSancion.getIdInspeccion());
		this.documentosInspeccionService.removeByIdInspeccion(propuestaSancion.getIdInspeccion());
		this.propuestaService.deletePropuesta(propuestaSancion);
	}

	/**
	 * 
	 * @param idInspeccion
	 *            Integer
	 * 
	 * @return Integer
	 */
	@RequestMapping(value = "/comprobarEstadoPropuesta/{idInspeccion}", method = RequestMethod.GET)
	public @ResponseBody Integer comprobarEstadoPropuesta(@PathVariable int idInspeccion) {

		PropuestaSancion filterPropuesta = new PropuestaSancion();
		filterPropuesta.setIdInspeccion(idInspeccion);

		return this.propuestaService.comprobarEstadoPropuesta(idInspeccion);
	}

	/**
	 * Operacion CRUD Read. Devuelve el bean correspondiente al identificador
	 * indicado.
	 * 
	 * @param idInfraccion
	 *            Integer
	 * @return Infracciones Objeto correspondiente al identificador indicado.
	 */
	@RequestMapping(value = "infracciones/{idInfraccion}", method = RequestMethod.GET)
	public @ResponseBody Infracciones get(@PathVariable Integer idInfraccion) {
		Infracciones infracciones = new Infracciones();
		infracciones.setIdInfraccion(idInfraccion);
		infracciones = this.infraccionesService.find(infracciones);
		PropuestaSancionController.logger.info("[GET - findBy_PK] : Obtener Infracciones por PK");
		return infracciones;
	}

	@RequestMapping(value = "derechos/{idsDerechos}", method = RequestMethod.GET)
	public @ResponseBody List<Derechos> getDescripciones(@PathVariable List<Integer> idsDerechos) {
		String derechosString = idsDerechos.toString();
		if (derechosString != null) {
			derechosString = derechosString.substring(1, derechosString.length() - 1);
		}
		List<Derechos> derechos = this.derechosService.findDescripciones(derechosString);
		PropuestaSancionController.logger.info("[GET - findBy_PK] : Obtener Derechos por PK");
		return derechos;
	}

	@RequestMapping(value = "/descargaFichero/{oid}/{nombreDocumento:.+}/{origenOid}", method = RequestMethod.GET)
	public @ResponseBody void descargarDocumentoPid(@PathVariable String oid, @PathVariable String nombreDocumento,
			@PathVariable Integer origenOid, HttpServletResponse response) throws IOException {
		BufferedInputStream bIS = null;
		String pathPif = "";
		try {
			if (Constantes.ORIGEN_OID_DOKUSI.equals(origenOid)) {
				pathPif = this.ab61WebServiceAdaptadorService.descargarDocumentoDokusi(oid,
						Constantes.CODIGO_APLICACION, Constantes.TIPO_URL_PARCIAL);
			} else if (Constantes.ORIGEN_OID_PID.equals(origenOid)) {
				pathPif = this.ab61WebServiceAdaptadorService.descargarDocumentoPid(oid, Constantes.CODIGO_APLICACION,
						Constantes.TIPO_URL_PARCIAL);
			}

			if (!StringUtils.isEmpty(pathPif)) {
				response.setHeader("content-disposition", "attachment; filename=\"" + nombreDocumento + "\"");
				bIS = new BufferedInputStream(this.pifAdapterService.getFile(pathPif));
				IOUtils.copy(bIS, response.getOutputStream());
				response.flushBuffer();
			}
			PropuestaSancionController.logger.info("descargaFichero : " + pathPif);
		} catch (Exception e) {
			PropuestaSancionController.logger.error("descargaFichero - ERROR", e);
		} finally {
			if (bIS != null) {
				bIS.close();
			}
		}
	}

}// class