Exemple #1
0
        public decimal?Calcular(GDASession sessao, IProdutoCalculo produto, decimal total, ArredondarAluminio arredondarAluminio,
                                bool calcularMultiploDe5, bool nf, int numeroBeneficiamentos, int alturaBeneficiamento,
                                int larguraBeneficiamento)
        {
            /* Chamado 41410. */
            if (ValidarQuantidadeDecimal && produto.Qtde % 1 > 0)
            {
                throw new Exception("Somente produtos calculados por Qtd. decimal podem possuir números decimais no campo Quantidade.");
            }

            var qtdeAmbiente = produto.QtdeAmbiente > 0
                ? produto.QtdeAmbiente
                : 1;

            return(Calcular(
                       sessao,
                       produto,
                       qtdeAmbiente,
                       total,
                       arredondarAluminio,
                       calcularMultiploDe5,
                       nf,
                       numeroBeneficiamentos,
                       alturaBeneficiamento,
                       larguraBeneficiamento
                       ));
        }
Exemple #2
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
                       ));
        }
Exemple #3
0
        protected override decimal Calcular(GDASession sessao, IProdutoCalculo produto, int qtdeAmbiente, decimal total,
                                            ArredondarAluminio arredondarAluminio, bool calcularMultiploDe5, bool nf, int numeroBeneficiamentos,
                                            int alturaBeneficiamento, int larguraBeneficiamento)
        {
            float totM2Temp = produto.TotM;

            CalcularTotalM2(sessao, produto, calcularMultiploDe5, nf, totM2Temp);

            float totM2Preco = CalcularTotalM2ParaCalculoPreco(
                sessao,
                produto,
                qtdeAmbiente,
                calcularMultiploDe5,
                nf,
                numeroBeneficiamentos,
                totM2Temp
                );

            float areaMinima = AreaMinima(produto, numeroBeneficiamentos);

            float totM2Calc = totM2Preco < (areaMinima * produto.Qtde * qtdeAmbiente)
                ? (areaMinima * produto.Qtde * qtdeAmbiente)
                : totM2Preco;

            return(total / (totM2Calc > 0 ? (decimal)totM2Calc : 1));
        }
Exemple #4
0
        private void CalcularTotalM2CalculoAreaMinima(IProdutoCalculo produto, int qtdeAmbiente, bool nf,
                                                      int numeroBeneficiamentos, bool compra, float totM2Preco)
        {
            float m2Minimo = AreaMinima(produto, numeroBeneficiamentos, nf, compra) * produto.Qtde * qtdeAmbiente;

            produto.TotM2Calc = totM2Preco < m2Minimo ? m2Minimo : totM2Preco;
        }
Exemple #5
0
        private void CalculaTotalM2(GDASession sessao, IProdutoCalculo produto, bool calcMult5, int numeroBenef)
        {
            if (produto.Altura > 0 && produto.Largura > 0 &&
                (produto.TotM == 0 || produto.DadosProduto.DadosGrupoSubgrupo.ProdutoEVidro()))
            {
                var quantidadeOriginalProduto = produto.Qtde;
                var quantidadeCalcularM2      = CalcularQuantidadeProdutoModulado(produto);

                // Caso o produto seja chapa (altura ou largura > 2500), seja vendido por qtd e seja produto de produção,
                // não calcula múltiplo de 5
                calcMult5 = !(produto.Altura > 2500 || produto.Largura > 2500) && calcMult5;

                try
                {
                    produto.Qtde      = quantidadeCalcularM2;
                    produto.TotM      = CalculoM2.Instance.Calcular(sessao, produto.Container, produto, calcMult5);
                    produto.TotM2Calc = CalculoM2.Instance.CalcularM2Calculo(sessao, produto.Container, produto, true,
                                                                             calcMult5, numeroBenef);
                }
                finally
                {
                    produto.Qtde = quantidadeOriginalProduto;
                }
            }
        }
Exemple #6
0
        private float Calcular(IProdutoCalculo produto, bool calcularMultiploDe5, int altura, int largura, float qtde)
        {
            int adicionarValorRedondo = AdicionarValorRedondo(produto);

            altura += adicionarValorRedondo;

            int larguraRedondo = produto.Redondo
                ? altura
                : 1000;

            // Se a largura estiver zerada, deve considerar a altura no cálculo e não 1000 como estava,
            // para não calcular errado, chamado 7564
            largura = adicionarValorRedondo + (
                largura == 0
                    ? larguraRedondo
                    : largura
                );

            altura = ArredondarAlturaBox(produto, altura);

            if (!calcularMultiploDe5)
            {
                // Se não for para recalcular utilizando múltiplo de 5, deve retornar mais de duas casas decimais
                return(largura * altura / 1000000f * qtde);
            }

            var calculo = CalcularMultiploDe5(produto, altura, largura, qtde);
            var m2      = AjustaCalculoM2(calculo);

            // Alteração feita para vidros com m2 menor que 0.01 ficar com esta medida, para que o valor
            // não fique zerado, quando fizer a alteração para calcular vidro com x casas decimais,
            // utilizar esta opção somente se estiver sendo utilizada 2 casas decimais
            return(Math.Max((float)m2, 0.01f));
        }
