internal static IDictionary <DayOfWeek, Dictionary <DateTime, bool> > GetFinalOpening(IList <WorkerUser> workerUsers, SubTask subTask) { IDictionary <DayOfWeek, Dictionary <DateTime, bool> > finalOpening = new Dictionary <DayOfWeek, Dictionary <DateTime, bool> >(); Dictionary <DayOfWeek, OpeningDay> Openings = new Dictionary <DayOfWeek, OpeningDay>(); for (int i = 1; i < 8; i++) { Openings.Add(DateTime.Today.AddDays(i).DayOfWeek, GetOpeningByDayOfWeek(DateTime.Today.AddDays(i).DayOfWeek, subTask.CompanyUser.Opening)); } int dayCounter = 0; foreach (var o in Openings) { dayCounter++; Dictionary <DateTime, bool> isFreeAtTime = new Dictionary <DateTime, bool>(); for (DateTime i = o.Value.Start; i < o.Value.End; i = i.AddMinutes(subTask.EstimtedTime)) { DateTime realDateTime = DateTime.Today; realDateTime = realDateTime.AddDays(dayCounter); realDateTime = realDateTime.AddHours(i.Hour); realDateTime = realDateTime.AddMinutes(i.Minute); bool isWorkerForTheJob = true; if (WorkerHandler.GetWorkerForTheJob(workerUsers, realDateTime, realDateTime.AddMinutes(subTask.EstimtedTime)) == null) { isWorkerForTheJob = false; } isFreeAtTime.Add(realDateTime, isWorkerForTheJob); } finalOpening.Add(o.Key, isFreeAtTime); } return(finalOpening); }
public static async Task <Work> MakeAppointmentAsync(DateTime appointment, int carId, SubTask subTask, string description) { subTask = await ApplicationEntityManager.GetSubTaskByIdAsync(subTask.Id); IList <WorkerUser> workerUsers = await ApplicationEntityManager.GetWorkerUsersByCompanyIdAsync(subTask.CompanyUserId); workerUsers.Shuffle(); WorkerUser workerForTheJob = WorkerHandler.GetWorkerForTheJob(workerUsers, appointment, appointment.AddMinutes(subTask.EstimtedTime)); int?openServiceId = await ServiceExistsAsync(carId); Car car = await ApplicationEntityManager.GetCarByIdAsync(carId); Service service; if (!openServiceId.HasValue) { service = new Service { StartingTime = appointment, EndTime = appointment.AddMinutes(subTask.EstimtedTime), TotalPrice = subTask.EstimatedPrice, CarId = carId }; await ApplicationEntityManager.SaveServiceAsync(service); } else { service = await ApplicationEntityManager.GetServcieByIdAsync(openServiceId.Value); if (service.Works.ElementAt(0).SubTask.CompanyUserId == subTask.CompanyUserId) { service.TotalPrice = 0; foreach (var w in service.Works) { service.TotalPrice += w.Price; } service.TotalPrice += subTask.EstimatedPrice; if (appointment < service.StartingTime) { service.StartingTime = appointment; } if (appointment.AddMinutes(subTask.EstimtedTime) > service.EndTime) { service.EndTime = appointment.AddMinutes(subTask.EstimtedTime); } ApplicationEntityManager.ModifyService(service); } else { service = new Service { StartingTime = appointment, EndTime = appointment.AddMinutes(subTask.EstimtedTime), TotalPrice = subTask.EstimatedPrice, CarId = carId }; await ApplicationEntityManager.SaveServiceAsync(service); } } Work work = new Work { StartingTime = appointment, EndTime = appointment.AddMinutes(subTask.EstimtedTime), Price = subTask.EstimatedPrice, SubTaskId = subTask.Id, ServiceId = service.Id, StateId = 2, WorkerUserId = workerForTheJob.Id }; await ApplicationEntityManager.SaveWorkAsync(work); Message message = new Message { SenderId = car.ClientUserId, Text = description, WorkId = work.Id, Time = DateTime.Now }; await ApplicationEntityManager.SaveMessageAsync(message); return(work); }