public async Task CanRetrieveInsertedRecurringWorkItem()
        {
            var recurringWorkItem = new RecurringWorkItem()
            {
                PatrolId          = 1,
                CreatedAt         = DateTime.Now,
                CreatedByUserId   = 1,
                Name              = "Name",
                Location          = "Location",
                CompletionMode    = CompletionMode.Any,
                DescriptionMarkup = "Markup",
                AdminGroupId      = 1
            };

            await _workItemRepository.InsertRecurringWorkItem(recurringWorkItem);


            var inserted = await _workItemRepository.GetRecurringWorkItem(recurringWorkItem.Id);

            Assert.AreEqual(recurringWorkItem.PatrolId, inserted.PatrolId);
            Assert.AreEqual(recurringWorkItem.CreatedByUserId, inserted.CreatedByUserId);
            Assert.AreEqual(recurringWorkItem.Name, inserted.Name);
            Assert.AreEqual(recurringWorkItem.Location, inserted.Location);
            Assert.AreEqual(recurringWorkItem.CompletionMode, inserted.CompletionMode);
            Assert.AreEqual(recurringWorkItem.DescriptionMarkup, inserted.DescriptionMarkup);
            Assert.AreEqual(recurringWorkItem.AdminGroupId, inserted.AdminGroupId);
        }
        public async Task CanRetrieveInsertedShiftRecurringWorkItem()
        {
            var recurringWorkItem = new RecurringWorkItem()
            {
                PatrolId          = 1,
                CreatedAt         = DateTime.Now,
                CreatedByUserId   = 1,
                Name              = "Name",
                Location          = "Location",
                CompletionMode    = CompletionMode.Any,
                DescriptionMarkup = "Markup",
                AdminGroupId      = 1
            };

            await _workItemRepository.InsertRecurringWorkItem(recurringWorkItem);

            var shiftRecurringWorkItem = new ShiftRecurringWorkItem()
            {
                RecurringWorkItemId = recurringWorkItem.Id,
                ShiftId             = 1,
                ScheduledAtHour     = 9,
                ScheduledAtMinute   = 0
            };

            await _workItemRepository.InsertShiftRecurringWorkItem(shiftRecurringWorkItem);

            var inserted = await _workItemRepository.GetShiftRecurringWorkItem(shiftRecurringWorkItem.Id);

            Assert.AreEqual(shiftRecurringWorkItem.RecurringWorkItemId, inserted.RecurringWorkItemId);
            Assert.AreEqual(shiftRecurringWorkItem.ShiftId, inserted.ShiftId);
            Assert.AreEqual(shiftRecurringWorkItem.ScheduledAtHour, inserted.ScheduledAtHour);
            Assert.AreEqual(shiftRecurringWorkItem.ScheduledAtMinute, inserted.ScheduledAtMinute);
        }
        public async Task CanInsertRecurringWorkItem()
        {
            var recurringWorkItem = new RecurringWorkItem()
            {
                PatrolId          = 1,
                CreatedAt         = DateTime.Now,
                CreatedByUserId   = 1,
                Name              = "Name",
                Location          = "Location",
                CompletionMode    = CompletionMode.Any,
                DescriptionMarkup = "Markup",
                AdminGroupId      = 1
            };

            await _workItemRepository.InsertRecurringWorkItem(recurringWorkItem);

            Assert.NotZero(recurringWorkItem.Id);
        }
        public async Task CanCreateWorkItemsFromRecurringWorkItem()
        {
            var dto    = new RecurringWorkItem();
            int userId = 1;

            dto.CompletionMode    = CompletionMode.AnyAssigned;
            dto.DescriptionMarkup = "Description";
            dto.Location          = "Location";
            dto.Name               = "Name";
            dto.PatrolId           = 1;
            dto.RecurStart         = new DateTime(2001, 1, 1, 9, 0, 0);
            dto.RecurEnd           = new DateTime(2001, 1, 4, 9, 0, 0);
            dto.RecurInterval      = RecurInterval.Day;
            dto.RecurIntervalCount = 1;

            var now = new DateTimeOffset(2001, 1, 1, 0, 0, 0, new TimeSpan());

            _systemClockMock.Setup(x => x.UtcNow).Returns(now);

            _workItemRepository.Setup(x => x.GetWorkItems(It.IsAny <int>(), now.UtcDateTime))
            .Returns(Task.FromResult(new List <WorkItem>()
            {
            }.AsEnumerable()))
            .Verifiable();

            _workItemRepository.Setup(x => x.InsertWorkItem(It.Is <WorkItem>(y => y.ScheduledAt.Day == 1)))
            .Verifiable();
            _workItemRepository.Setup(x => x.InsertWorkItem(It.Is <WorkItem>(y => y.ScheduledAt.Day == 2)))
            .Verifiable();
            _workItemRepository.Setup(x => x.InsertWorkItem(It.Is <WorkItem>(y => y.ScheduledAt.Day == 3)))
            .Verifiable();
            _workItemRepository.Setup(x => x.InsertWorkItem(It.Is <WorkItem>(y => y.ScheduledAt.Day == 4)))
            .Verifiable();

            await _workItemService.PopulateTimedWorkItemOccurences(dto, userId, new List <int>() { userId }, now.UtcDateTime, false);

            _workItemRepository.Verify();
        }
