/// <summary> /// Возвращает объявления с всей необходимой информацией для представлений /// </summary> /// <param name="adIds"></param> /// <returns></returns> public static List <Ad> GetAdsForView(int currentUserId, List <int> adIds = null, List <Ad> ads = null, bool needInvitedUserIds = false, bool needSender = false) { if (adIds == null && ads == null) { throw new ArgumentNullException("Нужно передать или adIds или ads"); } if (ads == null) { ads = AdsDAL.GetAds(ids: adIds); } else { adIds = ads.Select(a => a.Id).Distinct().ToList(); } ads.ForEach(f => f.City = TownsDAL.GetTown(f.CityId)); //города кэшируются внутри TownsDAL, запросов в БД нет var smallMainPhotos = PhotosDAL.GetPhotos(adIds: adIds, maxWidth: 300); var userFavoriteAds = UserFavoriteAdsDAL.GetUserFavoriteAds(adIds: adIds); var offersForAds = OffersDAL.GetOffers(adIds: adIds); var adProductsForads = AdProductsDAL.GetAdProducts(adIds: adIds); var allProductCategories = ProductCategoriesDAL.GetCategories(); foreach (var ad in ads) { var smallMainPhoto = smallMainPhotos.FirstOrDefault(p => p.AdId == ad.Id); ad.SmallPhotoUrl = smallMainPhoto != null ? smallMainPhoto.Url : PhotoHelper.NoLogoImageUrl; ad.FavoritesCount = userFavoriteAds.Count(a => a.AdId == ad.Id); ad.IsInFavorites = userFavoriteAds.Any(f => f.AdId == ad.Id && f.UserId == currentUserId); ad.Offers = offersForAds.Where(o => o.AdId == ad.Id).ToList(); ad.Products = adProductsForads.Where(ap => ap.AdId == ad.Id).ToList(); if (ad.Products.Any()) { #region Заполнение описания System.Text.StringBuilder productCategoryNames = new System.Text.StringBuilder(); var adProductCategoryIds = ad.Products.Select(p => p.ProductCategoryId).ToList(); var adProductCategories = allProductCategories .Where(c => adProductCategoryIds.Any(id => c.Id == id)) .OrderBy(c => c.Id).ToList(); ad.ProductCategoryNames = ""; if (adProductCategories.Any()) { var level1Categories = new List <ProductCategory>(); //категории 1-го уровня для всех категорий, выбранных в объявлении #region Заполним level1Categories foreach (var category in adProductCategories) { var level1CategoryIds = level1Categories.Select(c => c.Id).ToList(); if (category.Level == 1) { if (!level1CategoryIds.Contains(category.Id)) { level1Categories.Add(category); } } else //Level = 2 или Level = 3 { var parentCategory = allProductCategories.FirstOrDefault(c => c.Id == category.ParentId); if (parentCategory != null) { if (category.Level == 2) { if (!level1CategoryIds.Contains(parentCategory.Id)) { level1Categories.Add(parentCategory); } } else //Level = 3 { var parentParentCategory = allProductCategories.FirstOrDefault(c => c.Id == parentCategory.ParentId); if (parentParentCategory != null && !level1CategoryIds.Contains(parentParentCategory.Id)) { level1Categories.Add(parentParentCategory); } } } } } #endregion ad.ProductCategoriesLevel1 = new List <ProductCategory>(); foreach (var level1Category in level1Categories) { //нужно клонировать, иначе при обработке следующих объявлений в цикле эти данные затрутся var level1CategoryClone = level1Category.Clone(); //выбираем дочерние категории и дочерние категории дочерних категорий var childCategories = adProductCategories.Where(c => c.ParentId == level1CategoryClone.Id || level1CategoryClone.ChildrenId.Any(id => id == c.ParentId)).ToList(); level1CategoryClone.ChildCategories = new List <ProductCategory>(); foreach (var childCategory in childCategories) { var childCategoryClone = childCategory.Clone(); level1CategoryClone.ChildCategories.Add(childCategoryClone); } ad.ProductCategoriesLevel1.Add(level1CategoryClone); } } #endregion } if (needInvitedUserIds) { ad.InvitedUsersId = AdsDAL.GetInvitedUsers(ad.Id); } if (needSender) { ad.Sender = UsersDAL.GetUser(ad.SenderId); if (ad.Sender != null) { ad.Sender.Town = TownsDAL.GetTown(ad.Sender.CityId); } } } return(ads); }
public static bool ReviewContract(int offerId, bool isAccept, bool isByAdCreator) { if (!MessagesDAL.MarkContractAsReviewed(offerId)) { return(false); } var offer = OffersDAL.GetOffer(offerId); if (offer == null) { return(false); } var ad = AdsDAL.GetAd(offer.AdId); if (ad == null) { return(false); } var sender = SM.GetPersonalAreaUser(); if (offer.SenderId != sender.Id && ad.SenderId != sender.Id) { return(false); } if (isAccept) { AdsDAL.ChangeAdStatusToFinishedAndActiveUntilDateToNow(offer.AdId); OffersDAL.ChangeOfferContractStatus(offer.Id, (int)ContractStatuses.Accepted); OffersDAL.UpdateOfferContractSendDate(offer.Id, DateTime.Now.ToUniversalTime()); //var notificationsUserId = User.SystemNotificationsUserId; var messageText = "Контракт c " + sender.CompanyNameWithTypeOfOwnership + " по объявлению " + ad.Name + " подтвержден."; var message = new Message { SenderId = offer.SenderId, RecipientId = ad.SenderId, Text = messageText, AdId = ad.Id, OfferId = offer.Id }; AddMessage(message); var offers = OffersDAL.GetOffers(ad.Id).Where(o => o.ContractStatus != ContractStatuses.Accepted).ToList(); if (offers.Any()) { var adSender = UsersDAL.GetUser(ad.SenderId); if (adSender != null) { adSender.Town = TownsDAL.GetTown(adSender.CityId); var notificationsUserId = MContract.Models.User.SystemNotificationsUserId; foreach (var o in offers) { messageText = "По объявлению " + ad.Name + " организатора " + adSender.CompanyNameWithTypeOfOwnership + (adSender.Town != null ? ", " + adSender.TownName : "") + " заключен контракт с другим участником."; message = new Message { SenderId = notificationsUserId, RecipientId = o.SenderId, Text = messageText, AdId = ad.Id }; AddMessage(message); } } } } else { //удаляем предложение, только если отменяет контракт участник, подавший это предложение, а не организатор //если отменяет контракт организатор if (isByAdCreator) { OffersDAL.ChangeOfferContractStatus(offer.Id, (int)ContractStatuses.Declined); } else //а если контракт отменяет участник, подавший предложение { OffersDAL.DeleteOffer(offerId); } //var notificationsUserId = User.SystemNotificationsUserId; var messageText = "Контракт c " + sender.CompanyNameWithTypeOfOwnership + " по объявлению " + ad.Name + " отменен."; var message = new Message { SenderId = offer.SenderId, RecipientId = ad.SenderId, Text = messageText, AdId = ad.Id, OfferId = offer.Id }; AddMessage(message); } return(true); }