Skip to content

Commit f4fdc67

Browse files
author
Roberto Alves
committed
feat: adicionado percentual redução de aliquota do ibs/cbs
1 parent 068ff78 commit f4fdc67

File tree

8 files changed

+258
-6
lines changed

8 files changed

+258
-6
lines changed

src/MotorTributarioNet/Impostos/ITributavel.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,5 +102,23 @@ public interface ITributavel
102102
/// Reforma Tributária - LC 214/2025
103103
/// </summary>
104104
decimal PercentualCbs { get; set; }
105+
106+
/// <summary>
107+
/// Percentual de redução da alíquota do IBS UF
108+
/// Reforma Tributária - LC 214/2025
109+
/// </summary>
110+
decimal PercentualReducaoIbsUf { get; set; }
111+
112+
/// <summary>
113+
/// Percentual de redução da alíquota do IBS Municipal
114+
/// Reforma Tributária - LC 214/2025
115+
/// </summary>
116+
decimal PercentualReducaoIbsMunicipal { get; set; }
117+
118+
/// <summary>
119+
/// Percentual de redução da alíquota da CBS
120+
/// Reforma Tributária - LC 214/2025
121+
/// </summary>
122+
decimal PercentualReducaoCbs { get; set; }
105123
}
106124
}

src/MotorTributarioNet/Impostos/Tributacoes/TributacaoCbs.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,10 @@ private IResultadoCalculoCbs CalculaCbs()
6363
/// </summary>
6464
private decimal CalculaCbs(decimal baseCalculo)
6565
{
66-
// CBS = Base de Cálculo × Alíquota / 100
67-
return baseCalculo * _tributavel.PercentualCbs / 100;
66+
// Aplica redução na alíquota se houver
67+
var aliquota = _tributavel.PercentualCbs * (1 - _tributavel.PercentualReducaoCbs / 100);
68+
// CBS = Base de Cálculo × Alíquota com redução / 100
69+
return baseCalculo * aliquota / 100;
6870
}
6971
}
7072
}

src/MotorTributarioNet/Impostos/Tributacoes/TributacaoIbs.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,10 @@ private IResultadoCalculoIbs CalculaIbs()
6262
/// </summary>
6363
private decimal CalculaIbsUF(decimal baseCalculo)
6464
{
65-
// IBS UF = Base de Cálculo × Alíquota UF / 100
66-
return baseCalculo * _tributavel.PercentualIbsUF / 100;
65+
// Aplica redução na alíquota se houver
66+
var aliquota = _tributavel.PercentualIbsUF * (1 - _tributavel.PercentualReducaoIbsUf / 100);
67+
// IBS UF = Base de Cálculo × Alíquota com redução / 100
68+
return baseCalculo * aliquota / 100;
6769
}
6870
}
6971
}

src/MotorTributarioNet/Impostos/Tributacoes/TributacaoIbsMunicipal.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,10 @@ private IResultadoCalculoIbsMunicipal CalculaIbsMunicipal()
6262
/// </summary>
6363
private decimal CalculaIbsMunicipal(decimal baseCalculo)
6464
{
65-
// IBS Municipal = Base de Cálculo × Alíquota Municipal / 100
66-
return baseCalculo * _tributavel.PercentualIbsMunicipal / 100;
65+
// Aplica redução na alíquota se houver
66+
var aliquota = _tributavel.PercentualIbsMunicipal * (1 - _tributavel.PercentualReducaoIbsMunicipal / 100);
67+
// IBS Municipal = Base de Cálculo × Alíquota com redução / 100
68+
return baseCalculo * aliquota / 100;
6769
}
6870
}
6971
}

