Exemple #1
0
        /// <summary>
        /// Recupera os itens de impostos com base nos produtos do orçamento.
        /// </summary>
        /// <param name="orcamento">Orçamento pai.</param>
        /// <param name="produtosOrcamento"></param>
        /// <param name="cliente"></param>
        /// <param name="loja"></param>
        /// <param name="produtos"></param>
        /// <param name="ambientes">Ambientes.</param>
        /// <returns></returns>
        private IEnumerable <IItemImposto> ObterItensImposto(
            Data.Model.Orcamento orcamento,
            IEnumerable <Data.Model.ProdutosOrcamento> produtosOrcamento,
            Global.Negocios.Entidades.Cliente cliente, Global.Negocios.Entidades.Loja loja,
            IEnumerable <Global.Negocios.Entidades.Produto> produtos,
            IEnumerable <Data.Model.ProdutosOrcamento> produtosAmbienteOrcamento)
        {
            var naturezasOperacao = LocalizadorNaturezaOperacao.Buscar(cliente, loja, produtos);
            var mvas = ProvedorMvaProdutoUf.ObterMvaPorProdutos(produtos, loja, null, cliente, true);

            var produtosNaturezaOperacao = new Dictionary <int, Tuple <Global.Negocios.Entidades.Produto, Entidades.NaturezaOperacao> >();
            var produtosMva = new Dictionary <int, float>();

            // Carrega a natureza de operação e o mva dos produtos
            using (var produtoEnumerator = produtos.GetEnumerator())
                using (var naturezasOperacaoEnumerator = naturezasOperacao.GetEnumerator())
                    using (var mvaEnumerator = mvas.GetEnumerator())
                        while (produtoEnumerator.MoveNext())
                        {
                            if (naturezasOperacaoEnumerator.MoveNext())
                            {
                                produtosNaturezaOperacao.Add(produtoEnumerator.Current.IdProd,
                                                             new Tuple <Global.Negocios.Entidades.Produto, Entidades.NaturezaOperacao>(
                                                                 produtoEnumerator.Current, naturezasOperacaoEnumerator.Current));
                            }

                            if (mvaEnumerator.MoveNext())
                            {
                                produtosMva.Add(produtoEnumerator.Current.IdProd, mvaEnumerator.Current);
                            }
                        }

            var totalOrcamentoSemDesconto = new Lazy <decimal>(() =>
            {
                return(Data.DAL.OrcamentoDAO.Instance.ObterTotalSemDesconto(null, (int)orcamento.IdOrcamento, orcamento.Total));
            });

            foreach (var produtoOrcamento in produtosOrcamento)
            {
                var descontoRateadoImpostos         = 0m;
                var descontoAmbienteRateadoImpostos = 0m;

                if (!Configuracoes.PedidoConfig.RatearDescontoProdutos)
                {
                    if (orcamento.Desconto != 0m)
                    {
                        if (orcamento.TipoDesconto == 1)
                        {
                            descontoRateadoImpostos += (produtoOrcamento.Total.GetValueOrDefault() + produtoOrcamento.ValorBenef) *
                                                       orcamento.Desconto / 100m;
                        }
                        else
                        {
                            descontoRateadoImpostos += (produtoOrcamento.Total.GetValueOrDefault() + produtoOrcamento.ValorBenef) *
                                                       (orcamento.Desconto / Math.Max(totalOrcamentoSemDesconto.Value, 1));
                        }
                    }

                    var produtoAmbienteOrcamento = produtoOrcamento.IdProdParent > 0 ?
                                                   produtosAmbienteOrcamento.FirstOrDefault(f => f.IdProd == produtoOrcamento.IdProdParent.Value) : null;

                    if (produtoAmbienteOrcamento?.IdProd > 0)
                    {
                        produtoAmbienteOrcamento.TotalProdutos = (produtosOrcamento?.Where(f => f.IdProdParent == produtoAmbienteOrcamento.IdProd)?.Sum(f => f.Total + f.ValorBenef)).GetValueOrDefault();
                    }

                    if (produtoAmbienteOrcamento?.Desconto > 0)
                    {
                        if (produtoAmbienteOrcamento.TipoDesconto == 1)
                        {
                            descontoAmbienteRateadoImpostos += (produtoOrcamento.Total.GetValueOrDefault() + produtoOrcamento.ValorBenef) *
                                                               (produtoAmbienteOrcamento.Desconto / 100m);
                        }
                        else
                        {
                            descontoAmbienteRateadoImpostos += (produtoOrcamento.Total.GetValueOrDefault() + produtoOrcamento.ValorBenef) *
                                                               (produtoAmbienteOrcamento.Desconto / (produtoAmbienteOrcamento.TotalProdutos + produtoAmbienteOrcamento.ValorDescontoAtualAmbiente));
                        }
                    }
                }

                var produtoNateruzaOperacao = produtosNaturezaOperacao[(int)produtoOrcamento.IdProduto];

                yield return(new ProdutoOrcamentoItemImposto(
                                 produtoOrcamento,
                                 loja, cliente,
                                 produtoNateruzaOperacao.Item2,
                                 produtoNateruzaOperacao.Item1,
                                 produtosMva[(int)produtoOrcamento.IdProduto],
                                 descontoRateadoImpostos,
                                 ProvedorCodValorFiscal));
            }
        }
