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); }
public void Calcular(GDASession sessao, IContainerCalculo container, IProdutoCalculo produto) { produto.InicializarParaCalculo(sessao, container); produto.TotalBruto = produto.Total - DescontoValorBruto(produto); CalcularValorUnitarioBruto(sessao, produto); }
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; } }
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); }
public static int?IdProjeto(this IContainerCalculo container) { return(container is Projeto || ContainerInternoEDoTipo(container, ContainerCalculoDTO.TipoContainer.Projeto) ? (int?)container.Id : null); }
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 )); }
/// <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); }
/// <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); } }
protected void AtualizaDadosProdutosCalculo(IEnumerable <IProdutoCalculo> produtosCalculo, GDASession sessao, IContainerCalculo container) { foreach (var produtoCalculo in produtosCalculo) { AtualizaDadosProdutosCalculo(produtoCalculo, sessao, container); } }
/// <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)); }
/// <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)); }
/// <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 })); }
private string ObterIdContainer(IContainerCalculo container) { return(string.Format( "{0}:{1}", container.GetType().FullName, container.Id )); }
public static int?IdPedido(this IContainerCalculo container) { return(container is Pedido || container is PedidoEspelho || ContainerInternoEDoTipo(container, ContainerCalculoDTO.TipoContainer.Pedido) ? (int?)container.Id : null); }
public IProdutoCalculo[] GerarProdutos(IContainerCalculo container) { return(new[] { GerarProduto(container, 1, true), GerarProduto(container, 2, false), GerarProduto(container, 3, false) }); }
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; } }
private int NormalizarAlturaLarguraBeneficiamento(int?valor, IContainerCalculo container, int tipoCalc) { if ((container?.MaoDeObra ?? false) && tipoCalc == (int)TipoCalculoGrupoProd.Perimetro) { return(valor.GetValueOrDefault()); } return(2); }
/// <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)); }
/// <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)); }
private static bool ContainerInternoEDoTipo(IContainerCalculo container, ContainerCalculoDTO.TipoContainer tipo) { var containerInterno = container as ContainerCalculoDTO; if (containerInterno == null) { return(false); } return(containerInterno.Tipo == tipo); }
/// <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; } }
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() )); }
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); }
/// <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); }
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); }
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); }
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; }
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); }
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)); }
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 )); }