src/TestesUnitarios/CalculoCbsTest.cs

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,5 +245,80 @@ public void CalculoCbsEIbsJuntos()
245245
var ibsTotal = resultadoCalculoIbsUF.Valor + resultadoCalculoIbsMunicipal.Valor;
246246
Assert.Equal(109.13m, ibsTotal);
247247
}
248+
249+
[Fact]
250+
public void CalculoCbsComReducaoAliquota()
251+
{
252+
var produto = new Produto
253+
{
254+
PercentualCbs = 0.90m,
255+
PercentualReducaoCbs = 50.00m, // 50% de redução
256+
ValorProduto = 1000.00m,
257+
QuantidadeProduto = 1.000m,
258+
PercentualPis = 0.00m,
259+
PercentualCofins = 0.00m,
260+
PercentualIcms = 0.00m
261+
};
262+
263+
var facade = new FacadeCalculadoraTributacao(produto);
264+
265+
var resultadoCalculoCbs = facade.CalculaCbs();
266+
267+
// Base de cálculo: 1000 (sem deduções)
268+
// Alíquota com redução: 0.90 × (1 - 0.50) = 0.45%
269+
// CBS = 1000 × 0.45% = 4.50
270+
Assert.Equal(1000.00m, resultadoCalculoCbs.BaseCalculo);
271+
Assert.Equal(4.50m, resultadoCalculoCbs.Valor);
272+
}
273+
274+
[Fact]
275+
public void CalculoCbsComReducaoAliquota100Porcento()
276+
{
277+
var produto = new Produto
278+
{
279+
PercentualCbs = 0.90m,
280+
PercentualReducaoCbs = 100.00m, // 100% de redução = alíquota zero
281+
ValorProduto = 1000.00m,
282+
QuantidadeProduto = 1.000m,
283+
PercentualPis = 0.00m,
284+
PercentualCofins = 0.00m,
285+
PercentualIcms = 0.00m
286+
};
287+
288+
var facade = new FacadeCalculadoraTributacao(produto);
289+
290+
var resultadoCalculoCbs = facade.CalculaCbs();
291+
292+
// Base de cálculo: 1000 (sem deduções)
293+
// Alíquota com redução: 0.90 × (1 - 1.00) = 0%
294+
// CBS = 1000 × 0% = 0.00
295+
Assert.Equal(1000.00m, resultadoCalculoCbs.BaseCalculo);
296+
Assert.Equal(0.00m, resultadoCalculoCbs.Valor);
297+
}
298+
299+
[Fact]
300+
public void CalculoCbsSemReducaoAliquota()
301+
{
302+
var produto = new Produto
303+
{
304+
PercentualCbs = 0.90m,
305+
PercentualReducaoCbs = 0.00m, // Sem redução
306+
ValorProduto = 1000.00m,
307+
QuantidadeProduto = 1.000m,
308+
PercentualPis = 0.00m,
309+
PercentualCofins = 0.00m,
310+
PercentualIcms = 0.00m
311+
};
312+
313+
var facade = new FacadeCalculadoraTributacao(produto);
314+
315+
var resultadoCalculoCbs = facade.CalculaCbs();
316+
317+
// Base de cálculo: 1000 (sem deduções)
318+
// Alíquota sem redução: 0.90%
319+
// CBS = 1000 × 0.90% = 9.00
320+
Assert.Equal(1000.00m, resultadoCalculoCbs.BaseCalculo);
321+
Assert.Equal(9.00m, resultadoCalculoCbs.Valor);
322+
}
248323
}
249324
}

src/TestesUnitarios/CalculoIbsMunicipalTest.cs

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,5 +269,80 @@ public void CalculoIbsMunicipalETotalComAmbosComponentes()
269269
var ibsTotal = resultadoIbsUF.Valor + resultadoIbsMunicipal.Valor;
270270
Assert.Equal(109.13m, ibsTotal);
271271
}
272+
273+
[Fact]
274+
public void CalculoIbsMunicipalComReducaoAliquota()
275+
{
276+
var produto = new Produto
277+
{
278+
PercentualIbsMunicipal = 0.90m,
279+
PercentualReducaoIbsMunicipal = 50.00m, // 50% de redução
280+
ValorProduto = 1000.00m,
281+
QuantidadeProduto = 1.000m,
282+
PercentualPis = 0.00m,
283+
PercentualCofins = 0.00m,
284+
PercentualIcms = 0.00m
285+
};
286+
287+
var facade = new FacadeCalculadoraTributacao(produto);
288+
289+
var resultadoCalculoIbsMunicipal = facade.CalculaIbsMunicipal();
290+
291+
// Base de cálculo: 1000 (sem deduções)
292+
// Alíquota com redução: 0.90 × (1 - 0.50) = 0.45%
293+
// IBS Municipal = 1000 × 0.45% = 4.50
294+
Assert.Equal(1000.00m, resultadoCalculoIbsMunicipal.BaseCalculo);
295+
Assert.Equal(4.50m, resultadoCalculoIbsMunicipal.Valor);
296+
}
297+
298+
[Fact]
299+
public void CalculoIbsMunicipalComReducaoAliquota100Porcento()
300+
{
301+
var produto = new Produto
302+
{
303+
PercentualIbsMunicipal = 0.90m,
304+
PercentualReducaoIbsMunicipal = 100.00m, // 100% de redução = alíquota zero
305+
ValorProduto = 1000.00m,
306+
QuantidadeProduto = 1.000m,
307+
PercentualPis = 0.00m,
308+
PercentualCofins = 0.00m,
309+
PercentualIcms = 0.00m
310+
};
311+
312+
var facade = new FacadeCalculadoraTributacao(produto);
313+
314+
var resultadoCalculoIbsMunicipal = facade.CalculaIbsMunicipal();
315+
316+
// Base de cálculo: 1000 (sem deduções)
317+
// Alíquota com redução: 0.90 × (1 - 1.00) = 0%
318+
// IBS Municipal = 1000 × 0% = 0.00
319+
Assert.Equal(1000.00m, resultadoCalculoIbsMunicipal.BaseCalculo);
320+
Assert.Equal(0.00m, resultadoCalculoIbsMunicipal.Valor);
321+
}
322+
323+
[Fact]
324+
public void CalculoIbsMunicipalSemReducaoAliquota()
325+
{
326+
var produto = new Produto
327+
{
328+
PercentualIbsMunicipal = 0.90m,
329+
PercentualReducaoIbsMunicipal = 0.00m, // Sem redução
330+
ValorProduto = 1000.00m,
331+
QuantidadeProduto = 1.000m,
332+
PercentualPis = 0.00m,
333+
PercentualCofins = 0.00m,
334+
PercentualIcms = 0.00m
335+
};
336+
337+
var facade = new FacadeCalculadoraTributacao(produto);
338+
339+
var resultadoCalculoIbsMunicipal = facade.CalculaIbsMunicipal();
340+
341+
// Base de cálculo: 1000 (sem deduções)
342+
// Alíquota sem redução: 0.90%
343+
// IBS Municipal = 1000 × 0.90% = 9.00
344+
Assert.Equal(1000.00m, resultadoCalculoIbsMunicipal.BaseCalculo);
345+
Assert.Equal(9.00m, resultadoCalculoIbsMunicipal.Valor);
346+
}
272347
}
273348
}

