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); }
//public static void UpdateSalePrices(IUnitOfWork db, // long styleItemId, // long saleId, // decimal newSalePrice, // decimal? newSFPSalePrice) //{ // var rateForMarketplace = RateHelper.GetRatesByStyleItemId(db, styleItemId); // var marketPrices = db.StyleItemSaleToMarkets.GetAll().Where(s => s.SaleId == saleId).ToList(); // foreach (var marketPrice in marketPrices) // { // if (marketPrice.SalePrice.HasValue) // { // var marketListings = db.StyleItemSaleToListings.GetAll().Where(l => l.SaleToMarketId == ) // marketPrice.SalePrice = RateHelper.CalculateForMarket((MarketType) marketPrice.Market, // marketPrice.MarketplaceId, // newSalePrice, // rateForMarketplace[MarketplaceKeeper.AmazonComMarketplaceId], // rateForMarketplace[MarketplaceKeeper.AmazonCaMarketplaceId], // rateForMarketplace[MarketplaceKeeper.AmazonUkMarketplaceId], // rateForMarketplace[MarketplaceKeeper.AmazonAuMarketplaceId], // RateService.GetMarketShippingAmount(MarketType.Amazon, MarketplaceKeeper.AmazonComMarketplaceId), // RateService.GetMarketShippingAmount((MarketType)marketPrice.Market, marketPrice.MarketplaceId), // RateService.GetMarketExtraAmount((MarketType)marketPrice.Market, marketPrice.MarketplaceId)); // } // } // db.Commit(); //} public static IList <MarketPriceEditViewModel> GetForStyleItemId(IUnitOfWork db, IDbFactory dbFactory, long styleItemId, decimal?initSalePrice, decimal?initSFPSalePrice) { var priceService = new PriceService(dbFactory); var results = new List <MarketPriceEditViewModel>(); var allMarketplaces = UIMarketHelper.GetSalesMarketplaces(); var allListings = db.Listings.GetListingsAsListingDto() .Where(l => l.StyleItemId == styleItemId) .ToList() .Where(l => !l.IsFBA) .ToList(); var rateForMarketplace = RateHelper.GetRatesByStyleItemId(db, styleItemId); var sale = db.StyleItemSales.GetAllAsDto().FirstOrDefault(s => s.StyleItemId == styleItemId && !s.IsDeleted); var checkedListings = new List <StyleItemSaleToListingDTO>(); if (sale != null) { checkedListings = db.StyleItemSaleToListings.GetAllAsDto().Where(s => s.SaleId == sale.Id).ToList(); } var checkedMarkets = new List <StyleItemSaleToMarketDTO>(); if (sale != null) { checkedMarkets = db.StyleItemSaleToMarkets.GetAllAsDto().Where(s => s.SaleId == sale.Id).ToList(); } foreach (var market in allMarketplaces) { var checkedMarket = checkedMarkets.FirstOrDefault(l => l.Market == (int)market.Market && (l.MarketplaceId == market.MarketplaceId || String.IsNullOrEmpty(market.MarketplaceId))); var marketListings = allListings .Where(l => l.Market == (int)market.Market && (l.MarketplaceId == market.MarketplaceId || String.IsNullOrEmpty(market.MarketplaceId))) .Select(l => new ListingPriceEditViewModel(l)) .ToList(); foreach (var listing in marketListings) { listing.IsChecked = sale == null ? ((listing.IsPrime || SkuHelper.IsPrime(listing.SKU)) ? initSFPSalePrice.HasValue : initSalePrice.HasValue) : checkedListings.Any(l => l.ListingId == listing.ListingId); } var defaultPrice = //sale == null && initSalePrice.HasValue && marketListings.Any() ? priceService.GetMarketDefaultPrice(initSalePrice.Value, market.Market, market.MarketplaceId, rateForMarketplace) : (decimal?)null; foreach (var marketListing in marketListings) { var newDefaultPrice = priceService.ApplyMarketSpecified(defaultPrice, initSFPSalePrice, market.Market, market.MarketplaceId, marketListing.Weight, marketListing.IsPrime, marketListing.IsFBA); if (newDefaultPrice != defaultPrice) { marketListing.OverrideSalePrice = newDefaultPrice; } } var saleToMarket = new MarketPriceEditViewModel() { Id = checkedMarket != null ? checkedMarket.Id : 0, Market = (MarketType)market.Market, MarketplaceId = market.MarketplaceId, MarketName = MarketHelper.GetMarketName((int)market.Market, market.MarketplaceId), MarketCurrency = PriceHelper.GetCurrencySymbol(market.Market, market.MarketplaceId), SalePrice = checkedMarket != null ? checkedMarket.SalePrice : defaultPrice, SFPSalePrice = market.MarketplaceId == MarketplaceKeeper.AmazonComMarketplaceId ? initSFPSalePrice : null, SalePercent = checkedMarket != null ? checkedMarket.SalePercent : null, ApplyToNewListings = checkedMarket != null ? checkedMarket.ApplyToNewListings : false, Listings = marketListings }; results.Add(saleToMarket); } return(results); }