public bool disponibilidadHora(TimeSpan hi_nueva, TimeSpan hf_nueva, DateTime fi_nueva, DateTime ff_nueva, DateTime fi, int id, List<int> _lDias, List<int> _lInmuebles)
        {
            using (var basededatos = new DSRIEntities())
            {
                using (var dbContextTransaction = basededatos.Database.BeginTransaction())
                {
                    try
                    { // Realizar toda la transaccion de borrar y agregar
                        DSRIFRESERVACION temp = basededatos.DSRIFRESERVACION.Find(id);

                        var all_reservas_relacionadas = from reservas in basededatos.DSRIFRESERVACION
                                                        where (reservas.NOM_ACTIVIDAD == temp.NOM_ACTIVIDAD && reservas.OBJETIVO == temp.OBJETIVO && reservas.ORGANIZADOR == temp.ORGANIZADOR &&
                                                               reservas.HOR_INICIO == temp.HOR_INICIO && reservas.HOR_FINAL == temp.HOR_FINAL && reservas.ID_PERSONA == temp.ID_PERSONA &&
                                                               reservas.ID_TIPOACTIVIDAD == temp.ID_TIPOACTIVIDAD && reservas.TXT_ESTADO == temp.TXT_ESTADO &&
                                                               reservas.TXT_TELEFONO == temp.TXT_TELEFONO && reservas.TXT_EXTRA == temp.TXT_EXTRA && reservas.TXT_ESTADO != "Rechazada")
                                                        select reservas;
                        var lista_reservas_aeliminar = all_reservas_relacionadas.ToList();
                        foreach (var r in lista_reservas_aeliminar)
                        {
                            basededatos.DSRIFRESERVACION.Remove(r);
                            basededatos.SaveChanges();
                        }
                        // VERIFICAR DISPONIBILIDAD DE TODOS LOS INMUEBLES
                        foreach (var i in _lInmuebles)
                        {
                            if (!disponibleInmueble(fi_nueva, ff_nueva, hi_nueva, hf_nueva, _lDias, i, basededatos))
                            {
                                dbContextTransaction.Rollback();
                                return false;
                            }
                        }
                        return true;
                    }
                    catch (Exception)
                    {
                        dbContextTransaction.Rollback();
                        return false;
                    }
                }
            }
        }
        // Función para editar todos los datos de la reserva
        public ActionResult editarR(JsonReservaNueva_Vieja _ReservaNuevaVieja)
        {
            if (Session["COD_USUARIO"] == null)
            {
                //return View();
                return RedirectToAction("Login", "Home");
            }
            else
            {
                using (var basededatos = new DSRIEntities())
                {
                    using (var dbContextTransaction = basededatos.Database.BeginTransaction())
                    {
                        try
                        { // Realizar toda la transaccion de borrar y agregar
                            var _HoraInicioTemp = DateTime.Parse(_ReservaNuevaVieja.hi_viejo, CultureInfo.CreateSpecificCulture("es-ES"));
                            var _HoraFinalTemp = DateTime.Parse(_ReservaNuevaVieja.hf_viejo, CultureInfo.CreateSpecificCulture("es-ES"));
                            /*Convierte las fechas a formato "HH:MM:SS"*/
                            TimeSpan hi_viejo = _HoraInicioTemp.TimeOfDay;
                            TimeSpan hf_viejo = _HoraFinalTemp.TimeOfDay;
                            var _HoraInicioTemp_n = DateTime.Parse(_ReservaNuevaVieja.horai, CultureInfo.CreateSpecificCulture("es-ES"));
                            var _HoraFinalTemp_n = DateTime.Parse(_ReservaNuevaVieja.horaf, CultureInfo.CreateSpecificCulture("es-ES"));
                            /*Convierte las fechas a formato "HH:MM:SS"*/
                            TimeSpan horai = _HoraInicioTemp_n.TimeOfDay;
                            TimeSpan horaf = _HoraFinalTemp_n.TimeOfDay;
                            DSRIFRESERVACION reservacionTemporal = new DSRIFRESERVACION();
                            var _reservaciones = basededatos.DSRIFRESERVACION;
                            var _mobiliarios = basededatos.DSRITMOBILIARIORESERVACION;
                            // se sacan las reservas viejas a editar
                            var _getReservaciones = from reserva in _reservaciones
                                                    where reserva.NOM_ACTIVIDAD == _ReservaNuevaVieja.nom_viejo &&
                                                          reserva.ID_PERSONA == _ReservaNuevaVieja.idusuario_viejo &&
                                                          reserva.TXT_TELEFONO == _ReservaNuevaVieja.tel_viejo &&
                                                          reserva.TXT_ESTADO != "Rechazada" &&
                                                          reserva.OBJETIVO == _ReservaNuevaVieja.idObjetivo_viejo &&
                                                          reserva.DESCRIPCION == _ReservaNuevaVieja.idDescripcion_viejo &&
                                                          reserva.HOR_INICIO == hi_viejo &&
                                                          reserva.HOR_FINAL == hf_viejo
                                                    select reserva;

                            var _getMobiliarios = from mobiliario in _mobiliarios
                                                  where mobiliario.DSRIFRESERVACION.ID_RESERVACION == _ReservaNuevaVieja.id_viejo
                                                  select mobiliario;
                            List<DSRITMOBILIARIORESERVACION> _ListaMobiliario = new List<DSRITMOBILIARIORESERVACION>();
                            foreach (var m in _getMobiliarios)
                            {
                                _ListaMobiliario.Add(m);
                                basededatos.DSRITMOBILIARIORESERVACION.Remove(m);
                            }
                            var listaReservas = _getReservaciones.ToList();
                            //Sacar los id de las reservas anteriores a editar
                            List<int> idinmuebles = new List<int>();
                            foreach (var reser in listaReservas)
                            {
                                reservacionTemporal.ID_PERSONA = reser.ID_PERSONA;
                                idinmuebles.Add(reser.ID_INMUEBLE);
                            }
                            idinmuebles = idinmuebles.Distinct().ToList();
                            //  Tener en cuenta este pedaso de codigo para revisar el id a la hora de editar puesto que no deberia tener problema, pero al parecer no lo está haciendo bien
                            // Para el viernes
                            int largo = idinmuebles.Count - 1;

                            if (!semanaigual(_ReservaNuevaVieja.ListaDiasViejos, _ReservaNuevaVieja.listaDias) ||
                                hi_viejo != horai || hf_viejo != horaf || _ReservaNuevaVieja.fi_viejo != _ReservaNuevaVieja.fechai ||
                                _ReservaNuevaVieja.ff_viejo != _ReservaNuevaVieja.fechaf)// si retorna false
                            {
                                foreach (var reser in listaReservas)
                                {
                                    if (disponibilidadHora(horai, horaf, _ReservaNuevaVieja.fechai, _ReservaNuevaVieja.fechaf, reser.FEC_FINALRESERVACION, reser.ID_RESERVACION, _ReservaNuevaVieja.listaDias, _ReservaNuevaVieja.listaInmuebles) == false)
                                    {
                                        return Content("Error al editar reserva");
                                    }
                                }
                            }
                            foreach (var reser in listaReservas)
                            {
                                // eliminar todas las reservas viejas sin hacer commit por aquello de que pase un error de conexion y todo quede como antes
                                DSRIFRESERVACION res_aux = basededatos.DSRIFRESERVACION.Find(reser.ID_RESERVACION);
                                reservacionTemporal = reser;
                                basededatos.DSRIFRESERVACION.Remove(res_aux);
                                basededatos.SaveChanges();
                            }
                            if (_ListaMobiliario.Count != 0)
                            {
                                reservacionTemporal.DSRITMOBILIARIORESERVACION = _ListaMobiliario;
                            }
                            reservacionTemporal.NOM_ACTIVIDAD = _ReservaNuevaVieja.nombre;
                            reservacionTemporal.TXT_TELEFONO = _ReservaNuevaVieja.telef;
                            reservacionTemporal.HOR_INICIO = horai;
                            reservacionTemporal.HOR_FINAL = horaf;
                            reservacionTemporal.ID_TIPOACTIVIDAD = _ReservaNuevaVieja.tipoactividad;
                            reservacionTemporal.FEC_INICIALRESERVACION = _ReservaNuevaVieja.fechai;
                            reservacionTemporal.FEC_FINALRESERVACION = _ReservaNuevaVieja.fechaf;
                            reservacionTemporal.CAN_AFORO = _ReservaNuevaVieja.cantAforo;
                            reservacionTemporal.CAN_AFORODIA = _ReservaNuevaVieja.cantAforodia;
                            reservacionTemporal.ORGANIZADOR = _ReservaNuevaVieja.organizador;
                            reservacionTemporal.OBJETIVO = _ReservaNuevaVieja.objetivo;
                            reservacionTemporal.DESCRIPCION = _ReservaNuevaVieja.descripcion;

                            if (_ReservaNuevaVieja.des == null || _ReservaNuevaVieja.des == "")
                            {
                                reservacionTemporal.TXT_EXTRA = "N/A";
                            }
                            else
                            {
                                reservacionTemporal.TXT_EXTRA = _ReservaNuevaVieja.des;
                            }
                            //Empieza la creacion de la nueva reserva modificada y nueva
                            DateTime _fechaI = _ReservaNuevaVieja.fechai;
                            DateTime _fechaF = _ReservaNuevaVieja.fechaf;
                            List<int> listadeDias = _ReservaNuevaVieja.listaDias;
                            listadeDias = listadeDias.Distinct().ToList();
                            listadeDias.Sort();
                            while (_fechaI <= _fechaF)
                            {
                                DateTime FECHAINICIALUNICA = _fechaI;
                                bool reservaEntrante = false;
                                bool guardarReserva = false;
                                DateTime UnicaFI = new DateTime();
                                UnicaFI = _fechaI;
                                reservacionTemporal.FEC_INICIALRESERVACION = UnicaFI; // cargar la nueva fecha a la que se va recorriendo las nuevas fechas
                                //recorrer la lista de dias y asignar la fecha final nueva a cada una de las nuevas reservas
                                for (int dia = 0; dia < listadeDias.Count && (_fechaI <= _fechaF); dia++)
                                {
                                    DateTime NuevoInicio = new DateTime();
                                    NuevoInicio = _fechaI;
                                    if (listadeDias[dia] == (int)_fechaI.DayOfWeek)
                                    {
                                        reservaEntrante = true;
                                    }
                                    if (reservaEntrante)
                                    {
                                        guardarReserva = true;
                                        if (listadeDias[dia] == 6)
                                        {
                                            if (listadeDias.Count == 1 && listadeDias[dia] != (int)_fechaI.DayOfWeek)
                                            {
                                                break;
                                            }
                                            else if (listadeDias[dia] == (int)_fechaI.DayOfWeek && (_fechaI <= _fechaF))
                                            {
                                                reservacionTemporal.FEC_FINALRESERVACION = NuevoInicio;
                                            }
                                            _fechaI = _fechaI.AddDays(1);
                                            dia = -1;
                                        }
                                        else if (listadeDias[dia] == (int)_fechaI.DayOfWeek && (_fechaI <= _fechaF))
                                        {
                                            reservacionTemporal.FEC_FINALRESERVACION = NuevoInicio;
                                            _fechaI = _fechaI.AddDays(1);
                                        }
                                        else { break; }
                                    }
                                }
                                if (guardarReserva)
                                {
                                    foreach (var idinmueble in _ReservaNuevaVieja.listaInmuebles)// Guardar reserva Por cada inmueble seleccionado
                                    {
                                        reservacionTemporal.ID_INMUEBLE = idinmueble;

                                        DateTime FECHAINICIAL = FECHAINICIALUNICA;

                                        while (FECHAINICIAL <= reservacionTemporal.FEC_FINALRESERVACION)
                                        {
                                            reservacionTemporal.FEC_INICIALRESERVACION = FECHAINICIAL;
                                            basededatos.DSRIFRESERVACION.Add(reservacionTemporal);
                                            ////Para guardar los inmuebles de esta reserva
                                            for (int i = 0; i < _ListaMobiliario.Count; i++)
                                            {
                                                DSRITMOBILIARIORESERVACION temp = _ListaMobiliario.ElementAt(i);
                                                temp.ID_RESERVACION = reservacionTemporal.ID_RESERVACION;
                                                basededatos.DSRITMOBILIARIORESERVACION.Add(temp);
                                            }

                                            basededatos.SaveChanges();
                                            FECHAINICIAL = FECHAINICIAL.AddDays(1);
                                        }
                                    }
                                }
                                if (!reservaEntrante)
                                {
                                    _fechaI = _fechaI.AddDays(1);
                                }
                            }
                            dbContextTransaction.Commit(); // para registrar todos los cambios hechos en la base de datos
                        }
                        catch (DbEntityValidationException) // En caso de error se regresa al estado anterior sin necesidad de eliminar la base de datos
                        {
                            dbContextTransaction.Rollback();
                            return Content("Error al editar reserva");
                        }
                    }
                }
                var resultz = new { Success = "True" };
                return Json(resultz, JsonRequestBehavior.AllowGet);
            }
        }
        public ActionResult Create(DSRIFRESERVACION _Reserva, List<int> _Ldias, DateTime _fechaI, DateTime _fechaF, List<int> _Listainmuebles)
        {
            List<int> listadeDias = _Ldias;
            listadeDias = listadeDias.Distinct().ToList();
            listadeDias.Sort();
            if (Session["COD_USUARIO"] == null)
            {
                return RedirectToAction("Login", "Home");
            }
            else
            {
                using (var basededatos = new DSRIEntities())
                {
                    using (var dbContextTransaction = basededatos.Database.BeginTransaction())
                    {
                        try
                        {
                            while (_fechaI <= _fechaF)
                            {
                                DateTime FECHAINICIALUNICA = _fechaI;
                                _Reserva.ID_PERSONA = Session["ID_USUARIO"].ToString();
                                bool reservaEntrante = false;
                                bool guardarReserva = false;
                                DateTime UnicaFI = new DateTime();
                                UnicaFI = _fechaI;
                                _Reserva.FEC_INICIALRESERVACION = UnicaFI; // cargar la nueva fecha a la que se va recorriendo las nuevas fechas
                                //recorrer la lista de dias y asignar la fecha final nueva a cada una de las nuevas reservas
                                for (int dia = 0; dia < listadeDias.Count; dia++)
                                {
                                    DateTime NuevoInicio = new DateTime();
                                    NuevoInicio = _fechaI;
                                    if (listadeDias[dia] == (int)_fechaI.DayOfWeek)
                                    {
                                        reservaEntrante = true;
                                    }
                                    if (reservaEntrante)
                                    {
                                        guardarReserva = true;
                                        if (listadeDias[dia] == 6)
                                        {
                                            if (listadeDias.Count == 1 && listadeDias[dia] != (int)_fechaI.DayOfWeek)
                                            {
                                                break;
                                            }
                                            else if (listadeDias[dia] == (int)_fechaI.DayOfWeek && (_fechaI <= _fechaF))
                                            {
                                                _Reserva.FEC_FINALRESERVACION = NuevoInicio;
                                                _fechaI = _fechaI.AddDays(1);
                                            }
                                            dia = -1;
                                        }
                                        else if (listadeDias[dia] == (int)_fechaI.DayOfWeek && (_fechaI <= _fechaF))
                                        {
                                            _Reserva.FEC_FINALRESERVACION = NuevoInicio;
                                            _fechaI = _fechaI.AddDays(1);
                                        }
                                        else { break; }
                                    }
                                }
                                if (guardarReserva)
                                {
                                    foreach (var idReserva in _Listainmuebles)// Guardar reserva Por cada inmueble seleccionado
                                    {
                                        _Reserva.ID_INMUEBLE = idReserva;

                                        DateTime FECHAINICIAL = FECHAINICIALUNICA;

                                        while (FECHAINICIAL <= _Reserva.FEC_FINALRESERVACION)
                                        {
                                            _Reserva.FEC_INICIALRESERVACION = FECHAINICIAL;
                                            basededatos.DSRIFRESERVACION.Add(_Reserva);

                                            ICollection<DSRITMOBILIARIORESERVACION> _ListaMobiliario = _Reserva.DSRITMOBILIARIORESERVACION;
                                            //Para guardar los inmuebles de esta reserva
                                            for (int i = 0; i < _ListaMobiliario.Count; i++)
                                            {
                                                DSRITMOBILIARIORESERVACION temp = _ListaMobiliario.ElementAt(i);
                                                basededatos.DSRITMOBILIARIORESERVACION.Add(temp);
                                            }

                                            basededatos.SaveChanges();
                                            FECHAINICIAL = FECHAINICIAL.AddDays(1);
                                        }
                                    }
                                }
                                if (!reservaEntrante)
                                {
                                    _fechaI = _fechaI.AddDays(1);
                                }
                            }
                            dbContextTransaction.Commit();
                            var resultz = new { Success = "True" };
                            return Json(resultz, JsonRequestBehavior.AllowGet);
                        }
                        catch (Exception)
                        {
                            dbContextTransaction.Rollback();
                        }
                    }
                }
                return HttpNotFound();
            }
        }