Skip to content

Instantly share code, notes, and snippets.

@felipecruz
Created November 29, 2017 15:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save felipecruz/43440a285016b598411431ce03ba4dfd to your computer and use it in GitHub Desktop.
Save felipecruz/43440a285016b598411431ce03ba4dfd to your computer and use it in GitHub Desktop.
IRPF
from decimal import Decimal as D
MAX_TRIBUTAVEL = D("28559.70")
MAX_NAO_TRIBUTAVEL = D("40000.00")
def tabela_imposto(renda):
if renda < D('1903.98'):
aliquota = D('0.0')
if renda > D('1903.99') and renda < D('2826.65'):
aliquota = D('7.5')
deducao = D('142.80')
if renda > D('2826.66') and renda < D('3751.05'):
aliquota = D('15')
deducao = D('354.80')
if renda > D('3751.06') and renda < D('4664.68'):
aliquota = D('22.5')
deducao = D('636.13')
if renda > D('4664.68'):
aliquota = D('27.5')
deducao = D('869.36')
return aliquota, deducao
class DIRPF:
def __init__(self, cpf):
self.cpf = cpf
self.renda_tributavel = D('0.00')
self.renda_nao_tributavel = D('0.00')
self.pagamentos_declarados = D('0.00')
self.imposto_a_pagar = D('0.00')
self.abaixo_do_minimo = True
self.pagamentos = []
self.rendas = []
self.dependentes = []
self.partner = []
def adiciona_renda(self, renda):
self.rendas.append(renda)
def adiciona_pagamento(self, pagamento):
self.pagamentos.append(pagamento)
@property
def declaracao_obrigatoria(self):
pass
def calcular(self):
for renda in self.rendas:
if renda.tributavel():
self.renda_tributavel += renda.value
else:
self.renda_nao_tributavel += renda.value
for pagamento in self.pagamentos:
self.pagamentos_declarados += pagamento.value
if self.renda_tributavel > MAX_TRIBUTAVEL:
self.abaixo_do_minimo = True
aliquota, deduction = tabela_imposto(self.renda_tributavel)
self.imposto_a_pagar = D('0.01') * aliquota * self.renda_tributavel
else:
pass
self.imposto_a_pagar = D('0.00')
def explicar(self):
msg1 = '''Sua renda tributável ({}) não excede o valor máximo\n
de {}
'''
if self.abaixo_do_minimo:
return msg1.format(self.renda_tributavel, MAX_TRIBUTAVEL)
def __repr__(self):
return '''
IRPF Contribuinte: {}
=============================================================
===== Receitas =====
Receitas tributáveis: {}
Receitas não tributáveis: {}
=============================================================
===== Pagamentos =====
Pagamentos declarados: {}
=============================================================
===== Impostos =====
{}
Imposto a pagar: {}
'''.format(self.cpf,
self.renda_tributavel,
self.renda_nao_tributavel,
self.pagamentos_declarados,
self.explicar(),
self.imposto_a_pagar)
class Renda:
def __init__(self, value, code=None, source=None):
self.code = code
self.value = D(value)
self.source = source
def tributavel(self):
raise Exception("Abstract")
class RendaTributavel(Renda):
def __init__(self, value, source):
super().__init__(value, source=source)
source = source
def tributavel(self):
return True
class RendaNaoTributavel(Renda):
def __init__(self, code, value, source):
super().__init__(value, code=code, source=source)
def tributavel(self):
return False
class Pagamento:
def __init__(self, code, value):
self.value = D(value)
self.code = code
renda1 = RendaNaoTributavel(13, "10000.00", source='00000000000')
renda2 = RendaTributavel("5000.00", source="00000000000")
pagamento1 = Pagamento(27, "10000.00")
taxes = DIRPF("000.000.000-00")
taxes.adiciona_renda(renda1)
taxes.adiciona_renda(renda2)
taxes.adiciona_pagamento(pagamento1)
taxes.calcular()
print(taxes)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment