public async Task <bool> RemoveAccessToPlant(long personId, string plantId)
        {
            var hasChanges = false;

            var personProjectHistory =
                PersonProjectHistoryHelper.CreatePersonProjectHistory(
                    _personCreatedByCache.Id,
                    _personCreatedByCache.Username);

            var projects = _personProjectRepository.VoidPersonProjects(plantId, personId).Select(pp => pp.Project !).ToList();

            projects.ForEach(p => PersonProjectHistoryHelper.LogVoidProjects(
                                 personId,
                                 personProjectHistory,
                                 p.ProjectId,
                                 _personCreatedByCache.Username));

            if (projects.Count > 0)
            {
                await _personProjectHistoryRepository.AddAsync(personProjectHistory);

                hasChanges = true;
            }
            else
            {
                _logger.LogInformation(
                    $"Access to all projects are already voided for person {personId} and plant {plantId}. No action taken.");
            }

            return(hasChanges);
        }
        private async Task UpdatePrivlegesAsync(long personId,
                                                string plantId,
                                                PersonProjectHistory personProjectHistory,
                                                List <Project> parentProjects,
                                                List <long> updatedProjectIds)
        {
            await _privilegeService.GivePrivilegesAsync(plantId, personId);

            updatedProjectIds.ForEach(projectId =>
            {
                PersonProjectHistoryHelper.LogAddAccess(
                    personId,
                    personProjectHistory,
                    projectId,
                    _personCreatedByCache.Username);

                var isMainProject = parentProjects.Single(p => p.ProjectId == projectId).IsMainProject;

                if (isMainProject)
                {
                    PersonProjectHistoryHelper.LogDefaultUserGroup(
                        personId,
                        personProjectHistory,
                        projectId,
                        _personCreatedByCache.Username);
                }
            });
        }
        public async Task <bool> GiveProjectAccessToPlantAsync(long personId, string plantId)
        {
            var hasChanges = false;

            var personProjectHistory =
                PersonProjectHistoryHelper.CreatePersonProjectHistory(
                    _personCreatedByCache.Id,
                    _personCreatedByCache.Username);

            var projects = await _projectRepository.GetParentProjectsByPlant(plantId);

            var(updatedProjectIds, unvoidedProjectIds) = await UpdatePersonProjectsAsync(personId, projects);

            if (updatedProjectIds.Any())
            {
                await UpdatePrivlegesAsync(personId, plantId, personProjectHistory, projects, updatedProjectIds);
            }

            if (unvoidedProjectIds.Any())
            {
                unvoidedProjectIds.ForEach(projectId =>
                                           PersonProjectHistoryHelper.LogUnvoidProjects(
                                               personId,
                                               personProjectHistory,
                                               projectId,
                                               _personCreatedByCache.Username));
            }

            if (updatedProjectIds.Any() || unvoidedProjectIds.Any())
            {
                await _personProjectHistoryRepository.AddAsync(personProjectHistory);

                hasChanges = true;
            }

            return(hasChanges);
        }