Exemple #7
0
        protected override void Calcular(GDASession sessao, IProdutoCalculo produto, int qtdeAmbiente,
                                         ArredondarAluminio arredondarAluminio, bool calcularMultiploDe5, bool nf, int numeroBeneficiamentos,
                                         int alturaBeneficiamento, int larguraBeneficiamento, bool compra, decimal custoCompra, bool usarChapaVidro,
                                         bool valorBruto)
        {
            float decimosAltura     = produto.Altura - (int)produto.Altura;
            float alturaArredondada = produto.Altura;

            if (!produto.DadosProduto.DadosGrupoSubgrupo.ProdutoEAluminio())
            {
                arredondarAluminio = ArredondarAluminio.NaoArredondar;
            }

            if (arredondarAluminio != ArredondarAluminio.NaoArredondar && ValorArredondar > 0)
            {
                alturaArredondada = Arredondar(produto, decimosAltura) ?? alturaArredondada;

                if (arredondarAluminio == ArredondarAluminio.ArredondarEAtualizarProduto)
                {
                    produto.Altura = alturaArredondada;
                }
            }

            produto.CustoProd = custoCompra * ObterBaseCalculo(produto, (decimal)alturaArredondada, qtdeAmbiente, false);
            var baseCalculo = ObterBaseCalculo(produto, (decimal)alturaArredondada, qtdeAmbiente, true);

            if (!valorBruto)
            {
                produto.Total = produto.ValorUnit * baseCalculo;
            }
            else
            {
                produto.TotalBruto = produto.ValorUnitarioBruto * baseCalculo;
            }
        }
Exemple #8
0
 private void CalcularTotalBrutoProduto(GDASession sessao, IProdutoCalculo produto)
 {
     if (produto.TotalBruto == 0 && (produto.IdProduto == 0 || produto.Total > 0))
     {
         ValorBruto.Instance.Calcular(sessao, produto.Container, produto);
     }
 }
Exemple #9
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;
            }
        }
Exemple #10
0
        private decimal?CalcularValor(GDASession sessao, IProdutoCalculo produto, decimal baseCalculo,
                                      bool compra, bool nf, int alturaBeneficiamento, int larguraBeneficiamento)
        {
            bool calcularMultiploDe5 = produto.DadosProduto.DadosGrupoSubgrupo.TipoCalculo(nf, compra) == TipoCalculoGrupoProd.M2;

            if (produto.Container is Pedido || produto.Container is PedidoEspelho)
            {
                calcularMultiploDe5 = produto.DadosProduto.DadosGrupoSubgrupo.TipoCalculo(nf, compra) == TipoCalculoGrupoProd.M2 && !produto.Container.IsPedidoProducaoCorte;
            }

            var estrategia = ValorUnitarioStrategyFactory.Instance.RecuperaEstrategia(produto, nf, compra);

            var valorUnitario = estrategia.Calcular(
                sessao,
                produto,
                baseCalculo,
                ArredondarAluminio.ArredondarApenasCalculo,
                calcularMultiploDe5,
                nf,
                produto.Beneficiamentos.CountAreaMinimaSession(null),
                alturaBeneficiamento,
                larguraBeneficiamento
                );

            return(valorUnitario);
        }
Exemple #11
0
        public void Calcular(GDASession sessao, IContainerCalculo container, IProdutoCalculo produto)
        {
            produto.InicializarParaCalculo(sessao, container);

            produto.TotalBruto = produto.Total - DescontoValorBruto(produto);
            CalcularValorUnitarioBruto(sessao, produto);
        }
Exemple #12
0
 private void CalcularTotalM2(GDASession sessao, IProdutoCalculo produto, bool calcMult5, bool compra)
 {
     if (!compra)
     {
         produto.TotM = CalculoM2.Instance.Calcular(sessao, produto.Container, produto,
                                                    calcMult5 && DeveCalcularMultiploDe5);
     }
 }
Exemple #13
0
        protected virtual decimal AplicarProduto(decimal percentual, IProdutoCalculo produto)
        {
            decimal valorCalculado = Math.Round(percentual / 100 * PrecoTabelaCliente(produto), 2);

            AplicarValorProduto(produto, valorCalculado);

            return(valorCalculado);
        }
Exemple #14
0
 protected virtual void AplicarValorResidual(GDASession sessao, IProdutoCalculo produto, decimal valorResidual)
 {
     if (produto != null && valorResidual != 0)
     {
         AplicarValorProduto(produto, valorResidual);
         RecalcularValorUnitario(sessao, produto);
     }
 }
Exemple #15
0
        protected override decimal Calcular(GDASession sessao, IProdutoCalculo produto, int qtdeAmbiente, decimal total,
                                            ArredondarAluminio arredondarAluminio, bool calcularMultiploDe5, bool nf, int numeroBeneficiamentos,
                                            int alturaBeneficiamento, int larguraBeneficiamento)
        {
            decimal divisor = Divisor(produto);

            return(total / divisor);
        }
