public void AsignaSesionesOtrosSubmodulos(int hora_inicial, int n_horas, int horas_asignadas,
                                                  ClaseTeoricaInfo clase,
                                                  ListaSesiones lista_sesiones, long sesiones_asignadas)
        {
            for (int i = horas_asignadas; i < n_horas; i++)
            {
                //intentar buscar un submodulo del mismo modulo que la clase asignada
                //con un orden secundario superior, que el instructor sea el mismo e
                //intentar asignarla al hueco
                ClaseTeoricaInfo cl_aux = null;
                foreach (ClaseTeoricaInfo clase_aux in _teoricas)
                {
                    if (clase_aux.OidModulo == clase.OidModulo &&
                        clase_aux.OidSubmodulo != clase.OidSubmodulo
                        //&& clase_aux.OrdenSecundario >= clase.OrdenSecundario
                        && clase_aux.EEstadoClase == EEstadoClase.NoProgramada)
                    {
                        cl_aux = clase_aux;
                        break;
                    }
                }

                if (cl_aux != null)
                {
                    AsignaSesion(cl_aux, hora_inicial + i, 1, lista_sesiones, sesiones_asignadas);
                }
            }
        }
        public int GetSiguienteSesionLibre(out int n_horas, int hora_inicial, ListaSesiones lista_sesiones)
        {
            n_horas = 0;

            for (int i = hora_inicial; i < lista_sesiones.Count; i++)
            {
                if (lista_sesiones[i].EEstadoClase == EEstadoClase.NoProgramada && lista_sesiones[i].Activa)
                {
                    int indice_hora = i % 14;
                    for (int j = 0; j < _duracion_sesiones.Count; j++)
                    {
                        if (_duracion_sesiones[j].Contains(indice_hora))
                        {
                            n_horas = 0;
                            for (int k = 0; k <= j; k++)
                            {
                                if (lista_sesiones[i + j].EEstadoClase != EEstadoClase.NoProgramada ||
                                    !lista_sesiones[i + j].Activa)
                                {
                                    n_horas++;
                                    return(i);
                                }
                                n_horas++;
                            }
                            return(i);
                        }
                    }
                }
            }
            return(-1);
        }
        /// <summary>
        /// Comprueba que sea posible asignar una clase práctica en función de las clases
        /// teóricas programadas hasta el momento en el horario actual
        /// </summary>
        /// <param name="cl"></param>
        /// <param name="lista"></param>
        /// <returns></returns>
        public bool PosibleAsignarPractica(ClasePracticaInfo cl, ListaSesiones lista_sesiones)
        {
            bool no_programadas = false;

            foreach (ClaseTeoricaInfo clase in _teoricas)
            {
                if (clase.EEstadoClase == EEstadoClase.Programada)
                {
                    if ((clase.OidModulo != cl.OidModulo &&
                         (clase.OrdenPrimario >= cl.OrdenPrimario ||
                          (clase.OrdenPrimario == cl.OrdenPrimario &&
                           clase.OrdenSecundario >= cl.OrdenSecundario) ||
                          (clase.OrdenPrimario == cl.OrdenPrimario &&
                           clase.OrdenSecundario == cl.OrdenSecundario &&
                           clase.OrdenTerciario >= cl.OrdenTerciario))) ||
                        (clase.OidModulo == cl.OidModulo &&
                         clase.OrdenPrimario == cl.OrdenPrimario))
                    {
                        return(true);
                    }
                }
                else
                {
                    no_programadas = true;
                }
            }

            //si ya no quedan clases teóricas por programar se puede incluir la práctica
            return(no_programadas ? false : true);
        }
 public bool AsignaInstructorPractica(ClasePracticaInfo clase,
                                      int hora_inicial,
                                      int n_horas,
                                      ListaSesiones lista_sesiones, long sesiones_asignadas)
 {
     AsignaSesion(clase, hora_inicial, n_horas, lista_sesiones, sesiones_asignadas);
     return(true);
 }
 public bool SesionDisponible(int hora_inicial, int n_horas, ListaSesiones lista_sesiones)
 {
     for (int hora = hora_inicial; hora < hora_inicial + n_horas; hora++)
     {
         if (lista_sesiones[hora].EEstadoClase != EEstadoClase.NoProgramada)
         {
             return(false);
         }
     }
     return(true);
 }
        public int BuscaSesionLibre(int n_horas, ListaSesiones lista_sesiones)
        {
            for (int i = 0; i + n_horas - 1 < 75; i++)
            {
                if (SesionDisponible(i, n_horas, lista_sesiones))
                {
                    return(i);
                }
            }

            return(-1);
        }
        public bool AsignaInstructorTeorica(ClaseTeoricaInfo clase,
                                            int hora_inicial,
                                            int n_horas,
                                            ListaSesiones lista_sesiones, long sesiones_asignadas)
        {
            if (AsignaInstructorTeorica2(hora_inicial, n_horas, clase, lista_sesiones, sesiones_asignadas))
            {
                return(true);
            }

            return(false);
        }
 /// <summary>
 /// Función que comprueba que se pueda realizar una práctica en una sesión determinada
 /// en función del campo Incompatible de la clase práctica
 /// </summary>
 /// <param name="lista_sesiones">sesiones del horario actual</param>
 /// <param name="_instructores_asignados">lista de horarios de la misma semana para otras promociones</param>
 /// <param name="index">índice de la sesión en la que se va a insertar la clase práctica</param>
 /// <param name="incompatible">campo Incompatible de la práctica</param>
 /// <returns></returns>
 public bool LaboratorioLibre(int index, long laboratorio, ListaSesiones lista_sesiones, long duracion)
 {
     //se comprueba el horario actual, por si el otro grupo tuviera una práctica
     //con el mismo valor de campo Incompatible
     for (int i = index; i < index + duracion; i++)
     {
         if (lista_sesiones[i].Laboratorio == laboratorio)
         {
             return(false);
         }
     }
     return(true);
 }
        public bool AsignaSesionPractica(int hora_inicial,
                                         out int n_horas, ListaSesiones lista_sesiones, long sesiones_asignadas)
        {
            int n_grupo = GetGrupoConMenosPracticas();

            n_horas = 5;

            for (int i = 1; i < _practicas.Count; i++)
            {
                int indice_practica = 0;

                //Bucle para buscar una clase que pueda ir la sesión
                while (indice_practica < _practicas[n_grupo].Count)
                {
                    ClasePracticaInfo clase = _practicas[n_grupo][indice_practica];
                    clase.Grupo = n_grupo;

                    if (clase.EEstadoClase == EEstadoClase.NoProgramada) // aún no está programada
                    {
                        /*if (!PosibleAsignarPracticaHorario(clase)) break;
                         * if (!PosibleAsignarModulo(clase)) break;
                         * if (!PosibleAsignarSubmodulo(clase)) break;*/

                        if ((lista_sesiones[hora_inicial].OidClasePractica == clase.Oid &&
                             lista_sesiones[hora_inicial].Grupo != n_grupo) ||
                            !PosibleAsignarPractica(clase, lista_sesiones) || !PosibleAsignarModulo(clase) ||
                            !PosibleAsignarSubmodulo(clase) || !PosibleAsignarClase(clase) ||
                            (clase.Laboratorio > 0 &&
                             !LaboratorioLibre(hora_inicial, clase.Laboratorio, lista_sesiones, clase.Duracion)))
                        {
                            indice_practica++;
                            continue;
                        }

                        if (AsignaInstructorPractica(clase, hora_inicial + (5 - (int)clase.Duracion), (int)clase.Duracion, lista_sesiones, sesiones_asignadas))
                        {
                            n_horas = (int)clase.Duracion;
                            _practicas_programadas_grupo[n_grupo]++;
                            break;
                        }
                    }
                    indice_practica++;
                }

                //Calcula el número del siguiente grupo al que asignarle una clase
                n_grupo = (n_grupo % (_practicas.Count - 1)) + 1;
            }
            return(lista_sesiones[hora_inicial].EEstadoClase == EEstadoClase.Programada);
        }
        public HorarioRpt GetHorarioReport(HorarioInfo item,
                                           bool alumno,
                                           /*bool autorizado,*/
                                           ClaseTeoricaList teoricas,
                                           List <ClasePracticaList> practicas,
                                           ClaseExtraList extras,
                                           InstructorList instructores,
                                           ModuloList modulos,
                                           ListaSesiones sesiones,
                                           bool print_timestamp,
                                           DateTime timestamp)
        {
            if (item == null)
            {
                return(null);
            }

            HorarioRpt doc = new HorarioRpt();

            if (instructores == null)
            {
                instructores = InstructorList.GetList(false);
            }
            if (modulos == null)
            {
                modulos = ModuloList.GetList(false);
            }

            List <HorarioPrint> pList = new List <HorarioPrint>();

            pList.Add(item.GetPrintObject(instructores, modulos));

            doc.SetDataSource(pList);

            FormatReport(doc, sesiones, alumno /*, autorizado*/, teoricas, practicas, extras /*, instructores*/);

            if (print_timestamp)
            {
                doc.SetParameterValue("Timestamp", timestamp.ToString("dd/MM/yy HH:mm:ss"));
            }
            else
            {
                doc.SetParameterValue("Timestamp", string.Empty);
            }


            return(doc);
        }
        public int BuscaSesionPracticaLibre(int n_horas, ListaSesiones lista_sesiones)
        {
            for (int i = 0; i + n_horas - 1 < 75; i++)
            {
                if (SesionDisponible(i, n_horas, lista_sesiones))
                {
                    while (i + n_horas < 75 && SesionDisponible(i + 1, n_horas, lista_sesiones))
                    {
                        i++;
                    }
                    return(i);
                }
            }

            return(-1);
        }
        public bool AsignaInstructorTeorica2(int hora_inicial, int n_horas,
                                             ClaseTeoricaInfo clase, ListaSesiones lista_sesiones, long sesiones_asignadas)
        {
            int horas_restantes = 0;

            if (QuedanClasesSubmodulo(clase, n_horas, out horas_restantes))
            {
                AsignaSesion(clase, hora_inicial, n_horas, lista_sesiones, sesiones_asignadas);
            }
            else
            {
                AsignaSesion(clase, hora_inicial, horas_restantes, lista_sesiones, sesiones_asignadas);
                AsignaSesionesOtrosSubmodulos(hora_inicial, n_horas, horas_restantes, clase, lista_sesiones, sesiones_asignadas);
            }

            return(true);
        }
        /// <summary>
        /// Comprueba que no se impartan varias sesiones del mismo módulo el mismo día
        /// </summary>
        /// <returns></returns>
        public bool MismoModuloMismoDia(int indice_horario,
                                        ClaseTeoricaInfo clase, ListaSesiones lista_sesiones)
        {
            int indice_dia = indice_horario - (indice_horario % 14);
            int contador   = 0;

            while (contador < 14 && contador + indice_dia < 75)
            {
                if (clase.OidModulo == lista_sesiones[indice_dia + contador].OidModulo &&
                    indice_dia + contador != indice_horario &&
                    lista_sesiones[indice_dia + contador].OidClaseTeorica > 0)
                {
                    return(true);
                }
                contador++;
            }
            return(false);
        }
