Beispiel #1
0
        public ActionResult Report(string asin)
        {
            if (asin == null)
            {
                throw new ArgumentNullException("asin");
            }

            LookupProductRequest lookupProductRequest = new LookupProductRequest
            {
                ItemId        = asin,
                IdType        = IdType.ASIN,
                ResponseGroup = ResponseGroup.Medium
            };

            Task <LookupProductResponse> productTask = Task.Factory.StartNew(() => m_productAdvertisingApi.LookupProduct(lookupProductRequest));
            Task <Data.PriceHistory>     mostRecentPriceHistoryTask = Task.Factory.StartNew(() => m_amazonMwSdbService.GetMostRecentAsinPrice(asin));
            Task <FeePreview>            feePreviewTask             = Task.Factory.StartNew(() => m_amazonMwSdbService.GetFeePreviewForAsin(asin).FirstOrDefault());
            Task <decimal?> itemPriceTask = Task.Factory.StartNew(() => m_amazonMwSdbService.GetCostOfProductForAsin(asin));

            Task.WaitAll(new Task[] { productTask, mostRecentPriceHistoryTask, feePreviewTask, itemPriceTask, itemPriceTask });

            LookupProductResponse lookupProductResponse = productTask.Result;

            ProductPageViewModel viewModel = new ProductPageViewModel
            {
                Product         = lookupProductResponse.Product,
                ProductMetadata = lookupProductResponse.ProductMetadata
            };

            viewModel.Product.ASIN = asin;

            viewModel.CurrentPriceBreakdownData = GetPriceBreakdown(asin, lookupProductResponse.Product, mostRecentPriceHistoryTask.Result, feePreviewTask.Result, itemPriceTask.Result);

            return(View(viewModel));
        }
Beispiel #2
0
        public ActionResult Evaluate(string asin)
        {
            LookupProductRequest lookupProductRequest = new LookupProductRequest
            {
                ItemId        = asin,
                IdType        = IdType.ASIN,
                ResponseGroup = ResponseGroup.Medium
            };

            LookupProductResponse lookupProductResponse = m_productAdvertisingApi.LookupProduct(lookupProductRequest);

            ProductProfitabilityMetadata dimensions = null;

            if (lookupProductResponse != null)
            {
                Product product = lookupProductResponse.Product;

                ProductMetadata productMetadata = lookupProductResponse.ProductMetadata;

                dimensions = new ProductProfitabilityMetadata
                {
                    ASIN        = asin,
                    Length      = product.Length,
                    Width       = product.Width,
                    Height      = product.Height,
                    Weight      = product.Weight,
                    SellersRank = productMetadata.SalesRank
                };
            }

            return(View(dimensions));
        }
        public void GetShipmentData(GetShipmentRequest getShipmentRequest)
        {
            InboundShipmentContainer inboundShipmentContainer = m_mwsProductsApi
                                                                .GetInboundShipments(shipmentId: getShipmentRequest.ShipmentId)
                                                                .FirstOrDefault();

            if (inboundShipmentContainer == null)
            {
                throw new InvalidOperationException("ShipmentId not found.");
            }

            List <InboundShipmentItemAndDetails> inboundShipmentItemAndDetailses = new List <InboundShipmentItemAndDetails>();

            foreach (InboundShipmentItem inboundShipmentItem in inboundShipmentContainer.InboundShipmentItems)
            {
                LookupProductRequest lookupProductRequest = new LookupProductRequest
                {
                    ItemId        = inboundShipmentItem.FulfillmentNetworkSKU,
                    IdType        = IdType.ASIN,
                    ResponseGroup = ResponseGroup.Medium
                };

                LookupProductResponse response = m_productAdvertisingApi.LookupProduct(lookupProductRequest);

                Product product = response != null
                                        ? response.Product
                                        : null;

                InboundShipmentItemAndDetails inboundShipmentItemAndDetails = new InboundShipmentItemAndDetails(
                    inboundShipmentItem.FulfillmentNetworkSKU,
                    inboundShipmentItem.QuantityInCase,
                    inboundShipmentItem.QuantityReceived,
                    inboundShipmentItem.QuantityShipped,
                    inboundShipmentItem.SellerSKU,
                    product != null ? product.Name : string.Empty,
                    product != null ? product.ItemNumber : string.Empty,
                    product != null ? product.UPC : string.Empty);

                inboundShipmentItemAndDetailses.Add(inboundShipmentItemAndDetails);
            }

            int       lineNumberCounter = 0;
            DataTable shipmentItems     = inboundShipmentItemAndDetailses
                                          .OrderBy(o => o.SKU)
                                          .Select(s =>
            {
                lineNumberCounter++;
                s.LineNumber = lineNumberCounter;

                return(s);
            })
                                          .ToDataTable();

            using (ExcelPackage excel = new ExcelPackage())
            {
                ExcelWorksheet worksheet = excel.Workbook.Worksheets.Add(getShipmentRequest.ShipmentId);

                worksheet.Cells["A1"].LoadFromDataTable(shipmentItems, true);

                ExcelUtility.CreateExcelResponse(Response, excel, string.Format("Shipment_{0}", getShipmentRequest.ShipmentId));
            }
        }
