package com.ejie.ab39a.control;

import java.util.List;

import javax.servlet.http.HttpSession;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.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.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;

import com.ejie.ab39a.constantes.Constantes;
import com.ejie.ab39a.constantes.TipoEntidadEnum;
import com.ejie.ab39a.exceptions.ErrorField;
import com.ejie.ab39a.exceptions.ErrorGenericoException;
import com.ejie.ab39a.model.Entidades;
import com.ejie.ab39a.model.PlanesEstrategicos;

import com.ejie.ab39a.seguridad.UtilSeguridad;
import com.ejie.ab39a.service.PlanesEstrategicosService;
import com.ejie.ab39a.validations.PlanesEstrategicosValidator;
import com.ejie.x38.control.bind.annotation.RequestJsonBody;
import com.ejie.x38.dto.JQGridRequestDto;
import com.ejie.x38.dto.JQGridResponseDto;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

/**
 * PlanesEstrategicosController.
 * 
 *  
 */

@Controller
@RequestMapping(value = "/planesestrategicos")

public class PlanesEstrategicosController {

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

    @Autowired
    private PlanesEstrategicosService planesEstrategicosService;

    @Autowired
    private PlanesEstrategicosValidator planesEstrategicosValidation;

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

    /**
     * Operacion CRUD Read. Devuelve el bean correspondiente al identificador indicado.
     * 
     * @param codplane
     *            Integer codigo plan estrategico
     * @return PlanesEstrategicos Objeto correspondiente al identificador indicado.
     */
    @RequestMapping(value = "/{codplane}", method = RequestMethod.GET)
    public @ResponseBody PlanesEstrategicos get(@PathVariable Integer codplane) {
        PlanesEstrategicos planesEstrategicos = new PlanesEstrategicos();
        planesEstrategicos.setCodplane(codplane);
        planesEstrategicos = this.planesEstrategicosService.find(planesEstrategicos);
        PlanesEstrategicosController.logger.info("[GET - findBy_PK] : Obtener PlanesEstrategicos por PK");
        return planesEstrategicos;
    }

    /**
     * Devuelve una lista de beans correspondientes a los valores de filtrados indicados en el
     * objeto pasado como parametro.
     *
     * @param filterPlanesEstrategicos
     *            PlanesEstrategicos Objeto que contiene los parametros de filtrado utilizados en la
     *            busqueda.
     * @return List<PlanesEstrategicos> Lista de objetos correspondientes a la busqueda realizada.
     */
    @RequestMapping(method = RequestMethod.GET)
    public @ResponseBody List<PlanesEstrategicos> getAll(@ModelAttribute PlanesEstrategicos filterPlanesEstrategicos) {
        PlanesEstrategicosController.logger.info("[GET - find_ALL] : Obtener PlanesEstrategicos por filtro");
        return this.planesEstrategicosService.findAll(filterPlanesEstrategicos, null);
    }

    /**
     * Operacion CRUD Edit. Modificacion del bean indicado.
     *
     * @param planesEstrategicos
     *            PlanesEstrategicos Bean que contiene la informacion a modificar.
     * @return PlanesEstrategicos Bean resultante de la modificacion.
     */
    @RequestMapping(method = RequestMethod.PUT)
    public @ResponseBody PlanesEstrategicos edit(@RequestBody PlanesEstrategicos planesEstrategicos) {
        PlanesEstrategicos planesEstrategicosAux = this.planesEstrategicosService.update(planesEstrategicos);
        PlanesEstrategicosController.logger.info("[PUT] : PlanesEstrategicos actualizado correctamente");
        return planesEstrategicosAux;
    }

    /**
     * Operacion CRUD Create. Creacion de un nuevo registro a partir del bean indicado.
     *
     * @param planesEstrategicos
     *            PlanesEstrategicos Bean que contiene la informacion con la que se va a crear el
     *            nuevo registro.
     * @return PlanesEstrategicos Bean resultante del proceso de creacion.
     */
    @RequestMapping(method = RequestMethod.POST)
    public @ResponseBody PlanesEstrategicos add(@RequestBody PlanesEstrategicos planesEstrategicos) {
        List<ErrorField> errores = this.planesEstrategicosValidation.validate(planesEstrategicos);
        if (!errores.isEmpty()) {
            throw new ErrorGenericoException(errores);
        }
        planesEstrategicos.setCodTecnico(UtilSeguridad.getUsuarioConectado().getTecnicosEntidad().getCodtecnico());
        PlanesEstrategicos planesEstrategicosAux = this.planesEstrategicosService.add(planesEstrategicos);
        PlanesEstrategicosController.logger.info("[POST] : PlanesEstrategicos insertado correctamente");
        return planesEstrategicosAux;
    }

