public async Task <Result> Get(int id)
        {
            var goods = await _goodsRepository.Query()
                        .Include(e => e.ThumbnailImage)
                        .Include(e => e.GoodsMedias).ThenInclude(e => e.Media)
                        .Include(e => e.Childrens).ThenInclude(e => e.OptionCombinations).ThenInclude(e => e.Option)
                        .Include(e => e.Childrens)
                        .Include(e => e.OptionValues).ThenInclude(e => e.Option)
                        .FirstOrDefaultAsync(e => e.Id == id);

            if (goods == null)
            {
                return(Result.Fail(ResultCodes.IdInvalid));
            }

            var goodsRes = _mapper.Map <AdminGoodsGetResponse>(goods);

            var optionIds = goods.OptionValues.OrderBy(e => e.DisplayOrder).ThenBy(x => x.Option.Name).GroupBy(c => c.OptionId).Select(s => s.Key).OrderBy(c => c);
            var options   = new List <AdminGoodsGetOptionResponse>();

            foreach (var optionId in optionIds)
            {
                var first  = goods.OptionValues.First(c => c.OptionId == optionId);
                var result = new AdminGoodsGetOptionResponse
                {
                    Id       = first.OptionId,
                    Name     = first.Option.Name,
                    Createat = first.Createat,
                    Values   = goods.OptionValues.Where(e => e.OptionId == optionId).Select(s => new AdminGoodsGetOptionValueResponse
                    {
                        Id           = s.Id,
                        DisplayOrder = s.DisplayOrder,
                        Value        = s.Value,
                        Createat     = s.Createat
                    }).OrderBy(c => c.DisplayOrder).ToList()
                };
                options.Add(result);
            }
            goodsRes.Options = options;

            goodsRes.Variations = goods.Childrens.Select(s => new AdminGoodsGetVariationResponse
            {
                Id                 = s.Id,
                NormalizedName     = s.NormalizedName,
                StockQuantity      = s.StockQuantity,
                Price              = s.Price,
                OptionCombinations = s.OptionCombinations.Select(e => new AdminGoodsGetOptionCombinationResponse
                {
                    OptionId     = e.OptionId,
                    OptionName   = e.Option?.Name,
                    Value        = e.Value,
                    DisplayOrder = e.DisplayOrder
                }).OrderBy(e => e.DisplayOrder).ToList()
            }).ToList();

            return(Result.Ok(goodsRes));
        }
        public async Task <Result> PendingList([FromQuery] PaginationRequest request)
        {
            var page  = request.Page;
            var limit = request.Limit;

            if (page <= 0)
            {
                page = 1;
            }
            if (limit <= 0)
            {
                limit = 10;
            }

            var userId = HttpContext.GetUserId();

            var queryable = _orderItemRepository.Query().Where(e => e.Order.CustomerId == userId && e.Order.OrderStatus == OrderStatus.PaymentReceived && e.Status == OrderItemStatus.Default);
            var totalRows = await queryable.CountAsync();

            var orderItems = await queryable
                             .Include(e => e.Goods).ThenInclude(e => e.Childrens).ThenInclude(e => e.OptionCombinations).ThenInclude(e => e.Option)
                             .Include(e => e.Goods).ThenInclude(e => e.OptionValues).ThenInclude(e => e.Option)
                             .OrderByDescending(e => e.Id)
                             .Skip((page - 1) * limit).Take(limit)
                             .ToListAsync();

            var orderItemsResponse = _mapper.Map <List <ShipmentPendingListResponse> >(orderItems);

            for (int i = 0; i < orderItems.Count; i++)
            {
                var item      = orderItems[i];
                var optionIds = item.Goods.OptionValues.OrderBy(e => e.DisplayOrder)
                                .ThenBy(x => x.Option.Name)
                                .GroupBy(c => c.OptionId)
                                .Select(s => s.Key)
                                .OrderBy(c => c);
                var options = new List <AdminGoodsGetOptionResponse>();
                foreach (var optionId in optionIds)
                {
                    var first  = item.Goods.OptionValues.First(c => c.OptionId == optionId);
                    var result = new AdminGoodsGetOptionResponse
                    {
                        Id       = first.OptionId,
                        Name     = first.Option.Name,
                        Createat = first.Createat,
                        Values   = item.Goods.OptionValues.Where(e => e.OptionId == optionId).Select(s => new AdminGoodsGetOptionValueResponse
                        {
                            Id           = s.Id,
                            DisplayOrder = s.DisplayOrder,
                            Value        = s.Value,
                            Createat     = s.Createat
                        }).OrderBy(c => c.DisplayOrder).ToList()
                    };
                    options.Add(result);
                }
                orderItemsResponse[i].Options = options;

                orderItemsResponse[i].Variations = item.Goods.Childrens.Select(s => new AdminGoodsGetVariationResponse
                {
                    Id                 = s.Id,
                    NormalizedName     = s.NormalizedName,
                    StockQuantity      = s.StockQuantity,
                    Price              = s.Price,
                    OptionCombinations = s.OptionCombinations.Select(e => new AdminGoodsGetOptionCombinationResponse
                    {
                        OptionId     = e.OptionId,
                        OptionName   = e.Option?.Name,
                        Value        = e.Value,
                        DisplayOrder = e.DisplayOrder
                    }).OrderBy(e => e.DisplayOrder).ToList()
                }).ToList();
            }

            var pagination = new PaginationResponse(page, totalRows, orderItemsResponse);

            return(Result.Ok(pagination));
        }