src/TestesUnitarios/CalculoIbsTest.cs

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,5 +234,80 @@ public void CalculoIbsComValorDecimal()
234234
Assert.Equal(114.86m, resultadoCalculoIbs.BaseCalculo);
235235
Assert.Equal(9.76m, resultadoCalculoIbs.Valor);
236236
}
237+
238+
[Fact]
239+
public void CalculoIbsComReducaoAliquota()
240+
{
241+
var produto = new Produto
242+
{
243+
PercentualIbsUF = 0.90m,
244+
PercentualReducaoIbsUf = 50.00m, // 50% de redução
245+
ValorProduto = 1000.00m,
246+
QuantidadeProduto = 1.000m,
247+
PercentualPis = 0.00m,
248+
PercentualCofins = 0.00m,
249+
PercentualIcms = 0.00m
250+
};
251+
252+
var facade = new FacadeCalculadoraTributacao(produto);
253+
254+
var resultadoCalculoIbs = facade.CalculaIbs();
255+
256+
// Base de cálculo: 1000 (sem deduções)
257+
// Alíquota com redução: 0.90 × (1 - 0.50) = 0.45%
258+
// IBS UF = 1000 × 0.45% = 4.50
259+
Assert.Equal(1000.00m, resultadoCalculoIbs.BaseCalculo);
260+
Assert.Equal(4.50m, resultadoCalculoIbs.Valor);
261+
}
262+
263+
[Fact]
264+
public void CalculoIbsComReducaoAliquota100Porcento()
265+
{
266+
var produto = new Produto
267+
{
268+
PercentualIbsUF = 0.90m,
269+
PercentualReducaoIbsUf = 100.00m, // 100% de redução = alíquota zero
270+
ValorProduto = 1000.00m,
271+
QuantidadeProduto = 1.000m,
272+
PercentualPis = 0.00m,
273+
PercentualCofins = 0.00m,
274+
PercentualIcms = 0.00m
275+
};
276+
277+
var facade = new FacadeCalculadoraTributacao(produto);
278+
279+
var resultadoCalculoIbs = facade.CalculaIbs();
280+
281+
// Base de cálculo: 1000 (sem deduções)
282+
// Alíquota com redução: 0.90 × (1 - 1.00) = 0%
283+
// IBS UF = 1000 × 0% = 0.00
284+
Assert.Equal(1000.00m, resultadoCalculoIbs.BaseCalculo);
285+
Assert.Equal(0.00m, resultadoCalculoIbs.Valor);
286+
}
287+
288+
[Fact]
289+
public void CalculoIbsSemReducaoAliquota()
290+
{
291+
var produto = new Produto
292+
{
293+
PercentualIbsUF = 0.90m,
294+
PercentualReducaoIbsUf = 0.00m, // Sem redução
295+
ValorProduto = 1000.00m,
296+
QuantidadeProduto = 1.000m,
297+
PercentualPis = 0.00m,
298+
PercentualCofins = 0.00m,
299+
PercentualIcms = 0.00m
300+
};
301+
302+
var facade = new FacadeCalculadoraTributacao(produto);
303+
304+
var resultadoCalculoIbs = facade.CalculaIbs();
305+
306+
// Base de cálculo: 1000 (sem deduções)
307+
// Alíquota sem redução: 0.90%
308+
// IBS UF = 1000 × 0.90% = 9.00
309+
Assert.Equal(1000.00m, resultadoCalculoIbs.BaseCalculo);
310+
Assert.Equal(9.00m, resultadoCalculoIbs.Valor);
311+
}
237312
}
238313
}

src/TestesUnitarios/Entidade/Produto.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,5 +69,8 @@ public Produto()
6969
public decimal PercentualIbsUF { get; set; }
7070
public decimal PercentualIbsMunicipal { get; set; }
7171
public decimal PercentualCbs { get; set; }
72+
public decimal PercentualReducaoIbsUf { get; set; }
73+
public decimal PercentualReducaoIbsMunicipal { get; set; }
74+
public decimal PercentualReducaoCbs { get; set; }
7275
}
7376
}

0 commit comments

Comments
 (0)