Ejemplo n.º 1
0
        private IProdutoCalculo GerarProduto(IContainerCalculo container, uint id, bool possuiBeneficiamentos)
        {
            var produto = new ProdutoCalculoDTO()
            {
                Id                 = id,
                Altura             = 1000,
                Largura            = 1000,
                Espessura          = 8,
                AlturaCalc         = 1000,
                IdProduto          = 1,
                PercDescontoQtde   = 10,
                Qtde               = 1,
                QtdeAmbiente       = 1,
                Total              = 100,
                TotM               = 1,
                TotM2Calc          = 1,
                TotalBruto         = 100,
                ValorUnit          = 100,
                ValorUnitarioBruto = 100,
                Container          = container,
                DadosProduto       = new DadosProdutoDTO()
            };

            if (possuiBeneficiamentos)
            {
                produto.Beneficiamentos = GerarBeneficiamentos();
                produto.ValorBenef      = produto.Beneficiamentos.Sum(p => p.Valor);
            }

            return(produto);
        }
Ejemplo n.º 2
0
        public void Calcular(GDASession sessao, IContainerCalculo container, IProdutoCalculo produto)
        {
            produto.InicializarParaCalculo(sessao, container);

            produto.TotalBruto = produto.Total - DescontoValorBruto(produto);
            CalcularValorUnitarioBruto(sessao, produto);
        }
Ejemplo n.º 3
0
        public void Calcular(GDASession sessao, IContainerCalculo container, IProdutoCalculo produto)
        {
            produto.InicializarParaCalculo(sessao, container);

            decimal valorTabela  = produto.DadosProduto.ValorTabela(false);
            decimal valorCliente = produto.DadosProduto.ValorTabela(true);

            int tipoCalculoProduto = (int)produto.DadosProduto.DadosGrupoSubgrupo.TipoCalculo();

            if (valorTabela < valorCliente)
            {
                produto.ValorDescontoCliente  = 0;
                produto.ValorAcrescimoCliente = CalculaValorTotal(sessao, produto, tipoCalculoProduto,
                                                                  valorCliente - valorTabela);
            }
            else if (valorTabela > valorCliente)
            {
                produto.ValorAcrescimoCliente = 0;
                produto.ValorDescontoCliente  = CalculaValorTotal(sessao, produto, tipoCalculoProduto,
                                                                  valorTabela - valorCliente);
            }
            else
            {
                produto.ValorAcrescimoCliente = 0;
                produto.ValorDescontoCliente  = 0;
            }
        }
Ejemplo n.º 4
0
        public bool Aplicar(GDASession sessao, IContainerCalculo container, IEnumerable <IProdutoCalculo> produtos,
                            TipoValor tipo, decimal valorAplicar)
        {
            if (valorAplicar == 0 || !produtos.Any() || !PermiteAplicar())
            {
                return(false);
            }

            produtos.InicializarParaCalculo(sessao, container);

            Remover(
                sessao,
                produtos.Where(produto => PermitirRemocaoCalculoProduto(produto)),
                produto => { }
                );

            decimal totalAtual        = CalcularTotalAtual(sessao, produtos);
            decimal valor             = CalcularValorAplicar(tipo, valorAplicar, totalAtual);
            decimal percentualAplicar = CalcularPercentualTotalAplicar(totalAtual, valor);

            decimal valorAplicado = Aplicar(sessao, produtos, percentualAplicar);

            var produtoValorResidual = this.ObterProdutoValorResidual(produtos);
            var valorResidual        = this.ObterValorResidual(sessao, produtos, tipo, valorAplicar, valorAplicado);

            this.AplicarValorResidual(sessao, produtoValorResidual, valorResidual);

            return(true);
        }
Ejemplo n.º 5
0
 public static int?IdProjeto(this IContainerCalculo container)
 {
     return(container is Projeto ||
            ContainerInternoEDoTipo(container, ContainerCalculoDTO.TipoContainer.Projeto)
         ? (int?)container.Id
         : null);
 }
