private static DataTable obterFuncionarios(string query, params object[] valores)
        {
            DataTable funcionarios = new DataAcessSqlCE().Consultar(query, valores);

            //Adiciono uma coluna para adicionar o nome dos departamentos
            funcionarios.Columns.Add("Nome Departamento", typeof(string));
            //Busco os departamentos para comparar
            List <Departamento> departamentos = Departamento.BuscarDepartamentos();

            //Pego o Id e adiciono o nome dos departamentos
            foreach (DataRow linha in funcionarios.Rows)
            {
                int idD;
                if (int.TryParse(linha["Id_Departamento"].ToString(), out idD))
                {
                    linha["Nome Departamento"] = (from d in departamentos
                                                  where d.Id_D == idD
                                                  select d.Nome).First();//linha["Nome"];linha["Nome Departamento"]
                }
            }

            funcionarios.Columns.Remove("Id_Departamento");

            //if(funcionarios.Rows.Count == 0)
            //    throw new Exception("Não possui nenhum funcionario cadastrado!");

            return(funcionarios);
        }
        public static int TotalDeFuncionariosCadastrados()
        {
            DataAcessSqlCE acessoDados = new DataAcessSqlCE();
            string         query       = "SELECT COUNT(Id_F) FROM Funcionario";

            return(Convert.ToInt32(acessoDados.ObterUnicoValor(query)));
        }
        public static int BuscarProxIdACadastrar()
        {
            DataAcessSqlCE acessoDados = new DataAcessSqlCE();
            string         query       = @"SELECT AUTOINC_NEXT 
                                FROM INFORMATION_SCHEMA.COLUMNS 
                                WHERE TABLE_NAME='Funcionario' 
                                AND COLUMN_NAME='Id_F'";

            return(Convert.ToInt32(acessoDados.ObterUnicoValor(query)));
        }
        public static Departamento BuscarDepartamentoPorId(int id)
        {
            Departamento departamento = new DataAcessSqlCE().Consultar <Departamento>("SELECT * FROM Departamento WHERE Id_D = @id", id).FirstOrDefault();

            if (departamento == null)
            {
                throw new Exception("Não possui nenhum departamento cadastrado!");
            }

            return(departamento);
        }
        public void Excluir()
        {
            if (this.Id_F == 0)
            {
                throw new Exception("É necessario a identificação do Id para Exclusão!");
            }

            DataAcessSqlCE acessoDados = new DataAcessSqlCE();

            acessoDados.Executar("DELETE FROM Funcionario WHERE Id_F = @id", this.Id_F);
        }
        /// <summary>
        /// Busca funcionarios por parte do nome ou nome completo
        /// </summary>
        /// <param name="nome"></param>
        /// <param name="nomePorCompleto">Caso true, procura o funcionario pelo nome completo</param>
        /// <returns></returns>
        public static List <Departamento> BuscarDepartamentos(string nome = null, bool nomePorCompleto = false)
        {
            string valor = nomePorCompleto ? nome : "%" + nome + "%";
            List <Departamento> departamentos = new DataAcessSqlCE().Consultar <Departamento>("SELECT * FROM Departamento WHERE Nome LIKE @nome ORDER BY Id_D", valor);

            if (!nomePorCompleto && departamentos.Count == 0)
            {
                throw new Exception("Não Existe nenhum departamento com esse Nome!");
            }

            return(departamentos);
        }
        private bool cpfExiste(string CPF)
        {
            DataAcessSqlCE acessoBanco  = new DataAcessSqlCE();
            int            qntRegistros = (int)acessoBanco.ObterUnicoValor("SELECT COUNT('Id_F') FROM Funcionario WHERE CPF = @valor", CPF);

            if (qntRegistros > 0)
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }
        //Methods
        public void Cadastrar()
        {
            if (this.Nome.Trim().Equals(string.Empty))
            {
                throw new ExceptionNomeVazio("O Campo Nome não pode ser vazio"); //exceção explícita
            }
            DataAcessSqlCE acessoBanco = new DataAcessSqlCE();

            if (nomeExiste(this.Nome.Trim()))
            {
                throw new ExceptionRegistroExistente("Já Existe um Departamento com este nome");
            }

            acessoBanco.Executar("INSERT INTO Departamento (Nome) VALUES", this.Nome);
        }
        //Metodos
        public void Cadastrar()
        {
            if (string.IsNullOrEmpty(this.Nome))
            {
                throw new ExceptionNomeVazio("O campo nome é obrigatório");
            }

            if (cpfExiste(this.CPF))
            {
                throw new ExceptionRegistroExistente("Já possui um Funcionario com o CPF cadastrado");
            }

            DataAcessSqlCE acessoDados = new DataAcessSqlCE();

            acessoDados.Executar("INSERT INTO Funcionario (Nome,   CPF,   DataNascimento,   Sexo,   Celular,    Foto,      Email,   DataAdmissao,   Id_Departamento, Salario,    Ativo) VALUES",
                                 this.Nome, this.CPF, this.DataNascimento, this.Sexo, this.Celular, this.Foto, this.Email, this.DataAdmissao, (this.Departamento == null ? (int?)null : (int?)this.Departamento.Id_D), this.Salario, this.Ativo);
        }
        public void SalvarAlteracoes()
        {
            if (this.Nome.Trim().Equals(string.Empty))
            {
                throw new ExceptionNomeVazio("O Campo Nome não pode ser vazio"); //exceção explícita
            }
            DataAcessSqlCE acessoBanco = new DataAcessSqlCE();

            if (nomeExiste(this.Nome))
            {
                throw new ExceptionRegistroExistente("Já Existe um Departamento com este nome");
            }

            acessoBanco.Executar("UPDATE Departamento SET Nome " +
                                 "WHERE Id_D = @id", this.Id_D,
                                 this.Nome);
        }
        public static void BuscarMaiorMenorSalarioEData(out float maiorValorSalarial, out float menorValorSalarial, out DateTime dataMax, out DateTime dataMin)
        {
            DataTable dt = new DataAcessSqlCE().Consultar("SELECT MAX(Salario) AS MaiorSalario,  MIN(Salario) As MenorSalario, MAX(DataAdmissao) AS MaiorData, MIN(DataAdmissao) AS MenorData FROM Funcionario");

            if (!string.IsNullOrEmpty(dt.Rows[0][0].ToString()))
            {
                maiorValorSalarial = Convert.ToSingle(dt.Rows[0]["MaiorSalario"]);
            }
            else
            {
                maiorValorSalarial = 100000;
            }
            if (!string.IsNullOrEmpty(dt.Rows[0][1].ToString()))
            {
                menorValorSalarial = Convert.ToSingle(dt.Rows[0]["MenorSalario"]);
            }
            else
            {
                menorValorSalarial = 0;
            }
            if (!string.IsNullOrEmpty(dt.Rows[0][2].ToString()))
            {
                dataMax = Convert.ToDateTime(dt.Rows[0]["MaiorData"]);
            }
            else
            {
                dataMax = DateTime.Now;
            }
            if (!string.IsNullOrEmpty(dt.Rows[0][3].ToString()))
            {
                dataMin = Convert.ToDateTime(dt.Rows[0]["MenorData"]);
            }
            else
            {
                dataMin = new DateTime(1753, 1, 1);
            }
            //}
            //else
            //{
            //
            //
            //
            //    dataMin = new DateTime(1753, 1, 1);
            //}
        }
        public static Funcionario BuscarFuncionarioPorId(int id)
        {
            //retorna Departamento Nullo por conta da propriedade ser de um tipo diferente do banco.
            Funcionario funcionario = new DataAcessSqlCE().Consultar <Funcionario>("SELECT * FROM Funcionario WHERE Id_F = @id", id).FirstOrDefault();

            if (funcionario == null)
            {
                throw new Exception("Este Id não pertence a nenhum funcionario!");
            }

            Departamento departamento = new DataAcessSqlCE().Consultar <Departamento>("SELECT * FROM Departamento WHERE Id_D in (SELECT Id_Departamento FROM Funcionario WHERE Id_F = @idfunc)", id).FirstOrDefault();//subquerie,Busca o departamento do Funcionario de Id X

            if (departamento != null)
            {
                funcionario.Departamento = departamento;
            }
            return(funcionario);
        }
        public void SalvarAlteracoes()
        {
            if (string.IsNullOrEmpty(this.Nome))
            {
                throw new ExceptionNomeVazio("O campo nome é obrigatório");
            }

            DataAcessSqlCE acessoDados = new DataAcessSqlCE();
            string         cpfOld      = acessoDados.ObterUnicoValor("SELECT CPF FROM Funcionario WHERE Id_F = @id", this.Id_F).ToString();

            if (cpfOld != this.CPF && cpfExiste(this.CPF))
            {
                throw new ExceptionRegistroExistente("Já possui um Funcionario com o CPF cadastrado");
            }


            acessoDados.Executar("UPDATE Funcionario SET Nome, CPF, DataNascimento, Sexo, Celular, Foto, Email, DataAdmissao, Id_Departamento, Salario, Ativo " +
                                 "WHERE Id_F = @idfunc", this.Id_F,
                                 this.Nome, this.CPF, this.DataNascimento, this.Sexo, this.Celular, this.Foto, this.Email, this.DataAdmissao, (this.Departamento == null ? (int?)null : (int?)this.Departamento.Id_D), this.Salario, this.Ativo);
        }
        private bool nomeExiste(string nomeDepartamento)
        {
            //verifica se ja existe o departamento
            try
            {
                DataAcessSqlCE acessoBanco = new DataAcessSqlCE();
                //int qtdRegistros = acessoBanco.VerificarSeExiste("Departamento", "Nome", nomeDepartamento);
                int qntRegistros = (int)acessoBanco.ObterUnicoValor("SELECT COUNT('Id_D') FROM Departamento WHERE Nome = @valor", nomeDepartamento);

                if (qntRegistros > 0)
                {
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
            catch
            {
                throw;
            }
        }
        public void Excluir()
        {
            DataAcessSqlCE acessoBanco = new DataAcessSqlCE();

            acessoBanco.Executar("DELETE FROM Departamento WHERE Id_D = @id", this.Id_D);
        }