/// <summary>
        /// Funcionalidad para crear Sprint.
        /// </summary>
        /// <param name="proyecto"> Cadena con la nombre del Proyecto al que pertenece el sprint a  crear.</param>
        /// <returns>Modelo con la informacion del sprint</returns>
        // GET: Crear
        public ActionResult Crear(string proyecto)
        {
            if (!revisarPermisos("Crear Proyectos"))
            {
                //despliega mensaje en caso de no poder crear un usuario
                this.AddToastMessage("Acceso Denegado", "No tienes permiso para crear sprints!", ToastType.Warning);
                return(RedirectToAction("Index", "Home"));
            }

            //se revisa que el proyecto exista
            if (String.IsNullOrEmpty(proyecto))
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            if (baseDatos.Proyectos.Find(proyecto) != null)
            {
                var model = new SprintModelo();
                model.proyecto  = proyecto;
                ViewBag.modulos = new MultiSelectList(baseDatos.Modulos.Where(m => m.proyecto == proyecto).ToList(), "numero", "nombre");
                return(View(model));
            }
            else
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
        }
        /// <summary>
        /// Funcionalidad para consultar informacion del Sprint.
        /// </summary>
        /// <param name="proyecto"> Cadena con la nombre del Proyecto al que pertenece el sprint.</param>
        /// <param name="sprint"> Cadena con el numero de Sprint a consultar.</param>
        /// <returns>Modelo con la informacion del Sprint a consultar</returns>
        // GET: Detalles
        public ActionResult Detalles(string proyecto, string sprint)
        {
            if (!revisarPermisos("Consultar Detalles de Sprints"))
            {
                //despliega mensaje en caso de no poder crear un usuario
                this.AddToastMessage("Acceso Denegado", "No tienes permiso para consultar detalles de sprints!", ToastType.Warning);
                return(RedirectToAction("Index", "Home"));
            }

            //se revisa que el proyecto y el sprint existan
            if (String.IsNullOrEmpty(proyecto))
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            if (String.IsNullOrEmpty(sprint))
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            var proy = baseDatos.Proyectos.Find(proyecto);

            if (proy == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            var spr = baseDatos.Sprints.Find(proyecto, Int32.Parse(sprint));

            if (spr == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            var model = new SprintModelo();

            //se actualiza la informacion dle modelo
            model.proyecto    = proyecto;
            model.numero      = sprint;
            model.fechaInicio = spr.fechaInicio.ToString("dd/MM/yyyy");
            model.fechaFinal  = spr.fechaFinal.ToString("dd/MM/yyyy");

            //se carga la lista de modulos asociados
            int sprint_numero = Int32.Parse(sprint);

            ViewBag.listamodulos = new MultiSelectList(baseDatos.Modulos.Where(m => m.proyecto == proyecto).ToList(), "numero", "nombre");
            model.modulos        = new List <string>();
            var listaDeModulosSprint = baseDatos.Sprint_Modulos.Where(m => m.sprint == sprint_numero && m.proyecto == proyecto).ToList();

            //se agregan los modulos al modelo
            foreach (var modulo in listaDeModulosSprint)
            {
                model.modulos.Add(modulo.modulo.ToString());
            }

            return(View(model));
        }
        public ActionResult Detalles(SprintModelo model)
        {
            if (ModelState.IsValid)
            {
                //se obtiene la informacion del modelo
                var sprint = new Sprint();
                sprint.numero                 = Int32.Parse(model.numero);
                sprint.proyecto               = model.proyecto;
                sprint.fechaInicio            = DateTime.ParseExact(model.fechaInicio, "dd/MM/yyyy", CultureInfo.InvariantCulture);
                sprint.fechaFinal             = DateTime.ParseExact(model.fechaFinal, "dd/MM/yyyy", CultureInfo.InvariantCulture);
                baseDatos.Entry(sprint).State = System.Data.Entity.EntityState.Modified;

                //se eliminan los modulos viejos en caso de haber efectuado cambios
                var modulosViejos = baseDatos.Sprint_Modulos.Where(m => m.sprint == sprint.numero && m.proyecto == model.proyecto);
                if (modulosViejos.Count() > 0)
                {
                    foreach (var modulo in modulosViejos)
                    {
                        baseDatos.Entry(modulo).State = System.Data.Entity.EntityState.Deleted;
                    }
                }

                //se agregan las nuevas relaciones de sprint con modulo
                if (model.modulos != null && model.modulos.Count() > 0)
                {
                    foreach (var modulo in model.modulos)
                    {
                        var sprint_modulo = new Sprint_Modulos();
                        sprint_modulo.proyecto = sprint.proyecto;
                        sprint_modulo.sprint   = sprint.numero;
                        sprint_modulo.modulo   = Int32.Parse(modulo);
                        sprint.Sprint_Modulos.Add(sprint_modulo);
                        baseDatos.Entry(sprint_modulo).State = System.Data.Entity.EntityState.Added;
                        baseDatos.Entry(sprint).State        = System.Data.Entity.EntityState.Modified;
                    }
                }

                baseDatos.SaveChanges();
                this.AddToastMessage("Sprint Modificado", "El sprint " + model.numero + " se ha modificado correctamente.", ToastType.Success);
                return(RedirectToAction("Detalles", "Sprint", new { proyecto = model.proyecto, sprint = model.numero }));
            }
            return(View(model));
        }
        public async Task <ActionResult> Crear(SprintModelo model)
        {
            if (ModelState.IsValid)
            {
                //se carga la informacion del sprint del modelo
                var sprint = new Sprint();
                sprint.numero      = Int32.Parse(model.numero);
                sprint.proyecto    = model.proyecto;
                sprint.fechaInicio = DateTime.ParseExact(model.fechaInicio, "MM/dd/yyyy", CultureInfo.InvariantCulture);
                sprint.fechaFinal  = DateTime.ParseExact(model.fechaFinal, "MM/dd/yyyy", CultureInfo.InvariantCulture);
                if (sprint.fechaInicio > sprint.fechaFinal)
                {
                    this.AddToastMessage("Error", "La fecha de inicio debe ser antes de la fecha final", ToastType.Warning);
                    return(RedirectToAction("Crear", "Sprint", new { proyecto = model.proyecto }));
                }
                //se crea las relaciones de sprint con modulo
                if (model.modulos != null && model.modulos.Count() > 0)
                {
                    foreach (var modulo in model.modulos)
                    {
                        var sprint_modulo = new Sprint_Modulos();
                        sprint_modulo.proyecto = sprint.proyecto;
                        sprint_modulo.sprint   = sprint.numero;
                        sprint_modulo.modulo   = Int32.Parse(modulo);
                        sprint.Sprint_Modulos.Add(sprint_modulo);
                    }
                }

                baseDatos.Sprints.Add(sprint);
                baseDatos.SaveChanges();

                updateSprintPoints(sprint.proyecto, sprint.numero);
                this.AddToastMessage("Sprint Creado", "El sprint " + model.numero + " se ha creado y asignado correctamente"
                                     + " al proyecto " + model.proyecto + ".", ToastType.Success);
                return(RedirectToAction("Crear", "Sprint", new { proyecto = model.proyecto }));
            }
            ViewBag.Proyectos = new SelectList(baseDatos.Proyectos.ToList(), "nombre", "nombre");
            ViewBag.modulos   = baseDatos.Modulos.Where(m => m.proyecto == model.proyecto).ToList();
            return(View(model));
        }
        public ActionResult Borrar(SprintModelo model)
        {
            if (ModelState.IsValid)
            {
                int sprint_numero = Int32.Parse(model.numero);
                var modulosViejos = baseDatos.Sprint_Modulos.Where(m => m.sprint == sprint_numero && m.proyecto == model.proyecto).ToList();
                if (modulosViejos.Count() > 0)
                {
                    foreach (var modulo in modulosViejos)
                    {
                        baseDatos.Entry(modulo).State = System.Data.Entity.EntityState.Deleted;
                    }
                }

                var sprint = baseDatos.Sprints.Find(model.proyecto, sprint_numero);
                baseDatos.Entry(sprint).State = System.Data.Entity.EntityState.Deleted;
                baseDatos.SaveChanges();
                this.AddToastMessage("Sprint Eliminado", "El sprint " + model.numero + " se ha eliminado correctamente.", ToastType.Success);
                return(RedirectToAction("Informacion", "Proyectos", new { id = model.proyecto }));
            }
            return(View(model));
        }