Пример #1
0
        public async Task AddOrUpdateCampaignInCache(CampaignModel campaign)
        {
            var key = GetCampaignKeyFromPattern(campaign.Id);

            var campaignCached = await _db.StringGetAsync(key);

            if (campaignCached.HasValue)
            {
                await DeleteCampaignFromCache(campaign.Id);
            }

            foreach (var type in campaign.Conditions)
            {
                await AddOrUpdateBonusType(type.BonusType.Type, campaign.Id);
            }

            var serialized = JsonConvert.SerializeObject(campaign);

            await _db.StringSetAsync(key, serialized);
        }
        private async Task ProcessCampaignForCustomerAsync(Lykke.Service.BonusEngine.Domain.Models.Campaign campaign,
                                                           CampaignCompletion campaignCompletion, Guid operationId, IReadOnlyDictionary <string, string> data)
        {
            var customerId = campaignCompletion.CustomerId;
            var campaignId = campaign.Id;

            var conditionCompletions = await _conditionCompletionService
                                       .GetConditionCompletionsAsync(customerId, campaignId);

            if (IsCampaignCompleted(conditionCompletions, campaign) == false)
            {
                return;
            }

            var reward = await _bonusCalculatorService.CalculateRewardAmountAsync(campaign, customerId, conditionCompletions);

            var bonusOperation = new BonusOperation
            {
                CustomerId          = customerId,
                CampaignId          = campaignId,
                ExternalOperationId = operationId,
                Reward             = reward,
                TimeStamp          = DateTime.UtcNow,
                BonusOperationType = BonusOperationType.CampaignReward
            };

            if (data.TryGetValue(ReferralId, out string referralId))
            {
                bonusOperation.ReferralId = referralId;
            }

            await _bonusOperationService.AddBonusOperationAsync(bonusOperation);

            _log.Info("Customer completed all condition in campaign.",
                      context: $"operationId: {operationId}; campaignId: {campaignId}; customerId: {customerId}");

            await _campaignCompletionService.IncreaseCompletionCountAsync(campaignCompletion, campaign,
                                                                          conditionCompletions);
        }
        private void CreateConditionTestData()
        {
            BonusType = new BonusType
            {
                Type        = BonusTypeName,
                DisplayName = BonusTypeName
            };

            ConditionModel = new Condition()
            {
                CampaignId      = CampaignId,
                CompletionCount = 1,
                BonusType       = BonusType,
                Id = ConditionId,
                ImmediateReward = 10
            };

            ConditionModels = new List <Condition>()
            {
                ConditionModel
            };

            NewConditionCompletion = new ConditionCompletion
            {
                CustomerId   = CustomerId,
                ConditionId  = ConditionId,
                Id           = ConditionCompletionsId,
                CurrentCount = 0,
                IsCompleted  = false
            };

            ConditionCompletions = new List <ConditionCompletion>();

            NewConditionBonusOperation = new BonusOperation
            {
                CustomerId         = CustomerId,
                Reward             = ConditionModel.ImmediateReward,
                BonusOperationType = BonusOperationType.CampaignReward
            };

            CampaignModel = new CampaignModel()
            {
                Name            = "SignUp Campaign",
                Reward          = 20,
                Id              = CampaignId,
                CompletionCount = 1,
                Conditions      = new List <Condition>()
                {
                    ConditionModel
                }
            };

            CampaignModels = new List <CampaignModel>()
            {
                CampaignModel
            };

            CampaignCompletion = new CampaignCompletion()
            {
                CustomerId = CustomerId,
                CampaignId = CampaignId,
                CampaignCompletionCount = 0
            };

            CampaignCompletions = new List <CampaignCompletion>()
            {
                CampaignCompletion
            };

            NewCampaignBonusOperation = new BonusOperation
            {
                CustomerId         = CustomerId,
                Reward             = CampaignModel.Reward,
                BonusOperationType = BonusOperationType.CampaignReward
            };
        }
 private static bool IsCampaignCompleted(IReadOnlyCollection <ConditionCompletion> conditionCompletions,
                                         Lykke.Service.BonusEngine.Domain.Models.Campaign campaign)
 {
     return(conditionCompletions.Count == campaign.Conditions.Count &&
            conditionCompletions.All(c => c.IsCompleted));
 }
        public async Task ShouldCompleteStakableCampaignsWhereStakingEnabledOnConditions()
        {
            // Arrange
            var fixtureData = new CampaignServiceBonusProcessingTestsFixture();

            var partnerId       = Guid.NewGuid();
            var secondBonusType = new BonusType
            {
                CreationDate   = DateTime.UtcNow,
                DisplayName    = "secondbonustype",
                IsAvailable    = true,
                IsHidden       = false,
                IsStakeable    = true,
                RewardHasRatio = false,
                Type           = "secondbonustype"
            };

            var campaignId2 = Guid.NewGuid().ToString("D");
            var campaign2   = new CampaignModel
            {
                CompletionCount = 1,
                Id   = campaignId2,
                Name = "SignUp2",

                Conditions = new List <Condition>
                {
                    new Condition
                    {
                        CampaignId      = campaignId2,
                        CompletionCount = 1,
                        Id = Guid.NewGuid().ToString("D"),
                        ImmediateReward = 1,
                        BonusType       = fixtureData.BonusType,
                        HasStaking      = true
                    },
                    new Condition
                    {
                        CampaignId      = campaignId2,
                        CompletionCount = 1,
                        Id = Guid.NewGuid().ToString("D"),
                        ImmediateReward = 1,
                        BonusType       = secondBonusType
                    }
                }
            };

            var campaignId3 = Guid.NewGuid().ToString("D");
            var campaign3   = new CampaignModel
            {
                CompletionCount = 1,
                Id         = campaignId3,
                Name       = "SignUp3",
                Conditions = new List <Condition>
                {
                    new Condition
                    {
                        CampaignId      = campaignId3,
                        CompletionCount = 1,
                        Id = Guid.NewGuid().ToString("D"),
                        ImmediateReward = 1,
                        BonusType       = fixtureData.BonusType,
                        HasStaking      = true
                    },
                    new Condition
                    {
                        CampaignId      = campaignId3,
                        CompletionCount = 1,
                        Id = Guid.NewGuid().ToString("D"),
                        ImmediateReward = 1,
                        BonusType       = secondBonusType
                    }
                }
            };

            fixtureData.CampaignModel.Conditions = new List <Condition>
            {
                fixtureData.ConditionModel,
                new Condition
                {
                    CampaignId      = fixtureData.CampaignModel.Id,
                    CompletionCount = 1,
                    Id = Guid.NewGuid().ToString("D"),
                    ImmediateReward = 1,
                    BonusType       = secondBonusType
                }
            };

            fixtureData.CampaignModels.Add(campaign2);
            fixtureData.CampaignModels.Add(campaign3);

            fixtureData.CampaignCompletions.Add(new CampaignCompletion
            {
                CustomerId = fixtureData.CustomerId,
                CampaignId = campaignId2,
                CampaignCompletionCount = 0,
                IsCompleted             = false,
                Id = Guid.NewGuid().ToString()
            });
            fixtureData.CampaignCompletions.Add(new CampaignCompletion
            {
                CustomerId = fixtureData.CustomerId,
                CampaignId = campaignId3,
                CampaignCompletionCount = 0,
                IsCompleted             = false,
                Id = Guid.NewGuid().ToString()
            });

            fixtureData.SetupAllMocks();

            fixtureData.BonusCalculatorServiceMock.Setup(b =>
                                                         b.CalculateConditionRewardAmountAsync(It.IsAny <Condition>(), It.IsAny <ConditionCompletion>()))
            .ReturnsAsync(10);

            var data = new Dictionary <string, string>()
            {
                { "StakedCampaignId", campaignId3 }
            };

            // Execute
            await fixtureData.CampaignServiceInstance.ProcessEventForCustomerAsync(
                fixtureData.CustomerId,
                null,
                null,
                data,
                fixtureData.BonusTypeName);

            await fixtureData.CampaignServiceInstance.ProcessEventForCustomerAsync(
                fixtureData.CustomerId,
                null,
                null,
                new Dictionary <string, string>(),
                secondBonusType.Type);

            // Assert
            fixtureData.BonusOperationServiceMock.VerifyAll();

            fixtureData.BonusOperationServiceMock.Verify(c =>
                                                         c.AddBonusOperationAsync(It.IsAny <BonusOperation>()), Times.Exactly(3));
        }
        public async Task ShouldCompleteCampaign_WhenPartnerIdExistAndAllOtherRequirementsAreFulfilled()
        {
            // Arrange
            var fixtureData = new CampaignServiceBonusProcessingTestsFixture();

            var partnerId  = Guid.NewGuid();
            var locationId = Guid.NewGuid();

            var campaignId2 = Guid.NewGuid().ToString("D");
            var campaign2   = new CampaignModel
            {
                CompletionCount = 2,
                Id         = campaignId2,
                Name       = "SignUp2",
                Conditions = new List <Condition>
                {
                    new Condition
                    {
                        CampaignId      = Guid.NewGuid().ToString("D"),
                        CompletionCount = 3,
                        Id = campaignId2,
                        ImmediateReward = 1,
                        BonusType       = fixtureData.BonusType,
                        PartnerIds      = new Guid[]
                        {
                            partnerId,
                            Guid.NewGuid(),
                            Guid.NewGuid(),
                        }
                    }
                }
            };

            fixtureData.CampaignModels.Add(campaign2);

            fixtureData.CampaignCompletions.Add(new CampaignCompletion
            {
                IsCompleted = true,
                CampaignId  = campaignId2,
                CustomerId  = campaignId2,
                Id          = Guid.NewGuid().ToString("D")
            });

            fixtureData.ConditionCompletions.Add(fixtureData.NewConditionCompletion);

            fixtureData.SetupAllMocks();

            fixtureData.BonusCalculatorServiceMock.Setup(b =>
                                                         b.CalculateConditionRewardAmountAsync(It.IsAny <Condition>(), It.IsAny <ConditionCompletion>()))
            .ReturnsAsync(10);
            // Execute
            await fixtureData.CampaignServiceInstance.ProcessEventForCustomerAsync(
                fixtureData.CustomerId,
                partnerId.ToString(""),
                locationId.ToString(""),
                fixtureData.EventDataEmpty,
                fixtureData.BonusTypeName);

            // Assert
            fixtureData.BonusOperationServiceMock.VerifyAll();

            fixtureData.BonusOperationServiceMock.Verify(c =>
                                                         c.AddBonusOperationAsync(It.IsAny <BonusOperation>()), Times.Exactly(2));

            fixtureData.BonusOperationServiceMock.Verify(x =>
                                                         x.AddBonusOperationAsync(It.Is <BonusOperation>(p => p.Reward == fixtureData.CampaignModel.Reward)));

            fixtureData.BonusOperationServiceMock.Verify(x =>
                                                         x.AddBonusOperationAsync(It.Is <BonusOperation>(p => p.Reward == fixtureData.ConditionModel.ImmediateReward)));
        }