Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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));
        }
Esempio n. 3
0
        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));
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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);
            }
        }