Beispiel #14
0
        public static List <ListaSesiones> CargaSesionesProfesores(DateTime fecha, long oid_promocion)
        {
            HorarioList       horarios  = HorarioList.GetList(false);
            ClasePracticaList practicas = ClasePracticaList.GetList();

            if (horarios != null)
            {
                List <ListaSesiones> lista = new List <ListaSesiones>();
                foreach (HorarioInfo info in horarios)
                {
                    if (info.FechaInicial.ToShortDateString() == fecha.ToShortDateString() && info.OidPromocion != oid_promocion)
                    {
                        ListaSesiones list = new ListaSesiones(fecha);
                        Horario       item = Horario.Get(info.Oid);
                        foreach (Sesion ses in item.Sesions)
                        {
                            foreach (SesionAuxiliar aux in list)
                            {
                                if (ses.Fecha.ToShortDateString() == aux.Fecha.ToShortDateString() &&
                                    ses.Hora.ToShortTimeString() == aux.Hora.ToShortTimeString())
                                {
                                    aux.OidProfesor      = ses.OidProfesor;
                                    aux.OidClasePractica = ses.OidClasePractica;
                                    if (ses.OidClasePractica != 0)
                                    {
                                        aux.Incompatible = practicas.GetItem(ses.OidClasePractica).Incompatible;
                                    }
                                    else
                                    {
                                        aux.Incompatible = 0;
                                    }
                                    break;
                                }
                            }
                        }
                        lista.Add(list);
                        item.CloseSession();
                    }
                }
                return(lista);
            }
            return(null);
        }
        public void AsignaSesion(ClasePracticaInfo clase,
                                 int hora_inicial,
                                 int n_horas,
                                 ListaSesiones lista_sesiones,
                                 long sesiones_asignadas)
        {
            clase.EEstadoClase = EEstadoClase.Programada;

            if (lista_sesiones[hora_inicial].EEstadoClase == EEstadoClase.NoProgramada)
            {
                _practicas_semana--;
            }

            if (lista_sesiones[hora_inicial].EEstadoClase == EEstadoClase.NoProgramada)
            {
                lista_sesiones[hora_inicial].AsignaClaseASesion(clase);
            }
            else
            {
                lista_sesiones[hora_inicial + 1].AsignaClaseASesion(clase);
            }

            for (int indice = hora_inicial; indice < hora_inicial + n_horas; indice++)
            {
                if (lista_sesiones[indice].EEstadoClase == EEstadoClase.NoProgramada)
                {
                    sesiones_asignadas++;
                    lista_sesiones[indice].EEstadoClase = EEstadoClase.Programada;
                    //lista_sesiones[indice].AsignaClaseASesion(clase);
                }

                /*else
                 * {
                 *  if (indice % 2 == 0)
                 *  {
                 *      lista_sesiones[indice].AsignaClaseASesion(clase);
                 *  }
                 * }*/
            }
        }
        public void AsignaSesion(ClaseTeoricaInfo clase,
                                 int hora_inicial,
                                 int n_horas,
                                 ListaSesiones lista_sesiones, long sesiones_asignadas)
        {
            clase.EEstadoClase = EEstadoClase.Programada;
            sesiones_asignadas++;
            lista_sesiones[hora_inicial].AsignaClaseASesion(clase);
            int indice_clase = _teoricas.IndexOf(clase) + 1;

            int asignadas = 1;

            while (indice_clase < _teoricas.Count && asignadas < n_horas)
            {
                if (_teoricas[indice_clase].OidSubmodulo == clase.OidSubmodulo && _teoricas[indice_clase].EEstadoClase == EEstadoClase.NoProgramada)
                {
                    _teoricas[indice_clase].EEstadoClase = EEstadoClase.Programada;
                    sesiones_asignadas++;
                    lista_sesiones[hora_inicial + asignadas].AsignaClaseASesion(_teoricas[indice_clase]);
                    asignadas++;
                }
                indice_clase++;
            }
        }
        public bool AsignaSesionTeorica(int hora_inicial,
                                        int n_horas,
                                        ListaSesiones lista_sesiones, long sesiones_asignadas,
                                        bool mismo_modulo)
        {
            int indice_teorica = 0;

            //Bucle para buscar una clase que pueda ir la sesión
            while (indice_teorica < _teoricas.Count)
            {
                ClaseTeoricaInfo clase = _teoricas[indice_teorica];
                if (clase.EEstadoClase == EEstadoClase.NoProgramada &&
                    (!mismo_modulo || (mismo_modulo && !MismoModuloMismoDia(hora_inicial, clase, lista_sesiones))))    // aún no está programada
                {
                    if (AsignaInstructorTeorica(clase, hora_inicial, n_horas, lista_sesiones, sesiones_asignadas))
                    {
                        return(true);
                    }
                }
                indice_teorica++;
            }

            return(false);
        }
Beispiel #18
0
        public ClaseHorarioSelectForm(ListaSesiones sesiones,
                                      ClaseTeoricaList teoricas,
                                      ClasePracticaList practicas,
                                      ClaseExtraList extras)
            : base(true)
        {
            InitializeComponent();

            List <ClaseTeoricaInfo>  t_ordenadas = teoricas.OrdenaLista();
            List <ClasePracticaInfo> p_ordenadas = practicas.OrdenaLista();

            List <ClaseTeoricaInfo>  lista_teoricas  = new List <ClaseTeoricaInfo>();
            List <ClasePracticaInfo> lista_practicas = new List <ClasePracticaInfo>();
            List <ClaseExtraInfo>    lista_extras    = new List <ClaseExtraInfo>();

            foreach (ClaseTeoricaInfo clase in t_ordenadas)
            {
                bool esta = false;
                foreach (SesionAuxiliar item in sesiones)
                {
                    if (item.OidClaseTeorica == clase.Oid)
                    {
                        if (item.Estado == 3)
                        {
                            esta = true;
                        }
                        break;
                    }
                }
                if (!esta)
                {
                    lista_teoricas.Add(clase);
                }
            }

            foreach (ClasePracticaInfo clase in p_ordenadas)
            {
                bool esta = false;
                foreach (SesionAuxiliar item in sesiones)
                {
                    if (item.OidClasePractica == clase.Oid && clase.Grupo == item.Grupo)
                    {
                        if (item.Estado == 3)
                        {
                            esta = true;
                        }
                        break;
                    }
                }
                if (!esta)
                {
                    lista_practicas.Add(clase);
                }
            }

            foreach (ClaseExtraInfo clase in extras)
            {
                bool esta = false;
                foreach (SesionAuxiliar item in sesiones)
                {
                    if (item.OidClaseExtra == clase.Oid)
                    {
                        if (item.Estado == 3)
                        {
                            esta = true;
                        }
                        break;
                    }
                }
                if (!esta)
                {
                    lista_extras.Add(clase);
                }
            }

            Datos_Teoricas.DataSource = lista_teoricas;

            Datos_Practicas.DataSource = lista_practicas;

            Datos_Extras.DataSource = lista_extras;

            this.Text = Resources.Labels.CLASE_HORARIO_TITLE;
        }
