public JsonResult AddReservationPeriod(ReservationPeriod model) { if (model.PlaceId == Guid.Empty) { return(Json("预约活动室不能为空")); } if (model.PeriodTitle.IsNullOrWhiteSpace()) { return(Json("预约时间段不能为空")); } if (!_reservationPlaceHelper.Exist(p => p.PlaceId == model.PlaceId)) { return(Json("活动室不存在")); } using (var redLock = RedisManager.GetRedLockClient($"reservation_{model.PlaceId:N}_periods")) { if (redLock.TryLock()) { if (_reservationPeriodHelper.Any(builder => builder .IgnoreQueryFilters() .WithPredict(p => p.PeriodIndex == model.PeriodIndex && p.PlaceId == model.PlaceId && p.PeriodId != model.PeriodId) ) ) { return(Json("排序重复,请修改")); } model.PeriodId = Guid.NewGuid(); model.CreateBy = UserName; model.CreateTime = DateTime.UtcNow; model.UpdateBy = UserName; model.UpdateTime = DateTime.UtcNow; var result = _reservationPeriodHelper.Insert(model); if (result > 0) { OperLogHelper.AddOperLog($"创建预约时间段{model.PeriodId:N},{model.PeriodTitle}", OperLogModule.ReservationPlace, UserName); } return(Json(result > 0 ? "" : "创建预约时间段失败")); } else { return(Json("系统繁忙,请稍后重试")); } } }
public JsonResult UpdateReservationPeriod(ReservationPeriod model) { if (model.PeriodId == Guid.Empty) { return(Json("预约时间段不能为空")); } if (model.PlaceId == Guid.Empty) { return(Json("预约地点不能为空")); } if (model.PeriodTitle.IsNullOrWhiteSpace()) { return(Json("预约时间段标题不能为空")); } if (!_reservationPeriodHelper.Exist(_ => _.PeriodId == model.PeriodId)) { return(Json("预约时间段不存在")); } // 不修改排序 //if (_reservationPeriodHelper.Exist(p => p.PeriodIndex == model.PeriodIndex && p.PlaceId == model.PlaceId && p.PeriodId != model.PeriodId)) //{ // return Json("排序重复,请修改"); //} model.UpdateBy = Username; model.UpdateTime = DateTime.Now; var result = _reservationPeriodHelper.Update(model, new[] { "PeriodTitle", "PeriodDescription", "UpdateBy", "UpdateTime" }); if (result > 0) { OperLogHelper.AddOperLog($"更新预约时间段{model.PeriodId:N},{model.PeriodTitle}", OperLogModule.ReservationPlace, Username); } return(Json(result > 0 ? "" : "更新预约时间段信息失败")); }
public JsonResult AddReservationPeriod(ReservationPeriod model) { if (model.PlaceId == Guid.Empty) { return(Json("预约活动室不能为空")); } if (model.PeriodTitle.IsNullOrWhiteSpace()) { return(Json("预约时间段不能为空")); } if (!_reservationPlaceHelper.Exist(p => p.PlaceId == model.PlaceId)) { return(Json("活动室不存在")); } if (_reservationPeriodHelper.Exist(p => p.PeriodIndex == model.PeriodIndex && p.PlaceId == model.PlaceId && p.PeriodId != model.PeriodId)) { return(Json("排序重复,请修改")); } model.PeriodId = Guid.NewGuid(); model.CreateBy = Username; model.CreateTime = DateTime.Now; model.UpdateBy = Username; model.UpdateTime = DateTime.Now; var result = _reservationPeriodHelper.Insert(model); if (result > 0) { OperLogHelper.AddOperLog($"创建预约时间段{model.PeriodId:N},{model.PeriodTitle}", OperLogModule.ReservationPlace, Username); } return(Json(result > 0 ? "" : "创建预约时间段失败")); }
private IEnumerable <string> GetReservationStrings(string apartmentName, int year, int month) { var reservationStrings = new List <string>(); var probeDateFirstDay = new DateTime(year, month, 1, 0, 0, 0); var probeDateLastDay = new DateTime(year, month, DateTime.DaysInMonth(year, month), 23, 59, 59); var fullMonthSelected = false; var reservations = Umbraco.TypedContentAtRoot() .First(c => c.DocumentTypeAlias == "Rezerwacje") ?.Children.Where(c => c.DocumentTypeAlias == "Rezerwacja") ?.Where(c => c.GetPropertyValue <string>("apartament") == apartmentName) ?.Where(c => c.GetPropertyValue <string>("status") == "zaakceptowana") ?.Select( c => { var period = new ReservationPeriod { Arrival = c.GetPropertyValue <DateTime>("dataPrzyjazdu"), Departure = c.GetPropertyValue <DateTime>("dataWyjazdu") }; if (period.Arrival < probeDateFirstDay && period.Departure > probeDateLastDay) { fullMonthSelected = true; } return(period); }) ?.Where( d => (d.Arrival.Year == year && d.Arrival.Month == month) || (d.Departure.Year == year && d.Departure.Month == month)) ?.OrderBy(d => d.Arrival).ToList(); if (reservations == null) { return(reservationStrings); } if (fullMonthSelected) { var daysInMonth = DateTime.DaysInMonth(year, month); for (var i = 1; i <= daysInMonth; i++) { reservationStrings.Add($"\"{i}\": [0, 24]"); } } else { // Unite reservations which have overlapping days. var i = 0; while (i < reservations.Count - 1) { if (reservations[i].Departure.Date == reservations[i + 1].Arrival.Date) { reservations[i].Departure = reservations[i + 1].Departure; reservations.RemoveAt(i + 1); } else { i++; } } foreach (var reservation in reservations) { var firstDay = reservation.Arrival.Month == month ? reservation.Arrival.Day : 1; var lastDay = reservation.Departure.Month == month ? reservation.Departure.Day : DateTime.DaysInMonth(year, month); var isBorderedLeft = reservation.Arrival.Month != month; var isBorderedRight = reservation.Departure.Month != month; if (firstDay > lastDay) { continue; } if (firstDay == lastDay) { if (reservation.Arrival.Hour > reservation.Departure.Hour) { continue; } reservationStrings.Add($"\"{firstDay}\": [12, 12]"); } else { if (isBorderedLeft) { reservationStrings.Add($"\"{firstDay}\": [0, 24]"); } else { reservationStrings.Add($"\"{firstDay}\": [12, 24]"); } for (i = firstDay + 1; i < lastDay; i++) { reservationStrings.Add($"\"{i}\": [0, 24]"); } if (isBorderedRight) { reservationStrings.Add($"\"{lastDay}\": [0, 24]"); } else { reservationStrings.Add($"\"{lastDay}\": [0, 12]"); } } } } return(reservationStrings); }
public async Task <JsonResult> DeleteReservationPeriod() { string emailAddress = HttpContext.User.Identity.Name; var restaurant = await _context.Restaurant .Where(rest => rest.EmailAddress.Equals(emailAddress)) .FirstOrDefaultAsync(); string headerTableId = Request.Headers["tableId"]; int tId = int.Parse(headerTableId); string startTime = Request.Headers["startTime"]; string endTime = Request.Headers["endTime"]; string rpDate = Request.Headers["dateReservation"]; var table = await _context.Table .Where(t => t.Id == tId) .FirstOrDefaultAsync(); // check if reservation Period exists in database if (!ReservationPeriodExistsInRest(restaurant.Id, table.Id)) { // reservation Period not found HttpContext.Response.StatusCode = 400; return(new JsonResult("Reservation Period for table with id " + table.Id + " doesn't exist")); } ReservationPeriod reservationPeriodToDelete = null; var restaurantReservationPeriods = await _context.ReservationPeriod .Where(rp => rp.RestaurantId == restaurant.Id) .ToListAsync(); foreach (ReservationPeriod reservationPeriod in restaurantReservationPeriods) { long restId = reservationPeriod.RestaurantId; long tableId = reservationPeriod.TableId; string dbStartTime = reservationPeriod.StartTime.ToString("HH:mm"); string dbEndTime = reservationPeriod.EndTime.ToString("HH:mm"); string date = reservationPeriod.Date.ToString(); if (restaurant.Id == restId && table.Id == tableId && startTime.Equals(dbStartTime) && endTime.Equals(dbEndTime) && date.Equals(rpDate)) { // reservation period found! reservationPeriodToDelete = reservationPeriod; break; } } if (reservationPeriodToDelete == null) { // reservation Period data incorrect HttpContext.Response.StatusCode = 400; return(new JsonResult("Start or End Time not correct")); } _context.ReservationPeriod.Remove(reservationPeriodToDelete); await _context.SaveChangesAsync(); HttpContext.Response.StatusCode = 200; return(new JsonResult("Reservation Period successfully deleted")); }
public async Task <IActionResult> Create(long id, [FromForm] ReservationPeriod reservationPeriod) { // provjeri je li datum u prošlosti CultureInfo us = new CultureInfo("en-US"); string format = "yyyy-MM-dd"; DateTime dt1 = DateTime.ParseExact(reservationPeriod.Date, format, us); if (dt1 < DateTime.Now) { //date is in the past, return bad date request return(RedirectToAction(nameof(DateInPastRequest), new { id = id, date = reservationPeriod.Date })); } string pom; pom = reservationPeriod.Date; int year = int.Parse(pom.Substring(0, 4)); int month = int.Parse(pom.Substring(5, 2)); int day = int.Parse(pom.Substring(8, 2)); string str_day = day.ToString("D2"); string str_month = month.ToString("D2"); string str_year = year.ToString("D4"); // formatiraj datum dd/MM/yyyy reservationPeriod.Date = str_day + "/" + str_month + "/" + str_year; // provjeri je li start time veci od end time-a pom = reservationPeriod.StartTime.ToString("HH:mm"); int NewPeriodMinuteStart = int.Parse(pom.Substring(0, 2)) * 60 + int.Parse(pom.Substring(3, 2)); pom = reservationPeriod.EndTime.ToString("HH:mm"); int NewPeriodMinuteEnd = int.Parse(pom.Substring(0, 2)) * 60 + int.Parse(pom.Substring(3, 2)); string description = reservationPeriod.TableDescription; if (NewPeriodMinuteStart > NewPeriodMinuteEnd) { // odi na bad time request view i posalji potrebne parametre return(RedirectToAction(nameof(InvalidStartEndTimeRequest), new { id = id, startTime = reservationPeriod.StartTime, endTime = reservationPeriod.EndTime })); } // zahtjev ispravan, provjeri postoji li u bazi rezervacija za taj datum i vrijeme int counter = 0; var restaurant = await _context.Restaurant .FirstOrDefaultAsync(m => m.Id == id); List <Table> tables = _context.Table .Where(t => t.RestaurantId == id) .Where(t => t.Description.Equals(description)) .ToList(); int[] reservedTables = new int[tables.Count]; List <ReservationPeriod> reservationPeriods = _context.ReservationPeriod .Where(rp => rp.RestaurantId == id) .Where(rp => rp.TableDescription.Equals(reservationPeriod.TableDescription)) .Where(rp => rp.Date.Equals(reservationPeriod.Date)) .ToList(); foreach (ReservationPeriod period in reservationPeriods) { string reservationPeriodDate = reservationPeriod.Date; // get database reservation Period info string dbReservatinPeriodDate = period.Date; int dbYear = int.Parse(dbReservatinPeriodDate.Substring(6, 4)); int dbMonth = int.Parse(dbReservatinPeriodDate.Substring(3, 2)); int dbDay = int.Parse(dbReservatinPeriodDate.Substring(0, 2)); int rpYear = int.Parse(reservationPeriodDate.Substring(6, 4)); int rpMonth = int.Parse(reservationPeriodDate.Substring(3, 2)); int rpDay = int.Parse(reservationPeriodDate.Substring(0, 2)); bool sameDay = (dbYear == rpYear && dbMonth == rpMonth && dbDay == rpDay); //if (NewPeriodMinuteStart >= NewPeriodMinuteEnd) break; // datum su jednaki, usporedi vremena if (sameDay) { pom = period.StartTime.ToString("HH:mm"); int DbPeriodMinuteStart = int.Parse(pom.Substring(0, 2)) * 60 + int.Parse(pom.Substring(3, 2)); pom = period.EndTime.ToString("HH:mm"); int DbPeriodMinuteEnd = int.Parse(pom.Substring(0, 2)) * 60 + int.Parse(pom.Substring(3, 2)); if ((NewPeriodMinuteStart >= DbPeriodMinuteStart && NewPeriodMinuteStart <= DbPeriodMinuteEnd) || (NewPeriodMinuteEnd >= DbPeriodMinuteStart && NewPeriodMinuteEnd <= DbPeriodMinuteEnd) || (NewPeriodMinuteStart <= DbPeriodMinuteStart && NewPeriodMinuteEnd >= DbPeriodMinuteEnd) || (NewPeriodMinuteStart >= DbPeriodMinuteStart && NewPeriodMinuteEnd <= DbPeriodMinuteEnd)) { // preklapa se sa postojecim terminom reservedTables[counter++] = (int)period.TableId; continue; } else { // termin se ne preklapa za novu rezervaciju continue; } } // rezervacija u bazi nije na taj datum, nastavi } if (counter >= tables.Count) { // odi na bad request view i posalji potrebne paramtre return(RedirectToAction(nameof(BadTimeRequest), new { id = id, date = reservationPeriod.Date, startTime = reservationPeriod.StartTime, endTime = reservationPeriod.EndTime })); } foreach (Table table in tables) { if (reservedTables.Contains((int)table.Id)) { continue; } // found table that is free, reserve it reservationPeriod.TableId = table.Id; break; } /* * List<Table> tables = _context.Table * .Where(t => t.RestaurantId == id) * .Where(t => t.Description.Equals(description)) * .ToList(); * * List<long> tableIds = tables.Select(t => t.Id).ToList(); * * List<long> reservationPeriodTablesIds = _context.ReservationPeriod * .Where(rp => rp.RestaurantId == id) * .Where(rp => rp.TableDescription.Equals(reservationPeriod.TableDescription)) * .Select(rp => rp.TableId) * .Distinct() * .ToList();*/ /* // TODO : implement reservation logic * bool found = false; * foreach (var table in tables) { * if (reservationPeriodTablesIds.Contains(table.Id)) * { * // vec postoji rezervacija za stol sa id-om table.Id, provjeri jel se moze napraviti nova rez. * List<ReservationPeriod> reservationPeriods = _context.ReservationPeriod * .Where(rp => rp.RestaurantId == id) * .Where(rp => rp.TableId == table.Id) * .ToList(); * * foreach (ReservationPeriod period in reservationPeriods) * { * * string reservationPeriodDate = reservationPeriod.Date; * // get database reservation Period info * string dbReservatinPeriodDate = period.Date; * int dbYear = int.Parse(dbReservatinPeriodDate.Substring(6, 4)); * int dbMonth = int.Parse(dbReservatinPeriodDate.Substring(3, 2)); * int dbDay = int.Parse(dbReservatinPeriodDate.Substring(0, 2)); * * int rpYear = int.Parse(reservationPeriodDate.Substring(6, 4)); * int rpMonth = int.Parse(reservationPeriodDate.Substring(3, 2)); * int rpDay = int.Parse(reservationPeriodDate.Substring(0, 2)); * * bool sameDay = (dbYear == rpYear && dbMonth == rpMonth && dbDay == rpDay); * //if (NewPeriodMinuteStart >= NewPeriodMinuteEnd) break; * * // datum su jednaki, usporedi vremena * if (sameDay) * { * pom = period.StartTime.ToString("HH:mm"); * int DbPeriodMinuteStart= int.Parse(pom.Substring(0, 2)) * 60 + int.Parse(pom.Substring(3, 2)); * pom = period.EndTime.ToString("HH:mm"); * int DbPeriodMinuteEnd= int.Parse(pom.Substring(0, 2)) * 60 + int.Parse(pom.Substring(3, 2)); * * if ((NewPeriodMinuteStart >= DbPeriodMinuteStart && NewPeriodMinuteStart <= DbPeriodMinuteEnd) || * (NewPeriodMinuteEnd >= DbPeriodMinuteStart && NewPeriodMinuteEnd <= DbPeriodMinuteEnd) || * (NewPeriodMinuteStart <= DbPeriodMinuteStart && NewPeriodMinuteEnd >= DbPeriodMinuteEnd) || * (NewPeriodMinuteStart >= DbPeriodMinuteStart && NewPeriodMinuteEnd <= DbPeriodMinuteEnd)) * { * // preklapa se sa postojecim terminom * continue; * } else * { * // termin je slobodan za stol * found = true; * reservationPeriod.TableId = table.Id; * break; * } * } * * // rezervacija u bazi nije na taj datum, nastavi * * * } * // ako si rezervirao termin , izadi * if (found == true) * { * break; * } * } else * { * // uopce ne postoji rezervation period za ovaj stol, odmah rezerviraj stol * * pom = reservationPeriod.Date; * * int yearToSave = int.Parse(reservationPeriod.Date.Substring(6, 4)); * int monthToSave = int.Parse(reservationPeriod.Date.Substring(3, 2)); * int dayToSave = int.Parse(reservationPeriod.Date.Substring(0, 2)); * * string str_dayToSave = day.ToString("D2"); * string str_monthToSave = month.ToString("D2"); * string str_yearToSave = year.ToString("D4"); * * // formatiraj datum dd/MM/yyyy * * reservationPeriod.Date = str_day + "/" + str_month + "/" + str_year; * * reservationPeriod.TableId = table.Id; * found = true; * break; * } * }*/ reservationPeriod.RestaurantId = id; if (ModelState.IsValid) { _context.Add(reservationPeriod); await _context.SaveChangesAsync(); return(RedirectToAction(nameof(Index), new { id = id })); } return(View(reservationPeriod)); }