public ActionResult Reserve(int?roomId, string Date)
        {
            RoomSystem.Models.ReserveModel reserveModel = new RoomSystem.Models.ReserveModel();
            List <Models.Rooms>            rooms        = new List <Models.Rooms>();

            using (Models.RoomSystemEntities db = new Models.RoomSystemEntities())
            {
                rooms = (from s in db.Rooms where s.Enable select s).ToList();
            }

            DateTime lastDate = DateTime.Today.AddDays(1);
            DateTime date     = lastDate;

            if (Date != null && Date.Length > 0)
            {
                date = DateTime.ParseExact(Date, "yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture);
                //date = date.AddDays(AddDate);
                if (date < lastDate)
                {
                    date = lastDate;
                }
            }
            List <RoomSystem.Models.SessionModel> sessions = new List <RoomSystem.Models.SessionModel>();

            if (roomId != null)
            {
                using (Models.RoomSystemEntities db = new Models.RoomSystemEntities())
                {
                    Models.ReservationCenters center = (from s in db.ReservationCenters select s).First();
                    // Models.Rooms room = rooms.Where(x => x.Id == roomId).First();
                    if (center != null)
                    {
                        bool       isWeekend           = date.DayOfWeek == DayOfWeek.Sunday || date.DayOfWeek == DayOfWeek.Saturday;
                        TimeSpan   openTime            = isWeekend ? center.WeekendOpenTime : center.WeekdaysOpenTime;
                        TimeSpan   closeTime           = isWeekend ? center.WeekendCloseTime : center.WeekdaysCloseTime;
                        TimeSpan   interval            = new TimeSpan(0, center.TimePerTimePeriod, 0);
                        List <int> borrowedSessionList = (from s in db.Reservations where s.RoomId == roomId && s.Date == date && !s.Disable select s.SessionNo).ToList();
                        int        i = 0;
                        for (TimeSpan startTime = openTime, endTime = startTime.Add(interval); startTime < closeTime; startTime = endTime, endTime = startTime.Add(interval))
                        {
                            sessions.Add(new RoomSystem.Models.SessionModel(startTime, endTime <= closeTime ? endTime : closeTime, borrowedSessionList.Contains(i), i));
                            i++;
                        }
                    }
                }
            }
            reserveModel.Date          = date;
            reserveModel.Rooms         = rooms;
            reserveModel.WantToReserve = new bool[sessions.Count].ToList();
            reserveModel.Session       = sessions;
            reserveModel.RoomId        = roomId;
            return(View(reserveModel));
        }
        public ActionResult Reserve(RoomSystem.Models.ReserveModel reserveModel)
        {
            string        date     = string.Format("{0:yyyy-MM-dd}", reserveModel.Date);
            List <string> borrower = new List <string>();

            if (reserveModel.BorrowList != null && reserveModel.BorrowList != "")
            {
                borrower = reserveModel.BorrowList.Split(';').Distinct().ToList();
                foreach (var email in borrower)
                {
                    if (!IsValidEmail(email))
                    {
                        return(Reserve(reserveModel.RoomId, date));
                    }
                }
            }

            string ASPNetUserID = User.Identity.GetUserId();

            using (Models.RoomSystemEntities db = new Models.RoomSystemEntities())
            {
                //var loginInfo = await Net.AuthenticationManager.GetExternalLoginInfoAsync();
                //loginInfo.Email
                if (reserveModel.RoomId == null)
                {
                    return(Reserve(reserveModel.RoomId.Value, string.Format("{0:yyyy-MM-dd}", reserveModel.Date)));
                }

                Models.Rooms room = (from s in db.Rooms where reserveModel.RoomId.Value == s.Id select s).FirstOrDefault();
                if (room.Id != reserveModel.RoomId.Value || !(borrower.Count + 1 >= room.MinNumberOfUsers && borrower.Count < room.MaxNumberOfUsers))
                {
                    return(Reserve(reserveModel.RoomId, date));
                }
                int i            = 0;
                var Reservations = (from s in db.Reservations where s.RoomId == reserveModel.RoomId && s.Date == reserveModel.Date && !s.Disable select s.SessionNo).ToList();
                foreach (var wantToReserve in reserveModel.WantToReserve)
                {
                    if (wantToReserve && !Reservations.Contains(i))
                    {
                        Models.Reservations reservation = new Models.Reservations();
                        reservation.BorrowerList = "";
                        reservation.Disable      = false;
                        reservation.AspNetUserId = ASPNetUserID;
                        reservation.RoomId       = reserveModel.RoomId.Value;
                        reservation.SessionNo    = i;
                        reservation.Date         = reserveModel.Date;
                        reservation.BorrowerList = string.Join(";", borrower);
                        db.Reservations.Add(reservation);
                    }
                    i++;
                }
                db.SaveChanges();

                System.Models.AspNetUsers user = (from s in db.AspNetUsers where s.Id == ASPNetUserID select s).First();

                string subject = "已向軟工作業會議預約系統預約會議室";
                string body    = string.Format("{0}:\n您已預約 r {1} 會議室,於 {2:yyyy-MM-dd},但這是軟工作業,所以沒有會議室可以用喔", user.UserName, room.Id, reserveModel.Date);
                SendEmail(user.Email, user.UserName, subject, body);
            }
            return(Reserve(reserveModel.RoomId.Value, string.Format("{0:yyyy-MM-dd}", reserveModel.Date)));
        }