private Event AllotAppointment(EventToBook toBook, User diaryUser, DateTime dueDate, DateTime maxDueDate) { DateTime startOfDay = diaryUser.WorkingDays[dueDate.DayOfWeek].Start; DateTime endOfDay = diaryUser.WorkingDays[dueDate.DayOfWeek].Finish; DateTime startDate = dueDate.AddHours(startOfDay.Hour); startDate = startDate.AddMinutes(startOfDay.Minute); DateTime endDate = startDate + toBook.Length; _EventStore.FindFreePeriod(diaryUser.Name, ref startDate, ref endDate, toBook.Length); if (startDate > maxDueDate) { return(null); } if ((endDate.Date != startDate.Date) || (endDate.TimeOfDay > endOfDay.TimeOfDay)) { dueDate = startDate.Date.AddDays(1); DateTime?newDate = FindValidWorkingDay(diaryUser, dueDate, toBook.Length); if (newDate != null) { return(AllotAppointment(toBook, diaryUser, newDate.Value, maxDueDate)); } } return(new Event( Guid.NewGuid().ToString(), diaryUser.Name, toBook.DueDate, startDate, endDate, toBook.Text, toBook.Type)); }