Пример #1
0
        public void UpdateSoldPieces(IUnitOfWork db, StyleItemSale sale, DateTime when)
        {
            _log.Info("Update sold pices, Id=" + sale.Id);
            var saleListingIds = db.StyleItemSaleToListings.GetAllAsDto().Where(s => s.SaleId == sale.Id).Select(s => s.ListingId).ToList();

            //NOTE: no needed to check with SaleEndDate
            var saledPieces = db.QuantityHistories
                              .GetFiltered(h =>
                                           (h.Type == (int)QuantityChangeSourceType.NewOrder || h.Type == (int)QuantityChangeSourceType.OrderCancelled) &&
                                           saleListingIds.Contains(h.ListingId) &&
                                           h.CreateDate >= sale.SaleStartDate &&
                                           (!sale.SaleEndDate.HasValue || h.CreateDate <= sale.SaleEndDate))
                              .Sum(s => (int?)s.QuantityChanged) ?? 0;

            _log.Info("Update PiecesSoldOnSale, from=" + sale.PiecesSoldOnSale + ", to=" + saledPieces);
            sale.PiecesSoldOnSale           = saledPieces;
            sale.PiecesSoldOnSaleUpdateDate = when;
            db.Commit();
        }
Пример #2
0
        public void UpdateSale(IUnitOfWork db,
                               StyleItemSale sale,
                               bool isSaleEnd,
                               DateTime when)
        {
            _log.Info("Checking SaleEnd, saleId=" + sale.Id + ", isSaleEnd=" + isSaleEnd);

            var saleListingIds = db.StyleItemSaleToListings.GetAllAsDto()
                                 .Where(s => s.SaleId == sale.Id)
                                 .Select(s => s.ListingId)
                                 .ToList();
            var saleListings = db.Listings.GetAll().Where(l => saleListingIds.Contains(l.Id)).ToList();

            if (isSaleEnd)
            {
                foreach (var listing in saleListings)
                {
                    listing.PriceUpdateRequested = true;
                }

                sale.CloseDate = when;
                sale.IsDeleted = true;
            }

            if (!isSaleEnd)
            {
                //NOTE: Forse request price updated ones per day, in case of relist listing
                foreach (var listing in saleListings)
                {
                    if (!listing.LastPriceUpdatedOnMarket.HasValue ||
                        listing.LastPriceUpdatedOnMarket < when.AddDays(-1))
                    {
                        _log.Info("Request price update for=" + listing.ListingId +
                                  ", has sale, no updates more then one days");
                        listing.PriceUpdateRequested = true;
                    }
                }

                db.Commit();
            }
        }
