public ActionResult Reservar(ReservaClase model)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    _repo.InsertarReserva(model);
                    TempData["Success"] = "La reserva ha sido registrada satisfactoriamente";
                    return RedirectToAction("Index", "Reserva");
                }
            }
            catch (Exception)
            {
                ModelState.AddModelError(string.Empty, "No se puede guardar la transacción. Inténtalo de nuevo, y si el problema persiste póngase en contacto con el administrador del sistema.");
            }

            IList<SelectListItem> classes = new List<SelectListItem>();
            classes.Add(new SelectListItem() { Text = "Seleccione", Value = "" });
            model.Clases = classes;
            model.Recursos = _repo.GetRecursos();

            return View(model);
        }
        public JsonResult ValidarReserva(ReservaClase 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()
        {
            ReservaClase model = new ReservaClase();
            IList<SelectListItem> classes = new List<SelectListItem>();
            classes.Add(new SelectListItem() { Text = "Seleccione", Value = "" });
            model.Clases = classes;
            model.Recursos = _repo.GetRecursos();

            return View(model);
        }
        private List<string> validarLicencias(ReservaClase model)
        {
            List<string> result = new List<string>();

            ///VALIDAR LICENCIAS
            string[] clase = model.Clase.Split('-');
            var strm = clase[0];
            var class_nbr = clase[1];

            var usuariosClase = this.GetUsuariosByClase(strm, model.IdCurso, class_nbr);

            foreach (string reunion in model.Reunion)
            {
                string[] reu = reunion.Split('-');

                var dia = Convert.ToByte(reu[0]);
                var horaInicio = Convert.ToInt16(reu[1]);
                var horaFin = Convert.ToInt16(reu[2]);

                var licenciasRequeridas = usuariosClase.Count;

                if (dia == 0)
                {
                    result.Add("La reunión seleccionada no posee día");
                }
                else
                {

                    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 = dbSql.recursoes.Find(Convert.ToInt32(recursoId));
                            result.Add(String.Format("No hay disponibilidad de licencias de {0} en la fecha seleccionada", app.nombre));
                        }
                    }

                }

            }//FIN FOREACH REUNION

            return result;
        }
        private List<string> claseTieneReserva(ReservaClase model)
        {
            List<string> result = new List<string>();

            string[] clase = model.Clase.Split('-');
            var strm = clase[0];
            var class_nbr = clase[1];
            var crse_id = model.IdCurso;

            foreach (string reunion in model.Reunion)
            {
                string[] reu = reunion.Split('-');

                var dia = Convert.ToByte(reu[0]);
                var horaInicio = Convert.ToInt16(reu[1]);
                var horaFin = Convert.ToInt16(reu[2]);

                foreach (string recurso_id in model.Recurso)
                {
                    foreach (int num in dbSql.claseTieneReserva(strm, crse_id, class_nbr, dia, horaInicio, horaFin, Convert.ToInt32(recurso_id)))
                    {
                        if (num > 0)
                        {
                            var recurso = dbSql.recursoes.Find(Convert.ToInt32(recurso_id));

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

                    }
                }

                //claseTieneReserva(string strm, string crse_id, string class_nbr, int dia, int hora_inicial, int hora_final, int recurso_id)
            }

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

            if (model.IdCurso == null)
                result.Add("Seleccione el curso");

            if (model.Clase == null)
                result.Add("Seleccione la clase");

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

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

            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");
            }

            if (model.Clase != null && model.Reunion != null && model.Recurso != null)
            {

                var validacionLicencias = this.validarLicencias(model);

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

                var tieneReserva = this.claseTieneReserva(model);

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

            return result;
        }
        public void InsertarReserva(ReservaClase model)
        {
            using (var transaction = dbSql.Database.BeginTransaction())
            {
                try
                {
                    string[] clase = model.Clase.Split('-');
                    var strm = clase[0];
                    var class_nbr = clase[1];

                    foreach (string reunion in model.Reunion)
                    {
                        string[] reu = reunion.Split('-');

                        var dia = Convert.ToByte(reu[0]);
                        var horaInicio = Convert.ToInt16(reu[1]);
                        var horaFin = Convert.ToInt16(reu[2]);

                        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 = "2";
                        reserva.strm = strm;
                        reserva.class_nbr = class_nbr;
                        reserva.crse_id = model.IdCurso;
                        reserva.fecha_registro = DateTime.Now;
                        reserva.curso = model.Curso;

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

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

                        var usuariosClase = this.GetUsuariosByClase(strm, model.IdCurso, class_nbr);

                        foreach (Usuario usuario in usuariosClase)
                        {
                            this.insertarUsuarioReserva(reserva, usuario.OPRID);
                        }

                    }

                    transaction.Commit();

                    //dbSql.RegisterEvents();

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