public static void CaptureCostScheduleData(EventOccurrenceV2 source, EventOccurrence target)
        {
            Decimal? sourceEarlyCost = GetDecimalValue(source.EarlyCost);
            var sourceEarlyCostEndDate = GetDateTime(source.EarlyCostEndDate);
            var sourceEarlyCostEndDays = GetNullableInt(source.EarlyCostEndDays);

            var earlyScheduleHasNecessaryValues = sourceEarlyCost.HasValue && (sourceEarlyCostEndDate.HasValue || sourceEarlyCostEndDays.HasValue);

            if (earlyScheduleHasNecessaryValues)
            {
                var hasEarlyDateValue = sourceEarlyCostEndDate.HasValue;
                if (hasEarlyDateValue)
                {
                    var EarlyCostPriceSchedule = new PricingSchedule(sourceEarlyCost.Value, sourceEarlyCostEndDate.Value);
                    target.SetEarlyRegistrationPrice(EarlyCostPriceSchedule);
                }
                else
                {
                    var EarlyCostPriceSchedule = new PricingSchedule(sourceEarlyCost.Value, sourceEarlyCostEndDays.Value);
                    target.SetEarlyRegistrationPrice(EarlyCostPriceSchedule);
                }
            }
            else
            {
                target.SetEarlyRegistrationPrice(null);
            }

            Decimal? sourceLateCost = GetDecimalValue(source.LateCost);
            var sourceLateCostStartDate = GetDateTime(source.LateCostStartDate);
            var sourceLateCostStartDays = GetNullableInt(source.LateCostStartDays);

            var lateScheduleHasNecessaryValues = sourceLateCost.HasValue && (sourceLateCostStartDate.HasValue || sourceLateCostStartDays.HasValue);
            if (lateScheduleHasNecessaryValues)
            {
                var hasLateDateValue = sourceLateCostStartDate.HasValue;
                if (hasLateDateValue)
                {
                    var LateCostPriceSchedule = new PricingSchedule(sourceLateCost.Value, sourceLateCostStartDate.Value);
                    target.SetLateRegistrationPrice(LateCostPriceSchedule);
                }
                else
                {
                    var LateCostPriceSchedule = new PricingSchedule(sourceLateCost.Value, sourceLateCostStartDays.Value);
                    target.SetLateRegistrationPrice(LateCostPriceSchedule);
                }
            }
            else
            {
                target.SetLateRegistrationPrice(null);
            }
        }
        public void TestAddDate_DisablePricingSchedule()
        {
            var occurrence = new EventOccurrence() { Event = new Event() };
            occurrence.AddOccurrenceDate(new DateTime(2000, 1, 1), new DateTime(2000, 1, 2));

            var earlySchedule = new PricingSchedule(10M, new DateTime(1999, 01, 01));
            occurrence.SetEarlyRegistrationPrice(earlySchedule);

            var lateSchedule = new PricingSchedule(10M, new DateTime(1999, 12, 01));
            occurrence.SetEarlyRegistrationPrice(earlySchedule);

            occurrence.EnablePricingSchedule();

            occurrence.AddOccurrenceDate(new DateTime(1999, 12, 30), new DateTime(1999, 12, 31));

            Assert.IsFalse(occurrence.IsPriceScheduleEnabled);
        }
        public void TestCalculateCost_EarlyAbsolute()
        {
            var earlyCuttofDate = new DateTime(2000, 1, 1);
            var defaultCost = 10M;
            var earlyCost = 5M;
            var ev = new Event();
            ev.Cost = defaultCost;
            var occurrence = new EventOccurrence() { Event = ev, Cost = defaultCost };
            occurrence.AddOccurrenceDate(new DateTime(2000, 3, 1), new DateTime(2000, 3, 2));
            var earlySchedule = new PricingSchedule(earlyCost, earlyCuttofDate);
            occurrence.SetEarlyRegistrationPrice(earlySchedule);

            occurrence.EnablePricingSchedule();

            Assert.AreEqual(earlyCost, occurrence.CalculateCost(earlyCuttofDate.AddDays(-1)));
            Assert.AreEqual(earlyCost, occurrence.CalculateCost(earlyCuttofDate));
            Assert.AreEqual(defaultCost, occurrence.CalculateCost(earlyCuttofDate.AddDays(1)));

            occurrence.DisablePricingSchedule();

            Assert.AreEqual(defaultCost, occurrence.CalculateCost(earlyCuttofDate.AddDays(-1)));
            Assert.AreEqual(defaultCost, occurrence.CalculateCost(earlyCuttofDate));
            Assert.AreEqual(defaultCost, occurrence.CalculateCost(earlyCuttofDate.AddDays(1)));
        }
        public void TestIsEarlyAndLateAbsoluteMode_earlyRelative()
        {
            var ev = new Event();
            var occurrence = new EventOccurrence() { Event = ev };

            var earlySchedule = new PricingSchedule(10M, 30);
            occurrence.SetEarlyRegistrationPrice(earlySchedule);

            Assert.IsFalse(occurrence.IsEarlyAndLateAbsoluteMode);
        }
        public void TestIsEarlyAndLateAbsoluteMode_earlyAbsoluteLateRelative()
        {
            var ev = new Event();
            var occurrence = new EventOccurrence() { Event = ev };

            var earlySchedule = new PricingSchedule(10M, new DateTime(1999, 01, 01));
            occurrence.SetEarlyRegistrationPrice(earlySchedule);

            var lateSchedule = new PricingSchedule(10M, 10);
            occurrence.SetLateRegistrationPrice(lateSchedule);

            // this case shouldn't be allowed in the wild...
            // still though, this test should pass
            Assert.IsFalse(occurrence.IsEarlyAndLateAbsoluteMode);
        }
        public void TestIsEarlyAndLateAbsoluteMode_earlyAbsoluteLateAbsolute()
        {
            var ev = new Event();
            var occurrence = new EventOccurrence() { Event = ev };

            var earlySchedule = new PricingSchedule(10M, new DateTime(1999, 01, 01));
            occurrence.SetEarlyRegistrationPrice(earlySchedule);

            var lateSchedule = new PricingSchedule(10M, new DateTime(1999, 02, 01));
            occurrence.SetLateRegistrationPrice(lateSchedule);

            Assert.IsTrue(occurrence.IsEarlyAndLateAbsoluteMode);
        }
        public void TestEnablePricingSchedule_EarlySpecified()
        {
            var ev = new Event();
            var occurrence = new EventOccurrence() { Event = ev };
            var pricingSchedule = new PricingSchedule(10M, 30);
            occurrence.SetEarlyRegistrationPrice(pricingSchedule);
            occurrence.EnablePricingSchedule();

            Assert.IsTrue(occurrence.IsPriceScheduleEnabled);
        }
        public void TestCalculateCost_EarlyRelative()
        {
            var firstOccurrenceDate = new DateTime(2000, 1, 1);
            var defaultCost = 10M;
            var earlyCost = 5M;
            var earlyDays = 5;
            var ev = new Event();
            var occurrence = new EventOccurrence() { Event = ev };
            occurrence.AddOccurrenceDate(firstOccurrenceDate, firstOccurrenceDate.AddHours(1));
            occurrence.Cost = defaultCost;
            var earlySchedule = new PricingSchedule(earlyCost, earlyDays);
            occurrence.SetEarlyRegistrationPrice(earlySchedule);
            occurrence.SetRegistrationDates(null, firstOccurrenceDate.AddDays(-1));

            occurrence.EnablePricingSchedule();

            Assert.AreEqual(earlyCost, occurrence.CalculateCost(firstOccurrenceDate.AddDays(-6)));
            Assert.AreEqual(earlyCost, occurrence.CalculateCost(firstOccurrenceDate.AddDays(-5)));
            Assert.AreEqual(defaultCost, occurrence.CalculateCost(firstOccurrenceDate.AddDays(-4)));

            occurrence.DisablePricingSchedule();

            Assert.AreEqual(defaultCost, occurrence.CalculateCost(firstOccurrenceDate.AddDays(-6)));
            Assert.AreEqual(defaultCost, occurrence.CalculateCost(firstOccurrenceDate.AddDays(-5)));
            Assert.AreEqual(defaultCost, occurrence.CalculateCost(firstOccurrenceDate.AddDays(-4)));
        }
        private static void CaptureCostScheduleData(EventOccurrence source, EventOccurrence target)
        {
            var earlyScheduleHasNecessaryValues = source.EarlyCost.HasValue && (source.EarlyCostEndDate.HasValue || source.EarlyCostEndDays.HasValue);

            if (earlyScheduleHasNecessaryValues)
            {
                var hasEarlyDateValue = source.EarlyCostEndDate.HasValue;
                if (hasEarlyDateValue)
                {
                    var EarlyCostPriceSchedule = new PricingSchedule(source.EarlyCost.Value, source.EarlyCostEndDate.Value);
                    target.SetEarlyRegistrationPrice(EarlyCostPriceSchedule);
                }
                else
                {
                    var EarlyCostPriceSchedule = new PricingSchedule(source.EarlyCost.Value, source.EarlyCostEndDays.Value);
                    target.SetEarlyRegistrationPrice(EarlyCostPriceSchedule);
                }
            }
            else
            {
                target.SetEarlyRegistrationPrice(null);
            }

            var lateScheduleHasNecessaryValues = source.LateCost.HasValue && (source.LateCostStartDate.HasValue || source.LateCostStartDays.HasValue);
            if (lateScheduleHasNecessaryValues)
            {
                var hasLateDateValue = source.LateCostStartDate.HasValue;
                if (hasLateDateValue)
                {
                    var LateCostPriceSchedule = new PricingSchedule(source.LateCost.Value, source.LateCostStartDate.Value);
                    target.SetLateRegistrationPrice(LateCostPriceSchedule);
                }
                else
                {
                    var LateCostPriceSchedule = new PricingSchedule(source.LateCost.Value, source.LateCostStartDays.Value);
                    target.SetLateRegistrationPrice(LateCostPriceSchedule);
                }
            }
            else
            {
                target.SetLateRegistrationPrice(null);
            }
        }