Пример #3
0
        public long Apply(IUnitOfWork db,
                          IDbFactory dbFactory,
                          ILogService log,
                          ICacheService cache,
                          IPriceManager priceManager,
                          IStyleItemHistoryService styleItemHistory,
                          ISystemActionService actionService,
                          DateTime when,
                          long?by)
        {
            var style = db.Styles.Get(StyleId);

            style.UpdateDate = when;
            style.UpdatedBy  = by;

            style.ReSaveDate = when;
            style.ReSaveBy   = by;


            var excessiveShipmentAttr = db.StyleFeatureTextValues.GetAll().FirstOrDefault(sv => sv.StyleId == style.Id &&
                                                                                          sv.FeatureId == StyleFeatureHelper.EXCESSIVE_SHIPMENT);

            if (excessiveShipmentAttr == null)
            {
                excessiveShipmentAttr = new Core.Entities.Features.StyleFeatureTextValue()
                {
                    StyleId    = StyleId,
                    CreateDate = when,
                    CreatedBy  = by,
                    FeatureId  = StyleFeatureHelper.EXCESSIVE_SHIPMENT,
                };
                db.StyleFeatureTextValues.Add(excessiveShipmentAttr);
            }
            excessiveShipmentAttr.Value = ExcessiveShipmentAmount.HasValue ? ExcessiveShipmentAmount.ToString() : null;


            var wasAnyChanges       = false;
            var wasAnyMinMaxChanges = false;

            if (Sizes != null && Sizes.Any())
            {
                var styleItems = db.StyleItems.GetFiltered(si => si.StyleId == StyleId).ToList();

                foreach (var size in Sizes)  //Update prices (marking when/by)
                {
                    var    changeType         = PriceChangeSourceType.None;
                    string tag                = null;
                    bool   wasChanged         = false;
                    var    minMaxPriceChanged = false;

                    var styleItem = styleItems.FirstOrDefault(si => si.Id == size.StyleItemId);

                    if (styleItem != null)
                    {
                        StyleItemSale sale = size.SaleId.HasValue
                            ? db.StyleItemSales
                                             .GetAll()
                                             .FirstOrDefault(s => s.Id == size.SaleId.Value)
                            : null;

                        if (sale == null) //If no sale Id remove all exist sales (Remove Sale action was performed)
                        {
                            IList <StyleItemSale> saleList = db.StyleItemSales
                                                             .GetAll()
                                                             .Where(s => s.StyleItemId == styleItem.Id &&
                                                                    !s.IsDeleted)
                                                             .ToList();

                            foreach (var toRemove in saleList)
                            {
                                log.Info("Sale mark removed, saleId=" + toRemove.Id + ", Info=" +
                                         ToStringHelper.ToString(toRemove));
                                toRemove.IsDeleted = true;
                                db.Commit();

                                styleItemHistory.AddRecord(StyleItemHistoryTypes.RemoveSale, styleItem.Id,
                                                           new HistorySaleData()
                                {
                                    SaleStartDate = toRemove.SaleStartDate,
                                    SaleEndDate   = toRemove.SaleEndDate,
                                }, by);
                            }
                        }

                        var salePrice    = size.InitSalePrice ?? size.NewSalePrice;
                        var sfpSalePrice = size.InitSFPSalePrice ?? size.NewSFPSalePrice;

                        if (salePrice.HasValue ||
                            sfpSalePrice.HasValue)
                        {
                            //Get Default markets
                            var markets = MarketPriceEditViewModel.GetForStyleItemId(db,
                                                                                     dbFactory,
                                                                                     size.StyleItemId,
                                                                                     salePrice,
                                                                                     sfpSalePrice);

                            if ((SizePriceViewModel.SizeMarketApplyModes)size.MarketMode ==
                                SizePriceViewModel.SizeMarketApplyModes.OnlyAmazonUS)
                            {
                                markets = markets.Where(m => m.MarketplaceId == MarketplaceKeeper.AmazonComMarketplaceId).ToList();
                            }

                            //Save Default markets
                            if ((SizePriceViewModel.SizePriceApplyModes)size.ApplyMode ==
                                SizePriceViewModel.SizePriceApplyModes.Sale)
                            {
                                var results = MarketPriceEditViewModel.ApplySale(db,
                                                                                 log,
                                                                                 size.StyleItemId,
                                                                                 markets,
                                                                                 when,
                                                                                 by);

                                if (results.Any())
                                {
                                    var saleId = results[0].SaleId;
                                    sale = db.StyleItemSales.GetAll().FirstOrDefault(s => s.Id == saleId);
                                }
                            }
                        }


                        if ((SizePriceViewModel.SizePriceApplyModes)size.ApplyMode ==
                            SizePriceViewModel.SizePriceApplyModes.Permanent)
                        {
                            //Get Default markets
                            var markets = MarketPriceEditViewModel.GetForStyleItemId(db,
                                                                                     dbFactory,
                                                                                     size.StyleItemId,
                                                                                     salePrice,
                                                                                     sfpSalePrice);

                            if ((SizePriceViewModel.SizeMarketApplyModes)size.MarketMode ==
                                SizePriceViewModel.SizeMarketApplyModes.OnlyAmazonUS)
                            {
                                markets = markets.Where(m => m.MarketplaceId == MarketplaceKeeper.AmazonComMarketplaceId).ToList();
                            }

                            //NOTE: also mark exist sale as deleted
                            MarketPriceEditViewModel.ApplyPermanent(db,
                                                                    log,
                                                                    priceManager,
                                                                    size.StyleItemId,
                                                                    markets,
                                                                    when,
                                                                    by);

                            styleItemHistory.AddRecord(StyleItemHistoryTypes.AddPermanentSale, styleItem.Id,
                                                       new HistorySaleData()
                            {
                                SalePrice = salePrice
                            }, by);
                        }

                        if (sale != null)
                        {
                            //    if (size.NewSalePrice.HasValue)
                            //    {
                            //        log.Info("Updated sale price, saleId=" + sale.Id + ", to=" + size.NewSalePrice + ", SFP=" + size.NewSFPSalePrice);
                            //        MarketPriceEditViewModel.UpdateSalePrices(db,
                            //            size.StyleItemId,
                            //            sale.Id,
                            //            size.NewSalePrice.Value,
                            //            size.NewSFPSalePrice);
                            //    }

                            sale.SaleStartDate = size.SaleStartDate;
                            sale.SaleEndDate   = size.SaleEndDate;
                            sale.MaxPiecesMode = MaxPiecesOnSale.HasValue
                                ? (int)MaxPiecesOnSaleMode.ByStyle
                                : (int)MaxPiecesOnSaleMode.BySize;
                            sale.MaxPiecesOnSale = size.MaxPiecesOnSale ?? MaxPiecesOnSale;

                            db.Commit();

                            styleItemHistory.AddRecord(StyleItemHistoryTypes.AddSale, styleItem.Id,
                                                       new HistorySaleData()
                            {
                                SalePrice     = size.NewSalePrice,
                                SaleStartDate = size.SaleStartDate,
                                SaleEndDate   = size.SaleEndDate
                            }, by);
                        }

                        minMaxPriceChanged = styleItem.MinPrice != size.MinPrice ||
                                             styleItem.MaxPrice != size.MaxPrice;

                        if (minMaxPriceChanged)
                        {
                            styleItem.MinPrice = size.MinPrice;
                            styleItem.MaxPrice = size.MaxPrice;
                            db.Commit();
                        }

                        wasAnyMinMaxChanges = wasAnyMinMaxChanges || minMaxPriceChanged;
                    }
                }

                //NOTE: update all listing, ex. change price, start/end date, e.t.c.
                var styleListingIds = db.Listings.GetViewListingsAsDto(true)
                                      .Where(l => l.StyleId == StyleId)
                                      .Select(l => l.Id)
                                      .ToList();
                var dbListings = db.Listings.GetAll().Where(l => styleListingIds.Contains(l.Id)).ToList();
                foreach (var dbListing in dbListings)
                {
                    dbListing.PriceUpdateRequested = true;
                    if (wasAnyMinMaxChanges)
                    {
                        actionService.AddAction(db,
                                                SystemActionType.UpdateOnMarketProductPriceRule,
                                                dbListing.SKU,
                                                null,
                                                null,
                                                by);
                    }
                }
                db.Commit();
            }

            cache.RequestStyleIdUpdates(db,
                                        new List <long> {
                StyleId
            },
                                        UpdateCacheMode.IncludeChild,
                                        AccessManager.UserId);

            return(StyleId);
        }
