Exemplo n.º 1
0
        private async Task <List <ShiftJob> > GetOpenShiftsForUser(int userId, string locations)
        {
            HelpMyStreet.Contracts.RequestService.Request.LocationsRequest lr = new HelpMyStreet.Contracts.RequestService.Request.LocationsRequest()
            {
                Locations = new List <Location>()
            };

            locations.Split(",").ToList()
            .ForEach(x =>
            {
                lr.Locations.Add((Location)Enum.Parse(typeof(Location), x));
            });

            var userGroups = await _connectGroupService.GetUserGroups(userId);

            List <int> groups = new List <int>();

            if (userGroups != null)
            {
                groups = userGroups.Groups;
            }

            GetOpenShiftJobsByFilterRequest getOpenShiftJobsByFilterRequest = new GetOpenShiftJobsByFilterRequest()
            {
                Locations         = lr,
                SupportActivities = new SupportActivityRequest {
                    SupportActivities = new List <SupportActivities>()
                },
                Groups = new GroupRequest {
                    Groups = groups
                },
            };

            var allShifts = await _connectRequestService.GetOpenShiftJobsByFilter(getOpenShiftJobsByFilterRequest);

            if (allShifts == null)
            {
                throw new Exception($"No shifts returned from user id {userId}");
            }

            var dedupedShifts = allShifts.Distinct(_shiftJobDedupe_EqualityComparer);
            var userShifts    = await GetShiftsForUser(userId);

            var notMyShifts = dedupedShifts.Where(s => !userShifts.Contains(s, _shiftJobDedupe_EqualityComparer)).ToList();

            return(notMyShifts);
        }
        public async Task <EmailBuildData> PrepareTemplateData(Guid batchId, int?recipientUserId, int?jobId, int?groupId, int?requestId, Dictionary <string, string> additionalParameters, string templateName)
        {
            if (recipientUserId == null)
            {
                throw new BadRequestException("recipientUserId is null");
            }

            var user = _connectUserService.GetUserByIdAsync(recipientUserId.Value).Result;

            if (user == null)
            {
                throw new BadRequestException($"unable to retrieve user object for {recipientUserId.Value}");
            }

            var groups = _connectGroupService.GetUserGroups(recipientUserId.Value).Result;

            if (groups == null || groups.Groups == null || groups.Groups.Count == 0)
            {
                return(null);
            }

            Dictionary <SupportActivities, double?> nationalSupportActivities = new Dictionary <SupportActivities, double?>()
            {
                { SupportActivities.FaceMask, null },
                { SupportActivities.HomeworkSupport, null },
                { SupportActivities.PhoneCalls_Anxious, null },
                { SupportActivities.PhoneCalls_Friendly, null },
                { SupportActivities.VaccineSupport, _emailConfig.Value.OpenRequestRadius }
            };
            Dictionary <SupportActivities, double?> activitySpecificSupportDistancesInMiles = nationalSupportActivities.Where(a => user.SupportActivities.Contains(a.Key)).ToDictionary(a => a.Key, a => a.Value);

            GetAllJobsByFilterResponse openRequests;

            openRequests = await _connectRequestService.GetAllJobsByFilter(new GetAllJobsByFilterRequest()
            {
                JobStatuses = new JobStatusRequest()
                {
                    JobStatuses = new List <JobStatuses>()
                    {
                        JobStatuses.Open
                    }
                },
                Postcode        = user.PostalCode,
                DistanceInMiles = _emailConfig.Value.OpenRequestRadius,
                ExcludeSiblingsOfJobsAllocatedToUserID = recipientUserId,
                Groups = new GroupRequest()
                {
                    Groups = groups.Groups
                },
                ActivitySpecificSupportDistancesInMiles = activitySpecificSupportDistancesInMiles
            });


            var openTasks  = openRequests.JobSummaries.ToList();
            var openShifts = openRequests.ShiftJobs.Where(x => user.SupportActivities.Contains(x.SupportActivity)).ToList();

            if ((openTasks == null || openTasks.Count == 0) && (openShifts == null || openShifts.Count == 0))
            {
                return(null);
            }

            var chosenRequestTaskList = new List <DailyDigestDataJob>();
            var otherRequestTaskList  = new List <DailyDigestDataJob>();
            var shiftItemList         = new List <ShiftItem>();
            List <JobSummary> criteriaRequestTasks = new List <JobSummary>();
            List <JobSummary> otherRequestTasks    = new List <JobSummary>();


            if (openTasks.Count() > 0)
            {
                criteriaRequestTasks = openTasks
                                       .Where(x => user.SupportActivities.Contains(x.SupportActivity) && x.DistanceInMiles <= user.SupportRadiusMiles)
                                       .Distinct(_jobSummaryDedupe_EqualityComparer)
                                       .ToList();

                criteriaRequestTasks = criteriaRequestTasks.OrderBy(x => x.DueDate).ToList();

                otherRequestTasks = openTasks.Where(x => !criteriaRequestTasks.Contains(x, _jobSummaryDedupe_EqualityComparer)).ToList();
                var otherRequestTasksStats = otherRequestTasks.GroupBy(x => x.SupportActivity, x => x.DueDate, (activity, dueDate) => new { Key = activity, Count = dueDate.Count(), Min = dueDate.Min() });
                otherRequestTasksStats = otherRequestTasksStats.OrderByDescending(x => x.Count);

                foreach (var request in criteriaRequestTasks)
                {
                    string encodedRequestId = HelpMyStreet.Utils.Utils.Base64Utils.Base64Encode(request.RequestID.ToString());

                    chosenRequestTaskList.Add(new DailyDigestDataJob(
                                                  activity: request.SupportActivity.FriendlyNameShort(),
                                                  postCode: request.PostCode,
                                                  dueDate: request.DueDate.FormatDate(DateTimeFormat.ShortDateFormat),
                                                  soon: request.DueDate < DateTime.Now.AddDays(1),
                                                  urgent: request.IsHealthCritical,
                                                  isSingleItem: true, //not used in the chosen task component of the email
                                                  count: 1,           //not used in the chosen task component of the email
                                                  encodedRequestId: encodedRequestId,
                                                  distanceInMiles: Math.Round(request.DistanceInMiles, 1).ToString()
                                                  ));
                }

                foreach (var request in otherRequestTasksStats)
                {
                    otherRequestTaskList.Add(new DailyDigestDataJob(
                                                 activity: request.Key.FriendlyNameShort(),
                                                 postCode: string.Empty, //not used in the other task component of the email
                                                 dueDate: request.Min.FormatDate(DateTimeFormat.ShortDateFormat),
                                                 soon: false,            //not used in the other task component of the email
                                                 urgent: false,          //not used in the other task component of the email
                                                 isSingleItem: request.Count == 1 ? true : false,
                                                 count: request.Count,
                                                 encodedRequestId: "", //not used in the other task component of the email
                                                 distanceInMiles: ""   //not used in the other task component of the email
                                                 ));
                }
            }

            if (openShifts?.Count > 0)
            {
                var requests = openShifts
                               .Distinct(_shiftJobDedupe_EqualityComparer)
                               .ToList();

                foreach (var shift in requests)
                {
                    var location = await _connectAddressService.GetLocationDetails(shift.Location, CancellationToken.None);

                    string shiftDate = shift.StartDate.FormatDate(DateTimeFormat.LongDateTimeFormat) + " - " + shift.EndDate.FormatDate(DateTimeFormat.TimeFormat);
                    shiftItemList.Add(new ShiftItem($"<strong>{ shift.SupportActivity.FriendlyNameShort() }</strong> " +
                                                    $"at {location.Name} " +
                                                    $"( {Math.Round(shift.DistanceInMiles, 2)} miles away) " +
                                                    $"- {shiftDate}"));
                }
            }

            if (chosenRequestTaskList.Count > 0 || shiftItemList.Count > 0)
            {
                return(new EmailBuildData()
                {
                    BaseDynamicData = new DailyDigestData(
                        title: string.Empty,
                        firstName: user.UserPersonalDetails.FirstName,
                        chosenRequestTasks: criteriaRequestTasks.Count(),
                        otherRequestTasks: otherRequestTasks.Count() > 0,
                        shiftsAvailable: shiftItemList.Count > 0,
                        shiftCount: shiftItemList.Count,
                        chosenRequestTaskList: chosenRequestTaskList,
                        otherRequestTaskList: otherRequestTaskList,
                        shiftItemList: shiftItemList
                        ),
                    EmailToAddress = user.UserPersonalDetails.EmailAddress,
                    EmailToName = user.UserPersonalDetails.DisplayName,
                    ReferencedJobs = GetReferencedJobs(criteriaRequestTasks, otherRequestTasks, openShifts),
                });
            }
            else
            {
                return(null);
            }
        }