[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.