Skip to main content

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) ou mode: "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ão True).
  • fcp: aliquota_fcp, aliquota_fcp_st, aliquota_diferimento_fcp, use_st_base (bool).
  • fcp_st: aliquota_fcp_st.
  • pis: aliquota_pis (porcentagem) ou mode: "specific" + aliquota_por_unidade + base_calculo.
  • cofins: aliquota_cofins (porcentagem) ou mode: "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:

  1. IPI (calculado primeiro, pode compor base do ICMS)
  2. ICMS (depende do IPI; PIS/COFINS dependem do ICMS)
  3. FCP (depende do ICMS)
  4. PIS (depende do ICMS para dedução na base)
  5. COFINS (depende do ICMS para dedução na base)
  6. 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tributus_engine-0.5.2.tar.gz (26.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

tributus_engine-0.5.2-py3-none-any.whl (24.7 kB view details)

Uploaded Python 3

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

Hashes for tributus_engine-0.5.2.tar.gz
Algorithm Hash digest
SHA256 796d99a201d85017c66912a09aaa331b2df62f264c84f7d5d0eab72eefdf9e1f
MD5 7b18e094c911d58779ceae08c04b135b
BLAKE2b-256 275e47980971dbfc10d7b343f3a4a1007a0513f5f1437b473a237450ac83e1d1

See more details on using hashes here.

File details

Details for the file tributus_engine-0.5.2-py3-none-any.whl.

File metadata

File hashes

Hashes for tributus_engine-0.5.2-py3-none-any.whl
Algorithm Hash digest
SHA256 3c1eb252f63c470cc5284d5b3c272e58ba20f3521ac95fe091167973f279642e
MD5 a094674e91e84854013a59fdb8842d70
BLAKE2b-256 849f8f6565eeedd09405fd5860ffd779e7694d89dfaa984411765615bc60d624

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page