public FinishedToteRewards(AccountWithAmount[] proportionalReward, ToteOption winningOption, decimal ownerPercent) { ProportionalReward = proportionalReward; OwnerPercent = ownerPercent; WinningBets = winningOption.Bets; WinningOptionName = winningOption.Name; }
private static void AddToteOption(ToteOption option, Models.Tote tote, StringBuilder sb) { var participantsCount = option.Bets.Select(a => a.User).Distinct().Count(); sb.Append( $"*{option.Name}* "); if (participantsCount > 0) { var sum = option.Bets.Sum(a => a.Amount); sum = Decimal.Round(sum, 2); sb.Append( $"сделано ставок на {sum} {tote.Currency} от {participantsCount} {ParticipantsDecl(participantsCount)}"); } sb.AppendLine(); }
public FinishedToteRewards CalcRewards(Models.Tote tote, string winningOptionId) { var bets = tote.Options.SelectMany(a => a.Bets); var totalSum = bets.Sum(a => a.Amount); var ownerPercent = totalSum / 20; //5% more fun than 1% var winningFund = totalSum - ownerPercent; ToteOption winningOption = tote.Options.FirstOrDefault(a => a.Id == winningOptionId); var winningBets = winningOption.Bets; var winningBetsSum = winningBets.Sum(a => a.Amount); var ama = winningBets.Select(a => new AccountWithAmount(new Account(a.User, tote.Currency), a.Amount)); var agg = ama.AggregateOperations(); // var proportions = agg.Select(a => new AccountWithAmount(a.Account, a.Amount / winningBetsSum)); AccountWithAmount[] proportionalReward = agg.Select(a => new AccountWithAmount(a.Account, ((a.Amount * winningFund) / winningBetsSum).Trim())).ToArray(); ownerPercent = AdjustRemainderToOwner(proportionalReward, winningFund, ownerPercent); return(new FinishedToteRewards(proportionalReward, winningOption, ownerPercent)); }