private void AdicionaOrcamentoComposicaoClassePai(OrcamentoComposicao orcamentoComposicaoFilho, List <OrcamentoComposicao> listaClassePaiOrcamentoComposicao, decimal preco) { if (orcamentoComposicaoFilho.Classe.ClassePai != null) { OrcamentoComposicao orcamentoComposicaoClassePai = new OrcamentoComposicao(); bool recuperou = false; decimal precoPai = 0; if (listaClassePaiOrcamentoComposicao.Any(l => l.Classe.Codigo == orcamentoComposicaoFilho.Classe.CodigoPai)) { orcamentoComposicaoClassePai = listaClassePaiOrcamentoComposicao.Where(l => l.Classe.Codigo == orcamentoComposicaoFilho.Classe.CodigoPai).FirstOrDefault(); precoPai = orcamentoComposicaoClassePai.Preco.HasValue ? orcamentoComposicaoClassePai.Preco.Value : 0; orcamentoComposicaoClassePai.Preco = precoPai + preco; recuperou = true; } else { orcamentoComposicaoClassePai.CodigoClasse = orcamentoComposicaoFilho.Classe.ClassePai.Codigo; orcamentoComposicaoClassePai.Classe = orcamentoComposicaoFilho.Classe.ClassePai; orcamentoComposicaoClassePai.Preco = preco; orcamentoComposicaoClassePai.Quantidade = 1; orcamentoComposicaoClassePai.Orcamento = orcamentoComposicaoFilho.Orcamento; orcamentoComposicaoClassePai.OrcamentoId = orcamentoComposicaoFilho.OrcamentoId; orcamentoComposicaoClassePai.Composicao = new Composicao(); orcamentoComposicaoClassePai.ComposicaoId = null; } if (!recuperou) { listaClassePaiOrcamentoComposicao.Add(orcamentoComposicaoClassePai); } if (orcamentoComposicaoClassePai.Classe.ClassePai != null) { AdicionaOrcamentoComposicaoClassePai(orcamentoComposicaoClassePai, listaClassePaiOrcamentoComposicao, preco); } } }
public OrcamentoDTO GerarRelatorioOrcamento(RelOrcamentoFiltro filtro) { if (!EhPermitidoImprimirRelOrcamento()) { messageQueue.Add(Resource.Sigim.ErrorMessages.PrivilegiosInsuficientes, TypeMessage.Error); return(null); } if (!ValidarFiltroRelOrcamento(filtro)) { return(null); } OrcamentoDTO orcamentoDTO = null; GIR.Sigim.Domain.Entity.Orcamento.Orcamento orcamento = orcamentoRepository.ObterPeloId(filtro.Orcamento.Id.Value, l => l.Empresa.ClienteFornecedor, l => l.Obra.CentroCusto, l => l.ListaOrcamentoComposicao.Select(c => c.Composicao)); if (orcamento != null) { decimal percentualBDI = orcamento.Obra.BDIPercentual.HasValue ? orcamento.Obra.BDIPercentual.Value : 0; percentualBDI = percentualBDI / 100; decimal valorCotacao = 1; decimal valorCotacaoAtual = 1; decimal preco = 0; decimal quantidade = 0; decimal BDI = 0; decimal precoSemBDI = 0; decimal precoTotal = 0; decimal precoTotalSemBDI = 0; decimal BDITotal = 0; int defasagem = filtro.Defasagem.HasValue ? filtro.Defasagem.Value : 0; DateTime dataBase = orcamento.Data.HasValue ? orcamento.Data.Value : new DateTime(1990, 1, 1); dataBase = dataBase.Date.AddMonths(-1 * defasagem); DateTime dataAtual = DateTime.Now.Date; dataAtual = dataAtual.Date.AddMonths(-1 * defasagem); string nomeIndice = "Não informado"; if (filtro.IndiceId.HasValue) { IndiceFinanceiro indiceFinanceiro = indiceFinanceiroRepository.ObterPeloId(filtro.IndiceId.Value); nomeIndice = indiceFinanceiro.Descricao; CotacaoValores cotacao = cotacaoValoresRepository.ObtemCotacao(filtro.IndiceId.Value, dataBase.Date); if (cotacao != null) { valorCotacao = cotacao.Valor.Value; dataBase = cotacao.Data.Value; } if (filtro.EhValorCorrigido) { CotacaoValores cotacaoAtual = cotacaoValoresRepository.ObtemCotacao(filtro.IndiceId.Value, dataAtual.Date); valorCotacaoAtual = cotacaoAtual.Valor.Value; dataAtual = cotacaoAtual.Data.Value; } } List <OrcamentoComposicao> listaOrcamentoComposicao = new List <OrcamentoComposicao>(); List <OrcamentoComposicao> listaClassePaiOrcamentoComposicao = new List <OrcamentoComposicao>(); listaOrcamentoComposicao = orcamento.ListaOrcamentoComposicao.ToList <OrcamentoComposicao>(); if (filtro.EhClasse) { if (filtro.ListaClasse.Count > 0) { listaOrcamentoComposicao = orcamento.ListaOrcamentoComposicao.Where(l => filtro.ListaClasse.Any(lc => lc.Codigo.Contains(l.CodigoClasse))).ToList <OrcamentoComposicao>(); } } for (var i = 0; i < listaOrcamentoComposicao.Count; i++) { OrcamentoComposicao orcamentoComposicao = listaOrcamentoComposicao.ElementAt(i); preco = orcamentoComposicao.Preco.HasValue ? orcamentoComposicao.Preco.Value : 0; quantidade = orcamentoComposicao.Quantidade.HasValue ? orcamentoComposicao.Quantidade.Value : 0; if (valorCotacao != 0) { preco = preco / valorCotacao; } if (valorCotacaoAtual != 0) { preco = preco * valorCotacaoAtual; } preco = Math.Round(preco, 5); BDI = preco * percentualBDI; BDI = Math.Round(BDI, 4); precoSemBDI = preco; if (filtro.EhBDI) { preco += BDI; } orcamentoComposicao.Preco = preco; precoTotal = precoTotal + Math.Round((preco * quantidade), 5); precoTotalSemBDI = precoTotalSemBDI + Math.Round((precoSemBDI * quantidade), 5); if (filtro.EhClasse) { AdicionaOrcamentoComposicaoClassePai(orcamentoComposicao, listaClassePaiOrcamentoComposicao, preco); } } if (filtro.EhClasse) { listaOrcamentoComposicao.AddRange(listaClassePaiOrcamentoComposicao); } orcamento.ListaOrcamentoComposicao = listaOrcamentoComposicao.OrderBy(l => l.CodigoClasse).ToList <OrcamentoComposicao>(); BDITotal = precoTotalSemBDI * percentualBDI; filtro.BDITotal = Math.Round(BDITotal, 4); filtro.PrecoTotal = precoTotal; filtro.NomeIndice = nomeIndice; filtro.CotacaoBase = String.Format("{0:0.00000}", Math.Round(valorCotacao, 5)); filtro.CotacaoAtual = String.Format("{0:0.00000}", Math.Round(valorCotacaoAtual, 5)); filtro.Defasagem = defasagem; filtro.DataBase = dataBase; filtro.DataAtual = dataAtual; filtro.AreaConstrucaoAreaReal = orcamento.Obra.AreaConstrucaoAreaReal.HasValue ? orcamento.Obra.AreaConstrucaoAreaReal.Value : 0; filtro.AreaConstrucaoAreaEquivalente = orcamento.Obra.AreaConstrucaoAreaEquivalente.HasValue ? orcamento.Obra.AreaConstrucaoAreaEquivalente.Value : 0; orcamentoDTO = orcamento.To <OrcamentoDTO>(); } return(orcamentoDTO); }