ec.gob.ceaaces.controller.MallasController.java Source code

Java tutorial

Introduction

Here is the source code for ec.gob.ceaaces.controller.MallasController.java

Source

/*
 * 
 * Desarrollado por: eteran
 * 
 * Copyright (c) 2013-2014 CEAACESS All Rights Reserved.
 * 
 * This software is the confidential and proprietary information of CEAACESS.
 * ("Confidential Information"). You shall not disclose such Confidential
 * Information and shall use it only in accordance with the terms of the license
 * agreement you entered into with CEAACES.
 * 
 * CEAACES MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
 * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
 * NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
 * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
 * DERIVATIVES.
 */
package ec.gob.ceaaces.controller;

import java.io.ByteArrayOutputStream;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeSet;

import javax.annotation.PostConstruct;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.JRXlsExporter;
import net.sf.jasperreports.export.SimpleExporterInput;
import net.sf.jasperreports.export.SimpleOutputStreamExporterOutput;
import net.sf.jasperreports.export.SimpleXlsReportConfiguration;

import org.apache.commons.lang.SerializationUtils;
import org.primefaces.component.datatable.DataTable;
import org.primefaces.context.RequestContext;
import org.primefaces.event.data.FilterEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContextHolder;

import ec.gob.ceaaces.catalogo.dtos.catalogos.AuditoriaDTO;
import ec.gob.ceaaces.catalogo.dtos.catalogos.FaseIesDTO;
import ec.gob.ceaaces.catalogo.dtos.catalogos.IesDTO;
import ec.gob.ceaaces.catalogo.exceptions.ServicioException;
import ec.gob.ceaaces.institutos.dtos.evaluacion.AsignaturaDTO;
import ec.gob.ceaaces.institutos.dtos.evaluacion.AsignaturasPorNivelDTO;
import ec.gob.ceaaces.institutos.dtos.evaluacion.InformacionCarreraDTO;
import ec.gob.ceaaces.institutos.dtos.evaluacion.InformacionIesDTO;
import ec.gob.ceaaces.institutos.dtos.evaluacion.MallaCurricularDTO;
import ec.gob.ceaaces.institutos.dtos.evaluacion.OrganizacionCurricularDTO;
import ec.gob.ceaaces.institutos.dtos.evaluacion.RequisitoAsignaturaDTO;
import ec.gob.ceaaces.institutos.dtos.evaluacion.SedeIesDTO;
import ec.gob.ceaaces.institutos.enumeraciones.AreaFormacionEnum;
import ec.gob.ceaaces.institutos.enumeraciones.AreaFormacionOrganizacionEnum;
import ec.gob.ceaaces.institutos.enumeraciones.OrganizacionMallaEnum;
import ec.gob.ceaaces.institutos.enumeraciones.TipoAsignaturaEnum;
import ec.gob.ceaaces.institutos.enumeraciones.TipoRequisitoMallaEnum;
import ec.gob.ceaaces.services.RegistroServicio;
import ec.gob.ceaaces.util.JsfUtil;

/**
 * Class description goes here.
 * 
 * @author eteran
 * 
 */
public class MallasController implements Serializable {

    /**
     * classVar1 documentation comment serialVersionUID...
     */

    private static final long serialVersionUID = 6732728257389169868L;

    private boolean verTablaHijas;
    private boolean verNuevaMalla;
    private boolean esCopiaMalla;
    private Double creditosAsignatura;
    private Double totalCreditos;
    private Double totalCreditosHijas;
    private String usuarioSistema;
    private String tipoAsignatura;
    private Long idSede;
    private Long idSedeImportacion;

    private static final SelectItem[] ORGANIZACION_MALLA = {
            new SelectItem(OrganizacionMallaEnum.BIMESTRE.getValue().toString(), "Bimestres"),
            new SelectItem(OrganizacionMallaEnum.TRIMESTRES.getValue().toString(), "Trimestres"),
            new SelectItem(OrganizacionMallaEnum.CUATRIMESTRES.getValue().toString(), "Cuatrimestres"),
            new SelectItem(OrganizacionMallaEnum.SEMESTRES.getValue().toString(), "Semestres"),
            new SelectItem(OrganizacionMallaEnum.ANIOS.getValue().toString(), "Aos") };
    private final List<SelectItem> niveles = new ArrayList<>();

    private IesDTO ies;
    private InformacionIesDTO infoIes;
    private InformacionCarreraDTO carreraSeleccionada;
    private InformacionCarreraDTO carreraSeleccionadaImportacion;
    private List<SedeIesDTO> sedesImportacion = new ArrayList<>();
    private MallaCurricularDTO mallaSeleccionada;
    private MallaCurricularDTO mallaCrearEditar = new MallaCurricularDTO();
    private AsignaturaDTO materiaSeleccionada;
    private AsignaturaDTO preSeleccionado;
    private AsignaturaDTO coSeleccionado;
    private RequisitoAsignaturaDTO reqSeleccionado;

    private List<InformacionCarreraDTO> carreras;
    private List<InformacionCarreraDTO> carrerasImportacion;
    private List<MallaCurricularDTO> mallas;
    private List<MallaCurricularDTO> mallasImportacion = new ArrayList<>();
    private List<AsignaturaDTO> materias;
    private List<AsignaturaDTO> preRequisitos;
    private List<AsignaturaDTO> coRequisitos;
    private List<RequisitoAsignaturaDTO> requisitos;
    private List<RequisitoAsignaturaDTO> requisitosRemovidos;
    private List<OrganizacionCurricularDTO> organizacionCurricular;
    private List<AsignaturaDTO> materiasFiltros;
    private List<AsignaturaDTO> preRequisitosFiltros;
    private List<AsignaturaDTO> coRequisitosFiltros;
    private String organizacionMallaSelect = "0";
    private String numeroNivelesSelect = "0";

    private String nombreComponente;
    private Integer opcionRequisito;
    private AsignaturaDTO asignatura;
    private AsignaturaDTO hijaAsignatura;
    private AsignaturaDTO padreAsignatura;
    private List<AsignaturaDTO> hijas;

    private List<String> tiposAsignatura;
    private List<String> areasDeFormacion;
    private List<Integer> nivelesMallaSeleccionada;

    private Map<String, String> filtrosTablaAsignaturas;
    private DataTable tablaAsignaturas;
    private byte[] reporteBytes = null;
    private FaseIesDTO faseIesDTO = new FaseIesDTO();
    private Boolean alertaUsuarioIes = false;
    private Boolean alertaFaseRectificacion = false;
    private String perfil;

    @Autowired
    private RegistroServicio registroServicio;

    public MallasController() {

        ies = new IesDTO();
        infoIes = new InformacionIesDTO();
        carreraSeleccionada = new InformacionCarreraDTO();
        mallaSeleccionada = new MallaCurricularDTO();
        materiaSeleccionada = new AsignaturaDTO();
        preSeleccionado = new AsignaturaDTO();
        coSeleccionado = new AsignaturaDTO();
        reqSeleccionado = new RequisitoAsignaturaDTO();

        carreras = new ArrayList<>();
        mallas = new ArrayList<>();
        materias = new ArrayList<>();
        preRequisitos = new ArrayList<>();
        coRequisitos = new ArrayList<>();
        requisitos = new ArrayList<>();
        requisitosRemovidos = new ArrayList<>();
        materiasFiltros = new ArrayList<>();
        preRequisitosFiltros = new ArrayList<>();
        coRequisitosFiltros = new ArrayList<>();

        padreAsignatura = new AsignaturaDTO();
        hijaAsignatura = new AsignaturaDTO();
        asignatura = new AsignaturaDTO();
        tiposAsignatura = new ArrayList<>();
        hijas = new ArrayList<>();
        areasDeFormacion = new ArrayList<>();
        organizacionCurricular = new ArrayList<>();
        nivelesMallaSeleccionada = new ArrayList<>();

        filtrosTablaAsignaturas = new HashMap<>();
        tablaAsignaturas = new DataTable();

    }

    /**
     * @return the tablaAsignaturas
     */
    public DataTable getTablaAsignaturas() {
        return tablaAsignaturas;
    }

    /**
     * @param tablaAsignaturas
     *            the tablaAsignaturas to set
     */
    public void setTablaAsignaturas(DataTable tablaAsignaturas) {
        this.tablaAsignaturas = tablaAsignaturas;
    }

    /**
     * @return the filtrosTablaAsignaturas
     */
    public Map<String, String> getFiltrosTablaAsignaturas() {
        return filtrosTablaAsignaturas;
    }

    /**
     * @param filtrosTablaAsignaturas
     *            the filtrosTablaAsignaturas to set
     */
    public void setFiltrosTablaAsignaturas(Map<String, String> filtrosTablaAsignaturas) {
        this.filtrosTablaAsignaturas = filtrosTablaAsignaturas;
    }

    /**
     * @return the tipoAsignatura
     */
    public String getTipoAsignatura() {
        return tipoAsignatura;
    }

    /**
     * @param tipoAsignatura
     *            the tipoAsignatura to set
     */
    public void setTipoAsignatura(String tipoAsignatura) {
        this.tipoAsignatura = tipoAsignatura;
    }

    /**
     * @return the verTablaHijas
     */
    public boolean isVerTablaHijas() {
        return verTablaHijas;
    }

    /**
     * @param verTablaHijas
     *            the verTablaHijas to set
     */
    public void setVerTablaHijas(boolean verTablaHijas) {
        this.verTablaHijas = verTablaHijas;
    }

    /**
     * @return the creditosAsignatura
     */
    public Double getCreditosAsignatura() {
        return creditosAsignatura;
    }

    /**
     * @param creditosAsignatura
     *            the creditosAsignatura to set
     */
    public void setCreditosAsignatura(Double creditosAsignatura) {
        this.creditosAsignatura = creditosAsignatura;
    }

    /**
     * @return the verNuevaMalla
     */
    public boolean isVerNuevaMalla() {
        return verNuevaMalla;
    }

    /**
     * @param verNuevaMalla
     *            the verNuevaMalla to set
     */
    public void setVerNuevaMalla(boolean verNuevaMalla) {
        this.verNuevaMalla = verNuevaMalla;
    }

    /**
     * @param nivelesMallaSeleccionada
     *            the nivelesMallaSeleccionada to set
     */
    public void setNivelesMallaSeleccionada(List<Integer> nivelesMallaSeleccionada) {
        this.nivelesMallaSeleccionada = nivelesMallaSeleccionada;
    }

    /**
     * @return the nivelesMallaSeleccionada
     */
    public List<Integer> getNivelesMallaSeleccionada() {
        return nivelesMallaSeleccionada;
    }

    /**
     * @return the totalCreditosHijas
     */
    public Double getTotalCreditosHijas() {
        return totalCreditosHijas;
    }

    /**
     * @param totalCreditosHijas
     *            the totalCreditosHijas to set
     */
    public void setTotalCreditosHijas(Double totalCreditosHijas) {
        this.totalCreditosHijas = totalCreditosHijas;
    }

