/// <summary>
        /// Método para crear programar una operación
        /// </summary>
        /// <returns></returns>
        public OperacionesProgramadas Nuevo() {

            OperacionesProgramadas nuevo = new OperacionesProgramadas();
            nuevo.listaLineas = new Lineas().ListaDrop();
            nuevo.listaOperaciones = new Operaciones().ListaDrop();

            return nuevo;
        }
        public async Task<ActionResult> Programar([Bind(Include = "selectOperacion,selectLineas")] OperacionesProgramadas programar)
        {
            Operaciones operacion = db.Operaciones.First(m=>m.id == programar.selectOperacion);
            List<string> ids = new Apoyo().ApoyosAnomalia(operacion.anomalia, operacion.grado_anomalia);

            List<ApoyoLista> listaApoyos = db.ApoyoLista.Where(m => ids.Contains(m.id)).OrderBy(m=>m.nombre).ToList();

            if(programar.selectLineas != null && programar.selectLineas.Count >0){
                listaApoyos = listaApoyos.Where(m => programar.selectLineas.Contains(m.linea)).ToList();            
            }
                 
            List<ApoyoLista> listTemp = new List<ApoyoLista>();
            List<ApoyosProgramados> listaApoyosProgramados = new List<ApoyosProgramados>();

            //FECHA DE MAÑANA
            DateTime uFecha = DateTime.Today.AddDays(1);

            OperacionesProgramadas nuevoOperacionesProgramadas = new OperacionesProgramadas();
            nuevoOperacionesProgramadas.idoperacion = programar.selectOperacion;
            nuevoOperacionesProgramadas.fecha = DateTime.Now;
            nuevoOperacionesProgramadas.creadopor = User.Identity.GetUserId();

            //Si hay apoyos a reparar
            if (listaApoyos.Count > 0)
            {
                //total de días de un equipo en realizar la operación
                int totalDias = listaApoyos.Count / operacion.rendimiento;

                    //Si total de días es menor o igual a 24 que es el numero de días laborables.
                if (totalDias <= 24)
                {

                    if (db.ApoyosProgramados.ToList() != null && db.ApoyosProgramados.ToList().Count > 0)
                    {
                        uFecha = db.ApoyosProgramados.OrderByDescending(m => m.end).Take(1).ToArray()[0].end;

                        uFecha = uFecha.AddDays(1);
                    }

                    List<DateTime> listaFechas = new List<DateTime>();

                    while (listaFechas.Count < totalDias)
                    {
                        //Compruebo que las fechas no sean fin de semana
                        if (uFecha.DayOfWeek != DayOfWeek.Saturday && uFecha.DayOfWeek != DayOfWeek.Sunday)
                        {
                            listaFechas.Add(uFecha);
                        }

                        //Aumento la fecha
                        uFecha = uFecha.AddDays(1);
                    }
                    int indice = 0;

                    //Recorro Lista de Fechas filtradas
                    foreach (var e in listaFechas)
                    {
                        //Apoyos por fecha
                        foreach (var f in listaApoyos.Skip(indice).Take(operacion.rendimiento))
                        {
                            ApoyosProgramados nuevoApoyo = new ApoyosProgramados();
                            nuevoApoyo.start = e;
                            nuevoApoyo.end = e;
                            nuevoApoyo.idoperacionprogramada = nuevoOperacionesProgramadas.id;
                            nuevoApoyo.idapoyo = f.id;

                            listaApoyosProgramados.Add(nuevoApoyo);
                        }

                        indice = indice + operacion.rendimiento;
                    }

                    db.OperacionesProgramadas.Add(nuevoOperacionesProgramadas);
                    await db.SaveChangesAsync();

                    db.ApoyosProgramados.AddRange(listaApoyosProgramados);
                    await db.SaveChangesAsync();

                }/*FIN IF SI ES MENOR DE 24 DIAS*/
                else { 
                
                    //24 es la cantidad de días laborables en un mes
                    int dias = operacion.tiempo_programacion * 24;

                    //Total de apoyos por días (divido la cantidad de apoyos a operar entre el numero de dias laborables en el período de tiempo solicitado)
                    decimal totalPDias1 = decimal.Divide(decimal.Parse(listaApoyos.Count.ToString()), decimal.Parse(dias.ToString()));

                    int totalPDias =  int.Parse(decimal.Ceiling(totalPDias1).ToString());

                    if (db.ApoyosProgramados.ToList() != null && db.ApoyosProgramados.ToList().Count > 0)
                    {
                        uFecha = db.ApoyosProgramados.OrderByDescending(m => m.end).Take(1).ToArray()[0].end;
                        uFecha = uFecha.AddDays(1);
                    }

                    List<DateTime> listaFechas = new List<DateTime>();

                    while (listaFechas.Count < dias)
                    {
                        //Compruebo que las fechas no sean fin de semana
                        if (uFecha.DayOfWeek != DayOfWeek.Saturday && uFecha.DayOfWeek != DayOfWeek.Sunday)
                        {
                            listaFechas.Add(uFecha);
                        }

                        //Aumento la fecha
                        uFecha = uFecha.AddDays(1);
                     }

                    int indice = 0;

                    //Recorro Lista de Fechas filtradas
                    foreach (var e in listaFechas)
                    {
                        //Apoyos por fecha
                        foreach (var f in listaApoyos.Skip(indice).Take(totalPDias))
                        {
                            ApoyosProgramados nuevoApoyo = new ApoyosProgramados();
                            nuevoApoyo.start = e;
                            nuevoApoyo.end = e;
                            nuevoApoyo.idoperacionprogramada = nuevoOperacionesProgramadas.id;
                            nuevoApoyo.idapoyo = f.id;

                            listaApoyosProgramados.Add(nuevoApoyo);
                        }

                        indice = indice + totalPDias;
                    }

                    db.OperacionesProgramadas.Add(nuevoOperacionesProgramadas);
                    await db.SaveChangesAsync();

                    db.ApoyosProgramados.AddRange(listaApoyosProgramados);
                    await db.SaveChangesAsync();
                
                }

            }/*FIN IF SI HAY APOYOS*/

            TempData["Mensaje"] = "Operación Programada correctamente.";
            return View(new OperacionesProgramadas().Nuevo());
        }