public JsonResult FinExamen(int id, PreguntaExamen[] respuestas)
        {
            var userId   = ((ClaimsIdentity)User.Identity).FindFirst("UserId").Value;
            int aciertos = 0;
            int totales  = respuestas.Length;

            List <RespuestaIncorrecta> respuestasIncorrectas = new List <RespuestaIncorrecta>();

            foreach (var pregunta in respuestas)
            {
                bool   acertada              = false;
                string enunciado             = "";
                string respuestaCorrecta     = "";
                string respuestaSeleccionada = "";


                if (pregunta.tipo == "Tests")
                {
                    Test test = db.Tests.Find(pregunta.id);
                    if (pregunta.respuesta != null && test.RespuestaCorrecta.ToString() == pregunta.respuesta)
                    {
                        aciertos++;
                        acertada = true;
                    }
                    else
                    {
                        enunciado             = test.Enunciado;
                        respuestaCorrecta     = ObtenerRespuestaTest(test, test.RespuestaCorrecta);
                        respuestaSeleccionada = ObtenerRespuestaTest(test, Convert.ToInt32(pregunta.respuesta));
                    }
                }
                if (pregunta.tipo == "FillTheGaps")
                {
                    if (pregunta.respuesta != null)
                    {
                        pregunta.respuesta = pregunta.respuesta.Replace(',', '#');
                    }
                    FillTheGap fillTheGap = db.FillTheGaps.Find(pregunta.id);
                    if (pregunta.respuesta != null && fillTheGap.Respuestas.ToLower() == pregunta.respuesta.ToLower())
                    {
                        aciertos++;
                        acertada = true;
                    }
                    else
                    {
                        enunciado         = fillTheGap.Enunciado;
                        respuestaCorrecta = fillTheGap.Respuestas.Replace('#', ' ');
                        if (pregunta.respuesta != null)
                        {
                            respuestaSeleccionada = pregunta.respuesta.Replace('#', ' ');
                        }
                    }
                }
                if (pregunta.tipo == "TrueFalses")
                {
                    TrueFalse TrueFalse = db.TrueFalses.Find(pregunta.id);
                    if (pregunta.respuesta != null && TrueFalse.RespuestaCorrecta.ToString() == pregunta.respuesta)
                    {
                        aciertos++;
                        acertada = true;
                    }
                    else
                    {
                        enunciado             = TrueFalse.Enunciado;
                        respuestaCorrecta     = TrueFalse.RespuestaCorrecta.ToString();
                        respuestaSeleccionada = pregunta.respuesta;
                    }
                }
                if (pregunta.tipo == "AudioSentenceExercises")
                {
                    if (pregunta.respuesta != null)
                    {
                        pregunta.respuesta = pregunta.respuesta.Replace(',', '#');
                    }
                    AudioSentenceExercise audioSentence = db.AudioSentenceExercises.Find(pregunta.id);
                    if (pregunta.respuesta != null && audioSentence.Respuestas.ToLower() == pregunta.respuesta.ToLower())
                    {
                        aciertos++;
                        acertada = true;
                    }
                    else
                    {
                        enunciado         = audioSentence.Enunciado;
                        respuestaCorrecta = audioSentence.Respuestas.Replace('#', ' ');
                        if (pregunta.respuesta != null)
                        {
                            respuestaSeleccionada = pregunta.respuesta.Replace('#', ' ');
                        }
                    }
                }

                if (!acertada)
                {
                    RespuestaIncorrecta respuestaInc = new RespuestaIncorrecta();
                    respuestaInc.Pregunta              = enunciado;
                    respuestaInc.RespuestaCorrecta     = respuestaCorrecta;
                    respuestaInc.RespuestaSeleccionada = respuestaSeleccionada;
                    respuestaInc.Tipo       = pregunta.tipo;
                    respuestaInc.PreguntaId = pregunta.id;
                    respuestasIncorrectas.Add(respuestaInc);
                }
            }


            bool _aprobado = (aciertos >= 28);



            FinExamenTest resultado = new Models.FinExamenTest();

            resultado.Correctas          = aciertos;
            resultado.Aprobado           = _aprobado;
            resultado.Porcentaje         = (aciertos * 100 / totales);
            resultado.IdSiguienteLeccion = 0;
            resultado.SiguienteLeccion   = "";


            SubTema _subtemaActual = SubTemaDataAccess.ObtenerSubTemas(db).FirstOrDefault(s => s.SubTemaId == id);
            SubTema _siguienteTema = SubTemaDataAccess.ObtenerSubTemas(db).Where(s => s.TemaId == _subtemaActual.TemaId && s.Orden > _subtemaActual.Orden).OrderBy(s => s.Orden).FirstOrDefault();

            resultado.UltimoExamen = true;
            if (_siguienteTema != null)
            {
                resultado.UltimoExamen = false;
                if (_aprobado)
                {
                    resultado.IdSiguienteLeccion = _siguienteTema.SubTemaId;
                    resultado.SiguienteLeccion   = _siguienteTema.Descripcion;



                    var  BloquearSubtemas = ((ClaimsIdentity)User.Identity).FindFirst("BloquearSubtemas").Value;
                    bool anyadir          = true;
                    if (Convert.ToBoolean(BloquearSubtemas))
                    {
                        var listaSubtemasAcceso = db.SubTemaAccesoUsuarios.Where(sau => sau.AlumnoId == userId).Select(sau => sau.SubTemaId).ToList();
                        if (!listaSubtemasAcceso.Contains(_siguienteTema.SubTemaId))
                        {
                            anyadir = false;
                        }
                    }
                    if (anyadir)
                    {
                        SubTemaDesbloqueado _desbloqueado = new SubTemaDesbloqueado
                        {
                            AlumnoId        = userId,
                            FechaDesbloqueo = DateTime.Now,
                            SubTemaId       = _siguienteTema.SubTemaId
                        };
                        db.SubTemaDesbloqueados.Add(_desbloqueado);
                        db.SaveChanges();
                    }
                }
            }

            var    NombreUsuario = ((ClaimsIdentity)User.Identity).FindFirst("NombreUsuario").Value;
            Examen _examen       = new Examen
            {
                Aciertos     = aciertos,
                AlumnoId     = userId,
                NombreAlumno = NombreUsuario,
                Aprobado     = _aprobado,
                SubTemaId    = id,
                Fallos       = totales - aciertos,
                FechaExamen  = DateTime.Now,
                Total        = totales
            };

            _examen.RespuestasIncorrectas = respuestasIncorrectas;

            db.Examenes.Add(_examen);
            db.SaveChanges();

            return(Json(resultado, JsonRequestBehavior.AllowGet));
        }
        public ActionResult Edit(UsuarioEditViewModel viewModel)
        {
            if (ModelState.IsValid)
            {
                AuthRepository gestorUsuarios = new AuthRepository();

                ApplicationUser applicationUser = gestorUsuarios.FindById(viewModel.Usuario.Id);
                applicationUser.Nombre           = viewModel.Usuario.Nombre;
                applicationUser.Apellido1        = viewModel.Usuario.Apellido1;
                applicationUser.Apellido2        = viewModel.Usuario.Apellido2;
                applicationUser.Email            = viewModel.Usuario.Email;
                applicationUser.UserName         = viewModel.Usuario.Email;
                applicationUser.GrupoUsuarioId   = viewModel.Usuario.GrupoUsuarioId;
                applicationUser.PuntosActual     = viewModel.Usuario.PuntosActual;
                applicationUser.PuntosTotal      = viewModel.Usuario.PuntosTotal;
                applicationUser.BloquearSubtemas = viewModel.Usuario.BloquearSubtemas;
                applicationUser.ClienteId        = viewModel.Usuario.ClienteId;

                var Accesos = db.SubTemaAccesoUsuarios.Where(sau => sau.AlumnoId == applicationUser.Id).ToList();
                db.SubTemaAccesoUsuarios.RemoveRange(Accesos);
                db.SaveChanges();
                List <int> listaSubtemasAccesso = new List <int>();
                if (viewModel.Usuario.BloquearSubtemas)
                {
                    foreach (var acceso in viewModel.AccesoTemas)
                    {
                        foreach (var accesoSubtema in acceso.SubTemas)
                        {
                            if (accesoSubtema.Selected)
                            {
                                SubTemaAccesoUsuario subtemaAcceso = new SubTemaAccesoUsuario();
                                subtemaAcceso.AlumnoId    = viewModel.Usuario.Id;
                                subtemaAcceso.FechaAcceso = DateTime.Now;
                                subtemaAcceso.SubTemaId   = Convert.ToInt32(accesoSubtema.Value);

                                db.SubTemaAccesoUsuarios.Add(subtemaAcceso);
                                db.SaveChanges();
                                listaSubtemasAccesso.Add(subtemaAcceso.SubTemaId);
                            }
                        }
                    }
                    var subtemasAcceso = db.SubTemaAccesoUsuarios.Where(sa => sa.AlumnoId == viewModel.Usuario.Id).Select(sa => sa.SubTema).ToList();
                    var temas          = subtemasAcceso.Select(su => su.TemaId);
                    foreach (var temaId in temas)
                    {
                        var subtemaInicial = subtemasAcceso.Where(sa => sa.TemaId == temaId).OrderBy(su => su.Orden).FirstOrDefault();
                        if (subtemaInicial != null)
                        {
                            if (!db.SubTemaDesbloqueados.Any(sd => sd.SubTemaId == subtemaInicial.SubTemaId && sd.AlumnoId == viewModel.Usuario.Id))
                            {
                                SubTemaDesbloqueado desbloqueado = new SubTemaDesbloqueado();
                                desbloqueado.AlumnoId        = viewModel.Usuario.Id;
                                desbloqueado.FechaDesbloqueo = DateTime.Now;
                                desbloqueado.SubTemaId       = subtemaInicial.SubTemaId;

                                db.SubTemaDesbloqueados.Add(desbloqueado);
                                db.SaveChanges();
                            }
                        }
                    }
                }

                List <int> temasCliente = db.ClienteTemas.Where(te => te.ClienteId == viewModel.Usuario.ClienteId).Select(te => te.TemaId).ToList();

                List <SubTema> subtemasIniciales = db.SubTemas.Where(sub => temasCliente.Contains(sub.TemaId) && sub.Orden == 1).ToList();
                foreach (SubTema subtema in subtemasIniciales)
                {
                    bool anyadir = true;
                    if (viewModel.Usuario.BloquearSubtemas)
                    {
                        if (!listaSubtemasAccesso.Contains(subtema.SubTemaId))
                        {
                            anyadir = false;
                        }
                    }
                    if (anyadir)
                    {
                        if (!db.SubTemaDesbloqueados.Any(sd => sd.SubTemaId == subtema.SubTemaId && sd.AlumnoId == viewModel.Usuario.Id))
                        {
                            SubTemaDesbloqueado desbloqueado = new SubTemaDesbloqueado();
                            desbloqueado.AlumnoId        = viewModel.Usuario.Id;
                            desbloqueado.FechaDesbloqueo = DateTime.Now;
                            desbloqueado.SubTemaId       = subtema.SubTemaId;

                            db.SubTemaDesbloqueados.Add(desbloqueado);
                            db.SaveChanges();
                        }
                    }
                }

                var userResult = gestorUsuarios.Update(applicationUser);

                if (userResult.Succeeded)
                {
                    if (!string.IsNullOrWhiteSpace(viewModel.Password))
                    {
                        gestorUsuarios.UpdatePassword(viewModel.Usuario.Id, viewModel.Password);
                    }
                    return(RedirectToAction("Index"));
                }
            }
            viewModel.InicializarDesplegables();
            return(View(viewModel));
        }
        public JsonResult FinExamenFillTheGap(int id, int aciertos, int errores, int totales, RespuestaIncorrectaFillTheGapExamen[] respuestasIncorrectas)
        {
            var userId = ((ClaimsIdentity)User.Identity).FindFirst("UserId").Value;

            FillTheGap _fillTheGap = db.FillTheGaps.Find(id);

            bool _aprobado = (aciertos >= 28);

            FinExamenFillTheGap resultado = new FinExamenFillTheGap();

            resultado.Correctas          = aciertos;
            resultado.Aprobado           = _aprobado;
            resultado.Porcentaje         = (aciertos * 100 / totales);
            resultado.IdSiguienteLeccion = 0;
            resultado.SiguienteLeccion   = "";

            SubTema _tema          = SubTemaDataAccess.ObtenerSubTemas(db).Where(s => s.SubTemaId == _fillTheGap.SubTemaId).FirstOrDefault();
            SubTema _siguienteTema = SubTemaDataAccess.ObtenerSubTemas(db).Where(s => s.TemaId == _tema.TemaId && s.Orden > _tema.Orden).OrderBy(s => s.Orden).FirstOrDefault();

            resultado.UltimoExamen = true;
            if (_siguienteTema != null)
            {
                resultado.UltimoExamen = false;
                if (_aprobado)
                {
                    resultado.IdSiguienteLeccion = _siguienteTema.SubTemaId;
                    resultado.SiguienteLeccion   = _siguienteTema.Descripcion;

                    var  BloquearSubtemas = ((ClaimsIdentity)User.Identity).FindFirst("BloquearSubtemas").Value;
                    bool anyadir          = true;
                    if (Convert.ToBoolean(BloquearSubtemas))
                    {
                        var listaSubtemasAcceso = db.SubTemaAccesoUsuarios.Where(sau => sau.AlumnoId == userId).Select(sau => sau.SubTemaId).ToList();
                        if (!listaSubtemasAcceso.Contains(_siguienteTema.SubTemaId))
                        {
                            anyadir = false;
                        }
                    }
                    if (anyadir)
                    {
                        SubTemaDesbloqueado _desbloqueado = new SubTemaDesbloqueado
                        {
                            AlumnoId        = userId,
                            FechaDesbloqueo = DateTime.Now,
                            SubTemaId       = _siguienteTema.SubTemaId
                        };
                        db.SubTemaDesbloqueados.Add(_desbloqueado);
                        db.SaveChanges();
                    }
                }
            }

            var    NombreUsuario = ((ClaimsIdentity)User.Identity).FindFirst("NombreUsuario").Value;
            Examen _examen       = new Examen
            {
                Aciertos     = aciertos,
                AlumnoId     = userId,
                NombreAlumno = NombreUsuario,
                Aprobado     = _aprobado,
                Fallos       = errores,
                FechaExamen  = DateTime.Now,
                Total        = totales
            };

            List <RespuestaIncorrecta> respuestas = new List <RespuestaIncorrecta>();

            foreach (RespuestaIncorrectaFillTheGapExamen respuestaIncorrecta in respuestasIncorrectas)
            {
                FillTheGap          fillTheGap   = db.FillTheGaps.Find(respuestaIncorrecta.id);
                RespuestaIncorrecta respuestaInc = new RespuestaIncorrecta();
                respuestaInc.Pregunta              = fillTheGap.Enunciado;
                respuestaInc.RespuestaCorrecta     = fillTheGap.Respuestas.Replace('#', ' ');
                respuestaInc.RespuestaSeleccionada = respuestaIncorrecta.respuesta.Replace('#', ' ');
                respuestas.Add(respuestaInc);
            }
            _examen.RespuestasIncorrectas = respuestas;



            db.Examenes.Add(_examen);
            db.SaveChanges();

            return(Json(resultado, JsonRequestBehavior.AllowGet));
        }
        public ActionResult Create(UsuarioCreateViewModel viewModel)
        {
            if (ModelState.IsValid)
            {
                AuthRepository gestorUsuarios = new AuthRepository();
                viewModel.Usuario.UserName     = viewModel.Usuario.Email;
                viewModel.Usuario.PuntosTotal  = 0;
                viewModel.Usuario.PuntosActual = 0;
                var correcto = true;
                if (User.IsInRole("AdministradorGrupo"))
                {
                    var GrupoUsuarioId = Convert.ToInt32(((ClaimsIdentity)User.Identity).FindFirst("GrupoUsuario").Value);
                    viewModel.Usuario.GrupoUsuarioId = GrupoUsuarioId;
                    viewModel.Usuario.TipoUsuarioId  = (int)TiposUsuariosId.Alumno;

                    var grupo = db.GrupoUsuarios.Find(GrupoUsuarioId);
                    if (grupo.NumeroMaximoUsuarios > 0)
                    {
                        var nUsuario = db.Users.Where(us => us.GrupoUsuarioId.HasValue).Count(us => us.GrupoUsuarioId.Value == viewModel.Usuario.GrupoUsuarioId);

                        if (nUsuario >= grupo.NumeroMaximoUsuarios)
                        {
                            correcto = false;
                            ModelState.AddModelError("Usuario.Email", "Ha sobrepasado el número máximo de usuarios del grupo");
                        }
                    }
                }
                if (correcto)
                {
                    var userResult = gestorUsuarios.Create(viewModel.Usuario, viewModel.Password);

                    //Add User Admin to Role Admin
                    if (userResult.Succeeded)
                    {
                        string oldPathAndName = "~/media/upload/avatar/sin-avatar.jpg";
                        string newPathAndName = "~/media/upload/avatar/" + viewModel.Usuario.Id + ".jpg";

                        System.IO.File.Copy(Server.MapPath(oldPathAndName), Server.MapPath(newPathAndName));

                        List <int> listaSubtemasAccesso = new List <int>();
                        if (viewModel.Usuario.BloquearSubtemas)
                        {
                            foreach (var acceso in viewModel.AccesoTemas)
                            {
                                foreach (var accesoSubtema in acceso.SubTemas)
                                {
                                    if (accesoSubtema.Selected)
                                    {
                                        SubTemaAccesoUsuario subtemaAcceso = new SubTemaAccesoUsuario();
                                        subtemaAcceso.AlumnoId    = viewModel.Usuario.Id;
                                        subtemaAcceso.FechaAcceso = DateTime.Now;
                                        subtemaAcceso.SubTemaId   = Convert.ToInt32(accesoSubtema.Value);

                                        db.SubTemaAccesoUsuarios.Add(subtemaAcceso);
                                        db.SaveChanges();

                                        listaSubtemasAccesso.Add(subtemaAcceso.SubTemaId);
                                    }
                                }
                            }
                            var subtemasAcceso = db.SubTemaAccesoUsuarios.Where(sa => sa.AlumnoId == viewModel.Usuario.Id).Select(sa => sa.SubTema).ToList();
                            var temas          = subtemasAcceso.Select(su => su.TemaId);
                            foreach (var temaId in temas)
                            {
                                var subtemaInicial = subtemasAcceso.Where(sa => sa.TemaId == temaId).OrderBy(su => su.Orden).FirstOrDefault();
                                if (subtemaInicial != null)
                                {
                                    if (!db.SubTemaDesbloqueados.Any(sd => sd.SubTemaId == subtemaInicial.SubTemaId && sd.AlumnoId == viewModel.Usuario.Id))
                                    {
                                        SubTemaDesbloqueado desbloqueado = new SubTemaDesbloqueado();
                                        desbloqueado.AlumnoId        = viewModel.Usuario.Id;
                                        desbloqueado.FechaDesbloqueo = DateTime.Now;
                                        desbloqueado.SubTemaId       = subtemaInicial.SubTemaId;

                                        db.SubTemaDesbloqueados.Add(desbloqueado);
                                        db.SaveChanges();
                                    }
                                }
                            }
                        }

                        List <int> temasCliente = db.ClienteTemas.Where(te => te.ClienteId == viewModel.Usuario.ClienteId).Select(te => te.TemaId).ToList();

                        List <SubTema> subtemasIniciales = db.SubTemas.Where(sub => temasCliente.Contains(sub.TemaId) && sub.Orden == 1).ToList();
                        foreach (SubTema subtema in subtemasIniciales)
                        {
                            bool anyadir = true;
                            if (viewModel.Usuario.BloquearSubtemas)
                            {
                                if (!listaSubtemasAccesso.Contains(subtema.SubTemaId))
                                {
                                    anyadir = false;
                                }
                            }
                            if (anyadir)
                            {
                                if (!db.SubTemaDesbloqueados.Any(sd => sd.SubTemaId == subtema.SubTemaId && sd.AlumnoId == viewModel.Usuario.Id))
                                {
                                    SubTemaDesbloqueado desbloqueado = new SubTemaDesbloqueado();
                                    desbloqueado.AlumnoId        = viewModel.Usuario.Id;
                                    desbloqueado.FechaDesbloqueo = DateTime.Now;
                                    desbloqueado.SubTemaId       = subtema.SubTemaId;

                                    db.SubTemaDesbloqueados.Add(desbloqueado);
                                    db.SaveChanges();
                                }
                            }
                        }

                        var result = gestorUsuarios.AddToRole(viewModel.Usuario.Id, "Alumno");
                        if (viewModel.Usuario.TipoUsuarioId == (int)TiposUsuariosId.AdministradorGrupo)
                        {
                            result = gestorUsuarios.AddToRole(viewModel.Usuario.Id, "AdministradorGrupo");
                        }
                        if (result.Succeeded)
                        {
                            return(RedirectToAction("Index"));
                        }
                        else
                        {
                            ModelState.AddModelError("Usuario.Email", userResult.Errors.First());
                        }
                    }
                    else
                    {
                        ModelState.AddModelError("Usuario.Email", userResult.Errors.First());
                    }
                }
            }

            viewModel.InicializarDesplegables();
            return(View(viewModel));
        }