/**
 * 
 */
package com.ejie.ab63.control.expedientes;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.ui.Model;
import org.springframework.web.servlet.ModelAndView;

import com.ejie.ab63.clientesWS.X43ExpedienteElectronico.TFolderList;
import com.ejie.ab63.comun.Constantes;
import com.ejie.ab63.comun.utilidades.config.Config;
import com.ejie.ab63.model.Establecimiento;
import com.ejie.ab63.model.expedientes.Expedientes;
import com.ejie.ab63.model.inicio.InitForm;
import com.ejie.ab63.model.procedimientos.Procedimientos;
import com.ejie.ab63.model.terceros.DatosDirecciones;
import com.ejie.ab63.model.terceros.RelExpTer;
import com.ejie.ab63.model.terceros.VistaDatosExpediente;
import com.ejie.ab63.model.terceros.VistaTerceros;
import com.ejie.ab63.model.usuario.Usuario;
import com.ejie.ab63.model.util.ResultAjaxOperation;
import com.ejie.ab63.model.util.SuccessResultAjaxOperation;
import com.ejie.ab63.service.AgenciaDataService;
import com.ejie.ab63.service.EstablecimientoService;
import com.ejie.ab63.service.expedientes.DetailExpedienteService;
import com.ejie.ab63.service.expedientes.ExpedientesService;
import com.ejie.ab63.service.generarPublicacion.GenerarPublicacionService;
import com.ejie.ab63.service.plantillas.ParametrosConfigService;
import com.ejie.ab63.service.procedimientos.ProcedimientosService;
import com.ejie.ab63.service.procedimientos.ProcedureActionFacade;
import com.ejie.ab63.service.procedimientos.ProcedureActions;
import com.ejie.ab63.service.terceros.DatosDireccionesService;
import com.ejie.ab63.service.terceros.RelExpTerService;
import com.ejie.ab63.util.PermisosXLNETS;

/**
 * Clase base para la ficha de expediente
 */
public abstract class ExpedienteBaseContoller implements DetailExpedienteService {

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

	@Autowired
	private RelExpTerService relExpTerService;

	@Autowired
	private ExpedientesService expedientesService;

	@Autowired
	private ProcedimientosService procedimientosService;

	@Autowired
	private DatosDireccionesService datosDireccionesService;

	@Autowired
	private EstablecimientoService establecimientoService;

	@Autowired
	private AgenciaDataService agenciaDataService;

	@Autowired
	private GenerarPublicacionService generarPublicacionService;

	@Autowired
	private ParametrosConfigService parametrosConfigService;

	/**
	 * 
	 */
	public ExpedienteBaseContoller() {

	}

	protected abstract void setCurrentPageModel(Model model, InitForm initForm);

	protected abstract String getTilesPage();

	protected abstract String getCurrentPage();

	/**
	 * 
	 * @param relExpTerService
	 * @param expedientesService
	 * @param procedimientosService
	 * @param datosDireccionesService
	 * @param establecimientoService
	 * @param agenciaDataService
	 */
	public ExpedienteBaseContoller(RelExpTerService relExpTerService, ExpedientesService expedientesService,
			ProcedimientosService procedimientosService, DatosDireccionesService datosDireccionesService,
			EstablecimientoService establecimientoService, AgenciaDataService agenciaDataService,
			GenerarPublicacionService generarPublicacionService) {
		this.relExpTerService = relExpTerService;
		this.expedientesService = expedientesService;
		this.procedimientosService = procedimientosService;
		this.datosDireccionesService = datosDireccionesService;
		this.establecimientoService = establecimientoService;
		this.agenciaDataService = agenciaDataService;
		this.setGenerarPublicacionService(generarPublicacionService);
	}

