/// <summary>
        /// grava no banco de dados uma conta a pagar ou a receber
        /// </summary>
        /// <param name="contaContabilidade"></param>
        /// <param name="_bd">conexao com banco</param>
        /// <returns>verdadeiro caso inserido com sucesso!</returns>
        public bool Inserir(ContaContabilidade contaContabilidade, bool abrirT, bool fecharT)
        {
            if (abrirT)
                _bd.IniciarTransacao();
            try
            {
                _bd.Cmd.Parameters.Clear();
                _bd.Cmd.CommandText = @"INSERT INTO `contasContabilidade`
                   (`pagar`, `categoria_id`, `emissao`, `vencimento`, `descricao`, `valor`, `nf`, `pessoa_id`) VALUES
                   ( @pagar, @categoria_id, @emissao, @vencimento, @descricao, @valor, @nf, @pessoa_id)";

                _bd.Cmd.Parameters.AddWithValue("@pagar", contaContabilidade.Pagar);//true pagar false receber
                _bd.Cmd.Parameters.AddWithValue("@categoria_id", contaContabilidade.Categoria.Id);
                _bd.Cmd.Parameters.AddWithValue("@emissao", contaContabilidade.Emissao);//data de emissao da conta
                _bd.Cmd.Parameters.AddWithValue("@vencimento", contaContabilidade.Vencimento);//data de vencimento
                _bd.Cmd.Parameters.AddWithValue("@descricao", contaContabilidade.Descricao);
                _bd.Cmd.Parameters.AddWithValue("@valor", contaContabilidade.Valor);
                _bd.Cmd.Parameters.AddWithValue("@nf", contaContabilidade.NotaFiscal == "" ? (object)DBNull.Value : contaContabilidade.NotaFiscal);
                _bd.Cmd.Parameters.AddWithValue("@pessoa_id", contaContabilidade.Pessoa.Id);

                if (_bd.ExecuteNonQuery() <= 0)//se nao inserir nenhuma linha
                {
                    return false;
                }
            }
            catch (Exception)
            {
                _bd.CancelarTransacao();
                return false;
            }
            if (fecharT)
                _bd.ConfirmarTransacao();
            return true;
        }
        /// <summary>
        /// Grava uma Conta e suas repetições
        /// </summary>
        /// <param name="contaContabilidade">Conta a pagar/receber</param>
        /// <param name="notificacoes"></param>
        /// <returns>verdadeiro se ok</returns>
        public bool Lancar(ContaContabilidade contaContabilidade, ref List<Notificacao> notificacoes)
        {
            if (!ValidarCampos(contaContabilidade, ref notificacoes))
            {
                return false;
            }

            string baseDescricao = contaContabilidade.Descricao;//mantem a descricao padrao e personaliza ;)

            return true;
        }
        /// <summary>
        /// Exclui uma ContaContabilidade no Banco de Dados
        /// </summary>
        /// <param name="contaContabilidade">conta a ser excluida/desativada</param>
        /// <returns>verdadeiro se sucesso</returns>
        public bool Excluir(ContaContabilidade contaContabilidade)
        {
            try
            {
                _bd.Cmd.Parameters.Clear();//limpa os parametros anteriores
                _bd.Cmd.CommandText = @"delete from contasContabilidade  where id = @contaId";
                _bd.Cmd.Parameters.AddWithValue("@contaId", contaContabilidade.Id);

                if (_bd.ExecuteNonQuery() <= 0)//se nao excluiu nenhuma linha retorna falso
                {
                    return false;
                }
            }
            catch (Exception)//chave estrangeira desativa e nao exclui!
            {
                return false;
            }
            return true;
        }
        /// <summary>
        /// Exclui logicamente uma ContaContabilidade no Banco de Dados
        /// </summary>
        /// <param name="contaContabilidade">conta a ser excluida/desativada</param>
        /// <returns>verdadeiro se sucesso</returns>
        public bool Desativar(ContaContabilidade contaContabilidade)
        {
            try
            {
                _bd.Cmd.Parameters.Clear();//limpa os parametros anteriores
                _bd.Cmd.CommandText = @"update contasContabilidade set excluido = @excluido where id = @contaId";
                _bd.Cmd.Parameters.AddWithValue("@excluido", 1);//1 == excluido
                _bd.Cmd.Parameters.AddWithValue("@contaId", contaContabilidade.Id);

                if (_bd.ExecuteNonQuery() <= 0)//se nao desativou nenhuma linha
                {
                    return false;
                }
            }
            catch (Exception)
            {
                return false;
            }
            return true;
        }
        /// <summary>
        /// Recupera do banco de dados uma conta a pagar/receber
        /// </summary>
        /// <param name="contaContabilidade">conta com id</param>
        /// <returns>conta </returns>
        public bool Recuperar(ContaContabilidade contaContabilidade)
        {
            try
            {
                _bd.Cmd.Parameters.Clear();
                _bd.Cmd.CommandText = @"select cc.pagar, cc.categoria_id, cc.emissao, cc.vencimento,
                cc.descricao, cc.valor, cc.nf, cc.compra_venda_id, pessoa_id,
                IFNULL((select sum(qc.quitado)
                from quitacaoConta qc inner join quitacoes q on q.id = qc.quitacao_id where qc.conta_id = cc.id and q.cancelada =0),0)as quitado
                from contasContabilidade cc
                where cc.id = @id";
                _bd.Cmd.Parameters.AddWithValue("@id", contaContabilidade.Id);

                DataTable conta =  _bd.ExecuteReader();

                contaContabilidade.Pagar = Convert.ToBoolean(conta.Rows[0]["pagar"].ToString());
                contaContabilidade.Categoria = new Categoria(Convert.ToInt32(conta.Rows[0]["categoria_id"].ToString()));
                contaContabilidade.Emissao = Convert.ToDateTime(conta.Rows[0]["emissao"].ToString());
                contaContabilidade.Vencimento = Convert.ToDateTime(conta.Rows[0]["vencimento"].ToString());
                contaContabilidade.Descricao = conta.Rows[0]["descricao"].ToString();
                contaContabilidade.Valor = Convert.ToDecimal(conta.Rows[0]["valor"].ToString());
                contaContabilidade.NotaFiscal = conta.Rows[0]["nf"].ToString();
                contaContabilidade.CompraVenda =
                    new CompraVenda(conta.Rows[0]["compra_venda_id"].ToString() == ""
                                        ? 0
                                        : Convert.ToInt32(conta.Rows[0]["compra_venda_id"].ToString()));
                contaContabilidade.ValorQuitado = conta.Rows[0]["quitado"].ToString() == ""
                                                      ? 0
                                                      : Convert.ToDecimal(conta.Rows[0]["quitado"].ToString());
                contaContabilidade.Pessoa = new Pessoa(Convert.ToInt32(conta.Rows[0]["pessoa_id"].ToString()));
            }
            catch (Exception)
            {
                return false;
            }
            return true;
        }
        /// <summary>
        /// valida os campos pertinentes a conta
        /// </summary>
        /// <param name="contaContabilidade">conta a ser lançada</param>
        /// <param name="notificacoes"></param>
        /// <returns></returns>
        private bool ValidarCampos(ContaContabilidade contaContabilidade, ref List<Notificacao> notificacoes)
        {
            Notificacao temp;
            bool validou = true;

            if (contaContabilidade.Descricao.Length < 5 || contaContabilidade.Descricao.Length > 30)
            {
                notificacoes.Add(new Notificacao("A descrição é obrigatória e deve conter entre 5 a 30 caracteres", 'e'));
                validou = false;
            }

               //valida valor
            if (contaContabilidade.Valor <= 0 || !new UtilCtrl().Decimal(contaContabilidade.Valor.ToString(), out  temp))
            {
                notificacoes.Add(new Notificacao(
                                     "O valor deve ser um decimal positivo maior que zero", 'e'));
                validou = false;
            }
            //valida pessoa
            if (!new PessoaCtrl().Recuperar(contaContabilidade.Pessoa, out temp, true))//minimo de pessoa!
            {
                notificacoes.Add(new Notificacao("Pessoa informada não está cadastrada, informe uma pessoa cadastrada!", 'e'));
                validou = false;
            }
            //valida categoria
            if (!new CategoriaContaCtrl().Recuperar(contaContabilidade.Categoria, out temp))
            {
                notificacoes.Add(new Notificacao("Categoria da Conta informada não está cadastrada, informe uma Categoria de Conta cadastrada", 'e'));
                validou = false;
            }

            //valida dt emissao
            if (contaContabilidade.Emissao.ToShortDateString() == "01/01/0001")
            {
                notificacoes.Add(new Notificacao("É necessário informar a data de Emissao, data invalida", 'e'));
                validou = false;
            }
            //valida dt  vcto
            if (contaContabilidade.Vencimento.ToShortDateString() == "01/01/0001")
            {
                notificacoes.Add(new Notificacao("É necessário informar a data de Vencimento, data invalida", 'e'));
                validou = false;
            }

            return validou;
        }
        /// <summary>
        /// recupera um lancamento da contabilidade
        /// </summary>
        /// <param name="contaContabilidade"></param>
        /// <param name="notificacoes"></param>
        /// <returns></returns>
        public bool Recuperar(ContaContabilidade contaContabilidade, ref List<Notificacao> notificacoes, bool edicao = false)
        {
            if (!new ContaContabilidadeBD().Recuperar(contaContabilidade))
            {
                notificacoes.Add(new Notificacao("Erro de Banco de Dados, notifique o Administrador", 'e'));
                return false;
            }

            if (contaContabilidade.ValorQuitado > 0)
            {
                notificacoes.Add(new Notificacao("A conta informada não pode ser alterada/excluida pois contem vinculo com " + (contaContabilidade.Pagar ? "pagamento(s)" : "recebimento(s)"), 'a'));
                return false;
            }

            return true;
        }