public static string GetConsolidatedPrizesString(this VideoBattle battle, List <VideoBattlePrize> allPrizes, int?winnerPosition, ISponsorService sponsorService, ISettingService settingService, IPaymentProcessingService paymentProcessingService, IFormatterService formatterService, ICreditService creditService, BattleSettings battleSettings) { var battleOwnerPrizes = allPrizes.Where(x => !x.IsSponsored && (!winnerPosition.HasValue || x.WinnerPosition == winnerPosition.Value)); var sponsoredPrizes = allPrizes.Where(x => x.IsSponsored && (!winnerPosition.HasValue || x.WinnerPosition == winnerPosition.Value)); var videoBattlePrizes = battleOwnerPrizes as VideoBattlePrize[] ?? battleOwnerPrizes.ToArray(); var totalPrizesAmountFixed = videoBattlePrizes.Where(x => x.PrizeType == BattlePrizeType.FixedAmount).Sum(x => x.PrizeAmount); var totalPrizesAmountPercentage = 0m; if (videoBattlePrizes.Any(x => x.PrizeType == BattlePrizeType.PercentageAmount)) { var contextKeyName = string.Format(CreditContextKeyNames.BattleVote, battle.Id); //get spent credits for battle votes var credits = creditService.GetCredits(contextKeyName, null, CreditTransactionType.Spent); var orderSum = credits.Sum(x => x.CreditCount); var netOrderSum = paymentProcessingService.GetNetAmountAfterPaymentProcessing(orderSum); var totalWinners = videoBattlePrizes.Count(); //total voting amount from percentage totalPrizesAmountPercentage = netOrderSum - totalWinners * netOrderSum * battle.ParticipantPercentagePerVote / 100; } var sponsorships = sponsorService.GetSponsorsGrouped(null, battle.Id, BattleType.Video, SponsorshipStatus.Accepted); var sponsorshipAmount = sponsorships.Sum(x => x.SponsorshipAmount); //amount after payment processing var netSponsorshipAmount = paymentProcessingService.GetNetAmountAfterPaymentProcessing(sponsorshipAmount); var siteOwnerShare = netSponsorshipAmount * battleSettings.SiteOwnerVideoBattleSponsorshipPercentage / 100; //it may be possible that battle host himself is sponsor, he won't be getting commissions for that :) var battleHostAsSponsorAmount = sponsorships.Where(x => x.UserId == battle.ChallengerId).Sum(x => x.SponsorshipAmount); var battleHostShare = (netSponsorshipAmount - battleHostAsSponsorAmount) * battleSettings.BattleHostVideoBattleSponsorshipPercentage / 100; //amount available for winners var winnerPrizePool = netSponsorshipAmount - siteOwnerShare - battleHostShare; if (winnerPosition.HasValue) { winnerPrizePool = PrizeDistributionHelper.GetPrizeDistributionPercentage(winnerPosition.Value, allPrizes.Count(x => !x.IsSponsored), settingService) * winnerPrizePool; } var totalAmount = Math.Round(totalPrizesAmountFixed + totalPrizesAmountPercentage + winnerPrizePool); var totalPrizeString = totalAmount > 0 ? formatterService.FormatCurrency(totalAmount, ApplicationContext.Current.ActiveCurrency) : ""; if (allPrizes.Any(x => x.PrizeType == BattlePrizeType.FixedProduct || x.PrizeType == BattlePrizeType.Other)) { if (!winnerPosition.HasValue) { totalPrizeString += "+"; } else { //now append each product as prize with it's name to the prize string foreach (var prize in videoBattlePrizes.Where(x => x.PrizeType == BattlePrizeType.FixedProduct || x.PrizeType == BattlePrizeType.Other)) { if (prize.PrizeType == BattlePrizeType.FixedProduct) { //todo: do something for fixed product } else { totalPrizeString += (totalPrizeString != "" ? " + " : "") + prize.PrizeOther; } } //and sponsored products foreach (var prize in sponsoredPrizes.Where(x => x.PrizeType == BattlePrizeType.Other)) { totalPrizeString += (totalPrizeString != "" ? " + " : "") + prize.PrizeOther + "*"; } } } return(totalPrizeString); }
public static string GetConsolidatedPrizesString(this VideoBattle Battle, List <VideoBattlePrize> allPrizes, int?WinnerPosition, IWorkContext _workContext, IProductService _productService, ISponsorService _sponsorService, IVoterPassService _voterPassService, IVideoBattlePrizeService _videoBattlePrizeService, IPriceFormatter _priceFormatter, ISettingService _settingService, IPaymentProcessingService _paymentProcessingService, mobSocialSettings _mobSocialSettings) { var battleOwnerPrizes = allPrizes.Where(x => !x.IsSponsored && (!WinnerPosition.HasValue || x.WinnerPosition == WinnerPosition.Value)); var sponsoredPrizes = allPrizes.Where(x => x.IsSponsored && (!WinnerPosition.HasValue || x.WinnerPosition == WinnerPosition.Value)); var totalPrizesAmountFixed = battleOwnerPrizes.Where(x => x.PrizeType == VideoBattlePrizeType.FixedAmount).Sum(x => x.PrizeAmount); var totalPrizesAmountPercentage = 0m; if (battleOwnerPrizes.Any(x => x.PrizeType == VideoBattlePrizeType.PercentageAmount)) { var orders = _voterPassService.GetAllVoterPassOrders(BattleType.Video, Battle.Id, PassStatus.Used); var orderSum = orders.Sum(x => x.OrderTotal); var netOrderSum = _paymentProcessingService.GetNetAmountAfterPaymentProcessing(orderSum); var totalWinners = battleOwnerPrizes.Count(); //total voting amount from percentage totalPrizesAmountPercentage = netOrderSum - totalWinners * netOrderSum * Battle.ParticipantPercentagePerVote / 100; } var sponsorships = _sponsorService.GetSponsorsGrouped(null, Battle.Id, BattleType.Video, SponsorshipStatus.Accepted); var sponsorshipAmount = sponsorships.Sum(x => x.SponsorshipAmount); //amount after payment processing var netSponsorshipAmount = _paymentProcessingService.GetNetAmountAfterPaymentProcessing(sponsorshipAmount); var siteOwnerShare = netSponsorshipAmount * _mobSocialSettings.SiteOwnerSponsorshipPercentage / 100; //it may be possible that battle host himself is sponsor, he won't be getting commissions for that :) var battleHostAsSponsorAmount = sponsorships.Where(x => x.CustomerId == Battle.ChallengerId).Sum(x => x.SponsorshipAmount); var battleHostShare = (netSponsorshipAmount - battleHostAsSponsorAmount) * _mobSocialSettings.BattleHostSponsorshipPercentage / 100; //amount available for winners var winnerPrizePool = netSponsorshipAmount - siteOwnerShare - battleHostShare; if (WinnerPosition.HasValue) { winnerPrizePool = PrizeDistributionHelper.GetPrizeDistributionPercentage(WinnerPosition.Value, allPrizes.Count(x => !x.IsSponsored), _settingService) * winnerPrizePool; } var totalAmount = Math.Round(totalPrizesAmountFixed + totalPrizesAmountPercentage + winnerPrizePool); var totalPrizeString = totalAmount > 0 ? _priceFormatter.FormatPrice(totalAmount, true, _workContext.WorkingCurrency) : ""; if (allPrizes.Any( x => x.PrizeType == VideoBattlePrizeType.FixedProduct || x.PrizeType == VideoBattlePrizeType.Other)) { if (!WinnerPosition.HasValue) { totalPrizeString += "+"; } else { //now append each product as prize with it's name to the prize string foreach (var prize in battleOwnerPrizes.Where(x => x.PrizeType == VideoBattlePrizeType.FixedProduct || x.PrizeType == VideoBattlePrizeType.Other)) { if (prize.PrizeType == VideoBattlePrizeType.FixedProduct) { var product = _productService.GetProductById(prize.PrizeProductId); if (product != null) { totalPrizeString += (totalPrizeString != "" ? " + " : "") + product.Name; } else { totalPrizeString += (totalPrizeString != "" ? " + " : "") + prize.PrizeProductId; } } else { totalPrizeString += (totalPrizeString != "" ? " + " : "") + prize.PrizeOther; } } //and sponsored products foreach (var prize in sponsoredPrizes.Where(x => x.PrizeType == VideoBattlePrizeType.Other)) { totalPrizeString += (totalPrizeString != "" ? " + " : "") + prize.PrizeOther + "*"; } } } return(totalPrizeString); }