示例#1
0
        public async Task <List <HSShipmentWithItems> > ListHSShipmentWithItems(string orderID, DecodedToken decodedToken)
        {
            var order = await _oc.Orders.GetAsync <HSOrder>(OrderDirection.Incoming, orderID);

            await EnsureUserCanAccessOrder(order, decodedToken);

            var lineItems = await _oc.LineItems.ListAllAsync(OrderDirection.Incoming, orderID);

            var shipments = await _oc.Orders.ListShipmentsAsync <HSShipmentWithItems>(OrderDirection.Incoming, orderID);

            var shipmentsWithItems = await Throttler.RunAsync(shipments.Items, 100, 5, (HSShipmentWithItems shipment) => GetShipmentWithItems(shipment, lineItems.ToList()));

            return(shipmentsWithItems.ToList());
        }
示例#2
0
        public async Task <HSOrder> AddPromotion(string orderID, string promoCode, DecodedToken decodedToken)
        {
            var orderPromo = await _oc.Orders.AddPromotionAsync(OrderDirection.Incoming, orderID, promoCode);

            return(await _oc.Orders.GetAsync <HSOrder>(OrderDirection.Incoming, orderID));
        }
示例#3
0
        public async Task <HSSupplierOrderData> GetSupplierOrderData(string supplierOrderID, DecodedToken decodedToken)
        {
            var orderData = await _supplierSync.GetOrderAsync(supplierOrderID, decodedToken);

            return((HSSupplierOrderData)orderData.ToObject(typeof(HSSupplierOrderData)));
        }
示例#4
0
        public async Task <HSSupplier> UpdateSupplier(string supplierID, PartialSupplier supplier, DecodedToken decodedToken)
        {
            var me = await _oc.Me.GetAsync(accessToken : decodedToken.AccessToken);

            Require.That(decodedToken.CommerceRole == CommerceRole.Seller || supplierID == me.Supplier.ID, new ErrorCode("Unauthorized", 401, $"You are not authorized to update supplier {supplierID}"));
            var currentSupplier = await _oc.Suppliers.GetAsync <HSSupplier>(supplierID);

            var updatedSupplier = await _oc.Suppliers.PatchAsync <HSSupplier>(supplierID, supplier);

            // Update supplier products only on a name change
            if (currentSupplier.Name != supplier.Name || currentSupplier.xp.Currency.ToString() != supplier.xp.Currency.Value)
            {
                var productsToUpdate = await _oc.Products.ListAllAsync <HSProduct>(
                    supplierID : supplierID,
                    accessToken : decodedToken.AccessToken
                    );

                ApiClient supplierClient = await _apiClientHelper.GetSupplierApiClient(supplierID, decodedToken.AccessToken);

                if (supplierClient == null)
                {
                    throw new Exception($"Default supplier client not found. SupplierID: {supplierID}");
                }
                var configToUse = new OrderCloudClientConfig
                {
                    ApiUrl       = decodedToken.ApiUrl,
                    AuthUrl      = decodedToken.AuthUrl,
                    ClientId     = supplierClient.ID,
                    ClientSecret = supplierClient.ClientSecret,
                    GrantType    = GrantType.ClientCredentials,
                    Roles        = new[]
                    {
                        ApiRole.SupplierAdmin,
                        ApiRole.ProductAdmin
                    },
                };
                var ocClient = new OrderCloudClient(configToUse);
                await ocClient.AuthenticateAsync();

                var token = ocClient.TokenResponse.AccessToken;
                foreach (var product in productsToUpdate)
                {
                    product.xp.Facets["supplier"] = new List <string>()
                    {
                        supplier.Name
                    };
                    product.xp.Currency = supplier.xp.Currency;
                }
                await Throttler.RunAsync(productsToUpdate, 100, 5, product => ocClient.Products.SaveAsync(product.ID, product, accessToken: token));
            }

            return(updatedSupplier);
        }
示例#5
0
        private async Task <SuperHSMeProduct> ApplyBuyerPricing(SuperHSMeProduct superHsProduct, DecodedToken decodedToken)
        {
            var defaultMarkupMultiplierRequest = GetDefaultMarkupMultiplier(decodedToken);
            var exchangeRatesRequest           = GetExchangeRatesForUser(decodedToken.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);
        }
