/// <summary> /// Create Amazon envelope for the single eisProduct feed /// </summary> /// <param name="productPostFeed">The EIS eisProduct object</param> /// <param name="operationType">The type of Amazon operation</param> /// <returns></returns> public static AmazonEnvelope CreateSingleProductFeedEnvelope(MarketplaceProductFeedDto productPostFeed, AmazonEnvelopeMessageOperationType operationType) { // create Amazon envelope object var amazonEnvelope = new AmazonEnvelope { Header = new Header { DocumentVersion = "1.01", MerchantIdentifier = MerchantId }, MessageType = AmazonEnvelopeMessageType.Product, PurgeAndReplace = false, PurgeAndReplaceSpecified = true }; // create the eisProduct envelope message var envelopeMessages = new List <AmazonEnvelopeMessage>(); var message = new AmazonEnvelopeMessage { MessageID = "1", OperationType = operationType, OperationTypeSpecified = true, Item = createProductModelForAmazon(productPostFeed) }; // convert to array and set its message envelopeMessages.Add(message); amazonEnvelope.Message = envelopeMessages.ToArray(); return(amazonEnvelope); }
public FileStream GetSingleFeed(object feed, AmazonEnvelopeMessageType amazonEnvelopeMessageType, AmazonEnvelopeMessageOperationType?amazonEnvelopeMessageOperationType) { if (feed != null) { var message = new AmazonEnvelopeMessage { MessageID = "1", Item = feed }; if (amazonEnvelopeMessageOperationType != null) { message.OperationType = amazonEnvelopeMessageOperationType.Value; } var amazonEnvelope = new AmazonEnvelope { Header = new Header { DocumentVersion = "1.0", MerchantIdentifier = _amazonSellerSettings.SellerId }, MessageType = amazonEnvelopeMessageType, Message = new AmazonEnvelopeMessageCollection() { message } }; return(AmazonAppHelper.GetStream(amazonEnvelope, amazonEnvelopeMessageType)); } return(null); }
public FileStream GetFeed(IEnumerable<object> feeds, AmazonEnvelopeMessageType amazonEnvelopeMessageType, AmazonEnvelopeMessageOperationType? amazonEnvelopeMessageOperationType) { if (feeds != null && feeds.Any()) { var messages = new AmazonEnvelopeMessageCollection(); var msgCounter = 1; foreach (var feed in feeds) { var message = new AmazonEnvelopeMessage { MessageID = msgCounter.ToString(), Item = feed }; if (amazonEnvelopeMessageOperationType != null) message.OperationType = amazonEnvelopeMessageOperationType.Value; messages.Add(message); msgCounter++; } var amazonEnvelope = new AmazonEnvelope { Header = new Header { DocumentVersion = "1.0", MerchantIdentifier = _amazonSellerSettings.SellerId }, MessageType = amazonEnvelopeMessageType, Message = messages }; return AmazonAppHelper.GetStream(amazonEnvelope, amazonEnvelopeMessageType); } return null; }
public FileStream GetSingleFeed(object feed, AmazonEnvelopeMessageType amazonEnvelopeMessageType, AmazonEnvelopeMessageOperationType? amazonEnvelopeMessageOperationType) { if (feed != null) { var message = new AmazonEnvelopeMessage { MessageID = "1", Item = feed }; if (amazonEnvelopeMessageOperationType != null) message.OperationType = amazonEnvelopeMessageOperationType.Value; var amazonEnvelope = new AmazonEnvelope { Header = new Header { DocumentVersion = "1.0", MerchantIdentifier = _amazonSellerSettings.SellerId }, MessageType = amazonEnvelopeMessageType, Message = new AmazonEnvelopeMessageCollection(){message} }; return AmazonAppHelper.GetStream(amazonEnvelope, amazonEnvelopeMessageType); } return null; }
/// <summary> /// Create price feed envelope for items which have update pricing /// </summary> /// <param name="priceItems">The list of items which have updated pricing</param> /// <returns></returns> public static AmazonEnvelope CreatePriceFeedEnvelope(List <AmazonPriceFeed> priceItems) { // convert the categorized eisProduct into Price feed var priceFeeds = new List <Price>(); priceItems.ForEach(x => { var product = new Price { SKU = x.SKU, StandardPrice = new OverrideCurrencyAmount { currency = BaseCurrencyCodeWithDefault.USD, Value = x.StandardPrice } }; if (x.MapPrice > 0) { product.MAP = new OverrideCurrencyAmount { currency = BaseCurrencyCodeWithDefault.USD, Value = x.MapPrice }; } priceFeeds.Add(product); }); // create Amazon envelope object var amazonEnvelope = new AmazonEnvelope { Header = new Header { DocumentVersion = "1.01", MerchantIdentifier = MerchantId }, MessageType = AmazonEnvelopeMessageType.Price }; // add all Price feeds as messages to the envelope var envelopeMessages = new List <AmazonEnvelopeMessage>(); for (var i = 0; i < priceFeeds.Count; i++) { var message = new AmazonEnvelopeMessage { MessageID = string.Format("{0}", i + 1), Item = priceFeeds[i] }; envelopeMessages.Add(message); } // convert to array and set its message amazonEnvelope.Message = envelopeMessages.ToArray(); return(amazonEnvelope); }
public AmazonEnvelopeMessage BuildMessage(object item, int messageID) { AmazonEnvelopeMessage msg = new AmazonEnvelopeMessage(); msg.OperationTypeSpecified = true; msg.OperationType = AmazonEnvelopeMessageOperationType.Update; msg.Item = item; msg.MessageID = messageID.ToString(); return(msg); }
/// <summary> /// Create inventory feed for item's quantity /// </summary> /// <param name="inventoryItems">The list of items that are to have their quantities updated</param> /// <returns></returns> public static AmazonEnvelope CreateInventoryFeedEnvelope(List <AmazonInventoryFeed> inventoryItems) { // iterate to the EIS products and parsed it into Invetory Feed var inventories = new List <AmazonWebServiceModels.Inventory>(); inventoryItems.ForEach(x => { inventories.Add(new AmazonWebServiceModels.Inventory { SKU = x.SKU, Item = x.InventoryQuantity.ToString(), // set the default leadtime shipment to 3 days FulfillmentLatency = (x.LeadtimeShip ?? 0) == 0 ? "3" : x.LeadtimeShip.ToString(), }); }); // create Amazon envelope object var amazonEnvelope = new AmazonEnvelope { Header = new Header { DocumentVersion = "1.01", MerchantIdentifier = MerchantId }, MessageType = AmazonEnvelopeMessageType.Inventory }; // add all Inventory feeds as messages to the envelope var envelopeMessages = new List <AmazonEnvelopeMessage>(); for (var i = 0; i < inventories.Count; i++) { var message = new AmazonEnvelopeMessage { MessageID = string.Format("{0}", i + 1), OperationType = AmazonEnvelopeMessageOperationType.Update, Item = inventories[i] }; envelopeMessages.Add(message); } // convert to array and set its message amazonEnvelope.Message = envelopeMessages.ToArray(); return(amazonEnvelope); }
/// <summary> /// Create Amazon Envelope for the Amazon eisProduct specified /// </summary> /// <param name="products">The Amazon products to be created into Amazon envelope</param> /// <returns></returns> public static AmazonEnvelope CreateProductsFeedEnvelope(List <MarketplaceProductFeedDto> productPostFeeds, AmazonEnvelopeMessageOperationType operationType) { // create product post feed for Amazon var products = new List <AmazonWebServiceModels.Product>(); productPostFeeds.ForEach(feedItem => { products.Add(createProductModelForAmazon(feedItem)); }); // create Amazon envelope object var amazonEnvelope = new AmazonEnvelope { Header = new Header { DocumentVersion = "1.01", MerchantIdentifier = MerchantId }, MessageType = AmazonEnvelopeMessageType.Product, PurgeAndReplace = false, PurgeAndReplaceSpecified = true }; // iterate to all products to update and convert it to envelope message var envelopeMessages = new List <AmazonEnvelopeMessage>(); for (var i = 0; i < products.Count; i++) { var message = new AmazonEnvelopeMessage { MessageID = string.Format("{0}", i + 1), OperationType = operationType, OperationTypeSpecified = true, Item = products[i], }; envelopeMessages.Add(message); } // convert to array and set its message amazonEnvelope.Message = envelopeMessages.ToArray(); return(amazonEnvelope); }
private static AmazonEnvelope InstantiateEnvelope <T>(string merchantId, string marketplaceName, bool purgeAndReplace, List <T> messageItems, AmazonEnvelopeMessageType messageType, DateTime effectiveDate, AmazonEnvelopeMessageOperationType operationType = AmazonEnvelopeMessageOperationType.Update) where T : AmazonMessageChoice { var header = new Amazon.Header() { DocumentVersion = "1.0", MerchantIdentifier = merchantId }; var messageList = new List <AmazonEnvelopeMessage>(); var currentId = 1; foreach (var messageItem in messageItems) { var message = new AmazonEnvelopeMessage() { Item = messageItem, MessageID = currentId++.ToString(), OperationType = operationType }; messageList.Add(message); } var envelope = new AmazonEnvelope() { EffectiveDate = effectiveDate, Header = header, MarketplaceName = marketplaceName, MessageType = messageType, PurgeAndReplace = purgeAndReplace, Message = messageList }; return(envelope); }
public FileStream GetFeed(IEnumerable <object> feeds, AmazonEnvelopeMessageType amazonEnvelopeMessageType, AmazonEnvelopeMessageOperationType?amazonEnvelopeMessageOperationType) { if (feeds != null && feeds.Any()) { var messages = new AmazonEnvelopeMessageCollection(); var msgCounter = 1; foreach (var feed in feeds) { var message = new AmazonEnvelopeMessage { MessageID = msgCounter.ToString(), Item = feed }; if (amazonEnvelopeMessageOperationType != null) { message.OperationType = amazonEnvelopeMessageOperationType.Value; } messages.Add(message); msgCounter++; } var amazonEnvelope = new AmazonEnvelope { Header = new Header { DocumentVersion = "1.0", MerchantIdentifier = _amazonSellerSettings.SellerId }, MessageType = amazonEnvelopeMessageType, Message = messages }; return(AmazonAppHelper.GetStream(amazonEnvelope, amazonEnvelopeMessageType)); } return(null); }
public bool ConfirmOrdersShipment() { // init the Amazon order API var config = new MarketplaceWebServiceConfig { ServiceURL = "https://mws.amazonservices.com" }; config.SetUserAgentHeader(_ApplicationName, _Version, "C#"); var serviceClient = new MarketplaceWebServiceClient(_credential.AccessKeyId, _credential.SecretKey, config); var orderFulfillmentList = new List <OrderFulfillment>(); // get the unshipped orders with tracking number for confirming its shipment var unshippedOrderFeeds = _orderRepository.GetUnshippedOrdersForShipment(ChannelName); if (!unshippedOrderFeeds.Any()) { Console.WriteLine("No unshipped orders found from {0} for shipment confirmation.", ChannelName); return(true); } try { Console.WriteLine("Sending {0} orders for shipment confirmation...", unshippedOrderFeeds.Count); // create the order fulfillment unshippedOrderFeeds.ForEach(order => { // create fulfillment item list from the order items var fulfillmentItems = new List <OrderFulfillmentItem>(); foreach (var item in order.OrderItems) { fulfillmentItems.Add(new OrderFulfillmentItem { Item = item.OrderItemId, Quantity = item.Quantity.ToString() }); } // then, the order fulfillment information orderFulfillmentList.Add(new OrderFulfillment { Item = order.OrderId, FulfillmentDate = order.FulfillmentDate, FulfillmentData = new OrderFulfillmentFulfillmentData { Item = order.Carrier.Code, ShippingMethod = "Ground", // order.ShippingMethod, ShipperTrackingNumber = order.ShipperTrackingNumber }, Item1 = fulfillmentItems.ToArray() }); }); // iterate to the order fulfillment and add it into envelope message var envelopeMessages = new List <AmazonEnvelopeMessage>(); for (var i = 0; i < orderFulfillmentList.Count; i++) { var message = new AmazonEnvelopeMessage { MessageID = string.Format("{0}", i + 1), Item = orderFulfillmentList[i] }; envelopeMessages.Add(message); } // create Amazon envelope object var amazonEnvelope = new AmazonEnvelope { Header = new Header { DocumentVersion = "1.01", MerchantIdentifier = _credential.MerchantId }, MessageType = AmazonEnvelopeMessageType.OrderFulfillment, Message = envelopeMessages.ToArray() }; // let's add these orders to the shipment history addOrderShipmentHistoryAsync(unshippedOrderFeeds); // parse the envelope into file var xmlFullName = XmlParser.WriteXmlToFile(amazonEnvelope, "AmazonOrderFulfillment"); // create feed controller and send the confirmation shipment feed var submitController = new SubmitFeedController(serviceClient, _logger, _credential.MarketplaceId, _credential.MerchantId, _ApplicationName); var streamResponse = submitController.SubmitFeedAndGetResponse(xmlFullName, AmazonFeedType._POST_ORDER_FULFILLMENT_DATA_); parsedResultStreamAndLogReport(streamResponse, AmazonEnvelopeMessageType.OrderFulfillment, _ApplicationName); _logger.LogInfo(LogEntryType.AmazonOrdersProvider, string.Format("{1}:{2} - Successfully sent confirming order shipment for Order IDs: \"{0}\"", string.Join("\", \"", unshippedOrderFeeds.Select(x => x.OrderId)), ChannelName, _ApplicationName, Constants.APP_NAME)); Console.WriteLine("Successfully sent confirming order shipment for Order IDs: \"{0}\"", string.Join("\", \"", unshippedOrderFeeds.Select(x => x.OrderId))); return(true); } catch (Exception ex) { _logger.LogError(LogEntryType.AmazonOrdersProvider, string.Format("{0}:{4} Error in confirming order shipment for for Order IDs: \"{3}\". <br/>Error Message: {1} <br/> Access Key: {2}", ChannelName, (ex.InnerException != null ? string.Format("{0} <br/>Inner Message: {1}", ex.Message, ex.InnerException.Message) : ex.Message), _credential.AccessKeyId, string.Join("\", \"", unshippedOrderFeeds.Select(x => x.OrderId)), _ApplicationName), ex.StackTrace); Console.WriteLine("Error in sending shipment confirmation! Error Message: {0} \nStackTrace: {1} ", ex.Message, ex.StackTrace); // let's delete the order confirmation deleteOrderShipmentHistoryAsync(unshippedOrderFeeds); return(false); } }
private List <string> SendAmazonFeeds(List <List <object> > amazonUpdateList, AmazonEnvelopeMessageType messageType, AmazonFeedType feedType) { { var masterCounter = 1; var returnResult = new List <string>(); foreach (var amazonUpdateGroup in amazonUpdateList) { var amazonEnvelope = new AmazonEnvelope { Header = new Header { DocumentVersion = "1.01", MerchantIdentifier = _merchantId, }, MessageType = messageType, PurgeAndReplace = false, PurgeAndReplaceSpecified = true }; var updates = new List <AmazonEnvelopeMessage>(); var counter = 1; foreach (var amazonUpdate in amazonUpdateGroup) { var curUpdate = new AmazonEnvelopeMessage { MessageID = counter.ToString(), OperationType = AmazonEnvelopeMessageOperationType.Update, //OperationTypeSpecified = true, Item = amazonUpdate }; updates.Add(curUpdate); counter++; } amazonEnvelope.Message = updates.ToArray(); var xmlString = MarketplaceHelper.ParseObjectToXML(amazonEnvelope); var path = "D:\\logs\\"; var fileName = string.Format("Amazon{0}Feed_{1}{3}.{2}", messageType, masterCounter, "xml", DateTime.Now.Second); var documentFileName = Path.Combine(path, fileName); File.WriteAllText(documentFileName, xmlString); if (!File.Exists(documentFileName)) { throw new ArgumentException("SendFeed document not generated properly"); } var feedRequest = new SubmitFeedRequest { Merchant = _merchantId, MarketplaceIdList = new IdList { Id = new List <string>(new[] { _marketplaceId }) }, FeedType = feedType.ToString(), ContentType = new ContentType(MediaType.OctetStream), FeedContent = File.Open(documentFileName, FileMode.Open, FileAccess.Read) }; feedRequest.ContentMD5 = MarketplaceWebServiceClient.CalculateContentMD5(feedRequest.FeedContent); var feedConfig = new MarketplaceWebServiceConfig { ServiceURL = "https://mws.amazonservices.com" }; var feedService = new MarketplaceWebServiceClient(_awsAccessKey, _secretKey, "Demac", "1.01", feedConfig); var uploadSuccess = false; var retryCount = 0; while (!uploadSuccess) { try { var feedResponse = feedService.SubmitFeed(feedRequest); var submissionId = feedResponse.SubmitFeedResult.FeedSubmissionInfo.FeedSubmissionId; returnResult.Add(submissionId); uploadSuccess = true; masterCounter++; //Thread.Sleep(120000); } catch (Exception ex) { retryCount++; if (retryCount == 3) { break; } //Thread.Sleep(18000); if (ex.ToString().ToLowerInvariant().Contains("request is throttled")) { continue; } returnResult.Add(string.Format("ERROR: {0}", ex)); } } } return(returnResult); } }
public static SubmitFeedResponse SendAmazonFeeds(IMarketplaceWebServiceClient feedService, IEnumerable <Product> amazonUpdateList, AmazonEnvelopeMessageType messageType, AmazonFeedType feedType, string AmazonMerchantId, string AmazonMarketplaceId, string AmazonServiceUrl, string AmazonAccessKeyId, string AmazonSecretAccessKey) { //var requestResponse = new List<string>(); SubmitFeedResponse feedResponse = null; var amazonEnvelope = new AmazonEnvelope { Header = new Header { DocumentVersion = "1.01", MerchantIdentifier = AmazonMerchantId, }, MessageType = messageType }; var updates = new List <AmazonEnvelopeMessage>(); var counter = 1; foreach (var amazonUpdate in amazonUpdateList) { var curUpdate = new AmazonEnvelopeMessage { MessageID = counter.ToString(), Item = amazonUpdate }; updates.Add(curUpdate); counter++; } //add all update products to envelope's message amazonEnvelope.Message = updates.ToArray(); var serializer = new XmlSerializer(amazonEnvelope.GetType()); var stringReader = new StringWriter(); serializer.Serialize(stringReader, amazonEnvelope); var xmlResult = stringReader.ToString(); using (MemoryStream feedStream = new MemoryStream()) { serializer.Serialize(feedStream, amazonEnvelope); var feedRequest = new SubmitFeedRequest { Merchant = AmazonMerchantId, MarketplaceIdList = new IdList { Id = new List <string>(new[] { AmazonMarketplaceId }) }, FeedType = feedType.ToString(), ContentType = new ContentType(MediaType.OctetStream), FeedContent = feedStream }; // Calculating the MD5 hash value exhausts the stream, and therefore we must either reset the // position, or create another stream for the calculation. feedRequest.ContentMD5 = MarketplaceWebServiceClient.CalculateContentMD5(feedRequest.FeedContent); //var feedService = new MockMarketplaceWebServiceClient(); var uploadSuccess = false; var retryCount = 0; while (!uploadSuccess) { try { feedResponse = feedService.SubmitFeed(feedRequest); //var submissionId = feedResponse.SubmitFeedResult.FeedSubmissionInfo.FeedSubmissionId; //requestResponse.Add(submissionId); uploadSuccess = true; } catch (Exception ex) { //if sending not succeed after 3 attempts stop retrying retryCount++; if (retryCount == 3) { break; } //pause sending for 3 minutes Thread.Sleep(18000); if (ex.ToString().ToLowerInvariant().Contains("request is throttled")) { continue; } //requestResponse.Add(string.Format("ERROR: {0}", ex)); } } } return(feedResponse); }