Exemple #2
0
        /// <summary>
        /// Recupera os itens de impostos com base nos produtos do pedido.
        /// </summary>
        /// <param name="pedido">Pedido pai.</param>
        /// <param name="produtosPedido"></param>
        /// <param name="cliente"></param>
        /// <param name="loja"></param>
        /// <param name="produtos"></param>
        /// <param name="ambientes">Ambientes.</param>
        /// <returns></returns>
        private IEnumerable <IItemImposto> ObterItensImposto(
            Data.Model.Pedido pedido,
            IEnumerable <Data.Model.ProdutosPedido> produtosPedido,
            Global.Negocios.Entidades.Cliente cliente, Global.Negocios.Entidades.Loja loja,
            IEnumerable <Global.Negocios.Entidades.Produto> produtos,
            IEnumerable <Data.Model.AmbientePedido> ambientes)
        {
            var naturezasOperacao = LocalizadorNaturezaOperacao.Buscar(cliente, loja, produtos);
            var mvas = ProvedorMvaProdutoUf.ObterMvaPorProdutos(produtos, loja, null, cliente, true);

            var produtosNaturezaOperacao = new Dictionary <int, Tuple <Global.Negocios.Entidades.Produto, Entidades.NaturezaOperacao> >();
            var produtosMva = new Dictionary <int, float>();

            // Carrega a natureza de operação e o mva dos produtos
            using (var produtoEnumerator = produtos.GetEnumerator())
                using (var naturezasOperacaoEnumerator = naturezasOperacao.GetEnumerator())
                    using (var mvaEnumerator = mvas.GetEnumerator())
                        while (produtoEnumerator.MoveNext())
                        {
                            if (naturezasOperacaoEnumerator.MoveNext())
                            {
                                produtosNaturezaOperacao.Add(produtoEnumerator.Current.IdProd,
                                                             new Tuple <Global.Negocios.Entidades.Produto, Entidades.NaturezaOperacao>(
                                                                 produtoEnumerator.Current, naturezasOperacaoEnumerator.Current));
                            }

                            if (mvaEnumerator.MoveNext())
                            {
                                produtosMva.Add(produtoEnumerator.Current.IdProd, mvaEnumerator.Current);
                            }
                        }

            var totalPedidoSemDesconto = new Lazy <decimal>(() =>
            {
                var percFastDelivery = 1f;

                if (Configuracoes.PedidoConfig.Pedido_FastDelivery.FastDelivery && pedido.FastDelivery)
                {
                    percFastDelivery = 1 + (Configuracoes.PedidoConfig.Pedido_FastDelivery.TaxaFastDelivery / 100f);
                }

                return(Data.DAL.PedidoDAO.Instance.GetTotalSemDesconto(null, pedido.IdPedido, (pedido.Total / (decimal)percFastDelivery)));
            });

            foreach (var produtoPedido in produtosPedido)
            {
                var descontoRateadoImpostos = 0m;

                if (!Configuracoes.PedidoConfig.RatearDescontoProdutos)
                {
                    if (pedido.Desconto != 0m)
                    {
                        descontoRateadoImpostos =
                            (pedido.TipoDesconto == 1 ?
                             pedido.Desconto / 100m :
                             pedido.Desconto / Math.Max(totalPedidoSemDesconto.Value, 1)) *
                            (produtoPedido.Total + produtoPedido.ValorBenef);
                    }

                    var ambiente = produtoPedido.IdAmbientePedido.HasValue ?
                                   ambientes.FirstOrDefault(f => f.IdAmbientePedido == produtoPedido.IdAmbientePedido.Value) : null;

                    if (ambiente != null && ambiente.Desconto > 0)
                    {
                        descontoRateadoImpostos +=
                            (ambiente.TipoDesconto == 1 ?
                             ambiente.Desconto / 100m :
                             ambiente.Desconto / (ambiente.TotalProdutos + ambiente.ValorDescontoAtual)) *
                            (produtoPedido.Total + produtoPedido.ValorBenef);
                    }
                }

                var produtoNateruzaOperacao = produtosNaturezaOperacao[(int)produtoPedido.IdProd];

                yield return(new ProdutoPedidoItemImposto(
                                 produtoPedido,
                                 loja, cliente,
                                 produtoNateruzaOperacao.Item2,
                                 produtoNateruzaOperacao.Item1,
                                 produtosMva[(int)produtoPedido.IdProd],
                                 descontoRateadoImpostos,
                                 ProvedorCodValorFiscal));
            }
        }