in src/Feature/Catalog/code/Pipelines/Prices/GetProductBulkPricesFromIndex.cs [49:117]
public override void Process(Commerce.Pipelines.ServicePipelineArgs args)
{
Assert.ArgumentNotNull(args, "args");
Assert.ArgumentNotNull(args.Request, "args.request");
Assert.ArgumentCondition(args.Request is GetProductBulkPricesRequest, "args.Request", "args.Request is GetProductBulkPricesRequest");
Assert.ArgumentCondition(args.Result is Sitecore.Commerce.Services.Prices.GetProductBulkPricesResult, "args.Result", "args.Result is GetProductBulkPricesResult");
GetProductBulkPricesRequest request = (GetProductBulkPricesRequest)args.Request;
Sitecore.Commerce.Services.Prices.GetProductBulkPricesResult result = (Sitecore.Commerce.Services.Prices.GetProductBulkPricesResult)args.Result;
Assert.ArgumentNotNull(request.ProductCatalogName, "request.ProductCatalogName");
Assert.ArgumentNotNull(request.ProductIds, "request.ProductIds");
Assert.ArgumentNotNull(request.PriceType, "request.PriceType");
bool isList = request.PriceTypeIds.FirstOrDefault(x => x.Equals(PriceTypes.List, StringComparison.OrdinalIgnoreCase)) != null;
bool isAdjusted = request.PriceTypeIds.FirstOrDefault(x => x.Equals(PriceTypes.Adjusted, StringComparison.OrdinalIgnoreCase)) != null;
bool isLowestPriceVariantSpecified = request.PriceTypeIds.FirstOrDefault(x => x.Equals(PriceTypes.LowestPricedVariant, StringComparison.OrdinalIgnoreCase)) != null;
bool isLowestPriceVariantListPriceSpecified = request.PriceTypeIds.FirstOrDefault(x => x.Equals(PriceTypes.LowestPricedVariantListPrice, StringComparison.OrdinalIgnoreCase)) != null;
bool isHighestPriceVariantSpecified = request.PriceTypeIds.FirstOrDefault(x => x.Equals(PriceTypes.HighestPricedVariant, StringComparison.OrdinalIgnoreCase)) != null;
var uniqueIds = request.ProductIds.ToList().Distinct();
var productSearchItemList = this.GetProductsFromIndex(request.ProductCatalogName, uniqueIds);
foreach (var productSearchItem in productSearchItemList)
{
var foundId = uniqueIds.SingleOrDefault(x => x == productSearchItem.Name);
if (foundId == null)
{
continue;
}
if (productSearchItem != null)
{
// SOLR returns 0 and not <null> for missing prices. We set the prices to null when 0 value is encountered.
decimal? listPrice = !productSearchItem.OtherFields.ContainsKey("listprice") ? (decimal?)null : ((decimal)productSearchItem.ListPrice == 0M ? (decimal?)null : (decimal)productSearchItem.ListPrice);
decimal? basePrice = !productSearchItem.OtherFields.ContainsKey("baseprice") ? (decimal?)null : ((decimal)productSearchItem.BasePrice == 0M ? (decimal?)null : (decimal)productSearchItem.BasePrice);
ExtendedCommercePrice extendedPrice = this.EntityFactory.Create<ExtendedCommercePrice>("Price");
// The product base price is the Connect "List" price.
if (isList)
{
if (basePrice.HasValue)
{
extendedPrice.Amount = basePrice.Value;
}
else
{
// No base price is defined, the List price is set to the actual ListPrice define in the catalog
extendedPrice.Amount = (listPrice.HasValue) ? listPrice.Value : 0M;
}
}
// The product list price is the Connect "Adjusted" price.
if (isAdjusted && listPrice.HasValue)
{
extendedPrice.ListPrice = listPrice.Value;
}
var variantInfoString = productSearchItem.VariantInfo;
if ((isLowestPriceVariantSpecified || isLowestPriceVariantListPriceSpecified || isHighestPriceVariantSpecified) && !string.IsNullOrWhiteSpace(variantInfoString))
{
List<VariantIndexInfo> variantIndexInfoList = JsonConvert.DeserializeObject<List<VariantIndexInfo>>(variantInfoString);
this.SetVariantPricesFromProductVariants(productSearchItem, variantIndexInfoList, extendedPrice, isLowestPriceVariantSpecified, isLowestPriceVariantListPriceSpecified, isHighestPriceVariantSpecified);
}
result.Prices.Add(foundId, extendedPrice);
}
}
}