protected async Task <IActionResult> RegisterAsync(RegisterAdvisorRequest beAdvisorRequest)
        {
            if (beAdvisorRequest == null)
            {
                return(BadRequest());
            }

            if (GetUser() == null && !IsValidRecaptcha(beAdvisorRequest.Captcha))
            {
                return(BadRequest(new { error = "Invalid Captcha." }));
            }

            LoginResponse response;

            if (beAdvisorRequest.ChangedPicture && RequestHasFile())
            {
                var fileExtension = GetValidPictureExtension();
                using (var stream = Request.Form.Files[0].OpenReadStream())
                    response = await AdvisorBusiness.CreateAsync(beAdvisorRequest.Email, beAdvisorRequest.Password, beAdvisorRequest.Name, beAdvisorRequest.Description,
                                                                 beAdvisorRequest.ReferralCode, beAdvisorRequest.ChangedPicture, stream, fileExtension);
            }
            else
            {
                response = await AdvisorBusiness.CreateAsync(beAdvisorRequest.Email, beAdvisorRequest.Password, beAdvisorRequest.Name, beAdvisorRequest.Description,
                                                             beAdvisorRequest.ReferralCode, beAdvisorRequest.ChangedPicture, null, null);
            }

            return(Ok(new { logged = !response.PendingConfirmation, jwt = GenerateToken(response.Email.ToLower().Trim()), data = response }));
        }
 protected async Task <IActionResult> EditAdvisorAsync(int id, AdvisorRequest advisorRequest)
 {
     if (advisorRequest.ChangedPicture && RequestHasFile())
     {
         var fileExtension = GetValidPictureExtension();
         using (var stream = Request.Form.Files[0].OpenReadStream())
             return(Ok(await AdvisorBusiness.EditAdvisorAsync(id, advisorRequest.Name, advisorRequest.Description, true, stream, fileExtension)));
     }
     else
     {
         return(Ok(await AdvisorBusiness.EditAdvisorAsync(id, advisorRequest.Name, advisorRequest.Description, advisorRequest.ChangedPicture, null, null)));
     }
 }
Esempio n. 3
0
        public SearchResponse Search(string searchTerm)
        {
            if (string.IsNullOrWhiteSpace(searchTerm) || searchTerm.Trim().Length < 2)
            {
                return(new SearchResponse());
            }

            IEnumerable <DomainObjects.Advisor.Advisor> advisors = null;
            IEnumerable <DomainObjects.Asset.Asset>     assets   = null;

            Parallel.Invoke(() => advisors = AdvisorBusiness.ListByName(searchTerm), () => assets = AssetBusiness.ListByNameOrCode(searchTerm));

            if (!assets.Any() && !advisors.Any())
            {
                return(new SearchResponse());
            }

            var response = new SearchResponse();

            foreach (DomainObjects.Advisor.Advisor advisor in advisors)
            {
                response.Advisors.Add(new SearchResponse.AdvisorResult()
                {
                    Id          = advisor.Id,
                    Description = advisor.Description,
                    Name        = advisor.Name,
                    UrlGuid     = advisor.UrlGuid.ToString()
                });
            }
            foreach (DomainObjects.Asset.Asset asset in assets)
            {
                response.Assets.Add(new SearchResponse.AssetResult()
                {
                    Id                = asset.Id,
                    Code              = asset.Code,
                    Name              = asset.Name,
                    MarketCap         = asset.MarketCap,
                    CirculatingSupply = asset.CirculatingSupply
                });
            }
            response.Advisors = response.Advisors.OrderBy(c => c.Name).ToList();
            response.Assets   = response.Assets.OrderByDescending(c => c.MarketCap).ThenBy(c => c.Name).ToList();
            return(response);
        }
