package com.ejie.ab79.service.serviciosWeb;

import java.util.Calendar;
import java.util.List;
import java.util.Locale;

import javax.annotation.Resource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.SessionAttributes;

import com.ejie.ab79.comun.Constantes;
import com.ejie.ab79.dao.inspecciones.EstadosInspeccionDao;
import com.ejie.ab79.exceptions.Ab79Exception;
import com.ejie.ab79.model.DatosEstablecimiento;
import com.ejie.ab79.model.RelDenIns;
import com.ejie.ab79.model.RelEstIns;
import com.ejie.ab79.model.actuaciones.Actuaciones;
import com.ejie.ab79.model.expedientes.DatosDirecciones;
import com.ejie.ab79.model.expedientes.DatosTerceros;
import com.ejie.ab79.model.expedientes.Expedientes;
import com.ejie.ab79.model.inspecciones.CampainasInspeccion;
import com.ejie.ab79.model.inspecciones.EstadosInspeccion;
import com.ejie.ab79.model.inspecciones.Inspecciones;
import com.ejie.ab79.model.inspecciones.OrigenesInspeccion;
import com.ejie.ab79.model.inspecciones.RelExpIns;
import com.ejie.ab79.model.inspecciones.ResultadosInspeccion;
import com.ejie.ab79.model.preguntasRespuestas.OpcionesPreExp;
import com.ejie.ab79.model.preguntasRespuestas.PreguntasExpediente;
import com.ejie.ab79.model.preguntasRespuestas.PreguntasProtocolo;
import com.ejie.ab79.model.procedimientos.Direcciones;
import com.ejie.ab79.model.procedimientos.Procedimientos;
import com.ejie.ab79.model.protocolos.Protocolos;
import com.ejie.ab79.model.servicioWeb.InspeccionWS;
import com.ejie.ab79.model.servicioWeb.PreguntasExpedienteWS;
import com.ejie.ab79.service.DatosEstablecimientoService;
import com.ejie.ab79.service.RelDenInsService;
import com.ejie.ab79.service.RelEstInsService;
import com.ejie.ab79.service.actuaciones.ActuacionesService;
import com.ejie.ab79.service.expedientes.DatosDireccionesService;
import com.ejie.ab79.service.expedientes.DatosTercerosService;
import com.ejie.ab79.service.expedientes.ExpedientesService;
import com.ejie.ab79.service.inspecciones.InspeccionesService;
import com.ejie.ab79.service.inspecciones.OrigenesInspeccionService;
import com.ejie.ab79.service.inspecciones.RelExpInsService;
import com.ejie.ab79.service.preguntasRespuestas.OpcionesPreExpService;
import com.ejie.ab79.service.preguntasRespuestas.PreguntasExpedienteService;
import com.ejie.ab79.service.preguntasRespuestas.PreguntasProtocoloService;
import com.ejie.ab79.service.preguntasRespuestas.RespuestasProtocoloService;
import com.ejie.ab79.service.procedimientos.ProcedimientosService;
import com.ejie.ab79.service.protocolos.ProtocolosService;

@Service(value = "ServiciosWebService")
@SessionAttributes("usuario")
public class ServiciosWebServiceImpl implements ServiciosWebService {

	@Resource
	ReloadableResourceBundleMessageSource appMessageSource;

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

	@Autowired
	private ExpedientesService expedientesService;

	@Autowired
	private InspeccionesService inspeccionesService;

	@Autowired
	private RelExpInsService relExpInsService;

	@Autowired
	private PreguntasExpedienteService preguntasExpedienteService;

	@Autowired
	private PreguntasProtocoloService preguntasProtocoloService;

	@Autowired
	private OrigenesInspeccionService origenesInspeccionService;

	@Autowired
	private ProtocolosService protocoloService;

	@Autowired
	private DatosEstablecimientoService datosEstablecimientoService;

	@Autowired
	private OpcionesPreExpService opcionesPreExpService;

	@Autowired
	private DatosDireccionesService datosDireccionesService;

	@Autowired
	private DatosTercerosService datosTercerosService;

	@Autowired
	private RelEstInsService relEstInsService;

	@Autowired
	private RelDenInsService relDenInsService;

	@Autowired
	private EstadosInspeccionDao estadosInspeccionDao;

	@Autowired
	private ActuacionesService actuacionesService;

	@Autowired
	private RespuestasProtocoloService respuestasProtocoloService;

	@Autowired
	private ProcedimientosService procedimientosService;

