Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        /// <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);
        }