Uma biblioteca TypeScript robusta e fácil de usar para calcular impostos sobre a folha de pagamento (CLT) no Brasil, incluindo INSS, IRPF e PLR.
O objetivo desta biblioteca é simplificar o cálculo complexo dos principais impostos brasileiros no contexto do pagador de impostos, que envolvem faixas progressivas, deduções específicas e variações temporais de alíquotas. Ela é ideal para sistemas de RH, calculadoras financeiras ou qualquer aplicação que precise simular o salário líquido e encargos de um trabalhador.
MapaChaveAnoMes) para lidar com tabelas históricas de forma precisa, resolvendo problemas de comparação de objetos por referência.Number para formatação (toBRL, toPercent) e normalização de precisão financeira (normalizarPrecisao).npm install impostos-brasil
Requisitos: Node.js
>=22e npm>=10.
| Descrição | Link |
|---|---|
| Repositório: | https://github.com/salgueiroso/impostos-brasil |
| Exemplo Angular: | https://salgueiroso.github.io/impostos-brasil/angular_app |
| Documentação da API: | https://salgueiroso.github.io/impostos-brasil/ |
| Pacote NPM: | https://www.npmjs.com/package/impostos-brasil |
import 'impostos-brasil'; // Importa as extensões de protótipo (toBRL, toPercent, normalizarPrecisao)
import { calcularINSS } from 'impostos-brasil';
const resultado = calcularINSS(5000);
console.log(`Valor do INSS: ${resultado.vlImposto.toBRL()}`);
console.log(`Alíquota Efetiva: ${resultado.aliquotaEfetiva.toPercent()}`);
console.log(`Líquido: ${resultado.vlLiquido.toBRL()}`);
Também é possível informar uma vigência específica ou uma base de cálculo diferente do bruto:
import { calcularINSS, Meses, toAno } from 'impostos-brasil';
const resultado = calcularINSS(5000, {
vlBaseDeCalculo: 4800, // opcional: base diferente do bruto
vigenciaAno: toAno(2025),
vigenciaMes: Meses.Janeiro
});
O segundo parâmetro é um objeto de opções. A biblioteca suporta a regra de isenção progressiva (2025/2026).
import { calcularIRPF, Meses, toAno } from 'impostos-brasil';
const salarioBruto = 5000;
const baseCalculo = 4450; // Ex: Salário Bruto - INSS
const resultado = calcularIRPF(salarioBruto, {
vlBaseDeCalculo: baseCalculo,
usarIsencao5k7k: true, // Habilita isenção total até R$ 5.000 e progressiva até R$ 7.350
vigenciaAno: toAno(2025),
vigenciaMes: Meses.Janeiro
});
console.log(`Imposto Retido: ${resultado.vlImposto.toBRL()}`);
console.log(`Salário Líquido: ${resultado.vlLiquido.toBRL()}`);
Você pode optar pelo desconto simplificado do IRPF, que substitui as deduções legais se for mais vantajoso:
import { calcularIRPF, Meses, toAno } from 'impostos-brasil';
const salarioBruto = 3000;
const baseCalculo = 2750;
const resultado = calcularIRPF(salarioBruto, {
usarDescontoSimplificado: true,
vlDeducaoSimplificada: 564.80, // Opcional: injeta valor específico
vlBaseDeCalculo: baseCalculo,
usarIsencao5k7k: true, // padrão: true
vigenciaAno: toAno(2025),
vigenciaMes: Meses.Janeiro
});
console.log(`Imposto Retido: ${resultado.vlImposto.toBRL()}`);
console.log(`Salário Líquido: ${resultado.vlLiquido.toBRL()}`);
Atenção:
vlBaseDeCalculonão pode ser maior quevlBruto— a função lançaráParametroInvalidonesse caso.
A função calcularSerie projeta o ganho de um período completo, incluindo variáveis como férias, 13º salário e PLR.
import {
calcularSerie,
Ferias,
Meses,
TipoRecorrencia,
toAno
} from 'impostos-brasil';
const salarioBruto = 8000;
const resultadoAnual = calcularSerie({
qtdSeries: 12,
vlBruto: salarioBruto,
incluir13: true,
incluirFerias: Ferias.IgnorarPrimeiroAno,
mesFerias: Meses.Setembro,
percentualFerias: 1 / 3, // padrão: 1/3 constitucional
deducaoSaude: 0,
deducaoSaudeRecorrencia: TipoRecorrencia.Mensal,
deducaoInstrucao: 0,
deducaoInstrucaoRecorrencia: TipoRecorrencia.Anual,
mesPLR: Meses.Abril,
vlPLR: 5000,
vigenciaAno: toAno(2025),
vigenciaMes: Meses.Novembro,
usarDescontoSimplificadoIRPF: false // padrão: false
});
console.log(`Bruto Mensal: ${salarioBruto.toBRL()}`);
console.log(`Bruto Período: ${resultadoAnual.vlBrutoTotal.toBRL()}`);
console.log(`INSS Período: ${resultadoAnual.vlImpostoInssTotal.toBRL()}`);
console.log(`IRPF Período: ${resultadoAnual.vlImpostoIrpfTotal.toBRL()}`);
console.log(`Líquido Período: ${resultadoAnual.vlLiquidoTotal.toBRL()}`);
console.log(`Alíquota Efetiva: ${resultadoAnual.pAliquotaEfetivaTotal.toPercent()}`);
console.log(`Imposto Período: ${resultadoAnual.vlImpostoTotal.toBRL()}`);
for (const mes of resultadoAnual.meses) {
console.log(`Mês ${Meses[mes.anoMes.Mes]} (${mes.indice}):`);
console.log(` Informações: ${mes.informacoesAdicionais.join(', ')}`);
console.log(` Salário Bruto: ${mes.vlBruto.toBRL()}`);
console.log(` INSS: ${mes.inss.vlImposto.toBRL()}`);
console.log(` Base de cálculo IRPF: ${mes.irpf.vlBaseDeCalculo.toBRL()}`);
console.log(` IRPF: ${mes.irpf.vlImposto.toBRL()}`);
if (mes.irpfPLR) {
console.log(` Base de cálculo IRPF PLR: ${(mes.irpfPLR?.vlBaseDeCalculo ?? 0).toBRL()}`);
console.log(` IRPF PLR: ${(mes.irpfPLR?.vlImposto ?? 0).toBRL()}`);
}
console.log(` Salário Líquido: ${mes.vlLiquido.toBRL()}`);
}
ImpostoRetornado por calcularINSS e calcularIRPF:
| Propriedade | Tipo | Descrição |
|---|---|---|
vlImposto |
number |
Valor final a ser retido. |
vlLiquido |
number |
Valor líquido após o desconto do imposto. |
vlBruto |
number |
Valor bruto de referência utilizado no cálculo. |
vlBaseDeCalculo |
number |
Montante que efetivamente sofreu a tributação. |
aliquotaEfetiva |
number |
Percentual real pago sobre o bruto (vlImposto / vlBruto). |
faixas |
DeducaoFaixa[] |
Detalhamento de quanto foi cobrado em cada faixa progressiva. |
Para todas as propriedades, consulte a interface
Impostona documentação da API.
ImpostoAcumuladoRetornado por calcularSerie:
| Propriedade | Tipo | Descrição |
|---|---|---|
meses |
DadosDoMes[] |
Detalhamento individual de cada mês processado. |
vlBrutoTotal |
number |
Somatório de todos os rendimentos brutos do período. |
vlLiquidoTotal |
number |
Somatório dos rendimentos líquidos do período. |
vlImpostoTotal |
number |
Total retido (INSS + IRPF + IRPF PLR). |
vlImpostoInssTotal |
number |
Total retido de INSS. |
vlImpostoIrpfTotal |
number |
Total retido de IRPF mensal. |
vlImpostoIrpfPLRTotal |
number |
Total retido de imposto sobre PLR. |
vlDeducoesTotal |
number |
Somatório de todas as deduções no período. |
pAliquotaInssEfetiva |
number |
Alíquota efetiva média do INSS. |
pAliquotaIrpfEfetiva |
number |
Alíquota efetiva média do IRPF mensal. |
pAliquotaIrpfPLREfetiva |
number |
Alíquota efetiva média do imposto sobre PLR. |
pAliquotaEfetivaTotal |
number |
Carga tributária real total do período. |
OpcoesSerieParâmetro de calcularSerie:
| Propriedade | Tipo | Padrão | Descrição |
|---|---|---|---|
vlBruto |
number |
— | (obrigatório) Salário bruto mensal base. |
qtdSeries |
number |
12 |
Quantidade de meses a simular. |
incluir13 |
boolean |
false |
Inclui o cálculo do 13º salário em dezembro. |
incluirFerias |
Ferias |
Ferias.Nao |
Modo de aplicação das férias (Sim, Não, IgnorarPrimeiroAno). |
percentualFerias |
number |
1/3 |
Adicional de férias (1/3 constitucional por padrão). |
mesFerias |
Meses |
mês atual | Mês em que as férias são aplicadas. |
deducaoSaude |
number |
0 |
Valor das despesas de saúde a deduzir. |
deducaoSaudeRecorrencia |
TipoRecorrencia |
Anual |
Se o valor de saúde é mensal ou anual. |
deducaoInstrucao |
number |
0 |
Valor das despesas com instrução (limitado ao teto legal). |
deducaoInstrucaoRecorrencia |
TipoRecorrencia |
Anual |
Se o valor de instrução é mensal ou anual. |
vlPLR |
number |
0 |
Valor bruto da PLR. |
mesPLR |
Meses |
mês atual | Mês em que a PLR é provisionada. |
vigenciaAno |
Ano |
ano atual | Ano inicial para seleção das tabelas tributárias. |
vigenciaMes |
Meses |
mês atual | Mês inicial para seleção das tabelas tributárias. |
usarDescontoSimplificadoIRPF |
boolean |
false |
Aplica o desconto simplificado do IRPF como dedução. |
mapasDeFaixas |
OpcoesMapasFaixas | null |
null |
Tabelas customizadas de faixas (alternativa à vigência). |
A biblioteca utiliza tabelas de alíquotas oficiais persistidas em arquivos JSON, permitindo que o motor de cálculo selecione a regra tributária exata de acordo com o ano e mês da simulação.
As constantes com os mapas de vigência exportados são:
| Constante | Tipo | Descrição |
|---|---|---|
vigenciaFaixasInss |
MapaChaveAnoMes<AliquotasTetoFaixas> |
Tabelas progressivas do INSS por competência. |
vigenciaFaixasIrpf |
MapaChaveAnoMes<AliquotasTetoFaixas> |
Tabelas progressivas do IRPF mensal por competência. |
vigenciaFaixasIrpfPLR |
MapaChaveAnoMes<AliquotasTetoFaixas> |
Tabelas progressivas do IRPF sobre PLR por competência. |
vigenciaIrpfDescontoSimplificado |
MapaChaveAnoMes<number> |
Valores vigentes do desconto simplificado do IRPF. |
Você pode consultar os anos cobertos programaticamente:
import { vigenciaFaixasIrpf } from 'impostos-brasil';
const anosCobertos = Array.from(vigenciaFaixasIrpf.anos());
import { Meses, Ferias, TipoRecorrencia } from 'impostos-brasil';
// Meses: Janeiro = 1, Fevereiro = 2, ..., Dezembro = 12
// Ferias: Nao | Sim | IgnorarPrimeiroAno
// TipoRecorrencia: Mensal | Anual
import { toAno, toMes, getAnoMinimo } from 'impostos-brasil';
toAno(2025); // Converte number para o tipo Ano
toMes(0); // Converte índice base-0 (getMonth()) para Meses (Janeiro)
getAnoMinimo(); // Retorna o ano mínimo suportado pelas tabelas carregadas
NumberAo importar a biblioteca, os seguintes métodos são adicionados ao protótipo de Number:
import 'impostos-brasil';
(1250.5).toBRL(); // → "R$ 1.250,50"
(0.075).toPercent(); // → "7,5%"
(1.0050000000001).normalizarPrecisao(); // elimina erros de ponto flutuante
As funções equivalentes também são exportadas como standalone: toBRL(value), toPercent(value).
| Formato | Arquivo | Uso |
|---|---|---|
| ESM | dist/index.mjs |
Bundlers modernos (Vite, Webpack, etc.) |
| CJS | dist/index.cjs |
Node.js (require) |
| IIFE | dist/index.iife.js |
Browser via <script> |
| Types (ESM) | dist/index.d.mts |
TypeScript com ESM |
| Types (CJS) | dist/index.d.cts |
TypeScript com CJS |
O diretório exemplos/angular_app contém uma aplicação Angular 21 que demonstra o uso completo da biblioteca em um formulário reativo com:
Para rodar o exemplo:
cd exemplos/angular_app
npm install
npm start
cd pacote
npm test
Os testes cobrem calcularINSS, calcularIRPF, calcularSerie e todos os utilitários de alíquotas, datas, formatações e JSON.
Esta ferramenta é fornecida apenas para fins informativos e de simulação. Os cálculos gerados por esta biblioteca não devem ser utilizados para fins legais, contábeis ou oficiais.
Os resultados podem variar dependendo de interpretações específicas da legislação, benefícios variáveis ou convenções coletivas de trabalho. Para cálculos legalmente válidos, emissão de guias ou conformidade com a Receita Federal e eSocial, você deve sempre utilizar sistemas oficiais ou consultar um profissional contador habilitado.
Este projeto está sob a licença MIT. Veja o arquivo LICENSE para detalhes.
Desenvolvido por Acacio Salgueiro