I'm trying to make a pension tax calculator and have created a class "Client" that will accept inputs from two separate users and calculate their taxes based on these inputs.
Is there a cleaner way for me iterate through each client than to repeat this code?
client1 = Client.from_input()
print(client1.name, 'Maximum pension contribution you can make this tax year: ', client1.get_maximum_contribution())
print(client1.name, 'Maximum pension contribution your employer can make this year: ', client1.get_carryforward() client1.get_remaining_aa())
print(client1.name, 'Remaining annual allowance: ', client1.get_remaining_aa())
print(client1.name, 'Carryforward available: ', client1.get_carryforward())
client2 = Client.from_input()
print(client2.name, 'Maximum pension contribution you can make this tax year: ', client2.get_maximum_contribution())
print(client2.name, 'Maximum pension contribution your employer can make this year: ', client2.get_carryforward() client1.get_remaining_aa())
print(client2.name, 'Remaining annual allowance: ', client2.get_remaining_aa())
print(client2.name, 'Carryforward available: ', client2.get_carryforward())
If anybody wants the full code or if it's relevant:
```# import datetime
# currentyear = datetime.date.today().year
# year3 = (datetime.date.today().year - 3)
# year2 = datetime.date.today().year - 2
# year1 = datetime.date.today().year - 1
aathreshold = 240000
aallowance = 40000
maxaareduction = 36000
class Client:
def __init__(self, name, salary, bonus, intdiv, employeepercent, employerpercent, pensionlump, salaryexchange,
deathbenefits, year3contribution, year2contribution, year1contribution):
self.name = name
self.salary = salary
self.bonus = bonus
self.intdiv = intdiv
self.employeecontribution = salary * (employeepercent / 100)
self.employercontribution = salary * (employerpercent / 100)
self.pensionlump = pensionlump
self.salaryexchange = salaryexchange
self.deathbenefits = deathbenefits
self.totalgross = salary bonus intdiv
self.totalannualpensioncontributions = self.employeecontribution self.employercontribution self.pensionlump
self.year3contribution = year3contribution
self.year2contribution = year2contribution
self.year1contribution = year1contribution
@classmethod
def from_input(cls):
return cls(input('Name: '),
int(input('Salary Bonus: ')),
int(input('Bonus & Comission: ')),
int(input('Interest & Dividends: ')),
int(input('Employee gross workplace contribution % : ')),
int(input('Employer gross workplace contribution % :')),
int(input('Lump sum contributions: ')),
int(input('Employment income given through salary exchange')),
int(input('Taxed lump sum death benefits: ')),
int(input('Please enter your pension contributions for 2018: ')),
int(input('Please enter your pension contributions for 2019: ')),
int(input('Please enter your pension contributions for 2020: '))
)
def get_carryforward(self):
def cap_carryforward(contribution):
if contribution > aallowance:
contribution = aallowance
remaining_allowance = aallowance - contribution
return remaining_allowance
else:
remaining_allowance = aallowance - contribution
return remaining_allowance
year3remallowance = cap_carryforward(self.year3contribution)
year2remallowance = cap_carryforward(self.year2contribution)
year1remallowance = cap_carryforward(self.year1contribution)
cf_allowance = year3remallowance year2remallowance year1remallowance
return cf_allowance
def get_threshold(self):
threshinc = self.totalgross - self.pensionlump - self.employeecontribution\
self.salaryexchange - self.deathbenefits
return threshinc
def get_adjustedincome(self):
adjustedinc = self.totalgross self.employercontribution - self.deathbenefits
return adjustedinc
def get_remaining_aa(self):
taperexcess = 0
if Client.get_adjustedincome(self) > aathreshold:
taperexcess = (Client.get_adjustedincome(self) - aathreshold) / 2
if taperexcess > maxaareduction:
taperexcess = maxaareduction
annualallowance = aallowance - taperexcess
remaining_aa = annualallowance - self.totalannualpensioncontributions
if remaining_aa <= 0:
remaining_aa = 0
return remaining_aa
def get_maximum_contribution(self):
combinedallowance = (Client.get_remaining_aa(self) Client.get_carryforward(self))
if (self.salary - combinedallowance) <= 0:
maxcontribution = self.salary
return maxcontribution
elif (self.salary - combinedallowance) > 0:
maxcontribution = combinedallowance
return maxcontribution
client1 = Client.from_input()
print(client1.name, 'Maximum pension contribution you can make this tax year: ', client1.get_maximum_contribution())
print(client1.name, 'Maximum pension contribution your employer can make this year: ', client1.get_carryforward() client1.get_remaining_aa())
print(client1.name, 'Remaining annual allowance: ', client1.get_remaining_aa())
print(client1.name, 'Carryforward available: ', client1.get_carryforward())
client2 = Client.from_input()
print(client2.name, 'Maximum pension contribution you can make this tax year: ', client2.get_maximum_contribution())
print(client2.name, 'Maximum pension contribution your employer can make this year: ', client2.get_carryforward() client1.get_remaining_aa())
print(client2.name, 'Remaining annual allowance: ', client2.get_remaining_aa())
print(client2.name, 'Carryforward available: ', client2.get_carryforward())
CodePudding user response:
Yes, you can add a __str__
method to your Client
-class to define how the string-representation of your objects should look like. E.g.:
import os
...
class Client:
...
def __str__(self):
line1 = f"{self.name} Maximum pension contribution you can make this tax year: {self.get_maximum_contribution()}"
line2 = f"{self.name} Maximum pension contribution your employer can make this year: {self.get_carryforward() self.get_remaining_aa()}"
line3 = f"{self.name} Remaining annual allowance: {self.get_remaining_aa()}"
line4 = f"{self.name} Carryforward available: {self.get_carryforward()}"
return os.linesep.join([line1,line2,line3,line4])
If you do that you can just do print(client1)
in your code.
Alternatively, you can just name this method getstring
and do it like this print(client1.getstring())
.
If you want to iterate though your clients you can do it like this:
client_list = [Client.from_input() for _ in range(num_clients)]
for client in client_list:
print(client)
To create a list of num_clients
with your from_input
method and print them all out.
CodePudding user response:
def print_info_for_clients(clients):
for client in clients:
print(client.name, 'Maximum pension contribution you can make this tax year: ', client.get_maximum_contribution())
print(client.name, 'Maximum pension contribution your employer can make this year: ', client.get_carryforward() client.get_remaining_aa())
print(client.name, 'Remaining annual allowance: ', client.get_remaining_aa())
print(client.name, 'Carryforward available: ', client.get_carryforward())
client1 = Client.from_input()
client2 = Client.from_input()
print_info_for_clients([client1, client2])
If you wanted to you could move the Client.from_input()
into the function, and pass in a number of clients to read instead, but I prefer doing it this way because I can also assign client1
or client2
in any number of different ways if I want.
CodePudding user response:
A simple for
might work depending on how many clients do you want:
def input_clients(how_many):
clients = []
for _ in range(how_many):
client = Client.from_input()
print(client.name, 'Maximum pension contribution you can make this tax year: ', client.get_maximum_contribution())
print(client.name, 'Maximum pension contribution your employer can make this year: ', client.get_carryforward() client.get_remaining_aa())
print(client.name, 'Remaining annual allowance: ', client.get_remaining_aa())
print(client.name, 'Carryforward available: ', client.get_carryforward())
clients.append(client)
return clients
input_clients(2)