    /**
     * @return the totalCreditos
     */
    public Double getTotalCreditos() {
        return totalCreditos;
    }

    /**
     * @param totalCreditos
     *            the totalCreditos to set
     */
    public void setTotalCreditos(Double totalCreditos) {
        this.totalCreditos = totalCreditos;
    }

    public void pasarMalla(MallaCurricularDTO malla1) {
        ReporteController iController = (ReporteController) FacesContext.getCurrentInstance().getExternalContext()
                .getSessionMap().get("reporteController");
        iController.setMalla(malla1);
        iController.generarReporte();
    }

    /**
     * @return the padreAsignatura
     */
    public AsignaturaDTO getPadreAsignatura() {
        return padreAsignatura;
    }

    /**
     * @param padreAsignatura
     *            the padreAsignatura to set
     */
    public void setPadreAsignatura(AsignaturaDTO padreAsignatura) {
        this.padreAsignatura = padreAsignatura;

        if (TipoAsignaturaEnum.ASIGNATURA_COMPUESTA.getValue().equals(padreAsignatura.getTipoAsignatura())) {
            obtenerAsignatura(false);
            validarCreditosCompuesta();
        }
    }

    /**
     * @return the requisitosRemovidos
     */
    public List<RequisitoAsignaturaDTO> getRequisitosRemovidos() {
        return requisitosRemovidos;
    }

    /**
     * @param requisitosRemovidos
     *            the requisitosRemovidos to set
     */
    public void setRequisitosRemovidos(List<RequisitoAsignaturaDTO> requisitosRemovidos) {
        this.requisitosRemovidos = requisitosRemovidos;
    }

    /**
     * @return the idSede
     */
    public Long getIdSede() {
        return idSede;
    }

    /**
     * @param idSede
     *            the idSede to set
     */
    public void setIdSede(Long idSede) {
        this.idSede = idSede;
    }

    /**
     * @return the preRequisitosFiltros
     */
    public List<AsignaturaDTO> getPreRequisitosFiltros() {
        return preRequisitosFiltros;
    }

    /**
     * @return the coRequisitosFiltros
     */
    public List<AsignaturaDTO> getCoRequisitosFiltros() {
        return coRequisitosFiltros;
    }

    /**
     * @param preRequisitosFiltros
     *            the preRequisitosFiltros to set
     */
    public void setPreRequisitosFiltros(List<AsignaturaDTO> preRequisitosFiltros) {
        this.preRequisitosFiltros = preRequisitosFiltros;
    }

    /**
     * @param coRequisitosFiltros
     *            the coRequisitosFiltros to set
     */
    public void setCoRequisitosFiltros(List<AsignaturaDTO> coRequisitosFiltros) {
        this.coRequisitosFiltros = coRequisitosFiltros;
    }

    /**
     * @return the materiasFiltros
     */
    public List<AsignaturaDTO> getMateriasFiltros() {
        return materiasFiltros;
    }

    /**
     * @param materiasFiltros
     *            the materiasFiltros to set
     */
    public void setMateriasFiltros(List<AsignaturaDTO> materiasFiltros) {
        this.materiasFiltros = materiasFiltros;
    }

    /**
     * @return the reqSeleccionado
     */
    public RequisitoAsignaturaDTO getReqSeleccionado() {
        return reqSeleccionado;
    }

    /**
     * @param reqSeleccionado
     *            the reqSeleccionado to set
     */
    public void setReqSeleccionado(RequisitoAsignaturaDTO reqSeleccionado) {
        this.reqSeleccionado = reqSeleccionado;
    }

    /**
     * @return the requisitos
     */
    public List<RequisitoAsignaturaDTO> getRequisitos() {
        return requisitos;
    }

    /**
     * @param requisitos
     *            the requisitos to set
     */
    public void setRequisitos(List<RequisitoAsignaturaDTO> requisitos) {
        this.requisitos = requisitos;
    }

    /**
     * @return the preSeleccionado
     */
    public AsignaturaDTO getPreSeleccionado() {
        return preSeleccionado;
    }

    /**
     * @return the coSeleccionado
     */
    public AsignaturaDTO getCoSeleccionado() {
        return coSeleccionado;
    }

    /**
     * @param preSeleccionado
     *            the preSeleccionado to set
     */
    public void setPreSeleccionado(AsignaturaDTO preSeleccionado) {
        this.preSeleccionado = preSeleccionado;
    }

    /**
     * @param coSeleccionado
     *            the coSeleccionado to set
     */
    public void setCoSeleccionado(AsignaturaDTO coSeleccionado) {
        this.coSeleccionado = coSeleccionado;
    }

    /**
     * @return the materiaSeleccionada
     */
    public AsignaturaDTO getMateriaSeleccionada() {
        return materiaSeleccionada;
    }

    /**
     * @param materiaSeleccionada
     *            the materiaSeleccionada to set
     */
    public void setMateriaSeleccionada(AsignaturaDTO materiaSeleccionada) {
        this.materiaSeleccionada = materiaSeleccionada;
    }

    /**
     * @return the preRequisitos
     */
    public List<AsignaturaDTO> getPreRequisitos() {
        return preRequisitos;
    }

    /**
     * @return the coRequisitos
     */
    public List<AsignaturaDTO> getCoRequisitos() {
        return coRequisitos;
    }

    /**
     * @param preRequisitos
     *            the preRequisitos to set
     */
    public void setPreRequisitos(List<AsignaturaDTO> preRequisitos) {
        this.preRequisitos = preRequisitos;
    }

    /**
     * @param coRequisitos
     *            the coRequisitos to set
     */
    public void setCoRequisitos(List<AsignaturaDTO> coRequisitos) {
        this.coRequisitos = coRequisitos;
    }

    /**
     * @return the mallaSeleccionada
     */
    public MallaCurricularDTO getMallaSeleccionada() {
        return mallaSeleccionada;
    }

    /**
     * @param mallaSeleccionada
     *            the mallaSeleccionada to set
     */
    public void setMallaSeleccionada(MallaCurricularDTO mallaSeleccionada) {
        this.mallaSeleccionada = mallaSeleccionada;

        nivelesMallaSeleccionada.clear();

        for (int i = 0; i < this.mallaSeleccionada.getNumeroNiveles(); i++) {
            nivelesMallaSeleccionada.add(i + 1);
        }
    }

    /**
     * @return the carreraSeleccionada
     */
    public InformacionCarreraDTO getCarreraSeleccionada() {
        return carreraSeleccionada;
    }

    /**
     * @param carreraSeleccionada
     *            the carreraSeleccionada to set
     */
    public void setCarreraSeleccionada(InformacionCarreraDTO carreraSeleccionada) {
        this.carreraSeleccionada = carreraSeleccionada;
    }

    /**
     * @return the ies
     */
    public IesDTO getIes() {
        return ies;
    }

    /**
     * @return the infoIes
     */
    public InformacionIesDTO getInfoIes() {
        return infoIes;
    }

    /**
     * @param ies
     *            the ies to set
     */
    public void setIes(IesDTO ies) {
        this.ies = ies;
    }

    /**
     * @param infoIes
     *            the infoIes to set
     */
    public void setInfoIes(InformacionIesDTO infoIes) {
        this.infoIes = infoIes;
    }

    /**
     * @return the carreras
     */
    public List<InformacionCarreraDTO> getCarreras() {
        return carreras;
    }

    /**
     * @return the mallas
     */
    public List<MallaCurricularDTO> getMallas() {
        return mallas;
    }

    /**
     * @return the materias
     */
    public List<AsignaturaDTO> getMaterias() {
        return materias;
    }

    /**
     * @param carreras
     *            the carreras to set
     */
    public void setCarreras(List<InformacionCarreraDTO> carreras) {
        this.carreras = carreras;
    }

    /**
     * @param mallas
     *            the mallas to set
     */
    public void setMallas(List<MallaCurricularDTO> mallas) {
        this.mallas = mallas;
    }

    /**
     * @param materias
     *            the materias to set
     */
    public void setMaterias(List<AsignaturaDTO> materias) {
        this.materias = materias;
    }

    /**
     * @return the opcionRequisito
     */
    public Integer getOpcionRequisito() {
        return opcionRequisito;
    }

    /**
     * @return the asignatura
     */
    public AsignaturaDTO getAsignatura() {
        return asignatura;
    }

    /**
     * @return the hijaAsignatura
     */
    public AsignaturaDTO getHijaAsignatura() {
        return hijaAsignatura;
    }

    /**
     * @return the hijas
     */
    public List<AsignaturaDTO> getHijas() {
        return hijas;
    }

    /**
     * @return the tiposAsignatura
     */
    public List<String> getTiposAsignatura() {
        return tiposAsignatura;
    }

    public void importarMalla() {
        idSedeImportacion = null;
        carreraSeleccionadaImportacion = null;
        mallasImportacion.clear();
        sedesImportacion = new ArrayList<>();
        sedesImportacion = infoIes.getSedeIes();
        // for (SedeIesDTO sede : infoIes.getSedeIes()) {
        // if (!sede.getId().equals(idSede)) {
        // sedesImportacion.add((SedeIesDTO) SerializationUtils
        // .clone(sede));
        // }
        // }
    }

    /**
     * @param opcionRequisito
     *            the opcionRequisito to set...
     */
    public void setOpcionRequisito(Integer opcionRequisito) {
        this.opcionRequisito = opcionRequisito;

        if (TipoAsignaturaEnum.ASIGNATURA_COMPUESTA.getValue().equals(tipoAsignatura)) {
            obtenerAsignatura(false);
        }

        if (this.opcionRequisito.equals(1)) {

            verTablaHijas = false;
            asignatura.setTipoAsignatura(TipoAsignaturaEnum.ASIGNATURA_SIN_CREDITOS.getValue());

            if (!hijas.isEmpty()) {
                JsfUtil.msgAdvert("Al Guardar una " + tipoAsignatura + " como " + asignatura.getTipoAsignatura()
                        + " se eliminarn las asignaturas hijas");
            }
        }

        if (this.opcionRequisito.equals(2)) {

            verTablaHijas = false;
            asignatura.setTipoAsignatura(TipoAsignaturaEnum.ASIGNATURA_CON_CREDITOS.getValue());

            if (!hijas.isEmpty()) {
                JsfUtil.msgAdvert("Al Guardar una " + tipoAsignatura + " como " + asignatura.getTipoAsignatura()
                        + " se eliminarn las asignaturas hijas");
            }
        }

        if (asignatura.getId() == null) {
            hijas.clear();
            totalCreditosHijas = 0.0;
        }

        if (this.opcionRequisito.equals(3)) {
            verTablaHijas = true;
            asignatura.setTipoAsignatura(TipoAsignaturaEnum.ASIGNATURA_COMPUESTA.getValue());
        }

    }

