/// <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)); } }
/// <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)); } }