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