public void AtualizarDespesas(CentroDeCusto centro)
        {
            Orcamentos orcamentos = new Orcamentos();

            var orcamentosOperacionais = orcamentos.TodosOrcamentosOperacionaisPor(centro);

            foreach (var orcamento in orcamentosOperacionais)
            {
                orcamento.AtualizarDespesas();
            }

            orcamentos.Salvar(orcamentosOperacionais);
        }
        protected void btnSalvar_Click(object sender, EventArgs e)
        {
            try
            {

                var antigaListaDeCentrosDeCusto = Controller.BuscarTodosOsCentrosDeCustoDeUmDepartamento(int.Parse(Session["DepartamentoLogadoId"].ToString()));
                Hospital hospital;

                if (FuncaoDaPagina == "a")
                {
                    hospital = Controller.BuscarHospitalPor(int.Parse(ddlHospitais.SelectedValue));
                    hospital.Nome = txtNome.Text;
                }
                else
                {
                    hospital = new Hospital();
                    hospital.Nome = txtNome.Text;
                }

                foreach (RepeaterItem item in rptCentrosDeCusto.Items)
                {
                    if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)
                    {
                        if (((CheckBox)item.FindControl("chkSelecionado")).Checked)
                        {

                            int centroDeCustoId = int.Parse(((HiddenField)item.FindControl("hdnIdSetor")).Value);

                            if (!hospital.CentrosDeCusto.Any(c => c.Id == centroDeCustoId))
                                hospital.Adicionar(controller.ObterCentroDeCustoPor(centroDeCustoId: centroDeCustoId));
                        }
                        else
                        {
                            int centroDeCustoId = int.Parse(((HiddenField)item.FindControl("hdnIdSetor")).Value);
                            if (hospital.CentrosDeCusto.Any(c => c.Id == centroDeCustoId))
                            {
                                if (hospital.Id > 0)
                                {
                                    var nome = ((HiddenField)item.FindControl("hdnNomeSetor")).Value;
                                    Orcamentos orcamentos = new Orcamentos();

                                    var orcamentosDeViagem = orcamentos.TodosOrcamentosDeViagemPor(hospital.CentrosDeCusto.Where(c => c.Id == centroDeCustoId).FirstOrDefault(), hospital);
                                    var orcamentosOperacionais = orcamentos.TodosOrcamentosOperacionaisPor(hospital.CentrosDeCusto.Where(c => c.Id == centroDeCustoId).FirstOrDefault(), hospital);
                                    var funcionarios = hospital.CentrosDeCusto.Where(c => c.Id == centroDeCustoId).FirstOrDefault().Funcionarios.Where(d => d.Departamento == hospital);

                                    if (orcamentosDeViagem != null && orcamentosDeViagem.Count > 0)
                                        throw new Exception("Não é possivel Retirar o Centro de Custo:" + nome + " pois ele está atrelado a pelomenos um Orcamento de viagem.");

                                    if (orcamentosOperacionais != null && orcamentosOperacionais.Count > 0)
                                        throw new Exception("Não é possivel Retirar o Centro de Custo:" + nome + " pois ele está atrelado a pelomenos um Orcamento de despesa operacional.");

                                    if (funcionarios != null && funcionarios.Count() > 0)
                                        throw new Exception("Não é possivel Retirar o Centro de Custo:" + nome + " pois ele está atrelado a pelomenos um funcionário com este Departamento.");

                                }
                                hospital.CentrosDeCusto.Remove(hospital.CentrosDeCusto.Where(c => c.Id == centroDeCustoId).FirstOrDefault());
                            }
                        }
                    }
                }

                Controller.SalvarDepartamento(hospital);
                Notificacao = "Hospital salvo com sucesso";

            }
            catch (Exception ex)
            {

                Notificacao = ex.Message;
            }

            EnviarMensagem();
            LimparCampos();
            PopularRepeaterDeCentrosDeCusto();
        }
        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);
            //}
        }