Beispiel #1
0
        public void TestUserActivities()
        {
            PerformanceController ñontroller = ConfigureController();

            DateTime      startDate = new DateTime(2020, 1, 1);
            IActionResult result    = ñontroller.UserActivities(startDate, new DateTime(2020, 1, 3), 0, 10);

            Assert.IsTrue(result is OkObjectResult);

            OkObjectResult okResult = result as OkObjectResult;

            Assert.IsTrue(okResult.Value is UserActivitiesModel);

            UserActivitiesModel ea = okResult.Value as UserActivitiesModel;

            int days = (int)(DateTime.Now.Date - startDate).TotalDays;

            Assert.AreEqual(ea.userName, "User1");
            Assert.AreEqual(ea.currentDay, days);
            Assert.AreEqual(ea.editedDays, days + 1);
            Assert.AreEqual(ea.days.Length, 2);
            Assert.AreEqual(ea.days[0].day, startDate);
            Assert.AreEqual(ea.days[1].day, new DateTime(2020, 1, 2));
            Assert.AreEqual(ea.maxYear, DateTime.Now.Date.Year + 1);
            Assert.AreEqual(ea.minYear, 2020);
            Assert.AreEqual(ea.monthPerformance, 0);
            Assert.AreEqual(ea.monthWorkDays, 0);

            result = ñontroller.UserActivities(new DateTime(2020, 1, 3), startDate, 0, 10);
            Assert.IsInstanceOfType(result, typeof(BadRequestResult));
        }
        public static void UserDisconnect(string connectionId, string name, string role, int status)
        {
            var tempModel = new UserActivitiesModel(connectionId, name, role, status);

            //_userActivities.Add(tempModel);
            foreach (var user in _activeUsers)
            {
                if (user.ConnectionId == tempModel.ConnectionId)
                {
                    _activeUsers.Remove(user);
                    break;
                }
            }
        }