Beispiel #4
0
        public void GetInventoryReport(InventoryReportRequest inventoryReportRequest)
        {
            DateTime endDate   = DateTime.UtcNow.Date;
            DateTime beginDate = endDate.AddDays(-inventoryReportRequest.DaysOrderAndInventoryHistoryToUse);

            // Find products that are associated with this manufacturer.
            Task <List <Product> >          productsTask           = Task.Factory.StartNew(() => m_amazonMwSdbService.GetProductsForManufacturer(inventoryReportRequest.ManufacturerId));
            Task <List <OrderSummary> >     ordersTask             = Task.Factory.StartNew(() => m_amazonMwSdbService.GetOrderSummaryForManufacturer(inventoryReportRequest.ManufacturerId, beginDate, endDate));
            Task <List <InventorySummary> > inventoryHistoriesTask = Task.Factory.StartNew(() => m_amazonMwSdbService.GetInventorySummaryForManufacturer(inventoryReportRequest.ManufacturerId, beginDate, endDate));

            Task.WaitAll(new Task[] { productsTask, ordersTask, inventoryHistoriesTask });

            List <Product> products = productsTask.Result
                                      .Where(w => w.ASIN != null)
                                      .ToList();

            Dictionary <string, LookupProductResponse> lookupProductResponses = products
                                                                                .Select(s => new
            {
                s.ASIN,
                LookupProductResponse = m_productAdvertisingApi.LookupProduct(new LookupProductRequest
                {
                    ItemId        = s.ASIN,
                    IdType        = IdType.ASIN,
                    ResponseGroup = ResponseGroup.Medium
                })
            })
                                                                                .ToDictionary(k => k.ASIN, v => v.LookupProductResponse);

            Dictionary <string, OrderSummary> groupedOrders = ordersTask.Result
                                                              .GroupBy(g => g.ASIN)
                                                              .ToDictionary(k => k.Key, v => v.Single());

            Dictionary <string, InventorySummary> inventorySummaries = inventoryHistoriesTask.Result
                                                                       .ToDictionary(k => k.ASIN, v => v);

            List <InventoryReportLine> inventoryReportLines = products.Select(
                s =>
            {
                InventoryReportLine inventoryReportLine = new InventoryReportLine
                {
                    Name           = s.Name,
                    ItemNumber     = s.ItemNumber,
                    ASIN           = s.ASIN,
                    SKU            = s.SKU,
                    Cost           = s.Cost,
                    QuantityInCase = s.QuantityInCase
                };

                if (s.ASIN != null)
                {
                    InventorySummary inventorySummary = null;
                    OrderSummary orderSummary         = null;

                    if (inventorySummaries.ContainsKey(s.ASIN))
                    {
                        inventorySummary = inventorySummaries[s.ASIN];

                        inventoryReportLine.CurrentAfnFulfillableQuantity = inventorySummary.CurrentAfnFulfillableQuantity;
                        inventoryReportLine.DaysInStockDuringTimeframe    = inventorySummary.DaysInStockDuringTimeframe;
                    }

                    if (groupedOrders.ContainsKey(s.ASIN))
                    {
                        orderSummary = groupedOrders[s.ASIN];

                        inventoryReportLine.QuantitySoldTimeframe       = orderSummary.TotalQuantity;
                        inventoryReportLine.TotalExtensionSoldTimeframe = orderSummary.TotalExtension;
                    }

                    if (inventorySummary != null && orderSummary != null)
                    {
                        int currentAfnFulfillableQuantity = inventorySummary.CurrentAfnFulfillableQuantity;

                        decimal quantitySoldPerDayInStock = inventorySummary.DaysInStockDuringTimeframe > 0
                                                                ? orderSummary.TotalQuantity / inventorySummary.DaysInStockDuringTimeframe
                                                                : 0;

                        inventoryReportLine.QuantitySoldPerDayInStock = Math.Round(quantitySoldPerDayInStock, 2);

                        int recommendedReorderQuantity = (int)Math.Round((quantitySoldPerDayInStock * (inventoryReportRequest.DaysToReorder + inventoryReportRequest.DaysLeadTime) - currentAfnFulfillableQuantity), 0);

                        inventoryReportLine.RecommendedReorderQuantity = recommendedReorderQuantity > 0
                                                                ? recommendedReorderQuantity
                                                                : 0;
                    }

                    LookupProductResponse lookupProductResponse = lookupProductResponses[s.ASIN];

                    if (lookupProductResponse != null && lookupProductResponse.ProductMetadata != null)
                    {
                        inventoryReportLine.SellersRank = lookupProductResponse.ProductMetadata.SalesRank;
                    }
                }

                return(inventoryReportLine);
            }).ToList();

            string fileName = string.Format("{0}_InventoryReport_{1}", inventoryReportRequest.ManufacturerName, DateTime.UtcNow.ToShortDateString());

            ExcelUtility.WriteExcelFileToResponse(Response, inventoryReportLines.OrderByDescending(o => o.CurrentAfnFulfillableQuantity), c_worksheet1Name, fileName);
        }
        public LookupProductResponse LookupProduct(LookupProductRequest lookupProductRequest)
        {
            LookupProductResponse lookProductResponse = null;
            ProductAdvApiResponse response;

            Dictionary <string, string> optionalParameters = new Dictionary <string, string>();

            if (lookupProductRequest.IdType == IdType.ItemNumber)
            {
                optionalParameters["Keywords"]    = lookupProductRequest.ItemId;
                optionalParameters["SearchIndex"] = lookupProductRequest.SearchIndex.ToString();

                if (lookupProductRequest.ParameterType.HasValue && lookupProductRequest.ParameterString != null)
                {
                    optionalParameters[lookupProductRequest.ParameterType.Value.ToString()] = lookupProductRequest.ParameterString;
                }

                optionalParameters["Operation"]     = Operation.ItemSearch.ToString();
                optionalParameters["SearchIndex"]   = lookupProductRequest.SearchIndex.ToString();
                optionalParameters["ResponseGroup"] = lookupProductRequest.ResponseGroup.ToString();

                response = SignAndIssueRequest(optionalParameters);

                if (!response.Errored)
                {
                    Product product = ItemSearchUtility.ReadItemSearchResponse(response.Nodes, lookupProductRequest.ItemId);
                    lookProductResponse = new LookupProductResponse(product, ProductSearchMethod.ItemNumber);
                }
            }
            else if (lookupProductRequest.IdType == IdType.ASIN)
            {
                optionalParameters["ItemId"]        = lookupProductRequest.ItemId;
                optionalParameters["IdType"]        = lookupProductRequest.IdType.ToString();
                optionalParameters["Operation"]     = Operation.ItemLookup.ToString();
                optionalParameters["ResponseGroup"] = lookupProductRequest.ResponseGroup.ToString();

                response = SignAndIssueRequest(optionalParameters);

                if (!response.Errored)
                {
                    ProductAndProductMetadata productAndProductMetadata = ItemLookupUtility.ReadAsinLookupResponse(response.Nodes);
                    lookProductResponse = new LookupProductResponse(productAndProductMetadata.Product, ProductSearchMethod.ASIN, productAndProductMetadata.ProductMetadata);
                }
            }
            else
            {
                optionalParameters["ItemId"]        = lookupProductRequest.ItemId;
                optionalParameters["IdType"]        = lookupProductRequest.IdType.ToString();
                optionalParameters["Operation"]     = Operation.ItemLookup.ToString();
                optionalParameters["SearchIndex"]   = lookupProductRequest.SearchIndex.ToString();
                optionalParameters["ResponseGroup"] = ResponseGroup.Medium.ToString();

                response = SignAndIssueRequest(optionalParameters);

                if (response != null && !response.Errored)
                {
                    ProductAndProductMetadata productAndProductMetadata = ItemLookupUtility.ReadAsinLookupResponse(response.Nodes);
                    lookProductResponse = new LookupProductResponse(productAndProductMetadata.Product, ProductSearchMethod.UPC, productAndProductMetadata.ProductMetadata);
                }
            }

            return(lookProductResponse);
        }
