private async Task <List <SlotEntrySummary> > PopulateSearchResultsMulti(List <SpineList> providerGpConnectDetails, List <OrganisationList> providerOrganisationDetails, List <SpineList> consumerGpConnectDetails, List <OrganisationList> consumerOrganisationDetails, string consumerOrganisationType = "") { var createdSearchGroup = _applicationService.AddSearchGroup(new DTO.Request.Application.SearchGroup { UserSessionId = User.GetClaimValue("UserSessionId").StringToInteger(), ProviderOdsTextbox = ProviderOdsCode, ConsumerOdsTextbox = ConsumerOdsCode, SearchDateRange = SelectedDateRange, ConsumerOrganisationTypeDropdown = SelectedOrganisationType }); _logger.LogInformation("Executing PopulateSearchResultsMulti - generating Request Parameters"); SearchGroupId = createdSearchGroup.SearchGroupId; var slotEntrySummary = new List <SlotEntrySummary>(); var requestParameters = await _tokenService.ConstructRequestParameters(_contextAccessor.HttpContext.GetAbsoluteUri(), providerGpConnectDetails, providerOrganisationDetails, consumerGpConnectDetails, consumerOrganisationDetails, (int)SpineMessageTypes.GpConnectSearchFreeSlots, consumerOrganisationType); var startDate = Convert.ToDateTime(SelectedDateRange.Split(":")[0]); var endDate = Convert.ToDateTime(SelectedDateRange.Split(":")[1]); var providerOdsCount = ProviderOdsCodeAsList.Count; var consumerOdsCount = ConsumerOdsCodeAsList.Count; List <SlotEntrySummaryCount> slotSearchSummaryList = new List <SlotEntrySummaryCount>(); List <OrganisationErrorCodeOrDetail> organisationErrorCodeOrDetail = new List <OrganisationErrorCodeOrDetail>(); List <CapabilityStatementErrorCodeOrDetail> capabilityStatementErrorCodeOrDetail = new List <CapabilityStatementErrorCodeOrDetail>(); if (providerOdsCount > consumerOdsCount) { _logger.LogInformation("Executing PopulateSearchResultsMulti - Getting capability statement list"); var consumerCode = ConsumerOdsCodeAsList.Count == 0 ? null : ConsumerOdsCodeAsList[0]; var capabilityStatementList = await _queryExecutionService.ExecuteFhirCapabilityStatement(requestParameters); for (var i = 0; i < providerOdsCount; i++) { _stopwatch.Start(); var errorCodeOrDetail = GetOrganisationErrorCodeOrDetail(ProviderOdsCodeAsList[i], consumerCode, providerGpConnectDetails, providerOrganisationDetails, consumerGpConnectDetails, consumerOrganisationDetails, consumerOrganisationType); organisationErrorCodeOrDetail.Add(errorCodeOrDetail); var capabilityStatementResult = GetCapabilityStatementErrorCodeOrDetail(ProviderOdsCodeAsList[i], capabilityStatementList); capabilityStatementErrorCodeOrDetail.Add(capabilityStatementResult); } var slotCount = 0; if (requestParameters != null && organisationErrorCodeOrDetail != null && capabilityStatementErrorCodeOrDetail != null) { slotSearchSummaryList = await _queryExecutionService.ExecuteFreeSlotSearchSummary(organisationErrorCodeOrDetail, requestParameters, startDate, endDate, SearchType.Provider); for (var i = 0; i < providerOdsCount; i++) { var organisationErrorCodeOrDetailForCode = organisationErrorCodeOrDetail.FirstOrDefault(x => x.SuppliedProviderOdsCode == ProviderOdsCodeAsList[i]); var capabilityStatementErrorCodeOrDetailForCode = capabilityStatementErrorCodeOrDetail.FirstOrDefault(x => x.SuppliedProviderOdsCode == ProviderOdsCodeAsList[i]); if (organisationErrorCodeOrDetailForCode.errorSource == ErrorCode.None) { var slotSearchErrorCodeOrDetail = GetSlotSearchErrorCodeOrDetail(ProviderOdsCodeAsList[i], slotSearchSummaryList); organisationErrorCodeOrDetailForCode.errorSource = slotSearchErrorCodeOrDetail.Item1; organisationErrorCodeOrDetailForCode.details = AppendAdditionalDetails(slotSearchErrorCodeOrDetail.Item2, organisationErrorCodeOrDetailForCode.additionalDetails); slotCount = slotSearchErrorCodeOrDetail.Item3.GetValueOrDefault(); } else if (organisationErrorCodeOrDetailForCode.errorSource == ErrorCode.None && capabilityStatementErrorCodeOrDetailForCode.errorSource != ErrorCode.None) { organisationErrorCodeOrDetailForCode.errorSource = capabilityStatementErrorCodeOrDetailForCode.errorSource; organisationErrorCodeOrDetailForCode.details = capabilityStatementErrorCodeOrDetailForCode.details; slotCount = 0; } _stopwatch.Stop(); var searchResultToAdd = new SearchResult { SearchGroupId = createdSearchGroup.SearchGroupId, ProviderCode = ProviderOdsCodeAsList[i], ConsumerCode = consumerCode, ConsumerOrganisationType = OrganisationTypes.FirstOrDefault(x => x.Value == consumerOrganisationType).Text, ErrorCode = (int)organisationErrorCodeOrDetailForCode.errorSource, Details = organisationErrorCodeOrDetailForCode.details, ProviderPublisher = organisationErrorCodeOrDetailForCode.providerSpine?.ProductName, SearchDurationSeconds = _stopwatch.Elapsed.TotalSeconds }; _stopwatch.Reset(); if (slotSearchSummaryList != null) { var spineMessageId = slotSearchSummaryList.FirstOrDefault(x => x.OdsCode == ProviderOdsCodeAsList[i])?.SpineMessageId; searchResultToAdd.SpineMessageId = spineMessageId; } var searchResult = _applicationService.AddSearchResult(searchResultToAdd); slotEntrySummary.Add(new SlotEntrySummary { ProviderLocationName = organisationErrorCodeOrDetailForCode.providerOrganisation?.OrganisationLocation, ProviderOdsCode = ProviderOdsCodeAsList[i], ConsumerLocationName = organisationErrorCodeOrDetailForCode.consumerOrganisation?.OrganisationLocation, ConsumerOdsCode = consumerCode, ConsumerOrganisationType = OrganisationTypes.FirstOrDefault(x => x.Value == consumerOrganisationType).Text, SearchSummaryDetail = organisationErrorCodeOrDetailForCode.details, ProviderPublisher = organisationErrorCodeOrDetailForCode.providerSpine?.ProductName, SearchResultId = searchResult.SearchResultId, SearchGroupId = searchResultToAdd.SearchGroupId, DetailsEnabled = (organisationErrorCodeOrDetailForCode.errorSource == ErrorCode.None && slotCount > 0), DisplayProvider = organisationErrorCodeOrDetailForCode.providerOrganisation != null, DisplayConsumer = organisationErrorCodeOrDetailForCode.consumerOrganisation != null, DisplayClass = (organisationErrorCodeOrDetailForCode.errorSource != ErrorCode.None) ? "nhsuk-slot-summary-error" : "nhsuk-slot-summary" }); } } } else if (consumerOdsCount > providerOdsCount) { for (var i = 0; i < consumerOdsCount; i++) { _stopwatch.Start(); var errorCodeOrDetail = GetOrganisationErrorCodeOrDetail(ProviderOdsCodeAsList[0], ConsumerOdsCodeAsList[i], providerGpConnectDetails, providerOrganisationDetails, consumerGpConnectDetails, consumerOrganisationDetails, consumerOrganisationType); organisationErrorCodeOrDetail.Add(errorCodeOrDetail); } var capabilityStatementList = await _queryExecutionService.ExecuteFhirCapabilityStatement(requestParameters); var capabilityStatementResult = GetCapabilityStatementErrorCodeOrDetail(ProviderOdsCodeAsList[0], capabilityStatementList); capabilityStatementErrorCodeOrDetail.Add(capabilityStatementResult); var slotCount = 0; if (requestParameters != null && organisationErrorCodeOrDetail != null && capabilityStatementErrorCodeOrDetail != null) { slotSearchSummaryList = await _queryExecutionService.ExecuteFreeSlotSearchSummary(organisationErrorCodeOrDetail, requestParameters, startDate, endDate, SearchType.Consumer); for (var i = 0; i < consumerOdsCount; i++) { var organisationErrorCodeOrDetailForCode = organisationErrorCodeOrDetail.FirstOrDefault(x => x.SuppliedConsumerOdsCode == ConsumerOdsCodeAsList[i]); var capabilityStatementErrorCodeOrDetailForCode = capabilityStatementErrorCodeOrDetail.FirstOrDefault(x => x.SuppliedConsumerOdsCode == ConsumerOdsCodeAsList[i]); if (organisationErrorCodeOrDetailForCode.errorSource == ErrorCode.None) { var slotSearchErrorCodeOrDetail = GetSlotSearchErrorCodeOrDetail(ConsumerOdsCodeAsList[i], slotSearchSummaryList); organisationErrorCodeOrDetailForCode.errorSource = slotSearchErrorCodeOrDetail.Item1; organisationErrorCodeOrDetailForCode.details = AppendAdditionalDetails(slotSearchErrorCodeOrDetail.Item2, organisationErrorCodeOrDetailForCode.additionalDetails); slotCount = slotSearchErrorCodeOrDetail.Item3.GetValueOrDefault(); } else if (organisationErrorCodeOrDetailForCode.errorSource == ErrorCode.None && capabilityStatementErrorCodeOrDetailForCode.errorSource != ErrorCode.None) { organisationErrorCodeOrDetailForCode.errorSource = capabilityStatementErrorCodeOrDetailForCode.errorSource; organisationErrorCodeOrDetailForCode.details = capabilityStatementErrorCodeOrDetailForCode.details; slotCount = 0; } _stopwatch.Stop(); var searchResultToAdd = new SearchResult { SearchGroupId = createdSearchGroup.SearchGroupId, ProviderCode = ProviderOdsCodeAsList[0], ConsumerCode = ConsumerOdsCodeAsList[i], ConsumerOrganisationType = OrganisationTypes.FirstOrDefault(x => x.Value == consumerOrganisationType).Text, ErrorCode = (int)organisationErrorCodeOrDetailForCode.errorSource, Details = organisationErrorCodeOrDetailForCode.details, ProviderPublisher = organisationErrorCodeOrDetailForCode.providerSpine?.ProductName, SearchDurationSeconds = _stopwatch.Elapsed.TotalSeconds, }; _stopwatch.Reset(); if (slotSearchSummaryList != null) { var spineMessageId = slotSearchSummaryList.FirstOrDefault(x => x.OdsCode == ConsumerOdsCodeAsList[i])?.SpineMessageId; searchResultToAdd.SpineMessageId = spineMessageId; } var searchResult = _applicationService.AddSearchResult(searchResultToAdd); slotEntrySummary.Add(new SlotEntrySummary { ProviderLocationName = organisationErrorCodeOrDetailForCode.providerOrganisation?.OrganisationLocation, ProviderOdsCode = ProviderOdsCodeAsList[0], ConsumerLocationName = organisationErrorCodeOrDetailForCode.consumerOrganisation?.OrganisationLocation, ConsumerOdsCode = ConsumerOdsCodeAsList[i], ConsumerOrganisationType = OrganisationTypes.FirstOrDefault(x => x.Value == consumerOrganisationType).Text, SearchSummaryDetail = organisationErrorCodeOrDetailForCode.details, ProviderPublisher = organisationErrorCodeOrDetailForCode.providerSpine?.ProductName, SearchResultId = searchResult.SearchResultId, DetailsEnabled = (organisationErrorCodeOrDetailForCode.errorSource == ErrorCode.None && slotCount > 0), DisplayProvider = organisationErrorCodeOrDetailForCode.providerOrganisation != null, DisplayConsumer = organisationErrorCodeOrDetailForCode.consumerOrganisation != null, DisplayClass = (organisationErrorCodeOrDetailForCode.errorSource != ErrorCode.None) ? "nhsuk-slot-summary-error" : "nhsuk-slot-summary" }); } } } _applicationService.UpdateSearchGroup(SearchGroupId); return(slotEntrySummary.OrderBy(x => x.SearchResultId).ToList()); }