Beispiel #1
0
 private void ValidatePreferredTrainingsMatchOrThrow(IReadOnlyCollection <Training> preferredTrainings)
 {
     if (preferredTrainings.Select(x => x.ID).OrderBy(x => x).SequenceEqual(PreferredTrainingIds.OrderBy(x => x)) == false)
     {
         throw new ArgumentException($"{nameof(preferredTrainings)} collection contains different trainings than specified by {nameof(PreferredTrainingIds)}", nameof(preferredTrainings));
     }
 }
Beispiel #2
0
        public Result <Nothing, Error> RecordCandidateAcceptedTrainingInvitation(
            RecordAcceptedTrainingInvitation.Command command,
            ApplicationUser recordingCoordinator,
            IReadOnlyCollection <Training> availableTrainings,
            Instant currentInstant)
        {
            Guard.Against.Null(command, nameof(command));
            Guard.Against.Null(recordingCoordinator, nameof(recordingCoordinator));
            Guard.Against.Null(availableTrainings, nameof(availableTrainings));
            Guard.Against.Default(currentInstant, nameof(currentInstant));
            ValidateIdMatchOrThrow(command.EnrollmentId);

            var preferredTrainings = availableTrainings.Where(x => PreferredTrainingIds.Contains(x.ID)).ToArray();
            var selectedTraining   = preferredTrainings.SingleOrDefault(x => x.ID == command.SelectedTrainingID);

            return
                (Validate(new RecordAcceptedTrainingInvitation.Validator(), command)
                 .Ensure(_ => CanAcceptTrainingInvitation(preferredTrainings, currentInstant))
                 .Ensure(
                     _ => availableTrainings.Any(x => x.ID == command.SelectedTrainingID),
                     new Error.ResourceNotFound(RecordAcceptedTrainingInvitation_ErrorMessages.TrainingNotFound))
                 .Ensure(
                     _ => selectedTraining != null && PreferredTrainingIds.Contains(selectedTraining.ID),
                     new Error.ValidationFailed(nameof(command.SelectedTrainingID), RecordAcceptedTrainingInvitation_ErrorMessages.TrainingWasNotSpecifiedAsPreferred))
                 .Ensure(
                     _ => availableTrainings.Single(x => x.ID == command.SelectedTrainingID).StartDateTime.ToInstant() > currentInstant,
                     new Error.ValidationFailed(nameof(command.SelectedTrainingID), RecordAcceptedTrainingInvitation_ErrorMessages.TrainingTimeAlreadyPassed))
                 .Tap(_ => Emit(new CandidateAcceptedTrainingInvitation(
                                    recordingCoordinatorID: recordingCoordinator.Id,
                                    communicationChannel: command.CommunicationChannel,
                                    selectedTrainingID: command.SelectedTrainingID,
                                    additionalNotes: command.AdditionalNotes ?? string.Empty))));
        }
Beispiel #3
0
 public Result <Nothing, Error> CanRecordTrainingResultsFor(Training training, Instant currentInstant)
 {
     return(Result.Success <Nothing, Error>(Nothing.Value)
            .Ensure(
                _ => this.IsNew == false,
                new Error.ResourceNotFound(CommonErrorMessages.CandidateNotFound))
            .Ensure(
                _ => PreferredTrainingIds.Contains(training.ID),
                new Error.DomainError(RecordTrainingResults_Messages.TrainingNotSelectedAsPreferred))
            .Ensure(
                _ => training.EndDateTime.ToInstant() < currentInstant,
                new Error.DomainError(RecordTrainingResults_Messages.CannotRecordTrainingAttendanceBeforeTrainingEnd)));
 }
Beispiel #4
0
        public Result <Nothing, Error> RecordTrainingResults(
            RecordTrainingResults.Command command, ApplicationUser recordingCoordinator,
            IReadOnlyCollection <Training> preferredTrainings, Training selectedTraining, Instant now)
        {
            Guard.Against.Null(command, nameof(command));
            Guard.Against.Null(recordingCoordinator, nameof(recordingCoordinator));
            Guard.Against.Null(preferredTrainings, nameof(preferredTrainings));
            Guard.Against.Null(selectedTraining, nameof(selectedTraining));
            Guard.Against.Null(now, nameof(now));
            ValidateIdMatchOrThrow(command.EnrollmentId);
            if (command.TrainingId != selectedTraining.ID)
            {
                throw new InvalidOperationException($"{nameof(command)}.{nameof(command.TrainingId)} must be the same as {nameof(selectedTraining)}.{nameof(Id)}");
            }

            var absent = Recruitment.Enrollments.RecordTrainingResults.TrainingResult.Absent;

            return
                (Validate(new RecordTrainingResults.Validator(), command)
                 .Ensure(_ => CanRecordTrainingResultsFor(selectedTraining, now))
                 .Ensure(
                     _ => PreferredTrainingIds.Contains(selectedTraining.ID),
                     new Error.DomainError(RecordTrainingResults_Messages.TrainingNotSelectedAsPreferred))
                 .Ensure(
                     _ => selectedTraining.EndDateTime.ToInstant() < now,
                     new Error.DomainError(RecordTrainingResults_Messages.CannotRecordTrainingAttendanceBeforeTrainingEnd))
                 .EnsureNot(_ => command.TrainingResult == absent && _trainingInvitationState != TrainingInvitationStateEnum.Accepted,
                            new Error.DomainError(RecordTrainingResults_Messages.CannotRecordCandidateAsAbsentIfTheyDidNotAcceptTrainingInvitation))
                 .TapIf(
                     command.TrainingResult == absent,
                     () => Emit(new CandidateWasAbsentFromTraining(recordingCoordinator.Id, command.TrainingId, command.AdditionalNotes ?? string.Empty)))
                 .TapIf(
                     command.TrainingResult == Recruitment.Enrollments.RecordTrainingResults.TrainingResult.PresentButNotAcceptedAsLecturer,
                     () => Emit(new CandidateAttendedTraining(recordingCoordinator.Id, command.TrainingId, command.AdditionalNotes ?? string.Empty)))
                 .TapIf(
                     command.TrainingResult == Recruitment.Enrollments.RecordTrainingResults.TrainingResult.PresentAndAcceptedAsLecturer,
                     () => {
                Emit(new CandidateAttendedTraining(recordingCoordinator.Id, command.TrainingId, command.AdditionalNotes ?? string.Empty));
                Emit(new CandidateObtainedLecturerRights(recordingCoordinator.Id, command.AdditionalNotes ?? string.Empty));
            }));
        }