	protected final ModelAndView mostrar(Model model, InitForm initForm, Usuario usuario) throws Exception {
		Authentication aut = SecurityContextHolder.getContext().getAuthentication();
		ExpedienteBaseContoller.logger.info("autotenticacion:getAuthentication" + aut);

		/** Dejamos el usuario logueado en session */
		String username = PermisosXLNETS.getUserConnected();
		usuario.setNombreUsuario(username);
		model.addAttribute("usuario", usuario);

		if (initForm != null && initForm.getIdExpediente() != null) {
			// Carga el idioma en el model
			setLanguageFromContext(model, initForm);

			// Informacion de PLATEA
			setInfoExpedientePlatea(model, initForm, usuario);

			// Carga la informacion del nucleo necesaria
			setNucleoDependencies(model, initForm);

			// Recupera el procedimiento del nucleo
			Procedimientos procedimientos = setProcedimientoExpediente(model, initForm);

			// Recuperar el establecimiento creado con el expediente
			ProcedureActions procedureActions = getProcedureActions(initForm);
			loadEstablecimientoExpediente(procedureActions, model, initForm);

			setTabsConfig(model, procedimientos, getCurrentPage());

			setCurrentPageModel(model, initForm);

			model.addAttribute("isEnableSaveButton", procedureActions.isEnableSaveExpediente(initForm));
			model.addAttribute("isEnableExecuteAction", procedureActions.isEnableExecuteAction(initForm));
			model.addAttribute("hasSecondButton", procedureActions.hasSecondButton(initForm));
			model.addAttribute("isEnableAccessCenso", procedureActions.isEnableAccessCenso(initForm));
			model.addAttribute("isInspectionable", procedureActions.isInspectionable(initForm));
			model.addAttribute("isEnableInspect", procedureActions.isEnableInspect(initForm));
			model.addAttribute("isEnableAccessInspecciones", procedureActions.isEnableAccessInspecciones(initForm));
			model.addAttribute("isEnableCreateDocs", procedureActions.isEnableCreateDocs(initForm));
			model.addAttribute("isEnableShowUbicacionEstablecimiento",
					procedureActions.isEnableShowUbicacionEstablecimiento(initForm));
			model.addAttribute("isCloseExpediente", procedureActions.isCloseExpediente(initForm));
			model.addAttribute("hasProcedimientoInicioOficio", procedureActions.hasProcedimientoInicioOficio(initForm));
			model.addAttribute("titleButtons", procedureActions.getButtonsText(initForm));

			return new ModelAndView(getTilesPage(), "model", model);
		} else {
			return new ModelAndView("folderError");
		}
	}

	protected void setLanguageFromContext(Model model, InitForm initForm) {
		String idioma = LocaleContextHolder.getLocale().getLanguage();
		initForm.setIdioma(idioma);
		model.addAttribute("lenguaje", idioma);
	}

	protected void setInfoExpedientePlatea(Model model, InitForm initForm, Usuario usuario) throws Exception {
		TFolderList resultado = this.expedientesService.obtenerInfoPlatea(initForm.getFolderId());
		if (null != resultado) {
			this.expedientesService.loadInfoFromPlatea(model, initForm, resultado);
			model.addAttribute("flagSearchFolder", true);
		} else {
			model.addAttribute("flagSearchFolder", false);
		}
	}

