public async Task <IActionResult> GetMultiSetPriceByParts(
     [FromQuery(Name = "sets")] string setNumberString,
     [FromQuery(Name = "state")] StateType stateType,
     [FromQuery(Name = "price")] PriceFormationType priceFormationType
     )
 {
     return(Ok());
 }
Exemplo n.º 2
0
        public static PriceGuideType GetPriceGuide(PriceFormationType type)
        {
            switch (type)
            {
            case PriceFormationType.AverageRecentlySoldLimited:
                return(PriceGuideType.SoldItems);

            case PriceFormationType.AverageInStockLimited:
                return(PriceGuideType.StockItems);

            default:
                throw new NotImplementedException();
            }
        }
        public async Task <IActionResult> GetSetPriceByParts(
            [FromRoute] string setNumber,
            [FromQuery(Name = "state")] StateType stateType,
            [FromQuery(Name = "price")] PriceFormationType priceFormationType
            )
        {
            var set = await setRepository.UpdateAndGetByNumber(setNumber);

            #region Process Set Parts

            var timer = new Stopwatch();
            timer.Start();
            var partsOfSet = await partOfSetRepository.UpdateAndGetSetParts(set);

            var parallelPartsTime = timer.Elapsed;
            timer.Stop();


            decimal sum       = 0;
            var     priceList = new List <(string Number, Color Color, decimal Price)>();


            timer.Restart();
            var selectedParts = partsOfSet.Where(p => !p.IsCounterpart && !p.IsAlternate);
            var parallelTasks = selectedParts.Select(p => ProcessPartPrice(p, stateType, priceFormationType));

            var taskResults = (await Task.WhenAll(parallelTasks))
                              .Where(i => i.Item2 != default)
                              .ToArray();
            priceList.AddRange(taskResults.Select(r => r.Item2));
            sum = taskResults.Sum(i => i.Item1);

            var parallelPricesTime = timer.Elapsed;
            timer.Stop();

            #endregion


            return(Ok(new
            {
                SetNumber = setNumber,
                PriceFormation = priceFormationType.ToString(),
                Sum = sum,
                Detailed = priceList
                           .OrderByDescending(item => item.Price)
                           .Select(p => new { p.Number, p.Color, Price = Math.Round(p.Price, 4) })
                           .ToArray()
            }));
        }
        public async Task UpdatePartPrices(Part part, PriceFormationType priceFormation)
        {
            throw new NotImplementedException();

            /*
             * // ToDo: think about deleting old data
             *
             * var guide = BrickLinkUtils.GetPriceGuide(priceFormation);
             *
             *
             * switch (priceFormation)
             * {
             *      case PriceFormationType.AverageRecentlySoldLimited:
             *
             *              var soldUsedData = await ExecutePartPriceRequest<PriceSoldDetail>(part, StateType.Used, guide);
             *              var soldNewData = await ExecutePartPriceRequest<PriceSoldDetail>(part, StateType.New, guide);
             *
             *              var usedOrderPriceData = soldUsedData.Data.PriceDetail
             *                      .OrderByDescending(data => data.DateOrdered)
             *                      .Take(10)
             *                      .Select(data => new OrderPriceData
             *                      {
             *                              PartId = part.Id,
             *                              State = StateType.Used,
             *                              Quantity = data.Quantity,
             *                              Price = new Price
             *                              {
             *                                      Currency = soldUsedData.Data.Currency,
             *                                      Value = Math.Round(data.UnitPrice, 4)
             *                              },
             *                              Date = data.DateOrdered
             *                      });
             *              var newOrderPriceData = soldNewData.Data.PriceDetail
             *                      .OrderByDescending(data => data.DateOrdered)
             *                      .Take(10)
             *                      .Select(data => new OrderPriceData
             *                      {
             *                              PartId = part.Id,
             *                              State = StateType.New,
             *                              Quantity = data.Quantity,
             *                              Price = new Price
             *                              {
             *                                      Currency = soldNewData.Data.Currency,
             *                                      Value = Math.Round(data.UnitPrice, 4)
             *                              },
             *                              Date = data.DateOrdered
             *                      });
             *
             *              await orderPriceDataRepository.InsertMany(usedOrderPriceData.Union(newOrderPriceData));
             *
             *              break;
             *
             *      case PriceFormationType.AverageInStockLimited:
             *
             *              var stockUsedData = await ExecutePartPriceRequest<PriceStockDetail>(part, StateType.Used, guide);
             *              var stockNewData = await ExecutePartPriceRequest<PriceStockDetail>(part, StateType.New, guide);
             *
             *              var usedStockPriceData = stockUsedData.Data.PriceDetail
             *                      .OrderBy(data => data.UnitPrice)
             *                      .Take(10)
             *                      .Select(data => new StockPriceData
             *                      {
             *                              PartId = part.Id,
             *                              State = StateType.Used,
             *                              Quantity = data.Quantity,
             *                              Price = new Price
             *                              {
             *                                      Currency = stockUsedData.Data.Currency,
             *                                      Value = Math.Round(data.UnitPrice, 4)
             *                              },
             *                              DateCollected = DateTime.Today
             *                      });
             *              var newStockPriceData = stockNewData.Data.PriceDetail
             *                      .OrderBy(data => data.UnitPrice)
             *                      .Take(10)
             *                      .Select(data => new StockPriceData
             *                      {
             *                              PartId = part.Id,
             *                              State = StateType.New,
             *                              Quantity = data.Quantity,
             *                              Price = new Price
             *                              {
             *                                      Currency = stockNewData.Data.Currency,
             *                                      Value = Math.Round(data.UnitPrice, 4)
             *                              },
             *                              DateCollected = DateTime.Today
             *                      });
             *
             *
             *              await stockPriceDataRepository.InsertMany(usedStockPriceData.Union(newStockPriceData));
             *
             *              break;
             *
             *      default:
             *              throw new NotImplementedException(priceFormation.ToString());
             * }*/
        }
        private async Task <(decimal, (string Number, Color Color, decimal Price))> ProcessPartPrice(PartOfSet setPart, StateType stateType, PriceFormationType priceFormationType)
        {
            var part = await partRepository.Get(setPart.PartId);

            // Skip Used Stickers
            if (part.IsSticker && stateType == StateType.Used)
            {
                return(0m, default);