Exemplo n.º 1
0
        /// <summary>
        /// Localiza as naturezas de operação para os produtos informados,
        /// com base no cliente e loja.
        /// </summary>
        /// <param name="cliente"></param>
        /// <param name="loja"></param>
        /// <param name="produtos"></param>
        /// <returns>Relação da natureza de operação para cada produto.</returns>
        public IEnumerable <Entidades.NaturezaOperacao> Buscar(
            Global.Negocios.Entidades.Cliente cliente, Global.Negocios.Entidades.Loja loja,
            IEnumerable <Global.Negocios.Entidades.Produto> produtos)
        {
            var idsProduto = produtos.Select(f => f.IdProd);
            var produtosNaturezaOperacao = new Dictionary <int, int?>();

            using (var session = new GDA.GDASession())
            {
                // Carrega a relação dos produtos com a natureza de operação associada
                foreach (var i in idsProduto.Distinct()
                         .Select(idProd => new
                {
                    IdProd = idProd,
                    IdNaturezaOperacao = (int?)Data.DAL.RegraNaturezaOperacaoDAO.Instance
                                         .BuscaNaturezaOperacao(session, (uint?)loja?.IdLoja, (uint?)cliente?.IdCli, idProd)
                }))
                {
                    produtosNaturezaOperacao.Add(i.IdProd, i.IdNaturezaOperacao);
                }
            }

            IEnumerable <Entidades.NaturezaOperacao> naturezasOperacao;

            var idsNaturezaOperacao = produtosNaturezaOperacao
                                      .Where(f => f.Value.HasValue)
                                      .Select(f => f.Value.Value)
                                      .Distinct()
                                      .ToList();

            if (idsNaturezaOperacao.Any())
            {
                // Carrega os dados completos das naturezas de operação encontradas
                naturezasOperacao = SourceContext.Instance.CreateQuery()
                                    .From <Data.Model.NaturezaOperacao>()
                                    .Where($"IdNaturezaOperacao IN ({string.Join(",", idsNaturezaOperacao)})")
                                    .ProcessLazyResult <Entidades.NaturezaOperacao>()
                                    .ToList();
            }

            else
            {
                naturezasOperacao = new Entidades.NaturezaOperacao[0];
            }

            foreach (var idProd in idsProduto)
            {
                var idNaturezaOperacao = produtosNaturezaOperacao[idProd];
                if (idNaturezaOperacao.HasValue)
                {
                    yield return(naturezasOperacao.FirstOrDefault(f => f.IdNaturezaOperacao == idNaturezaOperacao.Value));
                }
                else
                {
                    yield return(null);
                }
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Salva os dados da natureza de operação.
        /// </summary>
        /// <param name="naturezaOperacao"></param>
        /// <returns></returns>
        public Colosoft.Business.SaveResult SalvarNaturezaOperacao(Entidades.NaturezaOperacao naturezaOperacao)
        {
            naturezaOperacao.Require("naturezaOperacao").NotNull();

            using (var session = SourceContext.Instance.CreateSession())
            {
                var resultado = naturezaOperacao.Save(session);

                if (!resultado)
                {
                    return(resultado);
                }

                return(session.Execute(false).ToSaveResult());
            }
        }
Exemplo n.º 3
0
 /// <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="codValorFiscal"></param>
 public ProdutoPedidoItemImposto(
     Data.Model.ProdutosPedido 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;
 }
Exemplo n.º 4
0
        /// <summary>
        /// Valida o código interno da natureza de operação.
        /// </summary>
        /// <param name="naturezaOperacao"></param>
        /// <returns></returns>
        IMessageFormattable IValidadorNaturezaOperacao.ValidaCodigoInterno(Entidades.NaturezaOperacao naturezaOperacao)
        {
            var resultado = new List <IMessageFormattable>();

            if (string.IsNullOrEmpty(naturezaOperacao.CodInterno))
            {
                var item = SourceContext.Instance.CreateQuery()
                           .From <Data.Model.NaturezaOperacao>("n")
                           .LeftJoin <Data.Model.Cfop>("n.IdCfop = c.IdCfop", "c")
                           .Select("c.CodInterno")
                           .Where("n.IdCfop=?idCfop AND (n.CodInterno IS NULL OR n.CodInterno = '') AND n.IdNaturezaOperacao<>?idNat")
                           .Add("?idCfop", naturezaOperacao.IdCfop)
                           .Add("?idNat", naturezaOperacao.IdNaturezaOperacao)
                           .Execute()
                           .Select(f => f.GetString(0))
                           .FirstOrDefault();

                if (item != null)
                {
                    return(string.Format("Já foi cadastrada a natureza de operação padrão para o CFOP {0}.", item).GetFormatter());
                }
            }
            else
            {
                var item = SourceContext.Instance.CreateQuery()
                           .From <Data.Model.NaturezaOperacao>("n")
                           .LeftJoin <Data.Model.Cfop>("n.IdCfop = c.IdCfop", "c")
                           .Select("c.CodInterno")
                           .Where("n.IdCfop=?idCfop AND CodInterno=?codInterno AND IdNaturezaOperacao<>?idNat")
                           .Add("?idCfop", naturezaOperacao.IdCfop)
                           .Add("?codInterno", (!string.IsNullOrEmpty(naturezaOperacao.CodInterno) ? naturezaOperacao.CodInterno.Trim() : naturezaOperacao.CodInterno))
                           .Add("?idNat", naturezaOperacao.IdNaturezaOperacao)
                           .Execute()
                           .Select(f => f.GetString(0))
                           .FirstOrDefault();

                if (item != null)
                {
                    return(string.Format("O código '{0}' já está cadastrado para o CFOP {1}.", naturezaOperacao.CodInterno, item).GetFormatter());
                }
            }

            return(null);
        }
Exemplo n.º 5
0
        /// <summary>
        /// Recupera os itens de impostos com base nos produtos da nota fiscal.
        /// </summary>
        /// <param name="notaFiscal"></param>
        /// <param name="produtosNf"></param>
        /// <param name="produtos"></param>
        /// <returns></returns>
        private IEnumerable <IItemImposto> ObterItensImposto(
            Data.Model.NotaFiscal notaFiscal,
            IEnumerable <Data.Model.ProdutosNf> produtosNf,
            IEnumerable <Global.Negocios.Entidades.Produto> produtos)
        {
            // Carrega as naturezas de operações que serão usadas no cálculo
            var idsNaturezaOperacao = produtosNf
                                      .Where(f => f.IdNaturezaOperacao.HasValue)
                                      .Select(f => (int)f.IdNaturezaOperacao.Value);

            if (notaFiscal.IdNaturezaOperacao.HasValue)
            {
                idsNaturezaOperacao = idsNaturezaOperacao.Concat(new[] { (int)notaFiscal.IdNaturezaOperacao.Value });
            }

            var ids = string.Join(",", idsNaturezaOperacao.Distinct());

            IEnumerable <Entidades.NaturezaOperacao> naturezasOperacao = null;

            if (!string.IsNullOrEmpty(ids))
            {
                naturezasOperacao = SourceContext.Instance.CreateQuery()
                                    .From <Data.Model.NaturezaOperacao>()
                                    .Where($"IdNaturezaOperacao IN ({ids})")
                                    .ProcessLazyResult <Entidades.NaturezaOperacao>()
                                    .ToList();
            }
            else
            {
                naturezasOperacao = new Entidades.NaturezaOperacao[0];
            }

            foreach (var produtoNf in produtosNf)
            {
                var idNaturezaOperacao = produtoNf.IdNaturezaOperacao ?? notaFiscal.IdNaturezaOperacao;

                var naturezaOperacao = idNaturezaOperacao.HasValue ?
                                       naturezasOperacao.FirstOrDefault(f => f.IdNaturezaOperacao == idNaturezaOperacao.Value) : null;

                yield return(new ProdutoNfItemImposto(produtoNf, naturezaOperacao,
                                                      produtos.FirstOrDefault(f => f.IdProd == (int)produtoNf.IdProd)));
            }
        }
Exemplo n.º 6
0
        /// <summary>
        /// Apaga os dados da natureza de operação.
        /// </summary>
        /// <param name="naturezaOperacao">Instancia que será apagada.</param>
        /// <returns></returns>
        public Colosoft.Business.DeleteResult ApagarNaturezaOperacao(Entidades.NaturezaOperacao naturezaOperacao)
        {
            naturezaOperacao.Require("naturezaOperacao").NotNull();

            if (string.IsNullOrEmpty(naturezaOperacao.CodInterno))
            {
                return(new Colosoft.Business.DeleteResult(false,
                                                          "Não é possível excluir a natureza de operação padrão.".GetFormatter()));
            }

            using (var session = SourceContext.Instance.CreateSession())
            {
                var resultado = naturezaOperacao.Delete(session);

                if (!resultado)
                {
                    return(resultado);
                }

                return(session.Execute(false).ToDeleteResult());
            }
        }
Exemplo n.º 7
0
        /// <summary>
        /// Valida a existencia da natureza de operação.
        /// </summary>
        /// <param name="naturezaOperacao"></param>
        /// <returns></returns>
        IMessageFormattable[] IValidadorNaturezaOperacao.ValidaExistencia(Entidades.NaturezaOperacao naturezaOperacao)
        {
            var resultado = new List <IMessageFormattable>();
            var consultas = SourceContext.Instance.CreateMultiQuery()
                            .Add(SourceContext.Instance.CreateQuery()
                                 .From <Data.Model.NotaFiscal>()
                                 .Where("IdNaturezaOperacao=?id")
                                 .Add("?id", naturezaOperacao.IdNaturezaOperacao)
                                 .Count(),
                                 (sender, query, result) =>
            {
                if (result.Select(f => f.GetInt32(0)).FirstOrDefault() > 0)
                {
                    resultado.Add("Ela é utilizada em pelo menos uma nota fiscal.".GetFormatter());
                }
            })
                            .Add(SourceContext.Instance.CreateQuery()
                                 .From <Data.Model.ProdutosNf>()
                                 .Where("IdNaturezaOperacao=?id")
                                 .Add("?id", naturezaOperacao.IdNaturezaOperacao)
                                 .Count(),
                                 (sender, query, result) =>
            {
                if (result.Select(f => f.GetInt32(0)).FirstOrDefault() > 0)
                {
                    resultado.Add("Ela é utilizada em pelo menos um produto de nota fiscal.".GetFormatter());
                }
            })
                            .Add(SourceContext.Instance.CreateQuery()
                                 .From <Data.Model.Cte.ConhecimentoTransporte>()
                                 .Where("IdNaturezaOperacao=?id")
                                 .Add("?id", naturezaOperacao.IdNaturezaOperacao)
                                 .Count(),
                                 (sender, query, result) =>
            {
                if (result.Select(f => f.GetInt32(0)).FirstOrDefault() > 0)
                {
                    resultado.Add("Ela é utilizada em pelo menos um conhecimento de transporte.".GetFormatter());
                }
            })
                            .Add(SourceContext.Instance.CreateQuery()
                                 .From <Data.Model.RegraNaturezaOperacao>()
                                 .Where(@"IdNaturezaOperacaoRevStInter = ?id OR
                                 IdNaturezaOperacaoProdStIntra = ?id OR
                                 IdNaturezaOperacaoProdStInter = ?id OR
                                 IdNaturezaOperacaoRevInter = ?id OR
                                 IdNaturezaOperacaoProdInter = ?id OR
                                 IdNaturezaOperacaoRevIntra = ?id OR
                                 IdNaturezaOperacaoRevStIntra = ?id OR
                                 IdNaturezaOperacaoProdIntra = ?id; ")
                                 .Add("?id", naturezaOperacao.IdNaturezaOperacao)
                                 .Count(),
                                 (sender, query, result) =>
            {
                if (result.Select(f => f.GetInt32(0)).FirstOrDefault() > 0)
                {
                    resultado.Add("Ela é utilizada em pelo menos uma regra de natureza de operação.".GetFormatter());
                }
            });

            consultas.Execute();
            return(resultado.ToArray());
        }