| """Calculadora de IPI (Imposto sobre Produtos Industrializados).""" |
| from __future__ import annotations |
|
|
| from dataclasses import dataclass |
| from decimal import Decimal |
| from typing import Optional |
|
|
| from src.calculators import ResultadoCalculo, arred |
|
|
|
|
| @dataclass |
| class ParametrosIPI: |
| valor_produtos: Decimal |
| aliquota: Decimal |
| cst: str = "50" |
| frete: Decimal = Decimal("0") |
| seguro: Decimal = Decimal("0") |
| outras_despesas: Decimal = Decimal("0") |
| desconto: Decimal = Decimal("0") |
| |
| quantidade: Decimal = Decimal("0") |
| valor_pauta_unidade: Optional[Decimal] = None |
|
|
|
|
| def calcular_ipi(p: ParametrosIPI) -> ResultadoCalculo: |
| |
| if p.cst in {"51", "52", "53", "54", "55", "02", "03", "04", "05"}: |
| return ResultadoCalculo( |
| base_calculo=Decimal("0"), |
| aliquota=p.aliquota, |
| valor_tributo=Decimal("0"), |
| valor_a_recolher=Decimal("0"), |
| ) |
|
|
| if p.cst == "03" and p.valor_pauta_unidade and p.quantidade: |
| |
| base = arred(p.quantidade * p.valor_pauta_unidade) |
| else: |
| base = arred( |
| p.valor_produtos + p.frete + p.seguro + p.outras_despesas - p.desconto |
| ) |
|
|
| valor = arred(base * p.aliquota / 100) |
|
|
| return ResultadoCalculo( |
| base_calculo=base, |
| aliquota=p.aliquota, |
| valor_tributo=valor, |
| valor_a_recolher=valor, |
| detalhes={"cst": p.cst}, |
| ) |
|
|
|
|
| def calcular_ipi_apuracao( |
| debitos: list[Decimal], |
| creditos: list[Decimal], |
| saldo_anterior: Decimal = Decimal("0"), |
| ) -> ResultadoCalculo: |
| total_debitos = arred(sum(debitos)) |
| total_creditos = arred(sum(creditos) + saldo_anterior) |
| valor_a_recolher = max(Decimal("0"), arred(total_debitos - total_creditos)) |
| saldo_credor = max(Decimal("0"), arred(total_creditos - total_debitos)) |
| return ResultadoCalculo( |
| base_calculo=total_debitos, |
| aliquota=Decimal("0"), |
| valor_tributo=total_debitos, |
| creditos=total_creditos, |
| valor_a_recolher=valor_a_recolher, |
| detalhes={ |
| "total_debitos": total_debitos, |
| "total_creditos": total_creditos, |
| "saldo_credor": saldo_credor, |
| }, |
| ) |
|
|
|
|
| |
| TIPI_ALIQUOTAS: dict[str, Decimal] = { |
| "01": Decimal("0"), |
| "02": Decimal("0"), |
| "03": Decimal("0"), |
| "04": Decimal("0"), |
| "05": Decimal("0"), |
| "06": Decimal("0"), |
| "07": Decimal("0"), |
| "08": Decimal("0"), |
| "09": Decimal("0"), |
| "10": Decimal("0"), |
| "11": Decimal("0"), |
| "12": Decimal("0"), |
| "16": Decimal("0"), |
| "17": Decimal("5"), |
| "18": Decimal("5"), |
| "19": Decimal("5"), |
| "20": Decimal("5"), |
| "21": Decimal("5"), |
| "22": Decimal("15"), |
| "24": Decimal("300"), |
| "25": Decimal("5"), |
| "27": Decimal("5"), |
| "28": Decimal("5"), |
| "29": Decimal("5"), |
| "30": Decimal("0"), |
| "31": Decimal("0"), |
| "33": Decimal("7"), |
| "34": Decimal("5"), |
| "38": Decimal("5"), |
| "39": Decimal("15"), |
| "40": Decimal("15"), |
| "41": Decimal("5"), |
| "42": Decimal("15"), |
| "44": Decimal("5"), |
| "48": Decimal("10"), |
| "49": Decimal("5"), |
| "50": Decimal("10"), |
| "51": Decimal("10"), |
| "52": Decimal("10"), |
| "61": Decimal("20"), |
| "62": Decimal("20"), |
| "64": Decimal("20"), |
| "69": Decimal("15"), |
| "70": Decimal("15"), |
| "72": Decimal("5"), |
| "73": Decimal("10"), |
| "74": Decimal("10"), |
| "76": Decimal("10"), |
| "82": Decimal("10"), |
| "84": Decimal("10"), |
| "85": Decimal("15"), |
| "86": Decimal("5"), |
| "87": Decimal("25"), |
| "88": Decimal("0"), |
| "90": Decimal("15"), |
| "91": Decimal("20"), |
| "92": Decimal("25"), |
| "94": Decimal("15"), |
| "95": Decimal("25"), |
| "96": Decimal("10"), |
| } |
|
|
|
|
| def obter_aliquota_ipi_ncm(ncm: str) -> Decimal: |
| capitulo = ncm[:2] |
| return TIPI_ALIQUOTAS.get(capitulo, Decimal("5")) |
|
|