diff --git a/.github/workflows/executar-testes.yml b/.github/workflows/executar-testes.yml
index 641b77d..97bbaa1 100644
--- a/.github/workflows/executar-testes.yml
+++ b/.github/workflows/executar-testes.yml
@@ -14,19 +14,28 @@ jobs:
steps:
- uses: actions/checkout@v3
- - name: Setup .NET
- uses: actions/setup-dotnet@v2
+ - name: Setup .NET 6
+ uses: actions/setup-dotnet@v3
with:
dotnet-version: 6.0.x
+
+ - name: Setup .NET 8
+ uses: actions/setup-dotnet@v3
+ with:
+ dotnet-version: 8.0.x
- name: Restore dependencies Motor
run: dotnet restore
working-directory: 'src/'
- name: Build
- run: dotnet build --no-restore
+ run: dotnet build --no-restore --configuration Release
working-directory: 'src/'
-
- - name: Test
- run: dotnet test --no-build --verbosity normal
+
+ - name: Test on .NET 6.0
+ run: dotnet test --no-build --verbosity normal --framework net6.0 --configuration Release
+ working-directory: 'src/'
+
+ - name: Test on .NET 8.0
+ run: dotnet test --no-build --verbosity normal --framework net8.0 --configuration Release
working-directory: 'src/'
diff --git a/NT_2025.002_v1.00_RTC_NF-e_IBS_CBS_IS (4).pdf b/NT_2025.002_v1.00_RTC_NF-e_IBS_CBS_IS (4).pdf
new file mode 100644
index 0000000..d151ee2
Binary files /dev/null and b/NT_2025.002_v1.00_RTC_NF-e_IBS_CBS_IS (4).pdf differ
diff --git a/src/MotorTributarioNet/Facade/FacadeCalculadoraTributacao.cs b/src/MotorTributarioNet/Facade/FacadeCalculadoraTributacao.cs
index 6651827..33a27f6 100644
--- a/src/MotorTributarioNet/Facade/FacadeCalculadoraTributacao.cs
+++ b/src/MotorTributarioNet/Facade/FacadeCalculadoraTributacao.cs
@@ -104,5 +104,29 @@ public IResultadoCalculoIcmsEfetivo CalculaIcmsEfetivo()
{
return new TributacaoIcmsEfetivo(_tributavel, _tipoDesconto).Calcula();
}
+
+ ///
+ /// Calcula o IBS UF (Imposto sobre Bens e Serviços - componente estadual) - Reforma Tributária LC 214/2025
+ ///
+ public IResultadoCalculoIbs CalculaIbs()
+ {
+ return new TributacaoIbs(_tributavel, _tipoDesconto).Calcula();
+ }
+
+ ///
+ /// Calcula o IBS Municipal (Imposto sobre Bens e Serviços - componente municipal) - Reforma Tributária LC 214/2025
+ ///
+ public IResultadoCalculoIbsMunicipal CalculaIbsMunicipal()
+ {
+ return new TributacaoIbsMunicipal(_tributavel, _tipoDesconto).Calcula();
+ }
+
+ ///
+ /// Calcula a CBS (Contribuição sobre Bens e Serviços) - Reforma Tributária LC 214/2025
+ ///
+ public IResultadoCalculoCbs CalculaCbs()
+ {
+ return new TributacaoCbs(_tributavel, _tipoDesconto).Calcula();
+ }
}
}
\ No newline at end of file
diff --git a/src/MotorTributarioNet/Impostos/CalulosDeBC/CalculaBaseCalculoIbsCbs.cs b/src/MotorTributarioNet/Impostos/CalulosDeBC/CalculaBaseCalculoIbsCbs.cs
new file mode 100644
index 0000000..7be6e35
--- /dev/null
+++ b/src/MotorTributarioNet/Impostos/CalulosDeBC/CalculaBaseCalculoIbsCbs.cs
@@ -0,0 +1,194 @@
+// 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;
+using MotorTributarioNet.Impostos.Tributacoes;
+
+namespace MotorTributarioNet.Impostos.CalulosDeBC
+{
+ ///
+ /// Calcula a base de cálculo do IBS (Imposto sobre Bens e Serviços) e CBS (Contribuição sobre Bens e Serviços)
+ /// Reforma Tributária - LC 214/2025 - Nota Técnica 2025.002
+ /// Fórmula (NT 2025.002, página 19, regra UB16-10):
+ /// vProd + vServ + vFrete + vSeg + vOutro + vII - vDesc - vPis - vCofins - vIcms - vIcmsUfDest - vFcp - vFcpUfDest - vIcmsMono - vIssqn + vIS
+ ///
+ public class CalculaBaseCalculoIbsCbs : CalculaBaseCalculoBase
+ {
+ private readonly ITributavel _tributavel;
+ private readonly TipoDesconto _tipoDesconto;
+
+ public CalculaBaseCalculoIbsCbs(ITributavel tributavel, TipoDesconto tipoDesconto) : base(tributavel)
+ {
+ _tributavel = tributavel;
+ _tipoDesconto = tipoDesconto;
+ }
+
+ ///
+ /// Calcula a base de cálculo conforme a fórmula da NT 2025.002
+ ///
+ public decimal CalculaBaseCalculo()
+ {
+ // vProd + vServ + vFrete + vSeg + vOutro
+ var baseCalculo = CalculaBaseDeCalculo();
+
+ // + vII (Imposto de Importação) - ainda não implementado, será 0 por enquanto
+ baseCalculo += ObterValorImpostoImportacao();
+
+ // - vDesc (Desconto)
+ baseCalculo -= _tributavel.Desconto;
+
+ // - vPis (Valor do PIS)
+ baseCalculo -= CalcularValorPis();
+
+ // - vCofins (Valor da COFINS)
+ baseCalculo -= CalcularValorCofins();
+
+ // - vIcms (Valor do ICMS)
+ baseCalculo -= CalcularValorIcms();
+
+ // - vIcmsUfDest (ICMS UF Destino) - ainda não implementado
+ baseCalculo -= ObterValorIcmsUfDest();
+
+ // - vFcp (Valor do FCP)
+ baseCalculo -= ObterValorFcp();
+
+ // - vFcpUfDest (FCP UF Destino) - ainda não implementado
+ baseCalculo -= ObterValorFcpUfDest();
+
+ // - vIcmsMono (ICMS Monofásico) - ainda não implementado
+ baseCalculo -= ObterValorIcmsMonofasico();
+
+ // - vIssqn (Valor do ISSQN)
+ baseCalculo -= CalcularValorIssqn();
+
+ // + vIS (Imposto Seletivo) - ainda não implementado, será 0 por enquanto
+ baseCalculo += ObterValorImpostoSeletivo();
+
+ return baseCalculo;
+ }
+
+ ///
+ /// Calcula o valor do PIS para dedução da base
+ ///
+ private decimal CalcularValorPis()
+ {
+ var tributacaoPis = new TributacaoPis(_tributavel, _tipoDesconto);
+ return tributacaoPis.Calcula().Valor;
+ }
+
+ ///
+ /// Calcula o valor da COFINS para dedução da base
+ ///
+ private decimal CalcularValorCofins()
+ {
+ var tributacaoCofins = new TributacaoCofins(_tributavel, _tipoDesconto);
+ return tributacaoCofins.Calcula().Valor;
+ }
+
+ ///
+ /// Calcula o valor do ICMS para dedução da base
+ ///
+ private decimal CalcularValorIcms()
+ {
+ var tributacaoIcms = new TributacaoIcms(_tributavel, _tipoDesconto);
+ return tributacaoIcms.Calcula().Valor;
+ }
+
+ ///
+ /// Calcula o valor do ISSQN para dedução da base
+ ///
+ private decimal CalcularValorIssqn()
+ {
+ if (_tributavel.IsServico && _tributavel.PercentualIssqn > 0)
+ {
+ var tributacaoIssqn = new TributacaoIssqn(_tributavel, _tipoDesconto);
+ return tributacaoIssqn.Calcula(false).Valor;
+ }
+ return 0m;
+ }
+
+ ///
+ /// Obtém o valor do Imposto de Importação (vII)
+ /// TODO: Implementar quando a propriedade for adicionada ao ITributavel
+ ///
+ private decimal ObterValorImpostoImportacao()
+ {
+ // Propriedade ainda não existe no ITributavel
+ return 0m;
+ }
+
+ ///
+ /// Obtém o valor do ICMS UF Destino (vIcmsUfDest)
+ /// TODO: Implementar quando a propriedade for adicionada ao ITributavel
+ ///
+ private decimal ObterValorIcmsUfDest()
+ {
+ // Propriedade ainda não existe no ITributavel
+ return 0m;
+ }
+
+ ///
+ /// Obtém o valor do FCP (Fundo de Combate à Pobreza)
+ /// TODO: Melhorar cálculo quando mais informações estiverem disponíveis
+ ///
+ private decimal ObterValorFcp()
+ {
+ // Cálculo simplificado - pode ser melhorado posteriormente
+ if (_tributavel.PercentualFcp > 0)
+ {
+ var baseCalculoFcp = CalculaBaseDeCalculo() - _tributavel.Desconto;
+ return baseCalculoFcp * _tributavel.PercentualFcp / 100;
+ }
+ return 0m;
+ }
+
+ ///
+ /// Obtém o valor do FCP UF Destino (vFcpUfDest)
+ /// TODO: Implementar quando a propriedade for adicionada ao ITributavel
+ ///
+ private decimal ObterValorFcpUfDest()
+ {
+ // Propriedade ainda não existe no ITributavel
+ return 0m;
+ }
+
+ ///
+ /// Obtém o valor do ICMS Monofásico (vIcmsMono)
+ /// TODO: Implementar cálculo quando mais informações estiverem disponíveis
+ ///
+ private decimal ObterValorIcmsMonofasico()
+ {
+ // Cálculo do ICMS Monofásico ainda não implementado
+ return 0m;
+ }
+
+ ///
+ /// Obtém o valor do Imposto Seletivo (vIS)
+ /// TODO: Implementar quando a propriedade for adicionada ao ITributavel
+ /// O IS é um novo imposto da reforma tributária que incidirá sobre produtos específicos
+ ///
+ private decimal ObterValorImpostoSeletivo()
+ {
+ // Imposto Seletivo ainda não implementado
+ return 0m;
+ }
+ }
+}
diff --git a/src/MotorTributarioNet/Impostos/IResultadoCalculoCbs.cs b/src/MotorTributarioNet/Impostos/IResultadoCalculoCbs.cs
new file mode 100644
index 0000000..28f8c25
--- /dev/null
+++ b/src/MotorTributarioNet/Impostos/IResultadoCalculoCbs.cs
@@ -0,0 +1,40 @@
+// 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
+{
+ ///
+ /// Interface para resultado do cálculo da CBS (Contribuição sobre Bens e Serviços)
+ /// Reforma Tributária - LC 214/2025
+ ///
+ public interface IResultadoCalculoCbs
+ {
+ ///
+ /// Base de cálculo da CBS
+ /// Fórmula: vProd + vServ + vFrete + vSeg + vOutro + vII - vDesc - vPis - vCofins - vIcms - vIcmsUfDest - vFcp - vFcpUfDest - vIcmsMono - vIssqn + vIS
+ ///
+ decimal BaseCalculo { get; }
+
+ ///
+ /// Valor da CBS calculado
+ ///
+ decimal Valor { get; }
+ }
+}
diff --git a/src/MotorTributarioNet/Impostos/IResultadoCalculoIbs.cs b/src/MotorTributarioNet/Impostos/IResultadoCalculoIbs.cs
new file mode 100644
index 0000000..1a42d5f
--- /dev/null
+++ b/src/MotorTributarioNet/Impostos/IResultadoCalculoIbs.cs
@@ -0,0 +1,40 @@
+// 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
+{
+ ///
+ /// Interface para resultado do cálculo do IBS (Imposto sobre Bens e Serviços)
+ /// Reforma Tributária - LC 214/2025
+ ///
+ public interface IResultadoCalculoIbs
+ {
+ ///
+ /// Base de cálculo do IBS
+ /// Fórmula: vProd + vServ + vFrete + vSeg + vOutro + vII - vDesc - vPis - vCofins - vIcms - vIcmsUfDest - vFcp - vFcpUfDest - vIcmsMono - vIssqn + vIS
+ ///
+ decimal BaseCalculo { get; }
+
+ ///
+ /// Valor do IBS calculado
+ ///
+ decimal Valor { get; }
+ }
+}
diff --git a/src/MotorTributarioNet/Impostos/IResultadoCalculoIbsMunicipal.cs b/src/MotorTributarioNet/Impostos/IResultadoCalculoIbsMunicipal.cs
new file mode 100644
index 0000000..138d207
--- /dev/null
+++ b/src/MotorTributarioNet/Impostos/IResultadoCalculoIbsMunicipal.cs
@@ -0,0 +1,40 @@
+// 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
+{
+ ///
+ /// Interface para resultado do cálculo do IBS Municipal (Imposto sobre Bens e Serviços - componente municipal)
+ /// Reforma Tributária - LC 214/2025
+ ///
+ public interface IResultadoCalculoIbsMunicipal
+ {
+ ///
+ /// Base de cálculo do IBS Municipal
+ /// Fórmula: vProd + vServ + vFrete + vSeg + vOutro + vII - vDesc - vPis - vCofins - vIcms - vIcmsUfDest - vFcp - vFcpUfDest - vIcmsMono - vIssqn + vIS
+ ///
+ decimal BaseCalculo { get; }
+
+ ///
+ /// Valor do IBS Municipal calculado
+ ///
+ decimal Valor { get; }
+ }
+}
diff --git a/src/MotorTributarioNet/Impostos/ITributavel.cs b/src/MotorTributarioNet/Impostos/ITributavel.cs
index 80b7945..4434b0c 100644
--- a/src/MotorTributarioNet/Impostos/ITributavel.cs
+++ b/src/MotorTributarioNet/Impostos/ITributavel.cs
@@ -84,5 +84,23 @@ public interface ITributavel
bool CalcularIcmsEfetivoeRetencaoParaSt { get; set; }
decimal PercentualIcmsEfetivo { get; set; }
decimal PercentualReducaoIcmsEfetivo { get; set; }
+
+ ///
+ /// Percentual do IBS UF (Imposto sobre Bens e Serviços - Componente Estadual)
+ /// Reforma Tributária - LC 214/2025
+ ///
+ decimal PercentualIbsUF { get; set; }
+
+ ///
+ /// Percentual do IBS Municipal (Imposto sobre Bens e Serviços - Componente Municipal)
+ /// Reforma Tributária - LC 214/2025
+ ///
+ decimal PercentualIbsMunicipal { get; set; }
+
+ ///
+ /// Percentual da CBS (Contribuição sobre Bens e Serviços)
+ /// Reforma Tributária - LC 214/2025
+ ///
+ decimal PercentualCbs { get; set; }
}
}
\ No newline at end of file
diff --git a/src/MotorTributarioNet/Impostos/Implementacoes/ResultadoCalculoCbs.cs b/src/MotorTributarioNet/Impostos/Implementacoes/ResultadoCalculoCbs.cs
new file mode 100644
index 0000000..929b1d6
--- /dev/null
+++ b/src/MotorTributarioNet/Impostos/Implementacoes/ResultadoCalculoCbs.cs
@@ -0,0 +1,40 @@
+// 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;
+
+namespace MotorTributarioNet.Impostos.Implementacoes
+{
+ ///
+ /// Implementação do resultado do cálculo da CBS (Contribuição sobre Bens e Serviços)
+ /// Reforma Tributária - LC 214/2025
+ ///
+ public class ResultadoCalculoCbs : IResultadoCalculoCbs
+ {
+ public ResultadoCalculoCbs(decimal baseCalculo, decimal valor)
+ {
+ BaseCalculo = Math.Round(baseCalculo, 2);
+ Valor = Math.Round(valor, 2);
+ }
+
+ public decimal BaseCalculo { get; }
+ public decimal Valor { get; }
+ }
+}
diff --git a/src/MotorTributarioNet/Impostos/Implementacoes/ResultadoCalculoIbs.cs b/src/MotorTributarioNet/Impostos/Implementacoes/ResultadoCalculoIbs.cs
new file mode 100644
index 0000000..248da1b
--- /dev/null
+++ b/src/MotorTributarioNet/Impostos/Implementacoes/ResultadoCalculoIbs.cs
@@ -0,0 +1,40 @@
+// 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;
+
+namespace MotorTributarioNet.Impostos.Implementacoes
+{
+ ///
+ /// Implementação do resultado do cálculo do IBS (Imposto sobre Bens e Serviços)
+ /// Reforma Tributária - LC 214/2025
+ ///
+ public class ResultadoCalculoIbs : IResultadoCalculoIbs
+ {
+ public ResultadoCalculoIbs(decimal baseCalculo, decimal valor)
+ {
+ BaseCalculo = Math.Round(baseCalculo, 2);
+ Valor = Math.Round(valor, 2);
+ }
+
+ public decimal BaseCalculo { get; }
+ public decimal Valor { get; }
+ }
+}
diff --git a/src/MotorTributarioNet/Impostos/Implementacoes/ResultadoCalculoIbsMunicipal.cs b/src/MotorTributarioNet/Impostos/Implementacoes/ResultadoCalculoIbsMunicipal.cs
new file mode 100644
index 0000000..19ac51e
--- /dev/null
+++ b/src/MotorTributarioNet/Impostos/Implementacoes/ResultadoCalculoIbsMunicipal.cs
@@ -0,0 +1,40 @@
+// 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;
+
+namespace MotorTributarioNet.Impostos.Implementacoes
+{
+ ///
+ /// Implementação do resultado do cálculo do IBS Municipal (Imposto sobre Bens e Serviços - componente municipal)
+ /// Reforma Tributária - LC 214/2025
+ ///
+ public class ResultadoCalculoIbsMunicipal : IResultadoCalculoIbsMunicipal
+ {
+ public ResultadoCalculoIbsMunicipal(decimal baseCalculo, decimal valor)
+ {
+ BaseCalculo = Math.Round(baseCalculo, 2);
+ Valor = Math.Round(valor, 2);
+ }
+
+ public decimal BaseCalculo { get; }
+ public decimal Valor { get; }
+ }
+}
diff --git a/src/MotorTributarioNet/Impostos/Tributacoes/TributacaoCbs.cs b/src/MotorTributarioNet/Impostos/Tributacoes/TributacaoCbs.cs
new file mode 100644
index 0000000..7d1fcdd
--- /dev/null
+++ b/src/MotorTributarioNet/Impostos/Tributacoes/TributacaoCbs.cs
@@ -0,0 +1,70 @@
+// 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
+{
+ ///
+ /// Classe para cálculo da CBS (Contribuição sobre Bens e Serviços)
+ /// Reforma Tributária - LC 214/2025
+ /// A CBS é uma contribuição federal que substituirá PIS e COFINS
+ ///
+ public class TributacaoCbs
+ {
+ private readonly ITributavel _tributavel;
+ private readonly CalculaBaseCalculoIbsCbs _calculaBaseCalculoIbsCbs;
+
+ public TributacaoCbs(ITributavel tributavel, TipoDesconto tipoDesconto)
+ {
+ _tributavel = tributavel ?? throw new ArgumentNullException(nameof(tributavel));
+ _calculaBaseCalculoIbsCbs = new CalculaBaseCalculoIbsCbs(_tributavel, tipoDesconto);
+ }
+
+ ///
+ /// Calcula a CBS
+ ///
+ public IResultadoCalculoCbs Calcula()
+ {
+ return CalculaCbs();
+ }
+
+ private IResultadoCalculoCbs CalculaCbs()
+ {
+ var baseCalculo = _calculaBaseCalculoIbsCbs.CalculaBaseCalculo();
+
+ var valorCbs = CalculaCbs(baseCalculo);
+
+ return new ResultadoCalculoCbs(baseCalculo, valorCbs);
+ }
+
+ ///
+ /// Calcula o valor da CBS
+ ///
+ private decimal CalculaCbs(decimal baseCalculo)
+ {
+ // CBS = Base de Cálculo × Alíquota / 100
+ return baseCalculo * _tributavel.PercentualCbs / 100;
+ }
+ }
+}
diff --git a/src/MotorTributarioNet/Impostos/Tributacoes/TributacaoIbs.cs b/src/MotorTributarioNet/Impostos/Tributacoes/TributacaoIbs.cs
new file mode 100644
index 0000000..44336c4
--- /dev/null
+++ b/src/MotorTributarioNet/Impostos/Tributacoes/TributacaoIbs.cs
@@ -0,0 +1,69 @@
+// 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
+{
+ ///
+ /// Classe para cálculo do IBS UF (Imposto sobre Bens e Serviços - componente estadual)
+ /// Reforma Tributária - LC 214/2025
+ ///
+ public class TributacaoIbs
+ {
+ private readonly ITributavel _tributavel;
+ private readonly CalculaBaseCalculoIbsCbs _calculaBaseCalculoIbsCbs;
+
+ public TributacaoIbs(ITributavel tributavel, TipoDesconto tipoDesconto)
+ {
+ _tributavel = tributavel ?? throw new ArgumentNullException(nameof(tributavel));
+ _calculaBaseCalculoIbsCbs = new CalculaBaseCalculoIbsCbs(_tributavel, tipoDesconto);
+ }
+
+ ///
+ /// Calcula o IBS UF (componente estadual)
+ ///
+ public IResultadoCalculoIbs Calcula()
+ {
+ return CalculaIbs();
+ }
+
+ private IResultadoCalculoIbs CalculaIbs()
+ {
+ var baseCalculo = _calculaBaseCalculoIbsCbs.CalculaBaseCalculo();
+
+ var valorIbsUF = CalculaIbsUF(baseCalculo);
+
+ return new ResultadoCalculoIbs(baseCalculo, valorIbsUF);
+ }
+
+ ///
+ /// Calcula o valor do IBS UF (componente estadual)
+ ///
+ private decimal CalculaIbsUF(decimal baseCalculo)
+ {
+ // IBS UF = Base de Cálculo × Alíquota UF / 100
+ return baseCalculo * _tributavel.PercentualIbsUF / 100;
+ }
+ }
+}
diff --git a/src/MotorTributarioNet/Impostos/Tributacoes/TributacaoIbsMunicipal.cs b/src/MotorTributarioNet/Impostos/Tributacoes/TributacaoIbsMunicipal.cs
new file mode 100644
index 0000000..9c62d9d
--- /dev/null
+++ b/src/MotorTributarioNet/Impostos/Tributacoes/TributacaoIbsMunicipal.cs
@@ -0,0 +1,69 @@
+// 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
+{
+ ///
+ /// Classe para cálculo do IBS Municipal (Imposto sobre Bens e Serviços - componente municipal)
+ /// Reforma Tributária - LC 214/2025
+ ///
+ public class TributacaoIbsMunicipal
+ {
+ private readonly ITributavel _tributavel;
+ private readonly CalculaBaseCalculoIbsCbs _calculaBaseCalculoIbsCbs;
+
+ public TributacaoIbsMunicipal(ITributavel tributavel, TipoDesconto tipoDesconto)
+ {
+ _tributavel = tributavel ?? throw new ArgumentNullException(nameof(tributavel));
+ _calculaBaseCalculoIbsCbs = new CalculaBaseCalculoIbsCbs(_tributavel, tipoDesconto);
+ }
+
+ ///
+ /// Calcula o IBS Municipal (componente municipal)
+ ///
+ public IResultadoCalculoIbsMunicipal Calcula()
+ {
+ return CalculaIbsMunicipal();
+ }
+
+ private IResultadoCalculoIbsMunicipal CalculaIbsMunicipal()
+ {
+ var baseCalculo = _calculaBaseCalculoIbsCbs.CalculaBaseCalculo();
+
+ var valorIbsMunicipal = CalculaIbsMunicipal(baseCalculo);
+
+ return new ResultadoCalculoIbsMunicipal(baseCalculo, valorIbsMunicipal);
+ }
+
+ ///
+ /// Calcula o valor do IBS Municipal (componente municipal)
+ ///
+ private decimal CalculaIbsMunicipal(decimal baseCalculo)
+ {
+ // IBS Municipal = Base de Cálculo × Alíquota Municipal / 100
+ return baseCalculo * _tributavel.PercentualIbsMunicipal / 100;
+ }
+ }
+}
diff --git a/src/MotorTributarioNet/MotorTributarioNet.csproj b/src/MotorTributarioNet/MotorTributarioNet.csproj
index 893f8de..1aab2d6 100644
--- a/src/MotorTributarioNet/MotorTributarioNet.csproj
+++ b/src/MotorTributarioNet/MotorTributarioNet.csproj
@@ -1,7 +1,7 @@
- net45;net48;net6.0
+ net45;net48;net6.0;net8.0
diff --git a/src/TestesUnitarios/CalculoCbsTest.cs b/src/TestesUnitarios/CalculoCbsTest.cs
new file mode 100644
index 0000000..ab40f67
--- /dev/null
+++ b/src/TestesUnitarios/CalculoCbsTest.cs
@@ -0,0 +1,249 @@
+using MotorTributarioNet.Facade;
+using MotorTributarioNet.Flags;
+using TestCalculosTributarios.Entidade;
+using Xunit;
+
+namespace TestCalculosTributarios
+{
+ ///
+ /// Testes para o cálculo da CBS (Contribuição sobre Bens e Serviços)
+ /// Reforma Tributária - LC 214/2025
+ ///
+ public class CalculoCbsTest
+ {
+ [Fact]
+ public void CalculoCbsBasico()
+ {
+ var produto = new Produto
+ {
+ PercentualCbs = 8.00m,
+ ValorProduto = 1000.00m,
+ QuantidadeProduto = 1.000m,
+ PercentualPis = 1.65m,
+ PercentualCofins = 7.6m,
+ PercentualIcms = 18.00m
+ };
+
+ var facade = new FacadeCalculadoraTributacao(produto);
+
+ var resultadoCalculoCbs = facade.CalculaCbs();
+
+ // Base de cálculo: 1000 - PIS(16.50) - COFINS(76.00) - ICMS(180.00) = 727.50
+ // CBS = 727.50 × 8% = 58.20
+ Assert.Equal(727.50m, resultadoCalculoCbs.BaseCalculo);
+ Assert.Equal(58.20m, resultadoCalculoCbs.Valor);
+ }
+
+ [Fact]
+ public void CalculoCbsComDescontoIncondicional()
+ {
+ var produto = new Produto
+ {
+ PercentualCbs = 8.00m,
+ ValorProduto = 1000.00m,
+ QuantidadeProduto = 1.000m,
+ Desconto = 100.00m,
+ PercentualPis = 1.65m,
+ PercentualCofins = 7.6m,
+ PercentualIcms = 18.00m
+ };
+
+ var facade = new FacadeCalculadoraTributacao(produto, TipoDesconto.Incondicional);
+
+ var resultadoCalculoCbs = facade.CalculaCbs();
+
+ // Base de cálculo: 1000 - 100 (desconto) - PIS(14.85) - COFINS(68.40) - ICMS(162.00) = 654.75
+ // CBS = 654.75 × 8% = 52.38
+ Assert.Equal(654.75m, resultadoCalculoCbs.BaseCalculo);
+ Assert.Equal(52.38m, resultadoCalculoCbs.Valor);
+ }
+
+ [Fact]
+ public void CalculoCbsComFreteSeguroOutrasDespesas()
+ {
+ var produto = new Produto
+ {
+ PercentualCbs = 8.00m,
+ ValorProduto = 1000.00m,
+ QuantidadeProduto = 1.000m,
+ Frete = 50.00m,
+ Seguro = 20.00m,
+ OutrasDespesas = 30.00m,
+ PercentualPis = 1.65m,
+ PercentualCofins = 7.6m,
+ PercentualIcms = 18.00m
+ };
+
+ var facade = new FacadeCalculadoraTributacao(produto);
+
+ var resultadoCalculoCbs = facade.CalculaCbs();
+
+ // Base de cálculo: 1000 + 50 + 20 + 30 - PIS(18.15) - COFINS(83.60) - ICMS(198.00) = 800.25
+ // CBS = 800.25 × 8% = 64.02
+ Assert.Equal(800.25m, resultadoCalculoCbs.BaseCalculo);
+ Assert.Equal(64.02m, resultadoCalculoCbs.Valor);
+ }
+
+ [Fact]
+ public void CalculoCbsComFreteSeguroOutrasDespesasEDesconto()
+ {
+ var produto = new Produto
+ {
+ PercentualCbs = 8.00m,
+ ValorProduto = 1000.00m,
+ QuantidadeProduto = 1.000m,
+ Frete = 50.00m,
+ Seguro = 20.00m,
+ OutrasDespesas = 30.00m,
+ Desconto = 100.00m,
+ PercentualPis = 1.65m,
+ PercentualCofins = 7.6m,
+ PercentualIcms = 18.00m
+ };
+
+ var facade = new FacadeCalculadoraTributacao(produto, TipoDesconto.Incondicional);
+
+ var resultadoCalculoCbs = facade.CalculaCbs();
+
+ // Base de cálculo: 1000 + 50 + 20 + 30 - 100 - PIS(16.50) - COFINS(76.00) - ICMS(180.00) = 727.50
+ // CBS = 727.50 × 8% = 58.20
+ Assert.Equal(727.50m, resultadoCalculoCbs.BaseCalculo);
+ Assert.Equal(58.20m, resultadoCalculoCbs.Valor);
+ }
+
+ [Fact]
+ public void CalculoCbsComAliquotaDiferente()
+ {
+ var produto = new Produto
+ {
+ PercentualCbs = 12.00m,
+ ValorProduto = 1000.00m,
+ QuantidadeProduto = 1.000m,
+ PercentualPis = 1.65m,
+ PercentualCofins = 7.6m,
+ PercentualIcms = 18.00m
+ };
+
+ var facade = new FacadeCalculadoraTributacao(produto);
+
+ var resultadoCalculoCbs = facade.CalculaCbs();
+
+ // Base de cálculo: 1000 - PIS(16.50) - COFINS(76.00) - ICMS(180.00) = 727.50
+ // CBS = 727.50 × 12% = 87.30
+ Assert.Equal(727.50m, resultadoCalculoCbs.BaseCalculo);
+ Assert.Equal(87.30m, resultadoCalculoCbs.Valor);
+ }
+
+ [Fact]
+ public void CalculoCbsComQuantidadeMaiorQueUm()
+ {
+ var produto = new Produto
+ {
+ PercentualCbs = 8.00m,
+ ValorProduto = 100.00m,
+ QuantidadeProduto = 10.000m,
+ PercentualPis = 1.65m,
+ PercentualCofins = 7.6m,
+ PercentualIcms = 18.00m
+ };
+
+ var facade = new FacadeCalculadoraTributacao(produto);
+
+ var resultadoCalculoCbs = facade.CalculaCbs();
+
+ // Base de cálculo: 1000 - PIS(16.50) - COFINS(76.00) - ICMS(180.00) = 727.50
+ // CBS = 727.50 × 8% = 58.20
+ Assert.Equal(727.50m, resultadoCalculoCbs.BaseCalculo);
+ Assert.Equal(58.20m, resultadoCalculoCbs.Valor);
+ }
+
+ [Fact]
+ public void CalculoCbsSemPisCofinsIcms()
+ {
+ var produto = new Produto
+ {
+ PercentualCbs = 8.00m,
+ ValorProduto = 1000.00m,
+ QuantidadeProduto = 1.000m,
+ PercentualPis = 0.00m,
+ PercentualCofins = 0.00m,
+ PercentualIcms = 0.00m
+ };
+
+ var facade = new FacadeCalculadoraTributacao(produto);
+
+ var resultadoCalculoCbs = facade.CalculaCbs();
+
+ // Base de cálculo: 1000 (sem deduções)
+ // CBS = 1000 × 8% = 80.00
+ Assert.Equal(1000.00m, resultadoCalculoCbs.BaseCalculo);
+ Assert.Equal(80.00m, resultadoCalculoCbs.Valor);
+ }
+
+ [Fact]
+ public void CalculoCbsComValorDecimal()
+ {
+ var produto = new Produto
+ {
+ PercentualCbs = 8.50m,
+ ValorProduto = 157.89m,
+ QuantidadeProduto = 1.000m,
+ PercentualPis = 1.65m,
+ PercentualCofins = 7.6m,
+ PercentualIcms = 18.00m
+ };
+
+ var facade = new FacadeCalculadoraTributacao(produto);
+
+ var resultadoCalculoCbs = facade.CalculaCbs();
+
+ // Base de cálculo: 157.89 - PIS(2.61) - COFINS(12.00) - ICMS(28.42) = 114.86
+ // CBS = 114.86 × 8.50% = 9.76
+ Assert.Equal(114.86m, resultadoCalculoCbs.BaseCalculo);
+ Assert.Equal(9.76m, resultadoCalculoCbs.Valor);
+ }
+
+ [Fact]
+ public void CalculoCbsEIbsJuntos()
+ {
+ // Teste para verificar que IBS UF, IBS Municipal e CBS podem ser calculados juntos
+ var produto = new Produto
+ {
+ PercentualCbs = 8.00m,
+ PercentualIbsUF = 10.00m,
+ PercentualIbsMunicipal = 5.00m,
+ ValorProduto = 1000.00m,
+ QuantidadeProduto = 1.000m,
+ PercentualPis = 1.65m,
+ PercentualCofins = 7.6m,
+ PercentualIcms = 18.00m
+ };
+
+ var facade = new FacadeCalculadoraTributacao(produto);
+
+ var resultadoCalculoCbs = facade.CalculaCbs();
+ var resultadoCalculoIbsUF = facade.CalculaIbs();
+ var resultadoCalculoIbsMunicipal = facade.CalculaIbsMunicipal();
+
+ // Todos devem ter a mesma base de cálculo
+ Assert.Equal(resultadoCalculoIbsUF.BaseCalculo, resultadoCalculoCbs.BaseCalculo);
+ Assert.Equal(resultadoCalculoIbsMunicipal.BaseCalculo, resultadoCalculoCbs.BaseCalculo);
+
+ // Base de cálculo: 1000 - PIS(16.50) - COFINS(76.00) - ICMS(180.00) = 727.50
+ Assert.Equal(727.50m, resultadoCalculoCbs.BaseCalculo);
+
+ // CBS = 727.50 × 8% = 58.20
+ Assert.Equal(58.20m, resultadoCalculoCbs.Valor);
+
+ // IBS UF = 727.50 × 10% = 72.75
+ Assert.Equal(72.75m, resultadoCalculoIbsUF.Valor);
+
+ // IBS Municipal = 727.50 × 5% = 36.38 (arredondado)
+ Assert.Equal(36.38m, resultadoCalculoIbsMunicipal.Valor);
+
+ // IBS Total = IBS UF + IBS Municipal = 72.75 + 36.38 = 109.13
+ var ibsTotal = resultadoCalculoIbsUF.Valor + resultadoCalculoIbsMunicipal.Valor;
+ Assert.Equal(109.13m, ibsTotal);
+ }
+ }
+}
diff --git a/src/TestesUnitarios/CalculoIbsMunicipalTest.cs b/src/TestesUnitarios/CalculoIbsMunicipalTest.cs
new file mode 100644
index 0000000..fbfde8d
--- /dev/null
+++ b/src/TestesUnitarios/CalculoIbsMunicipalTest.cs
@@ -0,0 +1,273 @@
+using MotorTributarioNet.Facade;
+using MotorTributarioNet.Flags;
+using TestCalculosTributarios.Entidade;
+using Xunit;
+
+namespace TestCalculosTributarios
+{
+ ///
+ /// Testes para o cálculo do IBS Municipal (Imposto sobre Bens e Serviços - componente municipal)
+ /// Reforma Tributária - LC 214/2025
+ ///
+ public class CalculoIbsMunicipalTest
+ {
+ [Fact]
+ public void CalculoIbsMunicipalBasico()
+ {
+ var produto = new Produto
+ {
+ PercentualIbsUF = 10.00m,
+ PercentualIbsMunicipal = 5.00m,
+ ValorProduto = 1000.00m,
+ QuantidadeProduto = 1.000m,
+ PercentualPis = 1.65m,
+ PercentualCofins = 7.6m,
+ PercentualIcms = 18.00m
+ };
+
+ var facade = new FacadeCalculadoraTributacao(produto);
+
+ var resultadoCalculoIbsMunicipal = facade.CalculaIbsMunicipal();
+
+ // Base de cálculo: 1000 - PIS(16.50) - COFINS(76.00) - ICMS(180.00) = 727.50
+ // IBS Municipal = 727.50 × 5% = 36.38 (arredondado)
+ Assert.Equal(727.50m, resultadoCalculoIbsMunicipal.BaseCalculo);
+ Assert.Equal(36.38m, resultadoCalculoIbsMunicipal.Valor);
+ }
+
+ [Fact]
+ public void CalculoIbsMunicipalComDescontoIncondicional()
+ {
+ var produto = new Produto
+ {
+ PercentualIbsUF = 10.00m,
+ PercentualIbsMunicipal = 5.00m,
+ ValorProduto = 1000.00m,
+ QuantidadeProduto = 1.000m,
+ Desconto = 100.00m,
+ PercentualPis = 1.65m,
+ PercentualCofins = 7.6m,
+ PercentualIcms = 18.00m
+ };
+
+ var facade = new FacadeCalculadoraTributacao(produto, TipoDesconto.Incondicional);
+
+ var resultadoCalculoIbsMunicipal = facade.CalculaIbsMunicipal();
+
+ // Base de cálculo: 1000 - 100 (desconto) - PIS(14.85) - COFINS(68.40) - ICMS(162.00) = 654.75
+ // IBS Municipal = 654.75 × 5% = 32.74 (arredondado)
+ Assert.Equal(654.75m, resultadoCalculoIbsMunicipal.BaseCalculo);
+ Assert.Equal(32.74m, resultadoCalculoIbsMunicipal.Valor);
+ }
+
+ [Fact]
+ public void CalculoIbsMunicipalComFreteSeguroOutrasDespesas()
+ {
+ var produto = new Produto
+ {
+ PercentualIbsUF = 8.00m,
+ PercentualIbsMunicipal = 4.00m,
+ ValorProduto = 1000.00m,
+ QuantidadeProduto = 1.000m,
+ Frete = 50.00m,
+ Seguro = 20.00m,
+ OutrasDespesas = 30.00m,
+ PercentualPis = 1.65m,
+ PercentualCofins = 7.6m,
+ PercentualIcms = 18.00m
+ };
+
+ var facade = new FacadeCalculadoraTributacao(produto);
+
+ var resultadoCalculoIbsMunicipal = facade.CalculaIbsMunicipal();
+
+ // Base de cálculo: 1000 + 50 + 20 + 30 - PIS(18.15) - COFINS(83.60) - ICMS(198.00) = 800.25
+ // IBS Municipal = 800.25 × 4% = 32.01
+ Assert.Equal(800.25m, resultadoCalculoIbsMunicipal.BaseCalculo);
+ Assert.Equal(32.01m, resultadoCalculoIbsMunicipal.Valor);
+ }
+
+ [Fact]
+ public void CalculoIbsMunicipalComFreteSeguroOutrasDespesasEDesconto()
+ {
+ var produto = new Produto
+ {
+ PercentualIbsUF = 8.00m,
+ PercentualIbsMunicipal = 4.00m,
+ ValorProduto = 1000.00m,
+ QuantidadeProduto = 1.000m,
+ Frete = 50.00m,
+ Seguro = 20.00m,
+ OutrasDespesas = 30.00m,
+ Desconto = 100.00m,
+ PercentualPis = 1.65m,
+ PercentualCofins = 7.6m,
+ PercentualIcms = 18.00m
+ };
+
+ var facade = new FacadeCalculadoraTributacao(produto, TipoDesconto.Incondicional);
+
+ var resultadoCalculoIbsMunicipal = facade.CalculaIbsMunicipal();
+
+ // Base de cálculo: 1000 + 50 + 20 + 30 - 100 - PIS(16.50) - COFINS(76.00) - ICMS(180.00) = 727.50
+ // IBS Municipal = 727.50 × 4% = 29.10
+ Assert.Equal(727.50m, resultadoCalculoIbsMunicipal.BaseCalculo);
+ Assert.Equal(29.10m, resultadoCalculoIbsMunicipal.Valor);
+ }
+
+ [Fact]
+ public void CalculoIbsMunicipalApenasComponenteMunicipal()
+ {
+ var produto = new Produto
+ {
+ PercentualIbsUF = 0.00m,
+ PercentualIbsMunicipal = 5.00m,
+ ValorProduto = 1000.00m,
+ QuantidadeProduto = 1.000m,
+ PercentualPis = 1.65m,
+ PercentualCofins = 7.6m,
+ PercentualIcms = 18.00m
+ };
+
+ var facade = new FacadeCalculadoraTributacao(produto);
+
+ var resultadoCalculoIbsMunicipal = facade.CalculaIbsMunicipal();
+
+ // Base de cálculo: 1000 - PIS(16.50) - COFINS(76.00) - ICMS(180.00) = 727.50
+ // IBS Municipal = 727.50 × 5% = 36.38 (arredondado)
+ Assert.Equal(727.50m, resultadoCalculoIbsMunicipal.BaseCalculo);
+ Assert.Equal(36.38m, resultadoCalculoIbsMunicipal.Valor);
+ }
+
+ [Fact]
+ public void CalculoIbsMunicipalSemComponenteMunicipal()
+ {
+ var produto = new Produto
+ {
+ PercentualIbsUF = 10.00m,
+ PercentualIbsMunicipal = 0.00m,
+ ValorProduto = 1000.00m,
+ QuantidadeProduto = 1.000m,
+ PercentualPis = 1.65m,
+ PercentualCofins = 7.6m,
+ PercentualIcms = 18.00m
+ };
+
+ var facade = new FacadeCalculadoraTributacao(produto);
+
+ var resultadoCalculoIbsMunicipal = facade.CalculaIbsMunicipal();
+
+ // Base de cálculo: 1000 - PIS(16.50) - COFINS(76.00) - ICMS(180.00) = 727.50
+ // IBS Municipal = 727.50 × 0% = 0.00 (sem componente municipal)
+ Assert.Equal(727.50m, resultadoCalculoIbsMunicipal.BaseCalculo);
+ Assert.Equal(0.00m, resultadoCalculoIbsMunicipal.Valor);
+ }
+
+ [Fact]
+ public void CalculoIbsMunicipalComQuantidadeMaiorQueUm()
+ {
+ var produto = new Produto
+ {
+ PercentualIbsUF = 10.00m,
+ PercentualIbsMunicipal = 5.00m,
+ ValorProduto = 100.00m,
+ QuantidadeProduto = 10.000m,
+ PercentualPis = 1.65m,
+ PercentualCofins = 7.6m,
+ PercentualIcms = 18.00m
+ };
+
+ var facade = new FacadeCalculadoraTributacao(produto);
+
+ var resultadoCalculoIbsMunicipal = facade.CalculaIbsMunicipal();
+
+ // Base de cálculo: 1000 - PIS(16.50) - COFINS(76.00) - ICMS(180.00) = 727.50
+ // IBS Municipal = 727.50 × 5% = 36.38 (arredondado)
+ Assert.Equal(727.50m, resultadoCalculoIbsMunicipal.BaseCalculo);
+ Assert.Equal(36.38m, resultadoCalculoIbsMunicipal.Valor);
+ }
+
+ [Fact]
+ public void CalculoIbsMunicipalSemPisCofinsIcms()
+ {
+ var produto = new Produto
+ {
+ PercentualIbsUF = 10.00m,
+ PercentualIbsMunicipal = 5.00m,
+ ValorProduto = 1000.00m,
+ QuantidadeProduto = 1.000m,
+ PercentualPis = 0.00m,
+ PercentualCofins = 0.00m,
+ PercentualIcms = 0.00m
+ };
+
+ var facade = new FacadeCalculadoraTributacao(produto);
+
+ var resultadoCalculoIbsMunicipal = facade.CalculaIbsMunicipal();
+
+ // Base de cálculo: 1000 (sem deduções)
+ // IBS Municipal = 1000 × 5% = 50.00
+ Assert.Equal(1000.00m, resultadoCalculoIbsMunicipal.BaseCalculo);
+ Assert.Equal(50.00m, resultadoCalculoIbsMunicipal.Valor);
+ }
+
+ [Fact]
+ public void CalculoIbsMunicipalComValorDecimal()
+ {
+ var produto = new Produto
+ {
+ PercentualIbsUF = 8.50m,
+ PercentualIbsMunicipal = 3.75m,
+ ValorProduto = 157.89m,
+ QuantidadeProduto = 1.000m,
+ PercentualPis = 1.65m,
+ PercentualCofins = 7.6m,
+ PercentualIcms = 18.00m
+ };
+
+ var facade = new FacadeCalculadoraTributacao(produto);
+
+ var resultadoCalculoIbsMunicipal = facade.CalculaIbsMunicipal();
+
+ // Base de cálculo: 157.89 - PIS(2.61) - COFINS(12.00) - ICMS(28.42) = 114.86
+ // IBS Municipal = 114.86 × 3.75% = 4.31
+ Assert.Equal(114.86m, resultadoCalculoIbsMunicipal.BaseCalculo);
+ Assert.Equal(4.31m, resultadoCalculoIbsMunicipal.Valor);
+ }
+
+ [Fact]
+ public void CalculoIbsMunicipalETotalComAmbosComponentes()
+ {
+ var produto = new Produto
+ {
+ PercentualIbsUF = 10.00m,
+ PercentualIbsMunicipal = 5.00m,
+ ValorProduto = 1000.00m,
+ QuantidadeProduto = 1.000m,
+ PercentualPis = 1.65m,
+ PercentualCofins = 7.6m,
+ PercentualIcms = 18.00m
+ };
+
+ var facade = new FacadeCalculadoraTributacao(produto);
+
+ // Calcula IBS UF e IBS Municipal separadamente
+ var resultadoIbsUF = facade.CalculaIbs();
+ var resultadoIbsMunicipal = facade.CalculaIbsMunicipal();
+
+ // Base de cálculo deve ser a mesma para ambos
+ Assert.Equal(resultadoIbsUF.BaseCalculo, resultadoIbsMunicipal.BaseCalculo);
+ Assert.Equal(727.50m, resultadoIbsUF.BaseCalculo);
+
+ // IBS UF = 727.50 × 10% = 72.75
+ Assert.Equal(72.75m, resultadoIbsUF.Valor);
+
+ // IBS Municipal = 727.50 × 5% = 36.38
+ Assert.Equal(36.38m, resultadoIbsMunicipal.Valor);
+
+ // IBS Total = IBS UF + IBS Municipal = 72.75 + 36.38 = 109.13
+ var ibsTotal = resultadoIbsUF.Valor + resultadoIbsMunicipal.Valor;
+ Assert.Equal(109.13m, ibsTotal);
+ }
+ }
+}
diff --git a/src/TestesUnitarios/CalculoIbsTest.cs b/src/TestesUnitarios/CalculoIbsTest.cs
new file mode 100644
index 0000000..40b17c7
--- /dev/null
+++ b/src/TestesUnitarios/CalculoIbsTest.cs
@@ -0,0 +1,238 @@
+using MotorTributarioNet.Facade;
+using MotorTributarioNet.Flags;
+using TestCalculosTributarios.Entidade;
+using Xunit;
+
+namespace TestCalculosTributarios
+{
+ ///
+ /// Testes para o cálculo do IBS UF (Imposto sobre Bens e Serviços - componente estadual)
+ /// Reforma Tributária - LC 214/2025
+ ///
+ public class CalculoIbsTest
+ {
+ [Fact]
+ public void CalculoIbsBasico()
+ {
+ var produto = new Produto
+ {
+ PercentualIbsUF = 10.00m,
+ PercentualIbsMunicipal = 5.00m,
+ ValorProduto = 1000.00m,
+ QuantidadeProduto = 1.000m,
+ PercentualPis = 1.65m,
+ PercentualCofins = 7.6m,
+ PercentualIcms = 18.00m
+ };
+
+ var facade = new FacadeCalculadoraTributacao(produto);
+
+ var resultadoCalculoIbs = facade.CalculaIbs();
+
+ // Base de cálculo: 1000 - PIS(16.50) - COFINS(76.00) - ICMS(180.00) = 727.50
+ // IBS UF = 727.50 × 10% = 72.75
+ Assert.Equal(727.50m, resultadoCalculoIbs.BaseCalculo);
+ Assert.Equal(72.75m, resultadoCalculoIbs.Valor);
+ }
+
+ [Fact]
+ public void CalculoIbsComDescontoIncondicional()
+ {
+ var produto = new Produto
+ {
+ PercentualIbsUF = 10.00m,
+ PercentualIbsMunicipal = 5.00m,
+ ValorProduto = 1000.00m,
+ QuantidadeProduto = 1.000m,
+ Desconto = 100.00m,
+ PercentualPis = 1.65m,
+ PercentualCofins = 7.6m,
+ PercentualIcms = 18.00m
+ };
+
+ var facade = new FacadeCalculadoraTributacao(produto, TipoDesconto.Incondicional);
+
+ var resultadoCalculoIbs = facade.CalculaIbs();
+
+ // Base de cálculo: 1000 - 100 (desconto) - PIS(14.85) - COFINS(68.40) - ICMS(162.00) = 654.75
+ // IBS UF = 654.75 × 10% = 65.48 (arredondado)
+ Assert.Equal(654.75m, resultadoCalculoIbs.BaseCalculo);
+ Assert.Equal(65.48m, resultadoCalculoIbs.Valor);
+ }
+
+ [Fact]
+ public void CalculoIbsComFreteSeguroOutrasDespesas()
+ {
+ var produto = new Produto
+ {
+ PercentualIbsUF = 8.00m,
+ PercentualIbsMunicipal = 4.00m,
+ ValorProduto = 1000.00m,
+ QuantidadeProduto = 1.000m,
+ Frete = 50.00m,
+ Seguro = 20.00m,
+ OutrasDespesas = 30.00m,
+ PercentualPis = 1.65m,
+ PercentualCofins = 7.6m,
+ PercentualIcms = 18.00m
+ };
+
+ var facade = new FacadeCalculadoraTributacao(produto);
+
+ var resultadoCalculoIbs = facade.CalculaIbs();
+
+ // Base de cálculo: 1000 + 50 + 20 + 30 - PIS(18.15) - COFINS(83.60) - ICMS(198.00) = 800.25
+ // IBS UF = 800.25 × 8% = 64.02
+ Assert.Equal(800.25m, resultadoCalculoIbs.BaseCalculo);
+ Assert.Equal(64.02m, resultadoCalculoIbs.Valor);
+ }
+
+ [Fact]
+ public void CalculoIbsComFreteSeguroOutrasDespesasEDesconto()
+ {
+ var produto = new Produto
+ {
+ PercentualIbsUF = 8.00m,
+ PercentualIbsMunicipal = 4.00m,
+ ValorProduto = 1000.00m,
+ QuantidadeProduto = 1.000m,
+ Frete = 50.00m,
+ Seguro = 20.00m,
+ OutrasDespesas = 30.00m,
+ Desconto = 100.00m,
+ PercentualPis = 1.65m,
+ PercentualCofins = 7.6m,
+ PercentualIcms = 18.00m
+ };
+
+ var facade = new FacadeCalculadoraTributacao(produto, TipoDesconto.Incondicional);
+
+ var resultadoCalculoIbs = facade.CalculaIbs();
+
+ // Base de cálculo: 1000 + 50 + 20 + 30 - 100 - PIS(16.50) - COFINS(76.00) - ICMS(180.00) = 727.50
+ // IBS UF = 727.50 × 8% = 58.20
+ Assert.Equal(727.50m, resultadoCalculoIbs.BaseCalculo);
+ Assert.Equal(58.20m, resultadoCalculoIbs.Valor);
+ }
+
+ [Fact]
+ public void CalculoIbsApenasComponenteEstadual()
+ {
+ var produto = new Produto
+ {
+ PercentualIbsUF = 10.00m,
+ PercentualIbsMunicipal = 0.00m,
+ ValorProduto = 1000.00m,
+ QuantidadeProduto = 1.000m,
+ PercentualPis = 1.65m,
+ PercentualCofins = 7.6m,
+ PercentualIcms = 18.00m
+ };
+
+ var facade = new FacadeCalculadoraTributacao(produto);
+
+ var resultadoCalculoIbs = facade.CalculaIbs();
+
+ // Base de cálculo: 1000 - PIS(16.50) - COFINS(76.00) - ICMS(180.00) = 727.50
+ // IBS = 727.50 × 10% = 72.75
+ Assert.Equal(727.50m, resultadoCalculoIbs.BaseCalculo);
+ Assert.Equal(72.75m, resultadoCalculoIbs.Valor);
+ }
+
+ [Fact]
+ public void CalculoIbsSemComponenteEstadual()
+ {
+ var produto = new Produto
+ {
+ PercentualIbsUF = 0.00m,
+ PercentualIbsMunicipal = 5.00m,
+ ValorProduto = 1000.00m,
+ QuantidadeProduto = 1.000m,
+ PercentualPis = 1.65m,
+ PercentualCofins = 7.6m,
+ PercentualIcms = 18.00m
+ };
+
+ var facade = new FacadeCalculadoraTributacao(produto);
+
+ var resultadoCalculoIbs = facade.CalculaIbs();
+
+ // Base de cálculo: 1000 - PIS(16.50) - COFINS(76.00) - ICMS(180.00) = 727.50
+ // IBS UF = 727.50 × 0% = 0.00 (sem componente estadual)
+ Assert.Equal(727.50m, resultadoCalculoIbs.BaseCalculo);
+ Assert.Equal(0.00m, resultadoCalculoIbs.Valor);
+ }
+
+ [Fact]
+ public void CalculoIbsComQuantidadeMaiorQueUm()
+ {
+ var produto = new Produto
+ {
+ PercentualIbsUF = 10.00m,
+ PercentualIbsMunicipal = 5.00m,
+ ValorProduto = 100.00m,
+ QuantidadeProduto = 10.000m,
+ PercentualPis = 1.65m,
+ PercentualCofins = 7.6m,
+ PercentualIcms = 18.00m
+ };
+
+ var facade = new FacadeCalculadoraTributacao(produto);
+
+ var resultadoCalculoIbs = facade.CalculaIbs();
+
+ // Base de cálculo: 1000 - PIS(16.50) - COFINS(76.00) - ICMS(180.00) = 727.50
+ // IBS UF = 727.50 × 10% = 72.75
+ Assert.Equal(727.50m, resultadoCalculoIbs.BaseCalculo);
+ Assert.Equal(72.75m, resultadoCalculoIbs.Valor);
+ }
+
+ [Fact]
+ public void CalculoIbsSemPisCofinsIcms()
+ {
+ var produto = new Produto
+ {
+ PercentualIbsUF = 10.00m,
+ PercentualIbsMunicipal = 5.00m,
+ ValorProduto = 1000.00m,
+ QuantidadeProduto = 1.000m,
+ PercentualPis = 0.00m,
+ PercentualCofins = 0.00m,
+ PercentualIcms = 0.00m
+ };
+
+ var facade = new FacadeCalculadoraTributacao(produto);
+
+ var resultadoCalculoIbs = facade.CalculaIbs();
+
+ // Base de cálculo: 1000 (sem deduções)
+ // IBS UF = 1000 × 10% = 100.00
+ Assert.Equal(1000.00m, resultadoCalculoIbs.BaseCalculo);
+ Assert.Equal(100.00m, resultadoCalculoIbs.Valor);
+ }
+
+ [Fact]
+ public void CalculoIbsComValorDecimal()
+ {
+ var produto = new Produto
+ {
+ PercentualIbsUF = 8.50m,
+ PercentualIbsMunicipal = 3.75m,
+ ValorProduto = 157.89m,
+ QuantidadeProduto = 1.000m,
+ PercentualPis = 1.65m,
+ PercentualCofins = 7.6m,
+ PercentualIcms = 18.00m
+ };
+
+ var facade = new FacadeCalculadoraTributacao(produto);
+
+ var resultadoCalculoIbs = facade.CalculaIbs();
+
+ // Base de cálculo: 157.89 - PIS(2.61) - COFINS(12.00) - ICMS(28.42) = 114.86
+ // IBS UF = 114.86 × 8.5% = 9.76
+ Assert.Equal(114.86m, resultadoCalculoIbs.BaseCalculo);
+ Assert.Equal(9.76m, resultadoCalculoIbs.Valor);
+ }
+ }
+}
diff --git a/src/TestesUnitarios/Entidade/Produto.cs b/src/TestesUnitarios/Entidade/Produto.cs
index 8f99019..13da0b3 100644
--- a/src/TestesUnitarios/Entidade/Produto.cs
+++ b/src/TestesUnitarios/Entidade/Produto.cs
@@ -66,5 +66,8 @@ public Produto()
public bool CalcularIcmsEfetivoeRetencaoParaSt { get; set; }
public decimal PercentualIcmsEfetivo { get; set; }
public decimal PercentualReducaoIcmsEfetivo { get; set; }
+ public decimal PercentualIbsUF { get; set; }
+ public decimal PercentualIbsMunicipal { get; set; }
+ public decimal PercentualCbs { get; set; }
}
}
\ No newline at end of file
diff --git a/src/TestesUnitarios/TestesUnitarios.csproj b/src/TestesUnitarios/TestesUnitarios.csproj
index f15d819..4073364 100644
--- a/src/TestesUnitarios/TestesUnitarios.csproj
+++ b/src/TestesUnitarios/TestesUnitarios.csproj
@@ -1,7 +1,7 @@
- net6.0
+ net6.0;net8.0