protected void btnSalvar_Click(object sender, EventArgs e)
        {
            try
            {
                if (string.IsNullOrEmpty(txtCodigoConta.Text))
                    throw new Exception("Insira o codigo da conta.");

                if (string.IsNullOrEmpty(txtDescricao.Text))
                    throw new Exception("Insira a descrição da conta.");

                if (FuncaoDaPagina == "a")
                {
                    var conta = Controller.BuscarContaPor(int.Parse(hdnIdConta.Value));

                    conta.Nome = txtDescricao.Text;
                    conta.CodigoDaConta = txtCodigoConta.Text;

                    Controller.Salvar(conta);
                }
                else
                {
                    var contaRecuperada = controller.BuscarContaPor(txtCodigoConta.Text);
                    if (contaRecuperada != null && contaRecuperada.Id > 0)
                        throw new Exception("Este codigo de conta já existe.");

                    Conta conta = new Conta();
                    var tiposDeConta = new TiposConta();

                    conta.Nome = txtDescricao.Text;
                    conta.CodigoDaConta = txtCodigoConta.Text;
                    conta.TipoConta = tiposDeConta.Obter<TipoConta>(1);

                    Controller.Salvar(conta);
                }

                Notificacao = "Conta salva com sucesso";
            }
            catch (Exception ex)
            {
                Notificacao = ex.Message;
            }

            EnviarMensagem();
            LimparCampos();
        }
        public void atualizar_estrutura_hospitalar_departamentoExistentes()
        {
            var tiposConta = new TiposConta();
            var tiposDeconta = new TiposConta();
            var tipoContaOutras = tiposDeconta.Obter<TipoConta>(1);

            string _conectionstring = @"Provider=Microsoft.Jet.OLEDB.4.0;";
            _conectionstring += String.Format("Data Source={0};", "D:\\CargaOrcamento2014\\DepartamentoCentroDeCustoContaHospitalarNew.xls");
            _conectionstring += "Extended Properties='Excel 8.0;HDR=YES;IMEX=1;'";

            var cn = new OleDbConnection(_conectionstring);
            var cmd = new OleDbCommand("Select * from [c$]", cn);
            cn.Open();
            var reader = cmd.ExecuteReader();

            var documento = new List<RegistroExcel>();

            var listaContas = new List<Conta>();
            var listaCentrosDeCusto = new List<CentroDeCusto>();

            var repositorioDeHospitais = new Hospitais();
            var repositorioDeCusto = new CentrosDeCusto();
            var repositorioContas = new Contas();

            int i = 0;

            while (reader.Read())
            {
                if (i == 0)
                {
                    i++;
                    continue;
                }
                if (reader[0] == null || reader[0] == DBNull.Value || string.IsNullOrEmpty(reader[0].ToString()))
                    break;

                var registroExcel = new RegistroExcel()
                {
                    NomeHospital = (string)reader[5],
                    CodigoCentroDeCusto = Convert.ToString(reader[0]),
                    DescricaoCentroDeCusto = (string)reader[1]
                };

                if (reader[5] != DBNull.Value)
                {
                    registroExcel.DescricaoConta = (string)reader[3];
                    registroExcel.CodigoConta = Convert.ToString(reader[2]);
                    registroExcel.GrupoResumoNome = (string)reader[4];
                }

                documento.Add(registroExcel);
            }

            cn.Close();
            cn.Dispose();
            cmd.Dispose();

            var gruposDeConta = documento.Select(x => x.GrupoResumoNome).Distinct();

            var codigosDeConta = documento.Select(x => x.CodigoConta).Distinct();

            foreach (var codigoDeConta in codigosDeConta)
            {
                string descricaoDaConta = documento.Where(x => x.CodigoConta == codigoDeConta).Select(y => y.DescricaoConta).Distinct().First();

                var conta = repositorioContas.ObterContaPor(codigoDeConta);

                if (listaContas.All(c => c.CodigoDaConta != codigoDeConta))
                {
                    if (conta == null)
                    {
                        throw new Exception();

                        conta = new Conta(descricaoDaConta, tipoContaOutras)
                        {
                            CodigoDaConta = codigoDeConta
                        };
                        repositorioContas.Salvar(conta);
                    }

                    listaContas.Add(conta);
                }
                else
                    conta = listaContas.FirstOrDefault(c => c.CodigoDaConta == codigoDeConta);

            }
            var grupos = new GruposDeConta();
            var gruposDeContaLista = new List<GrupoDeConta>();
            foreach (var grupo in gruposDeConta)
            {
                var grupoDeConta = grupos.ObterPor(grupo);

                if (grupoDeConta == null)
                    throw new Exception();

                var contasDoGrupo = documento.Where(x => x.GrupoResumoNome == grupo).Select(y => y.CodigoConta).Distinct();

                foreach (var codigoConta in contasDoGrupo)
                {
                    var conta = listaContas.FirstOrDefault(c => c.CodigoDaConta == codigoConta);

                    if (grupoDeConta.Contas == null)
                        grupoDeConta.Contas = new List<Conta>();

                    if (grupoDeConta.Contas.All(c => c.CodigoDaConta != codigoConta))
                        grupoDeConta.Adicionar(conta);
                }

                gruposDeContaLista.Add(grupoDeConta);
                grupos.Salvar(grupoDeConta);
            }

            var codigosDecentrosDeCusto = documento.Select(x => x.CodigoCentroDeCusto).Distinct();

            foreach (var codigoDeCentro in codigosDecentrosDeCusto)
            {
                var descricaoDeCentroDeCusto = documento.Where(x => x.CodigoCentroDeCusto == codigoDeCentro).Select(y => y.DescricaoCentroDeCusto).Distinct().First();

                var centroDeCusto = repositorioDeCusto.ObterPor(codigoDeCentro);
                if (centroDeCusto == null)
                {
                        throw new Exception();

                    centroDeCusto = new CentroDeCusto(descricaoDeCentroDeCusto)
                    {
                        CodigoDoCentroDeCusto = codigoDeCentro
                    };
                }

                var contas = documento.Where(x => x.CodigoCentroDeCusto == codigoDeCentro).Select(y => y.CodigoConta).Distinct();

                if (centroDeCusto.Contas == null)
                    centroDeCusto.Contas = new List<Conta>();

                foreach (var conta in contas)
                {
                    if (centroDeCusto.Contas.All(c => c.CodigoDaConta != conta))
                        centroDeCusto.AdicionarConta(listaContas.SingleOrDefault(x => x.CodigoDaConta == conta));
                }

                repositorioDeCusto.Salvar(centroDeCusto);
                listaCentrosDeCusto.Add(centroDeCusto);
            }

            var hospitais = documento.Select(x => x.NomeHospital).Distinct();

            foreach (var nomeHospital in hospitais)
            {
                var hospital = repositorioDeHospitais.ObterPor(nomeHospital);
                if(hospital == null)
                    throw new Exception();

                var centrosDeCusto = documento.Where(x => x.NomeHospital == hospital.Nome).Select(y => y.CodigoCentroDeCusto).Distinct();

                if (hospital.CentrosDeCusto == null)
                    hospital.CentrosDeCusto = new List<CentroDeCusto>();

                foreach (var codigoCentroCusto in centrosDeCusto)
                {
                    if (hospital.CentrosDeCusto.All(c => c.CodigoDoCentroDeCusto != codigoCentroCusto))
                        hospital.AdicionarCentroDeCusto(listaCentrosDeCusto.SingleOrDefault(x => x.CodigoDoCentroDeCusto == codigoCentroCusto));
                }

                repositorioDeHospitais.Salvar(hospital);
            }
        }
        public void f_importar_centro_de_custo_conta_coorporativo_do_excel()
        {
            string _conectionstring;
            _conectionstring = @"Provider=Microsoft.Jet.OLEDB.4.0;";
            _conectionstring += String.Format("Data Source={0};", "D:\\Coorporativo.xls");
            _conectionstring += "Extended Properties='Excel 8.0;HDR=NO;'";

            TiposConta tiposDeconta = new TiposConta();
            var tipoContaOutras = tiposDeconta.Obter<TipoConta>(1);

            OleDbConnection cn = new OleDbConnection(_conectionstring);
            OleDbCommand cmd = new OleDbCommand("Select * from [CC x Contas$]", cn);
            cn.Open();

            OleDbDataReader reader = cmd.ExecuteReader();

            List<CentroDeCustoContaExcel> centrosCustoConta = new List<CentroDeCustoContaExcel>();

            List<Conta> listaContas = new List<Conta>();
            List<CentroDeCusto> listaCentrosDeCusto = new List<CentroDeCusto>();

            CentrosDeCusto repositorioDeCusto = new CentrosDeCusto();
            Contas repositorioContas = new Contas();

            int i = 0;

            while (reader.Read())
            {
                if (i > 1)
                {
                    if (reader[0] == DBNull.Value)
                        break;

                    CentroDeCustoContaExcel centroContaExcel = new CentroDeCustoContaExcel();

                    centroContaExcel.CodCentro = (string)reader[1];
                    centroContaExcel.DescricaoCentro = (string)reader[2];
                    centroContaExcel.DescricaoConta = (string)reader[4];
                    centroContaExcel.CodConta = (string)reader[3];
                    centroContaExcel.GrupoConta = (string)reader[5];

                    centrosCustoConta.Add(centroContaExcel);
                }
                i++;
            }

            cn.Close();
            cn.Dispose();
            cmd.Dispose();

            var codigosDeConta = centrosCustoConta.Select(x => x.CodConta).Distinct();

            foreach (var codigoDeConta in codigosDeConta)
            {
                string descricaoDaConta = centrosCustoConta.Where(x => x.CodConta == codigoDeConta).Select(y => y.DescricaoConta).Distinct().FirstOrDefault();

                Conta conta = repositorioContas.ObterContaPor(codigoDeConta);

                if (!listaContas.Any(c => c.CodigoDaConta == codigoDeConta))
                {
                    if (conta == null)
                    {
                        conta = new Conta(descricaoDaConta, tipoContaOutras)
                        {
                            CodigoDaConta = codigoDeConta
                        };
                        repositorioContas.Salvar(conta);
                    }

                    listaContas.Add(conta);
                }
                else
                    conta = listaContas.Where(c => c.CodigoDaConta == codigoDeConta).FirstOrDefault();
            }

            var gruposDeConta = centrosCustoConta.Select(x => x.GrupoConta).Distinct();

            GruposDeConta grupos = new GruposDeConta();
            List<GrupoDeConta> gruposDeContaLista = new List<GrupoDeConta>();
            foreach (var grupo in gruposDeConta)
            {
                var grupoContaRecuperado = grupos.ObterPor(grupo);

                if (grupoContaRecuperado == null)
                    grupoContaRecuperado = new GrupoDeConta(grupo);

                var contasDoGrupo = centrosCustoConta.Where(x => x.GrupoConta == grupo).Select(y => y.CodConta).Distinct();

                foreach (var codigoConta in contasDoGrupo)
                {
                    var conta = listaContas.Where(c => c.CodigoDaConta == codigoConta).FirstOrDefault();

                    grupoContaRecuperado.Adicionar(conta);
                }

                gruposDeContaLista.Add(grupoContaRecuperado);
                grupos.Salvar(grupoContaRecuperado);
            }

            var codigosDecentrosDeCusto = centrosCustoConta.Select(x => x.CodCentro).Distinct();

            foreach (var codigoDeCentro in codigosDecentrosDeCusto)
            {
                var descricaoDeCentroDeCusto = centrosCustoConta.Where(x => x.CodCentro == codigoDeCentro).Select(y => y.DescricaoCentro).Distinct().First();

                var centroDeCusto = repositorioDeCusto.ObterPor(codigoDeCentro);
                if (centroDeCusto == null)
                {
                    centroDeCusto = new CentroDeCusto(descricaoDeCentroDeCusto)
                    {
                        CodigoDoCentroDeCusto = codigoDeCentro
                    };
                }
                var contas = centrosCustoConta.Where(x => x.CodCentro == codigoDeCentro).Select(y => y.CodConta).Distinct();

                foreach (var conta in contas)
                {
                    centroDeCusto.AdicionarConta(listaContas.Where(x => x.CodigoDaConta == conta).SingleOrDefault());
                }

                repositorioDeCusto.Salvar(centroDeCusto);
                listaCentrosDeCusto.Add(centroDeCusto);
            }
        }
        public void Executar()
        {
            var tiposConta = new TiposConta();
            var tiposDeconta = new TiposConta();
            var tipoContaOutras = tiposDeconta.Obter<TipoConta>(1);

            string _conectionstring = @"Provider=Microsoft.Jet.OLEDB.4.0;";
            _conectionstring += String.Format("Data Source={0};", "D:\\CargaOrcamento2014\\DepartamentoCentroDeCustoContaHospitalarNew.xls");
            _conectionstring += "Extended Properties='Excel 8.0;HDR=YES;IMEX=1;'";

            var cn = new OleDbConnection(_conectionstring);
            var cmd = new OleDbCommand("Select * from [c$]", cn);
            cn.Open();
            var reader = cmd.ExecuteReader();

            var documento = new List<RegistroExcel>();

            var listaContas = new List<Conta>();
            var listaCentrosDeCusto = new List<CentroDeCusto>();

            var repositorioDeHospitais = new Hospitais();
            var repositorioDeCusto = new CentrosDeCusto();
            var repositorioContas = new Contas();

            int i = 0;

            while (reader.Read())
            {
                if (i == 0)
                {
                    i++;
                    continue;
                }
                if (reader[0] == null || reader[0] == DBNull.Value || string.IsNullOrEmpty(reader[0].ToString()))
                    break;

                var registroExcel = new RegistroExcel()
                {
                    NomeHospital = (string)reader[5],
                    CodigoCentroDeCusto = Convert.ToString(reader[0]),
                    DescricaoCentroDeCusto = (string)reader[1]
                };

                if (reader[5] != DBNull.Value)
                {
                    registroExcel.DescricaoConta = (string)reader[3];
                    registroExcel.CodigoConta = Convert.ToString(reader[2]);
                    registroExcel.GrupoResumoNome = (string)reader[4];
                }

                registroExcel.Mes = (string)reader[7];
                registroExcel.Valor = Convert.ToInt64(reader[6]);

                documento.Add(registroExcel);
            }

            cn.Close();
            cn.Dispose();
            cmd.Dispose();

            var gruposDeConta = documento.Select(x => x.GrupoResumoNome).Distinct();

            var codigosDeConta = documento.Select(x => x.CodigoConta).Distinct();

            foreach (var codigoDeConta in codigosDeConta)
            {

            }

            var codigosDecentrosDeCusto = documento.Select(x => x.CodigoCentroDeCusto).Distinct();

            foreach (var codigoDeCentro in codigosDecentrosDeCusto)
            {
                var descricaoDeCentroDeCusto = documento.Where(x => x.CodigoCentroDeCusto == codigoDeCentro).Select(y => y.DescricaoCentroDeCusto).Distinct().First();

            }

            var hospitais = documento.Select(x => x.NomeHospital).Distinct();
            var listaHospitais = new List<Departamento>();
            var orcamentoNao = new List<Orcamento.Domain.Orcamento>();
            foreach (var nomeHospital in hospitais)
            {
                var hospital = repositorioDeHospitais.ObterPor(nomeHospital);
                if (hospital == null)
                    throw new Exception();

                listaCentrosDeCusto = new List<CentroDeCusto>();
                listaContas = new List<Conta>();

                if (!listaHospitais.Any(l => l.Nome == nomeHospital))
                {
                    listaHospitais.Add(hospital);

                    foreach (var documentoHospital in documento.Where(d => d.NomeHospital == nomeHospital))
                    {
                        var centroDeCusto = repositorioDeCusto.ObterPor(documentoHospital.CodigoCentroDeCusto);
                        if (centroDeCusto == null)
                            throw new Exception();

                        if (!listaCentrosDeCusto.Any(l => l.CodigoDoCentroDeCusto == documentoHospital.CodigoCentroDeCusto))
                            listaCentrosDeCusto.Add(centroDeCusto);

                        string descricaoDaConta = documento.Where(x => x.CodigoConta == documentoHospital.CodigoConta).Select(y => y.DescricaoConta).Distinct().First();

                        var conta = repositorioContas.ObterContaPor(documentoHospital.CodigoConta);
                        if (conta == null)
                            throw new Exception();

                        if (!listaContas.Any(l => l.CodigoDaConta == documentoHospital.CodigoConta))
                            listaContas.Add(conta);

                    }

                    foreach (var centroDeCusto in listaCentrosDeCusto)
                    {
                        Orcamentos orcamentos = new Orcamentos();
                        var orcamento = orcamentos.ObterOrcamentoFinalOrcamentoOperacional(centroDeCusto, hospital);
                        if (orcamento == null)
                        {
                            var orcamentosGerenciamento = orcamentos.TodosOrcamentosOperacionaisPor(centroDeCusto, hospital);

                            bool podeCriarMaisUmaVersaoDeOrcamento = PodeCriarMaisUmaVersaoDeOrcamento(hospital, centroDeCusto.Id, orcamentosGerenciamento);

                            if (podeCriarMaisUmaVersaoDeOrcamento)
                                orcamento = this.ServicoOrcamento.CriarOrcamentoOperacional(orcamentosGerenciamento, hospital, centroDeCusto, 2014);
                            else
                                throw new Exception();

                            foreach (var despesa in orcamento.DespesasOperacionais)
                            {
                                var valor = documento.FirstOrDefault(
                                    d =>
                                    d.CodigoCentroDeCusto == centroDeCusto.CodigoDoCentroDeCusto &&
                                    d.CodigoConta == despesa.Conta.CodigoDaConta && d.NomeHospital == nomeHospital && d.Mes == ObterMes(despesa.Mes));

                                if (valor != null)
                                    despesa.Valor = valor.Valor;
                            }
                            orcamento.AtribuirVersaoFinal();
                            orcamentos.Salvar(orcamento);
                        }

                    }

                }

            }

            //ServicoAtualizarDespesasOperacionais servico = new ServicoAtualizarDespesasOperacionais();
            //var centrosAbuscar = listaCentrosDeCusto.Distinct();
            //foreach (var centro in centrosAbuscar)
            //{
            //    servico.AtualizarDespesas(centro);
            //}
        }
        public void InserirContas(Departamento setor)
        {
            var tiposConta = new TiposConta();

            var tipoContaOutros = tiposConta.Obter<TipoConta>(1);

            var maquinario = new Conta("Maquinário", tipoContaOutros);
            var cabos = new Conta("Cabos", tipoContaOutros);

            var RecursosExternos = new Conta("Recursos Externos", tipoContaOutros);
            var HorasExtras = new Conta("Horas Extras", tipoContaOutros);
            Contas = new List<Conta>();

            Contas.Add(maquinario);
            Contas.Add(cabos);
            Contas.Add(RecursosExternos);
            Contas.Add(HorasExtras);

            var contas = new Contas();
            contas.Salvar(maquinario);
            contas.Salvar(cabos);
            contas.Salvar(RecursosExternos);
            contas.Salvar(HorasExtras);
        }