Beispiel #6
0
        public void EvaluatePriceList(PriceListFile priceListFile)
        {
            DataTable dt = ExcelUtility.ConvertExcelFileToDataTable(priceListFile.File);

            List <ManufacturerPriceListRowInput> manufacturerPriceListRowsInputs = dt.FromDataTableToList <ManufacturerPriceListRowInput>();

            // Price is always required.
            if (manufacturerPriceListRowsInputs.Any(a => !a.Price.HasValue))
            {
                throw new ArgumentException("Price must be set for all rows.");
            }

            // Need either UPC or ASIN.
            if (manufacturerPriceListRowsInputs.Any(a => a.ASIN == null && a.UPC == null))
            {
                throw new ArgumentException("ASIN or UPC must be set for all rows.");
            }

            List <ManufacturerPriceListRowOutput> manufacturerPriceListRowsOutputs = new List <ManufacturerPriceListRowOutput>();

            // Only lookup rows where either ASIN or UPC is set.
            foreach (ManufacturerPriceListRowInput manufacturerPriceListRow in manufacturerPriceListRowsInputs
                     .Where(w => !w.ASIN.IsNullOrEmptyTrimmed() || !w.UPC.IsNullOrEmptyTrimmed()))
            {
                LookupProductRequest lookupProductRequest = new LookupProductRequest
                {
                    SearchIndex   = priceListFile.SearchIndex,
                    ResponseGroup = ResponseGroup.Medium
                };

                if (manufacturerPriceListRow.ASIN != null)
                {
                    lookupProductRequest.IdType = IdType.ASIN;
                    lookupProductRequest.ItemId = manufacturerPriceListRow.ASIN;
                }
                else
                {
                    lookupProductRequest.IdType = IdType.UPC;
                    lookupProductRequest.ItemId = manufacturerPriceListRow.UPC;
                }

                LookupProductResponse lookupProductResponse = m_productAdvertisingApi.LookupProduct(lookupProductRequest);

                if (lookupProductResponse != null)
                {
                    Product product = lookupProductResponse.Product;

                    Listing listing = m_amazonApiClient.GetAllListingsForAsin(new[] { product.ASIN }).FirstOrDefault();

                    decimal?breakEven           = null;
                    decimal?profitMargin        = null;
                    decimal?lowestPrice         = null;
                    string  sellersRankCategory = null;

                    if (listing != null)
                    {
                        lowestPrice         = listing.LowestPrice;
                        sellersRankCategory = listing.SellersRankCategory;
                    }

                    if (product.Length.HasValue && product.Width.HasValue && product.Height.HasValue && product.Weight.HasValue)
                    {
                        DimensionContainer dimensionContainer = new DimensionContainer(
                            product.Length.Value,
                            product.Width.Value,
                            product.Height.Value,
                            product.Weight.Value);

                        breakEven = FeeStructureUtility.CalculateBreakEven(
                            dimensionContainer,
                            priceListFile.FeeCategory,
                            manufacturerPriceListRow.Price.Value);

                        if (lowestPrice.HasValue && lowestPrice.Value > 0)
                        {
                            profitMargin = FeeStructureUtility.CalculateProfitMargin(
                                dimensionContainer,
                                priceListFile.FeeCategory,
                                lowestPrice.Value,
                                manufacturerPriceListRow.Price.Value);
                        }
                    }

                    ManufacturerPriceListRowOutput manufacturerPriceListRowOutput = new ManufacturerPriceListRowOutput
                    {
                        ASIN                = product.ASIN,
                        UPC                 = manufacturerPriceListRow.UPC,
                        ProductName         = product.Name,
                        SellersRank         = lookupProductResponse.ProductMetadata.SalesRank,
                        SellersRankCategory = sellersRankCategory,
                        Category            = lookupProductResponse.ProductMetadata.ProductGroup,
                        Price               = manufacturerPriceListRow.Price.Value,
                        BreakEven           = breakEven.HasValue
                                                        ? breakEven.Value.ToString("F", CultureInfo.InvariantCulture)
                                                        : null,
                        LowestPrice = lowestPrice.HasValue
                                                        ? lowestPrice.Value.ToString("F", CultureInfo.InvariantCulture)
                                                        : null,
                        ProfitMargin = profitMargin.HasValue
                                                        ? string.Format("{0:0.00%}", profitMargin.Value)
                                                        : null
                    };

                    manufacturerPriceListRowsOutputs.Add(manufacturerPriceListRowOutput);
                }
            }

            ExcelUtility.WriteExcelFileToResponse(Response, manufacturerPriceListRowsOutputs, c_worksheetName, priceListFile.File.FileName);
        }