Search code examples
c#calendarexchangewebservicesexchange-server-2010

GetUserAvailabilityResults shows result outside working hours in Exchange web service


GetUserAvailabilityResults shows result which are outside working hours in Exchange web service although I have set MaximumNonWorkHoursSuggestionsPerDay = 0 Also, I want to know how to get and set the working hours. Moreover, results.AttendeesAvailability returns null

    private static void GetSuggestedMeetingTimes(ExchangeService service)
    {
        // Create a list of attendees.
        List<AttendeeInfo> attendees = new List<AttendeeInfo>();
        attendees.Add(new AttendeeInfo()
        {
            SmtpAddress = "vrr@e.edu.sa",
            AttendeeType = MeetingAttendeeType.Organizer
        });
        attendees.Add(new AttendeeInfo()
        {                
            SmtpAddress = "abc@e.edu.sa",
            AttendeeType = MeetingAttendeeType.Required
        });

        AvailabilityOptions meetingOptions = new AvailabilityOptions();
        meetingOptions.MeetingDuration = 30;
        meetingOptions.MaximumNonWorkHoursSuggestionsPerDay = 0;
        meetingOptions.GoodSuggestionThreshold = 49;
        meetingOptions.MinimumSuggestionQuality = SuggestionQuality.Good;
        meetingOptions.DetailedSuggestionsWindow = new TimeWindow(DateTime.Now, DateTime.Now.AddDays(2));
        meetingOptions.MaximumSuggestionsPerDay = 48;

        // Return a set of of suggested meeting times. 
        GetUserAvailabilityResults results = service.GetUserAvailability(attendees,
                                                                             new TimeWindow(DateTime.Now, DateTime.Now.AddDays(2)),
                                                                                 AvailabilityData.Suggestions,
                                                                                 meetingOptions); 

      //  Console.WriteLine(results.AttendeesAvailability[0].WorkingHours.EndTime); 
        // Display available meeting times.
        Console.WriteLine("Availability for {0} and {1}", attendees[0].SmtpAddress, attendees[0].SmtpAddress);
        Console.WriteLine();

        //foreach (AttendeeAvailability aa in results.AttendeesAvailability)
        //{
        //    //Console.WriteLine(aa.Result.Date);
        //    Console.WriteLine(aa.CalendarEvents.Count);
        //}
        foreach (Suggestion suggestion in results.Suggestions)
        {
            Console.WriteLine(suggestion.Date);
            Console.WriteLine();
            foreach (TimeSuggestion timeSuggestion in suggestion.TimeSuggestions)
            {
                Console.WriteLine("Suggested meeting time:" + timeSuggestion.MeetingTime);
                Console.WriteLine();
            }
        }
    }

Solution

  • In Exchange the working hours is maintained separately for each user. Every User can have its own working hours.(Although it does not seems to be reasonable for employees in 1 organization)

    GetUserAvailabilityResults was giving suggestions outside the working hours because one of the attendee's working hour was different from the other

    You cannot set the working hour for a user (as far as I know) however every user can change the working hours using outlook Outlook Change working hour

    You can see the working hours of each attendee using results.AttendeesAvailability

    the results.AttendeesAvailability will not give null if AvailabilityData.FreeBusyAndSuggestions instead of AvailabilityData.Suggestions is used the following is the modified code

     private static void GetSuggestedMeetingTimes(ExchangeService service)
        {
            // Create a list of attendees.
            List<AttendeeInfo> attendees = new List<AttendeeInfo>();
            attendees.Add(new AttendeeInfo()
            {
                SmtpAddress = "shomaail@kfupm.edu.sa",
                AttendeeType = MeetingAttendeeType.Required,
                ExcludeConflicts = false
            });
            attendees.Add(new AttendeeInfo()
            {                
                SmtpAddress = "vrr@kfupm.edu.sa",
                AttendeeType = MeetingAttendeeType.Required
            });
    
            AvailabilityOptions meetingOptions = new AvailabilityOptions();
            meetingOptions.MeetingDuration = 30;
            meetingOptions.MaximumNonWorkHoursSuggestionsPerDay = 0;
            meetingOptions.GoodSuggestionThreshold = 49;
            meetingOptions.MinimumSuggestionQuality = SuggestionQuality.Excellent;
            meetingOptions.DetailedSuggestionsWindow = new TimeWindow(DateTime.Now, DateTime.Now.AddDays(2));
            meetingOptions.MaximumSuggestionsPerDay = 48;
    
            // Return a set of of suggested meeting times. 
            GetUserAvailabilityResults results = service.GetUserAvailability(attendees,
                                                                                 new TimeWindow(DateTime.Now, DateTime.Now.AddDays(2)),
                                                                                     AvailabilityData.FreeBusyAndSuggestions,
                                                                                     meetingOptions); 
    
          //  Console.WriteLine(results.AttendeesAvailability[0].WorkingHours.EndTime); 
            // Display available meeting times.
            Console.WriteLine("Availability for {0} and {1}", attendees[0].SmtpAddress, attendees[1].SmtpAddress);
            Console.WriteLine();
    
            foreach (AttendeeAvailability aa in results.AttendeesAvailability)
            {
                Console.WriteLine("=============================================");
                Console.WriteLine(aa.Result.ToString());
                Console.WriteLine(aa.ViewType.ToString());
                Console.WriteLine(aa.CalendarEvents.Count);
                Console.WriteLine(aa.WorkingHours.StartTime);
                Console.WriteLine(aa.WorkingHours.EndTime);
                Console.WriteLine(aa.WorkingHours.DaysOfTheWeek.Count);
                Console.WriteLine(aa.WorkingHours.DaysOfTheWeek[0]);
                Console.WriteLine(aa.WorkingHours.DaysOfTheWeek[aa.WorkingHours.DaysOfTheWeek.Count-1]);
                foreach (DayOfTheWeek dow in aa.WorkingHours.DaysOfTheWeek)
                {
                    Console.WriteLine(dow);
                }
            }
            foreach (Suggestion suggestion in results.Suggestions)
            {
                Console.WriteLine(suggestion.Date);
                Console.WriteLine();
                foreach (TimeSuggestion timeSuggestion in suggestion.TimeSuggestions)
                {
                    Console.WriteLine("Suggested meeting time:" + timeSuggestion.MeetingTime);
                    Console.WriteLine();
                }
            }
        }