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