// TODO: add functionality based on user settings
        // TODO: add multiple ways to distribute funds
        public static bool PeriodPay(User user)
        {
            var subscriptionInfo = UserSubscriptionInfoRepository.FindOrCreate(user);

            var paydayTime = subscriptionInfo.last_paid.AddMonths(1);

            if (DateTime.Now < paydayTime)
            {
                return(false);
            }

            var currency = subscriptionInfo.selected_currency;

            var balance = UserBalanceRepository.FindOrCreate(user, currency);

            decimal amount = 0;

            amount = balance.balance < subscriptionInfo.selected_amount ? balance.balance : subscriptionInfo.selected_amount;

            var randomProjectsToFund = 4; // TODO: get from user settings

            var amountToFundRandomProjects = amount / randomProjectsToFund;

            for (int i = 1; i <= randomProjectsToFund; i++)
            {
                var randomProject = ProjectRepository.FindRandom();
                SubscriptionFundingUtils.FundEntity(
                    user, randomProject.id, EntityType.Project, amountToFundRandomProjects, currency
                    );
            }

            return(true);
        }
        public void FindOrCreate_DataCorrect_InfoCreated()
        {
            var user = UserFaker.Create();

            Assert.IsNull(UserSubscriptionInfoRepository.Find(user));

            UserSubscriptionInfoRepository.FindOrCreate(user);

            Assert.NotNull(UserSubscriptionInfoRepository.Find(user));
        }
        public void FundEntity_DataCorrect_EntityFunded()
        {
            var user = UserFaker.Create();

            var amount = Rand.SmallDecimal();

            var balance = UserBalanceRepository.FindOrCreate(user, CurrencyType.BitCoin);

            balance.UpdateBalance(amount);

            var info = UserSubscriptionInfoRepository.FindOrCreate(user);

            info.UpdateSelectedAmount(amount).Refresh();

            ProjectFaker.Create();

            SubscriptionUtils.PeriodPay(user);

            var txs = FundingTransactionRepository.Get(user);

            Assert.True(txs.Length > 0);
            Assert.True(txs[0].amount > 0);
        }