Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        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);
        }