Beispiel #19
0
        protected void DoHorario()
        {
            try
            {
                PgMng.Reset(12, 1, Resources.Messages.UPDATING_PROMOCION_HORARIO, this);
                //Se rellena lo referente al plan
                if (_planes == null)
                {
                    return;
                }

                if (EntityInfo.Plan == null)
                {
                    Plan_CB.Text = _planes.GetItem(EntityInfo.OidPlan).Nombre;
                }
                else
                {
                    Plan_CB.Text = EntityInfo.Plan;
                }
                PgMng.Grow(string.Empty, "Plan");

                //Se rellena lo referente a la promoción
                if (_promociones == null)
                {
                    return;
                }

                if (EntityInfo.Promocion != string.Empty && EntityInfo.Promocion != null)
                {
                    Promocion_CB.Text = EntityInfo.Promocion;
                }
                else
                {
                    Promocion_CB.Text = _promociones.GetItem(EntityInfo.OidPromocion).Nombre;
                }
                PgMng.Grow(string.Empty, "Promocion");

                DateTime hoy = DateTime.Today;

                // si la fecha del horario que se va a cargar es anterior a la del día en el que se edita
                // no se tiene en cuenta si las clases sesiones planificadas se han impartido o no para meterlas
                // en las lista, ya que de ningún modo se va a permitir modificar un horario antiguo
                if (hoy.Date >= EntityInfo.FechaInicial)
                {
                    hoy = EntityInfo.FechaInicial;
                }
                else
                {
                    while (hoy.DayOfWeek != DayOfWeek.Monday)
                    {
                        hoy = hoy.AddDays(-1);
                    }
                }
                PgMng.Grow(string.Empty, "Hoy");

                for (int i = 1; i < 3; i++)
                {
                    if (_practicas.Count <= i)
                    {
                        _practicas.Add(ClasePracticaList.GetDisponiblesList(EntityInfo.OidPlan, EntityInfo.OidPromocion, EntityInfo.Oid, i));
                    }
                }
                if (_teoricas == null)
                {
                    _teoricas = ClaseTeoricaList.GetDisponiblesList(EntityInfo.OidPlan, EntityInfo.OidPromocion, EntityInfo.Oid);
                }
                if (_extras == null)
                {
                    _extras = ClaseExtraList.GetDisponiblesList(EntityInfo.OidPromocion, EntityInfo.Oid);
                }
                PgMng.Grow(string.Empty, "clases");

                _day = Fecha_DTP.Value;
                while (_day.DayOfWeek != System.DayOfWeek.Monday)
                {
                    _day = _day.AddDays(-1);
                }

                this.Text = Resources.Labels.HORARIO_ADD_TITLE +
                            "De Lunes, " + _day.ToShortDateString() +
                            " A Sábado, " + _day.AddDays(5).ToShortDateString();

                if (_day < Fecha_DTP.MinDate)
                {
                    Fecha_DTP.Value = Fecha_DTP.MinDate;
                }
                else
                {
                    Fecha_DTP.Value = _day;
                }
                PgMng.Grow(string.Empty, "Fecha_DTP");

                if (_instructores_asignados == null)
                {
                    _instructores_asignados = Sesion.CargaSesionesProfesores(EntityInfo.FechaInicial, EntityInfo.OidPromocion);
                }
                if (_profesores == null)
                {
                    _profesores = InstructorList.GetList(true);
                }

                _disponibilidades = _profesores.GetDisponibilidadesProfesores(_entity.FechaInicial);
                PgMng.Grow(string.Empty, "Instructores y profesores");

                CLB_1.SetItemChecked(0, EntityInfo.H8AM);
                CLB_1.SetItemChecked(1, EntityInfo.H0);
                CLB_1.SetItemChecked(2, EntityInfo.H1);
                CLB_1.SetItemChecked(3, EntityInfo.H2);
                CLB_1.SetItemChecked(4, EntityInfo.H3);
                CLB_1.SetItemChecked(5, EntityInfo.H4);
                CLB_1.SetItemChecked(6, EntityInfo.H5);
                CLB_1.SetItemChecked(7, EntityInfo.H6);
                CLB_1.SetItemChecked(8, EntityInfo.H7);
                CLB_1.SetItemChecked(9, EntityInfo.H8);
                CLB_1.SetItemChecked(10, EntityInfo.H9);
                CLB_1.SetItemChecked(11, EntityInfo.H10);
                CLB_1.SetItemChecked(12, EntityInfo.H11);
                CLB_1.SetItemChecked(13, EntityInfo.H12);

                CLB_2.SetItemChecked(0, EntityInfo.Hs0);
                CLB_2.SetItemChecked(1, EntityInfo.Hs1);
                CLB_2.SetItemChecked(2, EntityInfo.Hs2);
                CLB_2.SetItemChecked(3, EntityInfo.Hs3);
                CLB_2.SetItemChecked(4, EntityInfo.Hs4);
                PgMng.Grow(string.Empty, "Lista horas");

                //Se rellena la fecha
                Fecha_DTP.Value = EntityInfo.FechaInicial;
                this.Text       = Resources.Labels.HORARIO_ADD_TITLE +
                                  "De Lunes, " + EntityInfo.FechaInicial.ToShortDateString() +
                                  " A Sábado, " + EntityInfo.FechaInicial.AddDays(5).ToShortDateString();
                PgMng.Grow(string.Empty, "string fechas");

                //Se rellena el horario
                if (_lista_sesiones == null)
                {
                    _lista_sesiones = new ListaSesiones(EntityInfo.FechaInicial);
                    //ResetSesiones(false);
                    PgMng.Grow(string.Empty, "lista sesiones");

                    Horario.MuestraSesiones(EntityInfo.Sesions, _lista_sesiones, _teoricas, ClasePracticaList.Merge(_practicas[1], _practicas[2]), _extras);
                }

                Confirmar_BT.Enabled = true;
                Marcar_BT.Enabled    = true;
                Generar_BT.Enabled   = true;
                PgMng.Grow(string.Empty, "MuestraSesiones");

                if (_combo_clases == null)
                {
                    _combo_clases = Submodulo.GetComboClases(_teoricas, ClasePracticaList.Merge(_practicas[1], _practicas[2]), _extras);
                }
                _combo_clases.Childs    = _combo_instructores;
                Datos_Clases.DataSource = _combo_clases;
                PgMng.Grow(string.Empty, "combo_clases");

                Lunes_LB.Text = "LUNES (" + EntityInfo.FechaInicial.Day.ToString("00") + "/" +
                                EntityInfo.FechaInicial.Month.ToString("00") + ")";
                Martes_LB.Text = "MARTES (" + EntityInfo.FechaInicial.AddDays(1).Day.ToString("00") + "/" +
                                 EntityInfo.FechaInicial.AddDays(1).Month.ToString("00") + ")";
                Miercoles_LB.Text = "MIÉRCOLES (" + EntityInfo.FechaInicial.AddDays(2).Day.ToString("00") + "/" +
                                    EntityInfo.FechaInicial.AddDays(2).Month.ToString("00") + ")";
                Jueves_LB.Text = "JUEVES (" + EntityInfo.FechaInicial.AddDays(3).Day.ToString("00") + "/" +
                                 EntityInfo.FechaInicial.AddDays(3).Month.ToString("00") + ")";
                Viernes_LB.Text = "VIERNES (" + EntityInfo.FechaInicial.AddDays(4).Day.ToString("00") + "/" +
                                  EntityInfo.FechaInicial.AddDays(4).Month.ToString("00") + ")";
                Sabado_LB.Text = "SÁBADO (" + EntityInfo.FechaInicial.AddDays(5).Day.ToString("00") + "/" +
                                 EntityInfo.FechaInicial.AddDays(5).Month.ToString("00") + ")";
            }
            finally
            {
                PgMng.FillUp();
            }
        }
        private static void FormatReport(HorarioRpt rpt,
                                         ListaSesiones list,
                                         bool alumnos,
                                         /*bool autorizado,*/
                                         ClaseTeoricaList teoricas,
                                         List <ClasePracticaList> practicas,
                                         ClaseExtraList extras /*,
                                                                * InstructorList instructores*/)
        {
            List <string> lista = new List <string>();

            lista.Add("Lunes8AM");
            lista.Add("Lunes");
            lista.Add("Lunes2");
            lista.Add("Lunes3");
            lista.Add("Lunes4");
            lista.Add("Lunes5");
            lista.Add("Lunes6");
            lista.Add("Lunes7");
            lista.Add("Lunes8");
            lista.Add("Lunes9");
            lista.Add("Lunes10");
            lista.Add("Lunes11");
            lista.Add("Lunes12");
            lista.Add("Lunes13");

            lista.Add("Martes8AM");
            lista.Add("Martes");
            lista.Add("Martes2");
            lista.Add("Martes3");
            lista.Add("Martes4");
            lista.Add("Martes5");
            lista.Add("Martes6");
            lista.Add("Martes7");
            lista.Add("Martes8");
            lista.Add("Martes9");
            lista.Add("Martes10");
            lista.Add("Martes11");
            lista.Add("Martes12");
            lista.Add("Martes13");

            lista.Add("Miercoles8AM");
            lista.Add("Miercoles");
            lista.Add("Miercoles2");
            lista.Add("Miercoles3");
            lista.Add("Miercoles4");
            lista.Add("Miercoles5");
            lista.Add("Miercoles6");
            lista.Add("Miercoles7");
            lista.Add("Miercoles8");
            lista.Add("Miercoles9");
            lista.Add("Miercoles10");
            lista.Add("Miercoles12");
            lista.Add("Miercoles11");
            lista.Add("Miercoles13");

            lista.Add("Jueves8AM");
            lista.Add("Jueves");
            lista.Add("Jueves2");
            lista.Add("Jueves3");
            lista.Add("Jueves4");
            lista.Add("Jueves5");
            lista.Add("Jueves6");
            lista.Add("Jueves7");
            lista.Add("Jueves8");
            lista.Add("Jueves9");
            lista.Add("Jueves10");
            lista.Add("Jueves11");
            lista.Add("Jueves12");
            lista.Add("Jueves13");

            lista.Add("Viernes8AM");
            lista.Add("Viernes");
            lista.Add("Viernes2");
            lista.Add("Viernes3");
            lista.Add("Viernes4");
            lista.Add("Viernes5");
            lista.Add("Viernes6");
            lista.Add("Viernes7");
            lista.Add("Viernes8");
            lista.Add("Viernes9");
            lista.Add("Viernes10");
            lista.Add("Viernes11");
            lista.Add("Viernes12");
            lista.Add("Viernes13");

            lista.Add("Sabado");
            lista.Add("Sabado2");
            lista.Add("Sabado3");
            lista.Add("Sabado4");
            lista.Add("Sabado5");

            InstructorList instructores = InstructorList.GetList(true);

            int    ultimo   = 0;
            int    n_clases = 0;
            string aux      = string.Empty;

            foreach (SesionAuxiliar info in list)
            {
                int indice = list.IndexOf(info);

                //si la sesión no tienen ninguna clase asignada, se elimina la etiqueta
                if (info.OidClaseTeorica <= 0 &&
                    info.OidClasePractica == 0 &&
                    info.OidClaseExtra == 0)
                {
                    rpt.SetParameterValue(lista[indice], "");
                    ((FieldObject)(rpt.Section3.ReportObjects[lista[indice]])).ObjectFormat.EnableSuppress = true;
                }
                else
                {
                    //si la sesión tiene una clase asignada una clase teórica
                    if (info.OidClaseTeorica != 0)
                    {
                        ClaseTeoricaInfo teorica = teoricas.GetItem(info.OidClaseTeorica);
                        //si no es la primera clase del día
                        //se comprueba si pertenece a la misma clase que la hora anterior
                        if (indice % 14 != 0 && list[indice - 1].OidClaseTeorica > 0)
                        {
                            bool misma_clase = false;
                            if (teorica.OidModulo ==
                                teoricas.GetItem(list[indice - 1].OidClaseTeorica).OidModulo &&
                                teorica.OidSubmodulo ==
                                teoricas.GetItem(list[indice - 1].OidClaseTeorica).OidSubmodulo &&
                                info.OidProfesor == list[indice - 1].OidProfesor)
                            {
                                misma_clase = true;
                                rpt.SetParameterValue(lista[indice], "");
                                ((FieldObject)(rpt.Section3.ReportObjects[lista[indice]])).ObjectFormat.EnableSuppress = true;
                                if (!alumnos)
                                {
                                    InstructorInfo item       = instructores.GetItem(info.OidProfesor);
                                    string         instructor = item.Alias;
                                    instructor += Environment.NewLine;
                                    int ind = aux.IndexOf(instructor);
                                    if (ind == -1)
                                    {
                                        misma_clase = false;
                                    }
                                }
                                else
                                {
                                    aux = Environment.NewLine + aux;
                                }
                                if (misma_clase)
                                {
                                    ((FieldObject)(rpt.Section3.ReportObjects[lista[ultimo]])).Height = ((FieldObject)(rpt.Section3.ReportObjects[lista[ultimo]])).Height + 720;
                                    rpt.SetParameterValue(lista[ultimo], aux);
                                    if (n_clases == 1)
                                    {
                                        ((FieldObject)(rpt.Section3.ReportObjects[lista[ultimo]])).Top += 80;
                                    }
                                    n_clases++;
                                }
                            }
                            if (!misma_clase)
                            {
                                ModuloInfo modulo = ModuloInfo.Get(teorica.OidModulo, false);
                                aux  = Environment.NewLine + modulo.Alias + Environment.NewLine;
                                aux += teorica.Submodulo + Environment.NewLine;
                                if (!alumnos)
                                {
                                    InstructorInfo item       = instructores.GetItem(info.OidProfesor);
                                    string         instructor = item.Alias;
                                    instructor += Environment.NewLine;
                                    aux        += instructor;
                                }
                                ((FieldObject)(rpt.Section3.ReportObjects[lista[indice]])).ObjectFormat.EnableSuppress = false;
                                ((FieldObject)(rpt.Section3.ReportObjects[lista[indice]])).Top -= 80;
                                rpt.SetParameterValue(lista[indice], aux);
                                ultimo   = indice;
                                n_clases = 1;
                            }
                        }
                        else
                        {
                            ModuloInfo modulo = ModuloInfo.Get(teorica.OidModulo, false);
                            aux  = Environment.NewLine + modulo.Alias + Environment.NewLine;
                            aux += teorica.Submodulo + Environment.NewLine;
                            if (!alumnos)
                            {
                                InstructorInfo item       = instructores.GetItem(info.OidProfesor);
                                string         instructor = item.Alias;
                                instructor += Environment.NewLine;
                                aux        += instructor;
                            }
                            ((FieldObject)(rpt.Section3.ReportObjects[lista[indice]])).ObjectFormat.EnableSuppress = false;
                            ((FieldObject)(rpt.Section3.ReportObjects[lista[indice]])).Top -= 80;
                            rpt.SetParameterValue(lista[indice], aux);
                            ultimo   = indice;
                            n_clases = 1;
                        }
                    }
                    else
                    {
                        if (info.OidClasePractica != 0)
                        {
                            ClasePracticaInfo practica = practicas[(int)info.Grupo].GetItem(info.OidClasePractica);
                            //if (indice % 14 != 0)
                            {
                                int  ind_aux  = 1;
                                bool esta     = false;
                                bool anterior = false;

                                //if (indice % 14 != 0)
                                //{
                                while (ind_aux < 5 && (indice - ind_aux) >= 0 && (indice - ind_aux) % 14 < indice % 14)
                                {
                                    if (list[indice - ind_aux].OidClasePractica != 0 &&
                                        practica.OidModulo ==
                                        practicas[(int)list[indice - ind_aux].Grupo].GetItem(list[indice - ind_aux].OidClasePractica).OidModulo &&
                                        info.OidProfesor == list[indice - ind_aux].OidProfesor &&
                                        info.Grupo == list[indice - ind_aux].Grupo)       //comprobación de grupo por si fuera la misma práctica para los dos grupos
                                    {
                                        esta = true;
                                        break;
                                    }
                                    if (list[indice - ind_aux].OidClasePractica != 0)
                                    {
                                        anterior = true;
                                    }
                                    ind_aux++;
                                }

                                ind_aux = 1;
                                bool posterior = false;
                                while (ind_aux < 5 && (indice + ind_aux) % 14 > indice % 14 && (indice + ind_aux) < 75)
                                {
                                    if (list[indice + ind_aux].OidClasePractica != 0 &&
                                        list[indice + ind_aux].OidClasePractica != list[indice].OidClasePractica)
                                    {
                                        posterior = true;
                                    }
                                    ind_aux++;
                                }
                                //}

                                if (!esta)
                                {
                                    aux  = Environment.NewLine + practica.Modulo + Environment.NewLine;
                                    aux += practica.Alias + " G" + list[indice].Grupo.ToString() + Environment.NewLine;
                                    if (!alumnos)
                                    {
                                        InstructorInfo item       = instructores.GetItem(info.OidProfesor);
                                        string         instructor = item.Alias;
                                        instructor += Environment.NewLine;
                                        aux        += instructor;
                                        aux        += Environment.NewLine;
                                        aux        += "5H";
                                    }
                                    rpt.SetParameterValue(lista[indice], aux);
                                    if (!anterior)
                                    {
                                        if (posterior)
                                        {
                                            ((FieldObject)(rpt.Section3.ReportObjects[lista[indice]])).Height = 1560;
                                        }
                                        else
                                        {
                                            ((FieldObject)(rpt.Section3.ReportObjects[lista[indice]])).Height = 3200;
                                        }
                                    }
                                    else
                                    {
                                        int top = 0;
                                        int i   = 1;
                                        while (i < 5 && indice - i >= 0)
                                        {
                                            if (!((FieldObject)(rpt.Section3.ReportObjects[lista[indice - i]])).ObjectFormat.EnableSuppress)
                                            {
                                                top = ((FieldObject)(rpt.Section3.ReportObjects[lista[indice - i]])).Top + 1560 + 240;
                                                break;
                                            }
                                            i++;
                                        }
                                        ((FieldObject)(rpt.Section3.ReportObjects[lista[indice]])).Height = 1560;
                                        ((FieldObject)(rpt.Section3.ReportObjects[lista[indice]])).Top    = top;
                                    }
                                    ((FieldObject)(rpt.Section3.ReportObjects[lista[indice]])).ObjectFormat.EnableSuppress = false;
                                }
                                else
                                {
                                    rpt.SetParameterValue(lista[indice], "");
                                    ((FieldObject)(rpt.Section3.ReportObjects[lista[indice]])).ObjectFormat.EnableSuppress = true;
                                }
                            }
                        }
                        else
                        {
                            ClaseExtraInfo extra = extras.GetItem(info.OidClaseExtra);
                            //si no es la primera clase del día
                            //se comprueba si pertenece a la misma clase que la hora anterior
                            if (indice % 14 != 0 && list[indice - 1].OidClaseExtra > 0)
                            {
                                bool misma_clase = false;
                                if (extra.OidModulo ==
                                    extras.GetItem(list[indice - 1].OidClaseExtra).OidModulo &&
                                    extra.OidSubmodulo ==
                                    extras.GetItem(list[indice - 1].OidClaseExtra).OidSubmodulo &&
                                    info.OidProfesor == list[indice - 1].OidProfesor)
                                {
                                    misma_clase = true;
                                    rpt.SetParameterValue(lista[indice], "");
                                    ((FieldObject)(rpt.Section3.ReportObjects[lista[indice]])).ObjectFormat.EnableSuppress = true;
                                    if (!alumnos)
                                    {
                                        InstructorInfo item       = instructores.GetItem(info.OidProfesor);
                                        string         instructor = item.Alias;
                                        instructor += Environment.NewLine;
                                        int ind = aux.IndexOf(instructor);
                                        if (ind == -1)
                                        {
                                            misma_clase = false;
                                        }
                                    }
                                    else
                                    {
                                        aux = Environment.NewLine + aux;
                                    }

                                    if (misma_clase)
                                    {
                                        ((FieldObject)(rpt.Section3.ReportObjects[lista[ultimo]])).Height = ((FieldObject)(rpt.Section3.ReportObjects[lista[ultimo]])).Height + 720;
                                        rpt.SetParameterValue(lista[ultimo], aux);
                                        if (n_clases == 1)
                                        {
                                            ((FieldObject)(rpt.Section3.ReportObjects[lista[ultimo]])).Top += 80;
                                        }
                                        n_clases++;
                                    }
                                }
                                if (!misma_clase)
                                {
                                    ModuloInfo modulo = ModuloInfo.Get(extra.OidModulo, false);
                                    aux  = Environment.NewLine + modulo.Alias + Environment.NewLine;
                                    aux += extra.Submodulo + Environment.NewLine;
                                    if (!alumnos)
                                    {
                                        InstructorInfo item       = instructores.GetItem(info.OidProfesor);
                                        string         instructor = item.Alias;
                                        instructor += Environment.NewLine;
                                        aux        += instructor;
                                    }
                                    ((FieldObject)(rpt.Section3.ReportObjects[lista[indice]])).ObjectFormat.EnableSuppress = false;
                                    ((FieldObject)(rpt.Section3.ReportObjects[lista[indice]])).Top -= 80;
                                    rpt.SetParameterValue(lista[indice], aux);
                                    ultimo   = indice;
                                    n_clases = 1;
                                }
                            }
                            else
                            {
                                ModuloInfo modulo = ModuloInfo.Get(extra.OidModulo, false);
                                aux  = Environment.NewLine + modulo.Alias + Environment.NewLine;
                                aux += extra.Submodulo + Environment.NewLine;
                                if (!alumnos)
                                {
                                    InstructorInfo item       = instructores.GetItem(info.OidProfesor);
                                    string         instructor = item.Alias;
                                    instructor += Environment.NewLine;
                                    aux        += instructor;
                                }
                                ((FieldObject)(rpt.Section3.ReportObjects[lista[indice]])).ObjectFormat.EnableSuppress = false;
                                ((FieldObject)(rpt.Section3.ReportObjects[lista[indice]])).Top -= 80;
                                rpt.SetParameterValue(lista[indice], aux);
                                ultimo   = indice;
                                n_clases = 1;
                            }
                        }
                    }
                }
            }
        }
        protected override void DoPromociones()
        {
            try
            {
                PgMng.Reset(15, 1, Resources.Messages.UPDATING_PROMOCION_HORARIO, this);
                DateTime hoy = DateTime.Today;

                // si la fecha del horario que se va a cargar es anterior a la del día en el que se edita
                // no se tiene en cuenta si las clases sesiones planificadas se han impartido o no para meterlas
                // en las lista, ya que de ningún modo se va a permitir modificar un horario antiguo
                if (hoy.Date >= Entity.FechaInicial)
                {
                    hoy = Entity.FechaInicial;
                }
                else
                {
                    while (hoy.DayOfWeek != DayOfWeek.Monday)
                    {
                        hoy = hoy.AddDays(-1);
                    }
                }

                for (int i = 1; i < 3; i++)
                {
                    ClasePracticaList practicas = ClasePracticaList.GetDisponiblesList(Entity.OidPlan, Entity.OidPromocion, Entity.Oid, i);
                    if (_practicas.Count <= i)
                    {
                        _practicas.Add(practicas);
                    }
                    else
                    {
                        _practicas[i] = practicas;
                    }
                    PgMng.Grow(string.Empty, "Rellena clases prácticas grupo " + i.ToString());
                }
                _teoricas = ClaseTeoricaList.GetDisponiblesList(Entity.OidPlan, Entity.OidPromocion, Entity.Oid);
                PgMng.Grow(string.Empty, "Rellena clases teóricas");
                _extras = ClaseExtraList.GetDisponiblesList(Entity.OidPromocion, Entity.Oid);
                PgMng.Grow(string.Empty, "Rellena clases extra");

                //_combo_clases = Submodulo.GetComboClases(_teoricas, ClasePracticaList.Merge(_practicas[1],_practicas[2]), _extras);
                //pmg.Grow("combo clases");

                //pmg.Grow("Rellena fecha");

                while (_day.DayOfWeek != System.DayOfWeek.Monday)
                {
                    _day = _day.AddDays(-1);
                }
                Fecha_DTP.Value = _day;
                DoSetFecha();

                if (Promocion_CB.SelectedItem != null)
                {
                    //ResetSesiones(false);
                    PgMng.Grow(string.Empty, "reset sesiones");
                    _profesores = InstructorList.GetInstructoresHorariosList(((ComboBoxSource)Promocion_CB.SelectedItem).Oid, EntityInfo.FechaInicial, EntityInfo.FechaFinal);
                }

                if (_profesores != null)
                {
                    _disponibilidades = _profesores.GetDisponibilidadesProfesores(_day);
                }
                PgMng.Grow(string.Empty, "_profesores");


                if (Entity.OidPromocion != 0)
                {
                    PromocionInfo promocion = _promociones.GetItem(Entity.OidPromocion);
                    _entity.Promocion = promocion.Nombre;
                    PlanEstudiosInfo plan = _planes.GetItem(promocion.OidPlan);
                    _entity.Plan = plan.Nombre;

                    PgMng.Grow(string.Empty, "Promociones");
                    //_profesores = InstructorList.GetInstructoresHorariosList(Entity.OidPromocion);
                    PgMng.Grow(string.Empty, "GetInstructoresHorarioList");

                    CLB_1.SetItemChecked(0, promocion.H8AM);
                    CLB_1.SetItemChecked(1, promocion.H0);
                    CLB_1.SetItemChecked(2, promocion.H1);
                    CLB_1.SetItemChecked(3, promocion.H2);
                    CLB_1.SetItemChecked(4, promocion.H3);
                    CLB_1.SetItemChecked(5, promocion.H4);
                    CLB_1.SetItemChecked(6, promocion.H5);
                    CLB_1.SetItemChecked(7, promocion.H6);
                    CLB_1.SetItemChecked(8, promocion.H7);
                    CLB_1.SetItemChecked(9, promocion.H8);
                    CLB_1.SetItemChecked(10, promocion.H9);
                    CLB_1.SetItemChecked(11, promocion.H10);
                    CLB_1.SetItemChecked(12, promocion.H11);
                    CLB_1.SetItemChecked(13, promocion.H12);

                    CLB_2.SetItemChecked(0, promocion.HS0);
                    CLB_2.SetItemChecked(1, promocion.HS1);
                    CLB_2.SetItemChecked(2, promocion.HS2);
                    CLB_2.SetItemChecked(3, promocion.HS3);
                    CLB_2.SetItemChecked(4, promocion.HS4);

                    PgMng.Grow(string.Empty, "SetItemChecked");

                    Entity.CopiaConfiguracion(promocion);
                }
                PgMng.Grow(string.Empty, "Inicializa horas disponibles");

                if (!_generado)
                {
                    Generar_BT.Enabled = true;
                }
                Instructores_BT.Enabled     = true;
                Planes_BT.Enabled           = true;
                Disponibilidades_BT.Enabled = true;

                if (_lista_sesiones == null)
                {
                    _lista_sesiones = new ListaSesiones(Entity.FechaInicial);
                }
                RellenaCasillas();
            }
            finally
            {
                PgMng.FillUp();
            }
        }
        protected void DoSetFecha()
        {
            try
            {
                if (Fecha_DTP.Value.Date.Equals(Fecha_DTP.MinDate))
                {
                    _day = DateTime.Today;
                }
                else
                {
                    _day = Fecha_DTP.Value;
                }

                while (_day.DayOfWeek != System.DayOfWeek.Monday)
                {
                    _day = _day.AddDays(-1);
                }

                this.Text = Resources.Labels.HORARIO_ADD_TITLE +
                            "De Lunes, " + _day.ToShortDateString() +
                            " A Sábado, " + _day.AddDays(5).ToShortDateString();

                if (_day < Fecha_DTP.MinDate)
                {
                    Fecha_DTP.Value = Fecha_DTP.MinDate;
                }
                else
                {
                    Fecha_DTP.Value = _day;
                }

                Entity.FechaInicial = _day;
                Entity.FechaFinal   = _day.AddDays(5);

                PgMng.Grow(string.Empty, "Inicializa fecha y ristras");

                _lista_sesiones = new ListaSesiones(Entity.FechaInicial);

                PgMng.Grow(string.Empty, "lista_sesiones");

                _instructores_asignados = Sesion.CargaSesionesProfesores(Entity.FechaInicial, Entity.OidPromocion);
                PgMng.Grow(string.Empty, "instructores_asignados");

                ResetSesiones(true);
                PgMng.Grow(string.Empty, "Reset sesiones");

                if (_profesores != null)
                {
                    _disponibilidades = _profesores.GetDisponibilidadesProfesores(_day);
                }

                Generar_BT.Enabled = true;

                Lunes_LB.Text = "LUNES (" + EntityInfo.FechaInicial.Day.ToString("00") + "/" +
                                Entity.FechaInicial.Month.ToString("00") + ")";
                Martes_LB.Text = "MARTES (" + EntityInfo.FechaInicial.AddDays(1).Day.ToString("00") + "/" +
                                 Entity.FechaInicial.AddDays(1).Month.ToString("00") + ")";
                Miercoles_LB.Text = "MIÉRCOLES (" + EntityInfo.FechaInicial.AddDays(2).Day.ToString("00") + "/" +
                                    Entity.FechaInicial.AddDays(2).Month.ToString("00") + ")";
                Jueves_LB.Text = "JUEVES (" + EntityInfo.FechaInicial.AddDays(3).Day.ToString("00") + "/" +
                                 Entity.FechaInicial.AddDays(3).Month.ToString("00") + ")";
                Viernes_LB.Text = "VIERNES (" + EntityInfo.FechaInicial.AddDays(4).Day.ToString("00") + "/" +
                                  Entity.FechaInicial.AddDays(4).Month.ToString("00") + ")";
                Sabado_LB.Text = "SÁBADO (" + EntityInfo.FechaInicial.AddDays(5).Day.ToString("00") + "/" +
                                 Entity.FechaInicial.AddDays(5).Month.ToString("00") + ")";
            }
            catch
            {
                return;
            }
        }
        protected void DoNuevoHorario()
        {
            try
            {
                PgMng.Reset(10, 1, Resources.Messages.CREANDO_HORARIO, this);

                if (this is HorarioAddForm && Horario.ExisteHorario(Entity.OidPlan, Entity.OidPromocion, Entity.FechaInicial))
                {
                    MessageBox.Show("Ya existe un horario para la promoción y fecha indicadas, si lo desea modifique el que ya existe.");
                    PgMng.FillUp();
                    return;
                }

                profesores_encargados.GetEncargados(Entity.OidPlan, Entity.OidPromocion);
                PgMng.Grow();

                _combo_clases           = Submodulo.GetComboClases(_teoricas, ClasePracticaList.Merge(_practicas[1], _practicas[2]), _extras);
                Datos_Clases.DataSource = _combo_clases;
                PgMng.Grow();

                _instructores_asignados = Sesion.CargaSesionesProfesores(Entity.FechaInicial, Entity.OidPromocion);
                PgMng.Grow();

                if (_profesores == null)
                {
                    _profesores = InstructorList.GetInstructoresHorariosList(EntityInfo.OidPromocion, EntityInfo.FechaInicial, EntityInfo.FechaFinal);
                }
                PgMng.Grow();

                CleanAction();
                PgMng.Grow(string.Empty, "CleanAction");

                if (_generado)
                {
                    ResetNoConfirmadas();
                }
                PgMng.Grow(string.Empty, "ResetNoConfirmadas");

                if (_lista_sesiones == null)
                {
                    _lista_sesiones = new ListaSesiones(Entity.FechaInicial);
                }

                if (!Entity.FechaInicial.Date.Equals(_lista_sesiones[0].Fecha.Date))
                {
                    DateTime fecha = Entity.FechaInicial;
                    for (int i = 0; i < 70; i += 14)
                    {
                        _lista_sesiones[i].Fecha      = fecha;
                        _lista_sesiones[i + 1].Fecha  = fecha;
                        _lista_sesiones[i + 2].Fecha  = fecha;
                        _lista_sesiones[i + 3].Fecha  = fecha;
                        _lista_sesiones[i + 4].Fecha  = fecha;
                        _lista_sesiones[i + 5].Fecha  = fecha;
                        _lista_sesiones[i + 6].Fecha  = fecha;
                        _lista_sesiones[i + 7].Fecha  = fecha;
                        _lista_sesiones[i + 8].Fecha  = fecha;
                        _lista_sesiones[i + 9].Fecha  = fecha;
                        _lista_sesiones[i + 10].Fecha = fecha;
                        _lista_sesiones[i + 11].Fecha = fecha;
                        _lista_sesiones[i + 12].Fecha = fecha;
                        _lista_sesiones[i + 13].Fecha = fecha;
                        fecha = fecha.AddDays(1);
                    }
                    for (int i = 70; i < 75; i++)
                    {
                        _lista_sesiones[i].Fecha = fecha;
                    }
                }

                _lista_sesiones = Entity.SetSesionesActivas(_lista_sesiones);
                PgMng.Grow(string.Empty, "Entity.SetSesionesActivas");

                decimal n_practicas = 11;
                if (Practicas_CB.Checked)
                {
                    n_practicas = NPracticas.Value;
                }

                HorarioController controlador = new HorarioController(_entity, _lista_sesiones,
                                                                      _teoricas, _practicas, _extras, _profesores,
                                                                      profesores_encargados, _instructores_asignados,
                                                                      _disponibilidades, n_practicas, DiasSuplente.Value);

                controlador.Rules[(int)TRule.MismoInstructorMismaSesion] = !MismoInstructorMismaSesion_CB.Checked;
                controlador.Rules[(int)TRule.MismoInstructorMismoDia]    = !MismoInstructorMismoDia_CB.Checked;

                controlador.GeneraHorario(_no_asignables);
                PgMng.Grow(string.Empty, "Generación de horario");

                RellenaCasillas();
                PgMng.Grow(string.Empty, "Rellenar Casillas");

                Completar_BT.Enabled = false;
                Marcar_BT.Enabled    = true;
                Clean_BT.Enabled     = true;
                if (this is HorarioEditForm)
                {
                    Confirmar_BT.Enabled = true;
                }
                _generado = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                PgMng.FillUp();
            }
        }
        public virtual ListaSesiones SetSesionesActivas(ListaSesiones lista_sesiones, DateTime inicio_promocion, DateTime inicio_semana)
        {
            if (lista_sesiones != null)
            {
                //de lunes a viernes a 1ª hora
                lista_sesiones[0].Activa  = _activas_dia[0];
                lista_sesiones[14].Activa = _activas_dia[0];
                lista_sesiones[28].Activa = _activas_dia[0];
                lista_sesiones[42].Activa = _activas_dia[0];
                lista_sesiones[56].Activa = _activas_dia[0];


                //de lunes a viernes a 2ª hora
                lista_sesiones[1].Activa  = _activas_dia[1];
                lista_sesiones[15].Activa = _activas_dia[1];
                lista_sesiones[29].Activa = _activas_dia[1];
                lista_sesiones[43].Activa = _activas_dia[1];
                lista_sesiones[57].Activa = _activas_dia[1];

                //de lunes a viernes a 3ª hora
                lista_sesiones[2].Activa  = _activas_dia[2];
                lista_sesiones[16].Activa = _activas_dia[2];
                lista_sesiones[30].Activa = _activas_dia[2];
                lista_sesiones[44].Activa = _activas_dia[2];
                lista_sesiones[58].Activa = _activas_dia[2];


                //de lunes a viernes a 4ª hora
                lista_sesiones[3].Activa  = _activas_dia[3];
                lista_sesiones[17].Activa = _activas_dia[3];
                lista_sesiones[31].Activa = _activas_dia[3];
                lista_sesiones[45].Activa = _activas_dia[3];
                lista_sesiones[59].Activa = _activas_dia[3];

                //de lunes a viernes a 5ª hora
                lista_sesiones[4].Activa  = _activas_dia[4];
                lista_sesiones[18].Activa = _activas_dia[4];
                lista_sesiones[32].Activa = _activas_dia[4];
                lista_sesiones[46].Activa = _activas_dia[4];
                lista_sesiones[60].Activa = _activas_dia[4];


                //de lunes a viernes a 6ª hora
                lista_sesiones[5].Activa  = _activas_dia[5];
                lista_sesiones[19].Activa = _activas_dia[5];
                lista_sesiones[33].Activa = _activas_dia[5];
                lista_sesiones[47].Activa = _activas_dia[5];
                lista_sesiones[61].Activa = _activas_dia[5];

                //de lunes a viernes a 7ª hora
                lista_sesiones[6].Activa  = _activas_dia[6];
                lista_sesiones[20].Activa = _activas_dia[6];
                lista_sesiones[34].Activa = _activas_dia[6];
                lista_sesiones[48].Activa = _activas_dia[6];
                lista_sesiones[62].Activa = _activas_dia[6];


                //de lunes a viernes a 8ª hora
                lista_sesiones[7].Activa  = _activas_dia[7];
                lista_sesiones[21].Activa = _activas_dia[7];
                lista_sesiones[35].Activa = _activas_dia[7];
                lista_sesiones[49].Activa = _activas_dia[7];
                lista_sesiones[63].Activa = _activas_dia[7];

                //de lunes a viernes a 9ª hora
                lista_sesiones[8].Activa  = _activas_dia[8];
                lista_sesiones[22].Activa = _activas_dia[8];
                lista_sesiones[36].Activa = _activas_dia[8];
                lista_sesiones[50].Activa = _activas_dia[8];
                lista_sesiones[64].Activa = _activas_dia[8];


                //de lunes a viernes a 10ª hora
                lista_sesiones[9].Activa  = _activas_dia[9];
                lista_sesiones[23].Activa = _activas_dia[9];
                lista_sesiones[37].Activa = _activas_dia[9];
                lista_sesiones[51].Activa = _activas_dia[9];
                lista_sesiones[65].Activa = _activas_dia[9];

                //de lunes a viernes a 11ª hora
                lista_sesiones[10].Activa = _activas_dia[10];
                lista_sesiones[24].Activa = _activas_dia[10];
                lista_sesiones[38].Activa = _activas_dia[10];
                lista_sesiones[52].Activa = _activas_dia[10];
                lista_sesiones[64].Activa = _activas_dia[10];

                //de lunes a viernes a 12ª hora
                lista_sesiones[11].Activa = _activas_dia[11];
                lista_sesiones[25].Activa = _activas_dia[11];
                lista_sesiones[39].Activa = _activas_dia[11];
                lista_sesiones[53].Activa = _activas_dia[11];
                lista_sesiones[67].Activa = _activas_dia[11];

                //de lunes a viernes a 13ª hora
                lista_sesiones[12].Activa = _activas_dia[12];
                lista_sesiones[26].Activa = _activas_dia[12];
                lista_sesiones[40].Activa = _activas_dia[12];
                lista_sesiones[54].Activa = _activas_dia[12];
                lista_sesiones[68].Activa = _activas_dia[12];

                //de lunes a viernes a 14ª hora
                lista_sesiones[13].Activa = _activas_dia[13];
                lista_sesiones[27].Activa = _activas_dia[13];
                lista_sesiones[41].Activa = _activas_dia[13];
                lista_sesiones[55].Activa = _activas_dia[13];
                lista_sesiones[69].Activa = _activas_dia[13];

                //SÁBADO
                lista_sesiones[70].Activa = _activas_sabado[0];
                lista_sesiones[71].Activa = _activas_sabado[1];
                lista_sesiones[72].Activa = _activas_sabado[2];
                lista_sesiones[73].Activa = _activas_sabado[3];
                lista_sesiones[74].Activa = _activas_sabado[4];

                SortedBindingList <FestivoInfo> festivos = FestivoList.GetList(inicio_semana, inicio_semana.AddDays(5));
                //Se marcar como libres los días establecidos como no lectivos
                if (festivos != null && festivos.Count > 0)
                {
                    foreach (SesionAuxiliar aux in lista_sesiones)
                    {
                        if (aux.Activa)
                        {
                            foreach (FestivoInfo festivo in festivos)
                            {
                                if (aux.Fecha.Date >= festivo.FechaInicio.Date &&
                                    aux.Fecha.Date <= festivo.FechaFin.Date)
                                {
                                    aux.Activa = false;
                                    break;
                                }
                            }
                        }
                    }
                }

                if (inicio_semana < inicio_promocion)
                {
                    foreach (SesionAuxiliar aux in lista_sesiones)
                    {
                        if (aux.Activa && aux.Fecha.Date < inicio_promocion.Date)
                        {
                            aux.Activa = false;
                        }
                    }
                }
            }

            for (int i = 0; i < 75; i++)
            {
                if (!lista_sesiones[i].Activa && lista_sesiones[i].Estado == 1)
                {
                    lista_sesiones[i].Titulo          = "LIBRE";
                    lista_sesiones[i].Estado          = 2;
                    lista_sesiones[i].OidClaseTeorica = -1;
                }
            }

            return(lista_sesiones);
        }
        public ListaSesiones GeneraHorario(int semana, DateTime inicio_promocion)
        {
            long     sesiones_asignadas = 0;
            DateTime inicio_semana      = inicio_promocion;

            while (inicio_semana.DayOfWeek != DayOfWeek.Monday)
            {
                inicio_semana = inicio_semana.AddDays(-1);
            }

            ListaSesiones lista_sesiones = new ListaSesiones(inicio_semana);

            SetSesionesActivas(lista_sesiones, inicio_promocion, inicio_semana);

            int n_grupos_activos = 0;

            for (int i = 1; i < _practicas.Count; i++)
            {
                n_grupos_activos += _practicas[i].Count > _practicas_programadas_grupo[i] ? 1 : 0;
            }

            _practicas_semana = _n_practicas == 0 ? 6 * n_grupos_activos : _n_practicas * n_grupos_activos;

            int index_practica = 0;

            //Se calcula el número de clases ya asignadas poniendo como asignadas las horas que no se van a programar
            //según las horas seleccionadas
            foreach (SesionAuxiliar obj in lista_sesiones)
            {
                if (obj.Estado > 1)
                {
                    sesiones_asignadas++;
                }
                if ((obj.OidClasePractica != 0 && index_practica == 0) ||
                    index_practica > 0 && index_practica < 5)
                {
                    if (obj.Estado != 3)
                    {
                        obj.Estado = 2;
                    }
                    index_practica++;
                    sesiones_asignadas++;
                }
                if (index_practica == 5)
                {
                    index_practica = 0;
                }
            }

            long num_sesiones_asignadas = 0;
            long total_asignadas        = 0;

            bool practica_asignada = true;
            bool teorica_asignada  = false;

            /*do
             * {
             *  total_asignadas = num_sesiones_asignadas;
             *
             *  if (semana >= _comienzo_practicas)
             *  {
             *      //CLASES PRACTICAS
             *      practica_asignada = true;
             *
             *      while (!PracticasTotalesAsignadas() && practica_asignada)
             *      {
             *          //Sesión del sábado
             *          if (SesionDisponible(70, 5, lista_sesiones))
             *          {
             *              practica_asignada = AsignaSesionPractica(70, 5, lista_sesiones, sesiones_asignadas);
             *          }
             *
             *          //Resto de sesiones
             *          int hora_incial = BuscaSesionLibre(5, lista_sesiones);
             *          if (hora_incial != -1)
             *          {
             *              practica_asignada = AsignaSesionPractica(hora_incial, 5, lista_sesiones, sesiones_asignadas);
             *          }
             *          else
             *              practica_asignada = false;
             *
             *          if (practica_asignada)
             *              num_sesiones_asignadas += 5;
             *      }
             *  }
             *
             *  //TEORICAS
             *
             *  for (int hora_inicial = 0; hora_inicial < lista_sesiones.Count; hora_inicial++)
             *  {
             *      int n_horas = 0;
             *      hora_inicial = GetSiguienteSesionLibre(out n_horas, hora_inicial, lista_sesiones);
             *
             *      if (hora_inicial == -1) break;
             *      teorica_asignada = AsignaSesionTeorica(hora_inicial, n_horas, lista_sesiones, sesiones_asignadas, true);
             *
             *      if (teorica_asignada)
             *      {
             *          num_sesiones_asignadas += n_horas;
             *          break;
             *      }
             *  }
             *  if (!teorica_asignada)
             *  {
             *      for (int hora_inicial = 0; hora_inicial < lista_sesiones.Count; hora_inicial++)
             *      {
             *          int n_horas = 0;
             *          hora_inicial = GetSiguienteSesionLibre(out n_horas, hora_inicial, lista_sesiones);
             *
             *          if (hora_inicial == -1) break;
             *          teorica_asignada = AsignaSesionTeorica(hora_inicial, n_horas, lista_sesiones, sesiones_asignadas, false);
             *
             *          if (teorica_asignada)
             *          {
             *              num_sesiones_asignadas += n_horas;
             *              break;
             *          }
             *      }
             *  }
             *
             * } while (num_sesiones_asignadas < lista_sesiones.Count - sesiones_asignadas
             *  && total_asignadas != num_sesiones_asignadas);*/

            bool teoricas_no_asignadas = false;

            foreach (ClaseTeoricaInfo ct in _teoricas)
            {
                if (ct.EEstadoClase == EEstadoClase.NoProgramada)
                {
                    teoricas_no_asignadas = true;
                    break;
                }
            }

            if (!teoricas_no_asignadas)
            {
                _practicas_semana = 5;
            }

            do
            {
                total_asignadas = num_sesiones_asignadas;

                //CLASES PRACTICAS
                if (semana >= _comienzo_practicas)
                {
                    practica_asignada = true;

                    while (!PracticasTotalesAsignadas() && practica_asignada)
                    {
                        int n_horas = 0;

                        //Sesión del sábado
                        if (SesionDisponible(70, 5, lista_sesiones))
                        {
                            practica_asignada = AsignaSesionPractica(70, out n_horas, lista_sesiones, sesiones_asignadas);
                        }

                        //Resto de sesiones
                        int hora_incial = BuscaSesionPracticaLibre(5, lista_sesiones);
                        if (hora_incial != -1)
                        {
                            practica_asignada = AsignaSesionPractica(hora_incial, out n_horas, lista_sesiones, sesiones_asignadas);
                        }
                        else
                        {
                            practica_asignada = false;
                        }

                        if (practica_asignada)
                        {
                            num_sesiones_asignadas += n_horas;
                        }
                    }
                }

                //TEORICAS

                for (int hora_inicial = 0; hora_inicial < lista_sesiones.Count; hora_inicial++)
                {
                    int n_horas = 0;
                    hora_inicial = GetSiguienteSesionLibre(out n_horas, hora_inicial, lista_sesiones);

                    //if (n_horas == 1 && (hora_inicial+1) < lista_sesiones.Count && lista_sesiones[hora_inicial +1].OidClasePractica != 0) continue;

                    if (hora_inicial == -1)
                    {
                        break;
                    }
                    teorica_asignada = AsignaSesionTeorica(hora_inicial, n_horas, lista_sesiones, sesiones_asignadas, true);

                    if (teorica_asignada)
                    {
                        num_sesiones_asignadas += n_horas;
                        break;
                    }
                }
                if (!teorica_asignada)
                {
                    for (int hora_inicial = 0; hora_inicial < lista_sesiones.Count; hora_inicial++)
                    {
                        int n_horas = 0;
                        hora_inicial = GetSiguienteSesionLibre(out n_horas, hora_inicial, lista_sesiones);

                        if (hora_inicial == -1)
                        {
                            break;
                        }
                        teorica_asignada = AsignaSesionTeorica(hora_inicial, n_horas, lista_sesiones, sesiones_asignadas, false);

                        if (teorica_asignada)
                        {
                            num_sesiones_asignadas += n_horas;
                            break;
                        }
                    }
                }
            } while (num_sesiones_asignadas < lista_sesiones.Count - sesiones_asignadas &&
                     total_asignadas != num_sesiones_asignadas);

            return(lista_sesiones);
        }
        public void GeneraCronograma()
        {
            int      semana                 = 1;
            int      sesiones               = -1;
            DateTime inicio_semana          = _inicio_cronograma;
            int      semanas_no_programadas = 0;

            while (semanas_no_programadas < 8)
            {
                sesiones = _cronograma.Sesiones.Count;
                ListaSesiones lista = GeneraHorario(semana, inicio_semana);

                for (int i = 0; i < lista.Count; i++)
                {
                    if (lista[i].OidClaseTeorica > 0 || lista[i].OidClasePractica > 0)
                    {
                        SesionCronograma sesion = SesionCronograma.NewChild(_cronograma);
                        sesion.MarkItemChild();
                        _cronograma.Sesiones.Add(sesion);

                        sesion.OidClaseTeorica  = lista[i].OidClaseTeorica;
                        sesion.OidClasePractica = lista[i].OidClasePractica;
                        sesion.Semana           = semana;
                        sesion.Dia      = (int)i / 14 + 1;
                        sesion.Turno    = i % 14 + 1;
                        sesion.Numero   = 0;
                        sesion.Duracion = string.Empty;
                        sesion.Texto    = string.Empty;
                        sesion.Clase    = string.Empty;
                        sesion.Modulo   = string.Empty;
                        sesion.Fecha    = lista[i].Fecha;
                        sesion.Hora     = lista[i].Hora;

                        if (sesion.OidClaseTeorica > 0)
                        {
                            ClaseTeoricaInfo teorica = _teoricas.GetItem(sesion.OidClaseTeorica);
                            sesion.Duracion        = "1:00";
                            sesion.Texto           = teorica.Alias;
                            sesion.Clase           = teorica.Alias;
                            sesion.Modulo          = teorica.Modulo;
                            sesion.Submodulo       = teorica.Submodulo;
                            sesion.Alias           = teorica.Alias;
                            sesion.ETipoClase      = ETipoClase.Teorica;
                            sesion.OrdenPrimario   = teorica.OrdenPrimario;
                            sesion.OrdenSecundario = teorica.OrdenSecundario;
                            sesion.OrdenTerciario  = teorica.OrdenTerciario;
                        }
                        if (sesion.OidClasePractica > 0)
                        {
                            ClasePracticaInfo practica = _practicas[(int)lista[i].Grupo].GetItem(sesion.OidClasePractica);
                            sesion.Duracion        = practica.Duracion.ToString() + ":00";
                            sesion.Texto           = practica.Alias + "G" + lista[i].Grupo.ToString();
                            sesion.Clase           = practica.Alias + "G" + lista[i].Grupo.ToString();
                            sesion.Modulo          = practica.Modulo;
                            sesion.Submodulo       = practica.Submodulo;
                            sesion.Alias           = practica.Alias;
                            sesion.ETipoClase      = ETipoClase.Practica;
                            sesion.OrdenPrimario   = practica.OrdenPrimario;
                            sesion.OrdenSecundario = practica.OrdenSecundario;
                            sesion.OrdenTerciario  = practica.OrdenTerciario;
                            sesion.Grupo           = lista[i].Grupo;
                            sesion.Incompatible    = practica.Incompatible;
                        }
                    }
                }
                semana++;
                while (inicio_semana.DayOfWeek != DayOfWeek.Monday)
                {
                    inicio_semana = inicio_semana.AddDays(-1);
                }
                inicio_semana = inicio_semana.AddDays(7);
                if (sesiones == _cronograma.Sesiones.Count)
                {
                    semanas_no_programadas++;
                }
                else
                {
                    semanas_no_programadas = 0;
                }
                if (inicio_semana > _fin_cronograma)
                {
                    break;
                }
            }
        }
 public bool QuedanSesiones(long sesiones_asignadas, ListaSesiones lista_sesiones)
 {
     return(sesiones_asignadas < lista_sesiones.Count);
 }