private void ConverterDtoParaModelo(Data.Model.ProdutosPedido destino) { destino.IdAmbientePedido = (uint?)this.cadastro.ObterValorNormalizado(c => c.IdAmbiente, (int?)destino.IdAmbientePedido); destino.IdProd = this.cadastro.Produto != null ? (uint)this.cadastro.Produto.Id : destino.IdProd; destino.Espessura = this.cadastro.Produto != null ? (float)this.cadastro.Produto.Espessura : destino.Espessura; destino.Qtde = (float)this.cadastro.ObterValorNormalizado(c => c.Quantidade, (decimal)destino.Qtde); destino.PercDescontoQtde = this.cadastro.DescontoPorQuantidade != null ? (float)this.cadastro.DescontoPorQuantidade.Percentual.GetValueOrDefault() : destino.PercDescontoQtde; destino.ValorDescontoQtde = this.cadastro.DescontoPorQuantidade != null?this.cadastro.DescontoPorQuantidade.Valor.GetValueOrDefault() : destino.ValorDescontoQtde; destino.Largura = this.cadastro.ObterValorNormalizado(c => c.Largura, destino.Largura); destino.Altura = (float?)this.cadastro.Altura?.ParaCalculo ?? destino.Altura; destino.AlturaReal = (float?)this.cadastro.Altura?.Real ?? destino.Altura; destino.TotM = (float?)this.cadastro.AreaEmM2?.Real ?? destino.TotM; destino.TotM2Calc = (float?)this.cadastro.AreaEmM2?.ParaCalculo ?? destino.TotM2Calc; destino.ValorVendido = this.cadastro.ObterValorNormalizado(c => c.ValorUnitario, destino.ValorVendido); destino.IdProcesso = (uint?)this.cadastro.ObterValorNormalizado(c => c.IdProcesso, (int?)destino.IdProcesso); destino.IdAplicacao = (uint?)this.cadastro.ObterValorNormalizado(c => c.IdAplicacao, (int?)destino.IdAplicacao); destino.CodPedCliente = this.cadastro.ObterValorNormalizado(c => c.CodigoPedidoCliente, destino.CodPedCliente); destino.Total = this.cadastro.ObterValorNormalizado(c => c.Total, destino.Total); destino.Obs = this.cadastro.ObterValorNormalizado(c => c.Observacao, destino.Obs); destino.AplicarBenefComposicao = this.cadastro.Composicao != null?this.cadastro.Composicao.AplicarBeneficiamentosProdutosFilhos.GetValueOrDefault() : destino.AplicarBenefComposicao; destino.IdProcessoFilhas = this.cadastro.ObterValorNormalizado(c => c.IdProcessoFilhas, destino.IdProcessoFilhas); destino.IdAplicacaoFilhas = this.cadastro.ObterValorNormalizado(c => c.IdAplicacaoFilhas, destino.IdAplicacaoFilhas); this.ConverterBeneficiamentos(destino); }
/// <summary> /// Recupera o item de rentabilidade para o produto do pedido. /// </summary> /// <param name="sessao"></param> /// <param name="produtoPedido"></param> /// <returns></returns> private IItemRentabilidade ObterItemProdutoPedido(GDA.GDASession sessao, Data.Model.ProdutosPedido produtoPedido) { var prazoMedio = CalcularPrazoMedioPedido(sessao, produtoPedido.IdPedido); var filhos = Data.DAL.ProdutosPedidoDAO.Instance.ObterFilhosComposicao(sessao, (int)produtoPedido.IdProdPed); var produtos = Data.DAL.ProdutoDAO.Instance.ObterProdutos(sessao, filhos.Select(f => f.IdProd).Concat(new uint[] { produtoPedido.IdProd }).Distinct()); return(ObterItemProdutoPedido(sessao, produtoPedido, prazoMedio, produtos, filhos)); }
private void ConverterBeneficiamentos(Data.Model.ProdutosPedido destino) { var itens = this.cadastro.Beneficiamentos?.Itens ?? new Models.Genericas.V1.ItemBeneficiamentoDto[0]; destino.ValorBenef = this.cadastro.Beneficiamentos?.Valor ?? destino.ValorBenef; destino.AlturaBenef = this.cadastro.Beneficiamentos?.Altura ?? destino.AlturaBenef; destino.LarguraBenef = this.cadastro.Beneficiamentos?.Largura ?? destino.LarguraBenef; destino.Redondo = this.cadastro.Beneficiamentos?.Redondo ?? destino.Redondo; destino.Beneficiamentos = itens.ObterListaBeneficiamentos(); }
/// <summary> /// Inicia uma nova instância da classe <see cref="ListaDto"/>. /// </summary> /// <param name="produtoPedido">A model de produtos de pedido.</param> internal ListaDto(Data.Model.ProdutosPedido produtoPedido) { this.Id = (int)produtoPedido.IdProdPed; this.Produto = new ProdutoDto { Codigo = produtoPedido.CodInterno, Descricao = produtoPedido.DescrProduto, }; this.Beneficiamentos = produtoPedido.DescrBeneficiamentos; this.Quantidade = (decimal)produtoPedido.Qtde; this.Largura = produtoPedido.Largura; this.Altura = (decimal)produtoPedido.Altura; this.TotalMetroQuadrado = (decimal)produtoPedido.TotM; this.Total = produtoPedido.Total; }
/// <summary> /// Construtor padrão. /// </summary> /// <param name="produtoPedido"></param> /// <param name="loja"></param> /// <param name="cliente"></param> /// <param name="naturezaOperacao"></param> /// <param name="produto"></param> /// <param name="mva"></param> /// <param name="descontoRateadoImpostos"></param> /// <param name="codValorFiscal"></param> public ProdutoPedidoItemImposto( Data.Model.ProdutosPedido produtoPedido, Global.Negocios.Entidades.Loja loja, Global.Negocios.Entidades.Cliente cliente, Entidades.NaturezaOperacao naturezaOperacao, Global.Negocios.Entidades.Produto produto, float mva, decimal descontoRateadoImpostos, IProvedorCodValorFiscal provedorCodValorFiscal) { ProdutoPedido = produtoPedido; Loja = loja; Cliente = cliente; NaturezaOperacao = naturezaOperacao; Produto = produto; Mva = mva; DescontoRateadoImpostos = descontoRateadoImpostos; ProvedorCodValorFiscal = provedorCodValorFiscal; }
/// <summary> /// Executa o calculo da rentabilidade para o produto do tipo principal. /// </summary> /// <param name="sessao"></param> /// <param name="instancia">Instância do produto.</param> /// <returns></returns> Data.ICalculoRentabilidadeResultado Data.ICalculadoraRentabilidade <Data.Model.ProdutosPedido> .Calcular(GDA.GDASession sessao, Data.Model.ProdutosPedido instancia) { if (!CalculoHabilitado) { return(CriarResultadoNaoExecutado()); } var pedido = Data.DAL.PedidoDAO.Instance.GetElementByPrimaryKey(sessao, instancia.IdPedido); IdFunc = (int)pedido.IdFunc; IdLoja = (int)pedido.IdLoja; var item = ObterItemProdutoPedido(sessao, instancia); return(Calcular(item)); }
/// <summary> /// Recupera o item com base no produto do pedido. /// </summary> /// <param name="referencia"></param> /// <returns></returns> IItemRentabilidade IProvedorItemRentabilidade <Data.Model.ProdutosPedido> .ObterItem(GDA.GDASession sessao, Data.Model.ProdutosPedido referencia) { return(ObterItemProdutoPedido(sessao, referencia)); }
/// <summary> /// Recupera o item com base no produto do pedido. /// </summary> /// <param name="referencia"></param> /// <returns></returns> IItemRentabilidade IProvedorItemRentabilidade <Data.Model.ProdutosPedido> .ObterItem(Data.Model.ProdutosPedido referencia) { using (var sessao = new GDA.GDASession()) return(ObterItemProdutoPedido(sessao, referencia)); }
/// <summary> /// Recupera um item de rentabilidade para o produto pedido informado. /// </summary> /// <param name="sessao"></param> /// <param name="produtoPedido"></param> /// <param name="prazoMedio"></param> /// <param name="produtos"></param> /// <param name="produtosPedidoFilhos">Relação dos produtos do pedidos filhos do produto informado.</param> /// <returns></returns> private IItemRentabilidade <Data.Model.ProdutosPedido> ObterItemProdutoPedido( GDA.GDASession sessao, Data.Model.ProdutosPedido produtoPedido, int prazoMedio, IEnumerable <Data.Model.Produto> produtos, IEnumerable <Data.Model.ProdutosPedido> produtosPedidoFilhos) { var registros = new Lazy <IList <Data.Model.ProdutoPedidoRentabilidade> >( () => Data.DAL.ProdutoPedidoRentabilidadeDAO.Instance.ObterPorProdutoPedido(sessao, produtoPedido.IdProdPed)); var criarRegistro = new CriadorRegistroRentabilidade((tipo, nome, valor) => { var idRegistro = ProvedorDescritoresRegistro.ObterRegistro(tipo, nome); var registro = registros.Value.FirstOrDefault(f => f.Tipo == (int)tipo && f.IdRegistro == idRegistro); if (registro == null) { registro = new Data.Model.ProdutoPedidoRentabilidade { IdProdPed = (int)produtoPedido.IdProdPed, IdRegistro = idRegistro, Tipo = (int)tipo, Valor = valor }; registros.Value.Add(registro); } else { registro.Valor = valor; } return(ConverterParaRegistroRentabilidade(registro)); }); // Carrega o produto associado var produto = produtos.FirstOrDefault(f => f.IdProd == produtoPedido.IdProd); // Calculao custo do produto var custoProd = Global.CalculosFluxo.CalcTotaisItemProdFast(sessao, produto.TipoCalculo, produtoPedido.Altura, produtoPedido.Largura, produtoPedido.Qtde, produtoPedido.TotM, produto.CustoCompra, produtoPedido.AlturaBenef.GetValueOrDefault(2), produtoPedido.LarguraBenef.GetValueOrDefault(2)); if (produtosPedidoFilhos.Any()) { // Recupera os itens dos produtos filhos var itens = produtosPedidoFilhos.Select(produtoPedido1 => ObterItemProdutoPedido(sessao, produtoPedido1, prazoMedio, produtos, new Data.Model.ProdutosPedido[0])) .ToList(); return(new ItemRentabilidadeContainer <Data.Model.ProdutosPedido, Data.Model.ProdutoPedidoRentabilidade>( ProvedorIndicadoresFinanceiro, criarRegistro, produtoPedido, itens, f => true, registros, ConverterParaRegistroRentabilidade) { Descricao = $"Produto ({produto?.CodInterno}) {produto?.Descricao}", PrecoVendaSemIPI = produtoPedido.Total + produtoPedido.ValorBenef, PrazoMedio = prazoMedio, PercentualComissao = produtoPedido.PercComissao / 100m, PercentualRentabilidade = produtoPedido.PercentualRentabilidade / 100m, RentabilidadeFinanceira = produtoPedido.RentabilidadeFinanceira }); } else { return new ItemRentabilidade <Data.Model.ProdutosPedido, Data.Model.ProdutoPedidoRentabilidade>( ProvedorIndicadoresFinanceiro, criarRegistro, produtoPedido, registros, ConverterParaRegistroRentabilidade) { Descricao = $"Produto ({produto?.CodInterno}) {produto?.Descricao}", PrecoVendaSemIPI = produtoPedido.Total + produtoPedido.ValorBenef, // Não atualizar a configuração do sistema o total do produto não possui o valor do IPI PrecoCusto = custoProd, PrazoMedio = prazoMedio, PercentualICMSVenda = (decimal)produtoPedido.AliqIcms / 100m, FatorICMSSubstituicao = 0m, PercentualIPICompra = 0m, //(decimal)(produto?.AliqIPI ?? 0) / 100m, PercentualIPIVenda = (decimal)produtoPedido.AliqIpi / 100m, PercentualComissao = produtoPedido.PercComissao / 100m, CustosExtras = 0M, PercentualRentabilidade = produtoPedido.PercentualRentabilidade / 100m, RentabilidadeFinanceira = produtoPedido.RentabilidadeFinanceira } }; }
/// <summary> /// Inicia uma nova instância da classe <see cref="ConverterCadastroAtualizacaoParaProdutoPedido"/>. /// </summary> /// <param name="cadastro">O DTO de cadastro, enviado para o endpoint.</param> /// <param name="atual">O produto de pedido atual (opcional), para que sejam aproveitados os valores, se necessário.</param> public ConverterCadastroAtualizacaoParaProdutoPedido(CadastroAtualizacaoDto cadastro, Data.Model.ProdutosPedido atual = null) { this.cadastro = cadastro; this.produtoPedido = new Lazy <Data.Model.ProdutosPedido>(() => { var destino = atual ?? new Data.Model.ProdutosPedido(); this.ConverterDtoParaModelo(destino); return(destino); }); }
private IHttpActionResult ValidarOperacaoId(GDASession sessao, int idPedido, int id, out Data.Model.ProdutosPedido produtoPedido) { produtoPedido = null; var validacao = this.ValidarIdPedido(sessao, idPedido); if (validacao != null) { return(validacao); } if (id <= 0) { return(this.ErroValidacao("Número do produto deve ser maior que zero.")); } produtoPedido = ProdutosPedidoDAO.Instance.GetElementByPrimaryKey(sessao, id); if (produtoPedido == null) { return(this.NaoEncontrado($"Produto de pedido {id} não encontrado.")); } if (produtoPedido.IdPedido != idPedido) { return(this.NaoEncontrado($"Produto de pedido {id} não pertence ao pedido {idPedido}.")); } return(null); }
/// <summary> /// Inicia uma nova instância da classe <see cref="ListaDto"/>. /// </summary> /// <param name="sessao">A transação com o banco de dados.</param> /// <param name="produtoPedido">A model de produto de pedido.</param> internal ListaDto(GDASession sessao, Data.Model.ProdutosPedido produtoPedido) { this.Id = (int)produtoPedido.IdProdPed; this.IdMaterialProjeto = (int?)produtoPedido.IdMaterItemProj; this.Produto = new ProdutoDto { Id = (int)produtoPedido.IdProd, Codigo = produtoPedido.CodInterno, Descricao = produtoPedido.DescrProduto, DescricaoComBeneficiamentos = produtoPedido.DescricaoProdutoComBenef, Espessura = (decimal)produtoPedido.Espessura, Vidro = produtoPedido.IsVidro == "true", }; this.Quantidade = (decimal)produtoPedido.Qtde; this.QuantidadeAmbiente = produtoPedido.QtdeAmbiente; this.DescontoPorQuantidade = new DescontoQuantidadeDto { Percentual = (decimal)produtoPedido.PercDescontoQtde, Valor = produtoPedido.ValorDescontoQtde, }; this.Largura = produtoPedido.Largura; this.Altura = new AlturaDto { Real = (decimal)produtoPedido.AlturaReal, ParaCalculo = (decimal)produtoPedido.Altura, ParaExibirNaLista = produtoPedido.AlturaLista, }; this.AreaEmM2 = new AreaDto { Real = (decimal)produtoPedido.TotM, ParaCalculo = (decimal)produtoPedido.TotM2Calc, ParaCalculoSemChapa = produtoPedido.TotalM2CalcSemChapaString, }; this.ValorUnitario = produtoPedido.ValorVendido; this.Processo = IdCodigoDto.TentarConverter((int?)produtoPedido.IdProcesso, produtoPedido.CodProcesso); this.Aplicacao = IdCodigoDto.TentarConverter((int?)produtoPedido.IdAplicacao, produtoPedido.CodAplicacao); this.CodigoPedidoCliente = produtoPedido.PedCli; this.Total = produtoPedido.Total; this.Beneficiamentos = new BeneficiamentosDto { Valor = produtoPedido.ValorBenef, Altura = produtoPedido.AlturaBenef, Largura = produtoPedido.LarguraBenef, Espessura = (decimal?)produtoPedido.EspessuraBenef, Redondo = produtoPedido.Redondo, Itens = produtoPedido.Beneficiamentos?.ObterListaBeneficiamentos(), }; this.Observacao = produtoPedido.Obs; this.PercentualComissao = (decimal)produtoPedido.PercComissao; this.Composicao = new ComposicaoDto { PossuiFilhos = produtoPedido.IsProdLamComposicao, PermitirInserirFilhos = produtoPedido.IsProdLamComposicao && !ProdutosPedidoDAO.Instance.IsProdLaminado(produtoPedido.IdProdPed), }; this.Permissoes = new PermissoesDto { Editar = produtoPedido.PodeEditar, Excluir = produtoPedido.DeleteVisible, }; }