    /**
     * @param asignatura
     *            the asignatura to set
     */
    public void setAsignatura(AsignaturaDTO asignatura) {
        this.asignatura = (AsignaturaDTO) SerializationUtils.clone(asignatura);

        if (asignatura != null && asignatura.getId() != null) {
            for (int i = 0; i < tiposAsignatura.size(); i++) {
                if (tiposAsignatura.get(i).equals(asignatura.getTipoAsignatura())) {
                    setOpcionRequisito(i + 1);
                    break;
                }
            }
        }

    }

    /**
     * @param hijaAsignatura
     *            the hijaAsignatura to set
     */
    public void setHijaAsignatura(AsignaturaDTO hijaAsignatura) {
        this.hijaAsignatura = hijaAsignatura;
    }

    /**
     * @param hijas
     *            the hijas to set
     */
    public void setHijas(List<AsignaturaDTO> hijas) {
        this.hijas = hijas;
    }

    /**
     * @param tiposAsignatura
     *            the tiposAsignatura to set
     */
    public void setTiposAsignatura(List<String> tiposAsignatura) {
        this.tiposAsignatura = tiposAsignatura;
    }

    /**
     * @return the areasDeFormacion
     */
    public List<String> getAreasDeFormacion() {
        return areasDeFormacion;
    }

    /**
     * @param areasDeFormacion
     *            the areasDeFormacion to set
     */
    public void setAreasDeFormacion(List<String> areasDeFormacion) {
        this.areasDeFormacion = areasDeFormacion;
    }

    /**
     * @return the organizacionCurricular
     */
    public List<OrganizacionCurricularDTO> getOrganizacionCurricular() {
        return organizacionCurricular;
    }

    /**
     * @param organizacionCurricular
     *            the organizacionCurricular to set
     */
    public void setOrganizacionCurricular(List<OrganizacionCurricularDTO> organizacionCurricular) {
        this.organizacionCurricular = organizacionCurricular;
    }

    @PostConstruct
    private void cargarIes() {
        usuarioSistema = SecurityContextHolder.getContext().getAuthentication().getName();

        for (TipoAsignaturaEnum tra : TipoAsignaturaEnum.values()) {
            tiposAsignatura.add(tra.getValue());
        }

        for (AreaFormacionEnum af : AreaFormacionEnum.values()) {
            areasDeFormacion.add(af.getValue());
        }

        ListaIesController controller = (ListaIesController) JsfUtil.obtenerObjetoSesion("listaIesController");

        faseIesDTO = controller.getFaseIesDTO();
        if (controller != null) {
            ies = controller.getIes();
            obtenerInformacionIes();
        }
        this.perfil = controller.getPerfil().getNombre();
        if (this.perfil.startsWith("IES_USUARIO")) {
            alertaUsuarioIes = true;
        }

        if (this.faseIesDTO.getTipo().name().startsWith("RECTIFICACION")) {
            alertaFaseRectificacion = true;
        }
    }

    private void obtenerInformacionIes() {
        try {
            infoIes = registroServicio.obtenerInformacionIesPorIes(ies);

            infoIes.getSedeIes().clear();

            infoIes.getSedeIes().addAll(registroServicio.obtenerSedesIes(infoIes.getId()));

        } catch (Exception e) {
            e.printStackTrace();
            return;
        }
    }

    public void cargarCarreras() {
        carreras.clear();
        mallas.clear();
        materias.clear();
        preRequisitos.clear();
        coRequisitos.clear();
        requisitos.clear();

        materiasFiltros.clear();
        preRequisitosFiltros.clear();
        coRequisitosFiltros.clear();

        mallaSeleccionada = new MallaCurricularDTO();
        materiaSeleccionada = new AsignaturaDTO();

        verNuevaMalla = false;

        if (idSede != null && idSede > 0) {
            try {
                carreras = registroServicio.obtenerInfCarreraPorSede(idSede, null);

                if (!carreras.isEmpty()) {
                    JsfUtil.msgInfo("Se encontraron " + carreras.size() + " carreras");
                }

            } catch (Exception e) {
                e.printStackTrace();
                JsfUtil.msgError("No se pudo obtoner las carreras");
                return;
            }
        } else {
            JsfUtil.msgAdvert("Debe seleccionar la matriz o extensin");
        }
    }

    public void cargarCarrerasImportacion() {
        mallasImportacion.clear();
        carreraSeleccionadaImportacion = null;
        if (idSedeImportacion != null && idSedeImportacion > 0) {
            try {
                carrerasImportacion = registroServicio.obtenerInfCarreraPorSede(idSedeImportacion, null);
                for (int i = 0; i < carrerasImportacion.size(); i++) {
                    if (carrerasImportacion.get(i).getId().equals(carreraSeleccionada.getId())) {
                        carrerasImportacion.remove(i);
                    }
                }
                if (!carrerasImportacion.isEmpty()) {
                    JsfUtil.msgInfo("Se encontraron " + carrerasImportacion.size() + " carreras");
                }
            } catch (Exception e) {
                e.printStackTrace();
                JsfUtil.msgError("No se pudo obtoner las carreras");
                return;
            }
        } else {
            JsfUtil.msgAdvert("Debe seleccionar la matriz o extensin");
        }
    }

    public void cargarMallas() {
        mallas.clear();
        materias.clear();
        preRequisitos.clear();
        coRequisitos.clear();
        requisitos.clear();
        materiasFiltros.clear();
        preRequisitosFiltros.clear();
        coRequisitosFiltros.clear();

        materiaSeleccionada = new AsignaturaDTO();
        mallaSeleccionada = new MallaCurricularDTO();

        verNuevaMalla = false;

        if (carreraSeleccionada != null && carreraSeleccionada.getId() != null) {
            try {
                mallas = registroServicio.obtenerMallaCurricular(carreraSeleccionada);
                for (MallaCurricularDTO malla : mallas) {
                    if (malla.getReforma() != null) {
                        for (MallaCurricularDTO mallaReforma : mallas) {
                            if (malla.getReforma().equals(mallaReforma.getId())) {
                                malla.setReformaTexto(
                                        "(" + mallaReforma.getCodigoUnico() + ") " + mallaReforma.getDescripcion());
                                break;
                            }
                        }
                    }
                }

                verNuevaMalla = true;

            } catch (Exception e) {
                e.printStackTrace();
                JsfUtil.msgError("No se pudo obtener las mallas");
                return;
            }
        } else {
            JsfUtil.msgAdvert("Debe seleccionar una carrera");
        }
    }

    public void cargarMallasImportacion() {
        if (carreraSeleccionadaImportacion != null && carreraSeleccionadaImportacion != null) {
            try {
                mallasImportacion = registroServicio.obtenerMallaCurricular(carreraSeleccionadaImportacion);
            } catch (Exception e) {
                e.printStackTrace();
                JsfUtil.msgError("Error al obtener las mallas, comunquese con el administrador del sistema");
                return;
            }
        } else {
            JsfUtil.msgAdvert("Debe seleccionar una carrera");
        }
    }

    public void cargarAsignaturas() {
        materias.clear();
        materiasFiltros.clear();
        materiaSeleccionada = new AsignaturaDTO();

        if (mallaSeleccionada != null && mallaSeleccionada.getId() != null) {
            try {
                List<AsignaturaDTO> materiasTemp = null;

                materiasTemp = registroServicio.obtenerAsignaturasPorMalla(mallaSeleccionada.getId());

                if (materiasTemp != null) {
                    for (AsignaturaDTO mat : materiasTemp) {
                        if (mat.getIdAsignaturaPadre() == null) {
                            materias.add(mat);
                        }
                    }
                }

                // Se suma los creditos de las asignaturas
                validarNumeroCreditos();

                materiasFiltros.addAll(materias);

            } catch (ServicioException e) {
                e.printStackTrace();
                JsfUtil.msgError("No se pudo obtener las asignaturas");
                return;
            }
        } else {
            JsfUtil.msgAdvert("Debe seleccionar una malla curricular");
            return;
        }

        // carga de organizacion curricular
        cargarOrganizacionCurricular();
    }

    private void validarNumeroCreditos() {
        totalCreditos = 0.0;

        for (AsignaturaDTO asi : materias) {
            if (asi.getNumeroCreditos() != null) {
                totalCreditos += asi.getNumeroCreditos();
            }
        }
    }

    // Valida que el total de creditos de las asignaturas hijas sea igual a la
    // asignatura padre
    private void validarCreditosCompuesta() {
        totalCreditosHijas = 0.0;

        for (AsignaturaDTO hija : hijas) {
            if (hija.getNumeroCreditos() != null && hija.getObligatorio()) {
                totalCreditosHijas += hija.getNumeroCreditos();
            }
        }
    }

    public void cargarRequisitos() {
        requisitos.clear();
        requisitosRemovidos.clear();
        preRequisitos.clear();
        coRequisitos.clear();
        preRequisitosFiltros.clear();
        coRequisitosFiltros.clear();

        if (materiaSeleccionada != null && materiaSeleccionada.getId() != null) {

            Long idMateriaSeleccionada = materiaSeleccionada.getId();

            try {
                materiaSeleccionada = registroServicio.obtenerAsignatura(idMateriaSeleccionada);
            } catch (ServicioException e) {
                e.printStackTrace();
                return;
            }

            // Pre requisitos temporal
            List<RequisitoAsignaturaDTO> presFalseTemp = new ArrayList<>();

            // Remove los pre requisitos asignaturas que son false
            for (RequisitoAsignaturaDTO pre : materiaSeleccionada.getPreRequisitoMalla()) {
                if (!pre.getActivo()) {
                    presFalseTemp.add(pre);
                }
            }

            materiaSeleccionada.getPreRequisitoMalla().removeAll(presFalseTemp);

            // Co requisitos temporal
            List<RequisitoAsignaturaDTO> cosFalseTemp = new ArrayList<>();

            // Remove los co requisitos asignaturas que son false
            for (RequisitoAsignaturaDTO co : materiaSeleccionada.getCorRequisitoMalla()) {
                if (!co.getActivo()) {
                    cosFalseTemp.add(co);
                }
            }

            materiaSeleccionada.getCorRequisitoMalla().removeAll(cosFalseTemp);

            for (AsignaturaDTO mat : materias) {

                // Si una asignatura(mat) es de tipo
                // "asginatura sin creditos" no tendra nivel y por lo tanto
                // no debe agregarse
                if (null != mat.getNivelMateria()) {

                    // Se agregan como pre requisitos, todas las
                    // asignaturas(materias) cuyo nivelMateria
                    // es menor al nivel de la materiaSeleccionada
                    if (mat.getNivelMateria() < materiaSeleccionada.getNivelMateria()) {
                        preRequisitos.add(mat);
                    }

                    // Se agregan como co requisitos, todas las
                    // asignaturas(materias) cuyo nivelMateria
                    // es igual al nivel de la materiaSeleccionada
                    if (mat.getNivelMateria().equals(materiaSeleccionada.getNivelMateria())
                            && !mat.getId().equals(materiaSeleccionada.getId())) {
                        coRequisitos.add(mat);
                    }
                }
            }

            // Remove de preRequisitos los pre requisitos existentes de la
            // materiaSeleccionada
            List<AsignaturaDTO> presTemp = new ArrayList<>();

            for (RequisitoAsignaturaDTO pre : materiaSeleccionada.getPreRequisitoMalla()) {

                for (AsignaturaDTO as : preRequisitos) {
                    if (as.getId().equals(pre.getAsignaturaRequisitoDTO().getId())) {
                        presTemp.add(as);
                    }
                }
            }

            if (!presTemp.isEmpty()) {
                preRequisitos.removeAll(presTemp);
            }

            // Remove de coRequisitos los co requisitos existentes de la
            // materiaSeleccionada
            List<AsignaturaDTO> cosTemp = new ArrayList<>();

            for (RequisitoAsignaturaDTO co : materiaSeleccionada.getCorRequisitoMalla()) {

                for (AsignaturaDTO as : coRequisitos) {
                    if (as.getId().equals(co.getAsignaturaRequisitoDTO().getId())) {
                        cosTemp.add(as);
                    }
                }
            }

            if (!cosTemp.isEmpty()) {
                coRequisitos.removeAll(cosTemp);
            }

            preRequisitosFiltros.addAll(preRequisitos);
            coRequisitosFiltros.addAll(coRequisitos);

            // Se agregan los pre y co requisitos en una sola lista
            requisitos.addAll(materiaSeleccionada.getPreRequisitoMalla());
            requisitos.addAll(requisitos.size(), materiaSeleccionada.getCorRequisitoMalla());

        } else {
            JsfUtil.msgAdvert("Debe seleccionar una asignatura");
        }
    }

