Tributus Engine - Brazilian Tax Engine and Calculator Library
Project description
Tributus Engine (Pacote Python)
Pacote Python da biblioteca Tributus Engine para cálculo tributário brasileiro.
Versão: 0.5.2
Requer: Python ≥ 3.10, Pydantic ≥ 2.13.4
Licença: AGPL v3
Instalação
pip install tributus-engine
O que a biblioteca cobre
- ICMS — CSTs: 00, 10, 20, 30, 51, 70, 90, 101, 201, 202/203, 900
- FCP — Fundo de Combate à Pobreza (próprio, ST e diferido)
- IPI — Ad valorem e específico (por unidade)
- PIS — Ad valorem (CST 01/02) e específico (CST 03)
- COFINS — Ad valorem (CST 01/02) e específico (CST 03)
- IBS — Imposto sobre Bens e Serviços (Reforma Tributária)
- CBS — Contribuição sobre Bens e Serviços (Reforma Tributária)
- Biblioteca de cálculo tributário com método centralizado via payload JSON
- Validação de entrada via schemas Pydantic
- Modo de cálculo ad valorem (percentual) e específico (por unidade)
- Catálogo fiscal por NCM/CEST e UF (planejado)
Casos de uso
- Cálculo fiscal em ERP
- API REST de tributação
- Simulação de impacto tributário por produto
- Cenários com alíquota manual para homologação e testes
Uso Rápido
1) Engine simplificada com payload dict
from tributus_engine import TaxEngine
engine = TaxEngine()
payload = {
"values": {
"quantity": 5,
"unit_price": 200.00,
"gross_value": 1000.00,
"discount_value": 100.00,
"freight_value": 50.00,
"insurance_value": 10.00,
"other_expenses": 20.00
},
"taxes": {
"icms": {
"cst": "00",
"aliquota_icms_proprio": 17.00
},
"ipi": {
"aliquota_ipi": 10.00
},
"pis": {
"aliquota_pis": 1.20
},
"cofins": {
"aliquota_cofins": 5.40
},
"ipi": {
"aliquota_ipi": 10
}
}
}
result = engine.calculate_from_dict(payload)
# Retorno simplificado (detailed=False)
# {'amounts': {'ipi': '108.00', 'icms': '184.96', 'pis': '9.54', 'cofins': '42.93'},
# 'messages': [],
# 'total': '345.43'}
2) Estrutura de taxes suportada
Cada imposto é ativado simplesmente declarando seu bloco dentro de taxes.
Campos aceitos por imposto:
ipi:aliquota_ipi(porcentagem, modo ad valorem) oumode: "specific"+aliquota_por_unidade+base_calculo(modo específico).icms:cst,aliquota_icms_proprio,aliquota_icms_st,mva,percentual_reducao,percentual_reducao_st,percentual_diferimento,percentual_credito_sn,include_ipi_in_base(bool, padrãoTrue).fcp:aliquota_fcp,aliquota_fcp_st,aliquota_diferimento_fcp,use_st_base(bool).fcp_st:aliquota_fcp_st.pis:aliquota_pis(porcentagem) oumode: "specific"+aliquota_por_unidade+base_calculo.cofins:aliquota_cofins(porcentagem) oumode: "specific"+aliquota_por_unidade+base_calculo.ibs:aliquota_efetiva_percentual,percentual_diferimento.cbs:aliquota_efetiva_percentual,percentual_diferimento.
Regras:
- Se o bloco do imposto existe em
taxes, ele é considerado ativo e será calculado. - Se a alíquota não estiver configurada dentro do bloco, o cálculo é ignorado e uma mensagem é adicionada em
result.messages. - Se o bloco não existir, o imposto é simplesmente ignorado.
- O campo
enabled(lista de strings) pode ser usado para habilitar tributos explicitamente, inclusive nomes como"icms_st","fcp_st","fcp_diferido","icms_credito_sn".
3) Retorno completo (detailed=True)
{
"taxes": {
"ipi": {"base": "1080.00", "rate": "10.00", "amount": "108.00", "metadata": {"mode": "ad_valorem"}},
"icms": {"base": "1088.00", "rate": "17.00", "amount": "184.96", "metadata": {"type": "Icms00"}},
"pis": {"base": "795.04", "rate": "1.20", "amount": "9.54", "metadata": {"mode": "ad_valorem"}},
"cofins": {"base": "795.04", "rate": "5.40", "amount": "42.93", "metadata": {"mode": "ad_valorem"}}
},
"calculation_order": ["ipi", "icms", "pis", "cofins"],
"messages": [],
"total": "345.43"
}
4) Validação direta com schemas Pydantic
Os schemas de payload podem ser usados diretamente para validar dados:
from tributus_engine import PayloadSchema
payload_validado = PayloadSchema.model_validate(payload)
# Se inválido, levanta ValidationError com mensagens descritivas
5) Uso avançado: ICMS com CST 10 (com ST) + FCP
payload = {
"values": {
"gross_value": "1500.00",
"discount_value": "0.00",
"freight_value": "50.00",
"insurance_value": "10.00",
"other_expenses": "20.00"
},
"taxes": {
"icms": {
"cst": "10",
"aliquota_icms_proprio": "12.00",
"aliquota_icms_st": "18.00",
"mva": "40.00"
},
"fcp": {
"aliquota_fcp": "2.00",
"aliquota_fcp_st": "2.00"
}
}
}
result = engine.calculate_from_dict(payload, detailed=True)
# Inclui icms, icms_st, fcp e fcp_st
Ordem de cálculo
A engine resolve automaticamente a ordem de dependência entre os tributos:
- IPI (calculado primeiro, pode compor base do ICMS)
- ICMS (depende do IPI; PIS/COFINS dependem do ICMS)
- FCP (depende do ICMS)
- PIS (depende do ICMS para dedução na base)
- COFINS (depende do ICMS para dedução na base)
- IBS / CBS (independentes, calculados por último)
Tratamento de erros
Quando o payload é inválido, a engine retorna mensagens descritivas em português:
payload_invalido = {"values": {}, "taxes": {}}
result = engine.calculate_from_dict(payload_invalido)
print(result.messages)
# ['chave inválida em \'values → quantity\': não é um campo reconhecido']
CSTs de ICMS suportados
| CST | Descrição |
|---|---|
| 00 | Tributação integral |
| 10 | Tributação + ST |
| 20 | Base reduzida |
| 30 | Isento / não tributado + ST |
| 51 | Diferimento |
| 70 | Redução + ST |
| 90 | Outras (com redução, ST, etc.) |
| 101 | Simples Nacional — crédito |
| 201 | Simples Nacional — crédito + ST |
| 202/203 | Simples Nacional — ST |
| 900 | Outras (Simples Nacional) |
Desenvolvimento
# Instalar em modo editável
python -m pip install -e .
# Instalar dependências de desenvolvimento
python -m pip install -e ".[dev]"
# Executar testes
python -m pytest tests
# Com cobertura
python -m pytest tests --cov=tributus_engine
Licença
GNU Affero General Public License v3 © 2026 Mackilem Van der Laan
Este programa é software livre: você pode redistribuí-lo e/ou modificá-lo sob os termos da GNU Affero General Public License publicada pela Free Software Foundation, versão 3 da Licença, ou (a seu critério) qualquer versão posterior.
Project details
Release history Release notifications | RSS feed
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 tributus_engine-0.5.2.tar.gz.
File metadata
- Download URL: tributus_engine-0.5.2.tar.gz
- Upload date:
- Size: 26.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
796d99a201d85017c66912a09aaa331b2df62f264c84f7d5d0eab72eefdf9e1f
|
|
| MD5 |
7b18e094c911d58779ceae08c04b135b
|
|
| BLAKE2b-256 |
275e47980971dbfc10d7b343f3a4a1007a0513f5f1437b473a237450ac83e1d1
|
File details
Details for the file tributus_engine-0.5.2-py3-none-any.whl.
File metadata
- Download URL: tributus_engine-0.5.2-py3-none-any.whl
- Upload date:
- Size: 24.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3c1eb252f63c470cc5284d5b3c272e58ba20f3521ac95fe091167973f279642e
|
|
| MD5 |
a094674e91e84854013a59fdb8842d70
|
|
| BLAKE2b-256 |
849f8f6565eeedd09405fd5860ffd779e7694d89dfaa984411765615bc60d624
|