public void MakeOrder(Order order)
        {
            UnitOfWork.GetRepository<Order>().Insert(order);
            var price = order.ContentPackage.Price;

            var profileService = new ProfileService(UnitOfWork);
            var ownerProfile = profileService.GetUserProfile(order.ContentPackage.Owner);

            order.UserProfile.Balance -= price;
            ownerProfile.Balance += price;

            UnitOfWork.Save();
        }
        public ViewResult MakeOrder(OrderViewModel viewModel)
        {
            var packageId = viewModel.ContentPackageId;
            var package = UnitOfWork.GetRepository<ContentPackage>().GetByID(packageId);

            var order = new Order
                        {
                            ContentPackage = package,
                            UserProfile = CurrentUserProfile
                        };

            var financeService = new FinanceService(UnitOfWork);
            financeService.MakeOrder(order);

            return InformationView("Покупка успешно произведена.",
                                   "",
                                   new ActionLinkInfo("Content",
                                                      "Details",
                                                      "Вернуться к просмотру",
                                                      new {id = package.ID}));
        }
        public void UserHasPermissions_UserOrderedPackage_UserHasPermissions()
        {
            // Arrange
            var unitOfWork = new UnitOfWorkMock();
            var user = new User();
            var userProfile = new UserProfile {User = user};
            var package = new ContentPackage {Owner = new User()};
            unitOfWork.GetRepository<User>().Insert(user);
            unitOfWork.GetRepository<UserProfile>().Insert(userProfile);
            unitOfWork.GetRepository<ContentPackage>().Insert(package);

            var order = new Order {ContentPackage = package, UserProfile = userProfile};
            unitOfWork.GetRepository<Order>().Insert(order);
            unitOfWork.Save();

            // Act
            var financeService = new FinanceService(unitOfWork);
            var userHasPermissions = financeService.UserHasPermissions(user, package);

            // Assert
            userHasPermissions.Should().BeTrue();
        }
        public ViewResult Order(int id)
        {
            var package = UnitOfWork.GetRepository<ContentPackage>().GetByID(id);
            if (package == null)
                return ErrorView("Материал не найден", "Указанный материал отсутствует в базе данных.");

            var viewModel = new OrderViewModel
                            {
                                OrderPrice = package.Price,
                                UserBalance = CurrentUserProfile.Balance,
                                ContentPackageId = package.ID
                            };

            var financeService = new FinanceService(UnitOfWork);
            var order = new Order
                        {
                            ContentPackage = package,
                            UserProfile = CurrentUserProfile,
                        };
            if (!financeService.IsOrderAvailable(order))
                ModelState.AddModelError("balance", "Недостаточно средств для покупки текущего материала.");

            return View(viewModel);
        }
 public bool IsOrderAvailable(Order order)
 {
     return order.ContentPackage.Price <= order.UserProfile.Balance;
 }