    /**
     * Operacion CRUD Delete. Borrado del registro correspondiente al identificador especificado.
     *
     * @param codplane
     *            Integer Identificador del objeto que se desea eliminar.
     * @return PlanesEstrategicos Bean eliminado.
     */
    @RequestMapping(value = "/{codplane}", method = RequestMethod.DELETE)
    @ResponseStatus(value = HttpStatus.OK)
    public @ResponseBody PlanesEstrategicos remove(@PathVariable Integer codplane) {
        PlanesEstrategicos planesEstrategicos = new PlanesEstrategicos();
        planesEstrategicos.setCodplane(codplane);
        // this.planesEstrategicosService.remove(planesEstrategicos);
        PlanesEstrategicosController.logger.info("[DELETE] : PlanesEstrategicos borrado correctamente");
        return planesEstrategicos;
    }

    /*
     * METODOS COMPONENTE RUP_TABLE
     * 
     */

    /**
     * Metodo de presentacion del RUP_TABLE.
     * 
     * @param volver
     *            Integer volver
     * @param session
     *            HttpSession session
     * @param model
     *            Model model
     * @return String String
     * @throws JsonProcessingException
     *             excepcion e
     */
    @RequestMapping(value = "/maint", method = RequestMethod.GET)
    public String getFormEdit(Model model, HttpSession session,
            @RequestParam(value = "volver", required = false) Integer volver) throws JsonProcessingException {
        PlanesEstrategicosController.logger.info("[GET - View] : planesestrategicos");

        String usuarioConectado = null;
        Entidades entidad = new Entidades();
        Integer tipoEntidad = null;
        Integer solicInfor = null;
        if (UtilSeguridad.getUsuarioConectado().isTecnicoEntidad()) {
            usuarioConectado = Constantes.USUARIO_TEC_ENTIDAD;
            entidad = UtilSeguridad.getUsuarioConectado().getTecnicosEntidad().getEntidadPrincipal();
            tipoEntidad = entidad.getTipoEntidad();
            solicInfor = entidad.getSolicInfor();
            model.addAttribute("entidad", new ObjectMapper().writeValueAsString(entidad));
            model.addAttribute("tipoEntidad", tipoEntidad);
            model.addAttribute("solicInfor", solicInfor);
        } else if (UtilSeguridad.getUsuarioConectado().isTecnicoHps()) {
            usuarioConectado = Constantes.USUARIO_HPS;
        }
        PlanesEstrategicos planNuevo = new PlanesEstrategicos();
        planNuevo.setSolitudTxostena(-1);
        if (volver == null) {
            session.setAttribute("isVolver", 0);
            session.removeAttribute("planEst");
            model.addAttribute("planEst", planNuevo);
        } else {
            session.setAttribute("isVolver", volver);
            model.addAttribute("planEst", session.getAttribute("filtroPlanE"));
        }
        model.addAttribute("usuarioConectado", usuarioConectado);
        model.addAttribute("herri_administrazioa_id", TipoEntidadEnum.HERRI_ADMINISTRAZIOA.getId());

        return "planesestrategicos";
    }

    /**
     * Copiar plan estrategico
     * 
     * @param model
     *            Model model
     * @return String String
     * @throws JsonProcessingException
     *             exception e
     */
    @RequestMapping(value = "/copiarplane", method = RequestMethod.GET)
    public String copiarPlanE(Model model) throws JsonProcessingException {
        PlanesEstrategicosController.logger.info("[GET - View] : planesestrategicos");

        String usuarioConectado = null;
        Entidades entidad = new Entidades();
        Integer tipoEntidad = null;
        if (UtilSeguridad.getUsuarioConectado().isTecnicoEntidad()) {
            usuarioConectado = Constantes.USUARIO_TEC_ENTIDAD;
            entidad = UtilSeguridad.getUsuarioConectado().getEntidadPrincipal();
            tipoEntidad = entidad.getTipoEntidad();
            model.addAttribute("entidad", new ObjectMapper().writeValueAsString(entidad));
            model.addAttribute("tipoEntidad", tipoEntidad);
        } else if (UtilSeguridad.getUsuarioConectado().isTecnicoHps()) {
            usuarioConectado = Constantes.USUARIO_HPS;
        }

        model.addAttribute("usuarioConectado", usuarioConectado);
        model.addAttribute("herri_administrazioa_id", TipoEntidadEnum.HERRI_ADMINISTRAZIOA.getId());

        return "copiarplaneDialog";
    }