	protected void setNucleoDependencies(Model model, InitForm initForm) {
		Integer idTercero = 0;
		Long tipoParticipantePrincipal = (long) Constantes.PARTICIPACION_SOLICITANTE;
		if (initForm.isExpedienteOficio()) {
			tipoParticipantePrincipal = (long) Constantes.PARTICIPACION_AFECTADO;
		}

		DatosDirecciones direccionEstablecimiento = this.datosDireccionesService
				.findEstablecimientoExpediente(initForm.getIdExpediente());
		DatosDirecciones postalTitular;
		if (direccionEstablecimiento == null || direccionEstablecimiento.getIdDireccion() == null) {
			// Si no hay un tercero con direccion establecimiento
			idTercero = this.relExpTerService.findFirstTerceroWhitoutEstablecimiento(initForm.getIdExpediente());
		} else {
			idTercero = direccionEstablecimiento.getDatosTerceros().getIdTercero();
		}
		postalTitular = this.datosDireccionesService.findPostalTerceroId(idTercero);
		if (postalTitular != null && postalTitular.getIdDireccion() != null) {
			model.addAttribute("listaDomicilio", postalTitular);
			model.addAttribute("isEnableShowDireccionPostal", true);
		} else {
			model.addAttribute("isEnableShowDireccionPostal", false);
		}

		List<VistaTerceros> listVistaPrincipales = new ArrayList<VistaTerceros>();
		List<VistaTerceros> listVistaOtros = new ArrayList<VistaTerceros>();
		List<RelExpTer> listaParticipantes = relExpTerService.findParticipaciones(initForm.getIdExpediente());

		for (Iterator<RelExpTer> iterator = listaParticipantes.iterator(); iterator.hasNext();) {
			RelExpTer participante = iterator.next();
			VistaTerceros terceros = new VistaTerceros();
			terceros.setDatosTercerosList(participante.getDatosTercerosList());
			terceros.setIdTipoTercero(participante.getTiposTercero().getIdTipoTercero());
			terceros.setParticipantId(participante.getParticipantId());
			terceros.setTipoTerceroDesCas(participante.getTiposTercero().getDescripcionCastellano());
			terceros.setTipoTerceroDesEus(participante.getTiposTercero().getDescripcionEuskera());
			if (tipoParticipantePrincipal == participante.getTiposTercero().getIdTipoTercero()) {
				listVistaPrincipales.add(terceros);
			} else {
				listVistaOtros.add(terceros);
			}
		}
		model.addAttribute("listaSearch", listVistaPrincipales);
		model.addAttribute("listaBBDD", listVistaOtros);

		Properties prop = Config.loadProperties(Constantes.COD_APPL_CONFIG);
		String url = prop.getProperty("urlVerDocumento");
		String urlOrigen = prop.getProperty("urlVerDocumento");
		url = url.replace("[folderID]", initForm.getFolderId());
		initForm.setTituloExpedienteCompleto(initForm.getFolderNumber() + " - " + initForm.getTituloExpediente());
		initForm.setIdTerceroTitular(idTercero);
		Expedientes expedientes = this.expedientesService.find(new Expedientes(initForm.getIdExpediente()));
		if (expedientes.getIdExpedienteOrigen() != null && expedientes.getIdExpedienteOrigen() > 0) {
			Expedientes expedientesOrigen = this.expedientesService
					.find(new Expedientes(expedientes.getIdExpedienteOrigen()));
			initForm.setIdExpedienteOrigen(expedientes.getIdExpedienteOrigen());
			model.addAttribute("urlVerDocumentosOrigen",
					urlOrigen.replace("[folderID]", expedientesOrigen.getFolderId()));
		} else {
			model.addAttribute("urlVerDocumentosOrigen", urlOrigen);
		}

		model.addAttribute("idTercero", idTercero);
		model.addAttribute("urlab61", prop.getProperty("URLAB61"));
		model.addAttribute("urlVerDocumentos", url);
		model.addAttribute("ab61_folderID", initForm.getFolderId());
		model.addAttribute("nombreExpediente", initForm.getTituloExpedienteCompleto());
		model.addAttribute("hasExpedienteOrigen",
				initForm.getIdExpedienteOrigen() != null && initForm.getIdExpedienteOrigen() > 0);
	}

