Esempio n. 1
0
        public async Task <IEnumerable <User> > GetHouseholdAsync(int householdHeadUserId,
                                                                  bool includePendingQuestionnaire, bool includeVendorCode, bool includeMail,
                                                                  bool includePrize = false)
        {
            var authId = GetClaimId(ClaimType.UserId);

            if (!HasPermission(Permission.ViewParticipantDetails) &&
                householdHeadUserId != authId)
            {
                var authUser = await _userRepository.GetByIdAsync(authId);

                if (authUser.HouseholdHeadUserId != householdHeadUserId)
                {
                    _logger.LogError($"User {authId} doesn't have permission to view details for {householdHeadUserId}.");
                    throw new GraException("Permission denied.");
                }
            }

            var household = await _userRepository.GetHouseholdAsync(householdHeadUserId);

            if (includeVendorCode || includeMail || includePrize || includePendingQuestionnaire)
            {
                if (includeMail && householdHeadUserId != authId &&
                    !HasPermission(Permission.ReadAllMail))
                {
                    _logger.LogError($"User {authId} doesn't have permission to view mail for {householdHeadUserId}.");
                    throw new GraException("Permission denied.");
                }

                if (includePrize && !HasPermission(Permission.ViewUserPrizes))
                {
                    _logger.LogError($"User {authId} doesn't have permission to view prizes for {householdHeadUserId}.");
                    throw new GraException("Permission denied.");
                }
                var siteId = GetCurrentSiteId();
                foreach (var member in household)
                {
                    if (includeMail)
                    {
                        member.HasNewMail = await _mailRepository.UserHasUnreadAsync(member.Id);
                    }
                    if (includePrize)
                    {
                        member.HasUnclaimedPrize = (await _prizeWinnerRepository
                                                    .CountByWinningUserId(GetCurrentSiteId(), member.Id, false)) > 0;
                    }
                    if (includeVendorCode)
                    {
                        member.VendorCode = await _vendorCodeRepository.GetUserVendorCode(member.Id);
                    }
                    if (includePendingQuestionnaire)
                    {
                        member.HasPendingQuestionnaire = (await _requireQuestionnaireRepository
                                                          .GetForUser(siteId, member.Id, member.Age)).Any();
                    }
                }
            }
            return(household);
        }
Esempio n. 2
0
        public async Task <VendorCode> GetUserVendorCodeAsync(int userId)
        {
            var authorized = false;
            var authId     = GetClaimId(ClaimType.UserId);

            if (userId == authId || userId == GetActiveUserId() || HasPermission(Permission.ViewParticipantDetails))
            {
                authorized = true;
            }

            if (!authorized)
            {
                var user = await _userRepository.GetByIdAsync(userId);

                authorized = user.HouseholdHeadUserId == authId;
            }

            if (authorized)
            {
                var vendorCode = await _vendorCodeRepository.GetUserVendorCode(userId);

                if (vendorCode != null)
                {
                    var codeType = await _vendorCodeTypeRepository
                                   .GetByIdAsync(vendorCode.VendorCodeTypeId);

                    vendorCode.CanBeDonated = !string.IsNullOrEmpty(codeType.DonationMessage);
                    if (!string.IsNullOrEmpty(codeType.Url))
                    {
                        vendorCode.Url = codeType.Url.Contains(TemplateToken.VendorCodeToken)
                            ? codeType.Url.Replace(TemplateToken.VendorCodeToken, vendorCode.Code)
                            : codeType.Url;
                    }
                    return(vendorCode);
                }
                else
                {
                    return(null);
                }
            }
            else
            {
                _logger.LogError($"User {authId} doesn't have permission to view details for {userId}.");
                throw new GraException("Permission denied.");
            }
        }
Esempio n. 3
0
        public async Task <string> GetUserVendorCodeAsync(int userId)
        {
            var authId = GetClaimId(ClaimType.UserId);

            if (userId == authId || HasPermission(Permission.ViewParticipantDetails))
            {
                return(await _vendorCodeRepository.GetUserVendorCode(userId));
            }
            else
            {
                _logger.LogError($"User {authId} doesn't have permission to view details for {userId}.");
                throw new GraException("Permission denied.");
            }
        }
