public ControlePontoFerias Salvar(int funcionarioId, ControlePontoFeriasDiaViewModel dto, List <ControlePontoFeriasDiaViewModel> listaControlePontoFeriasDia)
        {
            var controleRhDia = listaControlePontoFeriasDia.FirstOrDefault(x => x.Data.Date == dto.Data.Date);

            controleRhDia.Data                 = dto.Data;
            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();
            controleRhDia.CalcularHoraAtraso();
            controleRhDia.CalcularAdicionalNoturno();

            var controlePontoFerias = _controlePontoFeriasServico.PrimeiroPor(x => x.Funcionario.Id == funcionarioId);

            if (controlePontoFerias == null)
            {
                controlePontoFerias             = new ControlePontoFerias();
                controlePontoFerias.Funcionario = _funcionarioServico.BuscarPorId(funcionarioId);
            }

            if (controlePontoFerias.ControlePontoFeriasDias == null)
            {
                controlePontoFerias.ControlePontoFeriasDias = new List <ControlePontoFeriasDia>();
            }

            var dias = Mapper.Map <IList <ControlePontoFeriasDia> >(listaControlePontoFeriasDia);

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

                controlePontoFerias.ControlePontoFeriasDias.Add(dia);
            }

            _controlePontoFeriasServico.Salvar(controlePontoFerias);
            return(_controlePontoFeriasServico.BuscarPorId(controlePontoFerias.Id));
        }
        public List <ControlePontoFeriasDiaViewModel> RetornarControlePontoFeriasDias(ControlePontoFeriasViewModel controlePontoFeriasViewModel, int?ano = null, int?mes = null)
        {
            var controleFerias = _controleFeriasServico.BuscarPor(x => x.Funcionario.Id == controlePontoFeriasViewModel.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);

            var controlePontoFeriasDias = new List <ControlePontoFeriasDiaViewModel>();

            if (controlePontoFeriasViewModel.ControlePontoFeriasDias != null && controlePontoFeriasViewModel.ControlePontoFeriasDias.Any())
            {
                var dias = controlePontoFeriasViewModel.ControlePontoFeriasDias.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;
                }

                controlePontoFeriasDias.AddRange(dias);
            }

            var listaControleFerias = _controleFeriasServico.BuscarPor(x => x.Funcionario.Id == controlePontoFeriasViewModel.Funcionario.Id &&
                                                                       x.AutorizadoTrabalhar &&
                                                                       x.ListaPeriodoPermitido.Any(
                                                                           p => p.DataDe.Date >= dataAtual.Date && p.DataAte.Date <= dataAtual.AddMonths(1).Date ||
                                                                           p.DataDe.Date >= dataAtual.Date && p.DataAte.Date <= dataAtual.AddMonths(1).Date
                                                                           ));

            foreach (var item in listaControleFerias)
            {
                foreach (var periodo in item.ListaPeriodoPermitido)
                {
                    int diasParaAdd = 0;
                    var dias        = new List <ControlePontoFeriasDiaViewModel>();

                    var novoDia = periodo.DataDe;
                    while (novoDia.Date < periodo.DataAte)
                    {
                        novoDia = periodo.DataDe.AddDays(diasParaAdd);
                        var controlePontoDia = new ControlePontoFeriasDiaViewModel
                        {
                            Data = novoDia
                        };

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

                        dias.Add(controlePontoDia);
                        diasParaAdd++;
                    }

                    dias = dias.Where(x => x.Data.Date >= dataAtual.Date && x.Data.Date <= dataAtual.AddMonths(1).Date).ToList();
                    dias = dias.Where(x => !controlePontoFeriasDias.Any(cp => cp.Data.Date == x.Data.Date)).ToList();
                    controlePontoFeriasDias.AddRange(dias);
                }
            }

            return(controlePontoFeriasDias.OrderBy(x => x.Data).ToList());
        }