示例#6
0
        public async Task <ListPageWithFacets <HSMeProduct> > List(ListArgs <HSMeProduct> args, DecodedToken decodedToken)
        {
            var searchText   = args.Search ?? "";
            var searchFields = args.Search != null ? "ID,Name,Description,xp.Facets.supplier" : "";
            var sortBy       = args.SortBy.FirstOrDefault();
            var filters      = string.IsNullOrEmpty(args.ToFilterString()) ? null : args.ToFilterString();
            var meProducts   = await _oc.Me.ListProductsAsync <HSMeProduct>(filters : filters, page : args.Page, search : searchText, searchOn : searchFields, searchType : SearchType.ExactPhrasePrefix, sortBy : sortBy, sellerID : _settings.OrderCloudSettings.MarketplaceID, accessToken : decodedToken.AccessToken);

            if (!(bool)(meProducts?.Items?.Any()))
            {
                meProducts = await _oc.Me.ListProductsAsync <HSMeProduct>(filters : filters, page : args.Page, search : searchText, searchOn : searchFields, searchType : SearchType.AnyTerm, sortBy : sortBy, sellerID : _settings.OrderCloudSettings.MarketplaceID, accessToken : decodedToken.AccessToken);

                if (!(bool)(meProducts?.Items?.Any()))
                {
                    //if no products after retry search, avoid making extra calls for pricing details
                    return(meProducts);
                }
            }

            var defaultMarkupMultiplierRequest = GetDefaultMarkupMultiplier(decodedToken);
            var exchangeRatesRequest           = GetExchangeRatesForUser(decodedToken.AccessToken);
            await Task.WhenAll(defaultMarkupMultiplierRequest, exchangeRatesRequest);

            var defaultMarkupMultiplier = await defaultMarkupMultiplierRequest;
            var exchangeRates           = await exchangeRatesRequest;

            meProducts.Items = meProducts.Items.Select(product => ApplyBuyerProductPricing(product, defaultMarkupMultiplier, exchangeRates)).ToList();

            return(meProducts);
        }
        private async Task EnsureUserCanManageLocationResaleCert(string locationID, DecodedToken decodedToken)
        {
            var hasAccess = await _locationPermissionCommand.IsUserInAccessGroup(locationID, UserGroupSuffix.ResaleCertAdmin.ToString(), decodedToken);

            Require.That(hasAccess, new ErrorCode("Insufficient Access", 403, $"User cannot manage resale certs for: {locationID}"));
        }
        public async Task <TaxCertificate> UpdateAsync(string locationID, TaxCertificate cert, DecodedToken decodedToken)
        {
            await EnsureUserCanManageLocationResaleCert(locationID, decodedToken);

            var buyerID = locationID.Split('-')[0];
            var address = await _oc.Addresses.GetAsync <HSAddressBuyer>(buyerID, locationID);

            Require.That(address.xp.AvalaraCertificateID == cert.ID, new ErrorCode("Insufficient Access", 403, $"User cannot modofiy this cert"));
            var updatedCert = await _avalara.UpdateCertificateAsync(cert.ID, cert, address);

            return(updatedCert);
        }
        public async Task <TaxCertificate> CreateAsync(string locationID, TaxCertificate cert, DecodedToken decodedToken)
        {
            await EnsureUserCanManageLocationResaleCert(locationID, decodedToken);

            var buyerID = locationID.Split('-')[0];
            var address = await _oc.Addresses.GetAsync <HSAddressBuyer>(buyerID, locationID);

            var createdCert = await _avalara.CreateCertificateAsync(cert, address);

            var newAddressXP = new
            {
                AvalaraCertificateID         = createdCert.ID,
                AvalaraCertificateExpiration = createdCert.ExpirationDate
            };
            var addressPatch = new PartialAddress
            {
                xp = newAddressXP
            };
            await _oc.Addresses.PatchAsync(buyerID, locationID, addressPatch);

            return(createdCert);
        }
示例#10
0
        public async Task <BuyerCreditCard> MeTokenizeAndSave(OrderCloudIntegrationsCreditCardToken card, DecodedToken decodedToken)
        {
            var buyerCreditCard = await _oc.Me.CreateCreditCardAsync(await MeTokenize(card, decodedToken.AccessToken), decodedToken.AccessToken);

            return(buyerCreditCard);
        }
示例#11
0
        public async Task <CreditCard> TokenizeAndSave(string buyerID, OrderCloudIntegrationsCreditCardToken card, DecodedToken decodedToken)
        {
            var creditCard = await _oc.CreditCards.CreateAsync(buyerID, await Tokenize(card, decodedToken.AccessToken), decodedToken.AccessToken);

            return(creditCard);
        }