Ejemplo n.º 1
0
        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
        }
Ejemplo n.º 2
0
        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);
            }
        }