public async Task <RegistroHoraRankingDTO> GetSemanaComMaisHorasTrabalhadas(int numeroDesenvolvedoresNoRanking)
        {
            //Inicializa.
            var rankingSemanaMaisHorasDTO = new RegistroHoraRankingDTO();

            //Obtém todos os registros de hora.
            var registroHoras = await _servicoRegistro.GetAllAsync();

            //Ordena por data de entrada.
            registroHoras = registroHoras.OrderBy(x => x.DataHoraEntrada).ToList();

            //Para cada registro de hora soma na semana correspondente com o código do desenvolvedor.
            Ranking ranking = new Ranking();

            foreach (var reg in registroHoras)
            {
                ranking.AddRegistro(reg.DesenvolvedorId, reg.DataHoraEntrada.Value, reg.DataHoraSaida.Value);
            }

            //Ordena o ranking por número total de horas.
            RankingSemana rankingSemana = ranking.rankingSemanas.OrderByDescending(x => x.TotalHoras).First();
            IOrderedEnumerable <RankingDev> rankingSemanaDevs = rankingSemana.RankingDevs.OrderByDescending(x => x.numTotalHoras);

            //Repassa para o DTO.
            rankingSemanaMaisHorasDTO.DataInicioSemana      = rankingSemana.DataInicioSemana.Value;
            rankingSemanaMaisHorasDTO.DataFinalSemana       = rankingSemana.DataFinalSemana.Value;
            rankingSemanaMaisHorasDTO.TotalHorasTrabalhadas = rankingSemana.TotalHoras;

            foreach (var dev in rankingSemanaDevs)
            {
                if (rankingSemanaMaisHorasDTO.DesenvolvedoresComMaisHoras.Count() == numeroDesenvolvedoresNoRanking)
                {
                    break;
                }

                rankingSemanaMaisHorasDTO.DesenvolvedoresComMaisHoras.Add(dev.desenvolvedorId, dev.numTotalHoras);
            }

            return(rankingSemanaMaisHorasDTO);
        }
        public void AddRegistro(int desenvolvedorId, DateTime dataHoraEntrada, DateTime dataHoraSaida)
        {
            //Data da entrada em formato curto.
            DateTime dataEntrada = new DateTime(dataHoraEntrada.Year, dataHoraEntrada.Month, dataHoraEntrada.Day);

            //Verifica se a data de entrada já pertence a uma semana de trabalho 'mapeada'. Se não, cria a semana.
            var rankingSemana = rankingSemanas.FirstOrDefault(x => dataEntrada.CompareTo(x.DataInicioSemana) >= 0 &&
                                                              dataEntrada.CompareTo(x.DataFinalSemana) <= 0);

            if (rankingSemana == null)
            {
                rankingSemana = new RankingSemana();
                rankingSemana.DataInicioSemana = dataEntrada.AddDays((int)dataEntrada.DayOfWeek * -1);
                rankingSemana.DataFinalSemana  = rankingSemana.DataInicioSemana.Value.AddDays(6);

                rankingSemanas.Add(rankingSemana);
            }

            //Lança o desenvolvedor e suas horas no ranking.
            double totalHoras = (dataHoraSaida - dataHoraEntrada).TotalHours;

            rankingSemana.AddHorasDesenvolvedor(desenvolvedorId, totalHoras);
        }