コード例 #1
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);
        }