Пример #4
0
        public static IList <MarketPriceViewViewModel> ApplySale(IUnitOfWork db,
                                                                 ILogService log,
                                                                 long styleItemId,
                                                                 IList <MarketPriceEditViewModel> markets,
                                                                 DateTime when,
                                                                 long?by)
        {
            var sale = db.StyleItemSales.GetAllAsDto().FirstOrDefault(s => s.StyleItemId == styleItemId &&
                                                                      !s.IsDeleted);

            if (sale == null)
            {
                log.Info("Create empty Sale");

                var dbSale = new StyleItemSale()
                {
                    SaleStartDate = when.Date,
                    StyleItemId   = styleItemId,
                    CreateDate    = when,
                    CreatedBy     = by,
                };
                db.StyleItemSales.Add(dbSale);
                db.Commit();

                sale = new StyleItemSaleDTO()
                {
                    Id          = dbSale.Id,
                    StyleItemId = styleItemId
                };
            }

            var marketDtos = markets
                             .Select(m => new StyleItemSaleToMarketDTO()
            {
                Id                 = m.Id,
                SaleId             = sale.Id,
                Market             = (int)m.Market,
                MarketplaceId      = m.MarketplaceId,
                SalePrice          = m.SalePrice,
                SFPSalePrice       = m.SFPSalePrice,
                SalePercent        = m.SalePercent,
                ApplyToNewListings = m.ApplyToNewListings,
            })
                             .ToList();

            log.Info("All marktes=" + marketDtos.Count);

            db.StyleItemSaleToMarkets.UpdateForSale(sale.Id,
                                                    marketDtos,
                                                    when,
                                                    by);


            var allCheckedListings = new List <StyleItemSaleToListingDTO>();

            foreach (var market in markets)
            {
                var marketDto = marketDtos.FirstOrDefault(m => m.Market == (int)market.Market &&
                                                          (m.MarketplaceId == market.MarketplaceId ||
                                                           String.IsNullOrEmpty(market.MarketplaceId)));
                if (marketDto != null)
                {
                    market.Id = marketDto.Id;
                }

                if (market.Listings != null)
                {
                    allCheckedListings.AddRange(
                        market.Listings
                        .Where(l => l.IsChecked)
                        .Select(l => new StyleItemSaleToListingDTO()
                    {
                        SaleToMarketId    = market.Id,
                        ListingId         = l.ListingId,
                        OverrideSalePrice = l.OverrideSalePrice
                    }).ToList());
                }
            }
            log.Info("Checked listings=" + allCheckedListings.Count);

            db.StyleItemSaleToListings.UpdateForSale(sale.Id,
                                                     allCheckedListings,
                                                     when,
                                                     by);

            return(marketDtos.Select(m => new MarketPriceViewViewModel(m)).ToList());
        }