	@Deprecated
	protected void setNucleoDependenciesOld(Model model, InitForm initForm) {
		Integer idTercero = 0;
		Long tipoParticipantePrincipal = (long) Constantes.PARTICIPACION_SOLICITANTE;
		if (initForm.isExpedienteOficio()) {
			tipoParticipantePrincipal = (long) Constantes.PARTICIPACION_AFECTADO;

			DatosDirecciones datosDirecciones = this.datosDireccionesService
					.findEstablecimientoExpediente(initForm.getIdExpediente());
			if (datosDirecciones != null && datosDirecciones.getDatosTerceros() != null
					&& datosDirecciones.getIdDireccion() > 0) {
				idTercero = datosDirecciones.getDatosTerceros().getIdTercero();
			}
		}

		// Sacamos el idTercero del solicitante titular. ab60
		List<VistaDatosExpediente> listaParticipantesParticipacion = relExpTerService
				.findParticipaciones2(initForm.getIdExpediente(), tipoParticipantePrincipal);

		for (int i = 0; i < listaParticipantesParticipacion.size(); i++) {
			if (i == 0) {
				model.addAttribute("listaSearch", listaParticipantesParticipacion.get(0).getVistaTercerosList());
				/// Sacamos el id tercero del solicitante titular
				for (int k = 0; k < listaParticipantesParticipacion.get(0).getVistaTercerosList().size(); k++) {
					if (null != listaParticipantesParticipacion.get(0).getVistaTercerosList().get(k)
							.getIdTipoTercero()) {
						if (listaParticipantesParticipacion.get(0).getVistaTercerosList().get(k).getIdTipoTercero()
								.compareTo(tipoParticipantePrincipal) == 0) {
							for (int h = 0; h < listaParticipantesParticipacion.get(0).getVistaTercerosList().get(k)
									.getDatosTercerosList().size(); h++) {

								if (idTercero == 0 && listaParticipantesParticipacion.get(0).getVistaTercerosList()
										.get(k).getDatosTercerosList().get(h).getTipoParticipante()
										.compareTo(Constantes.PARTICIPANTE_TITULAR) == 0) {
									idTercero = listaParticipantesParticipacion.get(0).getVistaTercerosList().get(k)
											.getDatosTercerosList().get(h).getIdTercero();
								}

							}

						}

					}
				}
			} else if (i == 1) {
				if (listaParticipantesParticipacion.get(1).getVistaTercerosList().isEmpty()) {
					for (int h = 0; h < listaParticipantesParticipacion.get(1).getVistaTercerosList().get(0)
							.getListaDirecciones().size(); h++) {
						int resul = listaParticipantesParticipacion.get(1).getVistaTercerosList().get(0)
								.getListaDirecciones().get(h).getTiposDireccion().getIdTipoDireccion()
								.compareTo(Constantes.ID_DIRECCION_NOTIF_POSTAL);
						if (idTercero != 0 && listaParticipantesParticipacion.get(1).getVistaTercerosList().get(0)
								.getListaDirecciones().get(h).getDatosTerceros().getIdTercero() == idTercero) {
							if (resul == 0) {
								model.addAttribute("listaDomicilio", listaParticipantesParticipacion.get(1)
										.getVistaTercerosList().get(0).getListaDirecciones().get(h));
							} else {
								model.addAttribute("listaUbicacion", listaParticipantesParticipacion.get(1)
										.getVistaTercerosList().get(0).getListaDirecciones().get(h));
							}

						}
					}
				}
			} else if (i == 2)
				if (listaParticipantesParticipacion.get(2).getVistaTercerosList().size() > 0) {
					model.addAttribute("listaBBDD", listaParticipantesParticipacion.get(2).getVistaTercerosList());
				}
		}
		// fin ab60.

		Properties prop = Config.loadProperties(Constantes.COD_APPL_CONFIG);
		String url = prop.getProperty("urlVerDocumento");
		String urlOrigen = prop.getProperty("urlVerDocumento");
		url = url.replace("[folderID]", initForm.getFolderId());
		initForm.setTituloExpedienteCompleto(initForm.getFolderNumber() + " - " + initForm.getTituloExpediente());
		initForm.setIdTerceroTitular(idTercero);
		Expedientes expedientes = this.expedientesService.find(new Expedientes(initForm.getIdExpediente()));
		if (expedientes.getIdExpedienteOrigen() != null && expedientes.getIdExpedienteOrigen() > 0) {
			Expedientes expedientesOrigen = this.expedientesService
					.find(new Expedientes(expedientes.getIdExpedienteOrigen()));
			initForm.setIdExpedienteOrigen(expedientes.getIdExpedienteOrigen());

			model.addAttribute("urlVerDocumentosOrigen",
					urlOrigen.replace("[folderID]", expedientesOrigen.getFolderId()));
		} else {
			model.addAttribute("urlVerDocumentosOrigen", urlOrigen);
		}

		model.addAttribute("idTercero", idTercero);
		model.addAttribute("urlab61", prop.getProperty("URLAB61"));
		model.addAttribute("urlVerDocumentos", url);
		model.addAttribute("ab61_folderID", initForm.getFolderId());
		model.addAttribute("nombreExpediente", initForm.getTituloExpedienteCompleto());
		model.addAttribute("hasExpedienteOrigen",
				initForm.getIdExpedienteOrigen() != null && initForm.getIdExpedienteOrigen() > 0);
	}

	protected Procedimientos setProcedimientoExpediente(Model model, InitForm initForm) {
		Expedientes expedienteProcemiento = expedientesService
				.findProcedureIdPorExpediente(new Expedientes(initForm.getIdExpediente()));
		Procedimientos proced = procedimientosService.find(expedienteProcemiento.getProcedimientos());
		StringBuilder procedimiento = new StringBuilder();
		procedimiento.append(proced.getCodProcedureId());
		procedimiento.append(" - ");
		if (Constantes.CASTELLANO.equalsIgnoreCase(initForm.getIdioma())) {
			procedimiento.append(proced.getDescripcionEs());
		} else {
			procedimiento.append(proced.getDescripcionEu());
		}
		initForm.setProcedureId(String.valueOf(proced.getIdProcedimiento()));
		initForm.setProcedureCod(proced.getCodProcedureId());
		initForm.setTituloProcedimientoCompleto(procedimiento.toString());
		model.addAttribute("procedimiento", initForm.getProcedureCod());

		return proced;
	}

	private Establecimiento loadEstablecimientoExpediente(ProcedureActions procedureActions, Model model,
			InitForm initForm) {
		// Se buscar la direccion del expediente
		Expedientes expedientes = this.expedientesService.find(new Expedientes(initForm.getIdExpediente()));
		if (expedientes.getIdTerritorioHistorico() != null) {
			initForm.setIdProvinciaEstablecimiento(String.format("%02d", expedientes.getIdTerritorioHistorico()));
		}

		DatosDirecciones direccionExpediente = procedureActions.findDireccioneEstablecimiento(initForm);
		initForm.setIdentificadorEstablecimiento(direccionExpediente.getIdentificadorEstablecimiento());
		initForm.setIdDireccionExpediente(direccionExpediente.getIdDireccion());
		if ((initForm.getIdProvinciaEstablecimiento() == null || "".equals(initForm.getIdProvinciaEstablecimiento())
				|| "00".equals(initForm.getIdProvinciaEstablecimiento()))
				&& direccionExpediente.getIdProvincia() != null) {
			initForm.setIdProvinciaEstablecimiento(direccionExpediente.getIdProvinciaPad());
		}
		if ((initForm.getIdPais() == null || "".equals(initForm.getIdPais()) || "000".equals(initForm.getIdPais()))
				&& direccionExpediente.getIdPais() != null) {
			initForm.setIdPais(direccionExpediente.getIdPaisPad());
		}

		// Se busca el establecimiento del Expediente
		Establecimiento establecimientoExpediente = procedureActions.findEstablecimiento(initForm);
		if (establecimientoExpediente.getIdEstablecimiento() != null) {
			if (initForm.isIdentificadorEmpty() || direccionExpediente.getIdentificadorEstablecimiento()
					.equals(establecimientoExpediente.getIdentificadorEstablecimiento())) {
				initForm.setIdentificadorEstablecimiento(establecimientoExpediente.getIdentificadorEstablecimiento());
			}
			initForm.setTipoRegistroEstablecimiento(establecimientoExpediente.getTipoRegistro());
			initForm.setTipoEstablecimiento(
					establecimientoExpediente.getTipoEstablecimiento().getIdTipoEstablecimiento());
		} else {
			initForm.setTipoRegistroEstablecimiento(Constantes.TIPO_REGISTRO_TEMPORAL);
			if (Constantes.PROCEDIMIENTO_MODIFICACIONES_ACTIVIDAD.equalsIgnoreCase(initForm.getProcedureCod())) {
				model.addAttribute("modificacionSinTemp", "modificacionSinTemp");
			}
		}

		// Para un inicio de oficio con origen sin direccion, se copia la
		// direccion de actividad del expediente padre
		if (initForm.getIdExpedienteOrigen() != null && initForm.getIdExpedienteOrigen() > 0
				&& direccionExpediente.getIdDireccion() == null && initForm.isIdentificadorEmpty()) {
			direccionExpediente = this.datosDireccionesService.crearDireccionFromExpedienteOrigen(
					initForm.getIdExpediente(), initForm.getIdExpedienteOrigen(), initForm.getIdTerceroTitular());
			initForm.setIdDireccionExpediente(direccionExpediente.getIdDireccion());
			initForm.setIdentificadorEstablecimiento(direccionExpediente.getIdentificadorEstablecimiento());
			if ((initForm.getIdProvinciaEstablecimiento() == null
					|| "".equals(initForm.getIdProvinciaEstablecimiento()))
					&& direccionExpediente.getIdProvincia() != null) {
				initForm.setIdProvinciaEstablecimiento(direccionExpediente.getIdProvincia().toString());
			}

		}

		// Para un establecimiento sin direccion si tiene establecimiento padre
		// se busca la direccion del padre y el numero de registro
		if (establecimientoExpediente.getIdEstablecimiento() != null && direccionExpediente.getIdDireccion() == null
				&& establecimientoExpediente.getIdEstablecimientoPadre() != null) {
			Establecimiento filter = new Establecimiento(
					Integer.valueOf(establecimientoExpediente.getIdEstablecimientoPadre()));
			direccionExpediente = datosDireccionesService.findDireccionEstablecimiento(filter,
					Constantes.ID_DIRECCION_ACTIVIDAD);
			initForm.setIdentificadorEstablecimiento(establecimientoExpediente.getIdentificadorEstablecimiento());
		}

		if (establecimientoExpediente != null
				&& Constantes.PROCEDIMIENTO_INICIO_ACTIVIDAD.equalsIgnoreCase(initForm.getProcedureCod())
				&& establecimientoExpediente.getUsuarioRegistro() != null
				&& "MIG_EXP_REATE".equalsIgnoreCase(establecimientoExpediente.getUsuarioRegistro())) {
			model.addAttribute("expedienteMigrado", "expedienteMigrado");
		}

		Boolean enableSelectCountry = false;
		if (null != establecimientoExpediente) {
			if (null != establecimientoExpediente.getModalidad()) {
				initForm.setTipoModalidad(establecimientoExpediente.getModalidad().getIdModalidad());
			}
			if (null != establecimientoExpediente.getAgenciaData()
					&& StringUtils.isNotBlank(establecimientoExpediente.getAgenciaData().getIdOrigenOfiPrincipal())) {
				initForm.setIdOrigenOficinaPpal(establecimientoExpediente.getAgenciaData().getIdOrigenOfiPrincipal());
			}
			if (establecimientoExpediente.getTipoEstablecimiento() != null && Constantes.AGENCIA_VIAJE
					.equalsIgnoreCase(establecimientoExpediente.getTipoEstablecimiento().getIdTipoEstablecimiento())) {
				enableSelectCountry = true;
			}
		}

		model.addAttribute("enableSelectCountry", enableSelectCountry);
		model.addAttribute("direccionExpediente", direccionExpediente);
		model.addAttribute("identificadorEstablecimiento", initForm.getIdentificadorEstablecimiento());

		return establecimientoExpediente;
	}

