コード例 #1
0
ファイル: InvestmentConvertors.cs プロジェクト: wigewige/core
        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);
        }
コード例 #2
0
ファイル: InvestmentConvertors.cs プロジェクト: wigewige/core
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
ファイル: InvestmentConvertors.cs プロジェクト: wigewige/core
        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));
        }
コード例 #5
0
ファイル: InvestmentConvertors.cs プロジェクト: wigewige/core
 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());
 }
コード例 #6
0
ファイル: InvestmentConvertors.cs プロジェクト: wigewige/core
        private static bool GetIsHistoryEnable(InvestmentPrograms program, UserType?userType, Guid?userId)
        {
            if (!userId.HasValue)
            {
                return(false);
            }

            return(program.InvestmentRequests.Any(x => x.UserId == userId));
        }
コード例 #7
0
ファイル: InvestmentConvertors.cs プロジェクト: wigewige/core
        private static bool GetIsOwnProgram(InvestmentPrograms program, UserType?userType, Guid?userId)
        {
            if (!userId.HasValue || userType != UserType.Manager)
            {
                return(false);
            }

            return(program.ManagerAccount.UserId == userId);
        }
コード例 #8
0
ファイル: InvestmentConvertors.cs プロジェクト: wigewige/core
        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);
        }
コード例 #9
0
ファイル: InvestmentConvertors.cs プロジェクト: wigewige/core
        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));
        }
コード例 #10
0
ファイル: InvestmentConvertors.cs プロジェクト: wigewige/core
        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);
        }
コード例 #11
0
ファイル: InvestmentConvertors.cs プロジェクト: wigewige/core
        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));
        }
コード例 #12
0
        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);
        }
コード例 #13
0
ファイル: InvestmentConvertors.cs プロジェクト: wigewige/core
        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);
        }
コード例 #14
0
ファイル: InvestmentConvertors.cs プロジェクト: wigewige/core
        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);
        }
コード例 #15
0
        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);
        }
コード例 #16
0
        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> >());
        }
コード例 #17
0
ファイル: InvestmentConvertors.cs プロジェクト: wigewige/core
        private static DateTime GetEndOfPeriod(InvestmentPrograms program)
        {
            var period = program.Periods.OrderByDescending(p => p.Number).FirstOrDefault();

            return(period?.DateFrom ?? default(DateTime));
        }
コード例 #18
0
        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;
            }));
        }