public void AtualizarExperiencia()
        {
            List <Funcionario> func_exp = _db.Int_DP_Funcionarios.ToList();

            DateTime hoje = Globalization.HojeBR();

            foreach (var func in func_exp)
            {
                if (func.Exp_DataInicio.Date <= hoje & func.Exp_DataFim.Date >= hoje)
                {
                    func.Experiencia = 1;
                }
                else
                {
                    func.Experiencia = 0;
                }

                _db.SaveChanges();
            }
        }
        public ActionResult Lembrete(int dias)
        {
            int id_user = HttpContext.Session.GetInt32("ID") ?? 0;

            if (dias > 0)
            {
                List <DateTime> diasLista         = new List <DateTime>();
                List <DateTime> feriados          = new List <DateTime>();
                List <int>      vUsuariosSemEnvio = new List <int>();
                DateTime        hoje = Globalization.HojeBR();

                try
                {
                    DateTime datainicio = (hoje.AddDays(dias * (-1)));

                    vUsuariosSemEnvio = _db.Int_DP_Ocorrencias
                                        .Where(a => a.Data >= datainicio && a.Data < hoje)
                                        .GroupBy(g => g.Usuario.Id)
                                        .Select(s => s.Key)
                                        .ToList();
                }
                catch (InvalidOperationException exp)
                {
                    TempData["LembreteNotOK"] = "Todos os usuários já enviaram as ocorrências no periodo solicitado!";

                    Log log = new Log();
                    log.EnviarLembrete_Erro(id_user, exp);
                    _db.SaveChanges();

                    return(RedirectToAction("Index"));
                }
                catch (Exception exp)
                {
                    TempData["LembreteNotOK"] = "Ocorreu um erro ao tentar enviar o lembrete!";

                    Log log = new Log();
                    log.EnviarLembrete_Erro(id_user, exp);
                    _db.SaveChanges();

                    return(RedirectToAction("Index"));
                }

                List <int> vUsuarios = _db.Int_DP_Usuarios
                                       .Where(a => a.Ativo == 1)
                                       .Select(s => s.Id)
                                       .ToList();

                List <int> usuariosNaoEnviados = vUsuarios.Except(vUsuariosSemEnvio).ToList();

                if (usuariosNaoEnviados.Count > 0)
                {
                    List <string> vEmails = new List <string>();

                    foreach (var id in usuariosNaoEnviados)
                    {
                        string email = _db.Int_DP_Usuarios
                                       .Where(a => a.Id == id)
                                       .Select(s => s.Email)
                                       .FirstOrDefault();

                        if (!vEmails.Contains(email))
                        {  //Para não entrar duplicado
                            vEmails.Add(email);
                        }
                    }

                    vEmails.RemoveAll(item => item == null);         //Remove os valores nulos da lista
                    vEmails.RemoveAll(item => item == string.Empty); //Remove os valores de string vazia
                    vEmails.RemoveAll(item => item == "");           //Remove os valores de string vazia

                    if (vEmails.Count > 0)
                    {
                        Log log = new Log();

                        try
                        {
                            EnviarLembrete.EnviarMsgLembrete(dias, vEmails);
                            TempData["LembreteOK"] = "Lembrete Enviado!";

                            log.EnviarLembrete(id_user, vEmails.Count);
                            _db.Int_DP_Logs.Add(log);
                        }
                        catch (Exception exp)
                        {
                            log.EnviarLembrete_Erro(id_user, exp);
                            _db.Int_DP_Logs.Add(log);

                            TempData["LembreteNotOK"] = "Ocorreu um erro ao tentar enviar o lembrete, por favor, tente novamente!";
                        }
                        finally
                        {
                            _db.SaveChanges();
                        }
                    }
                    else
                    {
                        TempData["LembreteNotOK"] = "Não há e-mails cadastrados para envio";
                    }

                    return(RedirectToAction("Index"));
                }
                else
                {
                    TempData["LembreteNotOK"] = "Todos os usuários já enviaram as ocorrências no período solicitado!";
                    return(RedirectToAction("Index"));
                }
            }
            else
            {
                TempData["LembreteNotOK"] = "Insira um período de dias válido";
                return(RedirectToAction("Index"));
            }
        }
        public void OcorrenciasFaltantes()
        {
            if (HttpContext.Session.GetString("Perfil") != "admin")
            {
                List <DateTime> dias         = new List <DateTime>(); //30 últimos dias
                List <DateTime> enviados     = new List <DateTime>(); //Ultimas ocorrências enviadas
                List <DateTime> calend       = new List <DateTime>(); //Dias - Falta
                List <DateTime> calend_final = new List <DateTime>(); //Calend - Finais de Semana


                try
                {
                    int id_user = HttpContext.Session.GetInt32("ID") ?? 0;

                    DateTime dataCadastro = _db.Int_DP_Usuarios
                                            .Where(a => a.Id == id_user)
                                            .Select(s => s.DataCadastro)
                                            .FirstOrDefault();

                    List <DateTime> feriados = _db.Int_DP_Feriados
                                               .OrderByDescending(a => a.Data)
                                               .Select(s => s.Data)
                                               .ToList();

                    int usuario = HttpContext.Session.GetInt32("ID") ?? 0;

                    TimeSpan diff = Globalization.HoraAtualBR().Subtract(dataCadastro); //Diferença de dias entre data do cadastro e hoje
                    DateTime dataInicial;

                    if (diff.Days >= 30)
                    {
                        //dataInicial = DateTime.Today.AddDays(-30);
                        dataInicial = Globalization.HojeBR().AddDays(-30);

                        //Adiciona 30 dias anteriores a hoje na lista
                        for (int i = 29; i >= 0; i--)
                        {
                            dias.Add(Globalization.HojeBR().AddDays(i * -1));
                        }
                    }
                    else
                    {
                        dataInicial = dataCadastro.Date;

                        for (int i = diff.Days; i >= 0; i--)
                        {
                            //dias.Add(DateTime.Today.AddDays(i * -1));
                            dias.Add(Globalization.HojeBR().AddDays(i * -1));
                        }
                    }

                    enviados = _db.Int_DP_Ocorrencias
                               .Where(a => a.Data >= dataInicial && a.Usuario.Id == usuario && a.Ativo == 1)
                               .OrderByDescending(a => a.Data)
                               .Select(a => a.Data)
                               .ToList();

                    //Pega os útimos 30 dias

                    calend = dias.Except(enviados).ToList();   //Retira os dias que foram enviados
                    calend = calend.Except(feriados).ToList(); //Retira os feriados

                    //Retira o sábado e o domingo da lista
                    foreach (DateTime dia in calend)
                    {
                        if (!dia.DayOfWeek.Equals(DayOfWeek.Saturday) && !dia.DayOfWeek.Equals(DayOfWeek.Sunday))
                        {
                            calend_final.Add(dia);
                        }
                    }

                    //calend_final.Reverse(); //Reverte a ordem das datas para decrescente

                    ViewBag.Calendario = calend_final;
                }
                catch (Exception)
                {
                    ViewBag.Calendario = null;
                }
            }
        }
        public ActionResult Atualizar([FromForm] Funcionario func, int exp_periodo)
        {
            int id_notnull = HttpContext.Session.GetInt32("ID") ?? 0;

            ViewBag.Func = func;

            Log log = new Log();

            try
            {
                DateTime hoje = Globalization.HojeBR();

                func.Setor = _db.Int_DP_Setores.Find(func.Setor.Id);
                func.Loja  = _db.Int_DP_Lojas.Find(func.Loja.Id);

                Funcionario func_antigo = _db.Int_DP_Funcionarios.Find(func.Id);

                func_antigo.Setor          = func.Setor;
                func_antigo.Loja           = func.Loja;
                func_antigo.Exp_DataInicio = func.Exp_DataInicio;
                func_antigo.Exp_DataFim    = func.Exp_DataInicio.AddDays(exp_periodo);


                if (exp_periodo != 0)
                {
                    if (func_antigo.Exp_DataFim.Date >= hoje && func_antigo.Exp_DataInicio.Date <= hoje)
                    {
                        func_antigo.Experiencia = 1;
                    }
                    else
                    {
                        func_antigo.Experiencia = 0;
                    }
                }
                else
                {
                    func_antigo.Experiencia = 0;
                }

                //Férias

                /*func_antigo.Ferias_DataInicio = func.Ferias_DataInicio;
                 * func_antigo.Ferias_DataLimite = func.Ferias_DataLimite;
                 * func_antigo.Ferias_Periodo = func.Ferias_Periodo;*/

                _db.SaveChanges();
                log.AlterarFuncionario(id_notnull, func.Id);

                TempData["FuncionarioOK"] = "Funcionário Atualizado com Sucesso";
            }
            catch (Exception exp)
            {
                log.AlterarFuncionario_Erro(id_notnull, func.Id, exp);

                TempData["FuncionarioNotOK"] = "Ocorreu um erro ao tentar atualizar o funcionário";
            }
            finally
            {
                _db.Int_DP_Logs.Add(log);
                _db.SaveChanges();
            }

            return(RedirectToAction("Index"));
        }
        public ActionResult Cadastrar([FromForm] Funcionario func, int exp_periodo)
        {
            DeclararViewBags();

            ViewBag.Func = new Funcionario();
            int id_notnull = HttpContext.Session.GetInt32("ID") ?? 1;

            DateTime hoje = Globalization.HojeBR();

            //Verifica se há um funcionário com o mesmo nome e encarregado cadastrado
            Funcionario vFuncionario = _db.Int_DP_Funcionarios
                                       .Where(a => a.Nome.Equals(func.Nome) && a.Setor.Id == func.Setor.Id &&
                                              a.Loja.Id == func.Loja.Id && a.Ativo == 1)
                                       .FirstOrDefault();

            if (vFuncionario == null)
            {
                Log log = new Log();

                try
                {
                    func.DataCadastro = Globalization.HoraAtualBR();
                    func.Setor        = _db.Int_DP_Setores.Find(func.Setor.Id);
                    func.Loja         = _db.Int_DP_Lojas.Find(func.Loja.Id);
                    int id_user = HttpContext.Session.GetInt32("ID") ?? 0;
                    func.CadastradoPor = _db.Int_DP_Usuarios.Find(id_user);
                    func.Exp_DataFim   = func.Exp_DataInicio.AddDays(exp_periodo);

                    if (exp_periodo != 0)
                    {
                        if (func.Exp_DataFim >= hoje && func.Exp_DataInicio <= hoje)
                        {
                            func.Experiencia = 1;
                        }
                        else
                        {
                            func.Experiencia = 0;
                        }
                    }
                    else
                    {
                        func.Experiencia = 0;
                    }

                    _db.Int_DP_Funcionarios.Add(func);
                    _db.SaveChanges();

                    log.CadastrarFuncionario(id_notnull, func.Id);
                    _db.SaveChanges();

                    TempData["FuncionarioOK"] = "Funcionário cadastrado com sucesso!";

                    return(RedirectToAction("Index"));
                }
                catch (Exception exp)
                {
                    ViewBag.Func = func;

                    log.CadastrarFuncionario_Erro(id_notnull, func.Id, exp);
                    _db.SaveChanges();

                    TempData["FuncionarioNotOK"] = "Ocorreu um erro ao tentar inserir o funcionário!";

                    return(View());
                }
            }
            else
            {
                if (exp_periodo != 0)
                {
                    func.Experiencia = 1;
                }
                else
                {
                    func.Experiencia = 0;
                }

                ViewBag.Func = func;

                TempData["FuncionarioNotOK"] = "Já existe um funcionário cadastrado com esse Nome e Setor";
            }

            return(View());
        }