/// <summary> /// Realiza a conversão dos dados de rentabilidade do custo do produto da nota /// para um registro da rentabilidade. /// </summary> /// <param name="produtoNfCustoRentabilidade"></param> /// <returns></returns> private IRegistroRentabilidade ConverterParaRegistroRentabilidade(Data.Model.ProdutoNfCustoRentabilidade produtoNfCustoRentabilidade) { var tipo = (TipoRegistroRentabilidade)produtoNfCustoRentabilidade.Tipo; return(new RegistroRentabilidade(produtoNfCustoRentabilidade.IdRegistro, ProvedorDescritoresRegistro.ObterDescritor(tipo, produtoNfCustoRentabilidade.IdRegistro), tipo, produtoNfCustoRentabilidade.Valor)); }
/// <summary> /// Recupera o item da rentabilidade para o custo do produto da nota fiscal. /// </summary> /// <param name="sessao"></param> /// <param name="produtoNf"></param> /// <param name="produtoNfCusto"></param> /// <param name="prazoMedio"></param> /// <param name="produto"></param> /// <returns></returns> private IItemRentabilidade <Data.Model.ProdutoNfCusto> ObterItemProdutoNfCusto( GDA.GDASession sessao, Data.Model.ProdutosNf produtoNf, Data.Model.ProdutoNfCusto produtoNfCusto, int prazoMedio, Data.Model.Produto produto) { var registros = new Lazy <IList <Data.Model.ProdutoNfCustoRentabilidade> >( () => Data.DAL.ProdutoNfCustoRentabilidadeDAO.Instance.ObterPorProdutoNf(sessao, produtoNfCusto.IdProdNfCusto)); 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.ProdutoNfCustoRentabilidade { IdProdNfCusto = produtoNfCusto.IdProdNfCusto, IdRegistro = idRegistro, Tipo = (int)tipo, Valor = valor }; registros.Value.Add(registro); } else { registro.Valor = valor; } return(ConverterParaRegistroRentabilidade(registro)); }); // Calcula o custo do produto var custoProd = Glass.Global.CalculosFluxo.CalcTotaisItemProdFast(sessao, produto.TipoCalculo, produtoNf.Altura, produtoNf.Largura, produtoNf.Qtde, produtoNf.TotM, produtoNfCusto.CustoCompra, produtoNf.AlturaBenef.GetValueOrDefault(2), produtoNf.LarguraBenef.GetValueOrDefault(2)); var preceoVendaSemIPIUnitario = (produtoNf.Total + produtoNf.ValorIcmsSt) / (decimal)produtoNf.Qtde; return(new ItemRentabilidade <Data.Model.ProdutoNfCusto, Data.Model.ProdutoNfCustoRentabilidade>( ProvedorIndicadoresFinanceiro, criarRegistro, produtoNfCusto, registros, ConverterParaRegistroRentabilidade) { Descricao = $"Produto [{produtoNfCusto.Qtde}] ({produto?.CodInterno}) {produto?.Descricao}", PrecoVendaSemIPI = preceoVendaSemIPIUnitario * produtoNfCusto.Qtde, PrecoCusto = custoProd, PrazoMedio = prazoMedio, PercentualICMSCompra = (decimal)(produtoNfCusto.AliqIcmsCompra ?? 0) / 100m, PercentualICMSVenda = (decimal)produtoNf.AliqIcms / 100m, FatorICMSSubstituicao = 0m, PercentualIPICompra = (decimal)(produtoNfCusto.AliqIpiCompra ?? 0) / 100m, PercentualIPIVenda = (decimal)produtoNf.AliqIpi / 100m, PercentualComissao = produtoNf.PercComissao / 100m, CustosExtras = 0m, PercentualRentabilidade = produtoNfCusto.PercentualRentabilidade / 100m, RentabilidadeFinanceira = produtoNfCusto.RentabilidadeFinanceira }); }