示例#1
0
 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
     });
 }
示例#2
0
        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();
            }
        }
示例#3
0
        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));
        }