/// <summary> /// Gets the collection of stores within the specified search area. /// </summary> /// <param name="request">The get stores data request.</param> /// <returns> /// A collection of stores. /// </returns> private EntityDataServiceResponse <OrgUnitLocation> GetStores(GetStoresDataRequest request) { ThrowIf.Null(request, "request"); ThrowIf.Null(request.SearchArea, "request.SearchArea"); ThrowIf.Null(request.QueryResultSettings, "request.QueryResultSettings"); QueryResultSettings settings = request.QueryResultSettings; SearchArea searchArea = request.SearchArea; if (settings.ColumnSet != null && settings.ColumnSet.Count > 0 && !settings.ColumnSet.Contains(OrgUnitLocation.DistanceColumn)) { settings.ColumnSet.Add(OrgUnitLocation.DistanceColumn); } var query = new SqlPagedQuery(settings) { From = GetNearbyStoresFunctionName, OrderBy = searchArea.IsUnbounded ? "NAME ASC" : "DISTANCE ASC" }; query.Parameters[ChannelIdVariable] = request.ChannelId; query.Parameters[LongitudeVariable] = searchArea.Longitude; query.Parameters[LatitudeVariable] = searchArea.Latitude; query.Parameters[SearchDistanceVariable] = searchArea.Radius; query.Parameters[UnitConversionVariable] = searchArea.GetUnitConversion(); PagedResult <OrgUnitLocation> storeLocationsRecords; using (var sqlServerdatabaseContext = new SqlServerDatabaseContext(request)) { storeLocationsRecords = sqlServerdatabaseContext.ReadEntity <OrgUnitLocation>(query); } storeLocationsRecords = this.ParseLocations(storeLocationsRecords.Results, request.RequestContext); return(new EntityDataServiceResponse <OrgUnitLocation>(storeLocationsRecords)); }
/// <summary> /// Executes the workflow for a get nearby stores with availability. /// </summary> /// <param name="request">The request.</param> /// <returns>The response.</returns> protected override GetStoreProductAvailabilityResponse Process(GetStoreProductAvailabilityRequest request) { ThrowIf.Null(request, "request"); string variantId = request.VariantId; if (request.Items == null || !request.Items.Any()) { if (string.IsNullOrWhiteSpace(request.ItemId) && string.IsNullOrWhiteSpace(request.Barcode)) { throw new DataValidationException(DataValidationErrors.Microsoft_Dynamics_Commerce_Runtime_ItemIdBarcodeMissing, "Please specify either an item id or a barcode."); } List <string> itemIds = new List <string>(1); if (!string.IsNullOrWhiteSpace(request.Barcode)) { GetProductBarcodeDataRequest dataRequest = new GetProductBarcodeDataRequest(request.Barcode) { QueryResultSettings = new QueryResultSettings(new ColumnSet("ITEMID"), PagingInfo.AllRecords) }; ItemBarcode itemBarcode = this.Context.Runtime.Execute <GetProductBarcodeDataResponse>(dataRequest, this.Context).Barcode; if (itemBarcode == null) { throw new DataValidationException( DataValidationErrors.Microsoft_Dynamics_Commerce_Runtime_BarcodeNotFound, string.Format("The specified barcode ({0}) was not found.", request.Barcode)); } itemIds.Add(itemBarcode.ItemId); variantId = itemBarcode.VariantId; } else { itemIds.Add(request.ItemId); } var getItemsRequest = new GetItemsDataRequest(itemIds) { QueryResultSettings = new QueryResultSettings(new ColumnSet("INVENTUNITID"), PagingInfo.AllRecords) }; var getItemsResponse = request.RequestContext.Runtime.Execute <GetItemsDataResponse>(getItemsRequest, request.RequestContext); ReadOnlyCollection <Item> items = getItemsResponse.Items; if (items == null || items.Count == 0) { throw new DataValidationException( DataValidationErrors.Microsoft_Dynamics_Commerce_Runtime_ObjectNotFound, string.Format("No items were found for the specified item identifiers ({0}).", string.Join(", ", itemIds))); } if (items.Count > 1) { throw new DataValidationException( DataValidationErrors.Microsoft_Dynamics_Commerce_Runtime_DuplicateObject, string.Format("More than one item was found for the specified item identifiers ({0}).", string.Join(", ", itemIds))); } var getStoresRequest = new GetStoresDataRequest(this.Context.GetPrincipal().ChannelId, request.SearchArea, QueryResultSettings.AllRecords); ReadOnlyCollection <OrgUnitLocation> storeLocations = this.Context.Execute <EntityDataServiceResponse <OrgUnitLocation> >(getStoresRequest).PagedEntityCollection.Results; var productAvailabilityRequest = new Services.GetStoreAvailabilityServiceRequest(items[0].ItemId, variantId ?? string.Empty); var productAvailabilityResponse = this.Context.Execute <Services.GetStoreAvailabilityServiceResponse>(productAvailabilityRequest); var storeAvailabilities = GetStoreAvailabilities(productAvailabilityResponse.ItemsAvailability, storeLocations, items[0].InventoryUnitOfMeasure); return(new GetStoreProductAvailabilityResponse(storeAvailabilities.AsPagedResult())); } else { ThrowIf.Null(request.Items, "request.Items"); var getStoresRequest = new GetStoresDataRequest(this.Context.GetPrincipal().ChannelId, request.SearchArea, QueryResultSettings.AllRecords); ReadOnlyCollection <OrgUnitLocation> storeLocations = this.Context.Execute <EntityDataServiceResponse <OrgUnitLocation> >(getStoresRequest).PagedEntityCollection.Results; var storeAvailabilities = ChannelAvailabilityHelper.GetChannelAvailabiltiy(this.Context, storeLocations, request.Items); return(new GetStoreProductAvailabilityResponse(storeAvailabilities.AsPagedResult())); } }