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()); }
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)); }
public async Task <HSSupplierOrderData> GetSupplierOrderData(string supplierOrderID, DecodedToken decodedToken) { var orderData = await _supplierSync.GetOrderAsync(supplierOrderID, decodedToken); return((HSSupplierOrderData)orderData.ToObject(typeof(HSSupplierOrderData))); }
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); }
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); }
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); }
public async Task <BuyerCreditCard> MeTokenizeAndSave(OrderCloudIntegrationsCreditCardToken card, DecodedToken decodedToken) { var buyerCreditCard = await _oc.Me.CreateCreditCardAsync(await MeTokenize(card, decodedToken.AccessToken), decodedToken.AccessToken); return(buyerCreditCard); }
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); }