public async Task <IActionResult> Reserve(ReserveDoctorsViewModel reserveDoctors) { if (!ModelState.IsValid) { return(View(reserveDoctors)); } if (!TimeSpan.TryParse(reserveDoctors.Reserve.ReserveTime, out var time)) { ModelState.AddModelError("Reserve.ReserveTime", "ساعت فرمت مناسبی ندارد"); return(View(reserveDoctors)); } var dates = reserveDoctors.Reserve.ReserveDate.Split('/'); var reserveDateTime = new DateTime( int.Parse(dates[0]), int.Parse(dates[1]), int.Parse(dates[2]), new PersianCalendar()); reserveDateTime = reserveDateTime.Date + time; if (DateTime.Now > reserveDateTime) { TempData["Error"] = "تاریخ وارد شده باید در آینده باشد."; return(View(reserveDoctors)); } var dayOfWeek = reserveDateTime.DayOfWeek switch { DayOfWeek.Sunday => "یکشنبه", DayOfWeek.Monday => "دوشنبه", DayOfWeek.Tuesday => "سه شنبه", DayOfWeek.Wednesday => "چهارشنبه", DayOfWeek.Thursday => "پنج شنبه", DayOfWeek.Saturday => "شنبه", _ => null }; if (string.IsNullOrEmpty(dayOfWeek)) { TempData["Error"] = "امکان رزرو در روز جمعه وجود ندارد"; return(View(reserveDoctors)); } var weekdays = await _db.WeekDays .Include(a => a.Doctor) .Where(a => (a.DayName.Equals(dayOfWeek)) && a.Doctor.Specialty.Equals(reserveDoctors.Reserve.DoctorSpecialty)) .ToListAsync(); var patient = await _db.Patients .FirstOrDefaultAsync(a => a.Username.Equals(User.Identity.Name)); foreach (var day in weekdays) { var hasAlreadyThatReserveWithChosenDoctorOnThatDay = await _db.Reservations .AnyAsync(a => a.ReserveDate.Day.Equals(reserveDateTime.Day) && a.Doctor.Id.Equals(day.Doctor.Id) && a.Patient.Id.Equals(patient.Id) && a.ReserveStatus.Equals("در انتظار ویزیت")); var hasReserveOnThatTime = await _db.Reservations .AnyAsync(a => a.Patient.Id.Equals(patient.Id) && a.ReserveDate.Equals(reserveDateTime) && a.ReserveStatus.Equals("در انتظار ویزیت")); var hasFourReserveWithThatDoctor = await _db.Reservations .CountAsync(a => a.DoctorId.Equals(day.Doctor.Id) && a.PatientId.Equals(patient.Id) && a.ReserveStatus.Equals("در انتظار ویزیت")) >= 4; var hasReachedReserveLimit = await _db.Reservations .CountAsync(a => a.PatientId.Equals(patient.Id) && a.ReserveStatus.Equals("در انتظار ویزیت")) >= 20; if (!(hasReserveOnThatTime || hasAlreadyThatReserveWithChosenDoctorOnThatDay || hasFourReserveWithThatDoctor || hasReachedReserveLimit)) { switch (time.Hours) { case 8 when day.EightTen.Equals("خالی"): reserveDoctors.Doctors.Add(day.Doctor); break; case 10 when day.TenTwelve.Equals("خالی"): reserveDoctors.Doctors.Add(day.Doctor); break; case 12 when day.TwelveFourteen.Equals("خالی"): reserveDoctors.Doctors.Add(day.Doctor); break; case 14 when day.FourteenSixteen.Equals("خالی"): reserveDoctors.Doctors.Add(day.Doctor); break; } } } ViewBag.ReserveTime = reserveDateTime; ViewBag.ReserveDate = reserveDoctors.Reserve.ReserveDate; return(View(reserveDoctors)); }
public IActionResult Reserve() { ReserveDoctorsViewModel vm = new ReserveDoctorsViewModel(); return(View(vm)); }