private EntityDataServiceResponse <FulfillmentLine> GetFulfillmentLineInventoryAvailability(ExtGetInventoryAvailabilityForFulfillmentLinesServiceRequest request)
        {
            var dataAreadId       = request.RequestContext.GetChannelConfiguration().InventLocationDataAreaId;
            var inventLocationId  = request.InventLocationId;
            var fulfillmentLines  = request.FulfillmentLines;
            var distinctProducsts = fulfillmentLines.Select(f => new { f.ProductId }).Distinct(); // Get distinct product Ids.
            var productWarehouses = distinctProducsts.Select(f => new ProductWarehouse()
            {
                DataAreaId       = dataAreadId,
                InventLocationId = inventLocationId,
                ProductId        = f.ProductId
            });

            // Get inventory availability of products
            var getProductDimensionsInventoryAvailabilityDataRequest = new GetProductDimensionsInventoryAvailabilityDataRequest(productWarehouses);
            var productInventoryAvailabilities = request.RequestContext.Execute <EntityDataServiceResponse <ProductDimensionInventoryAvailability> >(getProductDimensionsInventoryAvailabilityDataRequest).PagedEntityCollection.Results;

            // Get unposted quantities
            var dataRetriever = new InventoryAvailabilityServiceDataRetriever(request.RequestContext);
            var inventoryUnpostedQuantities = dataRetriever.GetUnpostedQuantities(productWarehouses);

            foreach (var fulfillmentLine in fulfillmentLines)
            {
                // find out product availability and unposted quantity of the product
                var productAvailability = productInventoryAvailabilities.First(p => p.ProductId == fulfillmentLine.ProductId &&
                                                                               p.InventLocationId.Equals(inventLocationId, StringComparison.OrdinalIgnoreCase) &&
                                                                               p.DataAreaId.Equals(dataAreadId, StringComparison.OrdinalIgnoreCase));
                var unpostedQuantity = inventoryUnpostedQuantities.First(i => i.ProductId == fulfillmentLine.ProductId &&
                                                                         i.InventLocationId.Equals(inventLocationId, StringComparison.OrdinalIgnoreCase) &&
                                                                         i.DataAreaId.Equals(dataAreadId, StringComparison.OrdinalIgnoreCase));

                // assign the value back to fulfillment line
                fulfillmentLine.StoreInventoryOrderedQuantity  = productAvailability.OrderedInTotal;
                fulfillmentLine.StoreInventoryReservedQuantity = productAvailability.PhysicalReserved;
                fulfillmentLine.StoreInventoryTotalQuantity    = productAvailability.PhysicalInventory - productAvailability.PhysicalReserved + productAvailability.UnprocessedQty + unpostedQuantity.UnpostedQuantity;
            }

            return(new EntityDataServiceResponse <FulfillmentLine>(fulfillmentLines.AsPagedResult()));
        }
 protected override EntityDataServiceResponse <FulfillmentLine> Process(ExtGetInventoryAvailabilityForFulfillmentLinesServiceRequest request)
 {
     return(this.GetFulfillmentLineInventoryAvailability(request));
 }