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); }