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); }