private List <DomainObjects.Portfolio.Portfolio> FillPortfoliosDistribution(List <DomainObjects.Portfolio.Portfolio> portfolio) { var distributions = DistributionBusiness.List(portfolio.Select(c => c.ProjectionId.Value)); portfolio.ForEach(c => c.Projection.Distribution = distributions.Where(d => d.ProjectionId == c.ProjectionId.Value).ToList()); return(portfolio); }
internal Projection Create(DomainObjects.Portfolio.Portfolio portfolio, double projectionValue, RiskType risk, double? optimisticProjection, double? pessimisticProjection, Dictionary<int, double> distribution) { var projection = SetNew(portfolio.Id, projectionValue, risk, optimisticProjection, pessimisticProjection); using (var transaction = new TransactionalDapperCommand()) { 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); projection.Distribution = distributions; transaction.Commit(); } return projection; }
public DomainObjects.Portfolio.Portfolio UpdateWithDistribution(string email, int portfolioId, decimal price, string name, string description, Dictionary <int, double> distribution) { var user = UserBusiness.GetValidUser(email); var portfolio = GetValidByOwner(user.Id, portfolioId); if (portfolio == null) { throw new ArgumentException("Invalid portfolio."); } var projection = ProjectionBusiness.Get(portfolio.ProjectionId.Value); if (projection == null) { throw new ArgumentException("Invalid projection."); } var risk = PortfolioBusiness.GetRisk(projection.ProjectionValue, distribution); using (var transaction = new TransactionalDapperCommand()) { var portfolioDetail = PortfolioDetailBusiness.SetNew(portfolioId, price, name, description, true); transaction.Insert(portfolioDetail); var newProjection = ProjectionBusiness.SetNew(portfolio.Id, projection.ProjectionValue, risk, projection.OptimisticProjectionValue, projection.PessimisticProjectionValue); transaction.Insert(newProjection); var distributions = DistributionBusiness.SetNew(newProjection.Id, distribution); foreach (Distribution dist in distributions) { transaction.Insert(dist); } portfolio.ProjectionId = newProjection.Id; transaction.Update(portfolio); newProjection.Distribution = distributions; portfolio.Detail = portfolioDetail; portfolio.Projection = newProjection; transaction.Commit(); } return(portfolio); }
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); }
public Model.Portfolio Get(string email, int portfolioId) { var user = UserBusiness.GetValidUser(email); var purchase = Task.Factory.StartNew(() => BuyBusiness.Get(user.Id, portfolioId)); var portfolio = Task.Factory.StartNew(() => Get(portfolioId)); Task.WaitAll(portfolio, purchase); var owned = user.Id == portfolio.Result.Advisor.UserId; var purchased = purchase.Result != null && BuyBusiness.IsValidPurchase(purchase.Result); if (portfolio.Result == null || (!owned && !purchased && (!portfolio.Result.Detail.Enabled || !portfolio.Result.Advisor.Detail.Enabled))) { throw new ArgumentException("Invalid portfolio."); } var portfolioQty = Task.Factory.StartNew(() => BuyBusiness.ListPortfoliosPurchases(new int[] { portfolioId })); var history = Task.Factory.StartNew(() => PortfolioHistoryBusiness.ListHistory(portfolioId)); Task <List <Distribution> > distribution = null; Task <List <EscrowResult> > escrowResult = null; Task <decimal?> purchaseAmount = null; if (purchased && purchase.Result.LastTransaction.TransactionStatus == TransactionStatus.Success.Value) { distribution = Task.Factory.StartNew(() => DistributionBusiness.List(new int[] { portfolio.Result.ProjectionId.Value })); Task.WaitAll(history, portfolioQty, distribution); } else if (owned) { distribution = Task.Factory.StartNew(() => DistributionBusiness.List(new int[] { portfolio.Result.ProjectionId.Value })); escrowResult = Task.Factory.StartNew(() => EscrowResultBusiness.ListByPortfolio(portfolio.Result.Id)); purchaseAmount = Task.Factory.StartNew(() => BuyBusiness.ListPortfolioPurchaseAmount(portfolio.Result.Id)); Task.WaitAll(history, portfolioQty, distribution, escrowResult, purchaseAmount); } else { Task.WaitAll(history, portfolioQty); } portfolio.Result.PortfolioHistory = history.Result; var result = FillPortfolioModel(portfolio.Result, portfolio.Result.Advisor, user, purchase.Result != null ? new Buy[] { purchase.Result } : null, portfolioQty.Result); result.Purchased = purchased; result.Histogram = PortfolioHistoryBusiness.GetHistogram(history.Result); result.HistoryData = history.Result.Select(c => new Model.Portfolio.History() { Date = c.Date, Value = c.RealValue }).ToList(); result.AssetDistribution = distribution == null ? null : distribution.Result.Select(c => new Model.Portfolio.Distribution() { Id = c.AssetId, Code = c.Asset.Code, Name = c.Asset.Name, Percentage = c.Percent, Type = (int)c.Asset.Type }).OrderByDescending(c => c.Percentage).ToList(); if (purchased) { GoalOption goalOption = null; if (purchase.Result.Goal != null) { goalOption = GoalOptionsBusiness.Get(purchase.Result.Goal.GoalOptionId); } result.PurchaseData = new Model.Portfolio.Purchase() { CreationDate = purchase.Result.CreationDate, ExpirationDate = purchase.Result.ExpirationDate, Price = purchase.Result.PortfolioDetail.Price, AucEscrow = distribution != null ? purchase.Result.PortfolioDetail.Price : 0, TransactionStatus = (int)purchase.Result.LastTransaction.TransactionStatus, Risk = purchase.Result.Projection.Risk, Goal = purchase.Result.Goal == null ? null : new Model.Portfolio.Goal() { Timeframe = purchase.Result.Goal.Timeframe, MonthlyContribution = purchase.Result.Goal.MonthlyContribution, StartingAmount = purchase.Result.Goal.StartingAmount, TargetAmount = purchase.Result.Goal.TargetAmount, Risk = RiskType.Get(purchase.Result.Goal.Risk, goalOption.Risk).Value } }; } else if (owned) { result.OwnerData = new Model.Portfolio.Owner(); if (purchaseAmount.Result.HasValue && purchaseAmount.Result.Value > 0) { var validResults = escrowResult.Result.Where(c => c.LastTransaction.TransactionStatus == TransactionStatus.Success.Value); result.OwnerData.AucReached = validResults.Sum(c => c.OwnerTokenResult); result.OwnerData.AucLost = validResults.Sum(c => c.BuyerTokenResult); result.OwnerData.AucEscrow = purchaseAmount.Result.Value - result.OwnerData.AucReached - result.OwnerData.AucLost; } } return(result); }