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