private void SetOptionalAttendeeAvailability(AttendeeData attendee, IndividualAttendeeConflictData attendeeConflict) { BusyType busyType = attendeeConflict.BusyType; if (busyType == BusyType.NoData) { this.optionalAttendeeCount--; return; } if (busyType != BusyType.Free) { if (this.strongestOptConflict < busyType) { this.strongestOptConflict = busyType; } this.optionalAttendeeConflictCount++; this.weightedOptConflicts += (double)busyType * 0.25 + 0.25; BusyType[] busyTypeRange = attendee.GetBusyTypeRange(this.meetingStartTime, this.meetingDuration); foreach (BusyType busyType2 in busyTypeRange) { if (busyType2 != BusyType.Free) { this.optOverlap += (double)this.options.FreeBusyInterval / (double)this.meetingDuration; this.weightedOptOverlap += ((double)busyType * 0.25 + 0.25) * ((double)this.options.FreeBusyInterval / (double)this.meetingDuration); } } } }
private void SetRequiredAttendeeAvailability(AttendeeData attendee, IndividualAttendeeConflictData attendeeConflict) { BusyType busyType = attendeeConflict.BusyType; if (busyType == BusyType.NoData) { this.requiredAttendeeCount--; return; } if (this.strongestReqConflict < busyType) { this.strongestReqConflict = busyType; } if (busyType != BusyType.Free) { this.requiredAttendeeConflictCount++; } this.SetConvenience(attendee); int num = this.meetingDuration / this.options.FreeBusyInterval; int num2 = 0; int num3 = 0; double num4 = 0.0; if (num > 0) { BusyType[] busyTypeRange = attendee.GetBusyTypeRange(this.meetingStartTime, this.meetingDuration); ExDateTime startUtc = this.meetingStartTime.ToUtc(); foreach (BusyType busyType2 in busyTypeRange) { ExDateTime exDateTime = startUtc.AddMinutes((double)this.options.FreeBusyInterval); if (busyType2 != BusyType.Free) { num4 += this.GetConflictValue(busyType2); num3++; } else if (!attendee.WorkingHours.IsWorkTime(startUtc, exDateTime)) { num4 += 0.25; num3++; } else if (num3 == 0) { num2++; } startUtc = exDateTime; } this.sumReqFrontTime += (double)num2 / (double)num; double num5 = (double)num2 / (double)num; if (num5 < this.minPctReqFrontTime) { this.minPctReqFrontTime = num5; } this.weightedReqConflicts += num4 / (double)num; } }
private void SetResourceAttendeeAvailability(AttendeeData attendee, IndividualAttendeeConflictData attendeeConflict) { BusyType busyType = attendeeConflict.BusyType; if (busyType == BusyType.NoData) { return; } this.resourceAttendeeCount++; if (busyType == BusyType.Free) { this.resourceAttendeeAvailableCount++; return; } this.resourceAttendeeConflictCount++; }
private void SetRoomAttendeeAvailability(AttendeeData attendee, IndividualAttendeeConflictData attendeeConflict) { BusyType busyType = attendeeConflict.BusyType; if (busyType == BusyType.NoData) { return; } this.roomsRequested = true; this.roomCount++; if (busyType == BusyType.Free) { this.roomsAvailableCount++; return; } this.roomConflictCount++; }
internal Suggestion(ExDateTime meetingStartTime, int inputMeetingDuration, int inputRequiredAttendeeCount, int inputOptionalAttendeeCount, AttendeeData[] inputAttendees, ConfigOptions inputOptions) { this.options = inputOptions; Suggestion.Tracer.TraceDebug <object, ExDateTime>((long)this.GetHashCode(), "{0}: Suggestion.Suggestion() entered, inputStartDateTime: {1}", TraceContext.Get(), meetingStartTime); this.meetingStartTime = meetingStartTime; this.startDateTime = meetingStartTime.LocalTime; this.meetingDuration = inputMeetingDuration; this.requiredAttendeeCount = inputRequiredAttendeeCount; this.optionalAttendeeCount = inputOptionalAttendeeCount; ExDateTime endUtc = meetingStartTime.AddMinutes((double)inputMeetingDuration); bool flag = true; int num = 0; this.attendeeConflictDataArray = new AttendeeConflictData[inputAttendees.Length]; foreach (AttendeeData attendeeData in inputAttendees) { BusyType busyType = attendeeData.GetBusyType(this.meetingStartTime, this.meetingDuration); IndividualAttendeeConflictData individualAttendeeConflictData = IndividualAttendeeConflictData.Create(attendeeData, busyType); if (attendeeData.AttendeeType == MeetingAttendeeType.Required || attendeeData.AttendeeType == MeetingAttendeeType.Organizer) { this.SetRequiredAttendeeAvailability(attendeeData, individualAttendeeConflictData); if (individualAttendeeConflictData.BusyType != BusyType.NoData) { this.excludeConflict |= attendeeData.ExcludeConflict; } } else if (attendeeData.AttendeeType == MeetingAttendeeType.Optional) { this.SetOptionalAttendeeAvailability(attendeeData, individualAttendeeConflictData); } else if (attendeeData.AttendeeType == MeetingAttendeeType.Room) { this.SetRoomAttendeeAvailability(attendeeData, individualAttendeeConflictData); if (individualAttendeeConflictData.BusyType != BusyType.NoData) { flag &= attendeeData.ExcludeConflict; } } else if (attendeeData.AttendeeType == MeetingAttendeeType.Resource) { this.SetResourceAttendeeAvailability(attendeeData, individualAttendeeConflictData); } else { Suggestion.Tracer.TraceError <object, MeetingAttendeeType>((long)this.GetHashCode(), "{0}: unknown attendee type: {1}", TraceContext.Get(), attendeeData.AttendeeType); } if (attendeeData.AttendeeType == MeetingAttendeeType.Organizer) { this.isWorkTime = attendeeData.WorkingHours.IsWorkTime(this.meetingStartTime, endUtc); } this.attendeeConflictDataArray[num] = individualAttendeeConflictData; num++; } if (this.roomsRequested) { this.excludeConflict = (this.excludeConflict || flag); } Suggestion.Tracer.TraceDebug((long)this.GetHashCode(), "{0}: required: {1}, optional: {2}, worktime?: {3}", new object[] { TraceContext.Get(), this.requiredAttendeeCount, this.optionalAttendeeCount, this.isWorkTime }); if (this.requiredAttendeeCount != 0) { this.sumPctReqFrontTime = this.sumReqFrontTime / (double)this.requiredAttendeeCount; this.weightedPctReqConflicts = this.weightedReqConflicts / (double)this.requiredAttendeeCount; } else { this.weightedPctReqConflicts = 1.0; } if (this.optionalAttendeeCount != 0) { this.pctOptConflicts = (double)this.optionalAttendeeConflictCount / (double)this.optionalAttendeeCount; this.pctOptOverlap = this.optOverlap / (double)this.optionalAttendeeCount; } this.timeSlotRating = this.GetRating(); if (this.weightedPctReqConflicts == 0.0) { this.bucket = SuggestionQuality.Excellent; } else if (this.weightedPctReqConflicts * 100.0 >= 50.0) { this.bucket = SuggestionQuality.Poor; } else if (this.weightedPctReqConflicts * 100.0 <= (double)this.options.GoodThreshold) { this.bucket = SuggestionQuality.Good; } else { this.bucket = SuggestionQuality.Fair; } Suggestion.Tracer.TraceDebug <object, long, SuggestionQuality>((long)this.GetHashCode(), "{0}: final suggestion results, timeSlotRating: {1}, bucket: {2}", TraceContext.Get(), this.timeSlotRating, this.bucket); }