Example #1
0
        private void HandleNegativeTurnover(GameActionEventBase @event, IBonusRepository repository, Transaction transaction)
        {
            var eventBus = _container.Resolve <IEventBus>();

            var player           = repository.GetLockedPlayer(@event.PlayerId);
            var bonusRedemptions = player.GetRedemptionsWithActiveRollover()
                                   .Where(br => br.Data.Contributions.Select(c => c.Transaction.Id).Contains(transaction.RelatedTransactionId.Value));

            foreach (var bonusRedemption in bonusRedemptions)
            {
                bonusRedemption.FulfillRollover(@event.Turnover, transaction);
                bonusRedemption.Events.ForEach(eventBus.Publish);
            }
        }
Example #2
0
        private void HandlePositiveTurnover(GameActionEventBase @event, IBonusRepository repository, Wallet wallet, Transaction transaction)
        {
            var eventBus      = _container.Resolve <IEventBus>();
            var bonusCommands = _container.Resolve <BonusCommands>();

            var player = repository.GetLockedPlayer(@event.PlayerId);
            var redemptionsWithActiveRollover = player.GetRedemptionsWithActiveRollover(wallet.Data.Template.Id);
            var turnoverLeftToDistribute      = @event.Turnover;

            foreach (var redemption in redemptionsWithActiveRollover)
            {
                var handledAmount = redemption.FulfillRollover(turnoverLeftToDistribute, transaction);
                turnoverLeftToDistribute -= handledAmount;

                if (redemption.RolloverLeft == 0m)
                {
                    redemption.CompleteRollover();
                    bonusCommands.WageringFulfilled(redemption);
                }

                if (turnoverLeftToDistribute == 0m)
                {
                    if (redemption.WageringThresholdIsMet(wallet.TotalBalance) &&
                        // Check if rollover is still Active, 'cos it can become Completed several lines before
                        redemption.Data.RolloverState == RolloverStatus.Active)
                    {
                        redemption.ZeroOutRollover(transaction);
                        bonusCommands.WageringFulfilled(redemption);
                    }

                    redemption.Events.ForEach(eventBus.Publish);
                    break;
                }

                redemption.Events.ForEach(eventBus.Publish);
            }

            player.Data.AccumulatedWageringAmount += @event.Turnover;
            if (player.CompletedReferralRequirements())
            {
                var referrer = repository.GetLockedPlayer(player.Data.ReferredBy.Value);
                bonusCommands.ProcessFirstBonusRedemptionOfType(referrer, BonusType.ReferFriend);
                player.CompleteReferralRequirements();
            }
        }