private List <AttendeeInfo> getSalasDeReuniaoPorWebConfig() { List <AttendeeInfo> listaParticipantes = new List <AttendeeInfo>(); string EmailsWebConfig = new ConfiguracaoBS().obterConfiguracao().SalasEstaticas; var arrayEmails = EmailsWebConfig.Split(';').ToArray(); foreach (var sala in arrayEmails) { AttendeeInfo participante = new AttendeeInfo(sala, MeetingAttendeeType.Room, false); listaParticipantes.Add(participante); } return(listaParticipantes); }
/// <summary> /// Obtem a disponibilidade de um usuário smtp /// </summary> /// <param name="smtp"></param> /// <returns></returns> public Status obterDisponibilidadeExchange(string smtp, string zoneId = "E. South America Standard Time") { // SE O SMTP NÃO ENVIAR O ENDEREÇO DO HOST "@XPTO.COM.BR", PREENCHE AUTOMATICAMENTE COM O DOMINIO DA CONTA CONFIGURADA if (!smtp.Contains("@")) { var config = new ConfiguracaoBS().obterConfiguracao(); if (config != null) { string host = config.EmailAddress.Split('@')[1]; smtp = smtp + '@' + host; } } // Instancia o objeto de retorno de status Status retorno = new Status(); try { // Atribui a janela de tempo da Pesquisa // Precisamos de salas de reunião que já tenham iniciado seu cronômetro em 15 minutos // O prazo de 6 horas é necessário para cumprir especificação técnica do método. DateTime startTime = DateTime.Now.ToUniversalTime(); var diferencaParaOutroDia = 24 - DateTime.Now.ToUniversalTime().Hour; var janelaDeTempo = new TimeWindow(startTime, startTime.AddHours(diferencaParaOutroDia)); var janelaDeSugestao = new TimeWindow(startTime, startTime.AddHours(diferencaParaOutroDia)); // Atribui os parametros de busca var options = new AvailabilityOptions { MeetingDuration = 30 , RequestedFreeBusyView = FreeBusyViewType.Detailed , MergedFreeBusyInterval = 5 , MaximumSuggestionsPerDay = 1 , GoodSuggestionThreshold = 25 , CurrentMeetingTime = startTime //DateTime.Now , DetailedSuggestionsWindow = janelaDeSugestao , MinimumSuggestionQuality = SuggestionQuality.Poor }; // Para a consulta, é obrigatorio enviar uma lista de participantes da reuniao // Como a única informação que precisamos é a da Sala, enviamos apenas um elemento List <AttendeeInfo> listaUnicoElemento = new List <AttendeeInfo>(); AttendeeInfo UnicoElemento = new AttendeeInfo(); // instancia o elemento unico para a lista obrigatória UnicoElemento.SmtpAddress = smtp; // preenche com o smtp da checagem listaUnicoElemento.Add(UnicoElemento); // INICIO - Efetua a busca no exchange com os parâmetros selecionados GetUserAvailabilityResults resultadoDisponibilidade = this.service.GetUserAvailability(listaUnicoElemento, janelaDeTempo, AvailabilityData.FreeBusyAndSuggestions, options); // FIM - busca Exchange // PRIMEIRA TENTATIVA DE OBTENCAO DA DISPONIBILIDADE - ATRAVÉS DO RESULTADO DA DISPONIBILIDADE foreach (AttendeeAvailability avail in resultadoDisponibilidade.AttendeesAvailability) { string erro = string.Empty; if (avail.Result == ServiceResult.Error) { erro = (avail.Result != null ? "RESULT = " + avail.Result.ToString() + " | " : "") + (avail.ErrorCode != null ? "ErrorCode = " + avail.ErrorCode.ToString() + " | " : "") + (avail.ErrorDetails != null ? "ErrorDetais = " + avail.ErrorDetails.ToString() + " | " : "") + (avail.ErrorMessage != null ? "ErrorMessage = " + avail.ErrorMessage.ToString() + " | " : "") + (avail.ErrorProperties.Count() > 0 ? "ErrorProperties = " + avail.ErrorProperties.ToString() : ""); } var calendarios = avail.CalendarEvents.Where(x => x.StartTime <DateTime.Now.ToUniversalTime() && x.EndTime> DateTime.Now.ToUniversalTime()).ToList(); if (calendarios.Count() > 0) { foreach (CalendarEvent calItem in calendarios) { if (calItem.FreeBusyStatus == LegacyFreeBusyStatus.Busy || calItem.FreeBusyStatus == LegacyFreeBusyStatus.OOF || calItem.FreeBusyStatus == LegacyFreeBusyStatus.Tentative || calItem.FreeBusyStatus == LegacyFreeBusyStatus.WorkingElsewhere) { // Se a data de fim da reuniao já tiver passado, então a sala está livre if (calItem.EndTime < DateTime.Now.ToUniversalTime()) { retorno.StatusDisponibilidade = StatusDisponibilidade.Livre; retorno.Mensagem = ""; } // Se já passou 30 minutos de iniciada uma reunião e não terminou else if ((DateTime.Now.ToUniversalTime() >= calItem.StartTime.ToUniversalTime().AddMinutes(30)) && (DateTime.Now.ToUniversalTime() <= calItem.EndTime.ToUniversalTime())) { retorno.StatusDisponibilidade = StatusDisponibilidade.EmReuniao30; TimeZoneInfo zonaFuso = TimeZoneInfo.FindSystemTimeZoneById(zoneId); var dataFimZonaFuso = TimeZoneInfo.ConvertTimeFromUtc(calItem.EndTime, zonaFuso); retorno.Mensagem = "Reunião já inicada há mais de 30 minutos com término às " + dataFimZonaFuso.ToString(); // calItem.EndTime.ToLocalTime().ToString(); // inclui na lista de eventos de calendários do retorno retorno.ListaEventos.Add(converterCalendarEventParaCalendarioEvento(calItem)); } // Se já passou 15 minutos de iniciada uma reunião e não terminou else if ((DateTime.Now.ToUniversalTime() >= calItem.StartTime.ToUniversalTime().AddMinutes(15)) && (DateTime.Now.ToUniversalTime() <= calItem.EndTime.ToUniversalTime())) { TimeZoneInfo zonaFuso = TimeZoneInfo.FindSystemTimeZoneById(zoneId); var dataFimZonaFuso = TimeZoneInfo.ConvertTimeFromUtc(calItem.EndTime, zonaFuso); retorno.StatusDisponibilidade = StatusDisponibilidade.EmReuniao; retorno.Mensagem = "Reunião já inicada há mais de 15 minutos com término às " + dataFimZonaFuso.ToString(); // calItem.EndTime.ToLocalTime().ToString(); // inclui na lista de eventos de calendários do retorno retorno.ListaEventos.Add(converterCalendarEventParaCalendarioEvento(calItem)); } else { TimeZoneInfo zonaFuso = TimeZoneInfo.FindSystemTimeZoneById(zoneId); var dataInicioZonaFuso = TimeZoneInfo.ConvertTimeFromUtc(calItem.StartTime, zonaFuso); var dataFimZonaFuso = TimeZoneInfo.ConvertTimeFromUtc(calItem.EndTime, zonaFuso); retorno.StatusDisponibilidade = StatusDisponibilidade.Ocupado; retorno.Mensagem = " Ocupado de " + dataInicioZonaFuso.ToString() + " até " + dataFimZonaFuso.ToString(); //retorno.Mensagem = " Ocupado de " + calItem.StartTime.ToLocalTime().ToString() + " até " + calItem.EndTime.ToLocalTime().ToString(); // inclui na lista de eventos de calendários do retorno retorno.ListaEventos.Add(converterCalendarEventParaCalendarioEvento(calItem)); } break; } else { TimeZoneInfo zonaFuso = TimeZoneInfo.FindSystemTimeZoneById(zoneId); var dataInicioZonaFuso = TimeZoneInfo.ConvertTimeFromUtc(calItem.StartTime, zonaFuso); retorno.StatusDisponibilidade = StatusDisponibilidade.Livre; retorno.Mensagem = "Livre a partir de " + dataInicioZonaFuso.ToString(); //calItem.StartTime.ToString(); } } } else { // O Status ainda é desconhecido // Se for usar a opção de lógica por sugestão, manter desconhecido retorno.StatusDisponibilidade = StatusDisponibilidade.Livre; // StatusDisponibilidade.Desconhecido; // Mensagem ao usuário retorno.Mensagem = "Não encontramos eventos de calendário para esta sala."; if (!erro.Equals(string.Empty)) { retorno.StatusDisponibilidade = StatusDisponibilidade.Desconhecido; // Mensagem ao usuário retorno.Mensagem = "[ERROR] " + erro; } } } // SUGESTÃO DE DATA MAIS PRÓXIMA DA DATA ATUAL if (resultadoDisponibilidade.Suggestions.Count > 0) { // PEGAR A SUGESTAO MAIS CEDO var sugestaoMaisCedo = resultadoDisponibilidade.Suggestions.OrderBy(x => x.Date).FirstOrDefault(); // SE POR VENTURA HOUVE SUGESTOES DE HORA, ELA TEM PRIORIDADE NO RETORNO if (sugestaoMaisCedo.TimeSuggestions.Count > 0) { var horaDoEncontro = sugestaoMaisCedo.TimeSuggestions.OrderBy(x => x.MeetingTime).FirstOrDefault().MeetingTime; TimeZoneInfo zonaFuso = TimeZoneInfo.FindSystemTimeZoneById(zoneId); horaDoEncontro = TimeZoneInfo.ConvertTimeFromUtc(horaDoEncontro, zonaFuso); retorno.SugestaoProximaReuniao = horaDoEncontro.ToLocalTime(); } else { TimeZoneInfo zonaFuso = TimeZoneInfo.FindSystemTimeZoneById(zoneId); var sugestao = TimeZoneInfo.ConvertTimeFromUtc(sugestaoMaisCedo.Date, zonaFuso); retorno.SugestaoProximaReuniao = sugestaoMaisCedo.Date; } } } catch (Exception ex) { string msgDisponibilidade = "[EXCEPTION] " + (ex.Message != null ? "MESSAGE = " + ex.Message.ToString() + " | " : "") + (ex.InnerException != null ? "INNER = " + ex.InnerException.ToString() + " | " : "") + (ex.StackTrace != null ? "STACKTRACE = " + ex.StackTrace.ToString() + " | " : "") + (ex.Source != null ? "SOURCE = " + ex.Source.ToString() : ""); retorno.Mensagem = msgDisponibilidade; retorno.StatusDisponibilidade = StatusDisponibilidade.Desconhecido; } return(retorno); }