/// <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.ProdutosPedidoEspelho produtoPedido) { var prazoMedio = CalcularPrazoMedioPedido(sessao, produtoPedido.IdPedido); var filhos = Data.DAL.ProdutosPedidoEspelhoDAO.Instance.ObterFilhosComposicao(sessao, 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)); }
/// <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="provedorCodValorFiscal"></param> public ProdutoPedidoEspelhoItemImposto( Data.Model.ProdutosPedidoEspelho 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.ProdutosPedidoEspelho> .Calcular(GDA.GDASession sessao, Data.Model.ProdutosPedidoEspelho instancia) { if (!CalculoHabilitado) { return(CriarResultadoNaoExecutado()); } var item = ObterItemProdutoPedido(sessao, instancia); return(Calcular(item)); }
/// <summary> /// Recupera o item com base no produto do pedido. /// </summary> /// <param name="sessao"></param> /// <param name="referencia"></param> /// <returns></returns> IItemRentabilidade IProvedorItemRentabilidade <Data.Model.ProdutosPedidoEspelho> .ObterItem(GDA.GDASession sessao, Data.Model.ProdutosPedidoEspelho 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.ProdutosPedidoEspelho> .ObterItem(Data.Model.ProdutosPedidoEspelho 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.ProdutosPedidoEspelho> ObterItemProdutoPedido( GDA.GDASession sessao, Data.Model.ProdutosPedidoEspelho produtoPedido, int prazoMedio, IEnumerable <Data.Model.Produto> produtos, IEnumerable <Data.Model.ProdutosPedidoEspelho> produtosPedidoFilhos) { var registros = new Lazy <IList <Data.Model.ProdutoPedidoEspelhoRentabilidade> >( () => Data.DAL.ProdutoPedidoEspelhoRentabilidadeDAO.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.ProdutoPedidoEspelhoRentabilidade { 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.First(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.ProdutosPedidoEspelho[0])) .ToList(); return(new ItemRentabilidadeContainer <Data.Model.ProdutosPedidoEspelho, Data.Model.ProdutoPedidoEspelhoRentabilidade>( 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.ProdutosPedidoEspelho, Data.Model.ProdutoPedidoEspelhoRentabilidade>( ProvedorIndicadoresFinanceiro, criarRegistro, produtoPedido, registros, ConverterParaRegistroRentabilidade) { Descricao = $"Produto ({produto.CodInterno}) {produto.Descricao}", PrecoVendaSemIPI = produtoPedido.Total + produtoPedido.ValorBenef, // Na atualiza 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 } }; }