private static ProductPrice GetItemPrice(RequestContext requestContext, string itemId, string inventDimId, string unitOfMeasure, string customerAcctNumber) { SalesTransaction salesTransaction = new SalesTransaction { Id = Guid.NewGuid().ToString(), CustomerId = customerAcctNumber, }; SalesLine salesLine = new SalesLine() { LineId = Guid.NewGuid().ToString("N"), ItemId = itemId, InventoryDimensionId = inventDimId, SalesOrderUnitOfMeasure = unitOfMeasure, Quantity = 1m, }; salesTransaction.SalesLines.Add(salesLine); GetIndependentPriceDiscountServiceRequest priceRequest = new GetIndependentPriceDiscountServiceRequest(salesTransaction); GetPriceServiceResponse pricingServiceResponse = requestContext.Execute <GetPriceServiceResponse>(priceRequest); SalesLine resultLine = pricingServiceResponse.Transaction.SalesLines[0]; ProductPrice productPrice = GetProductPrice( resultLine.ItemId, resultLine.InventoryDimensionId, resultLine.BasePrice, resultLine.AgreementPrice, resultLine.AdjustedPrice, requestContext.GetChannelConfiguration().Currency); return(productPrice); }
private static void RunDefaultTests() { var queryResultSettings = QueryResultSettings.FirstRecord; queryResultSettings.Paging = new PagingInfo(10); // query a page of customers var customer = CustomerManager.Create(runtime).GetCustomer(DefaultCustomerAccountNumber); Debug.WriteLine("Default Customer was ", (customer == null) ? "not found" : "found"); // query a page of products var products = ProductManager.Create(runtime).GetProducts(queryResultSettings); Debug.WriteLine("Found {0} product(s).", products.Results.Count); // query for pricing with PricingEngine SalesTransaction salesTransaction = new SalesTransaction(); salesTransaction.SalesLines.Add(ConstructSalesLine("0045")); GetPriceServiceRequest request = new GetPriceServiceRequest(salesTransaction); GetPriceServiceResponse response = runtime.Execute <GetPriceServiceResponse>(request, new RequestContext(runtime)); Debug.WriteLine("Price for first line item is {0}.", response.Transaction.ActiveSalesLines[0].Price); }
/// <summary> /// Executes the workflow for a get price check for a product. /// </summary> /// <param name="request">The request.</param> /// <returns>The response.</returns> protected override PriceCheckResponse Process(PriceCheckRequest request) { ThrowIf.Null(request, "request"); ItemBarcode itemBarcode = null; if (string.IsNullOrEmpty(request.Barcode) && string.IsNullOrEmpty(request.ItemId)) { throw new DataValidationException(DataValidationErrors.Microsoft_Dynamics_Commerce_Runtime_ItemIdBarcodeMissing, "Either an item identifier or barcode is required."); } if (string.IsNullOrEmpty(request.ItemId)) { GetProductBarcodeDataRequest dataRequest = new GetProductBarcodeDataRequest(request.Barcode); itemBarcode = this.Context.Runtime.Execute <GetProductBarcodeDataResponse>(dataRequest, this.Context).Barcode; } SalesTransaction salesTransaction = new SalesTransaction() { Id = Guid.NewGuid().ToString(), CustomerId = request.CustomerAccountNumber, }; SalesLine salesLine = new SalesLine() { ItemId = request.ItemId, InventoryDimensionId = request.InventoryDimensionId ?? itemBarcode.InventoryDimensionId, SalesOrderUnitOfMeasure = request.UnitOfMeasureSymbol ?? itemBarcode.UnitId, Quantity = 1m, LineId = Guid.NewGuid().ToString() }; salesTransaction.SalesLines.Add(salesLine); GetIndependentPriceDiscountServiceRequest priceRequest = new GetIndependentPriceDiscountServiceRequest(salesTransaction); GetPriceServiceResponse pricingServiceResponse = this.Context.Execute <GetPriceServiceResponse>(priceRequest); SalesLine resultLine = pricingServiceResponse.Transaction.SalesLines[0]; ProductPrice productPrice = GetProductPrice( resultLine.ItemId, resultLine.InventoryDimensionId, resultLine.BasePrice, resultLine.TotalAmount, this.Context.GetChannelConfiguration().Currency); var productPrices = new List <ProductPrice> { productPrice }; return(new PriceCheckResponse(productPrices.AsPagedResult())); }
/// <summary> /// Executes the workflow to retrieve the prices and calculated discount amount for the given product identifiers. /// </summary> /// <param name="request">The request.</param> /// <returns>The response.</returns> protected override GetIndependentProductPriceDiscountResponse Process(GetIndependentProductPriceDiscountRequest request) { ThrowIf.Null(request, "request"); ProductSearchCriteria productSearchCriteria = new ProductSearchCriteria( request.Context.ChannelId.GetValueOrDefault(), request.Context.CatalogId.GetValueOrDefault()) { DataLevel = CommerceEntityDataLevel.Standard, Ids = request.ProductIds.ToList() }; ProductSearchResultContainer productSearchResult = request.RequestContext.Runtime.Execute <ProductSearchServiceResponse>( new ProductSearchServiceRequest(productSearchCriteria, request.QueryResultSettings), request.RequestContext).ProductSearchResult; List <ProductPrice> productPrices = new List <ProductPrice>(request.ProductIds.Count()); // Create sales line for every product id there is in the request. List <SalesLine> salesLines = new List <SalesLine>(request.ProductIds.Count()); foreach (var product in productSearchResult.Results) { if (product.IsMasterProduct) { foreach (var variant in product.GetVariants()) { if (request.ProductIds.Contains(variant.DistinctProductVariantId)) { salesLines.Add(new SalesLine { ItemId = product.ItemId, Variant = variant, InventoryDimensionId = variant.InventoryDimensionId, SalesOrderUnitOfMeasure = product.Rules.DefaultUnitOfMeasure, LineId = System.Guid.NewGuid().ToString("N"), Quantity = 1, ProductId = variant.DistinctProductVariantId, CatalogId = request.Context.CatalogId.GetValueOrDefault() }); } } } else { salesLines.Add(new SalesLine { ItemId = product.ItemId, SalesOrderUnitOfMeasure = product.Rules.DefaultUnitOfMeasure, LineId = System.Guid.NewGuid().ToString("N"), Quantity = 1, ProductId = product.RecordId, CatalogId = request.Context.CatalogId.GetValueOrDefault() }); } } // Set the catalog ids on the sales lines. if (request.Context.CatalogId != null) { if (request.Context.CatalogId.Value > 0) { // If a specific catalogId is set on the context, add it to the catalogIds on the sales lines. foreach (var sl in salesLines) { sl.CatalogIds.Add(request.Context.CatalogId.Value); } } else { GetProductCatalogAssociationsDataRequest productCatalogAssociationRequest = new GetProductCatalogAssociationsDataRequest(salesLines.Select(p => p.ProductId)) { QueryResultSettings = QueryResultSettings.AllRecords }; ReadOnlyCollection <ProductCatalogAssociation> productCatalogs = request.RequestContext.Runtime.Execute <GetProductCatalogAssociationsDataResponse>( productCatalogAssociationRequest, request.RequestContext).CatalogAssociations; // If catalogId is 0, add all independent catalogs to the catalogIds on the sales lines. foreach (var sl in salesLines) { sl.CatalogIds.UnionWith(productCatalogs.Where(pc => pc.ProductRecordId == sl.ProductId).Select(pc => pc.CatalogRecordId)); } } } Collection <SalesAffiliationLoyaltyTier> affiliations = null; if (request.AffiliationLoyaltyTiers != null) { affiliations = new Collection <SalesAffiliationLoyaltyTier>((from alt in request.AffiliationLoyaltyTiers select new SalesAffiliationLoyaltyTier { AffiliationId = alt.AffiliationId, AffiliationType = alt.AffiliationType, LoyaltyTierId = alt.LoyaltyTierId, ReasonCodeLines = alt.ReasonCodeLines, CustomerId = alt.CustomerId, ChannelId = request.Context.ChannelId.GetValueOrDefault() }).ToList()); } SalesTransaction transaction = new SalesTransaction { SalesLines = new Collection <SalesLine>(salesLines), CustomerId = request.CustomerAccountNumber, AffiliationLoyaltyTierLines = affiliations }; // Calculate prices and discounts for sales lines GetIndependentPriceDiscountServiceRequest itemPriceDiscountServiceRequest = new GetIndependentPriceDiscountServiceRequest(transaction); GetPriceServiceResponse itemPriceServiceResponse = this.Context.Execute <GetPriceServiceResponse>(itemPriceDiscountServiceRequest); Dictionary <long, SalesLine> salesLineDictionary = itemPriceServiceResponse.Transaction.SalesLines.ToDictionary(sl => sl.ProductId); foreach (long productId in request.ProductIds) { SalesLine salesLine; if (!salesLineDictionary.TryGetValue(productId, out salesLine)) { salesLine = new SalesLine(); } ProductPrice productPrice = new ProductPrice { UnitOfMeasure = salesLine.SalesOrderUnitOfMeasure, ItemId = salesLine.ItemId, InventoryDimensionId = salesLine.InventoryDimensionId, BasePrice = salesLine.BasePrice, TradeAgreementPrice = salesLine.AgreementPrice, AdjustedPrice = salesLine.AdjustedPrice, DiscountAmount = salesLine.DiscountAmount, ProductId = productId, ChannelId = request.Context.ChannelId.GetValueOrDefault(), CatalogId = request.Context.CatalogId.GetValueOrDefault() }; productPrices.Add(productPrice); } return(new GetIndependentProductPriceDiscountResponse(productPrices.AsPagedResult())); }