Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        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();
        }
Esempio n. 4
0
        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));
        }