public async Task CancelShift(int scheduledShiftId) { var scheduledShift = await _shiftRepository.GetScheduledShift(scheduledShiftId); var scheduledShiftAssignments = await _shiftRepository.GetScheduledShiftAssignmentsForScheduledShift(scheduledShiftId); var patrol = await _patrolRepository.GetPatrol(scheduledShift.PatrolId); foreach (var ssa in scheduledShiftAssignments) { await _shiftRepository.DeleteScheduledShiftAssignment(ssa); //send notification to any trainees that the shift has been cancelled var trainees = await _shiftRepository.GetTrainees(ssa.Id); if (trainees.Any() && ssa.AssignedUserId.HasValue) { var trainer = await _userRepository.GetUser(ssa.AssignedUserId.Value); var shift = await _shiftRepository.GetScheduledShift(ssa.ScheduledShiftId); var traineeUsers = await _userRepository.GetUsers(trainees.Select(x => x.TraineeUserId).ToList()); await _emailService.SendTrainerShiftRemoved(trainer, traineeUsers.ToList(), patrol, shift); } } //remove any work items related to the shift await _shiftWorkItemService.RemoveWorkItemsFromShiftOccurence(scheduledShift); await _shiftRepository.DeleteScheduledShift(scheduledShift); //notify users in the shift var assignedUsers = await _userRepository.GetUsers(scheduledShiftAssignments.Where(x => x.AssignedUserId.HasValue).Select(x => x.AssignedUserId.Value).ToList()); await _emailService.SendShiftCancelled(assignedUsers.ToList(), patrol, scheduledShift); }