This Python script calculates an employee's pay by taking work hours and rates as input, then
determines basic pay, gross salary, bonus, and net salary.
The code generally works as written, but it has a significant logic issue in how it calculates
the final net salary.
⚠️ Potential Logic Issue
The problem lies in when tax is calculated.
● Your current logic:
1. Calculate Gross Salary (gro_sal).
2. Calculate tax only on the Gross Salary (taxx = tax(gro_sal)). This taxx variable
actually holds the (Gross Salary - Tax).
3. Calculate Net Salary by adding the untaxed bonus afterward (nett_sal = taxx +
bonuss).
● The result: The bonus is never taxed.
In a real-world payroll system, the bonus is also considered taxable income. The correct
approach is to add all income first (Gross + Bonus) and then calculate tax on that total
amount.
How to Fix the Logic
You can fix this by changing the order of your final calculations. You don't even need the net
function.
The tax() function you wrote already returns the "salary after tax," so you just need to feed it
the correct total income.
Here is the corrected code for the final section:
Python
# ... [All your functions remain the same] ...
# Display the report (Corrected Logic)
gro_sal = gross(basic_pay, hr, da)
bonuss = bon(total_hours)
# 1. First, find the total income *before* tax
total_taxable_income = gro_sal + bonuss
# 2. Now, calculate the final salary *after* tax is deducted
# from the TOTAL income.
# Your 'tax()' function returns the (salary - tax_amount).
nett_sal = tax(total_taxable_income)
# (Optional) Find the actual tax amount that was deducted
tax_deducted = total_taxable_income - nett_sal
print("Basic Pay =", basic_pay)
print("Gross Salary =", gro_sal)
print("Bonus =", bonuss)
print("Total Taxable Income =", total_taxable_income)
print("Tax Deducted =", tax_deducted)
print("Net Salary =", nett_sal)
A Clearer, More Accurate Rewrite
For better and more readable code, I recommend changing your tax function to return only
the tax amount. This makes the final calculation much more logical.
Here is a cleaner version of your entire program:
Python
# Taking input
work_hour = list(map(int, input("Enter work hours for 5 days: ").split()))
hourly_rate = int(input("Enter hourly rate: "))
hr = int(input("Enter HR: "))
da = int(input("Enter DA: "))
# Calculate total hours and basic pay
total_hours = sum(work_hour)
basic_pay = total_hours * hourly_rate
# Function for gross salary
def gross(b_p, h_r, d_a):
gs = b_p + h_r + d_a
return gs
# Function for bonus
def bon(t_h):
if t_h > 200:
bonus = 10000
elif t_h >= 181:
bonus = 6000
else:
bonus = 2500
return bonus
# Function to calculate *tax amount* (Clearer)
def calculate_tax_amount(taxable_income):
tax_due = 0 # Default for <= 20000
if taxable_income > 50000:
tax_due = taxable_income * 0.2
elif taxable_income > 20000:
tax_due = taxable_income * 0.1
return tax_due
# Function for net salary (Clearer)
def net(gross_salary, bonus_pay, tax_amount):
net_salary = gross_salary + bonus_pay - tax_amount
return net_salary
# --- Display the Report (Clearer Logic) ---
gro_sal = gross(basic_pay, hr, da)
bonuss = bon(total_hours)
# 1. Calculate total taxable income
total_taxable_income = gro_sal + bonuss
# 2. Calculate the tax *amount* due
tax_deducted = calculate_tax_amount(total_taxable_income)
# 3. Calculate final net salary
nett_sal = net(gro_sal, bonuss, tax_deducted)
print("------------------------")
print("PAYROLL REPORT")
print("------------------------")
print(f"Basic Pay = {basic_pay}")
print(f"Gross Salary = {gro_sal}")
print(f"Bonus = {bonuss}")
print("------------------------")
print(f"Total Taxable Income = {total_taxable_income}")
print(f"Tax Deducted = {tax_deducted}")
print("------------------------")
print(f"Net Salary = {nett_sal}")
Would you like me to explain any of these functions in more detail?