private async Task PopulateSearchResults(Spine providerSpineDetails, Organisation providerOrganisationDetails, Spine consumerEnablement, Organisation consumerOrganisationDetails, string consumerOrganisationType = "")
        {
            var requestParameters = _tokenService.ConstructRequestParameters(
                _contextAccessor.HttpContext.GetAbsoluteUri(), providerSpineDetails, providerOrganisationDetails,
                consumerEnablement, consumerOrganisationDetails, (int)SpineMessageTypes.GpConnectSearchFreeSlots, consumerOrganisationType);
            var startDate = Convert.ToDateTime(SelectedDateRange.Split(":")[0]);
            var endDate   = Convert.ToDateTime(SelectedDateRange.Split(":")[1]);

            if (requestParameters != null)
            {
                var capabilityStatement = await _queryExecutionService.ExecuteFhirCapabilityStatement(requestParameters, providerSpineDetails.SspHostname);

                CapabilityStatementOk = capabilityStatement.CapabilityStatementNoIssues;

                if (CapabilityStatementOk)
                {
                    var searchResults = await _queryExecutionService.ExecuteFreeSlotSearch(requestParameters, startDate, endDate, providerSpineDetails.SspHostname, User.GetClaimValue("UserId").StringToInteger());

                    SlotSearchOk = searchResults.SlotSearchNoIssues;

                    if (SlotSearchOk)
                    {
                        SearchExportId    = searchResults.SearchExportId;
                        SearchResults     = new List <List <SlotEntrySimple> >();
                        SearchResultsPast = new List <List <SlotEntrySimple> >();

                        SearchResultsTotalCount   = searchResults.SlotCount;
                        SearchResultsCurrentCount = searchResults.CurrentSlotCount;
                        SearchResultsPastCount    = searchResults.PastSlotCount;

                        SearchResults.AddRange(searchResults.CurrentSlotEntriesByLocationGrouping);
                        SearchResultsPast.AddRange(searchResults.PastSlotEntriesByLocationGrouping);
                    }
                    else
                    {
                        ProviderErrorDisplay     = searchResults.ProviderError;
                        ProviderErrorCode        = searchResults.ProviderErrorCode;
                        ProviderErrorDiagnostics = searchResults.ProviderErrorDiagnostics;
                        _auditSearchIssues.Add(string.Format(SearchConstants.ISSUEWITHSENDINGMESSAGETOPROVIDERSYSTEMTEXT, ProviderErrorDisplay, ProviderErrorCode));
                    }
                }
                else
                {
                    ProviderErrorDisplay     = capabilityStatement.ProviderError;
                    ProviderErrorCode        = capabilityStatement.ProviderErrorCode;
                    ProviderErrorDiagnostics = capabilityStatement.ProviderErrorDiagnostics;
                    _auditSearchIssues.Add(string.Format(SearchConstants.ISSUEWITHSENDINGMESSAGETOPROVIDERSYSTEMTEXT, ProviderErrorDisplay, ProviderErrorCode));
                }
            }
        }
        private async Task <Organisation> GetAndMapOrganisationResponse(string odsCode, FhirApiQuery fhirApiQuery)
        {
            var query = fhirApiQuery.QueryText.SearchAndReplace(new Dictionary <string, string> {
                { "{odsCode}", Regex.Escape(odsCode) }
            });
            var tokenSource = new CancellationTokenSource();
            var token       = tokenSource.Token;
            var response    = await _fhirRequestExecution.ExecuteFhirQuery <DTO.Response.Fhir.Organisation>(query, _spineOptionsDelegate.CurrentValue.SpineFhirApiDirectoryServicesFqdn, token, SpineMessageTypes.SpineFhirApiOrganisationQuery);

            if (response != null && !response.HasErrored && response.Issue == null)
            {
                var organisation = new Organisation
                {
                    OdsCode              = odsCode,
                    OrganisationName     = response.OrganisationName,
                    OrganisationTypeCode = response.Type.Coding.OrganisationTypeDisplay,
                    PostalAddress        = response.PostalAddress.PostalAddressCommaSeparated,
                    PostalCode           = response.PostalAddress.PostalCode
                };
                return(organisation);
            }
            return(null);
        }
        private OrganisationErrorCodeOrDetail GetOrganisationErrorCodeOrDetail(string providerOdsCode, string consumerOdsCode, List <SpineList> providerGpConnectDetails, List <OrganisationList> providerOrganisationDetails,
                                                                               List <SpineList> consumerGpConnectDetails, List <OrganisationList> consumerOrganisationDetails, string consumerOrganisationType = "")
        {
            var providerOrganisationLookupErrors = providerOrganisationDetails.FirstOrDefault(x => x.OdsCode == providerOdsCode && x.ErrorCode != ErrorCode.None)?.ErrorCode;
            var providerGpConnectDetailsErrors   = providerGpConnectDetails.FirstOrDefault(x => x.OdsCode == providerOdsCode && x.ErrorCode != ErrorCode.None)?.ErrorCode;
            var providerErrorCode = providerOrganisationLookupErrors ?? providerGpConnectDetailsErrors ?? ErrorCode.None;

            var consumerErrorCode = ErrorCode.None;

            if (!string.IsNullOrEmpty(consumerOdsCode))
            {
                var consumerOrganisationLookupErrors = consumerOrganisationDetails.FirstOrDefault(x => x.OdsCode == consumerOdsCode && x.ErrorCode != ErrorCode.None)?.ErrorCode;
                var consumerGpConnectDetailsErrors   = consumerGpConnectDetails.FirstOrDefault(x => x.OdsCode == consumerOdsCode && x.ErrorCode != ErrorCode.None)?.ErrorCode;
                consumerErrorCode = consumerOrganisationLookupErrors ?? consumerGpConnectDetailsErrors ?? ErrorCode.None;
            }

            var          errorSource          = ErrorCode.None;
            var          details              = string.Empty;
            var          additionalDetails    = string.Empty;
            Organisation providerOrganisation = null;
            Organisation consumerOrganisation = null;
            Spine        providerSpine        = null;

            if (providerErrorCode == ErrorCode.None)
            {
                providerOrganisation = providerOrganisationDetails.FirstOrDefault(x => x.OdsCode == providerOdsCode)?.Organisation;
                providerSpine        = providerGpConnectDetails.FirstOrDefault(x => x.OdsCode == providerOdsCode)?.Spine;
            }
            else
            {
                errorSource = providerErrorCode;
                details     = string.Format(errorSource.GetDescription(), providerOdsCode);
            }

            if (consumerErrorCode == ErrorCode.None)
            {
                consumerOrganisation = consumerOrganisationDetails.FirstOrDefault(x => x.OdsCode == consumerOdsCode)?.Organisation;
            }
            else if (consumerErrorCode == ErrorCode.ConsumerNotEnabledForGpConnectAppointmentManagement)
            {
                consumerOrganisation = consumerOrganisationDetails.FirstOrDefault(x => x.OdsCode == consumerOdsCode)?.Organisation;
                additionalDetails    = string.Format(consumerErrorCode.GetDescription(), consumerOdsCode);
            }
            else
            {
                errorSource = consumerErrorCode;
                details     = string.Format(errorSource.GetDescription(), consumerOdsCode);
            }

            return(new OrganisationErrorCodeOrDetail
            {
                SuppliedProviderOdsCode = providerOdsCode,
                SuppliedConsumerOdsCode = consumerOdsCode,
                errorSource = errorSource,
                details = details,
                additionalDetails = additionalDetails,
                providerOrganisation = providerOrganisation,
                consumerOrganisation = consumerOrganisation,
                providerSpine = providerSpine
            });
        }