public void GivingJourneyStage_CalculatesGivingJourneyStageCorrectly(GivingJourneyStage?expectedGivingJourneyStage, params int[] daysAgoList) { GivingJourneySettings givingJourneySettings = new GivingJourneySettings(); givingJourneySettings.FormerGiverNoContributionInTheLastDays = 375; givingJourneySettings.FormerGiverMedianFrequencyLessThanDays = 320; givingJourneySettings.LapsedGiverNoContributionInTheLastDays = 150; givingJourneySettings.LapsedGiverMedianFrequencyLessThanDays = 100; givingJourneySettings.NewGiverContributionCountBetweenMinimum = 1; givingJourneySettings.NewGiverContributionCountBetweenMaximum = 5; givingJourneySettings.NewGiverFirstGiftInTheLastDays = 150; givingJourneySettings.OccasionalGiverMedianFrequencyDaysMinimum = 33; givingJourneySettings.OccasionalGiverMedianFrequencyDaysMaximum = 94; givingJourneySettings.ConsistentGiverMedianLessThanDays = 32; var currentDate = RockDateTime.Now; var transactionDates = new List <DateTime>(); foreach (var daysAgo in daysAgoList) { transactionDates.Add(currentDate.AddDays(-daysAgo)); } var givingJourneyStage = GivingJourneyHelper.GetGivingJourneyStage(givingJourneySettings, currentDate, transactionDates); Assert.AreEqual(expectedGivingJourneyStage, givingJourneyStage); }
public void GivingJourneyStage_CalculatesGivingJourneyStageCorrectlyWithNullSettings(GivingJourneyStage?unExpectedGivingJourneyStage, params int[] daysAgoList) { GivingJourneySettings givingJourneySettings = new GivingJourneySettings(); givingJourneySettings.FormerGiverNoContributionInTheLastDays = null; givingJourneySettings.FormerGiverMedianFrequencyLessThanDays = null; givingJourneySettings.LapsedGiverNoContributionInTheLastDays = null; givingJourneySettings.LapsedGiverMedianFrequencyLessThanDays = null; givingJourneySettings.NewGiverContributionCountBetweenMinimum = null; givingJourneySettings.NewGiverContributionCountBetweenMaximum = null; givingJourneySettings.NewGiverFirstGiftInTheLastDays = null; givingJourneySettings.OccasionalGiverMedianFrequencyDaysMinimum = null; givingJourneySettings.OccasionalGiverMedianFrequencyDaysMaximum = null; givingJourneySettings.ConsistentGiverMedianLessThanDays = null; var currentDate = RockDateTime.Now; var transactionDates = new List <DateTime>(); foreach (var daysAgo in daysAgoList) { transactionDates.Add(currentDate.AddDays(-daysAgo)); } var givingJourneyStage = GivingJourneyHelper.GetGivingJourneyStage(givingJourneySettings, currentDate, transactionDates); // with NULL giving JourneySettings, all the results should be null and not what they would be if not null Assert.AreNotEqual(unExpectedGivingJourneyStage, givingJourneyStage); Assert.AreEqual(null, givingJourneyStage); }
/// <summary> /// Determines whether [is lapsed giver] [the specified giving journey settings]. /// </summary> /// <param name="givingJourneySettings">The giving journey settings.</param> /// <param name="medianDaysBetween">The median days between.</param> /// <param name="daysSinceMostRecentTransaction">The days since most recent transaction.</param> /// <returns><c>true</c> if [is lapsed giver] [the specified giving journey settings]; otherwise, <c>false</c>.</returns> private static bool IsLapsedGiver(GivingJourneySettings givingJourneySettings, int?medianDaysBetween, double daysSinceMostRecentTransaction) { bool isLapsedGiver = false; if (givingJourneySettings.LapsedGiverNoContributionInTheLastDays.HasValue) { isLapsedGiver = daysSinceMostRecentTransaction > givingJourneySettings.LapsedGiverNoContributionInTheLastDays.Value; if (givingJourneySettings.LapsedGiverMedianFrequencyLessThanDays.HasValue && medianDaysBetween.HasValue) { isLapsedGiver = isLapsedGiver && (medianDaysBetween < givingJourneySettings.LapsedGiverMedianFrequencyLessThanDays.Value); } } return(isLapsedGiver); }
/// <summary> /// Gets the giving journey stage. /// </summary> /// <param name="givingJourneySettings">The giving journey settings.</param> /// <param name="currentDate">The current date.</param> /// <param name="transactionDateList">The transaction date list.</param> /// <returns></returns> internal static GivingJourneyStage?GetGivingJourneyStage(GivingJourneySettings givingJourneySettings, DateTime currentDate, List <DateTime> transactionDateList) { if (!transactionDateList.Any()) { return(GivingJourneyStage.None); } var mostRecentTransactionDateTime = transactionDateList.Max(); var firstTransactionDateTime = transactionDateList.Min(); var daysBetweenList = GetBetweenDatesDays(transactionDateList); var medianDaysBetween = GetMedian(daysBetweenList); var daysSinceMostRecentTransaction = (currentDate - mostRecentTransactionDateTime).TotalDays; var daysSinceFirstTransaction = (currentDate - firstTransactionDateTime).TotalDays; GivingJourneyStage?givingIdGivingJourneyStage; if (IsFormerGiver(givingJourneySettings, medianDaysBetween, daysSinceMostRecentTransaction)) { givingIdGivingJourneyStage = GivingJourneyStage.Former; } else if (IsLapsedGiver(givingJourneySettings, medianDaysBetween, daysSinceMostRecentTransaction)) { givingIdGivingJourneyStage = GivingJourneyStage.Lapsed; } else if (IsNewGiver(givingJourneySettings, transactionDateList.Count, daysSinceFirstTransaction)) { givingIdGivingJourneyStage = GivingJourneyStage.New; } else if (IsOccasionalGiver(givingJourneySettings, medianDaysBetween)) { givingIdGivingJourneyStage = GivingJourneyStage.Occasional; } else if (IsConsistentGiver(givingJourneySettings, medianDaysBetween)) { givingIdGivingJourneyStage = GivingJourneyStage.Consistent; } else { givingIdGivingJourneyStage = null; } return(givingIdGivingJourneyStage); }
/// <summary> /// Determines whether [is consistent giver] [the specified giving journey settings]. /// </summary> /// <param name="givingJourneySettings">The giving journey settings.</param> /// <param name="medianDaysBetween">The median days between.</param> /// <returns><c>true</c> if [is consistent giver] [the specified giving journey settings]; otherwise, <c>false</c>.</returns> private static bool IsConsistentGiver(GivingJourneySettings givingJourneySettings, int?medianDaysBetween) { if (!medianDaysBetween.HasValue) { return(false); } if (!givingJourneySettings.ConsistentGiverMedianLessThanDays.HasValue) { // not configured return(false); } if (medianDaysBetween < givingJourneySettings.ConsistentGiverMedianLessThanDays) { return(true); } return(false); }
/// <summary> /// Determines whether [is occasional giver] [the specified giving journey settings]. /// </summary> /// <param name="givingJourneySettings">The giving journey settings.</param> /// <param name="medianDaysBetween">The median days between.</param> /// <returns><c>true</c> if [is occasional giver] [the specified giving journey settings]; otherwise, <c>false</c>.</returns> private static bool IsOccasionalGiver(GivingJourneySettings givingJourneySettings, int?medianDaysBetween) { if (!medianDaysBetween.HasValue) { return(false); } if (!givingJourneySettings.OccasionalGiverMedianFrequencyDaysMinimum.HasValue || !givingJourneySettings.OccasionalGiverMedianFrequencyDaysMaximum.HasValue) { // not configured return(false); } var medianDaysMin = givingJourneySettings.OccasionalGiverMedianFrequencyDaysMinimum.Value; var medianDaysMax = givingJourneySettings.OccasionalGiverMedianFrequencyDaysMaximum.Value; if (medianDaysBetween.Value >= medianDaysMin && medianDaysBetween.Value <= medianDaysMax) { return(true); } return(false); }
/// <summary> /// Determines whether [is new giver] [the specified giving journey settings]. /// </summary> /// <param name="givingJourneySettings">The giving journey settings.</param> /// <param name="transactionCount">The transaction count.</param> /// <param name="daysSinceFirstTransaction">The days since first transaction.</param> /// <returns><c>true</c> if [is new giver] [the specified giving journey settings]; otherwise, <c>false</c>.</returns> private static bool IsNewGiver(GivingJourneySettings givingJourneySettings, int transactionCount, double daysSinceFirstTransaction) { if (!givingJourneySettings.NewGiverContributionCountBetweenMinimum.HasValue || !givingJourneySettings.NewGiverContributionCountBetweenMaximum.HasValue || !givingJourneySettings.NewGiverFirstGiftInTheLastDays.HasValue) { // not configured return(false); } if (daysSinceFirstTransaction > givingJourneySettings.NewGiverFirstGiftInTheLastDays.Value) { // gave more than NewGiverFirstGiftInTheLastDays ago return(false); } var minCount = givingJourneySettings.NewGiverContributionCountBetweenMinimum.Value; var maxCount = givingJourneySettings.NewGiverContributionCountBetweenMaximum.Value; if (transactionCount >= minCount && transactionCount <= maxCount) { return(true); } return(false); }