示例#1
0
        public async Task Calculate_Reward_Using_Conversion_Rate()
        {
            // arrange

            var campaign = new Domain.Models.Campaign
            {
                AmountInTokens   = 10,
                AmountInCurrency = 100,
                RewardType       = RewardType.ConversionRate,
                Id = Guid.NewGuid().ToString()
            };

            var conditionCompletions = new List <ConditionCompletion>
            {
                new ConditionCompletion
                {
                    Data = new[]
                    {
                        new Dictionary <string, string> {
                            { AmountName, "10" }
                        },
                        new Dictionary <string, string> {
                            { AmountName, "20" }
                        }
                    }
                }
            };

            var customerId = Guid.NewGuid();

            Money18 expectedAmount = 30;

            _eligibilityEngineClientMock.Setup(o => o.ConversionRate.GetAmountByEarnRuleAsync(
                                                   It.IsAny <ConvertAmountByEarnRuleRequest>()))
            .ReturnsAsync(new ConvertAmountByEarnRuleResponse()
            {
                Amount = 30
            });

            // act

            Money18 actualAmount = await _service.CalculateRewardAmountAsync(campaign, customerId.ToString(), conditionCompletions);

            // assert

            Assert.Equal(actualAmount, expectedAmount);
        }
        private async Task ProcessCampaignAsync(
            string customerId,
            string partnerId,
            string locationId,
            IReadOnlyDictionary <string, string> data,
            string conditionType,
            Domain.Models.Campaign campaign,
            Guid operationId)
        {
            var campaignCompletion = await _campaignCompletionService.GetByCampaignAsync(campaign.Id, customerId);

            if (campaignCompletion == null)
            {
                campaignCompletion = new CampaignCompletion
                {
                    CampaignCompletionCount = 0,
                    CampaignId  = campaign.Id,
                    CustomerId  = customerId,
                    IsCompleted = false
                };

                await _campaignCompletionService.InsertAsync(campaignCompletion);
            }

            if (!campaignCompletion.IsCompleted)
            {
                await PublishParticipationEventAsync(campaign.Id, customerId);

                var campaignModel = _mapper.Map <Domain.Models.Campaign>(campaign);

                var conditions = campaignModel.Conditions
                                 .Where(c => c.BonusType.Type == conditionType)
                                 .ToList();

                await ProcessConditionsForCustomerAsync(
                    customerId,
                    partnerId,
                    locationId,
                    campaignModel.Id,
                    conditions,
                    data,
                    operationId);

                await ProcessCampaignForCustomerAsync(campaignModel, campaignCompletion, operationId, data);
            }
        }
        public async Task <Money18> CalculateRewardAmountAsync(Domain.Models.Campaign campaign, string customerId,
                                                               IEnumerable <ConditionCompletion> conditionCompletions)
        {
            switch (campaign.RewardType)
            {
            case RewardType.Fixed:
                return(campaign.Reward);

            case RewardType.Percentage:
                return(await CalculateEarnRuleRewardByPercentageAsync(campaign.Id, customerId, campaign.Reward, conditionCompletions));

            case RewardType.ConversionRate:
                return(await CalculateRewardByConversionRate(campaign.Id, customerId, conditionCompletions));

            default:
                throw new Exception($"Unknown reward type '{campaign.RewardType}'.");
            }
        }
        public async Task IncreaseCompletionCountAsync(CampaignCompletion campaignCompletion, Domain.Models.Campaign campaign, IEnumerable <ConditionCompletion> conditionCompletions)
        {
            campaignCompletion.CampaignCompletionCount++;

            if (campaignCompletion.CampaignCompletionCount >= campaign.CompletionCount)
            {
                campaignCompletion.IsCompleted = true;
            }

            // Delete CONDITION tracking because they needs to be reset before next campaign completion
            await _conditionCompletion.DeleteAsync(conditionCompletions);

            // Keep track of CAMPAIGN completion
            await _campaignCompletionRepository.UpdateAsync(campaignCompletion);
        }