Exemple #1
0
        /// <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);
        }
Exemple #2
0
        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;
        }
Exemple #5
0
        /// <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);
        }
Exemple #6
0
        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);
        }
Exemple #7
0
        /// <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);
        }
Exemple #8
0
        /// <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);
        }
Exemple #9
0
        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);
        }
Exemple #10
0
        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);
        }
Exemple #11
0
        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);
            }
        }
Exemple #13
0
        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);
        }