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

Cálculo ICMS Efetivo #35

Merged
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
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
Loading