Ejemplo n.º 6
0
        public decimal?CalcularValor(GDASession sessao, IContainerCalculo container, IProdutoCalculo produto,
                                     decimal baseCalculo)
        {
            produto.InicializarParaCalculo(sessao, container);

            var compra = produto is ProdutosCompra;
            var nf     = produto is ProdutosNf;

            var alturaBenef = this.NormalizarAlturaLarguraBeneficiamento(
                produto.AlturaBenef,
                container,
                (int)produto.DadosProduto.DadosGrupoSubgrupo.TipoCalculo(nf, compra));

            var larguraBenef = this.NormalizarAlturaLarguraBeneficiamento(
                produto.LarguraBenef,
                container,
                (int)produto.DadosProduto.DadosGrupoSubgrupo.TipoCalculo(nf, compra));

            return(CalcularValor(
                       sessao,
                       produto,
                       baseCalculo,
                       compra,
                       nf,
                       alturaBenef,
                       larguraBenef
                       ));
        }
Ejemplo n.º 7
0
        /// <summary>
        /// Cria no produto cálculo as variáveis necessárias para permitir seu uso nos métodos de cálculo.
        /// </summary>
        public static void InicializarParaCalculo(this IProdutoCalculo produtoCalculo, GDASession sessao,
                                                  IContainerCalculo container)
        {
            produtoCalculo.Container    = container ?? new ContainerCalculoDTO();
            produtoCalculo.DadosProduto = new DadosProdutoDTO(sessao, produtoCalculo);

            ObterAmbientes(container, produtoCalculo);
        }
Ejemplo n.º 8
0
 /// <summary>
 /// Cria em cada produto cálculo da lista as variáveis necessárias para permitir seu uso nos métodos de cálculo.
 /// </summary>
 public static void InicializarParaCalculo(this IEnumerable <IProdutoCalculo> produtosCalculo, GDASession sessao,
                                           IContainerCalculo container)
 {
     foreach (var produto in (produtosCalculo ?? new IProdutoCalculo[0]))
     {
         InicializarParaCalculo(produto, sessao, container);
     }
 }
Ejemplo n.º 9
0
 protected void AtualizaDadosProdutosCalculo(IEnumerable <IProdutoCalculo> produtosCalculo,
                                             GDASession sessao, IContainerCalculo container)
 {
     foreach (var produtoCalculo in produtosCalculo)
     {
         AtualizaDadosProdutosCalculo(produtoCalculo, sessao, container);
     }
 }
Ejemplo n.º 10
0
        /// <summary>
        /// Aplica desconto por quantidade no valor dos produtos.
        /// </summary>
        public bool AplicarDescontoQtde(GDASession sessao, IContainerCalculo container, IProdutoCalculo produto)
        {
            var estrategia = DescontoAcrescimoStrategyFactory.Instance.RecuperaEstrategia(
                TipoCalculo.Desconto,
                TipoAplicacao.Quantidade);

            return(Aplicar(sessao, estrategia, container, new[] { produto }, TipoValor.Percentual, (decimal)produto.PercDescontoQtde));
        }
Ejemplo n.º 11
0
        /// <summary>
        /// Remove acréscimo do ambiente no valor dos produtos.
        /// </summary>
        public bool RemoverAcrescimoAmbiente(GDASession sessao, IContainerCalculo container, IEnumerable <IProdutoCalculo> produtos)
        {
            var estrategia = DescontoAcrescimoStrategyFactory.Instance.RecuperaEstrategia(
                TipoCalculo.Acrescimo,
                TipoAplicacao.Ambiente);

            return(Remover(sessao, estrategia, container, produtos));
        }
Ejemplo n.º 12
0
        /// <summary>
        /// Remove desconto por quantidade no valor dos produtos.
        /// </summary>
        public bool RemoverDescontoQtde(GDASession sessao, IContainerCalculo container, IProdutoCalculo produto)
        {
            var estrategia = DescontoAcrescimoStrategyFactory.Instance.RecuperaEstrategia(
                TipoCalculo.Desconto,
                TipoAplicacao.Quantidade);

            return(Remover(sessao, estrategia, container, new[] { produto }));
        }
