/// <summary> /// Realiza a conversão dos dados de rentabilidade do ambiente para um /// registro de rentabilidade. /// </summary> /// <param name="produtoPedidoRentabilidade"></param> /// <returns></returns> private IRegistroRentabilidade ConverterParaRegistroRentabilidade(Data.Model.ProdutoPedidoRentabilidade produtoPedidoRentabilidade) { var tipo = (TipoRegistroRentabilidade)produtoPedidoRentabilidade.Tipo; return(new RegistroRentabilidade(produtoPedidoRentabilidade.IdRegistro, ProvedorDescritoresRegistro.ObterDescritor(tipo, produtoPedidoRentabilidade.IdRegistro), tipo, produtoPedidoRentabilidade.Valor)); }
/// <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 } }; }