コード例 #1
0
        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);
                }
            }
        }
コード例 #2
0
        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);
        }