public static InvestmentProgram ToInvestmentProgram(this InvestmentPrograms program, Guid?userId, UserType?userType) { var result = new InvestmentProgram { Id = program.Id, Title = program.Title, Level = 1, Logo = program.Logo, Balance = program.ManagerAccount.Balance, Currency = program.ManagerAccount.Currency, TradesCount = program.ManagerAccount.OrdersCount, InvestorsCount = GetInvestorsCount(program), PeriodDuration = program.Period, EndOfPeriod = GetEndOfPeriod(program), ProfitAvg = program.ManagerAccount.ProfitAvg, ProfitTotal = program.ManagerAccount.ProfitTotal, AvailableInvestment = program.Token.FreeTokens, FeeSuccess = program.FeeSuccess, FeeManagement = program.FeeManagement, HasNewRequests = GetHasNewRequests(program, userType, userId), Chart = GetChart(program) }; return(result); }
public static InvestmentProgramDashboard ToInvestmentProgramDashboard(this InvestmentPrograms program, Guid?userId, UserType?userType) { var result = new InvestmentProgramDashboard { Id = program.Id, Title = program.Title, Level = 1, Logo = program.Logo, Balance = program.ManagerAccount.Balance, Currency = program.ManagerAccount.Currency, TradesCount = program.ManagerAccount.OrdersCount, InvestorsCount = GetInvestorsCount(program), PeriodDuration = program.Period, IsEnabled = program.IsEnabled, EndOfPeriod = GetEndOfPeriod(program), ProfitAvg = program.ManagerAccount.ProfitAvg, ProfitTotal = program.ManagerAccount.ProfitTotal, AvailableInvestment = program.Token.FreeTokens, InvestedTokens = GetInvestedTokens(program, userType, userId), FeeSuccess = program.FeeSuccess, FeeManagement = program.FeeManagement, Manager = program.ManagerAccount.User.ToProfilePublic(), HasNewRequests = GetHasNewRequests(program, userType, userId), IsHistoryEnable = GetIsHistoryEnable(program, userType, userId), IsInvestEnable = GetIsInvestEnable(program, userType, userId), IsWithdrawEnable = GetIsWithdrawEnable(program, userType, userId), IsOwnProgram = GetIsOwnProgram(program, userType, userId), Chart = GetChart(program) }; return(result); }
public void GetBrokerInvestmentsInitDataExpiredOrFuture() { var manager1 = new ManagerAccounts { Id = Guid.NewGuid(), BrokerTradeServerId = brokerTradeServer.Id }; var inv1 = new InvestmentPrograms { Id = Guid.NewGuid(), IsEnabled = true, DateFrom = DateTime.UtcNow.AddDays(-10), DateTo = DateTime.UtcNow.AddDays(-3), ManagerAccountId = manager1.Id, Token = new ManagerTokens { Id = Guid.NewGuid(), TokenName = "TokenName1", TokenSymbol = "TokenSymbol1" } }; var manager2 = new ManagerAccounts { Id = Guid.NewGuid(), BrokerTradeServerId = brokerTradeServer.Id }; var inv2 = new InvestmentPrograms { Id = Guid.NewGuid(), IsEnabled = true, DateFrom = DateTime.UtcNow.AddDays(10), DateTo = DateTime.UtcNow.AddDays(17), ManagerAccountId = manager2.Id, Token = new ManagerTokens { Id = Guid.NewGuid(), TokenName = "TokenName2", TokenSymbol = "TokenSymbol2" } }; context.Add(manager1); context.Add(manager2); context.Add(inv1); context.Add(inv2); context.SaveChanges(); var result = trustManagementService.GetBrokerInvestmentsInitData(brokerTradeServer.Id); Assert.IsTrue(result.IsSuccess); Assert.AreEqual(0, result.Data.Count); inv1.DateTo = DateTime.UtcNow.AddMinutes(1); inv2.DateFrom = DateTime.UtcNow.AddMinutes(-1); context.SaveChanges(); result = trustManagementService.GetBrokerInvestmentsInitData(brokerTradeServer.Id); Assert.IsTrue(result.IsSuccess); Assert.AreEqual(2, result.Data.Count); }
private static bool GetHasNewRequests(InvestmentPrograms program, UserType?userType, Guid?userId) { if (!userId.HasValue) { return(false); } return(program.InvestmentRequests.Any(x => x.UserId == userId && x.Status == InvestmentRequestStatus.New)); }
private static int GetInvestorsCount(InvestmentPrograms program) { return(program.InvestmentRequests .Where(r => r.Type == InvestmentRequestType.Invest && r.Status == InvestmentRequestStatus.Executed) .Select(r => r.UserId) .Distinct() .Count()); }
private static bool GetIsHistoryEnable(InvestmentPrograms program, UserType?userType, Guid?userId) { if (!userId.HasValue) { return(false); } return(program.InvestmentRequests.Any(x => x.UserId == userId)); }
private static bool GetIsOwnProgram(InvestmentPrograms program, UserType?userType, Guid?userId) { if (!userId.HasValue || userType != UserType.Manager) { return(false); } return(program.ManagerAccount.UserId == userId); }
private static decimal GetInvestedTokens(InvestmentPrograms program, UserType?userType, Guid?userId) { if (!userId.HasValue || userType != UserType.Investor) { return(0); } return(program.Token.InvestorTokens.FirstOrDefault(x => x.InvestorAccount.UserId == userId.Value)?.Amount ?? 0); }
private static bool GetIsInvestEnable(InvestmentPrograms program, UserType?userType, Guid?userId) { if (!userId.HasValue || userType != UserType.Investor || !program.IsEnabled) { return(false); } return(!program.InvestmentRequests.Any(x => x.UserId == userId && x.Type == InvestmentRequestType.Withdrawal && x.Status == InvestmentRequestStatus.New)); }
private static List <Chart> GetChart(InvestmentPrograms program) { var charts = program.ManagerAccount.ManagersAccountsStatistics .OrderBy(x => x.Date) .Select(x => new Chart { Date = x.Date, Profit = x.Profit, Loss = x.Loss, TotalProfit = x.TotalProfit, Fund = x.Fund }) .ToList(); return(charts); }
private static bool GetIsWithdrawEnable(InvestmentPrograms program, UserType?userType, Guid?userId) { if (!userId.HasValue || userType != UserType.Investor || !program.IsEnabled) { return(false); } var investorTokens = program.Token.InvestorTokens.FirstOrDefault(x => x.InvestorAccount.UserId == userId); if (investorTokens == null || investorTokens.Amount <= 0) { return(false); } return(!program.InvestmentRequests.Any(x => x.UserId == userId && x.Type == InvestmentRequestType.Invest && x.Status == InvestmentRequestStatus.New)); }
public void Init() { var optionsBuilder = new DbContextOptionsBuilder <ApplicationDbContext>(); optionsBuilder.UseInMemoryDatabase("databaseInvestorValidator"); context = new ApplicationDbContext(optionsBuilder.Options); user = new ApplicationUser { Id = Guid.NewGuid(), IsEnabled = true, Type = UserType.Investor, Wallets = new List <Wallets> { new Wallets { Amount = 1000, Currency = Currency.GVT } }, }; investment = new InvestmentPrograms { Id = Guid.NewGuid(), DateFrom = DateTime.UtcNow, DateTo = DateTime.UtcNow.AddMonths(1), IsEnabled = true, Period = 10 }; var period = new Periods { Id = Guid.NewGuid(), DateFrom = DateTime.UtcNow, DateTo = DateTime.UtcNow.AddDays(10), Number = 1, Status = PeriodStatus.InProccess, InvestmentProgramId = investment.Id }; context.Add(user); context.Add(investment); context.Add(period); context.SaveChanges(); investorValidator = new InvestorValidator(context); }
public static InvestmentProgramDetails ToInvestmentProgramDetails(this InvestmentPrograms program, Guid?userId, UserType?userType) { var result = new InvestmentProgramDetails { Id = program.Id, Title = program.Title, Description = program.Description, Level = 1, Login = program.ManagerAccount.Login, Logo = program.Logo, Balance = program.ManagerAccount.Balance, OwnBalance = program.Periods.FirstOrDefault(x => x.Status == PeriodStatus.InProccess)?.ManagerStartBalance ?? 0m, Currency = program.ManagerAccount.Currency, TradesCount = program.ManagerAccount.OrdersCount, InvestorsCount = GetInvestorsCount(program), PeriodDuration = program.Period, IsEnabled = program.IsEnabled, EndOfPeriod = GetEndOfPeriod(program), ProfitAvg = program.ManagerAccount.ProfitAvg, ProfitTotal = program.ManagerAccount.ProfitTotal, AvailableInvestment = program.Token.FreeTokens, InvestedTokens = GetInvestedTokens(program, userType, userId), FeeSuccess = program.FeeSuccess, FeeManagement = program.FeeManagement, IpfsHash = program.ManagerAccount.IpfsHash, TradeIpfsHash = program.ManagerAccount.TradeIpfsHash, Manager = program.ManagerAccount.User.ToProfilePublic(), HasNewRequests = GetHasNewRequests(program, userType, userId), IsHistoryEnable = GetIsHistoryEnable(program, userType, userId), IsInvestEnable = GetIsInvestEnable(program, userType, userId), IsWithdrawEnable = GetIsWithdrawEnable(program, userType, userId), IsOwnProgram = GetIsOwnProgram(program, userType, userId), Chart = GetChart(program) }; return(result); }
public static BrokerInvestmentProgram ToBrokerInvestmentProgram(this InvestmentPrograms program) { var result = new BrokerInvestmentProgram { Id = program.Id, FeeEntrance = program.FeeEntrance, FeeSuccess = program.FeeSuccess, FeeManagement = program.FeeManagement, IsEnabled = program.IsEnabled, DateFrom = program.DateFrom, DateTo = program.DateTo, Description = program.Description, Period = program.Period, InvestMinAmount = program.InvestMinAmount, InvestMaxAmount = program.InvestMaxAmount, LastPeriod = program.Periods?.FirstOrDefault(x => x.Status == PeriodStatus.InProccess)?.ToPeriod(), ManagerAccountId = program.ManagerAccountId, Login = program.ManagerAccount.Login, IpfsHash = program.ManagerAccount.IpfsHash, TradeIpfsHash = program.ManagerAccount.TradeIpfsHash }; return(result); }
public void GetBrokerInvestmentsInitData() { var manager1 = new ManagerAccounts { Id = Guid.NewGuid(), BrokerTradeServerId = brokerTradeServer.Id }; var inv1 = new InvestmentPrograms { Id = Guid.NewGuid(), IsEnabled = true, DateFrom = DateTime.UtcNow.AddDays(-1), DateTo = DateTime.UtcNow.AddDays(1), Period = 5, ManagerAccountId = manager1.Id, Description = "#1", Token = new ManagerTokens { TokenName = "TokenName1", TokenSymbol = "TokenSymbol1" } }; var period1 = new Periods { Id = Guid.NewGuid(), InvestmentProgramId = inv1.Id, Status = PeriodStatus.InProccess, Number = 5 }; var period2 = new Periods { Id = Guid.NewGuid(), InvestmentProgramId = inv1.Id, Status = PeriodStatus.Planned, Number = 6 }; var manager2 = new ManagerAccounts { Id = Guid.NewGuid(), BrokerTradeServerId = brokerTradeServer.Id }; var inv2 = new InvestmentPrograms { Id = Guid.NewGuid(), IsEnabled = true, DateFrom = DateTime.UtcNow.AddDays(-1), DateTo = DateTime.UtcNow.AddDays(1), Period = 7, ManagerAccountId = manager2.Id, Description = "#2", Token = new ManagerTokens { TokenName = "TokenName2", TokenSymbol = "TokenSymbol2", TokenAddress = "TokenAddress2", } }; context.Add(manager1); context.Add(inv1); context.Add(period1); context.Add(period2); context.Add(manager2); context.Add(inv2); context.SaveChanges(); var result = trustManagementService.GetBrokerInvestmentsInitData(brokerTradeServer.Id); Assert.IsTrue(result.IsSuccess); Assert.AreEqual(2, result.Data.Count); Assert.AreEqual(inv1.Description, result.Data.First(x => x.Id == inv1.Id).Description); Assert.AreEqual(inv1.DateFrom, result.Data.First(x => x.Id == inv1.Id).DateFrom); Assert.IsNotNull(result.Data.First(x => x.Id == inv1.Id).LastPeriod); Assert.AreEqual(period1.Id, result.Data.First(x => x.Id == inv1.Id).LastPeriod.Id); Assert.AreEqual(period1.Number, result.Data.First(x => x.Id == inv1.Id).LastPeriod.Number); Assert.AreEqual(period1.Status, result.Data.First(x => x.Id == inv1.Id).LastPeriod.Status); Assert.AreEqual(inv2.Period, result.Data.First(x => x.Id == inv2.Id).Period); Assert.AreEqual(inv2.DateTo, result.Data.First(x => x.Id == inv2.Id).DateTo); Assert.AreEqual(inv2.ManagerAccount.Login, result.Data.First(x => x.Id == inv2.Id).Login); Assert.AreEqual(inv1.ManagerAccount.IpfsHash, result.Data.First(x => x.Id == inv1.Id).IpfsHash); }
public void Init() { var optionsBuilder = new DbContextOptionsBuilder <ApplicationDbContext>(); optionsBuilder.UseInMemoryDatabase("databaseTrustManagementService"); context = new ApplicationDbContext(optionsBuilder.Options); user = new ApplicationUser { Id = Guid.NewGuid(), IsEnabled = true, Wallets = new List <Wallets> { new Wallets { Amount = 100000, Currency = Currency.GVT } }, }; managerAccount = new ManagerAccounts { Id = Guid.NewGuid(), IsConfirmed = true, UserId = user.Id }; investmentProgram = new InvestmentPrograms { Id = Guid.NewGuid(), DateFrom = DateTime.UtcNow.AddYears(-1), FeeEntrance = 100m, FeeSuccess = 120m, FeeManagement = 10m, Description = "Test inv", IsEnabled = true, Period = 10, InvestMinAmount = 500, InvestMaxAmount = 1500, ManagerAccountId = managerAccount.Id, Token = new ManagerTokens { TokenName = "Token", TokenSymbol = "TST" } }; broker = new BrokersAccounts { Id = Guid.NewGuid(), UserId = user.Id, Description = string.Empty, IsEnabled = true, Name = "Broker #1", RegistrationDate = DateTime.UtcNow }; brokerTradeServer = new BrokerTradeServers { Id = Guid.NewGuid(), Name = "Server #1", IsEnabled = true, Host = string.Empty, RegistrationDate = DateTime.UtcNow, Type = BrokerTradeServerType.MetaTrader4, BrokerId = broker.Id }; context.Add(user); context.Add(managerAccount); context.Add(investmentProgram); context.Add(broker); context.Add(brokerTradeServer); context.SaveChanges(); smartContractService = new Mock <ISmartContractService>(); ipfsService = new Mock <IIpfsService>(); statisticService = new Mock <IStatisticService>(); rateService = new Mock <IRateService>(); trustManagementService = new TrustManagementService(context, ipfsService.Object, smartContractService.Object, statisticService.Object, rateService.Object, Substitute.For <ILogger <ITrustManagementService> >()); }
private static DateTime GetEndOfPeriod(InvestmentPrograms program) { var period = program.Periods.OrderByDescending(p => p.Number).FirstOrDefault(); return(period?.DateFrom ?? default(DateTime)); }
public OperationResult <Guid> CreateInvestmentProgram(NewManager request) { return(InvokeOperations.InvokeOperation(() => { var managerRequest = context.ManagerRequests.First(x => x.Id == request.RequestId && x.Status == ManagerRequestStatus.Created); managerRequest.TradePlatformPassword = null; managerRequest.Status = ManagerRequestStatus.Processed; var manager = new ManagerAccounts { Id = Guid.NewGuid(), BrokerTradeServerId = managerRequest.BrokerTradeServerId, UserId = managerRequest.UserId, RegistrationDate = DateTime.UtcNow, Login = request.Login, Currency = managerRequest.TradePlatformCurrency, IsConfirmed = false, IpfsHash = string.Empty }; var token = new ManagerTokens { Id = Guid.NewGuid(), TokenAddress = string.Empty, TokenName = managerRequest.TokenName, TokenSymbol = managerRequest.TokenSymbol, InitialPrice = 1, FreeTokens = 1000 }; var inv = new InvestmentPrograms { Id = Guid.NewGuid(), DateFrom = managerRequest.DateFrom, DateTo = managerRequest.DateTo, Description = managerRequest.Description, Title = managerRequest.Title, FeeEntrance = managerRequest.FeeEntrance, FeeManagement = managerRequest.FeeManagement, FeeSuccess = managerRequest.FeeSuccess, InvestMaxAmount = managerRequest.InvestMaxAmount, InvestMinAmount = managerRequest.InvestMinAmount, IsEnabled = true, ManagerAccountId = manager.Id, Period = managerRequest.Period, ManagerTokenId = token.Id, Logo = managerRequest.Logo, Rating = 0, }; var firstPeriod = new Periods { Id = Guid.NewGuid(), DateFrom = inv.DateFrom, DateTo = Constants.IsPeriodInMinutes ? inv.DateFrom.AddMinutes(inv.Period) : inv.DateFrom.AddDays(inv.Period), Status = PeriodStatus.InProccess, InvestmentProgramId = inv.Id, Number = 1, StartBalance = managerRequest.DepositInUsd, ManagerStartBalance = managerRequest.DepositInUsd, ManagerStartShare = 1 }; if (!inv.DateTo.HasValue || inv.DateTo > inv.DateFrom.AddDays(inv.Period)) { var plannedPeriod = new Periods { Id = Guid.NewGuid(), DateFrom = firstPeriod.DateTo, DateTo = Constants.IsPeriodInMinutes ? firstPeriod.DateTo.AddMinutes(inv.Period) : firstPeriod.DateTo.AddDays(inv.Period), Status = PeriodStatus.Planned, InvestmentProgramId = inv.Id, Number = 2 }; context.Add(plannedPeriod); } context.Add(manager); context.Add(token); context.Add(inv); context.Add(firstPeriod); context.SaveChanges(); var blockchainUpdate = smartContractService.RegisterManager(token.TokenName, token.TokenSymbol, manager.Id.ToString(), manager.Login, manager.BrokerTradeServerId.ToString(), inv.FeeManagement, inv.FeeSuccess); if (blockchainUpdate.IsSuccess) { manager.IsConfirmed = true; context.SaveChanges(); var ipfsUpdate = UpdateInvestmentInIpfs(inv.Id); if (ipfsUpdate.IsSuccess) { manager.IpfsHash = ipfsUpdate.Data; context.SaveChanges(); } } return manager.Id; })); }