private async Task <GetEnrollmentDetails.Details> BuildDetails( EnrollmentAggregate enrollment, IReadOnlyCollection <IDomainEvent <EnrollmentAggregate, EnrollmentAggregate.EnrollmentId> > events, IReadOnlyCollection <Training> preferredTrainings, IReadOnlyCollection <TrainerDetails> trainers, Instant now, Campaign latestCampaign) { return(new GetEnrollmentDetails.Details() { ID = enrollment.Id.GetGuid(), SubmissionDateTime = enrollment.SubmissionDateTime.InMainTimezone(), FirstName = enrollment.FirstName, LastName = enrollment.LastName, FullName = enrollment.FullName, Email = enrollment.Email, PhoneNumber = enrollment.PhoneNumber, Region = enrollment.Region, PreferredLecturingCities = enrollment.PreferredLecturingCities, PreferredTrainings = preferredTrainings.Select(x => BuildTrainingSummary(x, trainers)).ToArray(), SelectedTraining = enrollment.SelectedTrainingID.HasValue ? BuildTrainingSummary(preferredTrainings.Single(x => x.ID == enrollment.SelectedTrainingID.Value), trainers) : null, Events = (await Task.WhenAll(events.Select(async x => await BuildEventData(enrollment, x, preferredTrainings, trainers)))).ToArray(), CanInviteToTraining = enrollment.CanAcceptTrainingInvitation(preferredTrainings, now).IsSuccess || enrollment.CanRefuseTrainingInvitation(preferredTrainings, now).IsSuccess, CanRefuseTrainingInvitation = enrollment.CanRefuseTrainingInvitation(preferredTrainings, now).IsSuccess, CanRecordTrainingResults = enrollment.CanRecordTrainingResults(preferredTrainings, now).IsSuccess, CanResign = enrollment.CanResign, HasLecturerRights = enrollment.HasLecturerRights, HasResigned = enrollment.HasResignedPermanently || enrollment.HasResignedEffectively(now), HasResignedPermanently = enrollment.HasResignedPermanently, HasResignedTemporarily = enrollment.HasResignedTemporarily && enrollment.HasResignedEffectively(now), ResumeDate = enrollment.ResumeDate, IsCurrentSubmission = enrollment.CampaignId == latestCampaign?.Id, IsOldSubmission = enrollment.CampaignId != latestCampaign?.Id }); }
private async Task <GetEnrollmentDetails.EventData> BuildEventData(EnrollmentAggregate aggregate, IDomainEvent <EnrollmentAggregate, EnrollmentAggregate.EnrollmentId> @event, IReadOnlyCollection <Training> trainings, IReadOnlyCollection <TrainerDetails> trainers) { switch (@event.GetAggregateEvent()) { case RecruitmentFormSubmitted e: return(new GetEnrollmentDetails.RecruitmentFormSubmittedEventData() { DateTime = e.SubmissionDate.InMainTimezone(), AboutMe = e.AboutMe, EmailAddress = e.Email.ToString(), FullName = $"{e.FirstName} {e.LastName}", PhoneNumber = e.PhoneNumber.ToString(), PreferredLecturingCities = e.PreferredLecturingCities, PreferredTrainings = trainings .Where(x => e.PreferredTrainingIds.Contains(x.ID)) .Select(x => BuildTrainingSummary(x, trainers)).ToArray() }); case EmailSent e: return(new GetEnrollmentDetails.EmailSentEventData() { DateTime = e.Instant.InMainTimezone(), To = aggregate.Email.ToString(), Body = e.Body, Subject = e.Subject, IsBodyHtml = e.IsBodyHtml }); case EmailSendingFailed e: return(new GetEnrollmentDetails.EmailFailedToSendEventData() { DateTime = e.Instant.InMainTimezone(), To = aggregate.Email.ToString(), Body = e.Body, Subject = e.Subject, IsBodyHtml = e.IsBodyHtml }); case CandidateAcceptedTrainingInvitation e: return(new GetEnrollmentDetails.CandidateAcceptedTrainingInvitationEventData() { DateTime = @event.Timestamp.ToZonedDateTime(), RecordingUser = await GetUserName(e.RecordingCoordinatorID), SelectedTraining = BuildTrainingSummary(trainings.Single(x => x.ID == e.SelectedTrainingID), trainers), AdditionalNotes = e.AdditionalNotes }); case CandidateRefusedTrainingInvitation e: return(new GetEnrollmentDetails.CandidateRefusedTrainingInvitationEventData() { DateTime = @event.Timestamp.ToZonedDateTime(), RecordingUser = await GetUserName(e.RecordingCoordinatorID), AdditionalNotes = e.AdditionalNotes, RefusalReason = e.RefusalReason }); case CandidateAttendedTraining e: return(new GetEnrollmentDetails.CandidateAttendedTrainingEventData() { DateTime = @event.Timestamp.ToZonedDateTime(), RecordingUser = await GetUserName(e.RecordingCoordinatorID), Training = BuildTrainingSummary(trainings.Single(x => x.ID == e.TrainingID), trainers), AdditionalNotes = e.AdditionalNotes }); case CandidateWasAbsentFromTraining e: return(new GetEnrollmentDetails.CandidateWasAbsentFromTrainingEventData() { DateTime = @event.Timestamp.ToZonedDateTime(), RecordingUser = await GetUserName(e.RecordingCoordinatorID), Training = BuildTrainingSummary(trainings.Single(x => x.ID == e.TrainingID), trainers), AdditionalNotes = e.AdditionalNotes }); case CandidateObtainedLecturerRights e: return(new GetEnrollmentDetails.CandidateObtainedLecturerRightsEventData() { DateTime = @event.Timestamp.ToZonedDateTime(), RecordingUser = await GetUserName(e.GrantingCoordinatorID), AdditionalNotes = e.AdditionalNotes }); case CandidateResignedPermanently e: return(new GetEnrollmentDetails.CandidateResignedPermanentlyEventData() { DateTime = @event.Timestamp.ToZonedDateTime(), RecordingUser = await GetUserName(e.RecordingCoordinatorID), ResignationReason = e.ResignationReason, AdditionalNotes = e.AdditionalNotes }); case CandidateResignedTemporarily e: return(new GetEnrollmentDetails.CandidateResignedTemporarilyEventData() { DateTime = @event.Timestamp.ToZonedDateTime(), RecordingUser = await GetUserName(e.RecordingCoordinatorID), ResignationReason = e.ResignationReason, AdditionalNotes = e.AdditionalNotes, ResumeDate = e.ResumeDate }); case ContactOccured e: return(new GetEnrollmentDetails.ContactOccuredEventData() { DateTime = @event.Timestamp.ToZonedDateTime(), RecordingUser = await GetUserName(e.RecordingUserId), CommunicationChannel = e.CommunicationChannel, Content = e.Content, AdditionalNotes = e.AdditionalNotes }); default: throw new NotSupportedException(); } }
private async Task <string> BuildMessageBody(Config.EmailMessageConfig greetingEmailConfig, EnrollmentAggregate aggregate) { var body = await greetingEmailConfig.BuildMessageBody(); var model = new { aggregate.FirstName, aggregate.LastName, aggregate.FullName, aggregate.Email, aggregate.PhoneNumber, aggregate.Region }; return(_fluidTemplateRenderer.Render(body, model)); }
private async Task <string> BuildMessageBody(Config.EmailMessageConfig emailConfig, EnrollmentAggregate aggregate, Entities.Training training) { var body = await emailConfig.BuildMessageBody(); var model = new { Candidate = new { aggregate.FirstName, aggregate.LastName, aggregate.FullName, aggregate.Email, aggregate.PhoneNumber, aggregate.Region }, Training = new { training.Address, training.City, training.StartDateTime, training.EndDateTime, StartDate = training.StartDateTime.Date, StartTime = training.StartDateTime.TimeOfDay, EndDate = training.EndDateTime.Date, EndTime = training.EndDateTime.TimeOfDay, Duration = training.Duration.ToString("HH':'mm", null) } }; return(_fluidTemplateRenderer.Render(body, model)); }