public ProductsReport Create(AggregateId id, IReadOnlyCollection <Product> products,
                                     IReadOnlyCollection <Order> orders, int maxRank)
        {
            if (products == null || !products.Any())
            {
                throw new EmptyProductsException();
            }

            if (orders == null || !orders.Any())
            {
                throw new EmptyOrdersException();
            }

            maxRank = maxRank > 0 ? maxRank : 3;
            var productsSales = _salesCalculator.Calculate(products, orders);
            var rankings      = new List <ProductRank>();
            var currentRank   = 1;

            foreach (var sales in productsSales.OrderByDescending(p => p.TotalSales))
            {
                var product       = products.Single(p => p.Id.Equals(sales.ProductId));
                var totalEarnings = product.Price * sales.TotalSales;
                var rank          = new ProductRank(product.Id, product.Name, product.Price,
                                                    product.Vendor, currentRank, sales.TotalSales, totalEarnings);
                rankings.Add(rank);
                if (currentRank == maxRank)
                {
                    break;
                }

                currentRank++;
            }

            return(new ProductsReport(id, rankings));
        }
示例#2
0
        public async Task <int> SaveDataAsync(ProductVM viewModel)
        {
            var entity = _mapper.Map <ProductVM, Product>(viewModel);

            if (viewModel.PublicationDate == DateTime.MinValue)
            {
                entity.PublicationDate = DateTime.Now;
            }
            //Update product rating
            var rank = new ProductRank
            {
                ProductId  = entity.ProductId,
                Name       = entity.Name,
                CategoryId = entity.CategoryId,
                Rate       = 0,
                Sold       = 0
            };

            if (viewModel.ProductId == 0)
            {
                entity.CreateBy        = "admin"; entity.UpdateBy = "admin";
                entity.CreateDate      = DateTime.Now;
                entity.UpdatedDate     = DateTime.Now;
                entity.UniqueStringKey = Guid.NewGuid();
                entity.Authors         = new List <Author>()
                {
                    await _authorDetailRepository.GetAuthorById(1)
                };

                var zeroDiscount = await _discountRepository.GetSingleByIDAsync(1);

                entity.Discount = zeroDiscount;

                await _productRepository.AddAsync(entity);

                await _productRankRepository.AddAsync(rank);
            }
            else
            {
                entity.UpdatedDate = DateTime.Now;
                await _productRepository.UpdateAsync(entity);

                await _productRankRepository.UpdateAsync(rank);
            }

            return(await _unitOfWork.SaveAsync());
        }
示例#3
0
        private void SeedMockData(WebBanSach_2_0DbContext context, bool isTrue)
        {
            if (isTrue)
            {
                var userStore       = new UserStore <ApplicationUser>(context);
                var userManager     = new UserManager <ApplicationUser>(userStore);
                var ZeroDiscount    = context.Discounts.FirstOrDefault(m => m.DiscountId == 1);
                var undefinedAuthor = context.Authors.FirstOrDefault(m => m.AuthorId == 1);


                //Seed Mock Data
                //Add Product
                for (int i = 0; i < 30; i++)
                {
                    var product = new Product
                    {
                        ProductId       = i,
                        CategoryId      = 1,
                        CreateDate      = DateTime.Now,
                        PublicationDate = DateTime.Now,
                        CreateBy        = "admin",
                        Name            = "Book " + i,
                        NameAlias       = "book-" + i,
                        Price           = 10000,
                        Status          = true
                    };
                    product.Discount = ZeroDiscount;
                    product.Authors  = new List <Author> {
                        undefinedAuthor
                    };
                    context.Products.Add(product);
                    context.SaveChanges();

                    var rank = new ProductRank {
                        ProductId = product.ProductId, Name = product.Name, CategoryId = product.CategoryId, Rate = 0, Sold = 0
                    };
                    context.ProductRanks.Add(rank);
                }

                //Add Account
                string[] roles = new string[4] {
                    "user", "mod", "employee", "shipper"
                };
                Random random = new Random();
                List <ApplicationUser> users = new List <ApplicationUser>();
                for (int i = 0; i < 100; i++)
                {
                    var clients = new ApplicationUser
                    {
                        UserName    = "******" + i + "@abc.xyz",
                        PhoneNumber = "12345678911",
                        Email       = "client" + i + "@abc.xyz",
                        Address     = "test",
                        FullName    = "client" + i,
                        Dob         = DateTime.Now,
                    };

                    var clientsRole = new IdentityUserRole();
                    clientsRole.RoleId = roles[random.Next(roles.Length)];
                    clientsRole.UserId = clients.Id;

                    clients.Roles.Add(clientsRole);
                    userManager.Create(clients, "client@123");

                    if (clientsRole.RoleId == "user")
                    {
                        users.Add(clients);
                    }
                }

                //Add Order
                string[] orderroles = new string[3] {
                    "admin", "mod", "employee"
                };
                var    productList = context.Products.ToList();
                Random rd          = new Random();
                for (int i = 0; i < 200; i++)
                {
                    var userRd = users[random.Next(users.Count())];
                    var order  = new Order
                    {
                        CustomerName    = userRd.FullName,
                        CustomerAddress = userRd.Address,
                        CustomerMobile  = userRd.PhoneNumber,
                        CustomerEmail   = userRd.Email,
                        PaymentMethod   = (PaymentMethod)random.Next(4),
                        PaymentStatus   = false,
                        CreatedDate     = new DateTime(DateTime.Now.Year, rd.Next(3, 7), rd.Next(1, 31)),
                        CreatedBy       = orderroles[random.Next(orderroles.Length)],
                        Status          = (OrderStatus)random.Next(10),
                        Discount        = ZeroDiscount,
                    };

                    context.Orders.Add(order);
                    context.SaveChanges();
                }

                for (int i = 1; i <= context.Orders.Count(); i++)
                {
                    context.OrderDetails.Add(new OrderDetail {
                        OrderId = i, ProductId = productList[random.Next(productList.Count())].ProductId, Quantity = 1
                    });
                }
            }
        }