Example #5
0
        public async Task PopulateTimedWorkItemOccurences(RecurringWorkItem workItem, int userId, List <int> assigneeUserIds, DateTime now, bool populateWorkItemAssignments = true)
        {
            var existingWorkItems = (await _workItemRepository.GetWorkItems(workItem.Id, now)).ToList();

            var calculatedWorkItems = new List <WorkItem>();

            for (var scheduledAt = workItem.RecurStart.Value; scheduledAt <= workItem.RecurEnd.Value; scheduledAt = AddInterval(scheduledAt, workItem.RecurInterval.Value, workItem.RecurIntervalCount.Value))
            {
                if (scheduledAt >= now)
                {
                    calculatedWorkItems.Add(new WorkItem()
                    {
                        AdminGroupId      = workItem.AdminGroupId,
                        CompletionMode    = workItem.CompletionMode,
                        CreatedAt         = now,
                        CreatedByUserId   = userId,
                        DescriptionMarkup = workItem.DescriptionMarkup,
                        Location          = workItem.Location,
                        Name                = workItem.Name,
                        PatrolId            = workItem.PatrolId,
                        RecurringWorkItemId = workItem.Id,
                        ScheduledAt         = scheduledAt,
                    });
                }
            }


            var allAssignments = await _workItemRepository.GetWorkItemAssignments(workItem.Id, now);

            var missing  = calculatedWorkItems.Where(x => !existingWorkItems.Any(y => y.ScheduledAt == x.ScheduledAt)).ToList();
            var toRemove = existingWorkItems.Where(x => x.ScheduledAt > now && !calculatedWorkItems.Any(y => y.ScheduledAt == x.ScheduledAt));
            var toUpdate = existingWorkItems.Where(x => x.ScheduledAt > now && calculatedWorkItems.Any(y => y.ScheduledAt == x.ScheduledAt));

            foreach (var wi in missing)
            {
                await _workItemRepository.InsertWorkItem(wi);

                if (populateWorkItemAssignments && assigneeUserIds != null)
                {
                    foreach (var uid in assigneeUserIds)
                    {
                        var assignment = new WorkItemAssignment()
                        {
                            WorkItemId = wi.Id,
                            UserId     = uid
                        };
                        await _workItemRepository.InsertWorkItemAssignment(assignment);
                    }
                }
            }

            foreach (var wi in toRemove)
            {
                var toRemoveAssignments = allAssignments.Where(x => x.WorkItemId == wi.Id).ToList();
                foreach (var wis in toRemoveAssignments)
                {
                    await _workItemRepository.DeleteWorkItemAssignment(wis);
                }
                await _workItemRepository.DeleteWorkItem(wi);
            }

            foreach (var wi in toUpdate)
            {
                wi.AdminGroupId      = workItem.AdminGroupId;
                wi.CompletionMode    = workItem.CompletionMode;
                wi.DescriptionMarkup = workItem.DescriptionMarkup;
                wi.Location          = workItem.Location;
                wi.Name = workItem.Name;
                await _workItemRepository.UpdateWorkItem(wi);

                if (populateWorkItemAssignments)
                {
                    var assignees = allAssignments.Where(x => x.WorkItemId == wi.Id).ToList();

                    if (assigneeUserIds != null)
                    {
                        await assignees.DifferenceWith(assigneeUserIds,
                                                       (a, id) => a.UserId == id,
                                                       id => _workItemRepository.InsertWorkItemAssignment(new WorkItemAssignment()
                        {
                            WorkItemId = wi.Id,
                            UserId     = id
                        }), wia => _workItemRepository.DeleteWorkItemAssignment(wia));
                    }
                }
            }
        }
