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. percentual_icms=Decimal('18.0'), percentual_pis=Decimal('1.65'), percentual_cofins=Decimal('7.6'), )
facade = FacadeCalculadoraTributacao(produto) res_icms = facade.calcula_icms() print('ICMS Base:', res_icms.base_calculo) print('ICMS Valor:', res_icms.valor)
resultado = facade.calcula_tributacao() print('Valor PIS:', resultado.valor_pis) print('Valor COFINS:', resultado.valor_cofins)
report = facade.debug_execution('calcula_icms') print(report.format_pretty())
## Audit/debug example output (pretty)
```text
================================================================================
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 Calculation
Source file: /home/maxwell/Rule/motor_tributario_py/motor_tributario_py/rules/credito_icms_rules.py
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: valor_icms_operacao | Output: valor_icms_diferido | Output: valor_final |
|---|---|---|---|
| > 0 | (base_calculo * percentual_icms) / decimal(100) | (valor_icms_operacao * percentual_diferimento) / decimal(100) | valor_icms_operacao - valor_icms_diferido |
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: modo_calculo |
|---|---|---|---|
| "00" | true | false | "ICMS Only" |
| "10" | true | true | "ICMS + ST" |
| "20" | true | false | "ICMS with Reduction" |
| "30" | false | true | "ST Only" |
| "40" | false | false | "Exempt" |
| "41" | false | false | "Not Taxed" |
| "50" | false | false | "Suspension" |
| "51" | true | false | "Deferral" |
| "60" | false | false | "ST Already Collected" |
| "70" | true | true | "ICMS with Reduction + ST" |
| "90" | 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 Calculation Rules
Source file: /home/maxwell/Rule/motor_tributario_py/motor_tributario_py/rules/icms_desonerado_rules.py
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 Base Calculation; ICMS Efetivo Calculation
Source file: /home/maxwell/Rule/motor_tributario_py/motor_tributario_py/rules/icms_efetivo_rules.py
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) |