public void CollectExcludePeriodTest()
        {
            const int workingDays2011 = 365 - 2 - ( 51 * 2 ) - 1;
            const int workingDaysMarch2011 = 31 - 8; // total days - weekend days

            Year year2011 = new Year( 2011 );

            CalendarPeriodCollectorFilter filter1 = new CalendarPeriodCollectorFilter();
            filter1.AddWorkingWeekDays();
            CalendarPeriodCollector collector1 = new CalendarPeriodCollector( filter1, year2011 );
            collector1.CollectDays();
            Assert.AreEqual( collector1.Periods.Count, workingDays2011 );

            // exclude month
            CalendarPeriodCollectorFilter filter2 = new CalendarPeriodCollectorFilter();
            filter2.AddWorkingWeekDays();
            filter2.ExcludePeriods.Add( new Month( 2011, YearMonth.March ) );
            CalendarPeriodCollector collector2 = new CalendarPeriodCollector( filter2, year2011 );
            collector2.CollectDays();
            Assert.AreEqual( collector2.Periods.Count, workingDays2011 - workingDaysMarch2011 );

            // exclude weeks (holidays)
            CalendarPeriodCollectorFilter filter3 = new CalendarPeriodCollectorFilter();
            filter3.AddWorkingWeekDays();
            filter3.ExcludePeriods.Add( new Month( 2011, YearMonth.March ) );
            filter3.ExcludePeriods.Add( new Weeks( 2011, 26, 2 ) );
            CalendarPeriodCollector collector3 = new CalendarPeriodCollector( filter3, year2011 );
            collector3.CollectDays();
            Assert.AreEqual( collector3.Periods.Count, workingDays2011 - workingDaysMarch2011 - 10 );
        }
Example #2
0
        // ----------------------------------------------------------------------
        public double NetworkDays( DateTime start, DateTime end, IEnumerable<DateTime> holidays = null, ITimePeriodCollection holidayPeriods = null )
        {
            Day startDay = new Day( start < end ? start : end );
            Day endDay = new Day( end > start ? end : start );
            if ( startDay.Equals( endDay ) )
            {
                return 0;
            }

            CalendarPeriodCollectorFilter filter = new CalendarPeriodCollectorFilter();
            filter.AddWorkingWeekDays(); // only working days
            if ( holidays != null )
            {
                foreach ( DateTime holiday in holidays )
                {
                    filter.ExcludePeriods.Add( new Day( holiday ) );
                }
            }
            if ( holidayPeriods != null )
            {
                filter.ExcludePeriods.AddAll( holidayPeriods );
            }

            CalendarTimeRange testPeriod = new CalendarTimeRange( start, end );
            CalendarPeriodCollector collector = new CalendarPeriodCollector( filter, testPeriod );
            collector.CollectDays();

            double networkDays = 0.0;
            foreach ( ICalendarTimeRange period in collector.Periods )
            {
                networkDays += Math.Round( period.Duration.TotalDays, 2 );
            }
            return networkDays;
        }
Example #3
0
        // ----------------------------------------------------------------------
        public double CalculateBusinessHours( CalendarTimeRange testPeriod, ITimePeriodCollection holidays = null )
        {
            CalendarPeriodCollectorFilter filter = new CalendarPeriodCollectorFilter();
            filter.CollectingMonths.Add( new MonthRange( YearMonth.January, YearMonth.January ) );
            filter.CollectingDays.Add( new DayRange( 1, 1 ) );
            filter.AddWorkingWeekDays(); // only working days
            filter.CollectingHours.Add( new HourRange( 8, 12 ) );  // opening hours morning
            filter.CollectingHours.Add( new HourRange( 13, 18 ) ); // opening hours afternoon
            if ( holidays != null )
            {
                filter.ExcludePeriods.AddAll( holidays );
            }

            CalendarPeriodCollector collector = new CalendarPeriodCollector( filter, testPeriod );
            collector.CollectHours();

            double businessHours = 0.0;
            foreach ( ICalendarTimeRange period in collector.Periods )
            {
                businessHours += Math.Round( period.Duration.TotalHours, 2 );
            }
            return businessHours;
        }
Example #4
0
        // ----------------------------------------------------------------------
        public TimeSpan CalcWorkingPeriod( DateTime start, DateTime end,
            ITimePeriodCollection excludePeriods = null)
        {
            if ( start.Equals( end ) )
            {
                return TimeSpan.Zero;
            }

            // test range
            TimeRange testRange = new TimeRange( start, end );

            // search range
            DateTime searchStart = new Day( testRange.Start ).Start;
            DateTime serachEnd = new Day( testRange.End ).GetNextDay().Start;
            TimeRange searchPeriod = new TimeRange( searchStart, serachEnd );

            // search filter
            CalendarPeriodCollectorFilter filter = new CalendarPeriodCollectorFilter();
            filter.AddWorkingWeekDays(); // working days
            if ( excludePeriods != null )
            {
                filter.ExcludePeriods.AddAll( excludePeriods );
            }
            filter.CollectingHours.Add( new HourRange( 07, 12 ) ); // working hours
            filter.CollectingHours.Add( new HourRange( 13, 19 ) ); // working hours

            // collect working hours
            TimeCalendar calendar = new TimeCalendar( new TimeCalendarConfig { EndOffset = TimeSpan.Zero } );
            CalendarPeriodCollector collector = new CalendarPeriodCollector( filter, searchPeriod, SeekDirection.Forward, calendar );
            collector.CollectHours();

            TimeSpan workingPeriod = new TimeSpan();
            foreach ( ICalendarTimeRange period in collector.Periods )
            {
                // get the intersection of the test-range and the day working-hours
                ITimePeriod intersection = testRange.GetIntersection( period );
                if ( intersection == null )
                {
                    continue;
                }
                workingPeriod = workingPeriod.Add( intersection.Duration );
            }
            return workingPeriod;
        }
Example #5
0
        // ----------------------------------------------------------------------
        private double CalculateBusinessHours( ITimePeriod timePeriod )
        {
            double businessHours = 0;

            // collect filter
            CalendarPeriodCollectorFilter filter = new CalendarPeriodCollectorFilter();
            filter.AddWorkingWeekDays();
            filter.CollectingHours.Add( new HourRange( 8, 18 ) );
            //filter.ExcludePeriods.Add( new Day( 2012, 4, 6 ) );
            // mor exclude periods

            // collect the working hours
            TimeRange collectorTimeRange = new TimeRange( timePeriod.Start.Date, timePeriod.End.Date.AddDays( 1 ) );
            TimeCalendar calendar = new TimeCalendar( new TimeCalendarConfig { EndOffset = TimeSpan.Zero } );
            CalendarPeriodCollector collector = new CalendarPeriodCollector( filter, collectorTimeRange, SeekDirection.Forward, calendar );
            collector.CollectHours();
            if ( collector.Periods.Count > 0 )
            {
                // calculate the business hour periods
                collector.Periods.Add( timePeriod ); // add source period to find the intersections
                TimePeriodIntersector<TimeRange> intersector = new TimePeriodIntersector<TimeRange>();
                ITimePeriodCollection businessHourPeriods = intersector.IntersectPeriods( collector.Periods );

                // collect the business hours
                foreach ( TimeRange businessHourPeriod in businessHourPeriods )
                {
                    businessHours += businessHourPeriod.Duration.TotalHours;
                }
            }

            return businessHours;
        }