A lightweight, Python-native tax calculation library for Brazilian fiscal rules (ICMS, IPI, PIS/COFINS, FCP, DIFAL, ICMS ST and more).
This repository provides calculators and a facade to reproduce common fiscal calculation flows used by Brazilian electronic invoices (NF-e, NFC-e, CT-e) and related documents.
Note
motor_tributario_py is part of the SPEDIR project — the Brazilian Localization for ERPNext. See the documentation and related resources at https://github.com/techmaxsolucoes/SPEDIR-DOCS
- Calculators for ICMS, ICMS ST, IPI, PIS, COFINS, FCP, DIFAL, IBPT and CBS/IBS flows
- A Facade (
FacadeCalculadoraTributacao) that composes calculators into a single, test-friendly API - Auditable execution traces via
debug_executionfor troubleshooting and tests - Designed for deterministic unit testing and integration with decision tables (DMN)
A simplified diagram showing how data and decisions flow through the package.
flowchart LR
In(("Tributavel (data model)")) --> Facade["FacadeCalculadoraTributacao"]
Facade --> Calculators["Tax Calculators (taxes/)"]
Calculators -->|uses rules| Rules["DMN rules (rules/)"]
Rules -->|decision logic| Calculators
Facade --> Audit["AuditManager / ExecutionReport"]
Audit --> Pretty["Human-readable report"]
Audit --> JSON["JSON report"]
Facade --> API["Public API (calcula_icms, calcula_tributacao)"]
subgraph Repo
R1["rules/ (DMN-backed)"]
R2["taxes/ (calculators)"]
R3["audit.py (reporting)"]
R4["scripts/ (helpers)"]
end
R1 --> Rules
R2 --> Calculators
R3 --> Audit
R4 --> Facade
Tributavelis the single data holder for item/document values and percentages.FacadeCalculadoraTributacaoorchestrates the calculators and consults DMN-backed rule tables when necessary.rules/contains DMN-style rule definitions consulted viabkflow-dmn.taxes/implements numeric calculations;audit.pycaptures evaluation traces and produces both human-readable and JSON reports.scripts/contains utilities used to generate embedded documentation and debug examples.
The Tributavel dataclass is the central data structure that holds all information needed for tax calculations. All fields have sensible defaults and use Decimal for monetary values.
| Field | Type | Default | Description |
|---|---|---|---|
valor_produto |
Decimal | 0 | Unit price of the product |
quantidade_produto |
Decimal | 1 | Quantity |
frete |
Decimal | 0 | Freight/shipping cost |
seguro |
Decimal | 0 | Insurance cost |
outras_despesas |
Decimal | 0 | Other expenses |
desconto |
Decimal | 0 | Discount amount |
valor_ipi |
Decimal | 0 | IPI value (can be calculated or provided) |
| Field | Type | Default | Description |
|---|---|---|---|
is_servico |
bool | False | Whether this is a service (affects ISSQN) |
is_ativo_imobilizado_ou_uso_consumo |
bool | False | Fixed asset or for consumption (affects IPI in base) |
tipo_desconto |
str | "Incondicional" | "Condicional" or "Incondicional" |
cst |
str | "" | CST code (e.g., "00", "20", "51", "60") |
csosn |
int | 0 | CSOSN code for Simples Nacional (e.g., 101, 500, 900) |
tipo_calculo_icms_desonerado |
str | "" | "BaseSimples" or "BasePorDentro" |
crt |
str | "" | Regime: "RegimeNormal", "SimplesNacional" |
tipo_operacao |
str | "" | "OperacaoInterna", "OperacaoInterestadual" |
tipo_pessoa |
str | "" | "Fisica", "Juridica" |
documento |
str | "" | Document type: "NFe", "CTe", "MFe" |
| Field | Type | Default | Description |
|---|---|---|---|
percentual_icms |
Decimal | 0 | ICMS rate (%) |
percentual_reducao |
Decimal | 0 | ICMS base reduction (%) |
percentual_diferimento |
Decimal | 0 | Deferral percentage for CST 51 (%) |
| Field | Type | Default | Description |
|---|---|---|---|
percentual_icms_st |
Decimal | 0 | ICMS ST rate (%) |
percentual_mva |
Decimal | 0 | MVA - Added Value Margin (%) |
percentual_reducao_st |
Decimal | 0 | ST base reduction (%) |
| Field | Type | Default | Description |
|---|---|---|---|
percentual_icms_efetivo |
Decimal | 0 | Effective ICMS rate (%) |
percentual_reducao_icms_efetivo |
Decimal | 0 | Effective ICMS base reduction (%) |
| Field | Type | Default | Description |
|---|---|---|---|
quantidade_base_calculo_icms_monofasico |
Decimal | 0 | Quantity for monophasic base |
aliquota_ad_rem_icms |
Decimal | 0 | Ad rem rate |
percentual_reducao_aliquota_ad_rem_icms |
Decimal | 0 | Ad rem rate reduction (%) |
percentual_biodiesel |
Decimal | 0 | Biodiesel percentage (%) |
percentual_originario_uf |
Decimal | 0 | Percentage originating from state (%) |
quantidade_base_calculo_icms_monofasico_retido_anteriormente |
Decimal | 0 | Previously withheld quantity |
aliquota_ad_rem_icms_retido_anteriormente |
Decimal | 0 | Previously withheld ad rem rate |
| Field | Type | Default | Description |
|---|---|---|---|
percentual_fcp |
Decimal | 0 | FCP rate (%) |
percentual_fcp_st |
Decimal | 0 | FCP ST rate (%) |
percentual_fcp_st_retido |
Decimal | 0 | Withheld FCP ST rate (%) |
valor_ultima_base_calculo_icms_st_retido |
Decimal | 0 | Last ST base value withheld |
| Field | Type | Default | Description |
|---|---|---|---|
percentual_credito |
Decimal | 0 | ICMS credit rate (%) |
| Field | Type | Default | Description |
|---|---|---|---|
percentual_difal_interna |
Decimal | 0 | Internal (destination) rate (%) |
percentual_difal_interestadual |
Decimal | 0 | Interstate (origin) rate (%) |
| Field | Type | Default | Description |
|---|---|---|---|
percentual_ipi |
Decimal | 0 | IPI rate (%) |
| Field | Type | Default | Description |
|---|---|---|---|
percentual_pis |
Decimal | 0 | PIS rate (%) |
percentual_reducao_pis |
Decimal | 0 | PIS base reduction (%) |
percentual_ret_pis |
Decimal | 0 | PIS withholding rate (%) |
deduz_icms_da_base_de_pis_cofins |
bool | False | Whether to deduct ICMS from PIS/COFINS base |
| Field | Type | Default | Description |
|---|---|---|---|
percentual_cofins |
Decimal | 0 | COFINS rate (%) |
percentual_reducao_cofins |
Decimal | 0 | COFINS base reduction (%) |
percentual_ret_cofins |
Decimal | 0 | COFINS withholding rate (%) |
| Field | Type | Default | Description |
|---|---|---|---|
percentual_issqn |
Decimal | 0 | ISSQN rate (%) |
percentual_ret_csll |
Decimal | 0 | CSLL withholding rate (%) |
percentual_ret_irrf |
Decimal | 0 | IRRF withholding rate (%) |
percentual_ret_inss |
Decimal | 0 | INSS withholding rate (%) |
| Field | Type | Default | Description |
|---|---|---|---|
percentual_federal |
Decimal | 0 | Federal tax burden (%) |
percentual_estadual |
Decimal | 0 | State tax burden (%) |
percentual_municipal |
Decimal | 0 | Municipal tax burden (%) |
percentual_federal_importados |
Decimal | 0 | Federal tax burden for imports (%) |
| Field | Type | Default | Description |
|---|---|---|---|
percentual_ibs_uf |
Decimal | 0 | IBS state rate (%) |
percentual_ibs_municipal |
Decimal | 0 | IBS municipal rate (%) |
percentual_cbs |
Decimal | 0 | CBS rate (%) |
percentual_reducao_ibs_uf |
Decimal | 0 | IBS state reduction (%) |
percentual_reducao_ibs_municipal |
Decimal | 0 | IBS municipal reduction (%) |
percentual_reducao_cbs |
Decimal | 0 | CBS reduction (%) |
somar_pis_na_base_ibs_cbs |
bool | False | Include PIS in IBS/CBS base |
somar_cofins_na_base_ibs_cbs |
bool | False | Include COFINS in IBS/CBS base |
somar_icms_na_base_ibs_cbs |
bool | False | Include ICMS in IBS/CBS base |
somar_issqn_na_base_ibs_cbs |
bool | False | Include ISSQN in IBS/CBS base |
from decimal import Decimal
from motor_tributario_py.models import Tributavel
# Simple product with ICMS
produto = Tributavel(
valor_produto=Decimal('100.00'),
quantidade_produto=Decimal('2'),
percentual_icms=Decimal('18'),
)
# Product with freight, insurance and discount
produto_completo = Tributavel(
valor_produto=Decimal('500.00'),
frete=Decimal('50.00'),
seguro=Decimal('10.00'),
desconto=Decimal('25.00'),
tipo_desconto="Incondicional",
percentual_icms=Decimal('12'),
percentual_ipi=Decimal('5'),
percentual_pis=Decimal('1.65'),
percentual_cofins=Decimal('7.6'),
)from decimal import Decimal
from motor_tributario_py.models import Tributavel
from motor_tributario_py.facade import FacadeCalculadoraTributacao
# Create a Tributavel instance with product data
produto = Tributavel(
valor_produto=Decimal('100.00'),
quantidade_produto=Decimal('1'),
percentual_icms=Decimal('18.0'),
percentual_pis=Decimal('1.65'),
percentual_cofins=Decimal('7.6'),
)
# Use the facade to calculate taxes
facade = FacadeCalculadoraTributacao(produto)
# Calculate ICMS
res_icms = facade.calcula_icms()
print('ICMS Base:', res_icms.base_calculo) # 100.00
print('ICMS Valor:', res_icms.valor) # 18.00
# Calculate all taxes at once
resultado = facade.calcula_tributacao()
print('Valor PIS:', resultado.valor_pis) # 1.65
print('Valor COFINS:', resultado.valor_cofins) # 7.60
# Debug execution with detailed trace
report = facade.debug_execution('calcula_icms')
print(report.format_pretty())================================================================================
EXECUTION REPORT: calcula_icms
================================================================================
INPUTS:
args: ()
kwargs: {}
Tributavel:
valor_produto: 100.00
quantidade_produto: 1
tipo_desconto: Incondicional
percentual_icms: 18.0
percentual_pis: 1.65
percentual_cofins: 7.6
DECISION TRACE:
[1] Full ICMS Calculation Rules
Total Rules: 4
Matched: [3]
━━━ Rule #4 ━━━
Input Conditions:
• is_ativo: false
• tipo_desconto: "Incondicional"
Output Calculations:
• base_calculo = ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) - desconto ) * (decimal(1) - (percentual_reducao / decimal(100)))
Evaluated: ( ( ( ( (100.00 * 1) + 0) + 0) + 0) - 0 ) * (decimal(1) - (0 / decimal(100)))
→ Result: 100.00
• valor_final = ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) - desconto ) * (decimal(1) - (percentual_reducao / decimal(100))) ) * percentual_icms) / decimal(100)
Evaluated: ( ( ( ( ( ( (100.00 * 1) + 0) + 0) + 0) - 0 ) * (decimal(1) - (0 / decimal(100))) ) * 18.0) / decimal(100)
→ Result: 18.000
FINAL RESULT:
base_calculo: 100.00
valor: 18.000
percentual_icms: 18.0
percentual_reducao: 0
percentual_icms_st: 0
percentual_mva: 0
base_calculo_st: None
valor_icms_st: None
percentual_reducao_st: 0.00
percentual_diferimento: 0.00
valor_icms_diferido: None
valor_icms_operacao: None
valor_bc_st_retido: 100.00
base_calculo_icms_efetivo: None
valor_icms_efetivo: None
modalidade_determinacao_bc_icms: ValorOperacao
modalidade_determinacao_bc_icms_st: None
================================================================================
{
"method_name": "calcula_icms",
"inputs": {
"tributavel": {
"valor_produto": 100.0,
"frete": 0.0,
"seguro": 0.0,
"outras_despesas": 0.0,
"desconto": 0.0,
"valor_ipi": 0.0,
"quantidade_produto": 1.0,
"is_servico": false,
"is_ativo_imobilizado_ou_uso_consumo": false,
"tipo_desconto": "Incondicional",
"cst": "",
"tipo_calculo_icms_desonerado": "",
"crt": "",
"tipo_operacao": "",
"tipo_pessoa": "",
"percentual_icms": 18.0,
"percentual_reducao": 0.0,
"percentual_ipi": 0.0,
"percentual_pis": 1.65,
"percentual_reducao_pis": 0.0,
"percentual_cofins": 7.6,
"percentual_reducao_cofins": 0.0,
"percentual_icms_st": 0.0,
"percentual_mva": 0.0,
"percentual_reducao_st": 0.0,
"percentual_fcp": 0.0,
"percentual_fcp_st": 0.0,
"percentual_credito": 0.0,
"csosn": 0,
"percentual_fcp_st_retido": 0.0,
"valor_ultima_base_calculo_icms_st_retido": 0.0,
"percentual_difal_interna": 0.0,
"percentual_difal_interestadual": 0.0,
"percentual_issqn": 0.0,
"percentual_ret_pis": 0.0,
"percentual_ret_cofins": 0.0,
"percentual_ret_csll": 0.0,
"percentual_ret_irrf": 0.0,
"percentual_ret_inss": 0.0,
"percentual_federal": 0.0,
"percentual_estadual": 0.0,
"percentual_municipal": 0.0,
"percentual_federal_importados": 0.0,
"percentual_ibs_uf": 0.0,
"percentual_ibs_municipal": 0.0,
"percentual_cbs": 0.0,
"percentual_reducao_ibs_uf": 0.0,
"percentual_reducao_ibs_municipal": 0.0,
"percentual_reducao_cbs": 0.0,
"documento": "",
"percentual_icms_efetivo": 0.0,
"percentual_reducao_icms_efetivo": 0.0,
"quantidade_base_calculo_icms_monofasico": 0.0,
"aliquota_ad_rem_icms": 0.0,
"percentual_reducao_aliquota_ad_rem_icms": 0.0,
"percentual_biodiesel": 0.0,
"percentual_originario_uf": 0.0,
"quantidade_base_calculo_icms_monofasico_retido_anteriormente": 0.0,
"aliquota_ad_rem_icms_retido_anteriormente": 0.0,
"somar_pis_na_base_ibs_cbs": false,
"somar_cofins_na_base_ibs_cbs": false,
"somar_icms_na_base_ibs_cbs": false,
"somar_issqn_na_base_ibs_cbs": false,
"percentual_diferimento": 0.0,
"deduz_icms_da_base_de_pis_cofins": false
},
"args": [],
"kwargs": {}
},
"result": {
"base_calculo": 100.0,
"valor": 18.0,
"percentual_icms": 18.0,
"percentual_reducao": 0.0,
"percentual_icms_st": 0.0,
"percentual_mva": 0.0,
"base_calculo_st": null,
"valor_icms_st": null,
"percentual_reducao_st": 0.0,
"percentual_diferimento": 0.0,
"valor_icms_diferido": null,
"valor_icms_operacao": null,
"valor_bc_st_retido": 100.0,
"base_calculo_icms_efetivo": null,
"valor_icms_efetivo": null,
"modalidade_determinacao_bc_icms": "ValorOperacao",
"modalidade_determinacao_bc_icms_st": null
},
"audit_trail": {
"traces": [
{
"table_title": "Full ICMS Calculation Rules",
"facts": {
"valor_produto": 100.0,
"quantidade_produto": 1.0,
"frete": 0.0,
"seguro": 0.0,
"outras_despesas": 0.0,
"valor_ipi": 0.0,
"is_ativo": false,
"tipo_desconto": "Incondicional",
"desconto": 0.0,
"percentual_reducao": 0.0,
"percentual_icms": 18.0
},
"matched_rules": [
3
],
"rule_count": 4,
"final_result": [
{
"base_calculo": 100.0,
"valor_final": 18.0
}
],
"matched_rule_details": [
{
"rule_number": 4,
"input_conditions": {
"is_ativo": "false",
"tipo_desconto": "\"Incondicional\""
},
"output_calculations": {
"base_calculo": {
"expression": "( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) - desconto ) * (decimal(1) - (percentual_reducao / decimal(100)))",
"evaluated": "( ( ( ( (100.00 * 1) + 0) + 0) + 0) - 0 ) * (decimal(1) - (0 / decimal(100)))",
"result": 100.0
},
"valor_final": {
"expression": "( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) - desconto ) * (decimal(1) - (percentual_reducao / decimal(100))) ) * percentual_icms) / decimal(100)",
"evaluated": "( ( ( ( ( ( (100.00 * 1) + 0) + 0) + 0) - 0 ) * (decimal(1) - (0 / decimal(100))) ) * 18.0) / decimal(100)",
"result": 18.0
}
}
}
]
}
]
}
}Notes:
- The
FacadeCalculadoraTributacaoaccepts keyword overrides toTributavelproperties at construction time (handy for tests). - Some flows rely on decision tables (DMN) to determine behaviour for specific CST/CSON rules. The package integrates with
bkflow-dmnfor that purpose.
motor_tributario_py/- package sourcesfacade.py- high-level orchestration APImodels.py-Tributaveldata model used across calculatorsrules/- DMN-backed rule dispatchers and helperstaxes/- individual tax calculators (icms, pis, cofins, ipi, difal, etc.)utils/,audit.py- helpers and auditing utilities
Diagrama simplificado mostrando o fluxo de dados e decisões dentro do pacote.
flowchart LR
In(("Tributavel\n(data model)")) --> Facade["FacadeCalculadoraTributacao"]
Facade --> Calculators["Tax Calculators\n(taxes/)" ]
Calculators -->|uses rules| Rules["DMN rules\n(rules/)"]
Rules -->|decision logic| Calculators
Facade --> Audit["AuditManager / ExecutionReport"]
Audit --> Pretty["Human-readable report"]
Audit --> JSON["JSON report"]
Facade --> API["Public API\n(calcula_icms, calcula_tributacao)"]
subgraph Repo
R1["rules/ (DMN-backed)"]
R2["taxes/ (calculators)"]
R3["audit.py (reporting)"]
R4["scripts/ (helpers)"]
end
R1 --> Rules
R2 --> Calculators
R3 --> Audit
R4 --> Facade
Tributavelé o objeto de dados com valores e percentuais do item/documento.FacadeCalculadoraTributacaoorquestra as chamadas aos calculadores e consulta tabelas de decisão quando necessário.rules/contém definições de regras estilo DMN consultadas viabkflow-dmn.taxes/implementa os cálculos numéricos;audit.pygera traços para depuração e relatórios em texto/JSON.scripts/contém utilitários usados para gerar a documentação embutida e exemplos de depuração.
Unit tests and fixtures live under tests/. Run them with pytest:
pytest -qContributions are welcome. Open a PR with a clear description and tests for new calculations or bug fixes. Keep changes small and focused.
Please refer to the repository LICENSE file for licensing information.
Summary: Credito ICMS Preprocessing; Credito ICMS Calculation
Source file: /home/maxwell/Rule/motor_tributario_py/motor_tributario_py/rules/credito_icms_rules.py
Rule: Credito ICMS Preprocessing Hit policy: Unique
| Input: dummy | Output: percentual_reducao_override | Output: calculation_strategy |
|---|---|---|
| 1 | 0 | "use_icms_base_without_reduction" |
Rule: Credito ICMS Calculation Hit policy: Unique
| Input: dummy | Output: valor_credito_icms |
|---|---|
| 1 | ( ( base_calculo_credito * percentual_credito ) / decimal(100) ) |
Summary: CSOSN Dispatch Rules
Source file: /home/maxwell/Rule/motor_tributario_py/motor_tributario_py/rules/csosn_rules.py
Rule: CSOSN Dispatch Rules Hit policy: Unique
| Input: csosn | Output: calcular_icms_proprio | Output: calcular_icms_st | Output: calcular_credito | Output: calcular_efetivo | Output: modo_calculo |
|---|---|---|---|---|---|
| 101 | false | false | true | false | "Credito Only" |
| 102 | false | false | false | false | "Exempt" |
| 103 | false | false | false | false | "Exempt" |
| 201 | false | true | true | false | "Credito + ST" |
| 202 | false | true | false | false | "ST Only" |
| 203 | false | true | false | false | "ST Only" |
| 300 | false | false | false | false | "Exempt" |
| 400 | false | false | false | false | "Exempt" |
| 500 | false | false | false | true | "CSOSN 500 Efetivo" |
| 900 | true | true | true | false | "All (900)" |
Summary: CST Post-Processing Rules; CST 51 Diferimento Calculation
Source file: /home/maxwell/Rule/motor_tributario_py/motor_tributario_py/rules/cst_post_processing_rules.py
Rule: CST Post-Processing Rules Hit policy: Unique
| Input: cst | Output: calcular_diferimento | Output: calcular_efetivo | Output: modo_post_processing |
|---|---|---|---|
| "51" | true | false | "Diferimento" |
| "60" | false | true | "Efetivo" |
Rule: CST 51 Diferimento Calculation Hit policy: Unique
| Input: percentual_diferimento | Output: should_calculate | Output: valor_icms_operacao | Output: valor_icms_diferido | Output: valor_final |
|---|---|---|---|---|
| percentual_diferimento > decimal(0) | true | (base_calculo * percentual_icms) / decimal(100) | (((base_calculo * percentual_icms) / decimal(100)) * percentual_diferimento) / decimal(100) | ((base_calculo * percentual_icms) / decimal(100)) - ((((base_calculo * percentual_icms) / decimal(100)) * percentual_diferimento) / decimal(100)) |
| percentual_diferimento <= decimal(0) | false | decimal(0) | decimal(0) | decimal(0) |
Summary: CST Dispatch Rules
Source file: /home/maxwell/Rule/motor_tributario_py/motor_tributario_py/rules/cst_rules.py
Rule: CST Dispatch Rules Hit policy: Unique
| Input: cst | Output: calcular_icms | Output: calcular_icms_st | Output: calcular_credito | Output: calcular_fcp | Output: modo_calculo |
|---|---|---|---|---|---|
| "00" | true | false | false | false | "ICMS Only" |
| "10" | true | true | false | false | "ICMS + ST" |
| "20" | true | false | false | false | "ICMS with Reduction" |
| "30" | false | true | false | false | "ST Only" |
| "40" | false | false | false | false | "Exempt" |
| "41" | false | false | false | false | "Not Taxed" |
| "50" | false | false | false | false | "Suspension" |
| "51" | true | false | false | false | "Deferral" |
| "60" | false | false | false | false | "ST Already Collected" |
| "70" | true | true | false | false | "ICMS with Reduction + ST" |
| "90" | true | true | true | true | "Other" |
Summary: Full DIFAL and FCP Calculation Rules
Source file: /home/maxwell/Rule/motor_tributario_py/motor_tributario_py/rules/difal_rules.py
Rule: Full DIFAL and FCP Calculation Rules Hit policy: Unique
| Input: is_ativo | Input: tipo_desconto | Output: base_calculo | Output: valor_fcp | Output: valor_difal | Output: valor_icms_destino | Output: valor_icms_origem |
|---|---|---|---|---|---|---|
| true | "Condicional" | ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) + valor_ipi) + desconto ) | ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) + valor_ipi) + desconto ) * percentual_fcp ) / decimal(100) | ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) + valor_ipi) + desconto ) * (percentual_difal_interna - percentual_difal_interestadual) ) / decimal(100) | ( ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) + valor_ipi) + desconto ) * (percentual_difal_interna - percentual_difal_interestadual) ) / decimal(100) ) | decimal(0) |
| true | "Incondicional" | ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) + valor_ipi) - desconto ) | ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) + valor_ipi) - desconto ) * percentual_fcp ) / decimal(100) | ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) + valor_ipi) - desconto ) * (percentual_difal_interna - percentual_difal_interestadual) ) / decimal(100) | ( ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) + valor_ipi) - desconto ) * (percentual_difal_interna - percentual_difal_interestadual) ) / decimal(100) ) | decimal(0) |
| false | "Condicional" | ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) + desconto ) | ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) + desconto ) * percentual_fcp ) / decimal(100) | ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) + desconto ) * (percentual_difal_interna - percentual_difal_interestadual) ) / decimal(100) | ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) + desconto ) * (percentual_difal_interna - percentual_difal_interestadual) ) / decimal(100) ) | decimal(0) |
| false | "Incondicional" | ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) - desconto ) | ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) - desconto ) * percentual_fcp ) / decimal(100) | ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) - desconto ) * (percentual_difal_interna - percentual_difal_interestadual) ) / decimal(100) | ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) - desconto ) * (percentual_difal_interna - percentual_difal_interestadual) ) / decimal(100) ) | decimal(0) |
Summary: FCP Calculation
Source file: /home/maxwell/Rule/motor_tributario_py/motor_tributario_py/rules/fcp_rules.py
Rule: FCP Calculation Hit policy: Unique
| Input: dummy | Output: valor_fcp |
|---|---|
| 1 | ( ( base_calculo_icms * percentual_fcp ) / decimal(100) ) |
Summary: FCP ST Calculation Rules; FCP ST Retido Calculation Rules
Source file: /home/maxwell/Rule/motor_tributario_py/motor_tributario_py/rules/fcp_st_rules.py
Rule: FCP ST Calculation Rules Hit policy: Unique
| Input: tipo_desconto | Output: base_calculo_fcp_st | Output: valor_fcp_st |
|---|---|---|
| "Condicional" | ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) + valor_ipi) + desconto ) * ( decimal(1) + ( percentual_mva / decimal(100) ) ) ) | ( ( ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) + valor_ipi) + desconto ) * ( decimal(1) + ( percentual_mva / decimal(100) ) ) ) ) * percentual_fcp_st ) / decimal(100) |
| "Incondicional" | ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) + valor_ipi) - desconto ) * ( decimal(1) + ( percentual_mva / decimal(100) ) ) ) | ( ( ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) + valor_ipi) - desconto ) * ( decimal(1) + ( percentual_mva / decimal(100) ) ) ) ) * percentual_fcp_st ) / decimal(100) |
Rule: FCP ST Retido Calculation Rules Hit policy: Unique
| Input: dummy | Output: base_calculo | Output: valor_fcp_st_retido |
|---|---|---|
| 1 | ( valor_ultima_base_calculo_icms_st_retido * quantidade_produto ) | ( ( valor_ultima_base_calculo_icms_st_retido * quantidade_produto ) * percentual_fcp_st_retido ) / decimal(100) |
Summary: IBPT Calculation Rules
Source file: /home/maxwell/Rule/motor_tributario_py/motor_tributario_py/rules/ibpt_rules.py
Rule: IBPT Calculation Rules Hit policy: Unique
| Input: dummy | Output: base_calculo | Output: valor_federal | Output: valor_estadual | Output: valor_municipal | Output: valor_federal_importados |
|---|---|---|---|---|---|
| 1 | ( (valor_produto * quantidade_produto) - desconto ) | ( ( ( (valor_produto * quantidade_produto) - desconto ) * percentual_federal ) / decimal(100) ) | ( ( ( (valor_produto * quantidade_produto) - desconto ) * percentual_estadual ) / decimal(100) ) | ( ( ( (valor_produto * quantidade_produto) - desconto ) * percentual_municipal ) / decimal(100) ) | ( ( ( (valor_produto * quantidade_produto) - desconto ) * percentual_federal_importados ) / decimal(100) ) |
Summary: IBS/CBS Base Calculation; IBS Calculation; IBS Municipal Calculation; CBS Calculation
Source file: /home/maxwell/Rule/motor_tributario_py/motor_tributario_py/rules/ibs_cbs_rules.py
Rule: IBS/CBS Base Calculation Hit policy: Unique
| Input: dummy | Output: base_calculo_ibs_cbs |
|---|---|
| 1 | ( ( ( ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) - desconto) + ajuste_pis) + ajuste_cofins) + ajuste_icms) + ajuste_issqn) ) |
Rule: IBS Calculation Hit policy: Unique
| Input: dummy | Output: valor_ibs |
|---|---|
| 1 | ( ( base_calculo_ibs_cbs * ( percentual_ibs_uf * ( decimal(1) - ( percentual_reducao_ibs_uf / decimal(100) ) ) ) ) / decimal(100) ) |
Rule: IBS Municipal Calculation Hit policy: Unique
| Input: dummy | Output: valor_ibs_municipal |
|---|---|
| 1 | ( ( base_calculo_ibs_cbs * ( percentual_ibs_municipal * ( decimal(1) - ( percentual_reducao_ibs_municipal / decimal(100) ) ) ) ) / decimal(100) ) |
Rule: CBS Calculation Hit policy: Unique
| Input: dummy | Output: valor_cbs |
|---|---|
| 1 | ( ( base_calculo_ibs_cbs * ( percentual_cbs * ( decimal(1) - ( percentual_reducao_cbs / decimal(100) ) ) ) ) / decimal(100) ) |
Summary: ICMS Desonerado Preprocessing; ICMS Desonerado Calculation Rules
Source file: /home/maxwell/Rule/motor_tributario_py/motor_tributario_py/rules/icms_desonerado_rules.py
Rule: ICMS Desonerado Preprocessing Hit policy: First
| Input: tipo_calculo | Input: cst | Output: should_calculate | Output: cst_group |
|---|---|---|---|
| "BaseSimples" | true | "-" | |
| "BasePorDentro" | "20" | true | "GroupA" |
| "BasePorDentro" | "70" | true | "GroupA" |
| "BasePorDentro" | "30" | true | "GroupB" |
| "BasePorDentro" | "40" | true | "GroupB" |
| true | "-" |
Rule: ICMS Desonerado Calculation Rules Hit policy: First
| Input: tipo_calculo | Input: cst_group | Output: valor_icms_desonerado |
|---|---|---|
| "BaseSimples" | "-" | ( base_calculo * (percentual_icms / decimal(100)) ) |
| "BasePorDentro" | "GroupA" | ( ( ( subtotal_produto * ( decimal(1) - ( (percentual_icms / decimal(100)) * ( decimal(1) - (percentual_reducao / decimal(100)) ) ) ) ) / ( decimal(1) - (percentual_icms / decimal(100)) ) ) - subtotal_produto ) |
| "BasePorDentro" | "GroupB" | ( ( subtotal_produto / ( decimal(1) - (percentual_icms / decimal(100)) ) ) * (percentual_icms / decimal(100)) ) |
Summary: ICMS Efetivo Preprocessing; ICMS Efetivo Base Calculation; ICMS Efetivo Calculation
Source file: /home/maxwell/Rule/motor_tributario_py/motor_tributario_py/rules/icms_efetivo_rules.py
Rule: ICMS Efetivo Preprocessing Hit policy: Unique
| Input: percentual_icms_efetivo | Input: is_ativo | Output: should_calculate | Output: ipi_adjustment |
|---|---|---|---|
| percentual_icms_efetivo = decimal(0) | false | "none" | |
| percentual_icms_efetivo > decimal(0) | true | true | "add_to_outras_despesas" |
| percentual_icms_efetivo > decimal(0) | false | true | "none" |
Rule: ICMS Efetivo Base Calculation Hit policy: Unique
| Input: tipo_desconto | Output: base_calculo_efetivo |
|---|---|
| "Condicional" | ( ( ( ( ( ( valor_produto * quantidade_produto ) + frete ) + seguro ) + outras_despesas ) + desconto ) * ( decimal(1) - ( percentual_reducao_icms_efetivo / decimal(100) ) ) ) |
| "Incondicional" | ( ( ( ( ( ( valor_produto * quantidade_produto ) + frete ) + seguro ) + outras_despesas ) - desconto ) * ( decimal(1) - ( percentual_reducao_icms_efetivo / decimal(100) ) ) ) |
Rule: ICMS Efetivo Calculation Hit policy: Unique
| Input: dummy | Output: valor_icms_efetivo |
|---|---|
| 1 | ( ( base_calculo_efetivo * percentual_icms_efetivo ) / decimal(100) ) |
Summary: ICMS Monofásico Calculation
Source file: /home/maxwell/Rule/motor_tributario_py/motor_tributario_py/rules/icms_monofasico_rules.py
Rule: ICMS Monofásico Calculation Hit policy: Unique
| Input: cst | Output: valor_icms_monofasico | Output: valor_icms_monofasico_retencao | Output: valor_icms_monofasico_operacao | Output: valor_icms_monofasico_diferido | Output: valor_icms_monofasico_retido_anteriormente |
|---|---|---|---|---|---|
| "02" | ( quantidade_base_calculo_icms_monofasico * aliquota_ad_rem_icms ) | decimal(0) | decimal(0) | decimal(0) | decimal(0) |
| "15" | ( ( quantidade_base_calculo_icms_monofasico * ( decimal(1) - ( percentual_biodiesel / decimal(100) ) ) ) * ( aliquota_ad_rem_icms * ( decimal(1) - ( percentual_reducao_aliquota_ad_rem_icms / decimal(100) ) ) ) ) | ( ( ( quantidade_base_calculo_icms_monofasico * ( percentual_biodiesel / decimal(100) ) ) * aliquota_ad_rem_icms ) * ( percentual_originario_uf / decimal(100) ) ) | decimal(0) | decimal(0) | decimal(0) |
| "53" | ( ( quantidade_base_calculo_icms_monofasico * aliquota_ad_rem_icms ) - ( ( quantidade_base_calculo_icms_monofasico * aliquota_ad_rem_icms ) * ( percentual_originario_uf / decimal(100) ) ) ) | decimal(0) | ( quantidade_base_calculo_icms_monofasico * aliquota_ad_rem_icms ) | ( ( quantidade_base_calculo_icms_monofasico * aliquota_ad_rem_icms ) * ( percentual_originario_uf / decimal(100) ) ) | decimal(0) |
| "61" | decimal(0) | decimal(0) | decimal(0) | decimal(0) | ( quantidade_base_calculo_icms_monofasico_retido_anteriormente * aliquota_ad_rem_icms_retido_anteriormente ) |
Summary: Full ICMS Calculation Rules
Source file: /home/maxwell/Rule/motor_tributario_py/motor_tributario_py/rules/icms_rules.py
Rule: Full ICMS Calculation Rules Hit policy: Unique
| Input: is_ativo | Input: tipo_desconto | Output: base_calculo | Output: valor_final |
|---|---|---|---|
| true | "Condicional" | ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) + valor_ipi) + desconto ) * (decimal(1) - (percentual_reducao / decimal(100))) | ( ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) + valor_ipi) + desconto ) * (decimal(1) - (percentual_reducao / decimal(100))) ) * percentual_icms) / decimal(100) |
| true | "Incondicional" | ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) + valor_ipi) - desconto ) * (decimal(1) - (percentual_reducao / decimal(100))) | ( ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) + valor_ipi) - desconto ) * (decimal(1) - (percentual_reducao / decimal(100))) ) * percentual_icms) / decimal(100) |
| false | "Condicional" | ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) + desconto ) * (decimal(1) - (percentual_reducao / decimal(100))) | ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) + desconto ) * (decimal(1) - (percentual_reducao / decimal(100))) ) * percentual_icms) / decimal(100) |
| false | "Incondicional" | ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) - desconto ) * (decimal(1) - (percentual_reducao / decimal(100))) | ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) - desconto ) * (decimal(1) - (percentual_reducao / decimal(100))) ) * percentual_icms) / decimal(100) |
Summary: Full ICMS ST Calculation Rules
Source file: /home/maxwell/Rule/motor_tributario_py/motor_tributario_py/rules/icms_st_rules.py
Rule: Full ICMS ST Calculation Rules Hit policy: Unique
| Input: tipo_desconto | Output: base_calculo_st | Output: valor_icms_st |
|---|---|---|
| "Condicional" | ( ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) + valor_ipi) + desconto ) * (decimal(1) - (percentual_reducao_st / decimal(100))) ) * (decimal(1) + (percentual_mva / decimal(100))) ) | ( ( ( ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) + valor_ipi) + desconto ) * (decimal(1) - (percentual_reducao_st / decimal(100))) ) * (decimal(1) + (percentual_mva / decimal(100))) ) * percentual_icms_st ) / decimal(100) ) - valor_icms_proprio |
| "Incondicional" | ( ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) + valor_ipi) - desconto ) * (decimal(1) - (percentual_reducao_st / decimal(100))) ) * (decimal(1) + (percentual_mva / decimal(100))) ) | ( ( ( ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) + valor_ipi) - desconto ) * (decimal(1) - (percentual_reducao_st / decimal(100))) ) * (decimal(1) + (percentual_mva / decimal(100))) ) * percentual_icms_st ) / decimal(100) ) - valor_icms_proprio |
Summary: Full IPI Calculation Rules
Source file: /home/maxwell/Rule/motor_tributario_py/motor_tributario_py/rules/ipi_rules.py
Rule: Full IPI Calculation Rules Hit policy: Unique
| Input: tipo_desconto | Output: base_calculo | Output: valor_final |
|---|---|---|
| "Condicional" | ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) + desconto ) | ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) + desconto ) * percentual_ipi) / decimal(100) |
| "Incondicional" | ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) - desconto ) | ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) - desconto ) * percentual_ipi) / decimal(100) |
Summary: ISSQN Base Calculation; ISSQN Tax Calculation
Source file: /home/maxwell/Rule/motor_tributario_py/motor_tributario_py/rules/issqn_rules.py
Rule: ISSQN Base Calculation Hit policy: Unique
| Input: tipo_desconto | Output: base_calculo |
|---|---|
| "Condicional" | ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) + desconto ) |
| "Incondicional" | ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) - desconto ) |
Rule: ISSQN Tax Calculation Hit policy: Unique
| Input: calcular_retencoes | Output: valor_issqn | Output: valor_ret_pis | Output: valor_ret_cofins | Output: valor_ret_csll | Output: valor_ret_irrf | Output: valor_ret_inss |
|---|---|---|---|---|---|---|
| true | apply_threshold( ( ( base_calculo * percentual_issqn ) / decimal(100) ), 10 ) | check_threshold( ( ( base_calculo * ( (percentual_ret_pis + percentual_ret_cofins) + percentual_ret_csll ) ) / decimal(100) ), 10, ( ( base_calculo * percentual_ret_pis ) / decimal(100) ) ) | check_threshold( ( ( base_calculo * ( (percentual_ret_pis + percentual_ret_cofins) + percentual_ret_csll ) ) / decimal(100) ), 10, ( ( base_calculo * percentual_ret_cofins ) / decimal(100) ) ) | check_threshold( ( ( base_calculo * ( (percentual_ret_pis + percentual_ret_cofins) + percentual_ret_csll ) ) / decimal(100) ), 10, ( ( base_calculo * percentual_ret_csll ) / decimal(100) ) ) | apply_threshold( ( ( base_calculo * percentual_ret_irrf ) / decimal(100) ), 10 ) | apply_threshold( ( ( base_calculo * percentual_ret_inss ) / decimal(100) ), 29 ) |
| false | apply_threshold( ( ( base_calculo * percentual_issqn ) / decimal(100) ), 10 ) | decimal(0) | decimal(0) | decimal(0) | decimal(0) | decimal(0) |
Summary: Full PIS/COFINS Calculation Rules
Source file: /home/maxwell/Rule/motor_tributario_py/motor_tributario_py/rules/pis_cofins_rules.py
Rule: Full PIS/COFINS Calculation Rules Hit policy: Unique
| Input: is_ativo | Input: deduz_icms | Input: tipo_desconto | Output: base_calculo | Output: valor_final |
|---|---|---|---|---|
| true | true | "Condicional" | ( ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) + valor_ipi) - valor_icms) * (decimal(1) - (percentual_reducao / decimal(100))) ) + desconto ) | ( ( ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) + valor_ipi) - valor_icms) * (decimal(1) - (percentual_reducao / decimal(100))) ) + desconto ) * percentual_tax) / decimal(100) |
| true | true | "Incondicional" | ( ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) + valor_ipi) - valor_icms) * (decimal(1) - (percentual_reducao / decimal(100))) ) - desconto ) | ( ( ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) + valor_ipi) - valor_icms) * (decimal(1) - (percentual_reducao / decimal(100))) ) - desconto ) * percentual_tax) / decimal(100) |
| true | false | "Condicional" | ( ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) + valor_ipi) ) * (decimal(1) - (percentual_reducao / decimal(100))) ) + desconto ) | ( ( ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) + valor_ipi) ) * (decimal(1) - (percentual_reducao / decimal(100))) ) + desconto ) * percentual_tax) / decimal(100) |
| true | false | "Incondicional" | ( ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) + valor_ipi) ) * (decimal(1) - (percentual_reducao / decimal(100))) ) - desconto ) | ( ( ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) + valor_ipi) ) * (decimal(1) - (percentual_reducao / decimal(100))) ) - desconto ) * percentual_tax) / decimal(100) |
| false | true | "Condicional" | ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) - valor_icms) * (decimal(1) - (percentual_reducao / decimal(100))) ) + desconto ) | ( ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) - valor_icms) * (decimal(1) - (percentual_reducao / decimal(100))) ) + desconto ) * percentual_tax) / decimal(100) |
| false | true | "Incondicional" | ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) - valor_icms) * (decimal(1) - (percentual_reducao / decimal(100))) ) - desconto ) | ( ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) - valor_icms) * (decimal(1) - (percentual_reducao / decimal(100))) ) - desconto ) * percentual_tax) / decimal(100) |
| false | false | "Condicional" | ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) ) * (decimal(1) - (percentual_reducao / decimal(100))) ) + desconto ) | ( ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) ) * (decimal(1) - (percentual_reducao / decimal(100))) ) + desconto ) * percentual_tax) / decimal(100) |
| false | false | "Incondicional" | ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) ) * (decimal(1) - (percentual_reducao / decimal(100))) ) - desconto ) | ( ( ( ( ( ( ( (valor_produto * quantidade_produto) + frete) + seguro) + outras_despesas) ) * (decimal(1) - (percentual_reducao / decimal(100))) ) - desconto ) * percentual_tax) / decimal(100) |