Ejemplo n.º 13
0
 private string ObterIdContainer(IContainerCalculo container)
 {
     return(string.Format(
                "{0}:{1}",
                container.GetType().FullName,
                container.Id
                ));
 }
Ejemplo n.º 14
0
 public static int?IdPedido(this IContainerCalculo container)
 {
     return(container is Pedido ||
            container is PedidoEspelho ||
            ContainerInternoEDoTipo(container, ContainerCalculoDTO.TipoContainer.Pedido)
         ? (int?)container.Id
         : null);
 }
Ejemplo n.º 15
0
 public IProdutoCalculo[] GerarProdutos(IContainerCalculo container)
 {
     return(new[] {
         GerarProduto(container, 1, true),
         GerarProduto(container, 2, false),
         GerarProduto(container, 3, false)
     });
 }
Ejemplo n.º 16
0
        public void Calcular(GDASession sessao, IContainerCalculo container, IProdutoCalculo produto)
        {
            var valorUnitario = RecalcularValor(sessao, container, produto, false);

            if (valorUnitario.HasValue && produto != null)
            {
                produto.ValorUnit = valorUnitario.Value;
            }
        }
Ejemplo n.º 17
0
        private int NormalizarAlturaLarguraBeneficiamento(int?valor, IContainerCalculo container, int tipoCalc)
        {
            if ((container?.MaoDeObra ?? false) && tipoCalc == (int)TipoCalculoGrupoProd.Perimetro)
            {
                return(valor.GetValueOrDefault());
            }

            return(2);
        }
Ejemplo n.º 18
0
        /// <summary>
        /// Aplica desconto do ambiente no valor dos produtos.
        /// </summary>
        public bool AplicarDescontoAmbiente(GDASession sessao, IContainerCalculo container, int tipoDesconto,
                                            decimal desconto, IEnumerable <IProdutoCalculo> produtos)
        {
            var estrategia = DescontoAcrescimoStrategyFactory.Instance.RecuperaEstrategia(
                TipoCalculo.Desconto,
                TipoAplicacao.Ambiente);

            return(Aplicar(sessao, estrategia, container, produtos, (TipoValor)tipoDesconto, desconto));
        }
Ejemplo n.º 19
0
        /// <summary>
        /// Aplica comissão no valor dos produtos.
        /// </summary>
        public bool AplicarComissao(GDASession sessao, IContainerCalculo container, float percentualComissao,
                                    IEnumerable <IProdutoCalculo> produtos)
        {
            var estrategia = DescontoAcrescimoStrategyFactory.Instance.RecuperaEstrategia(
                TipoCalculo.Comissao,
                TipoAplicacao.Geral
                );

            return(Aplicar(sessao, estrategia, container, produtos, TipoValor.Percentual, (decimal)percentualComissao));
        }
Ejemplo n.º 20
0
        private static bool ContainerInternoEDoTipo(IContainerCalculo container, ContainerCalculoDTO.TipoContainer tipo)
        {
            var containerInterno = container as ContainerCalculoDTO;

            if (containerInterno == null)
            {
                return(false);
            }

            return(containerInterno.Tipo == tipo);
        }
Ejemplo n.º 21
0
        /// <summary>
        /// Prepara o recálculo de produtos com desconto por quantidade.
        /// </summary>
        public void PrepararRecalculoAtualizacao(GDASession sessao, IContainerCalculo container, IProdutoCalculo produto)
        {
            var valorUnitario = produto.ValorUnit;

            try
            {
                DescontoAcrescimo.Instance.RemoverDescontoQtde(sessao, container, produto);
            }
            finally
            {
                produto.ValorUnit = valorUnitario;
            }
        }
Ejemplo n.º 22
0
        internal DescontoAcrescimoCliente GetDescontoAcrescimo(GDASession sessao, IContainerCalculo container, Produto produto)
        {
            var idCliente = container?.Cliente?.Id ?? default(uint);

            return(GetDescontoAcrescimo(
                       sessao,
                       idCliente,
                       produto.IdGrupoProd,
                       produto.IdSubgrupoProd,
                       produto.IdProd,
                       container.IdPedido(),
                       container.IdProjeto()
                       ));
        }
