Skip to content

Commit

Permalink
Ajustada biblioteca DFe para o ICMS Basico aceitar o ICMS da CST 61 n…
Browse files Browse the repository at this point in the history
…o Simples Nacional (#1489)

* Adicionado campos da CST 61 no ICMS Geral

* Implementado geração da CST 61 para Simples Nacional no ICMSGeral e criado testes unitários

* Refatorados testes unitários

* Ajustes de nomes e nomenclaturas dos testes unitários
  • Loading branch information
AgnaldoSilva0 authored Feb 9, 2024
1 parent 96a2ee6 commit 519f1fa
Show file tree
Hide file tree
Showing 3 changed files with 215 additions and 26 deletions.
49 changes: 49 additions & 0 deletions DFe.Testes/Impostos/DadosDeTeste/ICMSGeralDadosDeTeste.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
using NFe.Classes.Informacoes.Detalhe.Tributacao.Estadual.Tipos;
using NFe.Classes.Informacoes.Emitente;
using System.Collections.Generic;

namespace DFe.Testes.Impostos.DadosDeTeste
{
public class ICMSGeralDadosDeTeste
{
public static IEnumerable<object[]> ObterRegimesTributariosParaCst61()
{
yield return new object[] { CRT.RegimeNormal, OrigemMercadoria.OmNacional, 1000, 18, 180 };
yield return new object[] { CRT.RegimeNormal, OrigemMercadoria.OmEstrangeiraImportacaoDireta, 1001, 180, 18 };
yield return new object[] { CRT.RegimeNormal, OrigemMercadoria.OmEstrangeiraAdquiridaBrasil, 1000, 180, 10 };
yield return new object[] { CRT.RegimeNormal, OrigemMercadoria.OmNacionalConteudoImportacaoSuperior40, 1200, 18, 180 };
yield return new object[] { CRT.RegimeNormal, OrigemMercadoria.OmNacionalProcessosBasicos, 1100, 18, 180 };
yield return new object[] { CRT.RegimeNormal, OrigemMercadoria.OmNacionalConteudoImportacaoInferiorIgual40, 1010, 12, 10 };
yield return new object[] { CRT.RegimeNormal, OrigemMercadoria.OmEstrangeiraImportacaoDiretaSemSimilar, 101, 17, 11 };
yield return new object[] { CRT.RegimeNormal, OrigemMercadoria.OmEstrangeiraAdquiridaBrasilSemSimilar, 105, 19, 15 };
yield return new object[] { CRT.RegimeNormal, OrigemMercadoria.OmNacionalConteudoImportacaoSuperior70, 103, 18, 15 };

yield return new object[] { CRT.SimplesNacional, OrigemMercadoria.OmNacional, 1000, 18, 180 };
yield return new object[] { CRT.SimplesNacional, OrigemMercadoria.OmEstrangeiraImportacaoDireta, 1001, 180, 18 };
yield return new object[] { CRT.SimplesNacional, OrigemMercadoria.OmEstrangeiraAdquiridaBrasil, 1000, 180, 10 };
yield return new object[] { CRT.SimplesNacional, OrigemMercadoria.OmNacionalConteudoImportacaoSuperior40, 1200, 18, 180 };
yield return new object[] { CRT.SimplesNacional, OrigemMercadoria.OmNacionalProcessosBasicos, 1100, 18, 180 };
yield return new object[] { CRT.SimplesNacional, OrigemMercadoria.OmNacionalConteudoImportacaoInferiorIgual40, 1010, 12, 10 };
yield return new object[] { CRT.SimplesNacional, OrigemMercadoria.OmEstrangeiraImportacaoDiretaSemSimilar, 101, 17, 11 };
yield return new object[] { CRT.SimplesNacional, OrigemMercadoria.OmEstrangeiraAdquiridaBrasilSemSimilar, 105, 19, 15 };
yield return new object[] { CRT.SimplesNacional, OrigemMercadoria.OmNacionalConteudoImportacaoSuperior70, 103, 18, 15 };

yield return new object[] { CRT.SimplesNacionalExcessoSublimite, OrigemMercadoria.OmNacional, 1000, 18, 180 };
yield return new object[] { CRT.SimplesNacionalExcessoSublimite, OrigemMercadoria.OmEstrangeiraImportacaoDireta, 1001, 180, 18 };
yield return new object[] { CRT.SimplesNacionalExcessoSublimite, OrigemMercadoria.OmEstrangeiraAdquiridaBrasil, 1000, 180, 10 };
yield return new object[] { CRT.SimplesNacionalExcessoSublimite, OrigemMercadoria.OmNacionalConteudoImportacaoSuperior40, 1200, 18, 180 };
yield return new object[] { CRT.SimplesNacionalExcessoSublimite, OrigemMercadoria.OmNacionalProcessosBasicos, 1100, 18, 180 };
yield return new object[] { CRT.SimplesNacionalExcessoSublimite, OrigemMercadoria.OmNacionalConteudoImportacaoInferiorIgual40, 1010, 12, 10 };
yield return new object[] { CRT.SimplesNacionalExcessoSublimite, OrigemMercadoria.OmEstrangeiraImportacaoDiretaSemSimilar, 101, 17, 11 };
yield return new object[] { CRT.SimplesNacionalExcessoSublimite, OrigemMercadoria.OmEstrangeiraAdquiridaBrasilSemSimilar, 105, 19, 15 };
yield return new object[] { CRT.SimplesNacionalExcessoSublimite, OrigemMercadoria.OmNacionalConteudoImportacaoSuperior70, 103, 18, 15 };
}

public static IEnumerable<object[]> ObterRegimesTributarios()
{
yield return new object[] { CRT.SimplesNacional };
yield return new object[] { CRT.SimplesNacionalExcessoSublimite };
yield return new object[] { CRT.RegimeNormal };
}
}
}
116 changes: 115 additions & 1 deletion DFe.Testes/Impostos/ICMSGeral_Teste.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
using System;
using System.ComponentModel;
using DFe.Testes.Impostos.DadosDeTeste;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using NFe.Classes.Informacoes.Detalhe.Tributacao.Estadual;
using NFe.Classes.Informacoes.Detalhe.Tributacao.Estadual.Tipos;
Expand Down Expand Up @@ -147,9 +149,121 @@ public void ObterICMSBasico_CSOSN101_Teste(CRT crt, OrigemMercadoria origem, obj
Assert.AreEqual(Convert.ToDecimal(pCredSN), tagICMSGerada.pCredSN);
Assert.AreEqual(Convert.ToDecimal(vCredICMSSN), tagICMSGerada.vCredICMSSN);
}

//TODO: Falta criar os métodos de testes dos demais CSOSNs do ICMS (CTR = Simples)

#endregion

#region CST 61 - Tributação Monofásica Sobre os Combustíveis

[TestMethod]
[DynamicData(nameof(ICMSGeralDadosDeTeste.ObterRegimesTributariosParaCst61), typeof(ICMSGeralDadosDeTeste), DynamicDataSourceType.Method)]
[DisplayName("Dado CST 61 quando obter ICMS então ICMS deve conter campos de tributação monofásica sobre combustíveis preenchidos")]
public void DadoCST61QuandoObterICMSEntaoICMSDeveConterCamposDeTributacaoMonofasicaSobreCombustiveisPreenchidos(CRT crt, OrigemMercadoria origem, object vICMSMonoRet, object adRemICMSRet, object qBCMonoRet)
{
/** 1) Preparação **/
var icmsGeral = new ICMSGeral()
{
orig = origem,
CST = Csticms.Cst61,
vICMSMonoRet = Convert.ToDecimal(vICMSMonoRet),
adRemICMSRet = Convert.ToDecimal(adRemICMSRet),
qBCMonoRet = Convert.ToDecimal(qBCMonoRet)
};

/** 2) Execução **/
var tagGerada = icmsGeral.ObterICMSBasico(crt);

/** 2) Veerificação **/
/** 2.1) Garante que o tipo da classe gerada foi correta**/
Assert.IsInstanceOfType(tagGerada, typeof(ICMS61));

/** 2.2) Garante que o conteúdo repassado para as propriedades estejam corretos **/
var tagICMSGerada = (tagGerada as ICMS61);
Assert.AreEqual(origem, tagICMSGerada.orig);
Assert.AreEqual(Csticms.Cst61, tagICMSGerada.CST);
Assert.AreEqual(Convert.ToDecimal(vICMSMonoRet), tagICMSGerada.vICMSMonoRet);
Assert.AreEqual(Convert.ToDecimal(adRemICMSRet), tagICMSGerada.adRemICMSRet);
Assert.AreEqual(Convert.ToDecimal(qBCMonoRet), tagICMSGerada.qBCMonoRet);
}

[TestMethod]
[DynamicData(nameof(ICMSGeralDadosDeTeste.ObterRegimesTributariosParaCst61), typeof(ICMSGeralDadosDeTeste), DynamicDataSourceType.Method)]
[DisplayName("Dado CST 61 quando obter ICMS então ICMS não deve ter campos que não sejam da tributação monofásica sobre combustíveis preenchidos")]
public void DadoCST61QuandoObterIcmsEntaoIcmsNaoDeveTerCamposQueNaoSejamDaTributacaoMonofasicaSobreCombustiveisPreenchidos(CRT crt, OrigemMercadoria origem, object vICMSMonoRet, object adRemICMSRet, object qBCMonoRet)
{
/** 1) Preparação **/
var icmsGeral = new ICMSGeral()
{
orig = origem,
CST = Csticms.Cst61,
vICMSMonoRet = Convert.ToDecimal(vICMSMonoRet),
adRemICMSRet = Convert.ToDecimal(adRemICMSRet),
qBCMonoRet = Convert.ToDecimal(qBCMonoRet)
};

/** 2) Execução **/
icmsGeral.ObterICMSBasico(crt);

/** 2) Verificação **/
VerificarSeNaoFoiPreenchidaOutroCampoQueNaoSejaCamposDaCst61(icmsGeral);
}

private void VerificarSeNaoFoiPreenchidaOutroCampoQueNaoSejaCamposDaCst61(ICMSGeral icmsGeral)
{
Assert.AreEqual(icmsGeral.pCredSN, 0);
Assert.AreEqual(icmsGeral.vCredICMSSN, 0);
Assert.AreEqual(icmsGeral.vBC, 0);
Assert.AreEqual(icmsGeral.pICMS, 0);
Assert.AreEqual(icmsGeral.vICMS, 0);
Assert.IsNull(icmsGeral.pFCP);
Assert.IsNull(icmsGeral.vFCP);
Assert.IsNull(icmsGeral.vBCFCP);
}

[TestMethod]
[DynamicData(nameof(ICMSGeralDadosDeTeste.ObterRegimesTributarios), typeof(ICMSGeralDadosDeTeste), DynamicDataSourceType.Method)]
[DisplayName("Dado CST 61 quando gerar ICMS então ICMS deve ser do tipo ICMS 61 e nenhum outro")]
public void DadoCST61QuandoGerarICMSEntaoICMSDeveSerDoTipoICMS61ENenhumOutro(CRT crt)
{
/** 1) Preparação **/
var icmsGeral = new ICMSGeral()
{
CST = Csticms.Cst61
};

/** 2) Execução **/
var tagGerada = icmsGeral.ObterICMSBasico(crt);

/** 2) Verificação **/
VerificarSeFoiGeradoIcms61(tagGerada);
}

private void VerificarSeFoiGeradoIcms61(ICMSBasico tagGerada)
{
Assert.IsInstanceOfType(tagGerada, typeof(ICMS61));

Assert.IsNotInstanceOfType(tagGerada, typeof(ICMS00));
Assert.IsNotInstanceOfType(tagGerada, typeof(ICMS02));
Assert.IsNotInstanceOfType(tagGerada, typeof(ICMS10));
Assert.IsNotInstanceOfType(tagGerada, typeof(ICMS15));
Assert.IsNotInstanceOfType(tagGerada, typeof(ICMS20));
Assert.IsNotInstanceOfType(tagGerada, typeof(ICMS30));
Assert.IsNotInstanceOfType(tagGerada, typeof(ICMS40));
Assert.IsNotInstanceOfType(tagGerada, typeof(ICMS51));
Assert.IsNotInstanceOfType(tagGerada, typeof(ICMS53));
Assert.IsNotInstanceOfType(tagGerada, typeof(ICMS51));
Assert.IsNotInstanceOfType(tagGerada, typeof(ICMS60));
Assert.IsNotInstanceOfType(tagGerada, typeof(ICMS70));
Assert.IsNotInstanceOfType(tagGerada, typeof(ICMS90));

Assert.IsNotInstanceOfType(tagGerada, typeof(ICMSSN101));
Assert.IsNotInstanceOfType(tagGerada, typeof(ICMSSN102));
Assert.IsNotInstanceOfType(tagGerada, typeof(ICMSSN201));
Assert.IsNotInstanceOfType(tagGerada, typeof(ICMSSN202));
Assert.IsNotInstanceOfType(tagGerada, typeof(ICMSSN500));
Assert.IsNotInstanceOfType(tagGerada, typeof(ICMSSN900));
}
#endregion
}
}
76 changes: 51 additions & 25 deletions NFe.Utils/Tributacao/Estadual/ICMSGeral.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,37 +66,49 @@ public ICMSGeral()
/// <returns></returns>
public ICMSBasico ObterICMSBasico(CRT crt)
{
ICMSBasico icmsBasico;
ICMSBasico icmsBasico = null;

switch (crt)
{
case CRT.SimplesNacional:
switch (CSOSN)
switch (CST)
{
case Csosnicms.Csosn101:
icmsBasico = new ICMSSN101();
break;
case Csosnicms.Csosn102:
case Csosnicms.Csosn103:
case Csosnicms.Csosn300:
case Csosnicms.Csosn400:
icmsBasico = new ICMSSN102();
break;
case Csosnicms.Csosn201:
icmsBasico = new ICMSSN201();
break;
case Csosnicms.Csosn202:
case Csosnicms.Csosn203:
icmsBasico = new ICMSSN202();
break;
case Csosnicms.Csosn500:
icmsBasico = new ICMSSN500();
break;
case Csosnicms.Csosn900:
icmsBasico = new ICMSSN900();
case Csticms.Cst61:
icmsBasico = new ICMS61();
break;
default:
throw new ArgumentOutOfRangeException();
}

var ehCst61 = icmsBasico != null;

if (!ehCst61)
{
switch (CSOSN)
{
case Csosnicms.Csosn101:
icmsBasico = new ICMSSN101();
break;
case Csosnicms.Csosn102:
case Csosnicms.Csosn103:
case Csosnicms.Csosn300:
case Csosnicms.Csosn400:
icmsBasico = new ICMSSN102();
break;
case Csosnicms.Csosn201:
icmsBasico = new ICMSSN201();
break;
case Csosnicms.Csosn202:
case Csosnicms.Csosn203:
icmsBasico = new ICMSSN202();
break;
case Csosnicms.Csosn500:
icmsBasico = new ICMSSN500();
break;
case Csosnicms.Csosn900:
icmsBasico = new ICMSSN900();
break;
default:
throw new ArgumentOutOfRangeException();
}
}
break;
case CRT.SimplesNacionalExcessoSublimite:
Expand Down Expand Up @@ -385,5 +397,19 @@ public ICMSBasico ObterICMSBasico(CRT crt)
public decimal? vICMSEfet { get; set; }
#endregion

/// <summary>
/// Quantidade tributada retida anteriormente
/// </summary>
public decimal? qBCMonoRet { get; set; }

/// <summary>
/// Alíquota ad rem do imposto retido anteriormente
/// </summary>
public decimal? adRemICMSRet { get; set; }

/// <summary>
/// Valor do ICMS retido anteriormente
/// </summary>
public decimal? vICMSMonoRet { get; set; }
}
}

0 comments on commit 519f1fa

Please sign in to comment.