	protected void setListParticipantes(Model model, InitForm initForm) {
		Long tipoParticipantePrincipal = (long) Constantes.PARTICIPACION_SOLICITANTE;
		if (initForm.isExpedienteOficio()) {
			tipoParticipantePrincipal = (long) Constantes.PARTICIPACION_AFECTADO;
		}
		List<VistaDatosExpediente> listaParticipantesParticipacion = relExpTerService
				.findParticipaciones2(initForm.getIdExpediente(), tipoParticipantePrincipal);
		model.addAttribute("listaSearch", listaParticipantesParticipacion.get(0).getVistaTercerosList());
		ExpedienteBaseContoller.logger.info("[INICIO] Participantes " + listaParticipantesParticipacion.size()
				+ " para el expediente : " + initForm.getIdExpediente());
	}

	// Button Guardar
	public ResultAjaxOperation saveExpediente(InitForm initForm, HttpServletRequest request) {
		ProcedureActions procedureActions = getProcedureActions(initForm);

		// if can execute but hasn't another button,
		// -> execute action
		// else only update expediente
		Boolean execute = !procedureActions.hasSecondButton(initForm)
				&& procedureActions.isEnableExecuteAction(initForm);

		return save(initForm, request, execute);
	}

	public ResultAjaxOperation save(InitForm initForm, HttpServletRequest request, Boolean executeProcess) {
		ProcedureActions procedureActions = getProcedureActions(initForm);
		ResultAjaxOperation result = expedientesService.saveExpediente(initForm, procedureActions, request,
				executeProcess);
		if (result.getResult() == Constantes.AJAX_OK) {
			expedientesService.updateExpedienteTitle(initForm, ((SuccessResultAjaxOperation) result).getData(),
					getProcedureActions(initForm));
		}
		return result;
	}

