public void RegraTributoCalculoTest() { #region Cadastrar uma regra de CFOP ICFOPRegra cfop = new CFOPRegra(); cfop.Descricao = "Regra CFOP - Venda Consumidor Final"; cfop.CFOP = new CFOP().Find<ICFOP>(new Where() { Limit = 1 })[0]; cfop.Filtros.Add(new CFOPRegraFiltro() { TipoLancamento = Enuns.Faturamento.Lancamento.Tipo.CupomFiscal }); cfop.Save(); #endregion #region Cadastrar uma regra de CST ICSTCSOSN cstCodigo = new CSTCSOSN(); cstCodigo.Codigo = "00"; cstCodigo.Descricao = "Tributado Integralmente"; cstCodigo.Save(); ICSTCSOSNRegra cst = new CSTCSOSNRegra(); cst.Descricao = "Teste Regra"; cst.CSTCSOSNCodigos.Add(new CSTCSOSNRegraCodigo() { CSTCSOSNCodigo = new CSTCSOSN().Find<ICSTCSOSN>()[0] }); cst.Filtros.Add(new CSTCSOSNRegraFiltro() { CFOPRegra = cfop }); cst.Save(); #endregion #region Regra Tributo ITributoRegra t = new TributoRegra(); t.Descricao = "Regra - Venda Consumidor Final"; ITributo tributo = new Tributo(); tributo.TipoTributo = Enuns.Cadastro.Tributo.TipoTributo.ICMS; tributo.Descricao = "ICMS"; tributo.Aliquotas = new List<IAliquotaTributo> { new DCT.AliquotaTributo{Valor = 18.00} }; t.Aliquotas.Add(new TributoRegraAliquota() { Aliquota = tributo.Aliquotas[0] }); t.Filtros.Add(new TributoRegraFiltro() { CFOPRegra = cfop }); tributo.Save(); t.Save(); #endregion #region Filtro da regra de base de cálculo IRegraFiltro filtro = new RegraFiltro(); filtro.TipoTributo = Enuns.Cadastro.Tributo.TipoTributo.ICMS; #endregion #region Regra da base de cálculo OpenPOS.Model.Regra.BaseCalculo.IRegra regraBC = new OpenPOS.Data.Regra.BaseCalculo.Regra(); regraBC.Descricao = "Regra de base de cálculo"; regraBC.Formula = ""; regraBC.Filtros.Add(filtro); regraBC.Save(); #endregion //------------------------------------------------------------------------- // Como teste pode recuperar qualquer ECF //------------------------------------------------------------------------- IUnidade un = new Unidade().Find()[0] as IUnidade; IVendedor vendedor = new Vendedor().Find<IVendedor>(new Where { Limit = 1 })[0]; VendaCF v = new VendaCF(); ProdutoAcabadoTest acabadoTest = new ProdutoAcabadoTest(); acabadoTest.Gravar(); v.TabelaPreco = new TabelaPreco().Find<Model.Cadastro.TabelaPreco.ITabelaPreco>(new Where { Limit = new Limit(1) })[0]; v.DadoPessoa = new DadoPessoa { Cliente = new OpenPOS.Data.Cadastro.Pessoa.Cliente().Find<ICliente>(new Where() { Limit = 1 })[0] }; v.EmissorCupom = new OpenPOS.Data.Cadastro.Pessoa.Usuario().Find<IUsuario>(new Where() { Limit = 1 })[0]; // TODO: Voltar ao normal if (new AbreCaixa().Find<IAbreCaixa>(new Where() { { "cxa_AbreFechaCaixa.Status", 0 } }).Count > 0) v.AbreFechaCaixa = new AbreCaixa().Find<IAbreCaixa>(new Where() { { "cxa_AbreFechaCaixa.Status", 0 } })[0]; else { v.AbreFechaCaixa = new AbreCaixa().PermiteAbrir(Environment.MachineName, DateTime.Now); } v.Itens.Add(new OpenPOS.Data.Faturamento.Lancamento.Movimento.Item.VendaCF.Item { Quantidade = new Random().NextDouble(15, 50), ValorUnitarioBruto = new Random().NextDouble(15, 50), DescricaoNF = "Produto de teste um", SituacaoTributaria = SituacaoTributaria.ISSQN, ItemMovimentado = new Acabado(acabadoTest.GUID), Unidade = un, Vendedor = vendedor, Parent = v }); v.Itens.Add(new OpenPOS.Data.Faturamento.Lancamento.Movimento.Item.VendaCF.Item { Quantidade = new Random().NextDouble(15, 50), ValorUnitarioBruto = new Random().NextDouble(15, 50), DescricaoNF = "Produto de teste dois", SituacaoTributaria = SituacaoTributaria.Cancelamento, ItemMovimentado = new Acabado(acabadoTest.GUID), Unidade = un, Vendedor = vendedor, Parent = v }); v.Itens.Add(new OpenPOS.Data.Faturamento.Lancamento.Movimento.Item.VendaCF.Item { Quantidade = new Random().NextDouble(15, 50), ValorUnitarioBruto = new Random().NextDouble(15, 50), DescricaoNF = "Produto de teste tres", SituacaoTributaria = "18,00", ItemMovimentado = new Acabado(acabadoTest.GUID), Unidade = un, Vendedor = vendedor, Parent = v }); v.NumeroOrdemECF = 123; v.NumeroSerieECF = "212lklk1kl"; v.COO = 123458; GUID = v.SaveTemp(); v = new VendaCF(GUID); #region Regra Tributo Model.Faturamento.Lancamento.Movimento.Item.IItem item = v.Itens[0]; RegraCFOPResult resultCFOP = new RetornaCFOP(item).ExecutarRegra(new RegraCFOPFilter() { Tipo = v.Tipo }); RegraCSTCSOSNResult resultCST = new RetornaCSTCSOSN(item).ExecutarRegra(new RegraCSTCSOSNFilter() { CFOPRegra = resultCFOP.Regra }); RegraTributoResult resultTributo = new CalcularTributo(item).ExecutarRegra(new RegraTributoFilter() { CFOPRegra = resultCFOP.Regra, CSTCSOSNRegra = resultCST.Regra }); #endregion }
public void CalculaTributo(IItem item) { //Por enquanto consideraremos que o fato gerador será o faturamento do produto if(item.Tributos.Count > 0) return; Model.Faturamento.Lancamento.Movimento.Item.VendaCF.IItem itemCF = item as Model.Faturamento.Lancamento.Movimento.Item.VendaCF.IItem; // Retorna a CFOP RegraCFOPResult resultCFOP = new RetornaCFOP(item).ExecutarRegra(new RegraCFOPFilter() { Tipo = Tipo }); //Retorna a CST para o movimento RegraCSTCSOSNResult resultCST = new RetornaCSTCSOSN(item).ExecutarRegra(new RegraCSTCSOSNFilter() { CFOPRegra = resultCFOP.Regra }); item.CFOP = resultCFOP.Regra.CFOP; foreach (OpenPOS.Model.Regra.CSTCSOSN.ICSTCSOSNRegraCodigo cstCod in resultCST.Regra.CSTCSOSNCodigos) item.CSTCSOSNCodigos.Add(new Data.Faturamento.Lancamento.Movimento.Item.CSTCSOSN() { CSTCSOSNCod = cstCod.CSTCSOSNCodigo }); // efetua os calculos relativos aos tributos RegraTributoResult resultTributo = new CalcularTributo(item).ExecutarRegra(new RegraTributoFilter() { CFOPRegra = resultCFOP.Regra, CSTCSOSNRegra = resultCST.Regra, Pessoa = DadoPessoa.Cliente, GrupoItem = item.ItemMovimentado.GrupoItem, Item = item.ItemMovimentado, NCM = item.ItemMovimentado is Model.Cadastro.Item.Produto.IProduto ? ((Model.Cadastro.Item.Produto.IProduto)item.ItemMovimentado).NCM : new NCM() }); ITributoRegra regra = resultTributo.Regra as ITributoRegra; ICSTCSOSNRegra regraCST = resultCST.Regra as ICSTCSOSNRegra; if(regra.Aliquotas .Where(k => (k.Aliquota.Parent.TipoTributo == Enuns.Cadastro.Tributo.TipoTributo.ICMS || k.Aliquota.Parent.TipoTributo == Enuns.Cadastro.Tributo.TipoTributo.SIMPLESNACIONAL) && k.Aliquota.Valor == 0.0).Count() > 0) { ITributoRegraAliquota aliquota = regra.Aliquotas .Where(k => k.Aliquota.Parent.TipoTributo == Enuns.Cadastro.Tributo.TipoTributo.ICMS || k.Aliquota.Parent.TipoTributo == Enuns.Cadastro.Tributo.TipoTributo.SIMPLESNACIONAL) .First(); OpenPOS.Model.Cadastro.ICSTCSOSN codCST = regraCST.CSTCSOSNCodigos .Where(k => k.CSTCSOSNCodigo.TipoTributo == Enuns.Cadastro.Tributo.TipoTributo.ICMS || k.CSTCSOSNCodigo.TipoTributo == Enuns.Cadastro.Tributo.TipoTributo.SIMPLESNACIONAL) .First() .CSTCSOSNCodigo; // Efetuar ajustes referente a faturamento em ECF if(item is Model.Faturamento.Lancamento.Movimento.Item.VendaCF.IItem) { if(codCST.Codigo.Equals("40") || codCST.Codigo.Equals("102")) itemCF.SituacaoTributaria = "I"; else if(codCST.Codigo.Contains("41") || codCST.Codigo.Equals("400")) itemCF.SituacaoTributaria = "N"; else if(codCST.Codigo.Contains("60") || codCST.Codigo.Equals("500")) itemCF.SituacaoTributaria = "F"; } } else if (this is IVendaCF) { IList<Model.ECF.Cadastro.IAliquota> aliquotas = new Data.ECF.Cadastro.Aliquota().Find<IAliquota>(new Where() { { "ecf_Aliquota.GUIDTributoAliquota", regra.Aliquotas .Where(k => k.Aliquota.Parent.TipoTributo == Enuns.Cadastro.Tributo.TipoTributo.ICMS || k.Aliquota.Parent.TipoTributo == Enuns.Cadastro.Tributo.TipoTributo.SIMPLESNACIONAL ) .FirstOrDefault() .Aliquota.GUID.ToString() }, { "ecf_Aliquota.GUIDImpressora", Settings.ECF.ECFAtual != null ? Settings.ECF.ECFAtual.GUID.ToString() : GUID.Empty.ToString() } }).ToList(); if(aliquotas.Count > 0 && item is Model.Faturamento.Lancamento.Movimento.Item.VendaCF.IItem) itemCF.SituacaoTributaria = Unimake.Convert.ToString(aliquotas[0].Aliquota); } }