Ejemplo n.º 23
0
        private static void ObterAmbientes(IContainerCalculo container, IProdutoCalculo produtoCalculo)
        {
            if (!produtoCalculo.IdAmbiente.HasValue || produtoCalculo.IdAmbiente == 0)
            {
                return;
            }

            IEnumerable <IAmbienteCalculo> ambientes = container.Ambientes.Obter();

            if (ambientes == null)
            {
                return;
            }

            produtoCalculo.Ambiente = ambientes.FirstOrDefault(ambiente => ambiente.Id == produtoCalculo.IdAmbiente);
        }
Ejemplo n.º 24
0
        /// <summary>
        /// Método utilizado para calcular o valor total e o total de m² de um produto.
        /// </summary>
        public void Calcular(GDASession sessao, IContainerCalculo container, IProdutoCalculo produto,
                             ArredondarAluminio arredondarAluminio, bool calcularMultiploDe5, bool nf, bool compra, int numeroBeneficiamentos,
                             bool usarChapaVidro = true, bool valorBruto = false, bool primeiroCalculo = false)
        {
            produto.InicializarParaCalculo(sessao, container);

            var alturaBeneficiamento = this.NormalizarAlturaLarguraBeneficiamento(
                produto.AlturaBenef,
                container,
                (int)produto.DadosProduto.DadosGrupoSubgrupo.TipoCalculo(nf, compra));

            var larguraBeneficiamento = this.NormalizarAlturaLarguraBeneficiamento(
                produto.LarguraBenef,
                container,
                (int)produto.DadosProduto.DadosGrupoSubgrupo.TipoCalculo(nf, compra));

            var estrategia = ValorTotalStrategyFactory.Instance.RecuperaEstrategia(produto, nf, compra);
            var acrescimo  = 0.00M;

            try
            {
                DescontoAcrescimo.Instance.RemoverDescontoQtde(sessao, container, produto);
                acrescimo = produto.ValorAcrescimo;
                produto.ValorAcrescimo = 0.00M;

                estrategia.Calcular(
                    sessao,
                    produto,
                    arredondarAluminio,
                    calcularMultiploDe5,
                    compra,
                    nf,
                    numeroBeneficiamentos,
                    alturaBeneficiamento,
                    larguraBeneficiamento,
                    usarChapaVidro,
                    valorBruto
                    );
            }
            finally
            {
                produto.ValorAcrescimo = acrescimo;
                DescontoAcrescimo.Instance.AplicarDescontoQtde(sessao, container, produto);
            }

            this.IncluirDescontoPorQuantidade(produto);
        }
Ejemplo n.º 25
0
 public void Calcular(GDASession sessao, IContainerCalculo container, IProdutoCalculo produto,
                      ArredondarAluminio arredondarAluminio, bool calcularMultiploDe5, int numeroBeneficiamentos,
                      bool usarChapaVidro = true, bool valorBruto = false, bool primeiroCalculo = false)
 {
     Calcular(
         sessao,
         container,
         produto,
         arredondarAluminio,
         calcularMultiploDe5,
         false,
         false,
         numeroBeneficiamentos,
         usarChapaVidro,
         valorBruto,
         primeiroCalculo);
 }
Ejemplo n.º 26
0
        private static void CalculaValor(IContainerCalculo container, IProdutoCalculo produto)
        {
            var calcularMultiploDe5 = true;

            if (container is Pedido)
            {
                produto.InicializarParaCalculo(null, container);
                calcularMultiploDe5 = produto.DadosProduto.DadosGrupoSubgrupo.TipoCalculo() == TipoCalculoGrupoProd.M2 && !container.IsPedidoProducaoCorte;
            }

            Helper.Calculos.ValorTotal.Instance.Calcular(
                null,
                container,
                produto,
                Helper.Calculos.Estrategia.ValorTotal.Enum.ArredondarAluminio.ArredondarApenasCalculo,
                calcularMultiploDe5,
                produto.Beneficiamentos.CountAreaMinima);
        }