    /**
     * get Versiones
     * 
     * @param model
     *            Model model
     * @param codplane
     *            Integer codplane
     * @return String String
     * @throws JsonProcessingException
     *             exception e
     */
    @RequestMapping(value = "/versiones/{codplane}", method = RequestMethod.GET)
    public String getTablaVersiones(Model model, @PathVariable Integer codplane) throws JsonProcessingException {
        model.addAttribute("codplane", codplane);
        return "versionesDialog";
    }

    /**
     * Operacion de filtrado del componente RUP_TABLE.
     * 
     * @param filterPlanesEstrategicos
     *            PlanesEstrategicos Bean que contiene los parametros de filtrado a emplear.
     * @param jqGridRequestDto
     *            Dto que contiene los parametros de configuracion propios del RUP_TABLE a aplicar
     *            en el filtrado.
     * @param session
     *            HttpSession session
     * @return JQGridResponseDto<PlanesEstrategicos> Dto que contiene el resultado del filtrado
     *         realizado por el componente RUP_TABLE.
     */
    @RequestMapping(value = "/filter", method = RequestMethod.POST)
    public @ResponseBody JQGridResponseDto<PlanesEstrategicos> filter(
            @RequestJsonBody(param = "filter") PlanesEstrategicos filterPlanesEstrategicos,
            @RequestJsonBody JQGridRequestDto jqGridRequestDto, HttpSession session) {

        String usuarioConectado = null;
        if (UtilSeguridad.getUsuarioConectado().isTecnicoEntidad()) {
            usuarioConectado = Constantes.USUARIO_TEC_ENTIDAD;
            Entidades entidad = UtilSeguridad.getUsuarioConectado().getTecnicosEntidad().getEntidadPrincipal();
            filterPlanesEstrategicos.setEntidad(entidad);
            filterPlanesEstrategicos
                    .setCodTecnico(UtilSeguridad.getUsuarioConectado().getTecnicosEntidad().getCodtecnico());
        } else if (UtilSeguridad.getUsuarioConectado().isTecnicoHps()) {
            usuarioConectado = Constantes.USUARIO_HPS;
        }

        filterPlanesEstrategicos.setUsuarioConectado(usuarioConectado);
        PlanesEstrategicosController.logger.info("[POST - filter] : Obtener PlanesEstrategicoss");
        Integer isVolver = (Integer) session.getAttribute("isVolver");
        if (isVolver == null) {
            isVolver = 0;
        }
        if (isVolver == 1) {
            session.setAttribute("isVolver", 0);
        } else {
            session.setAttribute("filtrojqGridE", jqGridRequestDto);
            session.setAttribute("filtroPlanE", filterPlanesEstrategicos);
        }
        return this.planesEstrategicosService.filter(
                isVolver == 1 ? (PlanesEstrategicos) session.getAttribute("filtroPlanE") : filterPlanesEstrategicos,
                isVolver == 1 ? (JQGridRequestDto) session.getAttribute("filtrojqGridE") : jqGridRequestDto, false);

    }

    /**
     * Operacion de filtrado del componente RUP_TABLE.
     * 
     * @param filterPlanesEstrategicos
     *            PlanesEstrategicos Bean que contiene los parametros de filtrado a emplear.
     * @param jqGridRequestDto
     *            Dto que contiene los parametros de configuracion propios del RUP_TABLE a aplicar
     *            en el filtrado.
     * @param session
     *            HttpSession session
     * @return JQGridResponseDto<PlanesEstrategicos> Dto que contiene el resultado del filtrado
     *         realizado por el componente RUP_TABLE.
     */
    @RequestMapping(value = "/{entidad}/filter", method = RequestMethod.POST)
    public @ResponseBody JQGridResponseDto<PlanesEstrategicos> filterEntidad(
            @RequestJsonBody(param = "filter") PlanesEstrategicos filterPlanesEstrategicos,
            @RequestJsonBody JQGridRequestDto jqGridRequestDto, HttpSession session, @PathVariable Integer entidad) {

        Entidades entidadBean = new Entidades();
        entidadBean.setCodentidad(entidad);
        filterPlanesEstrategicos.setEntidad(entidadBean);

        filterPlanesEstrategicos.setUsuarioConectado(Constantes.USUARIO_HPS);
        PlanesEstrategicosController.logger.info("[POST - filter] : Obtener PlanesEstrategicoss");

        return this.planesEstrategicosService.filter(filterPlanesEstrategicos, jqGridRequestDto, false);

    }