Example #3
0
        public async Task <Result> Get(int id)
        {
            var discountRate = 100f;
            // if (user.Role != PartnerRole.Default)
            // {
            //     var partnerConfig = _customerManager.GetUserPartnerConfig(user.Role);
            //     discountRate = partnerConfig.DiscountRate / 100f;
            // }

            var goods = await _goodsRepository.Query()
                        .Include(e => e.ThumbnailImage)
                        .Include(e => e.GoodsMedias).ThenInclude(e => e.Media)
                        .Include(e => e.Childrens).ThenInclude(e => e.OptionCombinations).ThenInclude(e => e.Option)
                        .Include(e => e.Childrens)
                        .Include(e => e.OptionValues).ThenInclude(e => e.Option)
                        .FirstOrDefaultAsync(e => e.Id == id);

            if (goods == null)
            {
                return(Result.Fail(ResultCodes.IdInvalid));
            }

            var goodsRes = _mapper.Map <GoodsGetResponse>(goods);

            var authenticationScheme = JwtBearerDefaults.AuthenticationScheme;
            var auth = await HttpContext.AuthenticateAsync(authenticationScheme);

            if (auth.Succeeded)
            {
                var user = await _customerManager.GetUserAsync();

                if (user != null)
                {
                    if (user.Role == PartnerRole.CityPartner && goods.CityDiscount > 0)
                    {
                        discountRate = goods.CityDiscount;
                    }
                    else if (user.Role == PartnerRole.BranchPartner && goods.BranchDiscount > 0)
                    {
                        discountRate = goods.BranchDiscount;
                    }
                }
            }

            goodsRes.DiscountPrice = (int)(goodsRes.Price * (discountRate / 100f));

            var optionIds = goods.OptionValues.OrderBy(e => e.DisplayOrder).ThenBy(x => x.Option.Name).GroupBy(c => c.OptionId).Select(s => s.Key).OrderBy(c => c);
            var options   = new List <AdminGoodsGetOptionResponse>();

            foreach (var optionId in optionIds)
            {
                var first  = goods.OptionValues.First(c => c.OptionId == optionId);
                var result = new AdminGoodsGetOptionResponse
                {
                    Id       = first.OptionId,
                    Name     = first.Option.Name,
                    Createat = first.Createat,
                    Values   = goods.OptionValues.Where(e => e.OptionId == optionId).Select(s => new AdminGoodsGetOptionValueResponse
                    {
                        Id           = s.Id,
                        DisplayOrder = s.DisplayOrder,
                        Value        = s.Value,
                        Createat     = s.Createat
                    }).OrderBy(c => c.DisplayOrder).ToList()
                };
                options.Add(result);
            }
            goodsRes.Options = options;

            goodsRes.Variations = goods.Childrens.Select(s => new AdminGoodsGetVariationResponse
            {
                Id                 = s.Id,
                NormalizedName     = s.NormalizedName,
                StockQuantity      = s.StockQuantity,
                Price              = s.Price,
                DiscountPrice      = (int)(s.Price * discountRate),
                OptionCombinations = s.OptionCombinations.Select(e => new AdminGoodsGetOptionCombinationResponse
                {
                    OptionId     = e.OptionId,
                    OptionName   = e.Option?.Name,
                    Value        = e.Value,
                    DisplayOrder = e.DisplayOrder
                }).OrderBy(e => e.DisplayOrder).ToList()
            }).ToList();

            return(Result.Ok(goodsRes));
        }