public RelatorioPonto gerarRelatorio(Funcionario funcionario, DateTime inicio, DateTime fim)
        {
            Check.Require(fim >= inicio, "Período inválido. O início deve vir antes do fim!");
            Check.Require(funcionario != null, "O funcionário deve ser válido");

            var todosPontos = pontoRepository.findPontosNoIntervalo(funcionario, inicio, fim, false, false)
                              .GroupBy(x => x.Data)
                              .Select(group => group.First());
            var diasFaltando           = inicio.Range(fim).Except(todosPontos.Select(x => x.Data));
            var feriadosNaoTrabalhados = diasFaltando
                                         .Where(x => feriadoService.isFeriado(x));

            //Se é um feriado, não deve ser contado como falta
            diasFaltando = diasFaltando.Except(feriadosNaoTrabalhados);

            var todosDias = todosPontos
                            .Select(x => criarDia(x))
                            .Concat(
                diasFaltando.Select(x => criarDia(x))
                )
                            .Concat(feriadosNaoTrabalhados
                                    .Select(x =>
                                            criarDia(feriadoService.getFeriado(x))
                                            )
                                    )
                            .OrderBy(x => x.Data)
                            .ToList();

            return(new RelatorioPonto(funcionario, inicio, fim, jornadaAtiva, todosDias));
        }