コード例 #1
0
            /// <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()));
                }
            }