Ejemplo n.º 27
0
 private ContainerCalculoDTO(IContainerCalculo container)
 {
     Id                    = container.Id;
     Cliente               = container.Cliente;
     Ambientes             = container.Ambientes;
     IdObra                = container.IdObra;
     IdParcela             = container.IdParcela;
     IsPedidoProducaoCorte = container.IsPedidoProducaoCorte;
     Reposicao             = container.Reposicao;
     MaoDeObra             = container.MaoDeObra;
     TipoEntrega           = container.TipoEntrega;
     TipoVenda             = container.TipoVenda;
     TipoAcrescimo         = container.TipoAcrescimo;
     Acrescimo             = container.Acrescimo;
     TipoDesconto          = container.TipoDesconto;
     Desconto              = container.Desconto;
     PercComissao          = container.PercComissao;
 }
Ejemplo n.º 28
0
        public bool Remover(GDASession sessao, IContainerCalculo container, IEnumerable <IProdutoCalculo> produtos)
        {
            var produtosRemover = produtos
                                  .Where(produto => PermitirRemocaoCalculoProduto(produto));

            if (!produtosRemover.Any())
            {
                return(false);
            }

            produtosRemover.InicializarParaCalculo(sessao, container);

            Remover(
                sessao,
                produtosRemover,
                produto => RecalcularValorUnitario(sessao, produto)
                );

            return(true);
        }
Ejemplo n.º 29
0
        public float CalcularM2Calculo(GDASession sessao, IContainerCalculo container, IProdutoCalculo produto, bool usarChapa,
                                       bool calcularMultiploDe5, int numeroBeneficiamentos, int qtdeAmbiente = 1, int?larguraUsar = null)
        {
            produto.InicializarParaCalculo(sessao, container);

            bool possuiChapaVidro = usarChapa &&
                                    produto.IdProduto > 0 &&
                                    produto.DadosProduto.DadosChapaVidro.ProdutoPossuiChapaVidro();

            int altura  = (int)produto.Altura;
            int largura = larguraUsar ?? produto.Largura;

            AjustarDadosChapaVidro(produto, ref possuiChapaVidro, ref altura, ref largura);

            float m2 = Calcular(produto, calcularMultiploDe5, altura, largura, produto.Qtde);

            m2 = Math.Max(m2, CalcularAreaMinimaProduto(produto, numeroBeneficiamentos, produto.Qtde));
            /* Chamado 77857. */
            m2 *= qtdeAmbiente;

            return(AplicarM2MinimoChapaVidro(produto, possuiChapaVidro, m2));
        }
Ejemplo n.º 30
0
        public decimal?RecalcularValor(GDASession sessao, IContainerCalculo container, IProdutoCalculo produto,
                                       bool valorBruto = false)
        {
            produto.InicializarParaCalculo(sessao, container);

            if (produto.Container?.IdObra > 0 && PedidoConfig.DadosPedido.UsarControleNovoObra)
            {
                return(null);
            }

            var compra = produto is ProdutosCompra;
            var nf     = produto is ProdutosNf;

            var alturaBenef = this.NormalizarAlturaLarguraBeneficiamento(
                produto.AlturaBenef,
                container,
                (int)produto.DadosProduto.DadosGrupoSubgrupo.TipoCalculo(nf, compra));

            var larguraBenef = this.NormalizarAlturaLarguraBeneficiamento(
                produto.LarguraBenef,
                container,
                (int)produto.DadosProduto.DadosGrupoSubgrupo.TipoCalculo(nf, compra));

            AtualizaValorUnitario(produto, valorBruto);
            decimal total = CalcularTotal(sessao, produto, valorBruto);

            total = IncluirDescontoAcrescimoComissaoNoTotal(sessao, produto, valorBruto, total);

            return(CalcularValor(
                       sessao,
                       produto,
                       total,
                       compra,
                       nf,
                       alturaBenef,
                       larguraBenef
                       ));
        }