Example #1
0
        /// <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));
        }
Example #2
0
        /// <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
                       }
            };
        }