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);
        }