public void RemindMatchResult_Test(string cultureName) { var m = new RemindMatchResultModel { Fixture = new PlannedMatchRow { Id = 1000, PlannedStart = new DateTime(2021, 05, 05, 19, 00, 00), HomeTeamNameForRound = "HomeTeam", GuestTeamNameForRound = "GuestTeam" } }; string text = string.Empty, html = string.Empty; Assert.Multiple(() => { Assert.DoesNotThrowAsync(async() => { text = await _renderer.RenderAsync(TemplateName.RemindMatchResultTxt, m, cultureName); Console.WriteLine($"*** {TemplateName.RemindMatchResultTxt} ***"); Console.WriteLine(text); }); Assert.That(text.Contains(cultureName == "en" ? "Hello" : "Hallo")); Assert.That(text.Contains(m.Fixture.HomeTeamNameForRound)); }); }
public async IAsyncEnumerable <MailMergeMessage> GetMailMergeMessages(ITenantContext tenantContext, ITemplateRenderer renderer, IMailMergeService mailMergeService, IStringLocalizer <EmailResource> localizer, [EnumeratorCancellation] CancellationToken cancellationToken) { var fixtures = await tenantContext.DbContext.AppDb.MatchRepository.GetPlannedMatchesAsync( new PredicateExpression(PlannedMatchFields.PlannedStart .Between(Parameters.ReferenceDateUtc, Parameters.ReferenceDateUtc.AddDays(1).AddSeconds(-1)) .And(PlannedMatchFields.PlannedStart.IsNotNull() .And(PlannedMatchFields.PlannedEnd.IsNotNull().And(PlannedMatchFields.TournamentId == tenantContext.TournamentContext .MatchPlanTournamentId)))), cancellationToken); if (!fixtures.Any()) { yield break; } var teamIds = new HashSet <long>(); fixtures.ForEach(f => { teamIds.Add(f.HomeTeamId); teamIds.Add(f.GuestTeamId); }); var teamUserRoundInfos = await tenantContext.DbContext.AppDb.TeamRepository.GetTeamUserRoundInfosAsync( new PredicateExpression(TeamUserRoundFields.TeamId.In(teamIds).And(TeamUserRoundFields.TournamentId == tenantContext.TournamentContext.MatchPlanTournamentId)), cancellationToken); foreach (var fixture in fixtures) { var model = new RemindMatchResultModel { Fixture = fixture, }; var recipientGroups = new[] { teamUserRoundInfos.Where(tur => tur.TeamId == fixture.HomeTeamId || tur.TeamId == fixture.GuestTeamId && tur.IsManager), // all team managers }; var plainTextContent = await renderer.RenderAsync( Templates.Email.TemplateName.RemindMatchResultTxt, model, Parameters.CultureInfo.TwoLetterISOLanguageName); // 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["Missing result for match '{0}' vs. '{1}'", model.Fixture.HomeTeamNameForRound, model.Fixture.GuestTeamNameForRound].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); } } }