    public void cargarRequisitosAsignatura() {

        if (alertaFaseRectificacion && alertaUsuarioIes) {
            if (materiaSeleccionada.getId() != null
                    && !materiaSeleccionada.getFaseIesDTO().getTipo().name().startsWith("RECTIFICACION")) {
                JsfUtil.msgError("No se puede modificar esta informacin en fase de Rectificacin.");
                return;
            }
        }

        RequisitoAsignaturaDTO reqAsignatura = new RequisitoAsignaturaDTO();

        reqAsignatura.setAsignaturaDTO(materiaSeleccionada);
        reqAsignatura.setActivo(true);

        if (preSeleccionado != null && preSeleccionado.getId() != null) {
            reqAsignatura.setTipoEnum(TipoRequisitoMallaEnum.PRE);
            reqAsignatura.setAsignaturaRequisitoDTO(preSeleccionado);

            // Remove un pre requisito seleccionado de preRequisitos
            for (int i = 0; i < preRequisitos.size(); i++) {
                if (preRequisitos.get(i).getId().equals(preSeleccionado.getId())) {
                    preRequisitos.remove(i);
                    break;
                }
            }

            // Remove un pre requisito seleccionado de preRequisitosFiltros
            for (int i = 0; i < preRequisitosFiltros.size(); i++) {
                if (preRequisitosFiltros.get(i).getId().equals(preSeleccionado.getId())) {
                    preRequisitosFiltros.remove(i);
                    break;
                }
            }

            JsfUtil.msgInfo("Pre-requisito seleccionado: " + preSeleccionado.getCodigo());
        }

        if (coSeleccionado != null && coSeleccionado.getId() != null) {
            reqAsignatura.setTipoEnum(TipoRequisitoMallaEnum.COR);
            reqAsignatura.setAsignaturaRequisitoDTO(coSeleccionado);

            // Remove un co requisito seleccionado de coRequisitos
            for (int i = 0; i < coRequisitos.size(); i++) {
                if (coRequisitos.get(i).getId().equals(coSeleccionado.getId())) {
                    coRequisitos.remove(i);
                    break;
                }
            }

            // Remove un co requisito seleccionado de coRequisitosFiltros
            for (int i = 0; i < coRequisitosFiltros.size(); i++) {
                if (coRequisitosFiltros.get(i).getId().equals(coSeleccionado.getId())) {
                    coRequisitosFiltros.remove(i);
                    break;
                }
            }

            JsfUtil.msgInfo("Co-requisito seleccionado: " + coSeleccionado.getCodigo());
        }

        preSeleccionado = new AsignaturaDTO();
        coSeleccionado = new AsignaturaDTO();

        // Primero: remove requisito si existe
        for (int i = 0; i < requisitos.size(); i++) {
            if (requisitos.get(i).getAsignaturaRequisitoDTO().getId()
                    .equals(reqAsignatura.getAsignaturaRequisitoDTO().getId())) {
                requisitos.remove(i);
                break;
            }
        }

        // Segundo: se agrega el requisito
        requisitos.add(reqAsignatura);

    }

    public void quitarRequisito() {

        if (alertaFaseRectificacion && alertaUsuarioIes) {
            if (reqSeleccionado.getId() != null
                    && !reqSeleccionado.getFaseIesDTO().getTipo().name().startsWith("RECTIFICACION")) {
                JsfUtil.msgError("No se puede modificar esta informacin en fase de Rectificacin.");
                return;
            }
        }

        if (reqSeleccionado != null && reqSeleccionado.getAsignaturaRequisitoDTO() != null
                && reqSeleccionado.getAsignaturaRequisitoDTO().getId() != null) {

            for (int i = 0; i < requisitos.size(); i++) {
                if (requisitos.get(i) != null) {
                    if (requisitos.get(i).getAsignaturaRequisitoDTO().getId()
                            .equals(reqSeleccionado.getAsignaturaRequisitoDTO().getId())) {
                        requisitos.remove(i);
                        break;
                    }
                }
            }

            if (reqSeleccionado.getTipoEnum().equals(TipoRequisitoMallaEnum.PRE)) {
                preRequisitos.add(reqSeleccionado.getAsignaturaRequisitoDTO());
                preRequisitosFiltros.add(reqSeleccionado.getAsignaturaRequisitoDTO());

                JsfUtil.msgInfo(
                        "Pre-requisito disponible: " + reqSeleccionado.getAsignaturaRequisitoDTO().getCodigo());

            }

            if (reqSeleccionado.getTipoEnum().equals(TipoRequisitoMallaEnum.COR)) {
                coRequisitos.add(reqSeleccionado.getAsignaturaRequisitoDTO());
                coRequisitosFiltros.add(reqSeleccionado.getAsignaturaRequisitoDTO());

                JsfUtil.msgInfo(
                        "Co-requisito disponible: " + reqSeleccionado.getAsignaturaRequisitoDTO().getCodigo());

            }

            if (reqSeleccionado.getId() != null) {
                reqSeleccionado.setActivo(false);
                requisitosRemovidos.add(reqSeleccionado);
            }

            reqSeleccionado = new RequisitoAsignaturaDTO();

        } else {
            JsfUtil.msgAdvert("Debe seleccionar un requisito");
        }
    }

    public void nuevaMalla(ActionEvent evt) {
        this.mallaCrearEditar = (MallaCurricularDTO) SerializationUtils.clone(new MallaCurricularDTO());
        cargarOrganizacionesVacias(mallaCrearEditar);
        organizacionMallaSelect = "0";
        numeroNivelesSelect = "0";
    }

    public void editarMalla(MallaCurricularDTO malla, Boolean idEditMalla) {
        System.out.println("esCopiaMalla.." + idEditMalla);
        // if (idEditMalla) {
        // if (alertaFaseRectificacion && alertaUsuarioIes) {
        // if (malla.getId() != null
        // && !malla.getFaseIesDTO().getTipo().name()
        // .startsWith("RECTIFICACION")) {
        // JsfUtil.msgError("No se puede editar esta malla en fase de Rectificacin.");
        // return;
        // }
        // }
        // }
        mallaCrearEditar = (MallaCurricularDTO) SerializationUtils.clone(malla);
        List<OrganizacionCurricularDTO> organizacionCurricularList = null;

        try {
            organizacionCurricularList = registroServicio.obtenerOrganizacionCurricular(mallaCrearEditar.getId());
        } catch (ServicioException e) {
            e.printStackTrace();
            return;
        }

        if (organizacionCurricularList == null || organizacionCurricularList.isEmpty()) {
            cargarOrganizacionesVacias(mallaCrearEditar);
        } else {
            mallaCrearEditar.setOrganizacionesCurricularDTO(organizacionCurricularList);
        }
        if (mallaCrearEditar.getOrganizacionMallaEnum() != null) {
            organizacionMallaSelect = mallaCrearEditar.getOrganizacionMallaEnum().getValue();
        }
        if (mallaCrearEditar.getNumeroNiveles() != null) {
            cargarNiveles();
            numeroNivelesSelect = mallaCrearEditar.getNumeroNiveles().toString();
        }
        RequestContext context = RequestContext.getCurrentInstance();
        context.execute("dlgCrearEditarMallaId.show();");
    }

    private void cargarOrganizacionesVacias(MallaCurricularDTO malla) {
        malla.getOrganizacionesCurricularDTO().clear();
        List<OrganizacionCurricularDTO> organizacionCurricularList = new ArrayList<>();

        OrganizacionCurricularDTO organizacionCurricularInicial = new OrganizacionCurricularDTO();
        organizacionCurricularInicial.setAreaFormacion(AreaFormacionOrganizacionEnum.INICIAL);

        OrganizacionCurricularDTO organizacionCurricularProfesional = new OrganizacionCurricularDTO();
        organizacionCurricularProfesional.setAreaFormacion(AreaFormacionOrganizacionEnum.PROFESIONAL);

        OrganizacionCurricularDTO organizacionCurricularPerfil = new OrganizacionCurricularDTO();
        organizacionCurricularPerfil.setAreaFormacion(AreaFormacionOrganizacionEnum.TITULACION);

        organizacionCurricularList.add(organizacionCurricularInicial);
        organizacionCurricularList.add(organizacionCurricularProfesional);
        organizacionCurricularList.add(organizacionCurricularPerfil);

        malla.setOrganizacionesCurricularDTO(organizacionCurricularList);
    }

