Esempio n. 1
0
        public IActionResult AddWorkDaySpan(long serviceId, long chosenDateInTicks, string returnUrl = "/")
        {
            var context   = _serviceProvider.GetRequiredService <AppointmentJournalContext>();
            var userId    = _userManager.GetUserId(User);
            var addresses = context.Addresses.Where(x => x.ProducerId == userId).Select(x => new SelectListItem {
                Value = x.Id.ToString(), Text = x.AddressValue
            }).ToList();

            var chosenDate = new DateTime(chosenDateInTicks);

            var model = new AddWorkDaySpanViewModel()
            {
                ChosenDate = chosenDate,
                ServiceId  = serviceId,
                Addresses  = addresses,
                ReturnUrl  = returnUrl
            };

            return(View(model));
        }
Esempio n. 2
0
        public IActionResult AddWorkDaySpan(AddWorkDaySpanViewModel model)
        {
            if (ModelState.IsValid)
            {
                if (model.BeginHour >= model.EndHour)
                {
                    ModelState.AddModelError("", "Время конца периода должно быть не меньше времени начала");
                    return(View(model));
                }

                var modelBeginTime = new DateTime(model.ChosenDate.Year, model.ChosenDate.Month, model.ChosenDate.Day, model.BeginHour, 0, 0);
                var modelEndTime   = new DateTime(model.ChosenDate.Year, model.ChosenDate.Month, model.ChosenDate.Day, model.EndHour, 0, 0);

                var context = _serviceProvider.GetRequiredService <AppointmentJournalContext>();

                var userId  = _userManager.GetUserId(User);
                var service = context.Services
                              .Include(x => x.WorkDaysTimeSpans)
                              .ThenInclude(x => x.WorkDay).SingleOrDefault(s => s.Id == model.ServiceId & s.ProducerId == userId);

                // периоды времени для заданного сервиса и выбранного дня
                var timeSpansForChosenDay = service.WorkDaysTimeSpans.Where(ts => ts.WorkDay.Date.Date == model.ChosenDate.Date.Date).ToList();

                WorkDay workDay = null;

                if (timeSpansForChosenDay.Count == 0)
                {
                    workDay = new WorkDay()
                    {
                        Date       = model.ChosenDate,
                        IsEnabled  = false,
                        ProducerId = userId
                    };
                }
                else
                {
                    workDay = timeSpansForChosenDay.GroupBy(x => x.WorkDay).SingleOrDefault()?.Key;

                    if (workDay == null)
                    {
                        throw new Exception("workDay = null");
                    }

                    // проверка периодов рабочего времени на перекрытие
                    var overlapFlag = timeSpansForChosenDay.Any(x =>
                                                                (x.BeginTime.Hour <= modelBeginTime.Hour & x.EndTime.Hour >= modelBeginTime.Hour) ||
                                                                (x.BeginTime.Hour <= modelEndTime.Hour & x.EndTime.Hour >= modelEndTime.Hour));

                    if (overlapFlag)
                    {
                        ModelState.AddModelError("", "Заданный период перекрывает существующие периоды");
                        return(View(model));
                    }
                }

                var address = context.Addresses.Include(x => x.WorkDaysTimeSpans).SingleOrDefault(x => x.ProducerId == userId & x.Id == model.AddressId);

                var workDayTimeSpan = new WorkDaysTimeSpan()
                {
                    BeginTime = modelBeginTime,
                    EndTime   = modelEndTime,
                    WorkDay   = workDay,
                    Address   = address
                };

                service.WorkDaysTimeSpans.Add(workDayTimeSpan);

                context.SaveChanges();
            }

            return(Redirect(model.ReturnUrl));
        }