public When_ProviderFeedBackService_Is_Called_To_Send_Employer_Feedback_Emails_To_Primary_Contact_Only(
            ProviderFeedbackFixture testFixture)
        {
            _testFixture = testFixture;

            _dateTimeProvider = Substitute.For <IDateTimeProvider>();
            _dateTimeProvider
            .UtcNow()
            .Returns(new DateTime(2019, 12, 13));
            _dateTimeProvider
            .GetNthWorkingDayDate(Arg.Any <DateTime>(), Arg.Any <int>(), Arg.Any <IList <DateTime> >())
            .Returns(new DateTime(2019, 12, 13));

            _emailService = Substitute.For <IEmailService>();

            _opportunityRepository = Substitute.For <IOpportunityRepository>();

            _opportunityRepository
            .GetReferralsForProviderFeedbackAsync(Arg.Any <DateTime>())
            .Returns(new ValidProviderFeedbackDtoListBuilder()
                     .Build());

            var providerFeedbackService = new ProviderFeedbackService(
                _testFixture.Configuration,
                _testFixture.Logger,
                _emailService,
                _testFixture.BankHolidayRepository,
                _opportunityRepository,
                _dateTimeProvider);

            _result = providerFeedbackService.SendProviderFeedbackEmailsAsync("TestUser").GetAwaiter().GetResult();
        }
コード例 #2
0
        public When_ProviderFeedbackService_Is_Called_To_Send_Provider_Feedback_Emails_When_ProviderFeedbackEmailsEnabled_Is_False(
            ProviderFeedbackFixture testFixture)
        {
            _dateTimeProvider = Substitute.For <IDateTimeProvider>();

            _emailService = Substitute.For <IEmailService>();

            _bankHolidayRepository = Substitute.For <IRepository <BankHoliday> >();
            _opportunityRepository = Substitute.For <IOpportunityRepository>();
            _opportunityRepository.GetReferralsForProviderFeedbackAsync(Arg.Any <DateTime>())
            .Returns(new ValidProviderFeedbackDtoListBuilder().Build());

            testFixture.Configuration.ProviderFeedbackEmailsEnabled = false;

            var providerFeedbackService = new ProviderFeedbackService(
                testFixture.Configuration,
                testFixture.Logger,
                _emailService,
                _bankHolidayRepository,
                _opportunityRepository,
                _dateTimeProvider);

            _result = providerFeedbackService
                      .SendProviderFeedbackEmailsAsync("TestUser")
                      .GetAwaiter().GetResult();
        }
        public When_ProviderFeedBackService_Is_Called_To_Send_Employer_Feedback_Emails_With_Single_Provider(
            ProviderFeedbackFixture testFixture)
        {
            _testFixture = testFixture;

            _dateTimeProvider = Substitute.For <IDateTimeProvider>();
            _dateTimeProvider
            .UtcNow()
            .Returns(new DateTime(2019, 12, 13));
            _dateTimeProvider
            .GetNthWorkingDayDate(Arg.Any <DateTime>(), Arg.Any <int>(), Arg.Any <IList <DateTime> >())
            .Returns(new DateTime(2019, 12, 13));

            _emailService = Substitute.For <IEmailService>();

            _emailService
            .When(x => x.SendEmailAsync(Arg.Any <string>(),
                                        Arg.Any <string>(),
                                        Arg.Any <int?>(),
                                        Arg.Any <int?>(), Arg.Any <IDictionary <string, string> >(), Arg.Any <string>()))
            .Do(x =>
            {
                var address = x.ArgAt <string>(1);
                var tokens  = x.Arg <Dictionary <string, string> >();
                if (tokens.TryGetValue("other_email_details", out var contact))
                {
                    _otherEmails[address] = contact;
                }
            });

            _opportunityRepository = Substitute.For <IOpportunityRepository>();

            _opportunityRepository
            .GetReferralsForProviderFeedbackAsync(Arg.Any <DateTime>())
            .Returns(new ValidProviderFeedbackDtoListBuilder()
                     .AddSecondaryContact()
                     .Build());

            var providerFeedbackService = new ProviderFeedbackService(
                _testFixture.Configuration,
                _testFixture.Logger,
                _emailService,
                _testFixture.BankHolidayRepository,
                _opportunityRepository,
                _dateTimeProvider);

            _result = providerFeedbackService.SendProviderFeedbackEmailsAsync("TestUser").GetAwaiter().GetResult();
        }
コード例 #4
0
        public async Task <int> SendProviderFeedbackEmailsAsync(string userName)
        {
            try
            {
                var numberOfEmailsSent = 0;

                if (!_configuration.ProviderFeedbackEmailsEnabled ||
                    !IsNthWorkingDay(_configuration.ProviderFeedbackWorkingDayInMonth))
                {
                    _logger.LogInformation(
                        "Provider feedback service exited because emails not enabled or today is not a valid day for processing.");
                    return(numberOfEmailsSent);
                }

                var previousMonthDate = _dateTimeProvider.UtcNow().AddMonths(-1);
                var previousMonth     = previousMonthDate.ToString("MMMM");
                var referrals         = await _opportunityRepository.GetReferralsForProviderFeedbackAsync(previousMonthDate);

                var referralsGroupedByProvider = referrals
                                                 .GroupBy(r => r.ProviderId)
                                                 .ToDictionary(r => r.Key, r => r.ToList());

                foreach (var(_, value) in referralsGroupedByProvider)
                {
                    var provider = value.First();

                    var tokens = CreateTokens(value, previousMonth);

                    var secondaryContactEmailDetails = new StringBuilder();

                    if (ShouldSendSecondaryEmail(provider))
                    {
                        secondaryContactEmailDetails.Append("We also sent this email to ");
                        secondaryContactEmailDetails.Append($"{provider.SecondaryContact} ");
                        secondaryContactEmailDetails.Append(
                            $"who we have as {provider.ProviderDisplayName}’s secondary contact for industry placements. ");
                        secondaryContactEmailDetails.AppendLine("Please coordinate your response with them.");
                    }

                    tokens["other_email_details"] = secondaryContactEmailDetails.ToString();

                    numberOfEmailsSent += await SendEmailsAsync(provider.PrimaryContactEmail, tokens, userName);

                    if (ShouldSendSecondaryEmail(provider))
                    {
                        var primaryContactEmailDetails = new StringBuilder();
                        primaryContactEmailDetails.Append("We also sent this email to ");
                        primaryContactEmailDetails.Append($"{provider.PrimaryContact} ");
                        primaryContactEmailDetails.Append(
                            $"who we have as {provider.ProviderDisplayName}’s primary contact for industry placements. ");
                        primaryContactEmailDetails.AppendLine("Please coordinate your response with them.");

                        tokens["contact_name"]        = provider.SecondaryContact?.Trim();
                        tokens["other_email_details"] = primaryContactEmailDetails.ToString();

                        numberOfEmailsSent += await SendEmailsAsync(provider.SecondaryContactEmail, tokens, userName);
                    }
                }

                return(numberOfEmailsSent);
            }
            catch (Exception ex)
            {
                var errorMessage = $"Error sending provider feedback emails. {ex.Message} ";

                _logger.LogError(ex, errorMessage);
                throw;
            }
        }