    private boolean validarFormularioEditarCrearMalla(MallaCurricularDTO mallaGuardar) {
        if ("0".equals(organizacionMallaSelect)) {
            JsfUtil.msgError("La organizacin de la malla es requerida");
            return false;
        }

        if (numeroNivelesSelect == null || "0".equals(numeroNivelesSelect) || "".equals(numeroNivelesSelect)) {
            JsfUtil.msgError("El nmero de niveles es requerido");
            return false;
        }

        if (mallaGuardar.getFechaFinVigencia() != null
                && mallaGuardar.getFechaInicioVigencia().compareTo(mallaGuardar.getFechaFinVigencia()) >= 0) {
            JsfUtil.msgError("La fecha de Inicio debe ser mayor a la fecha final");
            return false;
        }
        if ((new Integer(0)).equals(mallaGuardar.getAniosSinTesis())) {
            JsfUtil.msgError("Los meses sin tesis deben ser mayores a 0");
            return false;
        }
        if ((new Integer(0)).equals(mallaGuardar.getAniosConTesis())) {
            JsfUtil.msgError("Los meses con tesis deben ser mayores a 0");
            return false;
        }
        if ((new Integer(0)).equals(mallaGuardar.getCreditosSinTesis())) {
            JsfUtil.msgError("Los crditos sin tesis deben ser mayores a 0");
            return false;
        }
        if ((new Integer(0)).equals(mallaGuardar.getCreditosConTesis())) {
            JsfUtil.msgError("Los crditos con tesis deben ser mayores a 0");
            return false;
        }
        if (mallaGuardar.getAniosSinTesis() > mallaGuardar.getAniosConTesis()) {
            JsfUtil.msgError("Los meses sin tesis deben ser menores o iguales a los meses con tesis");
            return false;
        }
        if (mallaGuardar.getCreditosSinTesis() > mallaGuardar.getCreditosConTesis()) {
            JsfUtil.msgError("Los crditos sin tesis deben ser menores o iguales a los crditos con tesis");
            return false;
        }

        for (MallaCurricularDTO malla : mallas) {
            if (!malla.getId().equals(mallaGuardar.getId())
                    && malla.getFechaInicioVigencia().equals(mallaGuardar.getFechaInicioVigencia())) {
                JsfUtil.msgError("Ya existe una malla con la misma fecha de Inicio de vigencia");
                return false;
            }
        }

        try {
            SedeIesDTO sede = registroServicio.obtenerSedeIesPorId(idSede);
            if (sede.getFechaCreacion() != null
                    && sede.getFechaCreacion().compareTo(mallaGuardar.getFechaInicioVigencia()) > 0) {

                SimpleDateFormat formatoFecha = new SimpleDateFormat("dd-MM-yyyy");
                JsfUtil.msgError(
                        "La fecha de inicio debe ser mayor a la fecha de creacin de la matriz/extensin ("
                                + formatoFecha.format(sede.getFechaCreacion()) + ")");
                return false;
            }
        } catch (Exception e) {
            e.printStackTrace();
            JsfUtil.msgError(
                    "Error en la validacin del registro, comunquese con el administrador del sistema.");
            return false;
        }

        return true;
    }

    public void crearMallaImportada() {
        mallaCrearEditar.setInformacionCarreraDTO(carreraSeleccionadaImportacion);
        esCopiaMalla = true;
        guardarMalla(true);
    }

    public void guardarMalla(boolean esImportacion) {
        RequestContext context = RequestContext.getCurrentInstance();
        context.addCallbackParam("cerrarVentana", false);

        if (esCopiaMalla) {
            try {
                AuditoriaDTO auditoria = new AuditoriaDTO();
                auditoria.setFechaModificacion(new Date());
                auditoria.setUsuarioModificacion(usuarioSistema);

                MallaCurricularDTO copiaMalla = (MallaCurricularDTO) SerializationUtils.clone(mallaCrearEditar);
                Long idMalla = copiaMalla.getId();
                copiaMalla.setId(null);
                copiaMalla.setCodigoUnico(null);
                if (esImportacion) {
                    copiaMalla.setReforma(null);
                } else {
                    copiaMalla.setReforma(idMalla);
                }
                copiaMalla.setAuditoria(auditoria);
                Map<AreaFormacionOrganizacionEnum, Long> organizacionesAnterioresIds = new HashMap<>();
                Map<Long, Long> organizacionesNuevasIds = new HashMap<>();
                for (OrganizacionCurricularDTO organizacion : copiaMalla.getOrganizacionesCurricularDTO()) {
                    organizacionesAnterioresIds.put(organizacion.getAreaFormacion(), organizacion.getId());
                    organizacion.setId(null);
                    organizacion.setAuditoria(auditoria);
                    organizacion.setMallaDTO(copiaMalla);
                }
                copiaMalla = insertarActualizarMalla(copiaMalla);
                // si no pas las validaciones retorna null
                if (copiaMalla == null) {
                    return;
                }

                List<OrganizacionCurricularDTO> organizaciones = registroServicio
                        .obtenerOrganizacionCurricular(copiaMalla.getId());
                for (OrganizacionCurricularDTO org : organizaciones) {
                    organizacionesNuevasIds.put(organizacionesAnterioresIds.get(org.getAreaFormacion()),
                            org.getId());
                }

                List<AsignaturaDTO> asignaturas = registroServicio.obtenerAsignaturasPorMalla(idMalla);
                int contador = 1;
                Map<Long, Long> idsAsignatura = new HashMap<>();
                List<AsignaturaDTO> asignaturasHijas = new ArrayList<>();

                for (AsignaturaDTO asignatura : asignaturas) {
                    Long id = asignatura.getId();
                    asignatura.setOrganizacionCurricular(
                            organizacionesNuevasIds.get(asignatura.getOrganizacionCurricular()));
                    asignatura.setMallaCurricularDTO(copiaMalla);
                    asignatura.setId(null);
                    asignatura.setAuditoria(auditoria);
                    asignatura.setCodigoUnico(
                            ies.getSiglas() + "_" + copiaMalla.getCodigoUnico() + "_" + asignatura.getCodigo() + "_"
                                    + asignatura.getNombre().substring(0, 3).toUpperCase() + "_" + contador);
                    contador++;

                    asignatura.setFaseIesDTO(faseIesDTO);
                    AsignaturaDTO asignaturaCreada = registroServicio.crearActualizar(asignatura);
                    idsAsignatura.put(id, asignaturaCreada.getId());
                    if (asignaturaCreada.getIdAsignaturaPadre() != null) {
                        asignaturasHijas.add(asignaturaCreada);
                    }

                    for (RequisitoAsignaturaDTO requisito : asignatura.getCorRequisitoMalla()) {
                        if (requisito.getActivo()) {
                            requisito.setId(null);
                            requisito.setAuditoria(auditoria);
                            requisito.setAsignaturaDTO(asignaturaCreada);
                            requisito.setFaseIesDTO(faseIesDTO);
                            registroServicio.crearActualizar(requisito);
                        }
                    }
                    for (RequisitoAsignaturaDTO requisito : asignatura.getPreRequisitoMalla()) {
                        if (requisito.getActivo()) {
                            requisito.setId(null);
                            requisito.setAuditoria(auditoria);
                            requisito.setAsignaturaDTO(asignaturaCreada);
                            requisito.setFaseIesDTO(faseIesDTO);
                            registroServicio.crearActualizar(requisito);
                        }
                    }
                }

                for (AsignaturaDTO asignaturaHija : asignaturasHijas) {
                    asignaturaHija.setIdAsignaturaPadre(idsAsignatura.get(asignaturaHija.getIdAsignaturaPadre()));
                    asignaturaHija.setFaseIesDTO(faseIesDTO);
                    registroServicio.crearActualizar(asignaturaHija);
                }

                cargarMallas();
                JsfUtil.msgInfo("La copia de la malla se realiz correctamente");
                context.addCallbackParam("cerrarVentana", true);
            } catch (Exception e) {
                JsfUtil.msgError("Error al copiar la malla, comunquese con el administrador del sistema");
                e.printStackTrace();
            }

        } else {
            try {
                mallaCrearEditar.setVerificarEvidencia(false);
                if (insertarActualizarMalla(mallaCrearEditar) != null) {

                    JsfUtil.msgInfo("Se guard la nueva malla correctamente");
                    context.addCallbackParam("cerrarVentana", true);
                } else {
                    return;
                }
            } catch (Exception e) {
                e.printStackTrace();
                JsfUtil.msgError("Error al guardar la malla, comunquese con el administrador del sistema.");
                return;
            }
        }

    }

    private MallaCurricularDTO insertarActualizarMalla(MallaCurricularDTO mallaGuardar) throws Exception {

        if (!validarFormularioEditarCrearMalla(mallaGuardar)) {
            return null;
        }

        String usuario = SecurityContextHolder.getContext().getAuthentication().getName();
        // ListaIesController controller = (ListaIesController) FacesContext
        // .getCurrentInstance().getExternalContext().getSessionMap()
        // .get("listaIesController");
        SedeIesDTO sedeIes = registroServicio.obtenerSedeIesPorId(idSede);

        if (mallaGuardar.getId() == null) {
            mallaGuardar.setActivo(Boolean.TRUE);
            mallaGuardar.setFaseIesDTO(faseIesDTO);
        }
        if (mallaGuardar.getCodigoUnico() == null) {
            mallaGuardar.setCodigoUnico(sedeIes.getCodigo() + "-"
                    + carreraSeleccionada.getCarreraIesDTO().getCodigo() + "-" + obtenerCodigoSecuencialMalla());
        }
        mallaGuardar.setInformacionCarreraDTO(carreraSeleccionada);
        AuditoriaDTO auditoriaDTO = new AuditoriaDTO();
        auditoriaDTO.setFechaModificacion(new Date());
        auditoriaDTO.setUsuarioModificacion(usuario);

        mallaGuardar.setAuditoria(auditoriaDTO);
        if (numeroNivelesSelect != null && !"".equals(numeroNivelesSelect) && !"0".equals(numeroNivelesSelect)) {
            mallaGuardar.setNumeroNiveles(new Integer(numeroNivelesSelect));
        }
        // TODO: revisar
        // mallaCrearEditar.setIdFaseIes(controller.getFaseIesDTO().getId());
        MallaCurricularDTO malla = registroServicio.registrarMallaCurricular(mallaGuardar);
        mallaGuardar.setId(malla.getId());

        for (OrganizacionCurricularDTO organizacion : mallaGuardar.getOrganizacionesCurricularDTO()) {
            organizacion.setAuditoria(auditoriaDTO);
            // TODO: revisar
            // organizacion.setIdFaseIes(controller.getFaseIesDTO().getId());
            organizacion.setActivo(Boolean.TRUE);
        }

        registroServicio.registrarOrganizacionCurricular(mallaGuardar.getOrganizacionesCurricularDTO(), malla);

        cargarMallas();

        materias.clear();
        materiasFiltros.clear();

        preRequisitos.clear();
        coRequisitos.clear();

        preRequisitosFiltros.clear();
        coRequisitosFiltros.clear();

        mallaSeleccionada = new MallaCurricularDTO();
        materiaSeleccionada = new AsignaturaDTO();
        return malla;
    }

    public boolean verficarMallatieneAsignaturas() {

        List<AsignaturaDTO> listaAsignaturaM = new ArrayList<AsignaturaDTO>();

        try {

            if (mallaCrearEditar != null && mallaCrearEditar.getId() != null) {

                List<AsignaturaDTO> materiasTemp = new ArrayList<AsignaturaDTO>();

                materiasTemp = registroServicio.obtenerAsignaturasPorMalla(mallaCrearEditar.getId());

                if (materiasTemp != null) {
                    for (AsignaturaDTO mat : materiasTemp) {
                        if (mat.getIdAsignaturaPadre() == null) {
                            listaAsignaturaM.add(mat);
                        }
                    }
                }
            }

        } catch (ServicioException e) {
            e.printStackTrace();
        }

        if (listaAsignaturaM.isEmpty()) {
            return false;
        } else {
            JsfUtil.msgInfo("No se puede eliminar la Malla tiene asignaturas activas");
            return true;
        }

    }