    /**
     * filtrar versiones
     * 
     * @param filterPlanesEstrategicos
     *            PlanesEstrategicos filterPlanesEstrategicos
     * @param jqGridRequestDto
     *            JQGridRequestDto jqGridRequestDto
     * @param codplane
     *            Integer codplane
     * @return JQGridResponseDto<PlanesEstrategicos> JQGridResponseDto
     */
    @RequestMapping(value = "/versiones/{codplane}/filter", method = RequestMethod.POST)
    public @ResponseBody JQGridResponseDto<PlanesEstrategicos> filterVersiones(
            @RequestJsonBody(param = "filter") PlanesEstrategicos filterPlanesEstrategicos,
            @RequestJsonBody JQGridRequestDto jqGridRequestDto, @PathVariable Integer codplane) {

        // filterPlanesEstrategicos.setCodplane(codplane);

        PlanesEstrategicosController.logger.info("[POST - filter] : Obtener PlanesEstrategicoss");
        return this.planesEstrategicosService.getVersionesByPlanE(codplane, jqGridRequestDto, false);
    }

    /**
     * filtro copiar plan estrat
     * 
     * @param filterPlanesEstrategicos
     *            PlanesEstrategicos filterPlanesEstrategicos
     * @param jqGridRequestDto
     *            JQGridRequestDto jqGridRequestDto
     * @return JQGridResponseDto<PlanesEstrategicos> JQGridResponseDto
     */
    @RequestMapping(value = "/copiarplane/filter", method = RequestMethod.POST)
    public @ResponseBody JQGridResponseDto<PlanesEstrategicos> filterCopiarPlanE(
            @RequestJsonBody(param = "filter") PlanesEstrategicos filterPlanesEstrategicos,
            @RequestJsonBody JQGridRequestDto jqGridRequestDto) {

        List<Entidades> listaEntidadesTecnico = UtilSeguridad.getUsuarioConectado().getTecnicosEntidad()
                .getEntidadeses();
        if (listaEntidadesTecnico != null && !listaEntidadesTecnico.isEmpty()) {
            filterPlanesEstrategicos.setEntidades(listaEntidadesTecnico);
        }

        if (filterPlanesEstrategicos.getEntidad() == null) {
            filterPlanesEstrategicos.setEntidad(new Entidades());
        }
        filterPlanesEstrategicos.getEntidad()
                .setTipoEntidad(UtilSeguridad.getUsuarioConectado().getEntidadPrincipal().getTipoEntidad());
        filterPlanesEstrategicos
                .setCodTecnico(UtilSeguridad.getUsuarioConectado().getTecnicosEntidad().getCodtecnico());

        // filterPlanesEstrategicos.setEntidad(entidad);

        // String usuarioConectado = null;
        // if (UtilSeguridad.getUsuarioConectado().isTecnicoEntidad()) {
        // usuarioConectado = Constantes.USUARIO_TEC_ENTIDAD;
        // } else if (UtilSeguridad.getUsuarioConectado().isTecnicoHps()) {
        // usuarioConectado = Constantes.USUARIO_HPS;
        // }
        filterPlanesEstrategicos.setUsuarioConectado(Constantes.USUARIO_TEC_ENTIDAD);

        PlanesEstrategicosController.logger.info("[POST - filter] : Obtener PlanesEstrategicoss");
        return this.planesEstrategicosService.filterCopiar(filterPlanesEstrategicos, jqGridRequestDto, false);
    }