Esempio n. 4
0
        public DomainObjects.Portfolio.Portfolio Create(string email, int advisorId, decimal price, string name, string description,
                                                        double projectionValue, double?optimisticProjection, double?pessimisticProjection, Dictionary <int, double> distribution)
        {
            var advisor = AdvisorBusiness.GetWithOwner(advisorId, email);

            if (advisor == null)
            {
                throw new ArgumentException("Invalid advisor.");
            }

            var risk          = GetRisk(projectionValue, distribution);
            var advisorDetail = AdvisorDetailBusiness.GetForAutoEnabled(advisorId);

            var portfolio = new DomainObjects.Portfolio.Portfolio();

            portfolio.AdvisorId    = advisorId;
            portfolio.CreationDate = DateTime.UtcNow;
            using (var transaction = new TransactionalDapperCommand())
            {
                transaction.Insert(portfolio);
                var detail = PortfolioDetailBusiness.SetNew(portfolio.Id, price, name, description, true);
                transaction.Insert(detail);
                var projection = ProjectionBusiness.SetNew(portfolio.Id, projectionValue, risk, optimisticProjection, pessimisticProjection);
                transaction.Insert(projection);
                var distributions = DistributionBusiness.SetNew(projection.Id, distribution);
                foreach (Distribution dist in distributions)
                {
                    transaction.Insert(dist);
                }

                portfolio.ProjectionId = projection.Id;
                transaction.Update(portfolio);
                if (advisorDetail != null)
                {
                    advisorDetail = AdvisorDetailBusiness.SetNew(advisorId, advisorDetail.Name, advisorDetail.Description, true);
                    transaction.Insert(advisorDetail);
                }
                projection.Distribution = distributions;
                portfolio.Projection    = projection;
                portfolio.Detail        = detail;
                transaction.Commit();
            }
            return(portfolio);
        }
Esempio n. 5
0
        public Login Login(string address, string emailOrUsername, string password)
        {
            BaseEmailOrUsernameValidation(emailOrUsername);
            BasePasswordValidation(password);
            address = WalletBusiness.GetAddressFormatted(address);

            var user = Data.GetByEmailOrUsername(emailOrUsername);

            if (user == null)
            {
                throw new ArgumentException("Email or username is invalid.");
            }
            else if (user.Wallet.Address?.ToUpper() != address?.ToUpper())
            {
                throw new ArgumentException("Wallet is invalid.");
            }
            else if (user.Password != Security.Hash(password))
            {
                throw new ArgumentException("Password is invalid.");
            }

            var result = new Model.Login()
            {
                Address             = user.Wallet.Address,
                Email               = user.Email,
                Username            = user.Username,
                PendingConfirmation = !user.ConfirmationDate.HasValue
            };

            if (!result.PendingConfirmation)
            {
                MemoryCache.Set <User>(user.Email, user);
                var purchases = Task.Factory.StartNew(() => BuyBusiness.ListPurchases(user.Id));
                var advisor   = Task.Factory.StartNew(() => AdvisorBusiness.SimpleGetByOwner(user.Id));

                Task.WaitAll(purchases, advisor);

                result.HumanAdvisorId = advisor.Result?.Id;
                result.HasInvestment  = purchases.Result.Count > 0;
            }

            return(result);
        }
Esempio n. 6
0
 public KeyValuePair <int, IEnumerable <Model.Portfolio> > ListRoboAdvisors(string email, int goalOptionId, int risk)
 {
     return(AdvisorBusiness.ListRoboAdvisors(email, goalOptionId, risk));
 }
Esempio n. 7
0
 public Model.Advisor ListAdvisorDetails(string email, int advisorId)
 {
     return(AdvisorBusiness.ListDetails(email, advisorId));
 }
Esempio n. 8
0
 public DomainObjects.Advisor.Advisor CreateAdvisor(string email, string name, string description)
 {
     return(AdvisorBusiness.Create(email, name, description));
 }
 protected virtual IActionResult ListAdvisorsFollowedByUser(int id)
 {
     return(Ok(AdvisorBusiness.ListAdvisorsFollowedByUser(id)));
 }
