public async Task<ActionResult> ReProgramar(List<string> operacion)
        {

            List<ApoyosProgramados> listaActual = db.ApoyosProgramados.Where(m=>m.inspeccionar ==false).ToList();

            try {
                    List<ListApoyosProgramadosGroup> listApG = await db.ListApoyosProgramadosGroup.Where(m=> operacion.Contains(m.idoperacionprogramada)).ToListAsync();
                    List<Operaciones> listaOperaciones = await db.Operaciones.ToListAsync();
                    List<ApoyosProgramados> listaRetornar = new List<ApoyosProgramados>();
                    List<ApoyosProgramadosGroup> listAp = db.ApoyosProgramadosGroup.Where(m => operacion.Contains(m.idoperacionprogramada)).ToList();                    
                    //FECHA DE MAÑANA
                    DateTime uFecha = DateTime.Today.AddDays(1);

                    foreach (var q in operacion)
                    {
                        ListApoyosProgramadosGroup op = await db.ListApoyosProgramadosGroup.SingleOrDefaultAsync(m=>m.idoperacionprogramada == q);
                        List<ApoyosProgramadosGroup> listTemp = listAp.Where(m => m.idoperacionprogramada == op.idoperacionprogramada).OrderBy(m=>m.nombre).ToList();

                        if (listTemp.Count > 0 && listTemp != null)
                        {
                            //total de días de un equipo en realizar la operacion
                            int totalDias = listTemp.Count / op.rendimiento;
                            
                            //Si total de días es menor o igual a 24 que es el numero de días laborables.
                            if (totalDias <= 24)
                            {
                                if (listaRetornar.Count > 0 && listaRetornar != null) 
                                {
                                    uFecha = listaRetornar.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 listTemp.Skip(indice).Take(op.rendimiento))
                                        {
                                            ApoyosProgramados nuevoApoyo = new ApoyosProgramados();
                                            nuevoApoyo.start = e;
                                            nuevoApoyo.end = e;
                                            nuevoApoyo.idoperacionprogramada = op.idoperacionprogramada;
                                            nuevoApoyo.idapoyo = f.idapoyo;
                                            listaRetornar.Add(nuevoApoyo);
                                        }
                                        indice = indice + op.rendimiento;
                                    }
                            }//Si total de días es mayor a 24 que es el numero de días laborables.
                            else 
                            {
                                List<ApoyosProgramados> listaApoyosNuevos = new List<ApoyosProgramados>();
                                //24 es la cantidad de días laborables en un mes
                                int dias = op.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(listTemp.Count.ToString()), decimal.Parse(dias.ToString()));
                                int totalPDias = int.Parse(decimal.Ceiling(totalPDias1).ToString());

                                if (listaRetornar.ToList() != null && listaRetornar.ToList().Count > 0)
                                {
                                    uFecha = listaRetornar.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 listTemp.Skip(indice).Take(totalPDias))
                                    {
                                        ApoyosProgramados nuevoApoyo = new ApoyosProgramados();
                                        nuevoApoyo.start = e;
                                        nuevoApoyo.end = e;
                                        nuevoApoyo.idoperacionprogramada = op.idoperacionprogramada;
                                        nuevoApoyo.idapoyo = f.idapoyo;
                                        listaRetornar.Add(nuevoApoyo);
                                    }
                                    indice = indice + totalPDias;
                                }                            
                            }
                        }                
                    }



                    db.ApoyosProgramados.RemoveRange(listaActual);
                    await db.SaveChangesAsync();

                    db.ApoyosProgramados.AddRange(listaRetornar);
                    await db.SaveChangesAsync();
                    TempData["reprogramarOK"] = "Reprogramación satisfactoriamente.";
            }
            catch (Exception e)
            {
               db.ApoyosProgramados.RemoveRange(listaActual);
               db.SaveChanges();

                db.ApoyosProgramados.AddRange(listaActual);
                db.SaveChanges();

                TempData["reprogramarError"] = "Error al Reprogramar.";
            }

            return RedirectToAction("Calendario","Coex");
        }
        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());
        }