public async Task <OperationResult> WithdrawalBalance(int portfolioId, int price, DateTime date)
        {
            var portfolio = await _financeDataService.EfContext.Portfolios.FindAsync(portfolioId);

            var withdrawalAction =
                await _financeDataService.EfContext.CurrencyActions.FirstOrDefaultAsync(a =>
                                                                                        a.Name == SeedFinanceData.WITHDRAWAL_ACTION);

            if (portfolio == null)
            {
                return(new OperationResult()
                {
                    IsSuccess = false,
                    Message = "Портфель не найден"
                });
            }

            if (price < 0)
            {
                return(new OperationResult()
                {
                    IsSuccess = false,
                    Message = "Нельзя вывести отрицательную сумму"
                });
            }

            var currentBalanceResult = await GetBalance(portfolioId, portfolio.UserId);

            if (price > currentBalanceResult.Result)
            {
                return(new OperationResult()
                {
                    IsSuccess = false,
                    Message = "Недостаточно средств"
                });
            }

            var currencyOperation = new CurrencyOperation()
            {
                Portfolio        = portfolio,
                PortfolioId      = portfolioId,
                CurrencyAction   = withdrawalAction,
                CurrencyActionId = withdrawalAction.Id,
                CurrencyId       = SeedFinanceData.RUB_CURRENCY_ID,
                CurrencyName     = SeedFinanceData.RUB_CURRENCY_NAME,
                Date             = date,
                Price            = price
            };

            await _financeDataService.EfContext.CurrencyOperations.AddAsync(currencyOperation);

            await _financeDataService.EfContext.SaveChangesAsync();

            return(new OperationResult()
            {
                IsSuccess = true,
                Message = "Средства выведены успешно"
            });
        }
        private int ApplyCurrencyOperation(CurrencyOperation operation, int balance)
        {
            if (operation.CurrencyAction.Name == SeedFinanceData.REFILL_ACTION)
            {
                balance += operation.Price;
            }

            if (operation.CurrencyAction.Name == SeedFinanceData.WITHDRAWAL_ACTION)
            {
                balance -= operation.Price;
            }

            return(balance);
        }
        //TODO Проверка на нужного пользователя
        public async Task <OperationResult> RefillBalance(int portfolioId, int price, DateTime date)
        {
            var portfolio = await _financeDataService.EfContext.Portfolios.FindAsync(portfolioId);

            var refillAction =
                await _financeDataService.EfContext.CurrencyActions.FirstOrDefaultAsync(a =>
                                                                                        a.Name == SeedFinanceData.REFILL_ACTION);

            if (portfolio == null)
            {
                return(new OperationResult()
                {
                    IsSuccess = false,
                    Message = "Портфель не найден"
                });
            }

            if (price < 0)
            {
                return(new OperationResult()
                {
                    IsSuccess = false,
                    Message = "Нельзя пополнить на отрицательную сумму"
                });
            }

            var currencyOperation = new CurrencyOperation()
            {
                Portfolio        = portfolio,
                PortfolioId      = portfolioId,
                CurrencyAction   = refillAction,
                CurrencyActionId = refillAction.Id,
                CurrencyId       = SeedFinanceData.RUB_CURRENCY_ID,
                CurrencyName     = SeedFinanceData.RUB_CURRENCY_NAME,
                Date             = date,
                Price            = price
            };

            await _financeDataService.EfContext.CurrencyOperations.AddAsync(currencyOperation);

            await _financeDataService.EfContext.SaveChangesAsync();

            return(new OperationResult()
            {
                IsSuccess = true,
                Message = $"Баланс пополнен на {FinanceHelpers.GetPriceDouble(price)} ₽ успешно"
            });
        }
 public CurrencyOperationNonZero(Strategy parent, float minValue, float maxValue, Currency currency, CurrencyOperation.Operator op, TransactionReasons AffectReasons, string description)
     : base(parent, minValue, maxValue, currency, op, AffectReasons, description)
 {
 }