private async Task <SuperHSMeProduct> ApplyBuyerPricing(SuperHSMeProduct superHsProduct, VerifiedUserContext user) { var defaultMarkupMultiplierRequest = GetDefaultMarkupMultiplier(user); var defaultMarkupMultiplier = await defaultMarkupMultiplierRequest; var markedupProduct = ApplyBuyerProductPricing(superHsProduct.Product, defaultMarkupMultiplier); var productCurrency = superHsProduct.Product.xp.Currency; var markedupSpecs = ApplySpecMarkups(superHsProduct.Specs.ToList(), defaultMarkupMultiplier, productCurrency); superHsProduct.Product = markedupProduct; superHsProduct.Specs = markedupSpecs; return(superHsProduct); }
public async Task <SuperHSMeProduct> Get(string id, VerifiedUserContext user) { var _product = _oc.Me.GetProductAsync <HSMeProduct>(id, user.AccessToken); var _specs = _oc.Me.ListSpecsAsync(id, null, null, user.AccessToken); var _variants = _oc.Products.ListVariantsAsync <HSVariant>(id, null, null, null, 1, 100, null); var unconvertedSuperHsProduct = new SuperHSMeProduct { Product = await _product, PriceSchedule = (await _product).PriceSchedule, Specs = (await _specs).Items, Variants = (await _variants).Items, }; return(await ApplyBuyerPricing(unconvertedSuperHsProduct, user)); }
public async Task <SuperHSMeProduct> Get(string id, DecodedToken decodedToken) { var _product = _oc.Me.GetProductAsync <HSMeProduct>(id, sellerID: _settings.OrderCloudSettings.MarketplaceID, accessToken: decodedToken.AccessToken); var _specs = _oc.Me.ListSpecsAsync(id, null, null, decodedToken.AccessToken); var _variants = _oc.Products.ListVariantsAsync <HSVariant>(id, null, null, null, 1, 100, null); var unconvertedSuperHsProduct = new SuperHSMeProduct { Product = await _product, PriceSchedule = (await _product).PriceSchedule, Specs = (await _specs).Items, Variants = (await _variants).Items, }; return(await ApplyBuyerPricing(unconvertedSuperHsProduct, decodedToken)); }
private async Task <SuperHSMeProduct> ApplyBuyerPricing(SuperHSMeProduct superHsProduct, VerifiedUserContext user) { var defaultMarkupMultiplierRequest = GetDefaultMarkupMultiplier(user); var exchangeRatesRequest = GetExchangeRatesForUser(user.AccessToken); await Task.WhenAll(defaultMarkupMultiplierRequest, exchangeRatesRequest); var defaultMarkupMultiplier = await defaultMarkupMultiplierRequest; var exchangeRates = await exchangeRatesRequest; var markedupProduct = ApplyBuyerProductPricing(superHsProduct.Product, defaultMarkupMultiplier, exchangeRates); var productCurrency = superHsProduct.Product.xp.Currency ?? CurrencySymbol.USD; var markedupSpecs = ApplySpecMarkups(superHsProduct.Specs.ToList(), productCurrency, exchangeRates); superHsProduct.Product = markedupProduct; superHsProduct.Specs = markedupSpecs; return(superHsProduct); }
public async Task <decimal> ValidateLineItemUnitCost(string orderID, SuperHSMeProduct product, List <HSLineItem> existingLineItems, HSLineItem li) { if (product.PriceSchedule.UseCumulativeQuantity) { int totalQuantity = li?.Quantity ?? 0; foreach (HSLineItem lineItem in existingLineItems) { if (li == null || !LineItemsMatch(li, lineItem)) { totalQuantity += lineItem.Quantity; } } decimal priceBasedOnQuantity = product.PriceSchedule.PriceBreaks.Last(priceBreak => priceBreak.Quantity <= totalQuantity).Price; var tasks = new List <Task>(); foreach (HSLineItem lineItem in existingLineItems) { // Determine markup for all specs for this existing line item decimal lineItemTotal = priceBasedOnQuantity + GetSpecMarkup(lineItem.Specs, product.Specs); if (lineItem.UnitPrice != lineItemTotal) { PartialLineItem lineItemToPatch = new PartialLineItem(); lineItemToPatch.UnitPrice = lineItemTotal; tasks.Add(_oc.LineItems.PatchAsync <HSLineItem>(OrderDirection.Incoming, orderID, lineItem.ID, lineItemToPatch)); } } await Task.WhenAll(tasks); // Return the item total for the li being added or modified return(li == null ? 0 : priceBasedOnQuantity + GetSpecMarkup(li.Specs, product.Specs)); } else { decimal lineItemTotal = 0; if (li != null) { // Determine price including quantity price break discount decimal priceBasedOnQuantity = product.PriceSchedule.PriceBreaks.Last(priceBreak => priceBreak.Quantity <= li.Quantity).Price; // Determine markup for the 1 line item lineItemTotal = priceBasedOnQuantity + GetSpecMarkup(li.Specs, product.Specs); } return(lineItemTotal); } }