Skip to content

Commit

Permalink
Merge pull request #35 from esistemsistemas/master_fork_icms_efetivo
Browse files Browse the repository at this point in the history
Cálculo ICMS Efetivo
  • Loading branch information
AutomacaoNet authored Mar 2, 2024
2 parents 6bdf4b2 + b89549f commit 7574afb
Show file tree
Hide file tree
Showing 12 changed files with 293 additions and 5 deletions.
4 changes: 4 additions & 0 deletions src/MotorTributarioNet/Facade/FacadeCalculadoraTributacao.cs
Original file line number Diff line number Diff line change
Expand Up @@ -100,5 +100,9 @@ public IResultadoCalculoIcmsMonofasico CalculaIcmsMonofasico()
{
return new TributacaoIcmsMonofasico(_tributavel, _tipoDesconto).Calcula();
}
public IResultadoCalculoIcmsEfetivo CalculaIcmsEfetivo()
{
return new TributacaoIcmsEfetivo(_tributavel, _tipoDesconto).Calcula();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
// Projeto: Motor Tributario
// Biblioteca C# para Cálculos Tributários Do Brasil
// NF-e, NFC-e, CT-e, SAT-Fiscal
//
// Esta biblioteca é software livre; você pode redistribuí-la e/ou modificá-la
// sob os termos da Licença Pública Geral Menor do GNU conforme publicada pela
// Free Software Foundation; tanto a versão 2.1 da Licença, ou (a seu critério)
// qualquer versão posterior.
//
// Esta biblioteca é distribuída na expectativa de que seja útil, porém, SEM
// NENHUMA GARANTIA; nem mesmo a garantia implícita de COMERCIABILIDADE OU
// ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral Menor
// do GNU para mais detalhes. (Arquivo LICENÇA.TXT ou LICENSE.TXT)
//
// Você deve ter recebido uma cópia da Licença Pública Geral Menor do GNU junto
// com esta biblioteca; se não, escreva para a Free Software Foundation, Inc.,
// no endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
// Você também pode obter uma copia da licença em:
// https://github.com/AutomacaoNet/MotorTributarioNet/blob/master/LICENSE

using MotorTributarioNet.Flags;
using MotorTributarioNet.Impostos.CalulosDeBC.Base;

namespace MotorTributarioNet.Impostos.CalulosDeBC
{
public class CalculaBaseCalculoIcmsEfetivo : CalculaBaseCalculoBase
{
private readonly ITributavel _tributavel;
private readonly TipoDesconto _tipoDesconto;

public CalculaBaseCalculoIcmsEfetivo(ITributavel tributavel, TipoDesconto tipoDesconto) : base(tributavel)
{
_tributavel = tributavel;
_tipoDesconto = tipoDesconto;
}

public decimal CalculaBaseCalculo()
{
var baseCalculo = _tributavel.PercentualIcmsEfetivo > 0m ? CalculaBaseDeCalculo() + _tributavel.ValorIpi : 0m;

return _tipoDesconto == TipoDesconto.Condincional ? CalculaIcmsComDescontoCondicional(baseCalculo) : CalculaIcmsComDescontoIncondicional(baseCalculo);
}

private decimal CalculaIcmsComDescontoIncondicional(decimal baseCalculoInicial)
{
var baseCalculo = baseCalculoInicial - _tributavel.Desconto;

baseCalculo = baseCalculo - baseCalculo * _tributavel.PercentualReducaoIcmsEfetivo / 100;

return baseCalculo;
}

private decimal CalculaIcmsComDescontoCondicional(decimal baseCalculoInicial)
{
var baseCalulo = baseCalculoInicial + _tributavel.Desconto;

baseCalulo = baseCalulo - baseCalulo * _tributavel.PercentualReducaoIcmsEfetivo / 100;

return baseCalulo;
}
}
}
19 changes: 17 additions & 2 deletions src/MotorTributarioNet/Impostos/Csosns/Csosn500.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

using MotorTributarioNet.Flags;
using MotorTributarioNet.Impostos.Csosns.Base;
using MotorTributarioNet.Facade;

namespace MotorTributarioNet.Impostos.Csosns
{
Expand All @@ -33,10 +34,24 @@ public Csosn500(OrigemMercadoria origemMercadoria = OrigemMercadoria.Nacional, T
public decimal PercentualBcStRetido { get; set; }
public decimal ValorBcStRetido { get; set; }
public decimal PercentualSt { get; set; }
public decimal ValorBcIcmsEfetivo { get; private set; }
public decimal PercentualReducaoIcmsEfetivo { get; set; }
public decimal PercentualIcmsEfetivo { get; private set; }
public decimal ValorIcmsEfetivo { get; private set; }
public decimal PercentualFcpStRetido { get; private set; }

public override void Calcula(ITributavel tributavel) {
public override void Calcula(ITributavel tributavel) {
PercentualSt = tributavel.PercentualIcmsSt + tributavel.PercentualFcpSt;
}

var facade = new FacadeCalculadoraTributacao(tributavel, TipoDesconto);
var resultadoCalculoIcmsEfetivo = facade.CalculaIcmsEfetivo();

ValorBcIcmsEfetivo = resultadoCalculoIcmsEfetivo.BaseCalculo;
PercentualIcmsEfetivo = tributavel.PercentualIcmsEfetivo;
PercentualReducaoIcmsEfetivo = tributavel.PercentualReducaoIcmsEfetivo;
ValorIcmsEfetivo = resultadoCalculoIcmsEfetivo.Valor;
PercentualFcpStRetido = tributavel.PercentualFcpStRetido;
}

}
}
14 changes: 14 additions & 0 deletions src/MotorTributarioNet/Impostos/Csts/Cst60.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,11 @@ public class Cst60 : CstBase

// Demais propriedades ainda devem ser implementadas para a NF-e 4.00
public decimal PercentualSt { get; private set; }
public decimal ValorBcIcmsEfetivo { get; private set; }
public decimal PercentualReducaoIcmsEfetivo { get; set; }
public decimal PercentualIcmsEfetivo { get; private set; }
public decimal ValorIcmsEfetivo { get; private set; }
public decimal PercentualFcpStRetido { get; private set; }

public Cst60(OrigemMercadoria origemMercadoria = OrigemMercadoria.Nacional, TipoDesconto tipoDesconto = TipoDesconto.Incondicional) : base(origemMercadoria, tipoDesconto)
{
Expand All @@ -47,10 +52,19 @@ public override void Calcula(ITributavel tributavel)
{
var facade = new FacadeCalculadoraTributacao(tributavel, TipoDesconto);
var resultadoCalculoIcms = facade.CalculaIcmsSt();
var resultadoCalculoIcmsEfetivo = facade.CalculaIcmsEfetivo();

PercentualBcStRetido = tributavel.PercentualIcmsSt;
ValorBcStRetido = resultadoCalculoIcms.BaseCalculoIcmsSt;
ValorIcmsStRetido = resultadoCalculoIcms.ValorIcmsSt;

//ICMS Efetivo
ValorBcIcmsEfetivo = resultadoCalculoIcmsEfetivo.BaseCalculo;
PercentualIcmsEfetivo = tributavel.PercentualIcmsEfetivo;
PercentualReducaoIcmsEfetivo = tributavel.PercentualReducaoIcmsEfetivo;
ValorIcmsEfetivo = resultadoCalculoIcmsEfetivo.Valor;
PercentualFcpStRetido = tributavel.PercentualFcpStRetido;

ValorCreditoOutorgadoOuPresumido = facade.CalculaIcmsCredito().Valor;

PercentualSt = tributavel.PercentualIcmsSt + tributavel.PercentualFcpSt;
Expand Down
28 changes: 28 additions & 0 deletions src/MotorTributarioNet/Impostos/IResultadoCalculoIcmsEfetivo.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// Projeto: Motor Tributario
// Biblioteca C# para Cálculos Tributários Do Brasil
// NF-e, NFC-e, CT-e, SAT-Fiscal
//
// Esta biblioteca é software livre; você pode redistribuí-la e/ou modificá-la
// sob os termos da Licença Pública Geral Menor do GNU conforme publicada pela
// Free Software Foundation; tanto a versão 2.1 da Licença, ou (a seu critério)
// qualquer versão posterior.
//
// Esta biblioteca é distribuída na expectativa de que seja útil, porém, SEM
// NENHUMA GARANTIA; nem mesmo a garantia implícita de COMERCIABILIDADE OU
// ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral Menor
// do GNU para mais detalhes. (Arquivo LICENÇA.TXT ou LICENSE.TXT)
//
// Você deve ter recebido uma cópia da Licença Pública Geral Menor do GNU junto
// com esta biblioteca; se não, escreva para a Free Software Foundation, Inc.,
// no endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
// Você também pode obter uma copia da licença em:
// https://github.com/AutomacaoNet/MotorTributarioNet/blob/master/LICENSE

namespace MotorTributarioNet.Impostos
{
public interface IResultadoCalculoIcmsEfetivo
{
decimal BaseCalculo { get; }
decimal Valor { get; }
}
}
3 changes: 2 additions & 1 deletion src/MotorTributarioNet/Impostos/ITributavel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ public interface ITributavel
decimal AliquotaAdRemIcmsRetidoAnteriormente { get; set; }
decimal PercentualReducaoAliquotaAdRemIcms { get; set; }
decimal PercentualIcmsMonofasicoDiferido { get; set; }

decimal PercentualIcmsEfetivo { get; set; }
decimal PercentualReducaoIcmsEfetivo { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// Projeto: Motor Tributario
// Biblioteca C# para Cálculos Tributários Do Brasil
// NF-e, NFC-e, CT-e, SAT-Fiscal
//
// Esta biblioteca é software livre; você pode redistribuí-la e/ou modificá-la
// sob os termos da Licença Pública Geral Menor do GNU conforme publicada pela
// Free Software Foundation; tanto a versão 2.1 da Licença, ou (a seu critério)
// qualquer versão posterior.
//
// Esta biblioteca é distribuída na expectativa de que seja útil, porém, SEM
// NENHUMA GARANTIA; nem mesmo a garantia implícita de COMERCIABILIDADE OU
// ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral Menor
// do GNU para mais detalhes. (Arquivo LICENÇA.TXT ou LICENSE.TXT)
//
// Você deve ter recebido uma cópia da Licença Pública Geral Menor do GNU junto
// com esta biblioteca; se não, escreva para a Free Software Foundation, Inc.,
// no endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
// Você também pode obter uma copia da licença em:
// https://github.com/AutomacaoNet/MotorTributarioNet/blob/master/LICENSE

namespace MotorTributarioNet.Impostos.Implementacoes
{
public class ResultadoCalculoIcmsEfetivo : IResultadoCalculoIcmsEfetivo
{
public ResultadoCalculoIcmsEfetivo(decimal baseCalculo, decimal valor)
{
BaseCalculo = baseCalculo;
Valor = valor;
}

public decimal BaseCalculo { get; }
public decimal Valor { get; }
}
}
21 changes: 19 additions & 2 deletions src/MotorTributarioNet/Impostos/ResultadoTributacao.cs
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,10 @@ public class ResultadoTributacao
public decimal PercentualReducaoIcmsBc { get; private set; }
public decimal PercentualBcStRetido { get; private set; }
public decimal PercentualDiferimento { get; private set; }
public decimal PercentualIss { get; private set; }
public decimal PercentualReducaoIcmsEfetivo { get; set; }
public decimal PercentualIcmsEfetivo { get; private set; }
public decimal PercentualFcpStRetido { get; private set; }

public decimal ValorIcmsDiferido { get; private set; }
public decimal ValorIcmsOperacao { get; private set; }
Expand All @@ -88,7 +92,6 @@ public class ResultadoTributacao

public decimal ValorIss { get; private set; }
public decimal BaseCalculoIss { get; private set; }
public decimal PercentualIss { get; private set; }
public decimal BaseCalculoInss { get; private set; }
public decimal BaseCalculoIrrf { get; private set; }
public decimal ValorRetCofins { get; private set; }
Expand All @@ -114,6 +117,8 @@ public class ResultadoTributacao
public decimal ValorIcmsMonofasicoDiferido { get; private set; }
public decimal QuantidadeBaseCalculoIcmsMonofasicoRetidoAnteriormente { get; private set; }
public decimal ValorIcmsMonofasicoRetidoAnteriormente { get; private set; }
public decimal ValorBcIcmsEfetivo { get; private set; }
public decimal ValorIcmsEfetivo { get; private set; }

#endregion

Expand Down Expand Up @@ -245,6 +250,11 @@ private void CalcularIcms()
Icms.Calcula(_produto);
PercentualBcStRetido = ((Cst60)Icms).PercentualBcStRetido;
ValorBcStRetido = ((Cst60)Icms).ValorBcStRetido;
ValorBcIcmsEfetivo = ((Cst60)Icms).ValorBcIcmsEfetivo;
PercentualReducaoIcmsEfetivo = ((Cst60)Icms).PercentualReducaoIcmsEfetivo;
PercentualIcmsEfetivo = ((Cst60)Icms).PercentualIcmsEfetivo;
PercentualFcpStRetido = ((Cst60)Icms).PercentualFcpStRetido;
ValorIcmsEfetivo = ((Cst60)Icms).ValorIcmsEfetivo;
break;
case Cst.Cst61:
Icms = new Cst61();
Expand Down Expand Up @@ -413,7 +423,14 @@ private void CalcularIcms()

case Csosn.Csosn500:
//500 ICMS cobrado anteriormente por substituição tributária (substituído) ou por antecipação - Classificam-se neste código as operações sujeitas exclusivamente ao regime de substituição tributária na condição de substituído tributário ou no caso de antecipações
//nao tem calculo
//nao tem calculo de icms, mas possui de outros impostos:
CsosnBase = new Csosn500();
CsosnBase.Calcula(_produto);
ValorBcIcmsEfetivo = ((Csosn500)CsosnBase).ValorBcIcmsEfetivo;
PercentualReducaoIcmsEfetivo = ((Csosn500)CsosnBase).PercentualReducaoIcmsEfetivo;
PercentualIcmsEfetivo = ((Csosn500)CsosnBase).PercentualIcmsEfetivo;
PercentualFcpStRetido = ((Csosn500)CsosnBase).PercentualFcpStRetido;
ValorIcmsEfetivo = ((Csosn500)CsosnBase).ValorIcmsEfetivo;
break;

case Csosn.Csosn900:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
// Projeto: Motor Tributario
// Biblioteca C# para Cálculos Tributários Do Brasil
// NF-e, NFC-e, CT-e, SAT-Fiscal
//
// Esta biblioteca é software livre; você pode redistribuí-la e/ou modificá-la
// sob os termos da Licença Pública Geral Menor do GNU conforme publicada pela
// Free Software Foundation; tanto a versão 2.1 da Licença, ou (a seu critério)
// qualquer versão posterior.
//
// Esta biblioteca é distribuída na expectativa de que seja útil, porém, SEM
// NENHUMA GARANTIA; nem mesmo a garantia implícita de COMERCIABILIDADE OU
// ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral Menor
// do GNU para mais detalhes. (Arquivo LICENÇA.TXT ou LICENSE.TXT)
//
// Você deve ter recebido uma cópia da Licença Pública Geral Menor do GNU junto
// com esta biblioteca; se não, escreva para a Free Software Foundation, Inc.,
// no endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
// Você também pode obter uma copia da licença em:
// https://github.com/AutomacaoNet/MotorTributarioNet/blob/master/LICENSE

using System;
using MotorTributarioNet.Flags;
using MotorTributarioNet.Impostos.CalulosDeBC;
using MotorTributarioNet.Impostos.Implementacoes;

namespace MotorTributarioNet.Impostos.Tributacoes
{
public class TributacaoIcmsEfetivo
{
private readonly ITributavel _tributavel;
private readonly CalculaBaseCalculoIcmsEfetivo _calculaBaseCalculoIcms;

public TributacaoIcmsEfetivo(ITributavel tributavel, TipoDesconto tipoDesconto)
{
_tributavel = tributavel ?? throw new ArgumentNullException(nameof(tributavel));
_calculaBaseCalculoIcms = new CalculaBaseCalculoIcmsEfetivo(_tributavel, tipoDesconto);
}

public IResultadoCalculoIcmsEfetivo Calcula()
{
return CalculaIcms();
}

private IResultadoCalculoIcmsEfetivo CalculaIcms()
{
var baseCalculo = _calculaBaseCalculoIcms.CalculaBaseCalculo();

var valorIcms = CalculaIcms(baseCalculo);

return new ResultadoCalculoIcmsEfetivo(baseCalculo, valorIcms);
}

private decimal CalculaIcms(decimal baseCalculo)
{
if (_tributavel.PercentualIcmsEfetivo > 0m)
{
decimal percentualCalculoIcmsEfetivo = _tributavel.PercentualIcmsEfetivo;
return baseCalculo * percentualCalculoIcmsEfetivo / 100;
}
return 0m;
}
}
}
29 changes: 29 additions & 0 deletions src/TestesUnitarios/Csosn/Csosn500Test.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using MotorTributarioNet.Impostos.Csosns;
using TestCalculosTributarios.Entidade;
using Xunit;

namespace TestCalculosTributarios.Csosn
{
public class Csosn500Test
{

[Fact]
public void TestaCalculoICMSEfetivo()
{
var produto = new Produto
{
QuantidadeProduto = 1.000m,
ValorProduto = 1000.00m,
PercentualIcmsEfetivo = 20.00m,
PercentualReducaoIcmsEfetivo = 20.00m
};

var csosn500 = new Csosn500();

csosn500.Calcula(produto);

Assert.Equal(800.00m, csosn500.ValorBcIcmsEfetivo);
Assert.Equal(160.00m, csosn500.ValorIcmsEfetivo);
}
}
}
19 changes: 19 additions & 0 deletions src/TestesUnitarios/Cst/Cst60Test.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,5 +44,24 @@ public void CalculaCST60_CTe()
Assert.Equal(1000.00m, cst.ValorBcStRetido);
Assert.Equal(36.00m, cst.ValorCreditoOutorgadoOuPresumido);
}

[Fact]
public void CalculaCST60_ICMSEfetivo()
{
var produto = new Produto
{
QuantidadeProduto = 1.000m,
ValorProduto = 1000.00m,
PercentualIcmsEfetivo = 20.00m,
PercentualReducaoIcmsEfetivo = 20.00m
};

var cst60 = new Cst60();

cst60.Calcula(produto);

Assert.Equal(800.00m, cst60.ValorBcIcmsEfetivo);
Assert.Equal(160.00m, cst60.ValorIcmsEfetivo);
}
}
}
Loading

0 comments on commit 7574afb

Please sign in to comment.