Esempio n. 10
0
        public DashboardResponse GetDashboardData()
        {
            var cutDayForActivity = Data.GetDateTimeNow().AddDays(-7);
            var advisors          = AdvisorBusiness.ListAllAdvisors();
            var users             = Task.Factory.StartNew(() => UserBusiness.ListAllUsersData());
            var advisorFollowers  = Task.Factory.StartNew(() => FollowAdvisorBusiness.ListFollowers(advisors.Select(c => c.Id).Distinct(), false));
            var assetFollowers    = Task.Factory.StartNew(() => FollowAssetBusiness.ListFollowers());
            var activities        = Task.Factory.StartNew(() => Data.FilterActivity(cutDayForActivity, ActionType.NewAucVerification, ActionType.NewLogin));

            Task.WaitAll(users, advisorFollowers, assetFollowers, activities);

            var adminsId                   = users.Result.Where(c => Admins?.Any(a => a == c.Email) == true).Select(c => c.Id).ToHashSet();
            var consideredUsers            = users.Result.Where(c => !adminsId.Contains(c.Id) && (!c.ReferredId.HasValue || !adminsId.Contains(c.ReferredId.Value))).ToList();
            var consideredAdvisors         = advisors.Where(c => !adminsId.Contains(c.Id) && (!c.ReferredId.HasValue || !adminsId.Contains(c.ReferredId.Value))).ToList();
            var consideredAdvisorFollowers = advisorFollowers.Result.Where(c => consideredUsers.Any(u => u.Id == c.UserId)).ToList();
            var consideredAssetFollowers   = assetFollowers.Result.Where(c => consideredUsers.Any(u => u.Id == c.UserId)).ToList();
            var consideredActivities       = activities.Result.Where(c => consideredUsers.Any(u => u.Id == c.UserId)).ToList();

            var result = new DashboardResponse();

            result.TotalUsersConfirmed                       = consideredUsers.Count(c => c.Wallets.Any());
            result.TotalUsersConfirmedFromReferral           = consideredUsers.Count(c => c.ReferredId.HasValue && c.Wallets.Any());
            result.TotalUsersStartedRegistration             = consideredUsers.Count(c => !consideredAdvisors.Any(a => a.Id == c.Id) && !c.Wallets.Any());
            result.TotalUsersStartedRegistrationFromReferral = consideredUsers.Count(c => c.ReferredId.HasValue && !consideredAdvisors.Any(a => a.Id == c.Id) && !c.Wallets.Any());
            result.TotalAdvisors          = consideredAdvisors.Count;
            result.TotalActiveUsers       = consideredActivities.Any() ? consideredActivities.Select(c => c.UserId).Distinct().Count(c => !consideredAdvisors.Any(a => a.Id == c) && consideredUsers.Any(u => u.Id == c && u.Wallets.Any())) : 0;
            result.TotalWalletsInProgress = consideredUsers.Count(c => c.ReferralStatusType == ReferralStatusType.InProgress);
            result.TotalFollowing         = consideredAdvisorFollowers.Count + consideredAssetFollowers.Count;
            result.TotalAdvisorsFollowed  = consideredAdvisorFollowers.Any() ? consideredAdvisorFollowers.Select(c => c.AdvisorId).Distinct().Count() : 0;
            result.TotalUsersFollowing    = consideredAdvisorFollowers.Any() || consideredAssetFollowers.Any() ?
                                            consideredAdvisorFollowers.Select(c => c.UserId).Concat(consideredAssetFollowers.Select(c => c.UserId)).Distinct().Count() : 0;

            var confirmedUsers = new Dictionary <int, DateTime>();

            foreach (var user in consideredUsers.Where(c => c.Wallets.Any()))
            {
                if (!consideredAdvisors.Any(c => c.Id == user.Id))
                {
                    confirmedUsers[user.Id] = user.Wallets.OrderBy(c => c.CreationDate).First().CreationDate;
                }

                var currentWallet = user.Wallets.OrderByDescending(c => c.CreationDate).First();
                result.TotalWalletsWithAuc += currentWallet.AUCBalance > 0 ? 1 : 0;
                result.AucHolded           += Convert.ToDouble(currentWallet.AUCBalance ?? 0);
                result.AucHoldedInProgress += user.ReferralStatusType == ReferralStatusType.InProgress ? Convert.ToDouble(currentWallet.AUCBalance ?? 0) : 0;
            }
            result.AucRatioPerConfirmedUser  = result.TotalUsersConfirmed > 0 ? result.AucHolded / result.TotalUsersConfirmed : 0;
            result.AucRatioPerUserInProgress = result.TotalWalletsInProgress > 0 ? result.AucHoldedInProgress / result.TotalWalletsInProgress : 0;

            var usersConfirmedData = !confirmedUsers.Any() ? null : confirmedUsers.GroupBy(c => c.Value.ToString("yyyy-MM-dd"))
                                     .Select(g => new DashboardResponse.RegistrationData()
            {
                Date = DateTime.Parse(g.Key), Value = g.Count()
            }).OrderBy(c => c.Date);

            var advisorsData = !consideredAdvisors.Any() ? null : consideredAdvisors.GroupBy(c => c.BecameAdvisorDate.ToString("yyyy-MM-dd"))
                               .Select(g => new DashboardResponse.RegistrationData()
            {
                Date = DateTime.Parse(g.Key), Value = g.Count()
            }).OrderBy(c => c.Date);

            var usersStartedRegistrationData = !consideredUsers.Any(c => !consideredAdvisors.Any(a => a.Id == c.Id) && !c.Wallets.Any()) ? null :
                                               consideredUsers.Where(c => !consideredAdvisors.Any(a => a.Id == c.Id) && !c.Wallets.Any()).GroupBy(c => c.CreationDate.ToString("yyyy-MM-dd"))
                                               .Select(g => new DashboardResponse.RegistrationData()
            {
                Date = DateTime.Parse(g.Key), Value = g.Count()
            }).OrderBy(c => c.Date);

            var minDate = GetMinDate(usersConfirmedData, advisorsData, usersStartedRegistrationData);

            result.UsersConfirmed                         = GetRegistrationData(usersConfirmedData, minDate);
            result.Advisors                               = GetRegistrationData(advisorsData, minDate);
            result.UsersStartedRegistration               = GetRegistrationData(usersStartedRegistrationData, minDate);
            result.UsersConfirmedLastSitutation           = GetFlagData(result.UsersConfirmed);
            result.AdvisorsLastSitutation                 = GetFlagData(result.Advisors);
            result.UsersStartedRegistrationLastSitutation = GetFlagData(result.UsersStartedRegistration);

            result.UsersConfirmed.Add(new DashboardResponse.RegistrationData()
            {
                Date = Data.GetDateTimeNow().Date.AddDays(1), Value = result.UsersConfirmed.LastOrDefault()?.Value ?? 0
            });
            result.Advisors.Add(new DashboardResponse.RegistrationData()
            {
                Date = Data.GetDateTimeNow().Date.AddDays(1), Value = result.Advisors.LastOrDefault()?.Value ?? 0
            });
            result.UsersStartedRegistration.Add(new DashboardResponse.RegistrationData()
            {
                Date = Data.GetDateTimeNow().Date.AddDays(1), Value = result.UsersStartedRegistration.LastOrDefault()?.Value ?? 0
            });

            result.Following.Add(new DashboardResponse.DistributionData()
            {
                Name = "Asset", Amount = consideredAssetFollowers.Count()
            });
            result.Following.Add(new DashboardResponse.DistributionData()
            {
                Name = "Expert", Amount = consideredAdvisorFollowers.Count()
            });

            var usersWithReferral = consideredUsers.Where(c => c.ReferralStatus.HasValue);

            result.ReferralStatus = !usersWithReferral.Any() ? new List <DashboardResponse.DistributionData>() : usersWithReferral.GroupBy(c => c.ReferralStatus.Value)
                                    .Select(g => new DashboardResponse.DistributionData()
            {
                Name = ReferralStatusType.Get(g.Key).GetDescription(), Amount = g.Count()
            }).ToList();

            var groupedFollowers = !consideredAdvisorFollowers.Any() ? null : consideredAdvisorFollowers.GroupBy(c => c.AdvisorId).Select(g => new { Id = g.Key, Value = g.Count() }).OrderByDescending(c => c.Value);

            if (groupedFollowers?.Any() == true)
            {
                groupedFollowers = groupedFollowers.Take(groupedFollowers.Count() > 10 ? 10 : groupedFollowers.Count()).OrderByDescending(c => c.Value);
                var consideredFollowers = consideredAdvisorFollowers.Where(c => groupedFollowers.Any(a => a.Id == c.AdvisorId));
                result.AdvisorFollowers = groupedFollowers.Select(c => new DashboardResponse.AdvisorData()
                {
                    Id        = c.Id,
                    Name      = consideredAdvisors.First(a => a.Id == c.Id).Name,
                    UrlGuid   = consideredAdvisors.First(a => a.Id == c.Id).UrlGuid.ToString(),
                    Total     = c.Value,
                    SubValue1 = consideredFollowers.Count(a => a.CreationDate >= cutDayForActivity && a.AdvisorId == c.Id)
                }).ToList();
            }

            var groupedReferred = !usersWithReferral.Any() ? null : usersWithReferral.GroupBy(c => c.ReferredId.Value).Select(g => new { Id = g.Key, Value = g.Count() }).OrderByDescending(c => c.Value);

            if (groupedReferred?.Any() == true)
            {
                groupedReferred = groupedReferred.Take(groupedReferred.Count() > 10 ? 10 : groupedReferred.Count()).OrderByDescending(c => c.Value);
                var consideredReferred = consideredUsers.Where(c => c.ReferralStatus.HasValue).Where(c => groupedReferred.Any(a => a.Id == c.ReferredId));
                result.AdvisorReferral = groupedReferred.Select(c => new DashboardResponse.AdvisorData()
                {
                    Id   = c.Id,
                    Name = consideredAdvisors.Any(a => a.Id == c.Id) ? consideredAdvisors.First(a => a.Id == c.Id).Name :
                           consideredUsers.Any(u => u.Id == c.Id) ? consideredUsers.First(u => u.Id == c.Id).Email : "(ADMIN) " + users.Result.First(u => u.Id == c.Id).Email,
                    UrlGuid   = consideredAdvisors.Any(a => a.Id == c.Id) ? consideredAdvisors.First(a => a.Id == c.Id).UrlGuid.ToString() : null,
                    Total     = c.Value,
                    SubValue1 = consideredReferred.Count(a => a.ReferredId == c.Id && a.ReferralStatusType == ReferralStatusType.InProgress),
                    SubValue2 = consideredReferred.Count(a => a.ReferredId == c.Id && a.ReferralStatusType == ReferralStatusType.Interrupted),
                    SubValue3 = consideredReferred.Count(a => a.ReferredId == c.Id && (a.ReferralStatusType == ReferralStatusType.Finished || a.ReferralStatusType == ReferralStatusType.Paid))
                }).ToList();
            }

            return(result);
        }
Esempio n. 11
0
 protected IActionResult ListAdvisors()
 {
     return(Ok(AdvisorBusiness.ListAdvisorsData()));
 }
Esempio n. 12
0
 protected IActionResult ListAdvisorsRanking(int?year, int?month)
 {
     return(Ok(AdvisorBusiness.ListAdvisorsMonthlyRanking(year, month)));
 }
Esempio n. 13
0
 protected IActionResult GetLoggedAdvisor()
 {
     return(Ok(AdvisorBusiness.GetLoggedAdvisor()));
 }
Esempio n. 14
0
 protected IActionResult GetAdvisorPeformance(int id)
 {
     return(Ok(AdvisorBusiness.GetAdvisorPeformance(id)));
 }
Esempio n. 15
0
 protected IActionResult GetAdvisorDetails(int id)
 {
     return(Ok(AdvisorBusiness.GetAdvisorData(id)));
 }