Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import tkinter as tk
- import json
- from tkinter import ttk
- from datetime import datetime
- from tkcalendar import DateEntry
- class PayrollApp:
- def __init__(self, root):
- self.root = root
- self.root.title("Payroll System")
- self.root.geometry("1360x280") # Set the initial window size
- # Initialize variables
- self.records = []
- self.editing_record = None
- # Create input fields
- self.employee_var = tk.StringVar()
- self.account_var = tk.StringVar()
- self.bank_var = tk.StringVar()
- self.gross_pay_var = tk.DoubleVar()
- self.employee_label = tk.Label(root, text="Employee:")
- self.account_label = tk.Label(root, text="Account Number:")
- self.bank_label = tk.Label(root, text="Bank Name:")
- self.gross_pay_label = tk.Label(root, text="Gross Pay:")
- self.employee_entry = tk.Entry(root, textvariable=self.employee_var)
- self.account_entry = tk.Entry(root, textvariable=self.account_var)
- self.bank_entry = tk.Entry(root, textvariable=self.bank_var)
- self.gross_pay_entry = tk.Entry(root, textvariable=self.gross_pay_var)
- self.calculate_button = tk.Button(root, text="Calculate Payroll", command=self.calculate_payroll)
- # Create records table
- self.records_tree = ttk.Treeview(root, columns=("Date", "Employee", "Gross Pay", "Bank", "NSSF 10%", "NSSF 5%", "PAYE", "Net Pay"))
- self.records_tree.heading("#1", text="Date")
- self.records_tree.heading("#2", text="Employee")
- self.records_tree.heading("#3", text="Gross Pay")
- self.records_tree.heading("#4", text="Bank")
- self.records_tree.heading("#5", text="NSSF 10%")
- self.records_tree.heading("#6", text="NSSF 5%")
- self.records_tree.heading("#7", text="PAYE")
- self.records_tree.heading("#8", text="Net Pay")
- self.records_tree.bind("<ButtonRelease-1>", self.select_record)
- # Adjust column widths for the records table
- self.records_tree.column("#1", width=100) # Date column
- self.records_tree.column("#2", width=150) # Employee column
- self.records_tree.column("#3", width=100)
- self.records_tree.column("#4", width=150)
- self.records_tree.column("#5", width=100)
- self.records_tree.column("#6", width=100)
- self.records_tree.column("#7", width=100)
- self.records_tree.column("#8", width=100)
- # Edit and delete buttons
- self.edit_button = tk.Button(root, text="Edit", command=self.edit_record)
- self.delete_button = tk.Button(root, text="Delete", command=self.delete_record)
- # Load records from file when app starts
- self.load_records_from_file('records.json')
- # Layout
- self.employee_label.grid(row=0, column=0)
- self.account_label.grid(row=1, column=0)
- self.bank_label.grid(row=2, column=0)
- self.gross_pay_label.grid(row=3, column=0)
- self.employee_entry.grid(row=0, column=1)
- self.account_entry.grid(row=1, column=1)
- self.bank_entry.grid(row=2, column=1)
- self.gross_pay_entry.grid(row=3, column=1)
- self.calculate_button.grid(row=4, column=1)
- self.records_tree.grid(row=0, column=2, rowspan=5, padx=20, pady=10)
- #Edit and Delete poitions
- self.edit_button.grid(row=5, column=2, sticky=tk.E, padx=20, pady=5)
- self.delete_button.grid(row=5, column=2, sticky=tk.W, padx=20, pady=5)
- self.editing_record = None
- self.edit_button.config(state=tk.DISABLED)
- self.records_tree.bind("<ButtonRelease-1>", self.select_record)
- def calculate_payroll(self):
- employee_name = self.employee_var.get()
- account_number = self.account_var.get()
- bank_name = self.bank_var.get()
- gross_pay = self.gross_pay_var.get()
- nssf_10 = gross_pay * 0.1
- nssf_5 = gross_pay * 0.05
- # Perform basic PAYE calculation
- if gross_pay <= 235000:
- paye = 0
- elif 235001 <= gross_pay <= 335000:
- paye = (gross_pay - 235000) * 0.1
- else:
- paye = (gross_pay - 335000) * 0.2 + 10000
- net_pay = gross_pay - (nssf_10 + nssf_5 + paye)
- current_date = datetime.now().strftime("%Y-%m-%d")
- record = {
- "Date": current_date,
- "Employee": employee_name,
- "Gross Pay": gross_pay,
- "Bank": bank_name,
- "NSSF 10%": nssf_10,
- "NSSF 5%": nssf_5,
- "PAYE": paye,
- "Net Pay": net_pay
- }
- self.records.append(record)
- self.update_records_tree()
- def select_record(self, event):
- selected_item = self.records_tree.selection()[0]
- record_index = int(selected_item.split("I")[1])
- self.editing_record = record_index
- self.edit_button.config(state=tk.NORMAL)
- def save_records_to_file(self, filename):
- with open(filename, 'w') as file:
- json.dump(self.records, file)
- self.root.destroy()
- def load_records_from_file(self, filename):
- try:
- with open(filename, 'r') as file:
- self.records = json.load(file)
- self.update_records_tree()
- except FileNotFoundError:
- self.records = []
- def edit_record(self):
- if self.editing_record is not None:
- edit_window = tk.Toplevel(self.root)
- edit_window.title("Edit Record")
- # Create entry fields for editing
- employee_edit_var = tk.StringVar(value=self.records[self.editing_record]["Employee"])
- bank_edit_var = tk.StringVar(value=self.records[self.editing_record]["Bank"])
- date_edit_var = tk.StringVar(value=self.records[self.editing_record]["Date"])
- employee_edit_label = tk.Label(edit_window, text="Employee:")
- bank_edit_label = tk.Label(edit_window, text="Bank Name:")
- date_edit_label = tk.Label(edit_window, text="Date:")
- employee_edit_entry = tk.Entry(edit_window, textvariable=employee_edit_var)
- bank_edit_entry = tk.Entry(edit_window, textvariable=bank_edit_var)
- date_edit_entry = tk.Entry(edit_window, textvariable=date_edit_var)
- # Create a function to save changes and close the edit window
- def save_and_close():
- self.save_edited_record(employee_edit_var.get(), bank_edit_var.get(), date_edit_var.get())
- edit_window.destroy()
- save_button = tk.Button(edit_window, text="Save Changes", command=save_and_close)
- # Create a DateEntry widget for date selection
- date_edit_entry = DateEntry(edit_window, textvariable=date_edit_var, date_pattern='yyyy-mm-dd')
- employee_edit_label.grid(row=0, column=0)
- employee_edit_entry.grid(row=0, column=1)
- bank_edit_label.grid(row=1, column=0)
- bank_edit_entry.grid(row=1, column=1)
- date_edit_label.grid(row=2, column=0)
- date_edit_entry.grid(row=2, column=1)
- save_button.grid(row=3, column=1)
- def save_edited_record(self, new_employee, new_bank, new_date):
- if self.editing_record is not None:
- self.records[self.editing_record]["Employee"] = new_employee
- self.records[self.editing_record]["Bank"] = new_bank
- self.records[self.editing_record]["Date"] = new_date
- self.editing_record = None
- self.update_records_tree()
- def delete_record(self):
- if self.editing_record is not None:
- del self.records[self.editing_record]
- self.editing_record = None
- self.update_records_tree()
- def update_records_tree(self):
- self.records_tree.delete(*self.records_tree.get_children())
- for index, record in enumerate(self.records):
- self.records_tree.insert("", "end", iid=f"I{index}", values=(
- record["Date"],
- record["Employee"],
- record["Gross Pay"],
- record["Bank"],
- record["NSSF 10%"],
- record["NSSF 5%"],
- record["PAYE"],
- record["Net Pay"]
- ))
- self.edit_button.config(state=tk.DISABLED)
- def main():
- root = tk.Tk()
- app = PayrollApp(root)
- root.protocol("WM_DELETE_WINDOW", lambda: app.save_records_to_file('records.json'))
- root.mainloop()
- if __name__ == "__main__":
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement