public JsonResult ValidarReserva(ReservaGrupo model)
        {
            List<string> result = _repo.ValidarReserva(model);

            if (result.Count > 0)
                return Json(result.ToArray(), JsonRequestBehavior.AllowGet);
            else
                return Json(true, JsonRequestBehavior.AllowGet);
        }
        public ActionResult Reservar()
        {
            ReservaGrupo model = new ReservaGrupo();
            model.Recursos = _repo.GetRecursos();
            model.HoraList = _repo.GetHours();
            model.DiaList = _repo.GetDays();
            model.GrupoList = _repo.GetGruposPersonalizados();

            return View(model);
        }
        public ActionResult Reservar(ReservaGrupo model)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    _repo.insert(model);
                    TempData["Success"] = "La reserva ha sido registrada satisfactoriamente";
                }

                return RedirectToAction("Index", "Reserva");
            }
            catch (Exception)
            {
                TempData["Error"] = "No se pudieron guardar los cambios, intente de nuevo por favor.";

                return RedirectToAction("Index", "Reserva");
            }
        }
        private List<string> validarLicencias(ReservaGrupo model)
        {
            List<string> result = new List<string>();

            var grupo = db.grupoes.Find(Convert.ToInt32(model.Grupo));
            var usuariosGrupo = grupo.usuarios_grupo.ToList<usuarios_grupo>();
            var dia = Convert.ToByte(model.DiaReserva);
            var horaInicio = Convert.ToInt16(model.HoraInicio);
            var horaFin = Convert.ToInt16(model.HoraFin);
            var licenciasRequeridas = usuariosGrupo.Count;

            if (validateLicencesCitrix(model.FechaInicio, model.FechaFin, horaInicio, horaFin, dia, licenciasRequeridas) < 1)
            {
                result.Add("No hay disponibilidad de licencias citrix en la fecha seleccionada");
            }

            foreach (var recursoId in model.Recurso)
            {
                if (validateLicencesResource(model.FechaInicio, model.FechaFin, horaInicio, horaFin, dia, Convert.ToInt32(recursoId), licenciasRequeridas) < 1)
                {
                    recurso app = db.recursoes.Find(Convert.ToInt32(recursoId));
                    result.Add(String.Format("No hay disponibilidad de licencias de {0} en la fecha seleccionada", app.nombre));
                }
            }

            return result;
        }
        private List<string> grupoTieneReserva(ReservaGrupo model)
        {
            List<string> result = new List<string>();

            var grupo_id = Convert.ToInt32(model.Grupo);
            var dia = Convert.ToByte(model.DiaReserva);
            var horaInicio = Convert.ToInt16(model.HoraInicio);
            var horaFin = Convert.ToInt16(model.HoraFin);

            foreach (string recurso_id in model.Recurso)
            {
                foreach (int num in db.grupoTieneReserva(grupo_id, dia, horaInicio, horaFin, Convert.ToInt32(recurso_id)))
                {
                    if (num > 0)
                    {
                        var recurso = db.recursoes.Find(Convert.ToInt32(recurso_id));

                        result.Add(String.Format("El grupo seleccionado ya tiene una reserva el día {0} de {1}.", Utils.getDayOfWeek(dia), recurso.nombre));
                    }

                }
            }

            return result;
        }
        public List<string> ValidarReserva(ReservaGrupo model)
        {
            List<string> result = new List<string>();

            if (model.Grupo == null)
                result.Add("Seleccione el grupo personalizado");

            if (model.DiaReserva == null)
                result.Add("Seleccione el día de la reserva");

            if (model.HoraInicio == null)
                result.Add("Seleccione la hora de inicio de la reserva");

            if (model.HoraFin == null)
                result.Add("Seleccione la hora final de la reserva");

            if (model.GetFechaInicio() == null)
            {
                result.Add("Seleccione la fecha de inicio");
            }
            else
            {
                if (model.GetFechaInicio().Date < DateTime.Now.Date)
                    result.Add("Seleccione una fecha de inicio válida");
            }

            if (model.GetFechaFin() == null)
            {
                result.Add("Seleccione la fecha de inicio");
            }
            else
            {
                if (model.GetFechaFin().Date < DateTime.Now.Date)
                    result.Add("Seleccione una fecha fin válida");
            }

            if (model.GetFechaInicio() != null && model.GetFechaFin() != null)
            {
                if (model.GetFechaFin().Date < model.GetFechaInicio().Date)
                    result.Add("Seleccione una fecha de vigencia de la reserva válida");
            }

            //Validar la hora de la reserva
            if (Convert.ToInt16(model.HoraInicio) >= Convert.ToInt16(model.HoraFin))
                result.Add("Seleccione un horario de la reserva válido");

            if(model.Recurso == null)
                result.Add("Seleccione al menos una aplicación");

            if(result.Count == 0)
            {
                var validacionLicencias = this.validarLicencias(model);

                if (validacionLicencias.Count > 0)
                    result.AddRange(validacionLicencias);

                //Validar si ya existe una reserva
                var tieneReserva = this.grupoTieneReserva(model);

                if (tieneReserva.Count > 0)
                    result.AddRange(tieneReserva);
            }

            return result;
        }
        public void insert(ReservaGrupo model)
        {
            using (var transaction = db.Database.BeginTransaction())
            {
                try
                {
                    var grupo_id = Convert.ToInt32(model.Grupo);
                    var grupo = db.grupoes.Find(grupo_id);
                    var dia = Convert.ToByte(model.DiaReserva);
                    var horaInicio = Convert.ToInt16(model.HoraInicio);
                    var horaFin = Convert.ToInt16(model.HoraFin);

                    reserva reserva = new reserva();

                    reserva.fecha_inicio = model.GetFechaInicio();
                    reserva.fecha_final = model.GetFechaFin();
                    reserva.dia = dia;
                    reserva.hora_inicial = horaInicio;
                    reserva.hora_final = horaFin;
                    reserva.tipo_reserva = "3";
                    reserva.grupo_id = grupo_id;
                    reserva.fecha_registro = DateTime.Now;

                    db.reservas.Add(reserva);
                    db.SaveChanges();

                    foreach (var recursoId in model.Recurso)
                    {
                        this.insertarRecursoReserva(reserva, Convert.ToInt32(recursoId));
                    }

                    foreach (var usuario in grupo.usuarios_grupo.ToList<usuarios_grupo>())
                    {
                        this.insertarUsuarioReserva(reserva, usuario.oprid);

                    }

                    transaction.Commit();

                    //db.RegisterEvents();

                }
                catch (Exception)
                {
                    transaction.Rollback();
                    throw;
                }
            }
        }