    public void eliminarMalla() {

        if (alertaFaseRectificacion && alertaUsuarioIes) {
            if (mallaCrearEditar.getId() != null
                    && !mallaCrearEditar.getFaseIesDTO().getTipo().name().startsWith("RECTIFICACION")) {
                JsfUtil.msgError("No se puede eliminar esta malla en fase de Rectificacin.");
                return;
            }
        }

        if (verficarMallatieneAsignaturas()) {
            return;
        }

        try {
            String usuario = SecurityContextHolder.getContext().getAuthentication().getName();

            AuditoriaDTO auditoriaDTO = new AuditoriaDTO();
            auditoriaDTO.setFechaModificacion(new Date());
            auditoriaDTO.setUsuarioModificacion(usuario);
            mallaCrearEditar.setFaseIesDTO(this.faseIesDTO);
            mallaCrearEditar.setActivo(Boolean.FALSE);

            for (OrganizacionCurricularDTO organizacion : mallaCrearEditar.getOrganizacionesCurricularDTO()) {
                organizacion.setAuditoria(auditoriaDTO);
                // TODO: revisar
                // organizacion.setIdFaseIes(controller.getFaseIesDTO().getId());
                organizacion.setActivo(Boolean.FALSE);
            }

            mallaCrearEditar.setInformacionCarreraDTO(carreraSeleccionada);
            MallaCurricularDTO malla = registroServicio.registrarMallaCurricular(mallaCrearEditar);

            registroServicio.registrarOrganizacionCurricular(mallaCrearEditar.getOrganizacionesCurricularDTO(),
                    malla);

            List<AsignaturaDTO> asignaturas = registroServicio.obtenerAsignaturasPorMalla(mallaCrearEditar.getId());
            for (AsignaturaDTO asignatura : asignaturas) {
                asignatura.setMallaCurricularDTO(mallaCrearEditar);
                asignatura.setAuditoria(auditoriaDTO);
                asignatura.setActivo(Boolean.FALSE);
                asignatura.setFaseIesDTO(this.faseIesDTO);
                registroServicio.crearActualizar(asignatura);

                for (RequisitoAsignaturaDTO requisito : asignatura.getPreRequisitoMalla()) {
                    if (requisito.getActivo()) {
                        requisito.setAuditoria(auditoriaDTO);
                        requisito.setAsignaturaDTO(asignatura);
                        requisito.setActivo(Boolean.FALSE);
                        requisito.setFaseIesDTO(this.faseIesDTO);
                        registroServicio.crearActualizar(requisito);
                    }
                }
                for (RequisitoAsignaturaDTO requisito : asignatura.getCorRequisitoMalla()) {
                    if (requisito.getActivo()) {
                        requisito.setAuditoria(auditoriaDTO);
                        requisito.setAsignaturaDTO(asignatura);
                        requisito.setActivo(Boolean.FALSE);
                        requisito.setFaseIesDTO(faseIesDTO);
                        registroServicio.crearActualizar(requisito);
                    }
                }
            }

            cargarMallas();
            materiaSeleccionada = new AsignaturaDTO();
            mallaSeleccionada = new MallaCurricularDTO();

            JsfUtil.msgInfo("La malla " + malla.getCodigoUnico() + " se elimino correctamente");
        } catch (Exception e) {
            e.printStackTrace();
            JsfUtil.msgError("Error al eliminar la malla, por favor comunquese con el administrador del sistema");
        }
    }

    private String obtenerCodigoSecuencialMalla() throws Exception {
        List<MallaCurricularDTO> mallasSecuencial = registroServicio
                .obtenerTodasMallaCurricular(carreraSeleccionada);
        int secuencial = 0;
        for (MallaCurricularDTO mallaDto : mallasSecuencial) {
            if (mallaDto.getCodigoUnico() != null) {
                int secuencialLista = Integer
                        .parseInt(mallaDto.getCodigoUnico().substring(mallaDto.getCodigoUnico().length() - 3));
                if (secuencialLista > secuencial) {
                    secuencial = secuencialLista;
                }
            }
        }
        String codigoSecuencial = String.valueOf(secuencial + 1);
        if (codigoSecuencial.length() == 1) {
            codigoSecuencial = "00" + codigoSecuencial;
        } else if (codigoSecuencial.length() == 2) {
            codigoSecuencial = "0" + codigoSecuencial;
        }
        return codigoSecuencial;
    }

    /**
     * @return the mallaCrearEditar
     */
    public MallaCurricularDTO getMallaCrearEditar() {
        return mallaCrearEditar;
    }

    /**
     * @param mallaCrearEditar
     *            the mallaCrearEditar to set
     */
    public void setMallaCrearEditar(MallaCurricularDTO mallaCrearEditar) {
        this.mallaCrearEditar = mallaCrearEditar;
    }

    /**
     * @return the fecahActual
     */
    public Date getFecahActual() {
        return new Date();
    }

    /**
     * @return the organizacionMalla
     */
    public SelectItem[] getOrganizacionMalla() {
        return ORGANIZACION_MALLA;
    }

    /**
     * @return the niveles
     */
    public List<SelectItem> getNiveles() {
        return niveles;
    }

    /**
     * @param organizacionMalla
     *            the organizacionMalla to set
     */
    public void setOrganizacionMallaSelect(String organizacionMallaSelect) {
        this.organizacionMallaSelect = organizacionMallaSelect;
    }

    public String getOrganizacionMallaSelect() {
        return organizacionMallaSelect;
    }

    public void cargarNiveles() {
        niveles.clear();
        numeroNivelesSelect = "0";
        if (!"0".equals(organizacionMallaSelect)) {

            if (OrganizacionMallaEnum.BIMESTRE.getValue().toString().equals(organizacionMallaSelect)) {
                mallaCrearEditar.setOrganizacionMallaEnum(OrganizacionMallaEnum.BIMESTRE);
                for (int i = 1; i <= 18; i++) {
                    niveles.add(new SelectItem(i, String.valueOf(i)));
                }
            } else if (OrganizacionMallaEnum.TRIMESTRES.getValue().toString().equals(organizacionMallaSelect)) {
                mallaCrearEditar.setOrganizacionMallaEnum(OrganizacionMallaEnum.TRIMESTRES);
                for (int i = 1; i <= 32; i++) {
                    niveles.add(new SelectItem(i, String.valueOf(i)));
                }
            } else if (OrganizacionMallaEnum.CUATRIMESTRES.getValue().toString().equals(organizacionMallaSelect)) {
                mallaCrearEditar.setOrganizacionMallaEnum(OrganizacionMallaEnum.CUATRIMESTRES);
                for (int i = 1; i <= 24; i++) {
                    niveles.add(new SelectItem(i, String.valueOf(i)));
                }
            } else if (OrganizacionMallaEnum.SEMESTRES.getValue().toString().equals(organizacionMallaSelect)) {
                mallaCrearEditar.setOrganizacionMallaEnum(OrganizacionMallaEnum.SEMESTRES);
                for (int i = 1; i <= 16; i++) {
                    niveles.add(new SelectItem(i, String.valueOf(i)));
                }
            } else if (OrganizacionMallaEnum.ANIOS.getValue().toString().equals(organizacionMallaSelect)) {
                mallaCrearEditar.setOrganizacionMallaEnum(OrganizacionMallaEnum.ANIOS);
                for (int i = 1; i <= 8; i++) {
                    niveles.add(new SelectItem(i, String.valueOf(i)));
                }
            }
        }
    }

    /**
     * @return the numeroNivelesSelect
     */
    public String getNumeroNivelesSelect() {
        return numeroNivelesSelect;
    }

    /**
     * @param numeroNivelesSelect
     *            the numeroNivelesSelect to set
     */
    public void setNumeroNivelesSelect(String numeroNivelesSelect) {
        this.numeroNivelesSelect = numeroNivelesSelect;
    }

    // TODO: solo para pruebas
    public void obtenerFiltros(FilterEvent event) {
        tablaAsignaturas = (DataTable) event.getSource();

        Map<String, String> filtros = tablaAsignaturas.getFilters();

        for (Map.Entry<String, String> fil : filtros.entrySet()) {
            filtrosTablaAsignaturas.put(fil.getKey(), fil.getValue());
        }
    }

    public void registrarRequisitosAsignatura() {
        AuditoriaDTO auditoriaDTO = new AuditoriaDTO();
        auditoriaDTO.setFechaModificacion(new Date());
        auditoriaDTO.setUsuarioModificacion(usuarioSistema);

        // Add de los requisitos que tienen id y como activo false
        requisitos.addAll(requisitos.size(), requisitosRemovidos);

        for (RequisitoAsignaturaDTO ras : requisitos) {
            ras.setAuditoria(auditoriaDTO);
            ras.setFaseIesDTO(this.faseIesDTO);
            try {
                registroServicio.crearActualizar(ras);
            } catch (ServicioException e) {
                e.printStackTrace();
                JsfUtil.msgError("No se pudo guardar los requisitos");
                return;
            }
        }

        Long idMateriaSeleccionada = materiaSeleccionada.getId();

        // Para refrescar los datos de las asignaturas
        cargarAsignaturas();

        try {
            materiaSeleccionada = registroServicio.obtenerAsignatura(idMateriaSeleccionada);
        } catch (ServicioException e) {
            e.printStackTrace();
            return;
        }

        for (int i = 0; i < materias.size(); i++) {
            if (materias.get(i).getId().equals(idMateriaSeleccionada)) {
                materias.remove(i);
                break;
            }
        }

        materias.add(0, materiaSeleccionada);

        cargarRequisitos();

        JsfUtil.msgInfo("Los requisitos se guardaron correctamente");
    }

    /**
     * 
     * Para definir que boton hace que cosa
     * 
     * @author eteran
     * @version 19/05/2014 - 16:43:03
     * @param event
     */
    public void tomarNombreComponente(ActionEvent event) {

        FacesContext ctx = FacesContext.getCurrentInstance();
        nombreComponente = event.getComponent().getClientId(ctx);

        if (nombreComponente.contains("btnNuevaAsignatura")) {
            asignatura = new AsignaturaDTO();
            setOpcionRequisito(2);
            asignatura.setTipoAsignatura(TipoAsignaturaEnum.ASIGNATURA_CON_CREDITOS.getValue());
        }

        if (nombreComponente.contains("btnNuevaHijaAsignatura")) {
            if (padreAsignatura.getId() == null) {
                JsfUtil.msgAdvert("Primero se debe crear una asignatura padre");
                return;
            }

            hijaAsignatura = new AsignaturaDTO();
            hijaAsignatura.setActivo(true);
            hijaAsignatura.setTipoAsignatura(TipoAsignaturaEnum.ASIGNATURA_HIJA.getValue());
            hijaAsignatura.setNivelMateria(asignatura.getNivelMateria());
            hijaAsignatura.setIdAsignaturaPadre(asignatura.getId());
            hijaAsignatura.setAreaFormacion(asignatura.getAreaFormacion());
            hijaAsignatura.setOrganizacionCurricular(asignatura.getOrganizacionCurricular());

            RequestContext rctx = RequestContext.getCurrentInstance();
            rctx.execute("dialogAsignaturaHija.show()");
        }
    }

