public ControlePonto Salvar(int funcionarioId, ControlePontoDiaViewModel dto, List <ControlePontoDiaViewModel> listaControlePontoDia)
        {
            var controlePonto = _controlePontoServico.PrimeiroPor(x => x.Funcionario.Id == funcionarioId);

            if (controlePonto == null)
            {
                controlePonto             = new ControlePonto();
                controlePonto.Funcionario = _funcionarioServico.BuscarPorId(funcionarioId);
            }

            if (controlePonto.ControlePontoDias == null)
            {
                controlePonto.ControlePontoDias = new List <ControlePontoDia>();
            }

            var controleRhDia = listaControlePontoDia.FirstOrDefault(x => x.Data.Date == dto.Data.Date);

            controleRhDia.Data                 = dto.Data;
            controleRhDia.Folga                = dto.Folga;
            controleRhDia.Falta                = dto.Falta;
            controleRhDia.FaltaJustificada     = dto.FaltaJustificada;
            controleRhDia.Atraso               = dto.Atraso;
            controleRhDia.Atestado             = dto.Atestado;
            controleRhDia.AtrasoJustificado    = dto.AtrasoJustificado;
            controleRhDia.Suspensao            = dto.Suspensao;
            controleRhDia.Observacao           = dto.Observacao;
            controleRhDia.HorarioEntrada       = dto.HorarioEntrada;
            controleRhDia.HorarioSaidaAlmoco   = dto.HorarioSaidaAlmoco;
            controleRhDia.HorarioRetornoAlmoco = dto.HorarioRetornoAlmoco;
            controleRhDia.HorarioSaida         = dto.HorarioSaida;
            controleRhDia.CalcularHorasDiaTime();
            controleRhDia.CalcularHorasDia();
            controleRhDia.CalcularHoraExtra(controlePonto.Funcionario.TipoEscala);
            controleRhDia.CalcularHoraAtraso();
            controleRhDia.CalcularAdicionalNoturno(controlePonto.Funcionario.TipoEscala);

            var dias = Mapper.Map <IList <ControlePontoDia> >(listaControlePontoDia);

            foreach (var dia in dias)
            {
                var diaParaRemover = controlePonto.ControlePontoDias.FirstOrDefault(x => x.Id != 0 && x.Id == dia.Id);
                if (diaParaRemover != null)
                {
                    controlePonto.ControlePontoDias.Remove(diaParaRemover);
                }

                controlePonto.ControlePontoDias.Add(dia);
            }

            _controlePontoServico.Salvar(controlePonto);
            return(_controlePontoServico.BuscarPorId(controlePonto.Id));
        }
        public List <ControlePontoDiaViewModel> RetornarControlePontoDias(ControlePontoViewModel controlePontoViewModel, int?ano = null, int?mes = null)
        {
            var controleFerias = _controleFeriasServico.BuscarPor(x => x.Funcionario.Id == controlePontoViewModel.Funcionario.Id)?.ToList();
            var dataAtual      = DateTime.Now;

            var diaInicial = 20;

            if (ano.HasValue && mes.HasValue)
            {
                dataAtual = new DateTime(ano.Value, mes.Value, 20);
            }
            else if (ano.HasValue)
            {
                dataAtual = new DateTime(ano.Value, dataAtual.Month, 20);
            }
            else if (mes.HasValue)
            {
                dataAtual = new DateTime(dataAtual.Year, mes.Value, 20);
            }

            if (dataAtual.Day < diaInicial)
            {
                dataAtual = dataAtual.AddMonths(-1);
            }

            var diasDiferenca = diaInicial - dataAtual.Day;

            dataAtual = dataAtual.AddDays(diasDiferenca);

            if (controlePontoViewModel.ControlePontoDias != null && controlePontoViewModel.ControlePontoDias.Any())
            {
                var dias = controlePontoViewModel.ControlePontoDias.Where(x => x.Data.Date >= dataAtual.Date && x.Data.Date < dataAtual.AddMonths(1).Date).ToList();

                foreach (var dia in dias)
                {
                    dia.EhFeriado = _calendarioRHServico.PrimeiroPor(x => (!x.DataFixa && x.Data.Date == dia.Data.Date) ||
                                                                     (x.DataFixa && x.Data.Day == dia.Data.Day && x.Data.Month == dia.Data.Month)) != null;
                }

                if (dias.Any())
                {
                    return(dias);
                }
            }

            var controlePontoDias = new List <ControlePontoDiaViewModel>();

            while (dataAtual.Day < diaInicial || controlePontoDias.Count < 25)
            {
                var novoDia = new ControlePontoDiaViewModel
                {
                    Data = dataAtual,
                };

                novoDia.EhFeriado = _calendarioRHServico.PrimeiroPor(x => (!x.DataFixa && x.Data.Date == novoDia.Data.Date) ||
                                                                     (x.DataFixa && x.Data.Day == novoDia.Data.Day && x.Data.Month == novoDia.Data.Month)) != null;

                novoDia.EhFerias = controleFerias.Any(x => novoDia.Data.Date >= x.DataInicial.Date && novoDia.Data.Date <= x.DataFinal.Date);
                controlePontoDias.Add(novoDia);

                dataAtual = dataAtual.AddDays(1);
            }

            return(controlePontoDias);
        }