Beispiel #3
0
        public IActionResult UserActivities(DateTime from, DateTime to, int offset, int count)
        {
            if (to < from)
            {
                ModelState.AddModelError("", "Date to must be greater or equals than date from");
            }
            if (!ModelState.IsValid)
            {
                return(BadRequest());
            }

            AppUser user = _ctx.Users.Where(u => u.Login == HttpContext.User.Identity.Name.ToUpper()).SingleOrDefault();

            if (null == user)
            {
                user = new AppUser {
                    Id = Guid.Empty, Name = $"Not authorized application user ({HttpContext.User.Identity.Name})", Login = HttpContext.User.Identity.Name
                };
                //return BadRequest("User is not authorized");
            }

            Guid userId = user.Id;

            DateTime now = DateTime.Now.Date;

            if (from == default)
            {
                from = new DateTime(now.Year, now.Month, 1);
            }
            else
            {
                from = from.Date;
            }

            if (to == default)
            {
                to = now;
            }
            else
            {
                to = to.Date;
            }

            if (from.AddDays(offset) <= to)
            {
                from = from.AddDays(offset);
            }
            if (count != 0 && from.AddDays(count - 1) <= to)
            {
                to = from.AddDays(count - 1);
            }

            var displayDays = (to - from).Days;

            int currentDay = (now - from).Days; //-1; // (int)(now.DayOfWeek) - 1;

            DateTime startDate = from;          // now.AddDays(-currentDay); // now.AddDays(-6);
            DateTime endDate   = to;            // startDate.AddDays(_displayDays);

            DateTime firstDay = new DateTime(now.Year, now.Month, 1);

            var userMonthHours = _ctx.UserDateWorkHours
                                 .Where(wh => wh.UserId == userId && wh.Date >= firstDay && wh.Date < now)
                                 .Select(wh => new { wh.Date, wh.WorkHours })
                                 .ToDictionary(wh => wh.Date);
            //.Sum(wh => wh.WorkHours);

            decimal monthHours = 0;
            int     monthDays  = 0;

            DateTime day = firstDay;

            while (day < now)
            {
                if (userMonthHours.ContainsKey(day))
                {
                    decimal.TryParse(userMonthHours[day].WorkHours.Replace('.', ','), out var workHours);
                    monthHours += workHours;

                    if (workHours > 0)
                    {
                        ++monthDays;
                    }
                }

                day = day.AddDays(1);
            }

            decimal monthActivityMins = _ctx.UserActivityDates
                                        .Where(ead => ead.UserActivity.UserId == userId && ead.Date >= firstDay && ead.Date < now)
                                        .Sum(ead => ead.Count * ead.UserActivity.Activity.WorkCost.GetValueOrDefault());

            List <UserActivityDate> userActivityDates = _ctx.UserActivityDates
                                                        .Where(ead => ead.UserActivity.UserId == userId && ead.Date >= startDate && ead.Date <= endDate)
                                                        .Include(ead => ead.UserActivity.Activity)
                                                        .OrderBy(a => a.Date)
                                                        .ToList();

            DateTime lastDay = firstDay.AddMonths(1);
            Dictionary <long, decimal> userActivitiesMonth = _ctx.UserActivityDates
                                                             .Where(ead => ead.UserActivity.UserId == userId && ead.Date >= firstDay && ead.Date < lastDay)
                                                             .GroupBy(ead => new { ead.UserActivity.UserId, ead.UserActivity.ActivityId }, (e, eads) => new { e.ActivityId, sum = eads.Sum(a => a.Count) })
                                                             .ToDictionary(ea => ea.ActivityId, ea => Math.Round(ea.sum, 1));

            Dictionary <DateTime, UserDateWorkHours> employeeWorkHours = _ctx.UserDateWorkHours
                                                                         .Where(wh => wh.UserId == userId && wh.Date >= startDate && wh.Date <= endDate)
                                                                         .ToDictionary(a => a.Date);

            UserActivitiesModel model = new UserActivitiesModel
            {
                currentDay    = currentDay,
                monthWorkDays = monthDays,
                days          = new ActivityDayModel[displayDays]
            };

            if (monthHours > 0)
            {
                model.monthPerformance = Math.Round(monthActivityMins * 100 / Convert.ToDecimal(monthHours) / 60, 2);
            }

            model.maxYear = now.Year + 1;

            DateTime?minDate = _ctx.UserActivityDates.Where(ead => ead.UserId == userId).Min(ead => (DateTime?)ead.Date);

            model.minYear = minDate.HasValue ? minDate.Value.Year : default;

            if (model.minYear < model.maxYear - 3)
            {
                model.minYear = model.maxYear - 3;
            }

            Dictionary <DateTime, int> dayTypes = _ctx.CalendarDays
                                                  .Where(cd => cd.Date >= startDate && cd.Date <= endDate)
                                                  .ToDictionary(cd => cd.Date, cd => cd.Type);

            Dictionary <long, decimal[]> dea = new Dictionary <long, decimal[]>();

            using List <UserActivityDate> .Enumerator en = userActivityDates.GetEnumerator();
            en.MoveNext();

            for (int i = 0; i < displayDays; ++i)
            {
                DateTime activityDay = startDate.AddDays(i);

                int dayType = dayTypes.ContainsKey(activityDay) ? dayTypes[activityDay] : 0; // 0-Working day, 1- Holiday

                string workHours = "0";
                if (employeeWorkHours.ContainsKey(activityDay))
                {
                    workHours = employeeWorkHours[activityDay].WorkHours;
                }
                else
                {
                    if (dayType == 1)
                    {
                        workHours = "H";
                    }
                    else
                    {
                        workHours = "8.0";
                    }
                }

                model.days[i] = new ActivityDayModel
                {
                    day     = activityDay,
                    dayType = dayType,
                    hours   = workHours
                };

                while (null != en.Current && en.Current.Date.Date == activityDay)
                {
                    if (!dea.ContainsKey(en.Current.UserActivity.Activity.Id))
                    {
                        dea[en.Current.UserActivity.Activity.Id] = new decimal[displayDays];
                    }

                    dea[en.Current.UserActivity.Activity.Id][i] += Math.Round(en.Current.Count, 1);

                    en.MoveNext();
                }
            }

            long[] activityIds = userActivityDates
                                 .Select(ea => ea.UserActivity.Activity.ParentId ?? ea.ActivityId)
                                 .ToArray();

            List <UserActivity> userActivities = _ctx.UserActivities
                                                 .Where(ea => ea.UserId == userId)
                                                 .Include(ea => ea.Activity)
                                                 .OrderBy(ea => ea.Activity.Id)
                                                 .ToList();

            long[] userActivityIds = userActivities
                                     .Select(ea => ea.Activity.ParentId ?? ea.ActivityId)
                                     .ToArray();

            // Children contains only Tracked activities
            IEnumerable <Activity> userParentActivities;

            if (activityIds.Length > 0)
            {
                // Children contains only Tracked activities
                userParentActivities = _ctx.Activities
                                       .Where(a => !a.ParentId.HasValue && (activityIds.Contains(a.Id) || userActivityIds.Contains(a.Id)))
                                       .OrderByDescending(a => activityIds.Contains(a.Id))
                                       .ThenBy(a => a.Id)
                                       .AsEnumerable();
            }
            else
            {
                userParentActivities = _ctx.Activities
                                       .Where(a => !a.ParentId.HasValue && userActivityIds.Contains(a.Id))
                                       .AsEnumerable();
            }

            model.userActivities = new List <EmployeeActivityModel>();
            foreach (Activity a in userParentActivities)
            {
                model.userActivities.Add(new EmployeeActivityModel
                {
                    activity      = a,
                    counts        = dea.ContainsKey(a.Id) ? dea[a.Id] : new decimal[displayDays],
                    countPerMonth = userActivitiesMonth.ContainsKey(a.Id) ? userActivitiesMonth[a.Id] : 0
                });

                if (a.Children?.Count > 0)
                {
                    foreach (Activity ca in a.Children.OrderBy(x => x.Id))
                    {
                        ca.WorkCost = Math.Round(ca.WorkCost.GetValueOrDefault(), 1);
                        model.userActivities.Add(new EmployeeActivityModel
                        {
                            activity      = ca,
                            counts        = dea.ContainsKey(ca.Id) ? dea[ca.Id] : new decimal[displayDays],
                            countPerMonth = userActivitiesMonth.ContainsKey(ca.Id) ? userActivitiesMonth[ca.Id] : 0
                        });
                    }
                }
            }

            model.editedDays = GetEditedDays(model.currentDay, startDate);

            model.userName = user.Name;

            return(Ok(model));
        }