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)); } }
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)))); }
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))); }
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)); })); }