    public void obtenerAsignatura(boolean actualizar) {
        // if (alertaFaseRectificacion && alertaUsuarioIes) {
        // if (asignatura.getId() != null
        // && !asignatura.getFaseIesDTO().getTipo().name()
        // .startsWith("RECTIFICACION")) {
        // JsfUtil.msgError("No se puede editar esta malla en fase de Rectificacin.");
        // return;
        // }
        // }

        hijas.clear();

        try {
            hijas = registroServicio.obtenerAsignaturaHijas(asignatura.getId());
            if (actualizar) {
                RequestContext context = RequestContext.getCurrentInstance();
                context.execute("dialogAsignatura.show()");
            }
        } catch (ServicioException e) {
            e.printStackTrace();
            return;
        }
    }

    private boolean validarAsignatura(AsignaturaDTO asignaturaDTO) {
        if (asignaturaDTO.getId() == null) {
            for (AsignaturaDTO asi : materias) {
                if (asi.getCodigo().equalsIgnoreCase(asignaturaDTO.getCodigo())) {
                    JsfUtil.msgError("El cdigo ya existe");
                    return false;
                }
            }
        }

        if (TipoAsignaturaEnum.ASIGNATURA_CON_CREDITOS.getValue().equals(asignaturaDTO.getTipoAsignatura())
                || TipoAsignaturaEnum.ASIGNATURA_COMPUESTA.getValue().equals(asignaturaDTO.getTipoAsignatura())) {
            if (asignaturaDTO.getNumeroCreditos() == null) {
                JsfUtil.msgError("Nmero de crditos es requerido");
                return false;
            }
        }

        if (asignaturaDTO.getNombre() == null || asignaturaDTO.getNombre().isEmpty()) {
            JsfUtil.msgError("Nombre es requerido");
            return false;
        }

        if (asignaturaDTO.getCodigo() == null || asignaturaDTO.getCodigo().isEmpty()) {
            JsfUtil.msgError("Codigo es requerido");
            return false;
        }

        return true;
    }

    public void registrarAsignaturaHija() {
        if (!validarAsignatura(hijaAsignatura)) {
            return;
        }

        Double totalCreditosHijasTemp = totalCreditosHijas;

        validarCreditosCompuesta();

        if (hijaAsignatura.getId() == null && hijaAsignatura.getObligatorio()) {
            totalCreditosHijas += hijaAsignatura.getNumeroCreditos();
        }

        if (totalCreditosHijas > padreAsignatura.getNumeroCreditos()) {
            totalCreditosHijas = totalCreditosHijas - hijaAsignatura.getNumeroCreditos();
            hijaAsignatura.setNumeroCreditos(creditosAsignatura);
            totalCreditosHijas = totalCreditosHijasTemp;
            JsfUtil.msgError(
                    "Los crditos registrados en las asignaturas obligatorias, no pueden superar a los crditos registrados en la asignatura padre");
            return;
        }

        String msg = "La asignatura hija fue registrada correctamente";

        if (nombreComponente.contains("btnEliminarHijaAsignatura")) {
            hijaAsignatura.setActivo(false);
            msg = "Asignatura eliminda";
        }

        if (hijaAsignatura.getId() == null) {
            hijaAsignatura.setActivo(true);

            hijaAsignatura.setCodigoUnico(ies.getSiglas() + "_" + mallaSeleccionada.getCodigoUnico() + "_"
                    + hijaAsignatura.getCodigo() + "_" + hijaAsignatura.getNombre().substring(0, 3).toUpperCase()
                    + "_" + (hijas.size() + 1));
        }

        AuditoriaDTO auditoria = new AuditoriaDTO();
        auditoria.setFechaModificacion(new Date());
        auditoria.setUsuarioModificacion(usuarioSistema);
        hijaAsignatura.setFaseIesDTO(faseIesDTO);
        hijaAsignatura.setAuditoria(auditoria);
        hijaAsignatura.setMallaCurricularDTO(mallaSeleccionada);

        try {
            hijaAsignatura = registroServicio.crearActualizar(hijaAsignatura);

            if (hijaAsignatura != null) {
                JsfUtil.msgInfo(msg);
            }

        } catch (ServicioException e) {
            e.printStackTrace();
            JsfUtil.msgError("No se pudo realizar la operacion");
            return;
        }

        obtenerAsignatura(false);
        cargarAsignaturas();

        hijaAsignatura = new AsignaturaDTO();
        hijaAsignatura.setTipoAsignatura(TipoAsignaturaEnum.ASIGNATURA_HIJA.getValue());
        hijaAsignatura.setNivelMateria(asignatura.getNivelMateria());
        hijaAsignatura.setIdAsignaturaPadre(asignatura.getId());
        hijaAsignatura.setAreaFormacion(asignatura.getAreaFormacion());
        hijaAsignatura.setOrganizacionCurricular(asignatura.getOrganizacionCurricular());
    }

    public void registrarAsignatura() {
        if (!validarAsignatura(asignatura)) {
            return;
        }

        validarNumeroCreditos();

        if (asignatura.getNumeroCreditos() != null && asignatura.getId() == null) {
            totalCreditos += asignatura.getNumeroCreditos();
        }

        if (totalCreditos > mallaSeleccionada.getCreditosConTesis()) {
            cargarAsignaturas();
            JsfUtil.msgError(
                    "Los crditos registrados, no pueden superar a Crditos con Tesis de la malla curricular seleccionada");
            return;
        }

        String msg = "La asignatura fue registrada correctamente";

        AuditoriaDTO auditoria = new AuditoriaDTO();
        auditoria.setFechaModificacion(new Date());
        auditoria.setUsuarioModificacion(usuarioSistema);

        if (nombreComponente.contains("btnEliminarAsignatura")) {
            if (alertaFaseRectificacion && alertaUsuarioIes) {
                if (asignatura.getId() != null
                        && !asignatura.getFaseIesDTO().getTipo().name().startsWith("RECTIFICACION")) {
                    JsfUtil.msgError("No se puede eliminar esta asignatura en fase de Rectificacin.");
                    return;
                }
            }

            eliminarTodasLasHijas(auditoria);
            asignatura.setActivo(false);
            msg = "Asignatura eliminada";
        }

        if (asignatura.getId() == null) {
            asignatura.setActivo(true);
            asignatura.setFaseIesDTO(faseIesDTO);
            asignatura.setCodigoUnico(
                    ies.getSiglas() + "_" + mallaSeleccionada.getCodigoUnico() + "_" + asignatura.getCodigo() + "_"
                            + asignatura.getNombre().substring(0, 3).toUpperCase() + "_" + (materias.size() + 1));
        }

        asignatura.setAuditoria(auditoria);
        asignatura.setMallaCurricularDTO(mallaSeleccionada);
        if (!asignatura.getTipoAsignatura().equals(TipoAsignaturaEnum.ASIGNATURA_COMPUESTA.getValue())
                && !hijas.isEmpty()) {
            eliminarTodasLasHijas(auditoria);
        }

        if (asignatura.getTipoAsignatura().equals(TipoAsignaturaEnum.ASIGNATURA_SIN_CREDITOS.getValue())) {
            asignatura.setNivelMateria(null);
            asignatura.setNumeroCreditos(0.0);
        }

        try {
            asignatura = registroServicio.crearActualizar(asignatura);

            if (asignatura.getTipoAsignatura().equals(TipoAsignaturaEnum.ASIGNATURA_COMPUESTA.getValue())) {
                setPadreAsignatura(asignatura);
            }

            if (asignatura != null) {
                JsfUtil.msgInfo(msg);
            }

        } catch (ServicioException e) {
            e.printStackTrace();
            JsfUtil.msgError("No se pudo realizar la operacion");
            return;
        }

        cargarAsignaturas();

        if (opcionRequisito == 3) {
            padreAsignatura = asignatura;
            validarCreditosCompuesta();
            return;
        }

        if (nombreComponente.contains("btnEliminarAsignatura")) {
            materiaSeleccionada = new AsignaturaDTO();
        }

        asignatura = new AsignaturaDTO();
        RequestContext context = RequestContext.getCurrentInstance();
        context.execute("dialogAsignatura.hide()");
    }

    private void eliminarTodasLasHijas(AuditoriaDTO auditoria) {
        for (AsignaturaDTO hija : hijas) {
            hija.setActivo(false);
            hija.setAuditoria(auditoria);
            hija.setFaseIesDTO(faseIesDTO);
            try {
                registroServicio.crearActualizar(hija);
            } catch (ServicioException e) {
                e.printStackTrace();
                return;
            }
        }
    }

    private void cargarOrganizacionCurricular() {
        organizacionCurricular.clear();

        try {
            organizacionCurricular = registroServicio.obtenerOrganizacionCurricular(mallaSeleccionada.getId());
        } catch (ServicioException e) {
            e.printStackTrace();
            return;
        }

        if (organizacionCurricular == null) {
            JsfUtil.msgError("No se pudo obtener la organizacion curricular");
        }
    }

