Appearance
@fc/calculos-previdenciarios
O núcleo previdenciário: o que o RGPS e o RPPS têm em comum. Não é o motor de nenhum dos dois — é o vocabulário e a estrutura que os dois falam.
Os regimes vivem em pacotes próprios, irmãos, e ambos estendem este:
| pacote | o que é |
|---|---|
@fc/calculos-rgps | Regime Geral: RMI, atrasados, evolução de benefício, fator previdenciário, qualidade de segurado, leitura dos documentos do INSS |
@fc/calculos-rpps | Regime Próprio dos servidores do Judiciário da União |
Depende de @fc/comum, @fc/calculos-judiciais, @fc/utils, @fc/parsers e @fc/arquivos-calc.
O que faz um símbolo pertencer a este pacote
O critério é positivo: está aqui o que é comum aos dois regimes, medido por três lentes.
| lente | pergunta |
|---|---|
| uso | os dois regimes importam o mesmo arquivo? |
| duplicação | o mesmo código existe nos dois em cópia? |
| semântica | é o mesmo conceito sob nomes diferentes? |
A terceira é a que orienta o desenho: onde há conceito comum, há superclasse. O que não passa em nenhuma das três sai daqui para o pacote do regime que o usa — independentemente de como se chame.
Regra de nomenclatura: o conceito neutro fica com o nome genérico do domínio; as duas especializações levam o sufixo do regime. PeriodoContribuicao é o período de qualquer regime; PeriodoRgps e PeriodoRpps são os irmãos.
A hierarquia
| base (aqui) | estende | filho RGPS | filho RPPS | ponto de variação |
|---|---|---|---|---|
CalendarioContagem | — | Calendario360 | Calendario365, CalendarioCorrido | adicionarDias(), dias() |
PeriodoContribuicao | Periodo (@fc/calculos-judiciais) | PeriodoRgps | PeriodoRpps | obterParcialTempo(), peso, tempo |
PeriodosContribuicao | Periodos | PeriodosRgps | PeriodosRpps | contaComoVinculo, ehBeneficio |
Segurado | Entidade (@fc/comum) | SeguradoRgps | SeguradoRpps | idadeEmDias() — o calendário |
Historico | — | HistoricoRgps | HistoricoRpps | iniciarTotal(), adicionarTotal() |
DadosCalculo | Entidade | DadosCalculoRgps | DadosCalculoRpps | der, dataApuracao, historico |
Requisito | — | RequisitoRgps | RequisitoRpps | formatar(), implementadoEm(), calcular() |
RegrasConcessao | — | RegrasConcessaoRgps | RegrasConcessaoRpps | obter(), percorrerRequisitos(), filtrarResultados() |
AnaliseBeneficios | — | AnaliseBeneficiosRgps | AnaliseBeneficiosRpps | apurar() |
Os dois eixos de variação entre os regimes são a aritmética de dias (o RGPS conta em ano de 360; o RPPS em 365 ou data a data) e os períodos postergados. O primeiro está isolado em CalendarioContagem.
Módulos
| módulo | conteúdo |
|---|---|
entidades | as bases da hierarquia acima, mais PeriodoPcd, PeriodosPcd e Salario |
parametros | o vocabulário que os dois regimes falam: Sexo, FormaContagem, TipoContagem, GrauDeficiencia, MotivoContagem, Origem, NaturezaVinculo, Pesos, MARCOS_TEMPORAIS |
requisitos | o contrato Requisito, o CalendarioContagem e as peças de contagem que os dois usam |
analise-beneficios | RegrasConcessao (o pipeline como template method), AnaliseBeneficios, e as regras que os dois compartilham — a apuração da data de implementação e o coeficiente progressivo do art. 26, § 2º, da EC 103 |
calculo-tc | a aritmética de tempo: parcial, preponderante, totais, competências |
persistencia | migração do vocabulário legado dos .calc — ordinais e chaves de competência |
rmi-desvinculada | os parâmetros de uma RMI informada pelo usuário, que os dois regimes aceitam |
A fronteira, por regra
Uma cerca de lint (fc/cerca-nucleo-previdenciario, em @fc/eslint-config) impede que este pacote importe qualquer um dos dois regimes — se importasse, deixaria de ser o que eles têm em comum. Duas cercas irmãs impedem que um regime importe o outro.
Há uma exceção, nomeada e estreita: @fc/calculos-rpps/contagem-reciproca/ e documentos/importacao/ podem importar @fc/calculos-rgps. A contagem recíproca (art. 201, § 9º, da CF, e Lei 9.796/1999) é o instituto pelo qual o tempo de RGPS entra na contagem do RPPS, provado por CTC do INSS, CNIS ou dossiê do PrevJud — e ler esses documentos é capacidade do RGPS. Alargar a lista é decisão de arquitetura, não conveniência de import.
Como consumir
O pacote não tem barrel: nem src/index.ts de raiz nem index.ts de pasta. O exports publica cada pasta de src/ por wildcard (@fc/calculos-previdenciarios/<pasta>/*), e o consumidor importa o arquivo que declara o símbolo:
ts
import { PeriodoContribuicao } from '@fc/calculos-previdenciarios/entidades/PeriodoContribuicao'
import { Segurado } from '@fc/calculos-previdenciarios/entidades/Segurado'
import { FormaContagem } from '@fc/calculos-previdenciarios/parametros/forma-contagem/FormaContagem'
import { RegrasConcessao } from '@fc/calculos-previdenciarios/analise-beneficios/RegrasConcessao'O import pela raiz não resolve e é barrado pela cerca fc/cerca-pacotes-sem-barrel-raiz.
Parâmetros de domínio
Cada parâmetro é um dicionário as const com tipo homônimo, em pasta própria em kebab-case (parametros/<parametro>/<Parametro>.ts), com chaves em CAPITAL_CASE — FormaContagem.ESPECIAL_25, Sexo.MASCULINO. As auxiliares são funções livres, uma por arquivo: obterOpcoes<Nome>, obterRotulo<Nome>, eh<Nome>Valido. Sem enum, sem namespace, sem barrel — travado por teste de arquitetura (tests/arquitetura/parametros-por-pasta.spec.ts).
Instalação (monorepo)
jsonc
// package.json
{ "dependencies": { "@fc/calculos-previdenciarios": "workspace:*" } }