public static void Book(Message message, ITelegramBotClient bot, Participant participant) { var chatId = message.Chat.Id; var messageId = message.MessageId; var selectedDay = participant.SelectedDate; //парсинг времени и запись брони в бд если всё ок. string[] splitted = message.Text.Split(" "); DateTime startTime; DateTime endTime; try { if (splitted[0].Length == 4) { splitted[0] = "0" + splitted[0]; } if (splitted[1].Length == 4) { splitted[1] = "0" + splitted[1]; } startTime = DateTime.ParseExact(splitted[0], "HH:mm", CultureInfo.InvariantCulture); endTime = DateTime.ParseExact(splitted[1], "HH:mm", CultureInfo.InvariantCulture); } catch (Exception ex) { Message mes = bot.SendTextMessageAsync(message.Chat.Id, "Введите время начала и завершения в формате \"HH:MM HH:MM\". Например 12:20 14:20", replyToMessageId: message.MessageId).Result; AdminBot.adminLog("Exception " + ex.Message); return; } DateTime startDateTime = new DateTime(selectedDay.Year, selectedDay.Month, selectedDay.Day, startTime.Hour, startTime.Minute, 0); DateTime endDateTime = new DateTime(selectedDay.Year, selectedDay.Month, selectedDay.Day, endTime.Hour, endTime.Minute, 0); //на случай случайного ввода в неверном порядке if (startDateTime > endDateTime) { DateTime temp = startDateTime; startDateTime = endDateTime; endDateTime = temp; } if (startDateTime.Hour < 7) { Message mes = bot.SendTextMessageAsync(message.Chat.Id, "Время начала раньше 7 утра. (Время работы спорткомплекса: с 7:00 до 23:00)", replyToMessageId: message.MessageId).Result; AdminBot.adminLog("Время начала раньше 7 утра."); return; } if (startDateTime.Hour >= 22 && startDateTime.Minute >= 30) { Message mes = bot.SendTextMessageAsync(message.Chat.Id, "Время начала позже 22:30. (Время работы спорткомплекса: с 7:00 до 23:00)", replyToMessageId: message.MessageId).Result; AdminBot.adminLog("Время начала позже 22:30."); return; } if (endDateTime.Hour < 7) { Message mes = bot.SendTextMessageAsync(message.Chat.Id, "Время завершения раньше 7 утра. (Время работы спорткомплекса: с 7:00 до 23:00)", replyToMessageId: message.MessageId).Result; AdminBot.adminLog("Время завершения раньше 7 утра."); return; } if (endDateTime.Hour >= 22 && endDateTime.Minute > 30) { Message mes = bot.SendTextMessageAsync(message.Chat.Id, "Время завершения позже 22:30. (Время работы спорткомплекса: с 7:00 до 23:00)\n\nПо просьбе руководства спорткомплекса музкомната освобождается за пол часа до закрытия ск.", replyToMessageId: message.MessageId).Result; AdminBot.adminLog("Время завершения позже 22:30."); return; } //Нужно получить доступное время для бронирования double freetime = BookCommand.maxHoursToBook(participant.Status); using (MobileContext db = new MobileContext()) { var bookings = db.Bookings.Where(c => (c.Participant == participant) && (c.TimeEnd.Year == selectedDay.Year) && (c.TimeEnd.Month == selectedDay.Month) && (c.TimeEnd.Day == selectedDay.Day)).ToList(); foreach (var booking in bookings) { freetime -= (booking.TimeEnd.Subtract(booking.TimeStart).TotalHours); } if (startDateTime.Subtract(endDateTime).TotalHours >= freetime) { _ = bot.SendTextMessageAsync(chatId, $"Недостаточно доступного времени для бронирования.\n\nВведите время начала и завершения брони. Например \"12:20 14:20\"", replyToMessageId: messageId).Result; AdminBot.adminLog("Недостаточно доступного времени для бронирования."); return; } //TODO выяснить почему если убрать запрос к таблице Participants, то в таблице Bookings все ссылки на Participants будут null var parts = db.Participants.ToList(); var allBookingsInDay = db.Bookings.Where(c => (c.TimeEnd.Year == startDateTime.Year) && (c.TimeEnd.Month == startDateTime.Month) && (c.TimeEnd.Day == startDateTime.Day)).ToList(); foreach (var booking in allBookingsInDay) { //В принципе, этот иф можно использовать внутри where при выборке броней if ((startDateTime >= booking.TimeStart && startDateTime < booking.TimeEnd) || (endDateTime > booking.TimeStart && endDateTime <= booking.TimeEnd) || (booking.TimeStart > startDateTime && booking.TimeStart < endDateTime)) { _ = bot.SendTextMessageAsync(message.Chat.Id, $"Выбранное время занято бронью @{booking.Participant.Alias}\n\nВведите время начала и завершения в формате \"HH:MM HH:MM\". Например 12:20 14:20", replyToMessageId: message.MessageId).Result; AdminBot.adminLog($"Выбранное время занято бронью @{booking.Participant.Alias}"); return; } } //Изза того что контекст бд закрывается, то ломается состояние participant. найти почему так либо не закрывать контекст participant = db.Participants.Single(c => c.Alias == message.From.Username); Booking newEntry = new Booking(participant, startDateTime, endDateTime); db.Bookings.Add(newEntry); db.SaveChanges(); using (FileStream fs = FormSchedule.FormScheduleImage(participant)) { Message mes = bot.SendPhotoAsync(chatId: chatId, photo: new InputOnlineFile(fs, "schedule.png"), caption: "Бронь установлена.", replyToMessageId: messageId).Result; } } }