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