    /**
     * Borrado multiple de registros
     * 
     * @param filterPlanesEstrategicos
     *            PlanesEstrategicos Bean que contiene los parametros de filtrado a emplear.
     * @param jqGridRequestDto
     *            Dto que contiene los parametros de configuracion propios del RUP_TABLE a aplicar
     *            en la busqueda.
     * @return List<String> Lista de los identificadores de los registros eliminados.
     * 
     */
    @RequestMapping(value = "/deleteAll", method = RequestMethod.POST)
    @ResponseStatus(value = HttpStatus.OK)
    public @ResponseBody List<String> removeMultiple(
            @RequestJsonBody(param = "filter") PlanesEstrategicos filterPlanesEstrategicos,
            @RequestJsonBody JQGridRequestDto jqGridRequestDto) {
        PlanesEstrategicosController.logger
                .info("[POST - search] : [POST - removeMultiple] : Eliminar multiples PlanesEstrategicoss");
        this.planesEstrategicosService.removeMultiple(filterPlanesEstrategicos, jqGridRequestDto, false);
        PlanesEstrategicosController.logger.info("All entities correctly deleted!");

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

    /**
     * Operacion CRUD Edit. Modificacion del bean indicado. Solicitar informe
     * 
     * @param codplane
     *            Integer codplane
     * @param planesEstrategicos
     *            PlanesEstrategicos Bean que contiene la informacion a modificar.
     * @return PlanesEstrategicos Bean resultante de la modificacion.
     */
    @RequestMapping(value = "/editInforme/{codplane}", method = RequestMethod.GET)
    public @ResponseBody PlanesEstrategicos editInforme(@PathVariable Integer codplane) {
        PlanesEstrategicos planesEstrategicos = new PlanesEstrategicos();
        planesEstrategicos.setCodplane(codplane);
        // se recupera la version del plan
        planesEstrategicos = this.planesEstrategicosService.findPlanMaxVersionByCodPlan(planesEstrategicos);
        this.planesEstrategicosService.editInforme(planesEstrategicos);
        PlanesEstrategicosController.logger.info("[EDIT] : Solicitado el informe del plan estrategico");
        return planesEstrategicos;
    }

    /**
     * Operacion CRUD Edit. Modificacion del bean indicado. Solicitar informe
     * 
     * @param codplane
     *            Integer codplane
     * @param codVersion
     *            Integer codVersion modificar.
     * @return PlanesEstrategicos Bean resultante de la modificacion.
     */
    @RequestMapping(value = "/eliminarPlan/{codplane}/{codVersion}", method = RequestMethod.GET)
    public @ResponseBody PlanesEstrategicos eliminarPlan(@PathVariable Integer codplane,
            @PathVariable Integer codVersion) {
        PlanesEstrategicos planesEstrategicos = new PlanesEstrategicos();
        planesEstrategicos.setCodplane(codplane);
        planesEstrategicos.setCodVersion(codVersion);
        planesEstrategicos.setCodTecnico(UtilSeguridad.getUsuarioConectado().getTecnicosEntidad().getCodtecnico());
        // se recupera la version del plan
        this.planesEstrategicosService.darBajaplanE(planesEstrategicos);
        PlanesEstrategicosController.logger.info("[EDIT] : Plan estrategico borrado correctamente");
        return planesEstrategicos;
    }

    /**
     * Operacion CRUD Edit. Modificacion del bean indicado. Solicitar informe
     * 
     * @param codplane
     *            Integer codplane
     * @param codVersion
     *            Integer Bean que contiene la informacion a modificar.
     * @return Integer Integer
     */
    @RequestMapping(value = "/borraPlanTieneGestion/{codplane}/{codVersion}", method = RequestMethod.GET)
    public @ResponseBody Long borraPlanTieneGestion(@PathVariable Integer codplane, @PathVariable Integer codVersion) {
        PlanesEstrategicos planesEstrategicos = new PlanesEstrategicos();
        planesEstrategicos.setCodplane(codplane);
        planesEstrategicos.setCodVersion(codVersion);

        PlanesEstrategicosController.logger.info("[EDIT] : Solicitado el informe del plan estrategico");
        return planesEstrategicosService.borraPlanTieneGestion(planesEstrategicos);

    }

    /**
     * Operacion CRUD Read. Devuelve los planes estrategicos de la entidad correspondiente
     * 
     * @param codentidad
     *            Integer codigo entidad
     * @return List<PlanesEstrategicos> Objetos correspondiente al identificador indicado.
     */
    @RequestMapping(value = "/getComboPlanesEs/{codentidad}", method = RequestMethod.GET)
    public @ResponseBody List<PlanesEstrategicos> getComboPlanesEs(@PathVariable Integer codentidad) {
        PlanesEstrategicos planesEstrategicos = new PlanesEstrategicos();
        planesEstrategicos.setEntidad(new Entidades());
        planesEstrategicos.getEntidad().setCodentidad(codentidad);
        planesEstrategicos.setCodTecnico(UtilSeguridad.getUsuarioConectado().getTecnicosEntidad().getCodtecnico());

        PlanesEstrategicosController.logger.info("Se buscan planes estrategicos");
        return this.planesEstrategicosService.findAllCombo(planesEstrategicos, null);
    }

    /**
     * Operacion CRUD Read. Devuelve el bean correspondiente al identificador indicado.
     * 
     * @param codplane
     *            Integer codigo plan estrategico
     * @return PlanesEstrategicos Objeto correspondiente al identificador indicado.
     */
    @RequestMapping(value = { "/{codplane}", "/getFechas/{codplane}" }, method = RequestMethod.GET)
    public @ResponseBody PlanesEstrategicos getFechas(@PathVariable Integer codplane) {
        PlanesEstrategicos planesEstrategicos = new PlanesEstrategicos();
        planesEstrategicos.setCodplane(codplane);
        planesEstrategicos = this.planesEstrategicosService.findFechas(planesEstrategicos);
        PlanesEstrategicosController.logger.info("[GET - findBy_PK] : Obtener PlanesEstrategicos por PK");
        return planesEstrategicos;
    }

    /**
     * carga detalle plan e
     * 
     * @param model
     *            Model model
     * @param codplane
     *            Integer codplane
     * @param codversion
     *            Integer codversion
     * @return String String
     * @throws JsonProcessingException
     *             exception e
     */
    @RequestMapping(value = "/cargardetalleplane/{codplane}/{codversion}", method = RequestMethod.GET)
    public String cargarDetallePlanE(Model model, @PathVariable Integer codplane, @PathVariable Integer codversion)
            throws JsonProcessingException {
        PlanesEstrategicosController.logger.info("[GET - View] : cargarDetallePlanE");

        String usuarioConectado = null;
        Entidades entidad = new Entidades();
        Integer tipoEntidad = null;
        if (UtilSeguridad.getUsuarioConectado().isTecnicoEntidad()) {
            usuarioConectado = Constantes.USUARIO_TEC_ENTIDAD;
            entidad = UtilSeguridad.getUsuarioConectado().getEntidadPrincipal();
            tipoEntidad = entidad.getTipoEntidad();
            // model.addAttribute("entidad", new
            // ObjectMapper().writeValueAsString(entidad));
            model.addAttribute("entidad", entidad);
            model.addAttribute("tipoEntidad", tipoEntidad);
        } else if (UtilSeguridad.getUsuarioConectado().isTecnicoHps()) {
            usuarioConectado = Constantes.USUARIO_HPS;
        }

        model.addAttribute("usuarioConectado", usuarioConectado);
        model.addAttribute("herri_administrazioa_id", TipoEntidadEnum.HERRI_ADMINISTRAZIOA.getId());

        PlanesEstrategicos planesEstrategicos = new PlanesEstrategicos();
        planesEstrategicos.setCodTecnico(UtilSeguridad.getUsuarioConectado().getTecnicosEntidad().getCodtecnico());
        planesEstrategicos.setCodplane(codplane);
        planesEstrategicos.setCodVersion(codversion);
        planesEstrategicos = this.planesEstrategicosService.find(planesEstrategicos);
        model.addAttribute("planesEstrategicos", planesEstrategicos);

        return "copiaraltaplaneDialog";
    }

    /**
     * crear copia del plan estrategico
     * 
     * @param planesEstrategicos
     *            PlanesEstrategicos planesEstrategicos
     * @return PlanesEstrategicos PlanesEstrategicos
     */
    @RequestMapping(value = { "/crearcopiaplane" }, method = RequestMethod.POST)
    public @ResponseBody PlanesEstrategicos crearCopiaPlanEstrategico(
            @RequestBody PlanesEstrategicos planesEstrategicos) {

        List<ErrorField> errores = this.planesEstrategicosValidation.validate(planesEstrategicos);
        if (!errores.isEmpty()) {
            throw new ErrorGenericoException(errores);
        }
        planesEstrategicos.setCodTecnico(UtilSeguridad.getUsuarioConectado().getTecnicosEntidad().getCodtecnico());
        PlanesEstrategicos planesEstrategicos2 = this.planesEstrategicosService
                .crearCopiaPlanEstrategico(planesEstrategicos);

        PlanesEstrategicosController.logger.info("[POST - crearCopiaPlanE] : Crea una copia del plan estratégico");

        return planesEstrategicos2;
    }

}
