Beispiel #1
0
 public RegistrationsViewModel ToRegistrationsViewModel(
     IEnumerable <RegistrationViewModel> registrations,
     ReportFilterForm filterForm)
 {
     return(new RegistrationsViewModel
     {
         DayRegistrations = ToDayRegistrations(registrations),
         FilterForm = filterForm
     });
 }
        public IActionResult StackedBar(ReportFilterForm form)
        {
            if (!RoleIs(Role.Administrator, Role.Manager))
            {
                return(Forbid());
            }

            var registrations =
                _registrationService
                .AllInclude(x => x.Employee, x => x.Entrance.Building)
                .ForEmployee(form.EmployeeId)
                .ForPeriod(form.DateFrom, form.DateTo)
                .WithStrictScheduleRestriction(form.StrictSchedule)
                .WithLateness(_timeService, form.Lateness);

            return(StackedBar(registrations, form));
        }
        public IActionResult List(ReportFilterForm form, string pdf, string excel)
        {
            if (!RoleIs(Role.Administrator, Role.Manager))
            {
                return(Forbid());
            }

            var registrations =
                _registrationService
                .AllInclude(x => x.Employee, x => x.Entrance.Building)
                .ForEmployee(form.EmployeeId)
                .ForPeriod(form.DateFrom, form.DateTo)
                .WithStrictScheduleRestriction(form.StrictSchedule)
                .WithLateness(_timeService, form.Lateness)
                .ToList();

            var viewModel = GetViewModel(registrations, form);

            if (string.IsNullOrWhiteSpace(pdf) &&
                string.IsNullOrWhiteSpace(excel))
            {
                return(View(viewModel));
            }

            viewModel.IsDocument = true;

            if (pdf != null)
            {
                var htmlContent = _htmlLayoutGenerator.RenderAsync($"Registration/{nameof(List)}", viewModel)
                                  .GetAwaiter().GetResult();

                var file = _pdfGenerator.GenerateAsync(htmlContent).GetAwaiter().GetResult();

                return(File(file, "application/json",
                            $"Отчет_{_timeService.Now.ToShortDateString()}_{_timeService.Now.ToShortTimeString()}.pdf"));
            }
            else
            {
                var file = _excelGenerator.GenerateAsync(viewModel).GetAwaiter().GetResult();

                return(File(file, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
                            $"Отчет_{_timeService.Now.ToShortDateString()}_{_timeService.Now.ToShortTimeString()}.xlsx"));
            }
        }
        private ViewResult StackedBar(IEnumerable <Registration> registrations, ReportFilterForm form)
        {
            IEnumerable <RegistrationViewModel> registrationViewModels =
                _mapper.Map <IEnumerable <RegistrationViewModel> >(registrations);

            string selectedLateness =
                form.Lateness.HasValue ? Enum.GetName(typeof(Lateness), form.Lateness) : string.Empty;
            string selectedScheduleRestriction = form.StrictSchedule.HasValue
                ? Enum.GetName(typeof(StrictSchedureRequirement), form.StrictSchedule)
                : string.Empty;

            form.Registrations                 = registrationViewModels;
            form.Employees                     = _employeeService.All().ToSelectList();
            form.LatenessSelectListItems       = typeof(Lateness).ToSelectList(selectedLateness);
            form.StrictScheduleSelecrListItems =
                typeof(StrictSchedureRequirement).ToSelectList(selectedScheduleRestriction);

            RegistrationsViewModel registraionsViewModel =
                _registrationsViewModelService.ToRegistrationsViewModel(registrationViewModels, form);

            List <StackedBarDayViewModel> barViewModels =
                registraionsViewModel
                .DayRegistrations
                .Select(dayRegistrations =>
            {
                IOrderedEnumerable <DayEmployeeRegistraionsViewModel> orderedDayEmployeeRegistrations =
                    dayRegistrations.DayEmployeeRegistraions.OrderBy(x => x.EmployeeId);


                return(new StackedBarDayViewModel
                {
                    Day = dayRegistrations.Day.DayOfYear.ToString(),
                    Names =
                        JsonConvert.SerializeObject(orderedDayEmployeeRegistrations.Select(x => x.Employee)),
                    WorkTimes = JsonConvert.SerializeObject(orderedDayEmployeeRegistrations.Select(x =>
                    {
                        int totalMinutes = (int)x.TotalWorkDayTimeInterval.TotalMinutes;

                        if (dayRegistrations.Day.Date.Equals(_timeService.Now.Date))
                        {
                            RegistrationRowViewModel last = x.RegistrationRows.OrderBy(y => y.Time).Last();

                            if (last.Event.Equals(RegistrationEventType.Coming))
                            {
                                totalMinutes += (int)(_timeService.TimeNow - last.Time).TotalMinutes;
                            }
                        }

                        return totalMinutes.ToString();
                    })),
                    LatenessTimes = JsonConvert.SerializeObject(orderedDayEmployeeRegistrations.Select(x =>
                    {
                        int totalMinutes = (int)x.LatenessTimeInterval.TotalMinutes;

                        if (dayRegistrations.Day.Date.Equals(_timeService.Now.Date))
                        {
                            RegistrationRowViewModel last = x.RegistrationRows.OrderBy(y => y.Time).Last();

                            if (last.Event.Equals(RegistrationEventType.Coming))
                            {
                                if (totalMinutes < 1 && last.Time >= _timeService.WorkDayStartsAt)
                                {
                                    totalMinutes = (int)(last.Time - _timeService.WorkDayStartsAt)
                                                   .TotalMinutes;
                                }
                            }
                        }
                        else if (x.RegistrationRows.All(z =>
                                                        z.CheckResult == RegistrationCheckResult.Violation))
                        {
                            totalMinutes = (int)_timeService.TotalWorkDayTimeSpan.TotalMinutes;
                        }

                        return totalMinutes.ToString();
                    }))
                });
            })
                .ToList();

            StackedBarViewModel viewModel = new StackedBarViewModel
            {
                StackedBarDayViewModels = barViewModels,
                FilterForm       = form,
                DayRegistrations = registraionsViewModel.DayRegistrations
            };

            return(View(viewModel));
        }
        private RegistrationsViewModel GetViewModel(IEnumerable <Registration> registrations, ReportFilterForm form)
        {
            var registrationViewModels = _mapper.Map <IEnumerable <RegistrationViewModel> >(registrations);

            var selectedLateness = form.Lateness.HasValue
                ? Enum.GetName(typeof(Lateness), form.Lateness)
                : string.Empty;
            var selectedScheduleRestriction = form.StrictSchedule.HasValue
                ? Enum.GetName(typeof(StrictSchedureRequirement), form.StrictSchedule)
                : string.Empty;

            form.Registrations                 = registrationViewModels;
            form.Employees                     = _employeeService.All().ToSelectList();
            form.LatenessSelectListItems       = typeof(Lateness).ToSelectList(selectedLateness);
            form.StrictScheduleSelecrListItems = typeof(StrictSchedureRequirement).ToSelectList(selectedScheduleRestriction);

            var registrationsViewModel = _registrationsViewModelService.ToRegistrationsViewModel(registrationViewModels, form);

            return(registrationsViewModel);
        }