	protected final void setTabsConfig(Model model, Procedimientos procedimientos, String currentPage) {
		model.addAttribute("currentPage", currentPage);
		ProcedureActions action = getProcedureActions(procedimientos.getCodProcedureId());
		if (action != null) {
			List<String> configs = action.getPestanaConfig();
			for (Iterator<String> iterator = configs.iterator(); iterator.hasNext();) {
				String configOption = iterator.next();
				model.addAttribute(configOption, configOption);
			}
		}
	}

	protected ProcedureActions getProcedureActions(String procedureCod) {
		ProcedureActions action = ProcedureActionFacade.getInstance().getProcedureAction(procedureCod, this);
		if (action == null) {
			action = ProcedureActionFacade.getInstance().getDefault();
		}
		return action;
	}

	protected ProcedureActions getProcedureActions(InitForm initForm) {
		ProcedureActions action = ProcedureActionFacade.getInstance().getProcedureAction(initForm.getProcedureCod(),
				this);
		if (action == null) {
			action = ProcedureActionFacade.getInstance().getDefault();
		}
		return action;
	}

	/*
	 * GETTER/SETTER
	 */

	public RelExpTerService getRelExpTerService() {
		return relExpTerService;
	}

	public void setRelExpTerService(RelExpTerService relExpTerService) {
		this.relExpTerService = relExpTerService;
	}

	@Override
	public ExpedientesService getExpedientesService() {
		return expedientesService;
	}

	public void setExpedientesService(ExpedientesService expedientesService) {
		this.expedientesService = expedientesService;
	}

	@Override
	public ProcedimientosService getProcedimientosService() {
		return procedimientosService;
	}

	public void setProcedimientosService(ProcedimientosService procedimientosService) {
		this.procedimientosService = procedimientosService;
	}

	@Override
	public DatosDireccionesService getDatosDireccionesService() {
		return datosDireccionesService;
	}

	public void setDatosDireccionesService(DatosDireccionesService datosDireccionesService) {
		this.datosDireccionesService = datosDireccionesService;
	}

	@Override
	public EstablecimientoService getEstablecimientoService() {
		return establecimientoService;
	}

	public void setEstablecimientoService(EstablecimientoService establecimientoService) {
		this.establecimientoService = establecimientoService;
	}

	@Override
	public AgenciaDataService getAgenciaDataService() {
		return agenciaDataService;
	}

	public void setAgenciaDataService(AgenciaDataService agenciaDataService) {
		this.agenciaDataService = agenciaDataService;
	}

	/**
	 * @return the generarPublicacionService
	 */
	public GenerarPublicacionService getGenerarPublicacionService() {
		return generarPublicacionService;
	}

	/**
	 * @param generarPublicacionService
	 *            the generarPublicacionService to set
	 */
	public void setGenerarPublicacionService(GenerarPublicacionService generarPublicacionService) {
		this.generarPublicacionService = generarPublicacionService;
	}

	public ParametrosConfigService getParametrosConfigService() {
		return parametrosConfigService;
	}

	public void setParametrosConfigService(ParametrosConfigService parametrosConfigService) {
		this.parametrosConfigService = parametrosConfigService;
	}

}
