/// <summary> /// Recupera o item de rentabilidade para o ambiente do pedido. /// </summary> /// <param name="sessao"></param> /// <param name="ambiente"></param> /// <returns></returns> private IItemRentabilidade ObterItemAmbientePedido(GDA.GDASession sessao, Data.Model.AmbientePedido ambiente) { var prazoMedio = CalcularPrazoMedioPedido(sessao, ambiente.IdPedido); var produtosAmbiente = Data.DAL.ProdutosPedidoDAO.Instance.GetByAmbiente(sessao, ambiente.IdAmbientePedido); var produtos = Data.DAL.ProdutoDAO.Instance.ObterProdutos(sessao, produtosAmbiente.Select(f => f.IdProd).Distinct()).ToList(); // Recupera os itens de rentabilidade dos produtos do pedido var itens = new LazyItemRentabilidadeEnumerable(produtosAmbiente.Select(produtoPedido => { // Carrega os produtos filhos var filhosComposicao = Data.DAL.ProdutosPedidoDAO.Instance.ObterFilhosComposicao(sessao, (int)produtoPedido.IdProdPed); if (!produtos.Any(f => f.IdProd == produtoPedido.IdProd)) { var produto = Data.DAL.ProdutoDAO.Instance.GetElementByPrimaryKey(sessao, produtoPedido.IdProd); if (produto != null) { produtos.Add(produto); } } return(ObterItemProdutoPedido(sessao, produtoPedido, prazoMedio, produtos, filhosComposicao)); })); return(ObterItemAmbientePedido(sessao, ambiente, prazoMedio, itens.OfType <IItemRentabilidade <Data.Model.ProdutosPedido> >())); }
/// <summary> /// Executa o calculo da rentabilidade para o ambiente do tipo principal. /// </summary> /// <param name="sessao"></param> /// <param name="instancia">Instância do ambiente.</param> /// <returns></returns> Data.ICalculoRentabilidadeResultado Data.ICalculadoraRentabilidade <Data.Model.AmbientePedido> .Calcular(GDA.GDASession sessao, Data.Model.AmbientePedido 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 = ObterItemAmbientePedido(sessao, instancia); return(Calcular(item)); }
/// <summary> /// Recupera o item com base no ambiente do pedido. /// </summary> /// <param name="referencia"></param> /// <returns></returns> IItemRentabilidade IProvedorItemRentabilidade <Data.Model.AmbientePedido> .ObterItem(GDA.GDASession sessao, Data.Model.AmbientePedido referencia) { return(ObterItemAmbientePedido(sessao, referencia)); }
/// <summary> /// Recupera o item com base no ambiente do pedido. /// </summary> /// <param name="referencia"></param> /// <returns></returns> IItemRentabilidade IProvedorItemRentabilidade <Data.Model.AmbientePedido> .ObterItem(Data.Model.AmbientePedido referencia) { using (var sessao = new GDA.GDASession()) return(ObterItemAmbientePedido(sessao, referencia)); }
/// <summary> /// Recupera o item de rentabilidade para o ambiente do pedido. /// </summary> /// <param name="sessao"></param> /// <param name="ambiente"></param> /// <returns></returns> private IItemRentabilidade ObterItemAmbientePedido( GDA.GDASession sessao, Data.Model.AmbientePedido ambiente, int prazoMedio, IEnumerable <IItemRentabilidade <Data.Model.ProdutosPedido> > produtos) { var registros = new Lazy <IList <Data.Model.AmbientePedidoRentabilidade> >( () => Data.DAL.AmbientePedidoRentabilidadeDAO.Instance.ObterPorAmbiente(sessao, ambiente.IdAmbientePedido)); 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) { // Cria o registro da rentabilidade do ambiente do pedido registro = new Data.Model.AmbientePedidoRentabilidade { IdAmbientePedido = (int)ambiente.IdAmbientePedido, IdRegistro = idRegistro, Tipo = (int)tipo, Valor = valor }; registros.Value.Add(registro); } else { registro.Valor = valor; } return(ConverterParaRegistroRentabilidade(registro)); }); var produtosAmbiente = produtos.Select(f => f.Proprietario); // Calcula os valores dos produtos do ambiente var valorProdutos = produtosAmbiente.Sum(f => f.Total + f.ValorBenef); var valorDescontoAtual = produtosAmbiente.Sum(f => f.ValorDescontoProd); // Calcula o total do ambiente var total = valorProdutos - (!Glass.Configuracoes.PedidoConfig.RatearDescontoProdutos ? valorDescontoAtual : 0); var percentualComissao = 0m; if (Glass.Configuracoes.PedidoConfig.Comissao.UsarComissaoPorProduto) { decimal percComissao = 0; if (total > 0) { foreach (var prod in produtosAmbiente) { percComissao += ((prod.Total * 100) / total) * (prod.PercComissao / 100); } } percentualComissao = percComissao / 100m; } return(new ItemRentabilidadeContainer <Data.Model.AmbientePedido, Data.Model.AmbientePedidoRentabilidade>( ProvedorIndicadoresFinanceiro, criarRegistro, ambiente, produtos, f => true, registros, ConverterParaRegistroRentabilidade) { Descricao = $"Ambiente {ambiente.Ambiente}", PrecoVendaSemIPI = total, // Não atualizar a configuração do sistema o total do produto não possui o valor do IPI PrazoMedio = prazoMedio, PercentualComissao = percentualComissao, PercentualRentabilidade = ambiente.PercentualRentabilidade / 100m, RentabilidadeFinanceira = ambiente.RentabilidadeFinanceira }); }