// GET: /Reservacion/Edit/5
        public ActionResult EditarReserva(int? id)
        {
            if (Session["COD_USUARIO"] == null)
            {
                return RedirectToAction("Login", "Home");
            }
            else
            {
                if (id == null)
                {
                    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                }

                DSRIFRESERVACION temp = db.DSRIFRESERVACION.Find(id);
                int id_aux = fechaPrincipal(temp.FEC_INICIALRESERVACION, temp.FEC_FINALRESERVACION, temp.ID_RESERVACION);

                DSRIFRESERVACION dsrifreservacion = db.DSRIFRESERVACION.Find(id_aux);

                DSRIEntities dbN = new DSRIEntities();
                var reservas_a_editar = from reser_edit in dbN.DSRIFRESERVACION
                                        where dsrifreservacion.NOM_ACTIVIDAD == reser_edit.NOM_ACTIVIDAD &&
                                              dsrifreservacion.OBJETIVO == reser_edit.OBJETIVO &&
                                              dsrifreservacion.ORGANIZADOR == reser_edit.ORGANIZADOR &&
                                              dsrifreservacion.ID_TIPOACTIVIDAD == reser_edit.ID_TIPOACTIVIDAD &&
                                              dsrifreservacion.TXT_TELEFONO == reser_edit.TXT_TELEFONO &&
                                              dsrifreservacion.HOR_INICIO == reser_edit.HOR_INICIO &&
                                              dsrifreservacion.ID_PERSONA == reser_edit.ID_PERSONA &&
                                              dsrifreservacion.HOR_FINAL == reser_edit.HOR_FINAL
                                        select reser_edit;

                List<int> Lista_de_dias = new List<int>();
                List<int> Lista_de_inmuebles = new List<int>();

                var lista_reservas_a_
                    = reservas_a_editar.ToList();

                foreach (var r in reservas_a_editar)
                {
                    while (r.FEC_INICIALRESERVACION <= r.FEC_FINALRESERVACION)
                    {
                        Lista_de_inmuebles.Add((int)r.ID_INMUEBLE);
                        Lista_de_dias.Add((int)r.FEC_INICIALRESERVACION.DayOfWeek);
                        r.FEC_INICIALRESERVACION = r.FEC_INICIALRESERVACION.AddDays(1);
                    }
                }
                Lista_de_inmuebles = Lista_de_inmuebles.Distinct().ToList();// Quitar los inmuebles repetidos de la lista
                Lista_de_dias = Lista_de_dias.Distinct().ToList(); //Quitar los dias que estan repetidos en la lista de dias de la parte de editar las reservas

                //PARA LOS INMUEBLES
                List<string> Lista_de_inmuebles_string = new List<string>();
                // Esta parte es para crear la lista de dias pero en string para poder verlos en la parte de html en viewbag
                foreach (var inmueblenumero in Lista_de_inmuebles)
                {
                    Lista_de_inmuebles_string.Add(inmueblenumero.ToString());
                }
                ViewBag.ListaInmuebles = String.Join(",", Lista_de_inmuebles_string.Cast<string>().ToArray());

                // PARA LOS DIAS
                List<string> Lista_de_dias_string = new List<string>();
                // Esta parte es para crear la lista de dias pero en string para poder verlos en la parte de html en viewbag
                foreach (var dianumero in Lista_de_dias)
                {
                    Lista_de_dias_string.Add(dianumero.ToString());
                }

                ViewBag.DiasEditar = String.Join(",", Lista_de_dias_string.Cast<string>().ToArray());

                if (dsrifreservacion == null)
                {
                    return HttpNotFound();
                }

                var todo = from reserva in db.DSRIFRESERVACION
                           where reserva.NOM_ACTIVIDAD == dsrifreservacion.NOM_ACTIVIDAD &&
                                 reserva.TXT_TELEFONO == dsrifreservacion.TXT_TELEFONO &&
                                 reserva.TXT_ESTADO == dsrifreservacion.TXT_ESTADO &&
                                 reserva.OBJETIVO == dsrifreservacion.OBJETIVO &&
                                 reserva.DESCRIPCION == dsrifreservacion.DESCRIPCION &&
                                 reserva.HOR_INICIO == dsrifreservacion.HOR_INICIO &&
                                 reserva.HOR_FINAL == dsrifreservacion.HOR_FINAL &&
                                 reserva.ID_PERSONA == dsrifreservacion.ID_PERSONA
                           select reserva;

                var listaDeTodasLasReservas = todo.ToList();
                // Sacar la fecha mayor
                foreach (var i in listaDeTodasLasReservas)
                {
                    if (dsrifreservacion.FEC_FINALRESERVACION < i.FEC_FINALRESERVACION)
                    {
                        dsrifreservacion.FEC_FINALRESERVACION = i.FEC_FINALRESERVACION;
                    }
                }
                var fecha = dsrifreservacion.FEC_INICIALRESERVACION;
                var hora1 = dsrifreservacion.HOR_INICIO;
                var hora2 = dsrifreservacion.HOR_FINAL;
                var Inm = GetInm(Lista_de_inmuebles);
                //ViewBag.INMUEBLE = new SelectList(db.DSRIFINMUEBLE, "ID_INMUEBLE", "NOM_INMUEBLE", dsrifreservacion.ID_INMUEBLE);
                ViewBag.ID_INMUEBLE = new SelectList(Inm, "Value", "Text");
                //ViewBag.ID_PERSONA = Session["ID_USUARIO"].ToString();
                ViewBag.ID_TIPOACTIVIDAD = new SelectList(db.DSRIFTIPOSACTIVIDAD, "ID_TIPOACTIVIDAD", "NOM_TIPOACTIVIDAD");
                return View(dsrifreservacion);
            }
        }
        // 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 bool disponibleInmueble(DateTime _fechaI, DateTime _fechaF, TimeSpan _horaInicio, TimeSpan _horaFinal, List<int> _lDias, int iddisponible, DSRIEntities basededatos)
        {
            var _res = Json(new[] {
            new { id="", name=""},
                }, JsonRequestBehavior.AllowGet);
            JsonObject _resultado = new JsonObject();
            List<int> listaGeneralInmueblesDisponibles = new List<int>();
            List<int> listaGeneralInmueblesDisponibles_aux = new List<int>();

            //QUITAR LOS VALORES REPETIDOS
            _lDias = _lDias.Distinct().ToList();
            // TODOS LOS INMUBLES EN EL SISTEMA
            var queryTodosLosInmuebles = from Inm in basededatos.DSRIFINMUEBLE
                                         select new
                                         {
                                             id = Inm.ID_INMUEBLE,
                                             name = Inm.NOM_INMUEBLE
                                         };
            bool listaVacia = true;
            //COMPARAR CADA UNO POR DIA Y ELIMINARLO DE TODOS LOS INMUEBLES
            DateTime inicioAux = _fechaI;
            //AL HACER LA CONSULTA POR DIA, SOLO SE OCUPA LA FECHA DE INICIO PARA VERIFICAR SI EN ESE DIA ESTA LIBRE EL INMUEBLE Y RECORRE DIA POR DIA
            while (inicioAux <= _fechaF)
            {
                foreach (var i in _lDias)
                {
                    if (i == (int)(inicioAux.DayOfWeek))
                    {
                        var queryInmueblesParaUnDia = from Inm in basededatos.inmublesDisponibles(inicioAux, inicioAux, _horaInicio, _horaFinal)
                                                      select new
                                                      {
                                                          id = Inm.ID_INMUEBLE,
                                                          name = Inm.NOM_INMUEBLE
                                                      };
                        if (listaVacia)
                        {
                            foreach (var soloinmu in queryInmueblesParaUnDia)
                            {
                                listaGeneralInmueblesDisponibles.Add(soloinmu.id);
                            }
                            listaVacia = false;
                        }
                        else
                        {
                            foreach (var soloinmu in queryInmueblesParaUnDia)
                            {// por cada inmueble de este dia
                                foreach (var inmu in listaGeneralInmueblesDisponibles)
                                {//por cada inmueble disponible para el primer dia
                                    if (soloinmu.id == inmu)
                                    {

                                        //Agregar los inmuebles que estan disponibles para este dia en especifico a otra lista
                                        listaGeneralInmueblesDisponibles_aux.Add(soloinmu.id);
                                    }
                                }
                            }
                            //restaurar a la lista original y vaciar la auxiliar
                            listaGeneralInmueblesDisponibles.RemoveRange(0, listaGeneralInmueblesDisponibles.Count);
                            foreach (var id in listaGeneralInmueblesDisponibles_aux)
                            {
                                listaGeneralInmueblesDisponibles.Add(id);
                            }
                            listaGeneralInmueblesDisponibles_aux.RemoveRange(0, listaGeneralInmueblesDisponibles_aux.Count);
                        }
                        break;
                    }
                }
                inicioAux = inicioAux.AddDays(1);
            }

            var queryB = from Inm in basededatos.DSRIFINMUEBLE
                         select new
                         {
                             id = Inm.ID_INMUEBLE,
                             name = Inm.NOM_INMUEBLE
                         };

            var resTemp = queryB.ToList();
            foreach (var Inm in queryB)
            {
                bool del = false;
                foreach (var soloI in listaGeneralInmueblesDisponibles)
                {
                    if (soloI == Inm.id)
                    {
                        del = false;
                        break;
                    }
                    del = true;
                }
                if (del)
                {
                    for (int i = 0; i < resTemp.Count; i++)
                    {
                        if (resTemp.ElementAt(i).id == Inm.id)
                        {
                            resTemp.Remove(resTemp.ElementAt(i));
                            del = false;
                            break;
                        }
                    }

                }
            }

            int contador = 0;
            bool bromelia = false;
            foreach (var inmueble in resTemp)
            {
                if (inmueble.name == "Bromelia 1" || inmueble.name == "Bromelia 2")
                {
                    contador++;
                }
                if (inmueble.name == "Bromelia Completo")
                {
                    bromelia = true;
                }
            }
            if (bromelia == false)
            {
                for (int i = 0; i < resTemp.Count; i++)
                {
                    if (resTemp.ElementAt(i).name == "Bromelia 1")
                    {
                        resTemp.Remove(resTemp.ElementAt(i));
                    }
                }
                for (int i = 0; i < resTemp.Count; i++)
                {
                    if (resTemp.ElementAt(i).name == "Bromelia 2")
                    {
                        resTemp.Remove(resTemp.ElementAt(i));
                    }
                }
            }

            else if (contador < 2)
            {
                for (int i = 0; i < resTemp.Count; i++)
                {
                    if (resTemp.ElementAt(i).name == "Bromelia Completo")
                    {
                        resTemp.Remove(resTemp.ElementAt(i));
                    }
                }
            }
            // Comprobar la disponibilidad del inmueble de la edicion con la nueva fecha
            foreach (var reserva in resTemp)
            {
                if (reserva.id == iddisponible)
                {
                    return true;
                }
            }
            return false;
        }
        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;
                    }
                }
            }
        }
        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();
            }
        }
        public ActionResult nuevopdf2(string formcollection)
        {
            if (Session["COD_USUARIO"] == null)
            {
                return RedirectToAction("Login", "Home");
            }
            else
            {
                List<string> listaFiltros = Session["Filtros"] as List<string>;

                List<string> list = formcollection.Split(',').ToList();
                int largo = list.Count;
                DateTime FechaI = DateTime.Parse(list[largo - 2]);
                DateTime FechaF = DateTime.Parse(list[largo - 1]);
                largo = largo - 3;
                int largo_aux = largo;
                var reservaciones = db.DSRIFRESERVACION;
                var inmuebles = db.DSRIFINMUEBLE;
                var _query0 = from reserva in reservaciones
                              where ((reserva.FEC_INICIALRESERVACION >= FechaI && reserva.FEC_INICIALRESERVACION <= FechaF && reserva.TXT_ESTADO != "Rechazada" && reserva.TXT_ESTADO != "En Proceso"))
                              select reserva;
                var listaTemporal1 = _query0.ToList();

                foreach (var reserva in _query0.ToList())
                {
                    bool eliminar = true;

                    for (int a = 0; a <= largo; a++)
                    {
                        if (reserva.ID_INMUEBLE == Convert.ToInt32(list[a]))
                        {
                            eliminar = false;
                            break;
                        }
                    }
                    if (eliminar)
                    {
                        for (int i = 0; i < listaTemporal1.Count; i++)
                        {
                            if (listaTemporal1.ElementAt(i).ID_INMUEBLE == reserva.ID_INMUEBLE)
                            {
                                listaTemporal1.Remove(listaTemporal1.ElementAt(i));
                                eliminar = true;
                                break;
                            }
                        }
                    }
                }
                // Eliminar con los filtros las reservas que no esten
                foreach (var filtro in listaFiltros)
                {
                    for (int i = 0; i < listaTemporal1.Count; i++)
                    {
                        if ((listaTemporal1.ElementAt(i).DSRIFTIPOSACTIVIDAD.NOM_TIPOACTIVIDAD == "Alquiler Instalaciones" && filtro == "alquiler") ||
                            (listaTemporal1.ElementAt(i).DSRIFTIPOSACTIVIDAD.NOM_TIPOACTIVIDAD == "Actividad Interna" && filtro == "actividad") ||
                            ((listaTemporal1.ElementAt(i).DSRIFTIPOSACTIVIDAD.NOM_TIPOACTIVIDAD == "Transferencia Tecnológica" ||
                            listaTemporal1.ElementAt(i).DSRIFTIPOSACTIVIDAD.NOM_TIPOACTIVIDAD == "Vinculación Empresarial" ||
                            listaTemporal1.ElementAt(i).DSRIFTIPOSACTIVIDAD.NOM_TIPOACTIVIDAD == "Educación Continua") && filtro == "ejes"))
                        {
                            listaTemporal1.Remove(listaTemporal1.ElementAt(i));
                            i--;
                        }
                    }
                }

                var _query1 = listaTemporal1.ToList().OrderBy(ll => ll.FEC_INICIALRESERVACION.Year);
                var _query2 = _query1.ToList().OrderBy(ll => ll.FEC_INICIALRESERVACION.Month);
                var _query3 = _query2.ToList().OrderBy(ll => ll.FEC_INICIALRESERVACION.Date);
                // quitar los valores repetidos de la lista para que quede listo la busqueda y el pdf
                Document pdfDoc = new Document(PageSize.A4, 10, 10, 10, 10);
                try
                {
                    PdfWriter.GetInstance(pdfDoc, System.Web.HttpContext.Current.Response.OutputStream);
                    pdfDoc.Open();

                    string url = "http://3.bp.blogspot.com/-qZcs1DZ8Wys/TWU1PrkuMzI/AAAAAAAAAXM/u85hsQzQc_w/s320/image002.jpg";
                    Image jpg = Image.GetInstance(new Uri(url));
                    jpg.SpacingBefore = 7f;
                    jpg.ScalePercent(35f);
                    pdfDoc.Add(jpg);
                    Chunk Titulo = new Chunk("Sistema de Reservas de Inmuebles, TEC-SSC", FontFactory.GetFont(FontFactory.TIMES_BOLD, 16));
                    Paragraph p = new Paragraph();

                    p.Alignment = Element.ALIGN_LEFT;
                    p.Add(Titulo);
                    pdfDoc.Add(p);

                    Chunk subtitulo = new Chunk("Centro de Transferencia Tecnológica y Educación Continua.", FontFactory.GetFont(FontFactory.TIMES, 12));
                    Paragraph p1 = new Paragraph();
                    p1.Alignment = Element.ALIGN_LEFT;
                    p1.Add(subtitulo);

                    pdfDoc.Add(p1);

                    Chunk extrainfo = new Chunk("Informe Generado Por: " + @Session["NOM_USUARIO"], FontFactory.GetFont(FontFactory.TIMES, 10));
                    Paragraph pextra = new Paragraph();
                    pextra.Alignment = Element.ALIGN_LEFT;
                    pextra.Add(extrainfo);

                    pdfDoc.Add(pextra);

                    Chunk extrainfo1 = new Chunk("El día: " + @DateTime.Now.ToShortDateString(), FontFactory.GetFont(FontFactory.TIMES, 10));
                    Paragraph pextra1 = new Paragraph();
                    pextra1.SpacingAfter = 7f;
                    pextra1.Alignment = Element.ALIGN_LEFT;
                    pextra1.Add(extrainfo1);

                    pdfDoc.Add(pextra1);

                    PdfPTable table = new PdfPTable(3);

                    table.WidthPercentage = 100;
                    float[] widths = new float[] { 20f, 20f, 60f };
                    table.SetWidths(widths);
                    table.HorizontalAlignment = 0;
                    table.SpacingAfter = 10;

                    PdfPCell cellFI = new PdfPCell(new Phrase("Fecha Inicio", FontFactory.GetFont(FontFactory.TIMES_BOLD, 11)));
                    cellFI.Colspan = 1;
                    cellFI.BackgroundColor = new iTextSharp.text.BaseColor(204, 204, 204);
                    cellFI.HorizontalAlignment = 1; //0=Left, 1=Centre, 2=Right

                    PdfPCell cellFF = new PdfPCell(new Phrase("Fecha Finalización", FontFactory.GetFont(FontFactory.TIMES_BOLD, 11)));
                    cellFF.Colspan = 1;
                    cellFF.BackgroundColor = new iTextSharp.text.BaseColor(204, 204, 204);
                    cellFF.HorizontalAlignment = 1; //0=Left, 1=Centre, 2=Right

                    PdfPCell cellN = new PdfPCell(new Phrase("Informe de la reserva", FontFactory.GetFont(FontFactory.TIMES_BOLD, 11)));
                    cellN.Colspan = 1;
                    cellN.BackgroundColor = new iTextSharp.text.BaseColor(204, 204, 204);
                    cellN.HorizontalAlignment = 1; //0=Left, 1=Centre, 2=Right

                    table.AddCell(cellFI);
                    table.AddCell(cellFF);
                    table.AddCell(cellN);
                    var listaOrdenada = _query3.ToList();
                    for (int i = 0; i < listaOrdenada.Count; i++)
                    {
                        table.AddCell(new Phrase(listaOrdenada.ElementAt(i).FEC_INICIALRESERVACION.ToShortDateString(), FontFactory.GetFont(FontFactory.HELVETICA, 10)));
                        table.AddCell(new Phrase(listaOrdenada.ElementAt(i).FEC_FINALRESERVACION.ToShortDateString(), FontFactory.GetFont(FontFactory.HELVETICA, 10)));

                        DateTime horaI = new DateTime();
                        horaI = DateTime.Today.Add(listaOrdenada.ElementAt(i).HOR_INICIO);
                        DateTime HoraF = new DateTime();
                        HoraF = DateTime.Today.Add(listaOrdenada.ElementAt(i).HOR_FINAL);
                        string hor_inicio = horaI.ToString("h:mm");
                        string hor_final = HoraF.ToString("h:mm");
                        if (listaOrdenada.ElementAt(i).HOR_INICIO.Hours <= 11)
                        {
                            hor_inicio = hor_inicio + " am";
                        }
                        else
                        {
                            hor_inicio = hor_inicio + " pm";
                        }
                        if (listaOrdenada.ElementAt(i).HOR_FINAL.Hours <= 11)
                        {
                            hor_final = hor_final + " am";
                        }
                        else
                        {
                            hor_final = hor_final + " pm";
                        }

                        int? costo = 0;
                        if (listaOrdenada.ElementAt(i).DSRIFINMUEBLE.DSRIFCLASIFINMUEBLE.NOM_CLASIFINMUEBLE == "CTEC") // Aqui se cobro por hora
                        {
                            while (listaOrdenada.ElementAt(i).FEC_INICIALRESERVACION <= listaOrdenada.ElementAt(i).FEC_FINALRESERVACION)
                            {
                                while (listaOrdenada.ElementAt(i).HOR_INICIO < listaOrdenada.ElementAt(i).HOR_FINAL)
                                {
                                    TimeSpan mediaHora = TimeSpan.FromHours(1); // Agregar Media hora a la hora de inicio
                                    costo += listaOrdenada.ElementAt(i).DSRIFINMUEBLE.COS_INMUEBLE;
                                    listaOrdenada.ElementAt(i).HOR_INICIO = listaOrdenada.ElementAt(i).HOR_INICIO.Add(mediaHora);
                                }
                                if (listaOrdenada.ElementAt(i).DSRIFINMUEBLE.NOM_INMUEBLE == "Tecnoaula 1")
                                {
                                    costo += 20000;
                                }
                                DateTime nuevaFecha = listaOrdenada.ElementAt(i).FEC_INICIALRESERVACION.AddDays(1);
                                listaOrdenada.ElementAt(i).FEC_INICIALRESERVACION = nuevaFecha;
                            }
                            PdfPCell celda = new PdfPCell();
                            Phrase texto = new Phrase("ACTIVIDAD: " + listaOrdenada.ElementAt(i).NOM_ACTIVIDAD +
                                                      "\nINMUEBLE: " + listaOrdenada.ElementAt(i).DSRIFINMUEBLE.NOM_INMUEBLE +
                                                      "\nINICIO: " + hor_inicio +
                                                      "\nFIN: " + hor_final +
                                                      "\nCOSTO POR HORA ¢: " + listaOrdenada.ElementAt(i).DSRIFINMUEBLE.COS_INMUEBLE +
                                                      "\nCOSTO TOTAL ¢: " + costo, FontFactory.GetFont(FontFactory.HELVETICA, 8));
                            celda.AddElement(texto);
                            table.AddCell(celda);

                        }
                        else if (listaOrdenada.ElementAt(i).DSRIFINMUEBLE.DSRIFCLASIFINMUEBLE.NOM_CLASIFINMUEBLE == "ECOTEC") // Aqui se cobra por Día
                        {

                            while (listaOrdenada.ElementAt(i).FEC_INICIALRESERVACION <= listaOrdenada.ElementAt(i).FEC_FINALRESERVACION)
                            {
                                costo += listaOrdenada.ElementAt(i).DSRIFINMUEBLE.COS_INMUEBLE;
                                DateTime nuevaFecha = listaOrdenada.ElementAt(i).FEC_INICIALRESERVACION.AddDays(1);
                                listaOrdenada.ElementAt(i).FEC_INICIALRESERVACION = nuevaFecha;
                            }

                            PdfPCell celda = new PdfPCell();

                            Phrase texto = new Phrase("ACTIVIDAD: " + listaOrdenada.ElementAt(i).NOM_ACTIVIDAD +
                                                      "\nINMUEBLE: " + listaOrdenada.ElementAt(i).DSRIFINMUEBLE.NOM_INMUEBLE +
                                                      "\nINICIO: " + hor_inicio +
                                                      "\nFIN: " + hor_final +
                                                      "\nCOSTO POR DÍA ¢: " + listaOrdenada.ElementAt(i).DSRIFINMUEBLE.COS_INMUEBLE +
                                                      "\nCOSTO TOTAL ¢: " + costo, FontFactory.GetFont(FontFactory.HELVETICA, 8));
                            celda.AddElement(texto);
                            table.AddCell(celda);
                        }
                    } // Hasta Aqui llega la tabla

                    // Se Crea una nueva instancia para que no se vea afectaba sobre la otra consulta
                    DSRIEntities nn = new DSRIEntities();
                    var res = nn.DSRIFRESERVACION;
                    var todasReservas = from r in res
                                        where ((r.FEC_INICIALRESERVACION >= FechaI && r.FEC_INICIALRESERVACION <= FechaF && r.TXT_ESTADO != "Rechazada" && r.TXT_ESTADO != "En Proceso"))
                                        select r;
                    var lTemporal1 = todasReservas.ToList();

                    foreach (var reser in todasReservas.ToList())
                    {
                        bool eli = true;
                        for (int a = 0; a <= largo; a++)
                        {
                            if (reser.ID_INMUEBLE == Convert.ToInt32(list[a]))
                            {
                                eli = false;
                                break;
                            }
                        }
                        if (eli)
                        {
                            for (int i = 0; i < lTemporal1.Count; i++)
                            {
                                if (lTemporal1.ElementAt(i).ID_INMUEBLE == reser.ID_INMUEBLE)
                                {
                                    lTemporal1.Remove(lTemporal1.ElementAt(i));
                                    eli = true;
                                    break;
                                }
                            }
                        }
                    }
                    // Eliminar con los filtros las reservas que no esten
                    foreach (var filtro in listaFiltros)
                    {
                        for (int i = 0; i < listaTemporal1.Count; i++)
                        {
                            if ((lTemporal1.ElementAt(i).DSRIFTIPOSACTIVIDAD.NOM_TIPOACTIVIDAD == "Alquiler Instalaciones" && filtro == "alquiler") ||
                                (lTemporal1.ElementAt(i).DSRIFTIPOSACTIVIDAD.NOM_TIPOACTIVIDAD == "Actividad Interna" && filtro == "actividad") ||
                                ((lTemporal1.ElementAt(i).DSRIFTIPOSACTIVIDAD.NOM_TIPOACTIVIDAD == "Transferencia Tecnológica" ||
                                lTemporal1.ElementAt(i).DSRIFTIPOSACTIVIDAD.NOM_TIPOACTIVIDAD == "Vinculación Empresarial" ||
                                lTemporal1.ElementAt(i).DSRIFTIPOSACTIVIDAD.NOM_TIPOACTIVIDAD == "Educación Continua") && filtro == "ejes"))
                            {
                                lTemporal1.Remove(lTemporal1.ElementAt(i));
                                i--;
                            }
                        }
                    }

                    pdfDoc.Add(table); // Hasta aqui toda la tabla

                    var lista1 = lTemporal1.ToList().OrderBy(aa => aa.FEC_INICIALRESERVACION.Year);
                    var lista2 = lista1.ToList().OrderBy(aa => aa.FEC_INICIALRESERVACION.Month);
                    var lista3 = lista2.ToList().OrderBy(aa => aa.FEC_INICIALRESERVACION.Date);

                    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                    var listaInmuebles = lista3.ToList();
                    List<int> UnicosInmuebles = new List<int>();// Dejar solo un inmueble de cada clase
                    foreach (var inmue in listaInmuebles)
                    {
                        UnicosInmuebles.Add(inmue.DSRIFINMUEBLE.ID_INMUEBLE);
                    }
                    UnicosInmuebles = UnicosInmuebles.Distinct().ToList();
                    ///////////

                    // Agregamos Un Titulo Para la descripción de todo el costo general de los inmuebles para que no se vea feo XD

                    Chunk factura = new Chunk("COSTO TOTAL DE CADA INMUEBLE", FontFactory.GetFont(FontFactory.TIMES_BOLD, 11));
                    Paragraph pfactura = new Paragraph();
                    pfactura.Alignment = Element.ALIGN_CENTER;
                    pfactura.Add(factura);

                    pdfDoc.Add(pfactura);

                    for (int a = 0; a < UnicosInmuebles.Count; a++) // recorre la lista de inmuebles unicos de la lista previamente llenada
                    {
                        int? costoGeneral = 0;
                        int? costoUnitario = 0;
                        foreach (var reserva in listaInmuebles) // recorre la lista en donde estan todas las reservas que se encuentran en el modelo
                        {
                            if (reserva.ID_INMUEBLE == UnicosInmuebles.ElementAt(a)) // se compara si el id de la lista es igual a la de la reserva para empezar a sumar
                            {

                                //////////////////////////////////////////////////////////////////////
                                if (reserva.DSRIFINMUEBLE.DSRIFCLASIFINMUEBLE.NOM_CLASIFINMUEBLE == "CTEC") // Aqui se cobro por hora para los del CTEC
                                {
                                    while (reserva.FEC_INICIALRESERVACION <= reserva.FEC_FINALRESERVACION)
                                    {
                                        while (reserva.HOR_INICIO < reserva.HOR_FINAL)
                                        {
                                            TimeSpan mediaHora = TimeSpan.FromHours(1); // Agregar Media hora a la hora de inicio
                                            costoUnitario += reserva.DSRIFINMUEBLE.COS_INMUEBLE;
                                            reserva.HOR_INICIO = reserva.HOR_INICIO.Add(mediaHora);
                                        }
                                        if (reserva.DSRIFINMUEBLE.NOM_INMUEBLE == "Tecnoaula 1")
                                        {
                                            costoUnitario += 20000;
                                        }
                                        DateTime nuevaFecha = reserva.FEC_INICIALRESERVACION.AddDays(1);
                                        reserva.FEC_INICIALRESERVACION = nuevaFecha;
                                    }

                                }
                                //////////////////////////////////////////////////////////////////////
                                else if (reserva.DSRIFINMUEBLE.DSRIFCLASIFINMUEBLE.NOM_CLASIFINMUEBLE == "ECOTEC") // Aqui se cobra por Día para los del ECOTEC
                                {

                                    while (reserva.FEC_INICIALRESERVACION <= reserva.FEC_FINALRESERVACION)
                                    {
                                        costoUnitario += reserva.DSRIFINMUEBLE.COS_INMUEBLE;
                                        DateTime nuevaFecha = reserva.FEC_INICIALRESERVACION.AddDays(1);
                                        reserva.FEC_INICIALRESERVACION = nuevaFecha;
                                    }
                                }
                            }
                        }

                        costoGeneral += costoUnitario;

                        DSRIFINMUEBLE inmuebleUnico = db.DSRIFINMUEBLE.Find(UnicosInmuebles.ElementAt(a));
                        Chunk nuevoParrafo = new Chunk(inmuebleUnico.NOM_INMUEBLE + ": ¢" + costoGeneral, FontFactory.GetFont(FontFactory.TIMES, 10));
                        Paragraph nuevoP = new Paragraph();
                        nuevoP.Alignment = Element.ALIGN_CENTER;
                        nuevoP.Add(nuevoParrafo);

                        pdfDoc.Add(nuevoP);
                        costoUnitario = 0;
                        costoGeneral = 0;
                    }

                    pdfDoc.Close();
                    Response.ContentType = "application/pdf";
                    Response.AddHeader("content-disposition", "attachment; filename= Informe de Reservas.pdf");
                    System.Web.HttpContext.Current.Response.Write(pdfDoc);
                    Response.Flush();
                    Response.End();
                    System.Web.HttpContext.Current.ApplicationInstance.CompleteRequest();
                }
                catch (DocumentException de)
                {
                    System.Web.HttpContext.Current.Response.Write(de.Message);
                }
                catch (IOException ioEx)
                {
                    System.Web.HttpContext.Current.Response.Write(ioEx.Message);
                }
                catch (Exception ex)
                {
                    System.Web.HttpContext.Current.Response.Write(ex.Message);
                }

                return View();
            }
        }