Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        /// <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);
        }
Exemplo n.º 4
0
        /// <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);
        }
Exemplo n.º 5
0
        /// <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);
        }
Exemplo n.º 6
0
        /// <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);
        }
Exemplo n.º 7
0
        /// <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);
        }