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(); }
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)); } } } }
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"); } } }
public Task UpdateRecurringWorkItem(RecurringWorkItem item) { return(_connection.UpdateAsync(item)); }
public async Task InsertRecurringWorkItem(RecurringWorkItem item) { int id = (int)await _connection.InsertAsync(item); item.Id = id; }
public Task DeleteRecurringWorkItem(RecurringWorkItem item) { return(_connection.DeleteAsync(item)); }