1

[Pitch] Fiz 21 calculadoras trabalhistas com as regras da CLT versionadas por data: o que aprendi

Nos últimos meses construí o CLTudo (https://cltudo.com.br/?utm_source=tabnews), um site com 21 calculadoras trabalhistas gratuitas: rescisão, férias, 13º, salário líquido, hora extra, FGTS, seguro-desemprego, CLT x PJ e outras.

A ideia é mostrar a conta, não só o resultado. Cada cálculo vem com o passo a passo, para a pessoa conferir o holerite ou o termo de rescisão. Quero contar algumas decisões técnicas, porque cálculo trabalhista tem mais armadilhas do que parece.

Stack

  • Next.js (App Router) + TypeScript, deploy na Vercel
  • Vitest para o motor de cálculo e Playwright para os testes de ponta a ponta
  • Tudo roda no navegador: salário e datas não vão para nenhum servidor

1. Regras versionadas por data de vigência

Faixa de INSS, tabela do IR, salário mínimo e teto mudam todo ano, às vezes no meio do ano. Uma rescisão de 2024 precisa ser calculada com as tabelas de 2024, mesmo que a conta seja feita hoje.

Por isso, o motor nunca tem número fixo. Os valores ficam em conjuntos de regras, cada um com effectiveFrom e a lista de fontes oficiais, validados por schema:

export function getRulesFor(date: Date, ruleSets = fallbackRuleSets): RuleSet {
  const candidates = ruleSets
    .filter((rs) => new Date(rs.effectiveFrom).getTime() <= date.getTime())
    .sort((a, b) => new Date(b.effectiveFrom).getTime() - new Date(a.effectiveFrom).getTime());
  // ...
}

Quando a lei muda, crio um conjunto novo e não mexo no motor. Na rescisão, a data de referência é a do desligamento, não a de hoje.

2. Dinheiro em centavos inteiros

Todo valor é Cents (inteiro). Parece óbvio, mas o detalhe está na ordem das operações. Férias de 30 dias precisam dar exatamente um salário, então a conta multiplica antes de dividir:

// 30 dias de férias valem exatamente um salário.
const takenValue = divide(remunerationBase * input.daysTaken, 30);

No INSS progressivo, cada faixa é arredondada separadamente, mas o total precisa bater com o da folha. O motor acumula o valor exato e a última faixa absorve a diferença de arredondamento, para que as faixas exibidas somem o total.

3. As regras que mais deram trabalho

  • Projeção do aviso prévio: o aviso indenizado conta como tempo de serviço. O contrato "termina" no fim do aviso, o que muda os avos de 13º e de férias e pode até completar mais um ano de casa. Quase todo erro de TRCT que vi vem daqui.
  • Acordo (art. 484-A): a lei manda pagar metade do aviso, mas não diz se a projeção também cai pela metade. Escolhi a leitura mais comum e o resultado avisa que há outra possível.
  • IR de 2026: a Lei 15.270/2025 criou um redutor depois da tabela, que zera o imposto até R$ 5.000 e vai diminuindo até R$ 7.350. Nessa faixa, um aumento perde perto de metade em descontos, e fiz um simulador só para mostrar isso.
  • CLT x PJ: o motor testa os Anexos III e V do Simples (fator R) e acha por busca binária o faturamento PJ que empata com o pacote CLT.

4. Os textos saem do motor

Cada página tem exemplos resolvidos e um guia explicando a conta. Os números desses textos vêm do mesmo motor da calculadora. Se uma tabela muda, o texto muda junto, sem chance de o guia dizer uma coisa e a calculadora outra.

5. Uma ferramenta que gostei de fazer: conferir a rescisão

A pessoa copia os valores do Termo de Rescisão (TRCT) e a página compara verba por verba com o que é devido. Ela aceita diferenças de centavos, porque cada sistema de folha arredonda de um jeito, e mostra uma faixa quando a lei admite duas leituras.


Está tudo em https://cltudo.com.br/?utm_source=tabnews. Feedback é muito bem-vindo, principalmente de quem trabalha com folha de pagamento ou direito do trabalho: se alguma conta não bater com a sua realidade, quero saber.

Carregando publicação patrocinada...