/// <summary> /// Map an existing hearing to a CreateVideoHearingCommand for the purpose of multi-booking days /// </summary> /// <param name="hearing">Original hearing</param> /// <param name="newDate">New hearing date</param> /// <param name="randomGenerator">generator for unique sips</param> /// <param name="sipAddressStem">sip address stem</param> /// <param name="totalDays">Total number of days of multi-booking hearing</param> /// <param name="hearingDay">Day number of multi-booking hearing</param> /// <returns>command to create a new video hearing</returns> public static CreateVideoHearingCommand CloneToCommand(Hearing hearing, DateTime newDate, IRandomGenerator randomGenerator, string sipAddressStem, int totalDays, int hearingDay) { var reps = hearing.GetParticipants().Where(x => x.HearingRole.UserRole.IsRepresentative) .Cast <Representative>().ToList(); var nonReps = hearing.GetParticipants().Where(x => !x.HearingRole.UserRole.IsRepresentative).ToList(); var participants = new List <NewParticipant>(); participants.AddRange(reps.Select(r => new NewParticipant { Person = r.Person, Representee = r.Representee, CaseRole = r.CaseRole, DisplayName = r.DisplayName, HearingRole = r.HearingRole })); participants.AddRange(nonReps.Select(r => new NewParticipant { Person = r.Person, CaseRole = r.CaseRole, DisplayName = r.DisplayName, HearingRole = r.HearingRole })); var cases = hearing.GetCases().Select(c => new Case(c.Number, $"{c.Name} Day {hearingDay} of {totalDays}") { IsLeadCase = c.IsLeadCase }).ToList(); var newEndpoints = hearing.GetEndpoints().Select(x => { var sip = randomGenerator.GetWeakDeterministic(DateTime.UtcNow.Ticks, 1, 10); var pin = randomGenerator.GetWeakDeterministic(DateTime.UtcNow.Ticks, 1, 4); return(new NewEndpoint { Pin = pin, Sip = $"{sip}{sipAddressStem}", DisplayName = x.DisplayName, DefenceAdvocateUsername = x.DefenceAdvocate?.Person?.Username }); }).ToList(); var linkedParticipantDtos = GetLinkedParticipantDtos(hearing); var duration = 480; var command = new CreateVideoHearingCommand(hearing.CaseType, hearing.HearingType, newDate, duration, hearing.HearingVenue, participants, cases, true, hearing.AudioRecordingRequired, newEndpoints, linkedParticipantDtos) { HearingRoomName = hearing.HearingRoomName, OtherInformation = hearing.OtherInformation, CreatedBy = hearing.CreatedBy, SourceId = hearing.Id }; return(command); }
public async Task Should_be_able_to_save_video_hearing_to_database() { var caseTypeName = "Generic"; var caseType = GetCaseTypeFromDb(caseTypeName); var hearingTypeName = "Automated Test"; var hearingType = caseType.HearingTypes.First(x => x.Name == hearingTypeName); var scheduledDate = DateTime.Today.AddHours(10).AddMinutes(30); var duration = 45; var venue = new RefDataBuilder().HearingVenues.First(); var applicantCaseRole = caseType.CaseRoles.First(x => x.Name == "Applicant"); var applicantRepresentativeHearingRole = applicantCaseRole.HearingRoles.First(x => x.Name == "Representative"); var judgeCaseRole = caseType.CaseRoles.First(x => x.Name == "Judge"); var judgeHearingRole = judgeCaseRole.HearingRoles.First(x => x.Name == "Judge"); var newPerson = new PersonBuilder(true).Build(); var newJudgePerson = new PersonBuilder(true).Build(); var newParticipant = new NewParticipant() { Person = newPerson, CaseRole = applicantCaseRole, HearingRole = applicantRepresentativeHearingRole, DisplayName = $"{newPerson.FirstName} {newPerson.LastName}", Representee = string.Empty }; var newJudgeParticipant = new NewParticipant() { Person = newJudgePerson, CaseRole = judgeCaseRole, HearingRole = judgeHearingRole, DisplayName = $"{newJudgePerson.FirstName} {newJudgePerson.LastName}", Representee = string.Empty }; var participants = new List <NewParticipant>() { newParticipant, newJudgeParticipant }; var cases = new List <Case> { new Case("01234567890", "Test Add") }; var hearingRoomName = "Room01"; var otherInformation = "OtherInformation01"; var createdBy = "User01"; const bool questionnaireNotRequired = false; const bool audioRecordingRequired = true; var endpoints = new List <NewEndpoint> { new NewEndpoint { DisplayName = "display 1", Sip = Guid.NewGuid().ToString(), Pin = "1234", DefenceAdvocateUsername = null }, new NewEndpoint { DisplayName = "display 2", Sip = Guid.NewGuid().ToString(), Pin = "5678", DefenceAdvocateUsername = null } }; var linkedParticipants = new List <LinkedParticipantDto> { new LinkedParticipantDto( newParticipant.Person.ContactEmail, newJudgeParticipant.Person.ContactEmail, LinkedParticipantType.Interpreter) }; var command = new CreateVideoHearingCommand(caseType, hearingType, scheduledDate, duration, venue, participants, cases, questionnaireNotRequired, audioRecordingRequired, endpoints, linkedParticipants) { HearingRoomName = hearingRoomName, OtherInformation = otherInformation, CreatedBy = createdBy }; await _commandHandler.Handle(command); command.NewHearingId.Should().NotBeEmpty(); _newHearingId = command.NewHearingId; Hooks.AddHearingForCleanup(_newHearingId); var returnedVideoHearing = await _queryHandler.Handle(new GetHearingByIdQuery(_newHearingId)); returnedVideoHearing.Should().NotBeNull(); returnedVideoHearing.CaseType.Should().NotBeNull(); returnedVideoHearing.HearingVenue.Should().NotBeNull(); returnedVideoHearing.HearingType.Should().NotBeNull(); var participantsFromDb = returnedVideoHearing.GetParticipants(); participantsFromDb.Any().Should().BeTrue(); returnedVideoHearing.GetCases().Any().Should().BeTrue(); returnedVideoHearing.GetEndpoints().Any().Should().BeTrue(); var linkedParticipantsFromDb = participantsFromDb.SelectMany(x => x.LinkedParticipants).ToList(); linkedParticipantsFromDb.Should().NotBeEmpty(); foreach (var linkedParticipant in linkedParticipantsFromDb) { linkedParticipant.Type.Should().BeAssignableTo <LinkedParticipantType>(); linkedParticipant.Type.Should().Be(LinkedParticipantType.Interpreter); participantsFromDb.Any(x => x.Id == linkedParticipant.LinkedId).Should().BeTrue(); participantsFromDb.Any(x => x.Id == linkedParticipant.ParticipantId).Should().BeTrue(); } }
public async Task Should_be_able_to_save_video_hearing_to_database() { var caseTypeName = "Civil Money Claims"; var caseType = GetCaseTypeFromDb(caseTypeName); var hearingTypeName = "Application to Set Judgment Aside"; var hearingType = caseType.HearingTypes.First(x => x.Name == hearingTypeName); var scheduledDate = DateTime.Today.AddHours(10).AddMinutes(30); var duration = 45; var venue = new RefDataBuilder().HearingVenues.First(); var claimantCaseRole = caseType.CaseRoles.First(x => x.Name == "Claimant"); var claimantRepresentativeHearingRole = claimantCaseRole.HearingRoles.First(x => x.Name == "Representative"); var judgeCaseRole = caseType.CaseRoles.First(x => x.Name == "Judge"); var judgeHearingRole = judgeCaseRole.HearingRoles.First(x => x.Name == "Judge"); var newPerson = new PersonBuilder(true).Build(); var newJudgePerson = new PersonBuilder(true).Build(); var newParticipant = new NewParticipant() { Person = newPerson, CaseRole = claimantCaseRole, HearingRole = claimantRepresentativeHearingRole, DisplayName = $"{newPerson.FirstName} {newPerson.LastName}", Reference = string.Empty, Representee = string.Empty }; var newJudgeParticipant = new NewParticipant() { Person = newJudgePerson, CaseRole = judgeCaseRole, HearingRole = judgeHearingRole, DisplayName = $"{newJudgePerson.FirstName} {newJudgePerson.LastName}", Reference = string.Empty, Representee = string.Empty }; var participants = new List <NewParticipant>() { newParticipant, newJudgeParticipant }; var cases = new List <Case> { new Case("01234567890", "Test Add") }; var hearingRoomName = "Room01"; var otherInformation = "OtherInformation01"; var createdBy = "User01"; const bool questionnaireNotRequired = false; const bool audioRecordingRequired = true; var command = new CreateVideoHearingCommand(caseType, hearingType, scheduledDate, duration, venue, participants, cases, questionnaireNotRequired, audioRecordingRequired) { HearingRoomName = hearingRoomName, OtherInformation = otherInformation, CreatedBy = createdBy }; await _commandHandler.Handle(command); command.NewHearingId.Should().NotBeEmpty(); _newHearingId = command.NewHearingId; var returnedVideoHearing = await _queryHandler.Handle(new GetHearingByIdQuery(_newHearingId)); returnedVideoHearing.Should().NotBeNull(); returnedVideoHearing.CaseType.Should().NotBeNull(); returnedVideoHearing.HearingVenue.Should().NotBeNull(); returnedVideoHearing.HearingType.Should().NotBeNull(); returnedVideoHearing.GetParticipants().Any().Should().BeTrue(); returnedVideoHearing.GetCases().Any().Should().BeTrue(); }
public async Task <IActionResult> BookNewHearing(BookNewHearingRequest request) { var result = new BookNewHearingRequestValidation().Validate(request); if (!result.IsValid) { ModelState.AddFluentValidationErrors(result.Errors); return(BadRequest(ModelState)); } var query = new GetCaseTypeQuery(request.CaseTypeName); var caseType = await _queryHandler.Handle <GetCaseTypeQuery, CaseType>(query); if (caseType == null) { ModelState.AddModelError(nameof(request.CaseTypeName), "Case type does not exist"); return(BadRequest(ModelState)); } var individualRoles = caseType.CaseRoles.SelectMany(x => x.HearingRoles).Where(x => x.UserRole.IsIndividual).Select(x => x.Name).ToList(); var addressValidationResult = AddressValidationHelper.ValidateAddress(individualRoles, request.Participants); if (!addressValidationResult.IsValid) { ModelState.AddFluentValidationErrors(addressValidationResult.Errors); return(BadRequest(ModelState)); } var hearingType = caseType.HearingTypes.SingleOrDefault(x => x.Name == request.HearingTypeName); if (hearingType == null) { ModelState.AddModelError(nameof(request.HearingTypeName), "Hearing type does not exist"); return(BadRequest(ModelState)); } var venue = await GetVenue(request.HearingVenueName); if (venue == null) { ModelState.AddModelError(nameof(request.HearingVenueName), "Hearing venue does not exist"); return(BadRequest(ModelState)); } var mapper = new ParticipantRequestToNewParticipantMapper(); var newParticipants = request.Participants.Select(x => mapper.MapRequestToNewParticipant(x, caseType)) .ToList(); var cases = request.Cases.Select(x => new Case(x.Number, x.Name)).ToList(); var createVideoHearingCommand = new CreateVideoHearingCommand(caseType, hearingType, request.ScheduledDateTime, request.ScheduledDuration, venue, newParticipants, cases, request.QuestionnaireNotRequired, request.AudioRecordingRequired) { HearingRoomName = request.HearingRoomName, OtherInformation = request.OtherInformation, CreatedBy = request.CreatedBy }; await _commandHandler.Handle(createVideoHearingCommand); var videoHearingId = createVideoHearingCommand.NewHearingId; var getHearingByIdQuery = new GetHearingByIdQuery(videoHearingId); var queriedVideoHearing = await _queryHandler.Handle <GetHearingByIdQuery, VideoHearing>(getHearingByIdQuery); var hearingMapper = new HearingToDetailResponseMapper(); var response = hearingMapper.MapHearingToDetailedResponse(queriedVideoHearing); return(CreatedAtAction(nameof(GetHearingDetailsById), new { hearingId = response.Id }, response)); }