Exemple #16
0
        private decimal Divisor(IProdutoCalculo produto, int qtdeAmbiente, int metroLinear)
        {
            float divisor = (metroLinear / 1000F) * (produto.Qtde * qtdeAmbiente);

            divisor = divisor > 0 ? divisor : 1;

            return((decimal)divisor);
        }
        /// <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);
        }
Exemple #18
0
        protected override decimal AplicarProduto(decimal percentual, IProdutoCalculo produto)
        {
            decimal valorCalculado = Math.Round(percentual / 100 * (PrecoTabelaCliente(produto) + produto.ValorAcrescimo - produto.ValorDesconto), 2);

            AplicarValorProduto(produto, valorCalculado);

            return(valorCalculado);
        }
Exemple #19
0
        private void CalcularValorUnitarioBruto(GDASession sessao, IProdutoCalculo produto)
        {
            var valorUnitario = ValorUnitario.Instance.CalcularValor(sessao, produto.Container, produto, produto.TotalBruto);

            if (valorUnitario.HasValue)
            {
                produto.ValorUnitarioBruto = valorUnitario.Value;
            }
        }
Exemple #20
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;
            }
        }
Exemple #21
0
        private void CalculaTotalM2(GDASession sessao, IProdutoCalculo produto)
        {
            if (produto.Altura > 0 && produto.Largura > 0)
            {
                var calcularMultiploDe5 = produto.DadosProduto.DadosGrupoSubgrupo.ProdutoEVidro() && produto.DadosProduto.DadosGrupoSubgrupo.TipoCalculo() != TipoCalculoGrupoProd.Qtd;

                produto.TotM = CalculoM2.Instance.Calcular(sessao, produto.Container, produto, calcularMultiploDe5);
            }
        }
Exemple #22
0
        protected override float?Arredondar(IProdutoCalculo produto, float decimosAltura)
        {
            if (produto.Altura < 6)
            {
                return(6f);
            }

            return(null);
        }
Exemple #23
0
        private int LarguraProduto(IProdutoCalculo produto)
        {
            if ((produto?.Container?.MaoDeObra).GetValueOrDefault() && (produto?.Redondo).GetValueOrDefault() && produto?.Largura == 0)
            {
                return((int)produto.Altura);
            }

            return(produto.Largura);
        }
Exemple #24
0
        private float AplicarM2MinimoChapaVidro(IProdutoCalculo produto, bool possuiChapaVidro, float m2)
        {
            if (possuiChapaVidro)
            {
                float perc = produto.DadosProduto.DadosChapaVidro.PercentualAcrescimoM2ChapaVidro(m2);
                return((float)Math.Round(m2 * (1 + perc), Geral.NumeroCasasDecimaisTotM));
            }

            return(m2);
        }
Exemple #25
0
        private decimal ObterBaseCalculo(IProdutoCalculo produto, int alturaBeneficiamento, int larguraBeneficiamento,
                                         int qtdeAmbiente)
        {
            var metroLinear = (produto.Altura * alturaBeneficiamento)
                              + (produto.Largura * larguraBeneficiamento);

            return(qtdeAmbiente
                   * (decimal)produto.Qtde
                   * (decimal)(metroLinear / 1000));
        }
Exemple #26
0
        private int AdicionarValorRedondo(IProdutoCalculo produto)
        {
            if (produto.Redondo)
            {
                return(produto.Espessura < 12
                    ? Geral.AdicionalVidroRedondoAte12mm
                    : Geral.AdicionalVidroRedondoAcima12mm);
            }

            return(0);
        }
Exemple #27
0
        protected virtual void RemoverBeneficiamentos(IProdutoCalculo produto)
        {
            var beneficiamentos = produto.Beneficiamentos ?? GenericBenefCollection.Empty;

            foreach (var beneficiamento in beneficiamentos)
            {
                RemoverValorBeneficiamento(beneficiamento);
            }

            produto.Beneficiamentos = beneficiamentos;
        }
Exemple #28
0
        protected override decimal CalcularTotalBeneficiamentosProduto(IProdutoCalculo produto)
        {
            decimal totalAtual = 0;

            foreach (var beneficiamento in (produto.Beneficiamentos ?? GenericBenefCollection.Empty))
            {
                totalAtual += beneficiamento.TotalBruto + beneficiamento.ValorAcrescimo - beneficiamento.ValorDesconto;
            }

            return(totalAtual);
        }
Exemple #29
0
        protected override decimal AplicarProduto(decimal percentual, IProdutoCalculo produto)
        {
            var baseCalculo = BaseCalculoTotalProduto(produto);

            percentual = (decimal)produto.PercDescontoQtde;

            decimal valorCalculado = Math.Round(baseCalculo * percentual, 2);

            AplicarValorProduto(produto, valorCalculado);
            return(valorCalculado);
        }
Exemple #30
0
        private void IncluirDescontoPorQuantidade(IProdutoCalculo produto)
        {
            if (produto.PercDescontoQtde > 0)
            {
                var fatorMultiplicacao = produto.PercDescontoQtde < 100
                    ? 1 - (produto.PercDescontoQtde / 100)
                    : 0;

                produto.Total *= (decimal)fatorMultiplicacao;
            }
        }