Biblioteca Python para cálculo de emolumentos de cartório do Paraná, indexados por VRCext, conforme a Lei Estadual PR nº 21.869/2023 (FUNREJUS).
Entra o tipo de ato e o valor da transação; sai o emolumento detalhado, com o breakdown de cada componente — não apenas o total.
Status:
0.2.1— funcional. Motor completo, com a Tabela XI oficial e o valor real da VRCext. Compra e venda, doação (com/sem usufruto), escritura sem valor e procuração reconciliam com o sistema do cartório à casa do milésimo.
Por que isto não é trivial
Calcular emolumento não é "multiplicar por uma alíquota". A regra do PR envolve faixas de valor do ato, indexação por uma unidade estadual (VRCext) que é reajustada periodicamente, um teto legal e componentes acessórios (FUNREJUS, FUNDEP, ISSQN, selo, distribuidor) — cada um com sua própria lógica. O mesmo conjunto de documentos apresentado por um cliente pode servir a atos diferentes, com emolumentos diferentes. Traduzir esse emaranhado jurídico-financeiro em código correto e testado é o objetivo desta biblioteca.
Instalação
pip install emolumentos-pr
# ou, em desenvolvimento:
pip install -e ".[dev]"
Uso
Como biblioteca:
from decimal import Decimal
from emolumentos_pr import Ato, TipoAto, calcular
ato = Ato(tipo=TipoAto.COMPRA_E_VENDA, objetos=(Decimal("250000"),))
resultado = calcular(ato)
print(resultado.total) # Decimal('2043.414')
for componente in resultado.componentes:
print(componente.nome, componente.valor)
Vários imóveis na mesma escritura, doação com usufruto e procuração:
# dois imóveis (cada um a 100%; distribuidor uma vez; selo por traslado)
calcular(Ato(tipo=TipoAto.COMPRA_E_VENDA, objetos=(Decimal("50000"), Decimal("30000"))))
# doação com usufruto (dobra o Funrejus)
calcular(Ato(tipo=TipoAto.DOACAO, objetos=(Decimal("80000"),), usufruto=True))
# procuração com partes que acrescem
calcular(Ato(tipo=TipoAto.PROCURACAO, partes_adicionais=2))
Entrada e saída para interfaces (web/API):
from emolumentos_pr import parse_valor, formatar_brl, resultado_para_dict
valor = parse_valor("250.000,00") # aceita formato brasileiro e internacional
resultado = calcular(Ato(tipo=TipoAto.COMPRA_E_VENDA, objetos=(valor,)))
formatar_brl(resultado.total) # "R$ 2.043,41"
resultado_para_dict(resultado) # dict pronto para JSON (Decimal como string)
Pela linha de comando (aceita vírgula ou ponto):
emolpr calcular --tipo compra_e_venda --valor 250000
emolpr calcular --tipo compra_e_venda --valor 50000 --valor 30000 # dois imóveis
emolpr calcular --tipo doacao --valor 80000 --usufruto
emolpr calcular --tipo procuracao --partes 2
emolpr calcular --tipo sem_valor
Decisões de design
Escolhas deliberadas — cada uma tem um porquê que vale saber explicar:
Decimalem todo valor monetário, nuncafloat. Float acumula erro de arredondamento; inaceitável em cálculo financeiro/legal.- Truncamento fiel à Tabela XI. O emolumento é truncado em centavos (não arredondado), como a tabela oficial faz — é o que faz os totais baterem.
- Núcleo sem dependências. O pacote instala e roda só com a biblioteca
padrão. A CLI usa
argparse. - Cálculo em funções puras. A regra de negócio não faz I/O e não guarda estado — mesma entrada, mesma saída. Isso é o que torna a suíte de testes confiável.
- Resultado sempre auditável. O retorno traz o breakdown de componentes, não só a soma — dá para ver de onde veio cada centavo.
- Dados da lei isolados. Tabelas e VRCext ficam em módulos próprios; atualizar a lei é editar dado, não caçar número mágico no meio da lógica.
- Formatar não é calcular. Parsing de entrada e formatação em R$/JSON vivem
no módulo
formatacao, separados do motor — cada interface põe a sua casca.
Documentação
docs/COMO_FUNCIONA.md— guia de arquitetura: o domínio, cada módulo, as fórmulas e as decisões de design.examples/experimentar.py— playground interativo no terminal.
Roadmap
Implementado:
- Motor de cálculo (faixas, indexação por VRCext, truncamento, breakdown)
- Tabela XI completa de faixas e VRCext oficial (0,277)
- Componentes: Funrejus (0,2% e 25%), FUNDEP, ISSQN, Selo, Distribuidor
- Compra e venda, doação (com/sem usufruto), escritura sem valor, procuração
- Multiobjeto em CEV/doação (100% por imóvel)
- Módulo
formatacao(parse de entrada BR, formatação R$, serialização JSON) - CLI aceitando formato brasileiro
- Empacotamento, CI e publicação automatizada no PyPI
- Casos oficiais reconciliando à casa do milésimo em
tests/
Previsto (a estrutura já suporta; falta o dado e um exemplo real para reconciliar cada um):
- Partilha (divórcio/inventário) — item X.b: bem de maior valor a 100%, cada adicional (até nove) a 80%.
- Apartamento + garagem com matrícula autônoma — item X.c: garagem a 50%.
- Testamento — modalidades (público, cerrado, revogação) com valores próprios.
- Demais atos da Tabela XI: reconhecimento de firma, autenticação, atas notariais, certidões, pública forma, buscas.
Resíduo conhecido: o total da procuração fecha a ~0,003 (os exemplos de sem-valor e procuração discordam na 3ª casa do arredondamento do Funrejus de 25%). Um printout novo do sistema pina a regra.
Fora do escopo (propositalmente): interface web pronta, front-end, banco de
dados, múltiplos estados. O módulo formatacao prepara o terreno para
interfaces, mas a biblioteca em si é só o motor de cálculo.
Licença
MIT — veja LICENSE.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file emolumentos_pr-0.4.0.tar.gz.
File metadata
- Download URL: emolumentos_pr-0.4.0.tar.gz
- Upload date:
- Size: 1.2 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
429e31199c8926165c05e116eb5d001a4f56a41670f3e5487bf41caa304f0408
|
|
| MD5 |
ac59a6f9de55527877393ea3e071d4bb
|
|
| BLAKE2b-256 |
d3880b8d4ac7c6ce4bf64601f98abfe855f536df3732bba40e47b0af1cdf726b
|
Provenance
The following attestation bundles were made for emolumentos_pr-0.4.0.tar.gz:
Publisher:
ci.yml on jefersonbraine/emolumentos-pr
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
emolumentos_pr-0.4.0.tar.gz -
Subject digest:
429e31199c8926165c05e116eb5d001a4f56a41670f3e5487bf41caa304f0408 - Sigstore transparency entry: 2329335206
- Sigstore integration time:
-
Permalink:
jefersonbraine/emolumentos-pr@8343cb6b0d00b5da631e1c618e25a262388fb699 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/jefersonbraine
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@8343cb6b0d00b5da631e1c618e25a262388fb699 -
Trigger Event:
push
-
Statement type:
File details
Details for the file emolumentos_pr-0.4.0-py3-none-any.whl.
File metadata
- Download URL: emolumentos_pr-0.4.0-py3-none-any.whl
- Upload date:
- Size: 15.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2772fb37cf5fd95d2c522819f72182c7cc22bc92505994b9f37c87bec4d9fdd8
|
|
| MD5 |
c152eb8e0188d0310218f83eccccc88e
|
|
| BLAKE2b-256 |
dd0b28cf140ef965eea41fea0229a9bb494ff5e66b5412f96a1c8ebaf8f08b92
|
Provenance
The following attestation bundles were made for emolumentos_pr-0.4.0-py3-none-any.whl:
Publisher:
ci.yml on jefersonbraine/emolumentos-pr
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
emolumentos_pr-0.4.0-py3-none-any.whl -
Subject digest:
2772fb37cf5fd95d2c522819f72182c7cc22bc92505994b9f37c87bec4d9fdd8 - Sigstore transparency entry: 2329335618
- Sigstore integration time:
-
Permalink:
jefersonbraine/emolumentos-pr@8343cb6b0d00b5da631e1c618e25a262388fb699 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/jefersonbraine
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@8343cb6b0d00b5da631e1c618e25a262388fb699 -
Trigger Event:
push
-
Statement type: