private void InternalCreate(TransactionalDapperCommand transaction, int userId, int buyId, string transactionHash) { var trans = TransactionBusiness.SetNew(userId, transactionHash); transaction.Insert(trans); var buyTrans = BuyTransactionBusiness.SetNew(buyId, trans.Id); transaction.Insert(buyTrans); }
private void HandleLostTransaction(Transaction transaction, int userId, int escrowResultId) { using (var trans = new TransactionalDapperCommand()) { transaction.TransactionStatus = TransactionStatus.Lost.Value; transaction.ProcessedDate = DateTime.UtcNow; trans.Update(transaction); var newTransaction = TransactionBusiness.SetNew(userId); trans.Insert(newTransaction); var escrowResultTrans = SetNew(escrowResultId, newTransaction.Id); trans.Insert(escrowResultTrans); trans.Commit(); } }
public void Evaluate() { var purchases = BuyBusiness.ListPendingEscrowResult(); foreach (var purchase in purchases) { try { var history = PortfolioHistoryBusiness.ListHistory(purchase.PortfolioId); if (history.Max(c => c.Date) < purchase.ExpirationDate.Value) { continue; } var projection = ProjectionBusiness.Get(purchase.ProjectionId); var dailyEstimatedPercentage = Util.Util.ConvertMonthlyToDailyRate(projection.ProjectionValue); var estimatedPercentage = Math.Pow(1.0 + dailyEstimatedPercentage, purchase.Days) - 1.0; var startDate = purchase.ExpirationDate.Value.AddDays(-purchase.Days); if (startDate < history.Min(c => c.Date)) { startDate = history.Min(c => c.Date); } var historyOfPeriod = history.Where(c => c.Date >= startDate && c.Date <= purchase.ExpirationDate.Value); var historyResult = PortfolioHistoryBusiness.GetHistoryResult(historyOfPeriod); var performedPercentage = historyResult.Value / 100.0; decimal buyerTokenAmount = 0, ownerTokenAmount = 0; if (estimatedPercentage > performedPercentage) { buyerTokenAmount = purchase.Price; } else { ownerTokenAmount = purchase.Price; } using (var transaction = new TransactionalDapperCommand()) { var escrowResult = new EscrowResult() { BuyId = purchase.Id, CreationDate = DateTime.UtcNow, BuyerTokenResult = buyerTokenAmount, OwnerTokenResult = ownerTokenAmount }; transaction.Insert(escrowResult); var trans = TransactionBusiness.SetNew(purchase.UserId); transaction.Insert(trans); var escrowResultTrans = EscrowResultTransactionBusiness.SetNew(escrowResult.Id, trans.Id); transaction.Insert(escrowResultTrans); transaction.Commit(); } } catch (Exception ex) { Logger.LogCritical(ex, $"Error on evaluate purchase {purchase.Id}"); } } }
public Buy Create(string email, string address, int portfolioId, int days, int?goalOptionId = null, int?timeframe = null, int?risk = null, double?targetAmount = null, double?startingAmount = null, double?monthlyContribution = null) { if (string.IsNullOrWhiteSpace(address)) { throw new ArgumentException("Address must be filled."); } if (days <= 0) { throw new ArgumentException("Invalid purchase days."); } var user = UserBusiness.GetValidUser(email, address); if (user?.ConfirmationDate == null) { throw new ArgumentException("User didn't confirmed e-mail."); } var portfolio = PortfolioBusiness.GetWithDetails(portfolioId); if (portfolio == null || !portfolio.Detail.Enabled || !portfolio.Advisor.Detail.Enabled) { throw new ArgumentException("Invalid portfolio."); } if (portfolio.Advisor.UserId == user.Id) { throw new ArgumentException("User is the advisor owner."); } var purchases = ListPurchases(user.Id); if (purchases.Any(c => c.PortfolioId == portfolio.Id)) { throw new ArgumentException("Portfolio already bought."); } Buy buy; using (var transaction = new TransactionalDapperCommand()) { Goal goal = null; if (portfolio.Advisor.Type == AdvisorType.Robo.Value) { if (!goalOptionId.HasValue || !timeframe.HasValue || !risk.HasValue || !startingAmount.HasValue || !monthlyContribution.HasValue) { throw new ArgumentException("Invalid goal data."); } goal = GoalBusiness.SetNew(user.Id, goalOptionId.Value, timeframe.Value, risk.Value, targetAmount, startingAmount.Value, monthlyContribution.Value); transaction.Insert(goal); } var price = Math.Floor(portfolio.Detail.Price * (decimal)(1000000.0 * days) / (decimal)30.0) / (decimal)1000000.0; buy = SetNew(days, price, portfolio.Id, portfolio.ProjectionId.Value, portfolio.Detail.Id, user.Id, goal?.Id); transaction.Insert(buy); var trans = TransactionBusiness.SetNew(user.Id); transaction.Insert(trans); var buyTrans = BuyTransactionBusiness.SetNew(buy.Id, trans.Id); transaction.Insert(buyTrans); buy.Goal = goal; buy.Portfolio = portfolio; buy.PortfolioDetail = portfolio.Detail; transaction.Commit(); } return(buy); }