Example #6
0
        public async Task SaveRecurringWorkItem(RecurringWorkItemDto recurringWorkItem, int userId, bool populateWorkItems = true, bool populateWorkItemAssignments = true, DateTime?overrideNow = null)
        {
            var now    = overrideNow ?? _clock.UtcNow.UtcDateTime;
            var patrol = await _patrolRepository.GetPatrol(recurringWorkItem.PatrolId);

            //save the recurring work item
            RecurringWorkItem             item   = null;
            List <ShiftRecurringWorkItem> shifts = new List <ShiftRecurringWorkItem>();

            if (recurringWorkItem.Id != default(int))
            {
                item = await _workItemRepository.GetRecurringWorkItem(recurringWorkItem.Id);

                shifts = (await _workItemRepository.GetShiftRecurringWorkItems(recurringWorkItem.Id)).ToList();
            }
            else
            {
                item                 = new RecurringWorkItem();
                item.PatrolId        = recurringWorkItem.PatrolId;
                item.CreatedAt       = now;
                item.CreatedByUserId = userId;
            }

            item.AdminGroupId      = recurringWorkItem.AdminGroupId;
            item.CompletionMode    = recurringWorkItem.CompletionMode;
            item.DescriptionMarkup = SanitizeHtml(recurringWorkItem.DescriptionMarkup);
            item.Location          = recurringWorkItem.Location;
            item.Name = recurringWorkItem.Name;

            if (recurringWorkItem.Shifts != null && recurringWorkItem.Shifts.Any())
            {
                item.MaximumRandomCount = recurringWorkItem.MaximumRandomCount;
                item.RecurEnd           = null;
                item.RecurIntervalCount = null;
                item.RecurInterval      = null;
                item.RecurStart         = null;
            }
            else
            {
                item.MaximumRandomCount = null;
                item.RecurEnd           = recurringWorkItem.RecurEnd;
                item.RecurInterval      = recurringWorkItem.RecurInterval;
                item.RecurIntervalCount = recurringWorkItem.RecurIntervalCount;
                item.RecurStart         = recurringWorkItem.RecurStart;
            }

            if (item.Id == default(int))
            {
                await _workItemRepository.InsertRecurringWorkItem(item);

                recurringWorkItem.Id = item.Id;
            }
            else
            {
                await _workItemRepository.UpdateRecurringWorkItem(item);
            }

            if (recurringWorkItem.Shifts != null && recurringWorkItem.Shifts.Any())
            {
                await shifts.DifferenceWith(recurringWorkItem.Shifts,
                                            (wi, dto) => wi.Id == dto.Id,
                                            dto => _workItemRepository.InsertShiftRecurringWorkItem(new ShiftRecurringWorkItem()
                {
                    RecurringWorkItemId = item.Id, ScheduledAtHour = dto.ScheduledAtHour, ScheduledAtMinute = dto.ScheduledAtMinute, ShiftId = dto.ShiftId, ShiftAssignmentMode = dto.ShiftAssignmentMode
                }),
                                            wi => _workItemRepository.DeleteShiftRecurringWorkItem(wi),
                                            (wi, dto) =>
                {
                    wi.ScheduledAtHour     = dto.ScheduledAtHour;
                    wi.ScheduledAtMinute   = dto.ScheduledAtMinute;
                    wi.ShiftId             = dto.ShiftId;
                    wi.ShiftAssignmentMode = dto.ShiftAssignmentMode;
                    return(_workItemRepository.UpdateShiftRecurringWorkItem(wi));
                }
                                            );
            }
            else
            {
                foreach (var shift in shifts)
                {
                    await _workItemRepository.DeleteShiftRecurringWorkItem(shift);
                }
            }

            if (populateWorkItems)
            {
                //save shift recurring work items
                if (recurringWorkItem.Shifts != null && recurringWorkItem.Shifts.Any())
                {
                    await this.PopulateShiftWorkItemOccurences(recurringWorkItem, now, userId, patrol, populateWorkItemAssignments);
                }
                else if (recurringWorkItem.RecurStart.HasValue &&
                         recurringWorkItem.RecurEnd.HasValue &&
                         recurringWorkItem.RecurInterval.HasValue &&
                         recurringWorkItem.RecurIntervalCount.HasValue)
                {
                    await this.PopulateTimedWorkItemOccurences(recurringWorkItem, userId, recurringWorkItem.NextOccurenceUsers != null?recurringWorkItem.NextOccurenceUsers.Select(x => x.Id).ToList() : null, now, populateWorkItemAssignments);
                }
                else
                {
                    throw new InvalidOperationException("Invalid recurrence specification");
                }
            }
        }
Example #7
0
 public Task UpdateRecurringWorkItem(RecurringWorkItem item)
 {
     return(_connection.UpdateAsync(item));
 }
Example #8
0
        public async Task InsertRecurringWorkItem(RecurringWorkItem item)
        {
            int id = (int)await _connection.InsertAsync(item);

            item.Id = id;
        }
Example #9
0
 public Task DeleteRecurringWorkItem(RecurringWorkItem item)
 {
     return(_connection.DeleteAsync(item));
 }