public void ChangeFixture_Test(string cultureName, DateTime?origPlannedStart, long?origVenue) { var m = new ChangeFixtureModel { Username = "******", Fixture = new TournamentManager.DAL.TypedViewClasses.PlannedMatchRow { Id = 9876, ChangeSerial = 2, RoundDescription = "Round descr.", HomeTeamNameForRound = "Home Team Name", GuestTeamNameForRound = "Guest Team Name", PlannedStart = new DateTime(2021, 03, 01, 19, 00, 00), OrigPlannedStart = origPlannedStart, OrigVenueId = origVenue, VenueName = "Venue", OrigVenueName = "Orig-Venue" } }; string text = string.Empty, html = string.Empty; Assert.Multiple(() => { Assert.DoesNotThrowAsync(async() => { text = await _renderer.RenderAsync(TemplateName.ChangeFixtureTxt, m, cultureName); Console.WriteLine($"*** {TemplateName.ChangeFixtureTxt} ***"); Console.WriteLine(text); }); Assert.That(text.Contains(L("Season fixture date", cultureName))); if (origPlannedStart.HasValue) { Assert.That(text.Contains(L("Replacement fixture date", cultureName))); } else { Assert.IsFalse(text.Contains(L("Replacement fixture date", cultureName))); } Assert.That(text.Contains(L("Season fixture venue", cultureName))); if (origVenue.HasValue) { Assert.That(text.Contains(L("Replacement venue", cultureName))); } else { Assert.IsFalse(text.Contains(L("Replacement venue", cultureName))); } }); }
public async IAsyncEnumerable <MailMergeMessage> GetMailMergeMessages(ITenantContext tenantContext, ITemplateRenderer renderer, IMailMergeService mailMergeService, IStringLocalizer <EmailResource> localizer, [EnumeratorCancellation] CancellationToken cancellationToken) { var model = new ChangeFixtureModel { Fixture = (await tenantContext.DbContext.AppDb.MatchRepository.GetPlannedMatchesAsync( new PredicateExpression(PlannedMatchFields.Id == Parameters.MatchId), cancellationToken)) .FirstOrDefault() }; if (model.Fixture is null) { throw new Exception($"No fixture found for match id '{Parameters.MatchId}'"); } ; var teamUserRoundInfos = await tenantContext.DbContext.AppDb.TeamRepository.GetTeamUserRoundInfosAsync( new PredicateExpression((TeamUserRoundFields.TeamId == model.Fixture.HomeTeamId | TeamUserRoundFields.TeamId == model.Fixture.GuestTeamId) .And(TeamUserRoundFields.TournamentId == tenantContext.TournamentContext.MatchPlanTournamentId)), cancellationToken); model.Username = teamUserRoundInfos.First(tur => tur.UserId == Parameters.ChangedByUserId).CompleteName; var plainTextContent = await renderer.RenderAsync(Templates.Email.TemplateName.ChangeFixtureTxt, model, Parameters.CultureInfo.TwoLetterISOLanguageName); var recipientGroups = new[] { teamUserRoundInfos.Where(tur => tur.TeamId == model.Fixture.HomeTeamId), // home team users teamUserRoundInfos.Where(tur => tur.TeamId == model.Fixture.GuestTeamId) // guest team users }; // each recipient group will get the same email text foreach (var recipients in recipientGroups) { var mailMergeMessage = mailMergeService.CreateStandardMessage(); mailMergeMessage.EnableFormatter = false; mailMergeMessage.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.From, tenantContext.SiteContext.Email.GeneralFrom.DisplayName, tenantContext.SiteContext.Email.GeneralFrom.Address)); foreach (var tur in recipients) { if (string.IsNullOrWhiteSpace(mailMergeMessage.Subject)) { using (new CultureSwitcher(Parameters.CultureInfo, Parameters.CultureInfo)) { mailMergeMessage.Subject = localizer["Fixture change for team '{0}'", tur.TeamNameForRound].Value; } } mailMergeMessage.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.To, $"{tur.CompleteName}", tur.Email)); if (!string.IsNullOrEmpty(tur.Email2)) { mailMergeMessage.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.CC, $"{tur.CompleteName}", tur.Email2)); } } // Send registration info also to league administration mailMergeMessage.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.Bcc, tenantContext.SiteContext.Email.GeneralBcc.DisplayName, tenantContext.SiteContext.Email.GeneralBcc.Address)); mailMergeMessage.PlainText = plainTextContent; yield return(mailMergeMessage); } }