Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ajustada biblioteca DFe para o ICMS Basico aceitar o ICMS da CST 61 no Simples Nacional #1489

Merged
merged 4 commits into from
Feb 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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; }
}
}
Loading