	@Override
	@Transactional(rollbackFor = Exception.class)
	public String crearInspeccion(String folderId, InspeccionWS objetoInspeccion,
			List<PreguntasExpedienteWS> preguntasExpedienteWS, String nombreUsuario, Integer idOrigenInspeccion,
			Integer idExpedienteOrigen, String numDenuncia) throws Ab79Exception {

		ServiciosWebServiceImpl.logger.info("Vamos a crear la inspeccion");
		Calendar cal = Calendar.getInstance();

		String validacion = this.validarParametros(folderId, objetoInspeccion, preguntasExpedienteWS, nombreUsuario,
				idOrigenInspeccion, idExpedienteOrigen);

		String identificadorInspeccion = null;

		if (null == validacion || "" == validacion) {

			Inspecciones inspecciones = new Inspecciones();

			if (idOrigenInspeccion.equals(Constantes.ORIGEN_AYUDAS)
					|| idOrigenInspeccion.equals(Constantes.ORIGEN_CENSO)
					|| idOrigenInspeccion.equals(Constantes.ORIGEN_DENUNCIAS)
					|| idOrigenInspeccion.equals(Constantes.ORIGEN_ESTABLECIMIENTOS_COMERCIALES)) {

				// sacamos el id_direccion(ab611021T00) con el folder_id
				Expedientes expedientes = new Expedientes();
				expedientes.setFolderId(folderId);
				expedientes = expedientesService.findIdExpediente(expedientes);

				if (null != expedientes && null != expedientes.getProcedimientos()) {
					try {

						ResultadosInspeccion resultadosInspeccion = new ResultadosInspeccion();
						CampainasInspeccion campiana = new CampainasInspeccion();
						if (null != expedientes.getProcedimientos().getDirecciones()) {

							Direcciones direccion = new Direcciones();
							direccion.setIdDireccion(expedientes.getProcedimientos().getDirecciones().getIdDireccion());
							inspecciones.setDireccion(direccion);
						}

						campiana.setIdCampaina(null);
						resultadosInspeccion.setIdResultadoInspeccion(null);

						inspecciones.setCampaina(campiana);
						inspecciones.setExpediente(expedientes);
						inspecciones.setFechaLimInspeccion(objetoInspeccion.getFechaLimiteInspeccion());

						identificadorInspeccion = this.inspeccionesService.crearIdentificadorInspeccion(
								expedientes.getProcedimientos().getDirecciones().getIdDireccion());

						inspecciones.setIdentificadorInspeccion(identificadorInspeccion);
						if (null != idOrigenInspeccion) {
							inspecciones.setIdOrigenInspeccion(idOrigenInspeccion);
						}
						if (null != objetoInspeccion.getObservacionesActuacionInspeccion()) {
							inspecciones.setObjetoInspeccion(objetoInspeccion.getObservacionesActuacionInspeccion());
						}

						EstadosInspeccion estadoInspeccion = this.estadosInspeccionDao.findByOrigenDireccion(
								inspecciones.getIdOrigenInspeccion(), inspecciones.getDireccion().getIdDireccion(),
								Constantes.ESTADO_PENDIENTE);

						if (estadoInspeccion != null) {
							inspecciones.setEstadoInspeccion(estadoInspeccion);
						} else {
							inspecciones.setEstadoInspeccion(new EstadosInspeccion());
						}

						inspecciones.setResultadoInspeccion(resultadosInspeccion);
						inspecciones.setUsuarioRegistro(nombreUsuario);
						inspecciones.setIdProtocolo(new Protocolos());
						inspecciones.setEnviadoTablet(Constantes.ENVIADO_TABLET_NO);
						inspecciones = this.inspeccionesService.add(inspecciones);

						identificadorInspeccion = inspecciones.getIdentificadorInspeccion();

						// inserta id_inspecciones en ab6143Too
						ServiciosWebServiceImpl.logger.info("Inserto inspeccion" + inspecciones.getIdInspeccion());
						RelExpIns relExpIns = new RelExpIns();

						if (null != nombreUsuario) {
							relExpIns.setUsuarioRegistro(nombreUsuario);
						}

						relExpIns.setInspecciones(inspecciones);

						if (objetoInspeccion.getTipoInspeccion() != null) {
							relExpIns.setTipoInspeccion(objetoInspeccion.getTipoInspeccion());
						}
						relExpIns.setIdExpediente(expedientes.getIdExpediente());

						relExpInsService.add(relExpIns);

						ServiciosWebServiceImpl.logger.info("Inserto relExpIns");

					} catch (Exception e) {

						ServiciosWebServiceImpl.logger.error("Excepcion al insertar inspeccion" + e.getMessage(), e);

						String sCodigoError = "error.No_controlado";

						ServiciosWebServiceImpl.logger.error(sCodigoError, e);

						identificadorInspeccion = null;

						throw new Ab79Exception(sCodigoError,
								appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
								appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));

					}
				} else {
					String sCodigoError = "error.ExpedienteNoExiste";

					ServiciosWebServiceImpl.logger.error("Crear Inspeccion - " + sCodigoError);

					identificadorInspeccion = null;

					throw new Ab79Exception(sCodigoError,
							appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
							appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
				}

			} else if (idOrigenInspeccion.equals(Constantes.ORIGEN_BUZON_FRAUDE)) {

				DatosDirecciones datosDirecciones = new DatosDirecciones();
				DatosTerceros datosTerceros = new DatosTerceros();
				RelEstIns relEstIns = new RelEstIns();
				Procedimientos procedimiento = new Procedimientos();
				boolean procedimientoNoExiste = false;
				DatosDirecciones datosDireccionesCopia = null;
				DatosTerceros datosTercerosCopia = null;
				try {

					// Buscamos la ubicación de la actividad del expediente
					datosDirecciones = this.datosDireccionesService.findDomicilioUbicacion(idExpedienteOrigen,
							Constantes.ID_UBICACION_INVERSION);

					// Creamos una copia en la tabla DATOS_DIRECCIONES
					// (AB636T00)
					if (datosDirecciones != null) {
						datosDirecciones.setDatosTerceros(null);
						datosDirecciones.setUsuarioRegistro(nombreUsuario);
						datosDireccionesCopia = this.datosDireccionesService.add(datosDirecciones);
					}

					// Buscamos el afectado parte inculpada
					datosTerceros = this.datosTercerosService.findParteInculpadaByIdExpediente(idExpedienteOrigen);

					// Si no tenemos afectado parte inculpada, buscamos el
					// titular de la actividad
					if (datosTerceros == null) {
						// Si el establecimiento de la dirección está censado,
						// es
						// decir, tiene número de registro
						// (identificadorEstablecimiento) buscamos el titular de
						// ese
						// establecimiento
						if (datosDirecciones != null && datosDirecciones.getIdentificadorEstablecimiento() != null
								&& !"".equals(datosDirecciones.getIdentificadorEstablecimiento())) {
							datosTerceros = this.datosTercerosService
									.findTitularActividad(datosDirecciones.getIdentificadorEstablecimiento());
						}
					}

					// Creamos una copia en la tabla DATOS_TERCEROS
					// (AB635T00)
					if (datosTerceros != null) {

						if (datosTerceros.getSexo().getIdSexo() == Constantes.MAGIC_NUMBER_0) {
							datosTerceros.setSexo(null);
						}
						if (datosTerceros.getTelefono() == Constantes.MAGIC_NUMBER_0) {
							datosTerceros.setTelefono(null);
						}

						datosTerceros.setUsuarioRegistro(nombreUsuario);

						datosTercerosCopia = this.datosTercerosService.add(datosTerceros);

					}

					// Buscar procedimiento
					procedimiento = this.procedimientosService.findByIdExpediente(idExpedienteOrigen);

					if (procedimiento == null) {
						procedimientoNoExiste = true;
						String sCodigoError = "error.procedimientoNoExiste";

						throw new Ab79Exception(sCodigoError,
								appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
								appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
					}

					// Crear inspección
					inspecciones.setCampaina(new CampainasInspeccion());
					inspecciones.setExpediente(new Expedientes());
					inspecciones.setResultadoInspeccion(new ResultadosInspeccion());
					inspecciones.setIdOrigenInspeccion(idOrigenInspeccion);
					inspecciones.setUsuarioRegistro(nombreUsuario);
					inspecciones.setIdProtocolo(new Protocolos());
					if (objetoInspeccion != null) {
						if (null != objetoInspeccion.getObservacionesActuacionInspeccion()) {
							inspecciones.setObjetoInspeccion(objetoInspeccion.getObservacionesActuacionInspeccion());
						}
						if (null != objetoInspeccion.getFechaLimiteInspeccion()) {
							inspecciones.setFechaLimInspeccion(objetoInspeccion.getFechaLimiteInspeccion());
						}
					}
					Direcciones direccion = new Direcciones();
					direccion.setIdDireccion((int) Constantes.ID_TURISMO_DIRECCION);

					identificadorInspeccion = Constantes.IDENTIFICADOR_INSPECCION + "-" + Constantes.TURISMO_DIRECCION
							+ "-" + cal.get(Calendar.YEAR);

					inspecciones.setDireccion(direccion);
					inspecciones.setIdentificadorInspeccion(identificadorInspeccion);

					EstadosInspeccion estadoInspeccion = this.estadosInspeccionDao.findByOrigenDireccion(
							inspecciones.getIdOrigenInspeccion(), inspecciones.getDireccion().getIdDireccion(),
							Constantes.ESTADO_PENDIENTE);

					if (estadoInspeccion != null) {
						inspecciones.setEstadoInspeccion(estadoInspeccion);
					} else {
						inspecciones.setEstadoInspeccion(new EstadosInspeccion());
					}

					// Insert en AB7901T00
					ServiciosWebServiceImpl.logger.info("Inserto Inspecciones");
					Inspecciones inspeccionAux = this.inspeccionesService.add(inspecciones);

					identificadorInspeccion = inspecciones.getIdentificadorInspeccion();

					String titulo = this.inspeccionesService.crearTitulo(inspeccionAux, datosTerceros,
							datosDirecciones);

					// Crear RelEstIns
					relEstIns.setTitulo(titulo);
					relEstIns.setInspeccionBD(inspeccionAux);
					relEstIns.setIdDireccion(
							datosDireccionesCopia != null ? datosDireccionesCopia.getIdDireccion() : null);
					relEstIns.setIdTercero(datosTercerosCopia != null ? datosTercerosCopia.getIdTercero() : null);
					relEstIns.setIdExpedienteOrigen(idExpedienteOrigen);
					relEstIns.setUsuarioRegistro(nombreUsuario);

					// Insert en AB7922T00
					ServiciosWebServiceImpl.logger.info("Inserto RelEstIns");
					this.relEstInsService.add(relEstIns);

					// Crear RelDenIns
					RelDenIns relDenIns = new RelDenIns();
					relDenIns.setNumDenuncia(numDenuncia);
					relDenIns.setIdInspeccion(inspeccionAux.getIdInspeccion());
					relDenIns.setIdentificadorInspeccion(inspeccionAux.getIdentificadorInspeccion());
					relDenIns.setUsuarioRegistro(nombreUsuario);

					// Insert en AB6150T00
					this.relDenInsService.add(relDenIns);

				} catch (Exception e) {
					ServiciosWebServiceImpl.logger.error("Error al insertar la inspección " + e.getMessage(), e);
					String sCodigoError;
					if (procedimientoNoExiste) {
						sCodigoError = "error.procedimientoNoExiste";
					} else {
						sCodigoError = "error.No_controlado";
					}

					ServiciosWebServiceImpl.logger.error(sCodigoError, e);

					throw new Ab79Exception(sCodigoError,
							appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
							appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
				}

			}

			// IF ES DISTITO DE CENSO ADD EN AB7908T00
			if (!idOrigenInspeccion.equals(Constantes.ORIGEN_CENSO)) {
				if (objetoInspeccion.getDatosInspeccionWS().size() > 0) {
					// recorrro array e inserto.
					insertarPreguntaExpedienteAyuda(objetoInspeccion, nombreUsuario, inspecciones);
				}
			} else {
				// Insertamos CENSO en AB7908T00
				if (objetoInspeccion.getDatosEstablecimientoWS() != null) {
					insetarPreguntaExpedienteCenso(objetoInspeccion, nombreUsuario, inspecciones);
				}

			}

			if (!preguntasExpedienteWS.isEmpty()) {
				for (PreguntasExpedienteWS preguntaExpedienteWS : preguntasExpedienteWS) {

					PreguntasExpediente preguntaExpediente = new PreguntasExpediente();
					preguntaExpediente.setInspeccion(inspecciones);
					preguntaExpediente.setDescripcionCastellano(preguntaExpedienteWS.getDescripcionCastellano());
					preguntaExpediente.setDescripcionEuskera(preguntaExpedienteWS.getDescripcionEuskera());
					preguntaExpediente.setIdTipoPregunta(preguntaExpedienteWS.getIdTipoPregunta());
					preguntaExpediente.setUsuarioRegistro(nombreUsuario);

					// Insertamos pregunta expediente
					ServiciosWebServiceImpl.logger.info("Inserto pregunta expediente");
					preguntaExpediente = this.preguntasExpedienteService.add(preguntaExpediente);

					if (preguntaExpedienteWS.getOpcionesCastellano() != null
							&& !"".equals(preguntaExpedienteWS.getOpcionesCastellano())
							&& preguntaExpedienteWS.getOpcionesEuskera() != null
							&& !"".equals(preguntaExpedienteWS.getOpcionesEuskera())) {

						String[] opcionesCastellanoArray = preguntaExpedienteWS.getOpcionesCastellano().trim()
								.split("\\s*;\\s*");
						String[] opcionesEuskeraArray = preguntaExpedienteWS.getOpcionesEuskera().trim()
								.split("\\s*;\\s*");

						for (int i = 0; i < opcionesCastellanoArray.length; i++) {

							OpcionesPreExp opcionPreExp = new OpcionesPreExp();
							opcionPreExp.setIdPreguntaExpediente(preguntaExpediente.getIdPreguntaExpediente());
							opcionPreExp.setDescripcionCastellano(opcionesCastellanoArray[i]);
							opcionPreExp.setDescripcionEuskera(opcionesEuskeraArray[i]);
							opcionPreExp.setUsuarioRegistro(nombreUsuario);

							// Insertamos opcionPreExp
							ServiciosWebServiceImpl.logger.info("Inserto opcionPreExp");
							this.opcionesPreExpService.add(opcionPreExp);

						}

					}

				}
			}

			ServiciosWebServiceImpl.logger.info("[GET - insertar inspecciones] insertado");

		} else {
			String sCodigoError = validacion;

			ServiciosWebServiceImpl.logger.error("Crear Inspeccion - " + sCodigoError);

			identificadorInspeccion = null;

			throw new Ab79Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		}
		return identificadorInspeccion;

	}

	@Override
	@Transactional(rollbackFor = Exception.class)
	public String eliminarInspeccion(String identificadorInspeccion, String usuario) throws Ab79Exception {
		ServiciosWebServiceImpl.logger.info("[eliminarInspeccion] : Inicio eliminarInspeccion");

		try {
			// Buscamos la inspección a eliminar
			Inspecciones inspeccion = this.inspeccionesService.findByIdentificadorInspeccion(identificadorInspeccion);

			// Si la inspección tiene un inspector asignado no la podems
			// eliminar
			if (Constantes.MAGIC_NUMBER_0 == inspeccion.getInspector().getIdInspector()) {

				// Buscar actuaciones para ver si tiene documentos asociados y
				// si es así, eliminarlos junto con la actuación
				List<Actuaciones> listaActuaciones = this.actuacionesService.findByInspeccion(inspeccion);

				try {
					// Eliminar actuaciones
					ServiciosWebServiceImpl.logger.info("[eliminarInspeccion] : Eliminar actuaciones");
					for (Actuaciones actuacion : listaActuaciones) {
						this.actuacionesService.eliminarActuacion(actuacion);
					}
				} catch (Exception e) {
					String sCodigoError = "error.eliminarInspeccion.eliminarActuaciones";

					ServiciosWebServiceImpl.logger.error("Eliminar inspección - " + sCodigoError, e);

					throw new Ab79Exception(sCodigoError,
							appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
							appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
				}

				try {
					// Eliminar datos establecimiento
					ServiciosWebServiceImpl.logger.info("[eliminarInspeccion] : Eliminar datos establecimiento");
					this.datosEstablecimientoService.removeByInspeccion(inspeccion);
				} catch (Exception e) {
					String sCodigoError = "error.eliminarInspeccion.eliminarDatosEstablecimiento";

					ServiciosWebServiceImpl.logger.error("Eliminar inspección - " + sCodigoError, e);

					throw new Ab79Exception(sCodigoError,
							appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
							appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
				}

				try {
					// Eliminar respuestas protocolo
					ServiciosWebServiceImpl.logger.info("[eliminarInspeccion] : Eliminar respuestas protocolo");
					this.respuestasProtocoloService.removeRespuestasFicherosByInspeccion(inspeccion);
				} catch (Exception e) {
					String sCodigoError = "error.eliminarInspeccion.eliminarRespuestasProtocolo";

					ServiciosWebServiceImpl.logger.error("Eliminar inspección - " + sCodigoError, e);

					throw new Ab79Exception(sCodigoError,
							appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
							appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
				}

				// Buscar preguntas expediente para ver si tiene respuestas u
				// opciones y eliminarlas también
				List<PreguntasExpediente> listaPreguntasExpediente = this.preguntasExpedienteService
						.findByInspeccion(inspeccion);

				try {
					// Eliminar preguntas expediente
					ServiciosWebServiceImpl.logger.info("[eliminarInspeccion] : Eliminar preguntas expediente");
					for (PreguntasExpediente preguntaExpediente : listaPreguntasExpediente) {
						this.preguntasExpedienteService.eliminarPreguntaExpediente(preguntaExpediente);
					}
				} catch (Exception e) {
					String sCodigoError = "error.eliminarInspeccion.eliminarPreguntasExpediente";

					ServiciosWebServiceImpl.logger.error("Eliminar inspección - " + sCodigoError, e);

					throw new Ab79Exception(sCodigoError,
							appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
							appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
				}

				try {
					// Eliminar relación de la inspección con el expediente
					ServiciosWebServiceImpl.logger
							.info("[eliminarInspeccion] : Eliminar la relación de la inspección con el expedinte");
					this.relExpInsService.removeByInspeccion(inspeccion);
				} catch (Exception e) {
					String sCodigoError = "error.eliminarInspeccion.eliminarRelExpIns";

					ServiciosWebServiceImpl.logger.error("Eliminar inspección - " + sCodigoError, e);

					throw new Ab79Exception(sCodigoError,
							appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
							appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
				}

				try {
					// Eliminar la relación de la inspección con el
					// establecimiento
					ServiciosWebServiceImpl.logger.info(
							"[eliminarInspeccion] : Eliminar la relación de la inspección con el establecimiento");
					this.relEstInsService.removeByInspeccion(inspeccion);
				} catch (Exception e) {
					String sCodigoError = "error.eliminarInspeccion.eliminarRelEstIns";

					ServiciosWebServiceImpl.logger.error("Eliminar inspección - " + sCodigoError, e);

					throw new Ab79Exception(sCodigoError,
							appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
							appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
				}

				try {
					// Eliminar la relación de la inspección con la denuncia
					ServiciosWebServiceImpl.logger
							.info("[eliminarInspeccion] : Eliminar la relación de la inspección con la denuncia");
					this.relDenInsService.removeByInspeccion(inspeccion);
				} catch (Exception e) {
					String sCodigoError = "error.eliminarInspeccion.eliminarRelDenIns";

					ServiciosWebServiceImpl.logger.error("Eliminar inspección - " + sCodigoError, e);

					throw new Ab79Exception(sCodigoError,
							appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
							appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
				}

				// TODO Eliminar la propuesta de sanción

				try {
					// Eliminar la inspección
					ServiciosWebServiceImpl.logger.info("[eliminarInspeccion] : Eliminar la inspección");
					this.inspeccionesService.remove(inspeccion);
				} catch (Exception e) {
					String sCodigoError = "error.eliminarInspeccion.eliminarInspeccion";

					ServiciosWebServiceImpl.logger.error("Eliminar inspección - " + sCodigoError, e);

					throw new Ab79Exception(sCodigoError,
							appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
							appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
				}

				ServiciosWebServiceImpl.logger.info("[eliminarInspeccion] : Fin eliminarInspeccion");

				return "ok";

			} else {
				String sCodigoError = "error.eliminarInspeccion.tieneInspector";

				ServiciosWebServiceImpl.logger.error("Eliminar inspección - " + sCodigoError);

				throw new Ab79Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
						appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
			}

		} catch (Ab79Exception ab79Exception) {
			ServiciosWebServiceImpl.logger.info(ab79Exception.getFaultInfo().getCodigo(), ab79Exception);

			throw new Ab79Exception(ab79Exception.getFaultInfo().getCodigo(),
					ab79Exception.getFaultInfo().getMensajeCastellano(),
					ab79Exception.getFaultInfo().getMensajeEuskera());
		} catch (Exception e) {
			String sCodigoError = "error.No_controlado";

			ServiciosWebServiceImpl.logger.error(sCodigoError, e);

			throw new Ab79Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		}
	}

	private void insetarPreguntaExpedienteCenso(InspeccionWS objetoInspeccion, String nombreUsuario,
			Inspecciones inspecciones) {

		if (objetoInspeccion.getDatosEstablecimientoWS() != null
				|| objetoInspeccion.getDatosEstablecimientoWS().getTipoEstablecimiento() != null
				|| objetoInspeccion.getDatosEstablecimientoWS().getModalidadEstablecimiento() != null
				|| objetoInspeccion.getDatosEstablecimientoWS().getCategoriaEstablecimiento() != null) {

			Protocolos protocolo = new Protocolos();
			protocolo.setTipoEstablecimiento(objetoInspeccion.getDatosEstablecimientoWS().getTipoEstablecimiento());
			protocolo.setModalidadEstablecimiento(
					objetoInspeccion.getDatosEstablecimientoWS().getModalidadEstablecimiento());
			protocolo.setCategoriaEstablecimiento(
					objetoInspeccion.getDatosEstablecimientoWS().getCategoriaEstablecimiento());
			protocolo = protocoloService.findProtocolo(protocolo);

			DatosEstablecimiento datosEstablecimiento = new DatosEstablecimiento();

			datosEstablecimiento
					.setIdTipoEstablecimiento(objetoInspeccion.getDatosEstablecimientoWS().getTipoEstablecimiento());
			datosEstablecimiento
					.setIdModalidad(objetoInspeccion.getDatosEstablecimientoWS().getModalidadEstablecimiento());
			datosEstablecimiento
					.setIdCategorias(objetoInspeccion.getDatosEstablecimientoWS().getCategoriaEstablecimiento());

			datosEstablecimiento
					.setIdentEstablecimiento(objetoInspeccion.getDatosEstablecimientoWS().getIdentEstablecimiento());

			datosEstablecimiento.setIdInspeccion(inspecciones.getIdInspeccion());
			datosEstablecimiento.setUsuarioRegistro(inspecciones.getUsuarioRegistro());

			datosEstablecimientoService.add(datosEstablecimiento);
			if (protocolo != null) {
				inspecciones.setIdProtocolo(protocolo);
				inspeccionesService.updateProtocolos(inspecciones);
			}

		}

		for (int i = 0; i < objetoInspeccion.getDatosEstablecimientoWS().getDatosValidarWS().size(); i++) {

			PreguntasExpediente preguntasExpediente = new PreguntasExpediente();

			// Sacamos los datos de la tabla AB7911T00
			PreguntasProtocolo preguntasprotocolo = new PreguntasProtocolo();
			preguntasprotocolo.setIdentDatoEstablecimiento(objetoInspeccion.getDatosEstablecimientoWS()
					.getDatosValidarWS().get(i).getIdentificadorDatoEstablecimiento());
			preguntasprotocolo = preguntasProtocoloService.findLineaPregunta(preguntasprotocolo);

			if (preguntasprotocolo != null) {
				preguntasExpediente.setIdPreguntaProtocolo(preguntasprotocolo.getIdPreguntaProtocolo());
				preguntasExpediente.setIdTipoPregunta(preguntasprotocolo.getIdTipoPregunta());
				preguntasExpediente.setDescripcionCastellano(preguntasprotocolo.getDescripcionCastellano());
				preguntasExpediente.setDescripcionEuskera(preguntasprotocolo.getDescripcionEuskera());
				preguntasExpediente.setUsuarioRegistro(nombreUsuario);
				preguntasExpediente.setInspeccion(inspecciones);
				if (Constantes.TIPO_PREGUNTA_SINO == preguntasExpediente.getIdTipoPregunta()) {
					if (Constantes.SI_WS.equals(objetoInspeccion.getDatosEstablecimientoWS().getDatosValidarWS().get(i)
							.getValorValidar())) {
						objetoInspeccion.getDatosEstablecimientoWS().getDatosValidarWS().get(i)
								.setValorValidar(Constantes.SINO_SI_CASTELLANO);
					} else if (Constantes.NO_WS.equals(objetoInspeccion.getDatosEstablecimientoWS().getDatosValidarWS()
							.get(i).getValorValidar())) {
						objetoInspeccion.getDatosEstablecimientoWS().getDatosValidarWS().get(i)
								.setValorValidar(Constantes.SINO_NO_CASTELLANO);
					}
				}
				preguntasExpediente.setValorValidar(
						objetoInspeccion.getDatosEstablecimientoWS().getDatosValidarWS().get(i).getValorValidar());
				// Inserto registro
				preguntasExpedienteService.add(preguntasExpediente);
				ServiciosWebServiceImpl.logger.info("inserto pregunta expediente:   " + preguntasExpediente);
			}

		}

		for (int j = 0; j < objetoInspeccion.getDatosEstablecimientoWS().getObjetosValidarWS().size(); j++) {
			for (int k = 0; k < objetoInspeccion.getDatosEstablecimientoWS().getObjetosValidarWS().get(j)
					.getDatosValidarWS().size(); k++) {

				PreguntasExpediente preguntasExpediente = new PreguntasExpediente();

				// Datos de la tabla AB7911T00
				PreguntasProtocolo preguntasProtocolo = new PreguntasProtocolo();
				preguntasProtocolo.setIdentDatoEstablecimiento(objetoInspeccion.getDatosEstablecimientoWS()
						.getObjetosValidarWS().get(j).getDatosValidarWS().get(k).getIdentificadorDatoEstablecimiento());
				preguntasProtocolo = preguntasProtocoloService.findLineaPregunta(preguntasProtocolo);

				if (preguntasProtocolo != null) {
					preguntasExpediente.setIdPreguntaProtocolo(preguntasProtocolo.getIdPreguntaProtocolo());
					preguntasExpediente.setIdTipoPregunta(preguntasProtocolo.getIdTipoPregunta());
					preguntasExpediente.setDescripcionCastellano(preguntasProtocolo.getDescripcionCastellano());
					preguntasExpediente.setDescripcionEuskera(preguntasProtocolo.getDescripcionEuskera());
					preguntasExpediente.setUsuarioRegistro(nombreUsuario);
					preguntasExpediente.setInspeccion(inspecciones);
					if (Constantes.TIPO_PREGUNTA_SINO == preguntasExpediente.getIdTipoPregunta()) {
						if (Constantes.SI_WS.equals(objetoInspeccion.getDatosEstablecimientoWS().getObjetosValidarWS()
								.get(j).getDatosValidarWS().get(k).getValorValidar())) {
							objetoInspeccion.getDatosEstablecimientoWS().getObjetosValidarWS().get(j)
									.getDatosValidarWS().get(k).setValorValidar(Constantes.SINO_SI_CASTELLANO);
						} else if (Constantes.NO_WS.equals(objetoInspeccion.getDatosEstablecimientoWS()
								.getObjetosValidarWS().get(j).getDatosValidarWS().get(k).getValorValidar())) {
							objetoInspeccion.getDatosEstablecimientoWS().getObjetosValidarWS().get(j)
									.getDatosValidarWS().get(k).setValorValidar(Constantes.SINO_NO_CASTELLANO);
						}
					}
					preguntasExpediente.setValorValidar(objetoInspeccion.getDatosEstablecimientoWS()
							.getObjetosValidarWS().get(j).getDatosValidarWS().get(k).getValorValidar());
					preguntasExpediente.setIdentObjEstablecimiento(objetoInspeccion.getDatosEstablecimientoWS()
							.getObjetosValidarWS().get(j).getIdObjetoValidar());
					preguntasExpediente.setDescrObjEstablecimiento(objetoInspeccion.getDatosEstablecimientoWS()
							.getObjetosValidarWS().get(j).getDescObjetoValidar());
					// Insert
					preguntasExpedienteService.add(preguntasExpediente);
					ServiciosWebServiceImpl.logger.info("inserto pregunta expediente:   " + preguntasExpediente);
				}

			}
		}
	}

	private void insertarPreguntaExpedienteAyuda(InspeccionWS objetoInspeccion, String nombreUsuario,
			Inspecciones inspecciones) {
		for (int i = 0; i < objetoInspeccion.getDatosInspeccionWS().size(); i++) {

			PreguntasExpediente preguntasExpediente = new PreguntasExpediente();
			preguntasExpediente.setIdTipoPregunta(4);
			preguntasExpediente.setDescripcionCastellano(
					objetoInspeccion.getDatosInspeccionWS().get(i).getDescripcionCastellano());
			preguntasExpediente
					.setDescripcionEuskera(objetoInspeccion.getDatosInspeccionWS().get(i).getDescripcionEuskera());
			preguntasExpediente.setObservacionesTecnicoCas(
					objetoInspeccion.getDatosInspeccionWS().get(i).getObservacionesCastellano());
			preguntasExpediente.setObservacionesTecnicoEus(
					objetoInspeccion.getDatosInspeccionWS().get(i).getObservacionesEuskera());
			preguntasExpediente.setProveedor(objetoInspeccion.getDatosInspeccionWS().get(i).getProveedor());
			preguntasExpediente.setImporte(objetoInspeccion.getDatosInspeccionWS().get(i).getImporte());
			preguntasExpediente.setImporteAdmitido(objetoInspeccion.getDatosInspeccionWS().get(i).getImporteAdmitido());
			if (null != objetoInspeccion.getDatosInspeccionWS().get(i).getFechaFactura()) {
				preguntasExpediente.setFechaFactura(objetoInspeccion.getDatosInspeccionWS().get(i).getFechaFactura());
			}
			if (null != objetoInspeccion.getDatosInspeccionWS().get(i).getNumeroFactura()) {
				preguntasExpediente.setNumeroFactura(objetoInspeccion.getDatosInspeccionWS().get(i).getNumeroFactura());
			}
			if (null != objetoInspeccion.getDatosInspeccionWS().get(i).getConcepto()) {
				preguntasExpediente.setConcepto(objetoInspeccion.getDatosInspeccionWS().get(i).getConcepto());
			}
			preguntasExpediente.setUsuarioRegistro(nombreUsuario);

			preguntasExpediente.setInspeccion(inspecciones);
			preguntasExpediente.setOrden((long) i + 1);
			preguntasExpediente.setIdPreguntaPadreExpediente(null);

			// Inserto registro
			preguntasExpedienteService.add(preguntasExpediente);
			ServiciosWebServiceImpl.logger.info("inserto pregunta expediente:   " + preguntasExpediente);

		}
	}

	private String validarParametros(String folderId, InspeccionWS objetoInspeccion,
			List<PreguntasExpedienteWS> preguntasExpedienteWS, String nombreUsuario, Integer idOrigenInspeccion,
			Integer idExpedienteOrigen) {

		ServiciosWebServiceImpl.logger.info("Validar los parámetros recibidos");
		String sCodigoError = null;

		if (null == nombreUsuario || "".equals(nombreUsuario)) {
			sCodigoError = "error.obligatorio.nombreUsuario";
		} else if (null == idOrigenInspeccion || Constantes.MAGIC_NUMBER_0 == idOrigenInspeccion) {
			sCodigoError = "error.obligatorio.idOrigenInspeccion";
		} else {
			OrigenesInspeccion origenInspeccionAux = new OrigenesInspeccion();
			origenInspeccionAux.setIdOrigenInspeccion(idOrigenInspeccion);
			origenInspeccionAux = this.origenesInspeccionService.find(origenInspeccionAux);

			if (null != origenInspeccionAux) {

				if (idOrigenInspeccion.equals(Constantes.ORIGEN_AYUDAS)
						|| idOrigenInspeccion.equals(Constantes.ORIGEN_CENSO)
						|| idOrigenInspeccion.equals(Constantes.ORIGEN_ESTABLECIMIENTOS_COMERCIALES)) {
					if (folderId == null || "".equals(folderId)) {
						sCodigoError = "error.obligatorio.folderId";
					}
				} else if (idOrigenInspeccion.equals(Constantes.ORIGEN_DENUNCIAS)) {
					if (folderId == null || "".equals(folderId)) {
						sCodigoError = "error.obligatorio.folderId";
					}
				} else if (idOrigenInspeccion.equals(Constantes.ORIGEN_BUZON_FRAUDE)) {
					if (idExpedienteOrigen == null || "".equals(idExpedienteOrigen)) {
						sCodigoError = "error.obligatorio.idExpedienteOrigen";
					}
				}

				if (!preguntasExpedienteWS.isEmpty()) {
					for (PreguntasExpedienteWS preguntaExpedienteWS : preguntasExpedienteWS) {
						if (preguntaExpedienteWS.getIdTipoPregunta() == Constantes.TIPO_PREGUNTA_CHECKBOX) {
							String[] opcionesCastellano = preguntaExpedienteWS.getOpcionesCastellano().split(";");
							String[] opcionesEuskera = preguntaExpedienteWS.getOpcionesEuskera().split(";");
							if (opcionesCastellano.length != opcionesEuskera.length) {
								sCodigoError = "error.distintoNumeroOpcionesEuskeraCastellano";
							}
						}
					}
				}

			} else {
				sCodigoError = "error.idOrigenInspeccionIncorrecto";
			}
		}

		return sCodigoError;
	}

}