    public void generarReporteMalla(MallaCurricularDTO mallaReporte) {
        HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext()
                .getRequest();

        ByteArrayOutputStream outReporteMallas = new ByteArrayOutputStream();
        String pathJasperMallas = request.getSession().getServletContext().getRealPath("")
                + "/reportesJasper/mallas/mallas.jasper";
        String pathJasperAsignaturasCompuestas = request.getSession().getServletContext().getRealPath("")
                + "/reportesJasper/mallas/asignaturasCompuestas/asignaturasCompuestas.jasper";

        Map<String, Object> parametrosReporteMallas = new HashMap<>();
        Map<String, Object> parametrosReporteAsignaturasCompuestas = new HashMap<>();

        String pathLogo = request.getSession().getServletContext().getRealPath("") + "/images/logo_ceaaces.png";
        parametrosReporteMallas.put("par_logo", pathLogo);
        parametrosReporteAsignaturasCompuestas.put("par_logo", pathLogo);

        parametrosReporteMallas.put("SUBREPORT_DIR",
                request.getSession().getServletContext().getRealPath("") + "/reportesJasper/mallas/");
        parametrosReporteAsignaturasCompuestas.put("SUBREPORT_DIR",
                request.getSession().getServletContext().getRealPath("")
                        + "/reportesJasper/mallas/asignaturasCompuestas/");

        try {
            cargarDatosReporte(mallaReporte);

            List<MallaCurricularDTO> listaReporte = new ArrayList<MallaCurricularDTO>();
            listaReporte.add(mallaReporte);

            JRDataSource dataSourceMallas = new JRBeanCollectionDataSource(listaReporte);
            JRDataSource dataSourceCompuestas = new JRBeanCollectionDataSource(
                    mallaReporte.getOrganizacionesCurricularDTO());

            if (dataSourceMallas != null) {
                JRXlsExporter exporter = new JRXlsExporter();
                cargarPropiedadesReporte(exporter);

                JasperPrint jasperPrintMallas = JasperFillManager.fillReport(pathJasperMallas,
                        parametrosReporteMallas, dataSourceMallas);
                JasperPrint jasperPrintCompuestas = JasperFillManager.fillReport(pathJasperAsignaturasCompuestas,
                        parametrosReporteAsignaturasCompuestas, dataSourceCompuestas);

                ArrayList<JasperPrint> hojasReporte = new ArrayList<JasperPrint>();
                hojasReporte.add(jasperPrintMallas);
                hojasReporte.add(jasperPrintCompuestas);

                exporter.setExporterInput(SimpleExporterInput.getInstance(hojasReporte));
                exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(outReporteMallas));
                exporter.exportReport();
                reporteBytes = outReporteMallas.toByteArray();
            }
        } catch (Exception e) {
            e.printStackTrace();
            JsfUtil.msgError("Error al generar el reporte, comunquese con el administrador del sistema");
        }
    }

    public void presentarReporteXls() {
        HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext()
                .getResponse();
        try {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-yyyy");
            response.setContentType("application/vnd.ms-excel");
            response.setHeader("Content-Disposition",
                    "attachment; filename=mallas_" + simpleDateFormat.format(new Date()) + ".xls");
            response.setContentLength(reporteBytes.length);
            ServletOutputStream out = response.getOutputStream();
            out.write(reporteBytes, 0, reporteBytes.length);
            out.flush();
            FacesContext.getCurrentInstance().responseComplete();
        } catch (Exception e) {
            e.printStackTrace();
            JsfUtil.msgError("Error al generar el reporte, comunquese con el administrador del sistema");
        }
    }

    public void generarReporteGrafico(MallaCurricularDTO mallaReporte) {
        HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext()
                .getRequest();

        ByteArrayOutputStream outReporte = new ByteArrayOutputStream();
        String pathJasperReporte = request.getSession().getServletContext().getRealPath("")
                + "/reportesJasper/mallasGrafico/mallas.jasper";

        Map<String, Object> parametrosReporte = new HashMap<>();

        String pathLogo = request.getSession().getServletContext().getRealPath("") + "/images/logo_ceaaces.png";
        parametrosReporte.put("par_logo", pathLogo);

        parametrosReporte.put("SUBREPORT_DIR",
                request.getSession().getServletContext().getRealPath("") + "/reportesJasper/mallasGrafico/");
        try {
            cargarDatosReporte(mallaReporte);

            List<MallaCurricularDTO> listaReporte = new ArrayList<MallaCurricularDTO>();
            listaReporte.add(mallaReporte);

            JRDataSource dataSourceMallas = new JRBeanCollectionDataSource(listaReporte);
            if (dataSourceMallas != null) {
                JRXlsExporter exporter = new JRXlsExporter();
                cargarPropiedadesReporte(exporter);

                JasperPrint jasperPrint = JasperFillManager.fillReport(pathJasperReporte, parametrosReporte,
                        dataSourceMallas);
                exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
                exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(outReporte));

                exporter.exportReport();
                reporteBytes = outReporte.toByteArray();
            }
        } catch (Exception e) {
            e.printStackTrace();
            JsfUtil.msgError("Error al generar el reporte, comunquese con el administrador del sistema");
        }
    }

    public void generarReporteGraficoWeb(MallaCurricularDTO mallaReporte) {
        mallaSeleccionada = null;
        try {
            cargarDatosReporte(mallaReporte);
            mallaSeleccionada = mallaReporte;
        } catch (Exception e) {
            e.printStackTrace();
            JsfUtil.msgError("Error al generar el reporte, comunquese con el administrador del sistema.");
        }
    }

    private void cargarPropiedadesReporte(JRXlsExporter exporter) {
        SimpleXlsReportConfiguration configuracionExcel = new SimpleXlsReportConfiguration();
        configuracionExcel.setDetectCellType(Boolean.TRUE);
        configuracionExcel.setOnePagePerSheet(Boolean.FALSE);
        configuracionExcel.setWhitePageBackground(Boolean.FALSE);
        configuracionExcel.setRemoveEmptySpaceBetweenColumns(Boolean.TRUE);
        configuracionExcel.setRemoveEmptySpaceBetweenRows(Boolean.TRUE);
        configuracionExcel.setIgnoreCellBorder(Boolean.FALSE);
        exporter.setConfiguration(configuracionExcel);
    }

    private void cargarDatosReporte(MallaCurricularDTO mallaReporte) throws Exception {
        mallaReporte.setAsignaturasDTO(registroServicio.obtenerAsignaturasPorMalla(mallaReporte.getId()));

        mallaReporte.setOrganizacionesCurricularDTO(
                registroServicio.obtenerOrganizacionCurricular(mallaReporte.getId()));

        for (OrganizacionCurricularDTO organizacion : mallaReporte.getOrganizacionesCurricularDTO()) {
            organizacion.setAsignaturasDTO(
                    registroServicio.obtenerAsignaturas(mallaReporte.getId(), organizacion.getId()));

            TreeSet<Integer> niveles = new TreeSet<>();
            List<AsignaturasPorNivelDTO> asignaturasPorNivelDTOLista = new ArrayList<>();
            for (AsignaturaDTO asignatura : organizacion.getAsignaturasDTO()) {

                List<RequisitoAsignaturaDTO> correquisitos = new ArrayList<>();
                for (RequisitoAsignaturaDTO co : asignatura.getCorRequisitoMalla()) {
                    if (co.getActivo()) {
                        correquisitos.add(co);
                    }
                }
                asignatura.getCorRequisitoMalla().clear();
                asignatura.getCorRequisitoMalla().addAll(correquisitos);

                List<RequisitoAsignaturaDTO> prerrequisitos = new ArrayList<>();
                for (RequisitoAsignaturaDTO pre : asignatura.getPreRequisitoMalla()) {
                    if (pre.getActivo()) {
                        prerrequisitos.add(pre);
                    }
                }
                asignatura.getPreRequisitoMalla().clear();
                asignatura.getPreRequisitoMalla().addAll(prerrequisitos);

                AsignaturasPorNivelDTO asignaturasPorNivelDTO = new AsignaturasPorNivelDTO();
                if (TipoAsignaturaEnum.ASIGNATURA_COMPUESTA.getValue().equals(asignatura.getTipoAsignatura())) {
                    asignatura.setAsignaturasHijas(registroServicio.obtenerAsignaturaHijas(asignatura.getId()));
                }
                if (asignatura.getIdAsignaturaPadre() == null && asignatura.getNivelMateria() != null) {
                    if (niveles.add(asignatura.getNivelMateria())) {
                        List<AsignaturaDTO> asignaturas = new ArrayList<>();
                        asignaturas.add(asignatura);
                        asignaturasPorNivelDTO.setNivelMateria(asignatura.getNivelMateria());
                        asignaturasPorNivelDTO.setAsignaturasDTO(asignaturas);
                        asignaturasPorNivelDTOLista.add(asignaturasPorNivelDTO);
                    } else {
                        for (AsignaturasPorNivelDTO asignaturaNivel : asignaturasPorNivelDTOLista) {
                            if (asignaturaNivel.getNivelMateria().equals(asignatura.getNivelMateria())) {
                                asignaturaNivel.getAsignaturasDTO().add(asignatura);
                                break;
                            }
                        }
                    }
                }
                if (asignatura.getNivelMateria() == null) {
                    if (niveles.add(9999)) {
                        List<AsignaturaDTO> asignaturas = new ArrayList<>();
                        asignaturas.add(asignatura);
                        asignaturasPorNivelDTO.setNivelMateria(9999);
                        asignaturasPorNivelDTO.setAsignaturasDTO(asignaturas);
                        asignaturasPorNivelDTOLista.add(asignaturasPorNivelDTO);
                    } else {
                        for (AsignaturasPorNivelDTO asignaturaNivel : asignaturasPorNivelDTOLista) {
                            if (new Integer(9999).equals(asignaturaNivel.getNivelMateria())) {
                                asignaturaNivel.getAsignaturasDTO().add(asignatura);
                                break;
                            }
                        }
                    }
                }

            }
            organizacion.setAsignaturasPorNivel(asignaturasPorNivelDTOLista);
        }
    }

    /**
     * @return the esCopiaMalla
     */
    public boolean isEsCopiaMalla() {
        return esCopiaMalla;
    }

    /**
     * @param esCopiaMalla
     *            the esCopiaMalla to set
     */
    public void setEsCopiaMalla(boolean esCopiaMalla) {
        this.esCopiaMalla = esCopiaMalla;
    }

    /**
     * @return the idSedeImportacion
     */
    public Long getIdSedeImportacion() {
        return idSedeImportacion;
    }

    /**
     * @param idSedeImportacion
     *            the idSedeImportacion to set
     */
    public void setIdSedeImportacion(Long idSedeImportacion) {
        this.idSedeImportacion = idSedeImportacion;
    }

    /**
     * @return the carreraSeleccionadaImportacion
     */
    public InformacionCarreraDTO getCarreraSeleccionadaImportacion() {
        return carreraSeleccionadaImportacion;
    }

    /**
     * @param carreraSeleccionadaImportacion
     *            the carreraSeleccionadaImportacion to set
     */
    public void setCarreraSeleccionadaImportacion(InformacionCarreraDTO carreraSeleccionadaImportacion) {
        this.carreraSeleccionadaImportacion = carreraSeleccionadaImportacion;
    }

    /**
     * @return the carrerasImportacion
     */
    public List<InformacionCarreraDTO> getCarrerasImportacion() {
        return carrerasImportacion;
    }

    /**
     * @param carrerasImportacion
     *            the carrerasImportacion to set
     */
    public void setCarrerasImportacion(List<InformacionCarreraDTO> carrerasImportacion) {
        this.carrerasImportacion = carrerasImportacion;
    }

    /**
     * @return the mallasImportacion
     */
    public List<MallaCurricularDTO> getMallasImportacion() {
        return mallasImportacion;
    }

    /**
     * @param mallasImportacion
     *            the mallasImportacion to set
     */
    public void setMallasImportacion(List<MallaCurricularDTO> mallasImportacion) {
        this.mallasImportacion = mallasImportacion;
    }

    /**
     * @return the sedesImportacion
     */
    public List<SedeIesDTO> getSedesImportacion() {
        return sedesImportacion;
    }

    /**
     * @param sedesImportacion
     *            the sedesImportacion to set
     */
    public void setSedesImportacion(List<SedeIesDTO> sedesImportacion) {
        this.sedesImportacion = sedesImportacion;
    }

    public FaseIesDTO getFaseIesDTO() {
        return faseIesDTO;
    }

    public void setFaseIesDTO(FaseIesDTO faseIesDTO) {
        this.faseIesDTO = faseIesDTO;
    }

}