Esempio n. 4
0
        public override async Task ExecuteAsync(ReportRequest request,
                                                CancellationToken token,
                                                IProgress <JobStatus> progress = null)
        {
            #region Reporting initialization
            request = await StartRequestAsync(request);

            var criterion
                = await _serviceFacade.ReportCriterionRepository.GetByIdAsync(request.ReportCriteriaId)
                  ?? throw new GraException($"Report criteria {request.ReportCriteriaId} for report request id {request.Id} could not be found.");

            if (criterion.SiteId == null)
            {
                throw new ArgumentException(nameof(criterion.SiteId));
            }

            var groupInfo = await _groupInfoRepository.GetByIdAsync(criterion.GroupInfoId.Value);

            string title = groupInfo.Name;

            var report = new StoredReport
            {
                Title = title,
                AsOf  = _serviceFacade.DateTimeProvider.Now
            };
            var reportData = new List <object[]>();
            #endregion Reporting initialization

            #region Collect data
            UpdateProgress(progress, 1, "Starting report...", request.Name);

            // header row
            report.HeaderRow = new object[] {
                "Name",
                "Age",
                "Vendor Code",
            };

            var head = await _userRepository.GetByIdAsync(groupInfo.UserId);

            var users = await _userRepository.GetHouseholdAsync(groupInfo.UserId);

            users = users.Prepend(head);

            foreach (var user in users)
            {
                if (token.IsCancellationRequested)
                {
                    break;
                }

                var vendorCode = await _vendorCodeRepository.GetUserVendorCode(user.Id);

                var row = new List <object> {
                    user.FullName,
                    user.Age,
                    vendorCode?.IsDonated == false ? vendorCode.Code : ""
                };

                reportData.Add(row.ToArray());
            }

            report.Data = reportData.ToArray();

            #endregion Collect data

            #region Finish up reporting
            if (!token.IsCancellationRequested)
            {
                ReportSet.Reports.Add(report);
            }
            await FinishRequestAsync(request, !token.IsCancellationRequested);

            #endregion Finish up reporting
        }
        public override async Task ExecuteAsync(ReportRequest request,
                                                CancellationToken token,
                                                IProgress <OperationStatus> progress = null)
        {
            #region Reporting initialization
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            request = await StartRequestAsync(request);

            var criterion
                = await _serviceFacade.ReportCriterionRepository.GetByIdAsync(request.ReportCriteriaId)
                  ?? throw new GraException($"Report criteria {request.ReportCriteriaId} for report request id {request.Id} could not be found.");

            if (criterion.SiteId == null)
            {
                throw new ArgumentNullException(nameof(criterion.SiteId));
            }

            var groupInfo = await _groupInfoRepository.GetByIdAsync(criterion.GroupInfoId.Value);

            string title = groupInfo.Name;

            var report = new StoredReport
            {
                Title = title,
                AsOf  = _serviceFacade.DateTimeProvider.Now
            };
            var reportData = new List <object[]>();
            #endregion Reporting initialization

            #region Collect data
            UpdateProgress(progress, 1, "Starting report...", request.Name);

            // header row
            report.HeaderRow = new object[] {
                "Name",
                "Vendor Code",
            };

            var head = await _userRepository.GetByIdAsync(groupInfo.UserId);

            var users = await _userRepository.GetHouseholdAsync(groupInfo.UserId);

            users = users.Prepend(head);

            foreach (var user in users)
            {
                if (token.IsCancellationRequested)
                {
                    break;
                }

                var vendorCode = await _vendorCodeRepository.GetUserVendorCode(user.Id);

                var row = new List <object> {
                    user.FullName,
                    vendorCode?.IsDonated == false ? vendorCode.Code : ""
                };

                reportData.Add(row.ToArray());
            }

            report.Data = reportData.ToArray();

            #endregion Collect data

            #region Finish up reporting
            _logger.LogInformation($"Report {GetType().Name} with criterion {criterion.Id} ran in {StopTimer()}");

            request.Success = !token.IsCancellationRequested;

            if (request.Success == true)
            {
                ReportSet.Reports.Add(report);
                request.Finished   = _serviceFacade.DateTimeProvider.Now;
                request.ResultJson = Newtonsoft.Json.JsonConvert.SerializeObject(ReportSet);
            }
            await _serviceFacade.ReportRequestRepository.UpdateSaveNoAuditAsync(request);

            #endregion Finish up reporting
        }